cici 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +13 -13
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/asset/[...path]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/asset/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/blog/[id]/highlights/[hid]/comments/[cid]/reactions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/blog/[id]/highlights/[hid]/comments/[cid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/blog/[id]/highlights/[hid]/replies/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/blog/[id]/highlights/[hid]/resolve/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/blog/[id]/highlights/[hid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/blog/[id]/highlights/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/graphql/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/mile/prompts.body +1 -1
- package/.next/standalone/.next/server/app/api/upload/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/atom.xml/route.js +3 -3
- package/.next/standalone/.next/server/app/atom.xml/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/atom.xml.body +1 -1677
- package/.next/standalone/.next/server/app/blog/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/blog/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/blog/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/blog/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/editor/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/editor/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/memos/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/memos/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/robots.txt/route.js +1 -1
- package/.next/standalone/.next/server/app/rss.xml/route.js +2 -2
- package/.next/standalone/.next/server/app/rss.xml/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/rss.xml.body +1 -227
- package/.next/standalone/.next/server/app/sitemap.xml/route.js +5 -5
- package/.next/standalone/.next/server/app/sitemap.xml.body +5 -101
- package/.next/standalone/.next/server/app/unavailable/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +6 -6
- package/.next/standalone/.next/server/chunks/3464.js +1 -1
- package/.next/standalone/.next/server/chunks/3607.js +1 -1
- package/.next/standalone/.next/server/chunks/719.js +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/package.json +2 -2
- package/.next/standalone/sample-content/blog/hello-cici.md +25 -0
- package/.next/standalone/sample-content/likes.json +1 -0
- package/.next/standalone/sample-content/memos.json +7 -0
- package/.next/standalone/sample-content/site-config.json +18 -0
- package/README.md +17 -1
- package/bin/cici.js +126 -23
- package/package.json +2 -2
- package/.next/standalone/data/assets/1727016079577.jpg +0 -0
- package/.next/standalone/data/assets/images/2024-12-03/1733256504772.jpg +0 -0
- package/.next/standalone/data/assets/images/2024-12-12/.gitkeep +0 -0
- package/.next/standalone/data/assets/images/2024-12-12/1734033798997.png +0 -0
- package/.next/standalone/data/assets/images/2024-12-21/.gitkeep +0 -0
- package/.next/standalone/data/assets/images/2024-12-21/1734785902890.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/.gitkeep +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734990512413.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734991833894.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993188114.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993280313.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993317984.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993411252.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993425042.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993480342.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993562660.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993625024.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993677103.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993893285.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993996131.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734994035144.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734994064317.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734994128679.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734994189257.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734994521799.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734994530669.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-24/.gitkeep +0 -0
- package/.next/standalone/data/assets/images/2024-12-24/1735032434591.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-24/1735068363518.jpeg +0 -0
- package/.next/standalone/data/assets/images/Cofe-app.png +0 -0
- package/.next/standalone/data/blog/.gitkeep +0 -0
- package/.next/standalone/data/blog/2017-summary.md +0 -59
- package/.next/standalone/data/blog/a-complex-web-app-refactor.md +0 -72
- package/.next/standalone/data/blog/a-day-of-remote-worker.md +0 -82
- package/.next/standalone/data/blog/async-action-in-redux.md +0 -257
- package/.next/standalone/data/blog/cofe.md +0 -398
- package/.next/standalone/data/blog/expensee-shortcut-numbers-guide.md +0 -99
- package/.next/standalone/data/blog/first-golang-project-fx.md +0 -113
- package/.next/standalone/data/blog/work-going-index.md +0 -49
- package/.next/standalone/data/blog//344/270/212/346/265/267/345/210/260/351/230/277/345/247/206/346/226/257/347/211/271/344/270/271.md +0 -114
- package/.next/standalone/data/blog//344/272/214/346/234/210/350/221/241/350/220/204/347/211/231/346/270/270/350/256/260.md +0 -107
- package/.next/standalone/data/blog//345/215/216/344/270/272/351/270/277/350/222/231-harmaryos-next-/347/272/277/344/270/213/346/264/273/345/212/250/345/260/217/350/256/260.md +0 -180
- package/.next/standalone/data/blog//345/233/233/346/234/210/347/232/204/345/260/276/345/267/264/351/200/233/345/276/267/345/233/275-/346/237/217/346/236/227.md +0 -76
- package/.next/standalone/data/blog//345/234/250/344/274/246/346/225/246-shoreditch-/345/221/206/344/270/211/345/244/251.md +0 -40
- package/.next/standalone/data/blog//346/204/217/345/244/247/345/210/251/347/275/227/351/251/254/345/244/217/345/244/251/345/233/233/346/227/245/346/270/270.md +0 -59
- package/.next/standalone/data/blog//346/210/221/345/201/232/344/272/206/344/270/200/346/254/276/346/227/205/350/241/214/350/256/260/345/275/225/345/272/224/347/224/250/357/274/232mile.md +0 -40
- package/.next/standalone/data/blog//350/245/277/347/217/255/347/211/231/344/270/203/345/244/251/347/232/204/346/227/205/350/241/214.md +0 -128
- package/.next/standalone/data/blog//351/200/233/351/200/233/346/265/216/345/267/236/345/262/233.md +0 -78
- package/.next/standalone/data/blog-manifest.json +0 -21
- package/.next/standalone/data/highlights/expensee-shortcut-numbers-guide.json +0 -77
- package/.next/standalone/data/likes.json +0 -56
- package/.next/standalone/data/memos.json +0 -1255
- package/.next/standalone/data/site-config.json +0 -22
- /package/.next/standalone/.next/static/{ACh2hmfOOZR7INKDQAX5I → Pl18p4h2shbbqjypPxStc}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{ACh2hmfOOZR7INKDQAX5I → Pl18p4h2shbbqjypPxStc}/_ssgManifest.js +0 -0
- /package/.next/standalone/{data → sample-content/assets}/.gitkeep +0 -0
- /package/.next/standalone/{data/assets/images/2024-12-03 → sample-content/highlights}/.gitkeep +0 -0
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 用 iOS 快捷指令 + Numbers 做一套零依赖的记账系统
|
|
3
|
-
date: 2026-05-28T10:00:00.000Z
|
|
4
|
-
latitude: 52.330390529537716
|
|
5
|
-
longitude: 4.940213073274852
|
|
6
|
-
city: Duivendrecht
|
|
7
|
-
street: Kastanjepad
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
[ExpenSee](https://milemile.app/expensee) 上线之前,我用了很久一套土法记账:iOS 自带的**快捷指令** + **Numbers**。一行代码不写,没有服务器,没有 API,也没有第三方账号。每次付完款,按一下手机背面,整个流程跑完,一笔账就写进了 iCloud 上一份普通的 Numbers 表格里。
|
|
11
|
-
|
|
12
|
-
这条快捷指令是 ExpenSee 这款 App 最初的灵感来源。这篇文章把这套流程从头讲一遍,给那些愿意自己折腾 iOS 自动化的人作个参考。
|
|
13
|
-
|
|
14
|
-
> **iCloud 安装链接**:[https://www.icloud.com/shortcuts/c78c745e753541beb6a92e4f311b5c6f](https://www.icloud.com/shortcuts/c78c745e753541beb6a92e4f311b5c6f)
|
|
15
|
-
>
|
|
16
|
-
> **模版下载(备用)**:[https://milemile.app/expensee/static/template.numbers](https://milemile.app/expensee/static/template.numbers)
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## 它到底做了什么
|
|
21
|
-
|
|
22
|
-
每次运行,这条快捷指令做的事情是:
|
|
23
|
-
|
|
24
|
-
1. 算出当前年份,组合出一个文件名 `2026账本.numbers`,去 iCloud 的 *Numbers* 文件夹找它。
|
|
25
|
-
2. 如果文件不存在,就从 [milemile.app/expensee/static/template.numbers](https://milemile.app/expensee/static/template.numbers) 下载一份模版,按当年的年份命名后保存进 iCloud Drive 的 Numbers 文件夹,然后退出。
|
|
26
|
-
3. 如果文件存在,就**截一张屏**(一般是支付宝 / 微信支付的支付完成页),用系统自带的图像识别把所有形如 `[0-9]+\.[0-9]{1,3}` 的数字找出来。
|
|
27
|
-
4. 只识别到一个金额时直接采用;多个金额会跳出列表让你挑选;都没识别到就改为手动输入。
|
|
28
|
-
5. 依次询问:**支出 / 收入** → **分类** → **账户**(支付宝 / 微信 / 银行卡)→ **备注**。
|
|
29
|
-
6. 调用 Numbers 的 *在电子表格中添加值* 系统动作,把这一行写进当月对应的 `M月支出账单` 或 `M月收入明细` 表格里。
|
|
30
|
-
|
|
31
|
-
分类是预设好的:
|
|
32
|
-
|
|
33
|
-
- **支出**:数码电器、餐饮美食、自我提升、服饰装扮、日用百货、车辆交通、娱乐休闲、医疗健康、家庭支出、充值缴费、其他
|
|
34
|
-
- **收入**:主业收入、副业收入、投资理财、红包礼金、其他
|
|
35
|
-
|
|
36
|
-
整个流程没有任何一步要联网到我或者别人的服务器,所有数据都留在你的 iCloud 里。
|
|
37
|
-
|
|
38
|
-
## 一次性设置
|
|
39
|
-
|
|
40
|
-
1. **加入快捷指令**。在 iPhone 上打开 [这条 iCloud 链接](https://www.icloud.com/shortcuts/c78c745e753541beb6a92e4f311b5c6f),点 *添加快捷指令*。这条快捷指令叫 *ExpenSee 自动记账*。
|
|
41
|
-
2. **确认 iCloud 同步开着**:*设置 → 你的姓名 → iCloud → iCloud 云盘*,并确保 Numbers 在同步列表里。
|
|
42
|
-
3. **跑一次快捷指令**。如果你还没有当年的账本文件,它会下载模版并保存为 `{年份}账本.numbers`。看到 *设置成功,重新运行开始记账吧* 的提示就成功了。
|
|
43
|
-
4. **如果第一次卡住不动**(极少数情况下模版下载会很慢),手动从 [milemile.app/expensee/static/template.numbers](https://milemile.app/expensee/static/template.numbers) 下载文件,重命名为 `2026账本.numbers`(把年份换成当前),放到 iCloud 的 Numbers 文件夹里,再运行快捷指令即可。
|
|
44
|
-
|
|
45
|
-
## 怎么用:每天三秒
|
|
46
|
-
|
|
47
|
-
记账这件事最大的成本是从付款到入账之间的几秒钟。这条快捷指令的目标就是把这几秒压到极致:
|
|
48
|
-
|
|
49
|
-
1. 付款后停留在金额完成页;
|
|
50
|
-
2. 按下你绑定的快捷键(见下一节);
|
|
51
|
-
3. 系统自动截屏并识别金额,确认或挑选;
|
|
52
|
-
4. 选支出 / 收入、分类、账户,写一句备注,结束。
|
|
53
|
-
|
|
54
|
-
整个过程从掏出手机到结束大概 5 秒。
|
|
55
|
-
|
|
56
|
-
## 三种触发方式
|
|
57
|
-
|
|
58
|
-
把快捷指令绑到一个"一按就开始"的动作,是这套流程能跑下去的关键。下面三种任选其一:
|
|
59
|
-
|
|
60
|
-
### ① 操作按钮(iPhone 15 Pro 起)
|
|
61
|
-
|
|
62
|
-
> *设置 → 操作按钮 → 选择"快捷指令" → 选择"ExpenSee 自动记账"*
|
|
63
|
-
|
|
64
|
-
绑定之后,长按机身侧面的橙色按钮就启动整套流程。我自己是 15 Pro 用户,这是我用得最顺手的方式——付完款顺手长按一下,相当于把记账的"启动成本"降到了零。
|
|
65
|
-
|
|
66
|
-
### ② 轻点背面(所有支持的 iPhone)
|
|
67
|
-
|
|
68
|
-
> *设置 → 辅助功能 → 触控 → 轻点背面 → 轻点两下(或三下)→ 快捷指令 → ExpenSee 自动记账*
|
|
69
|
-
|
|
70
|
-
用手指轻敲两下手机背面就触发——不需要解锁回到主屏,不需要长按某个固定按钮,连戴着手机壳也照样能识别。这是没有操作按钮的 iPhone(XS、11、12、13、14 系列、所有非 Pro 机型)的最优解。
|
|
71
|
-
|
|
72
|
-
### ③ Siri 语音
|
|
73
|
-
|
|
74
|
-
直接对 Siri 说"ExpenSee 自动记账"。开车、做饭、手不空的时候最好用,但因为后续还需要点击挑选金额、分类等等,并不像前两个那样真的"全程不抬头",所以平时主要是兜底用。
|
|
75
|
-
|
|
76
|
-
## 数据在哪里
|
|
77
|
-
|
|
78
|
-
所有交易都写在 iCloud 上的 Numbers 文件 `{年份}账本.numbers` 里。每一年一份新表,按月分了 12 张工作表(`1月数据库` 到 `12月数据库`),每张工作表里有 *支出* / *收入* 两个表格。
|
|
79
|
-
|
|
80
|
-
因为这是一份普通的 Numbers 文档,你可以在任何 Apple 设备上:
|
|
81
|
-
|
|
82
|
-
- 直接做求和、按分类透视、画图表;
|
|
83
|
-
- 导出 CSV / Excel 给会计或税务;
|
|
84
|
-
- 用 iCloud Drive 备份,或者手动下载一份留底。
|
|
85
|
-
|
|
86
|
-
没有任何数据离开你的 iCloud。如果哪一天我这套生态都消失了,你的账本依然是一份完整、可读的 Numbers 文件。
|
|
87
|
-
|
|
88
|
-
## 局限性,以及为什么我后来做了 ExpenSee
|
|
89
|
-
|
|
90
|
-
用了一年多之后,几个不舒服的地方逐渐放大:
|
|
91
|
-
|
|
92
|
-
- **截屏 OCR 的识别率不稳定**。支付宝的金额数字字体大、对比强,识别没问题;但小红书、B 站、点外卖小票里的金额有时识别不到,就要手动输入。
|
|
93
|
-
- **每年初要手动初始化**——快捷指令是按 `{年份}账本.numbers` 命名的,跨年那天的第一笔会触发模版下载流程,不是无缝的。
|
|
94
|
-
- **多币种很难做**。Numbers 公式可以处理,但快捷指令本身没办法在记账的时候就帮你转换。
|
|
95
|
-
- **分类是写死的**——加一个新分类要改快捷指令,不是普通用户能接受的成本。
|
|
96
|
-
|
|
97
|
-
[ExpenSee](https://apps.apple.com/us/app/expensee-expense-tracking-ai/id6448993636) 把这件事的核心——把记账压到几秒——做成一个独立的 iOS 应用。同样不依赖任何外部服务,但识别准、原生支持多币种、日历视图能让你一眼看清这一个月。如果你想要这条快捷指令的"升级版",可以去 App Store 试试。
|
|
98
|
-
|
|
99
|
-
但如果你像我一样喜欢自己拼装工具,这条快捷指令依然是个不错的起点。它的全部源码就在你的 iPhone 上,可以随便改成你喜欢的样子——加分类、改账户、换币种、接到不同的 Numbers 表格里,都只是几下点击。
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 用 Golang 写一个支持各种编程语言的 serverless 框架
|
|
3
|
-
date: 2017-10-22T17:42:13.233Z
|
|
4
|
-
external_discussions:
|
|
5
|
-
- platform: hackernews
|
|
6
|
-
url: https://news.ycombinator.com/item?id=15686661
|
|
7
|
-
- platform: v2ex
|
|
8
|
-
url: https://v2ex.com/t/406259
|
|
9
|
-
- platform: reddit
|
|
10
|
-
url: https://www.reddit.com/r/programming/comments/7su688/fx_is_a_homemade_faas_tool_like_aws_lambda/
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
## 前言
|
|
18
|
-
|
|
19
|
-
fx 是我在 [Go Hack](http://gohack2017.golangfoundation.org/)的一个小作品,Go Hack 是一个以Go语言为主要编程语言的黑客马拉松比赛。虽然我和我队友两人都是写JavaScript的前端工程师, 以Golang 零基础参加这次比赛,不过很开心我们完成了fx,也喜欢上 Golang 这门语言.
|
|
20
|
-
|
|
21
|
-
读了那么多年书,写了那么久的代码,如果说有什么概念是深入骨髓的,只能说是”函数“了。虽然在数学上和编程上,“函数”这个词有很大的不一样的,但是有一点上它们是类似:
|
|
22
|
-
|
|
23
|
-
```
|
|
24
|
-
接受输入(可能为空值),然后进行处理,最后输出处理结果。
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
我们几乎可以用这个概念来描述所有的行为. 比如我们可以用下面的函数的来描述我们 fx 的诞生过程:
|
|
28
|
-
|
|
29
|
-
```
|
|
30
|
-
函数 f = Go Hack (以 Golang 为项目编程语言的黑客马拉松活动)
|
|
31
|
-
输入 input = [两个Go语言零基础的JavaScript工程师,两台Macbook,很多很多的功能饮料]
|
|
32
|
-
fx = f(input)
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## fx 是什么
|
|
36
|
-
|
|
37
|
-
那么 fx 是什么呢,一句话来说就是 : fx 是一个可以把一个函数变成一个服务的工具. 一个简单的例子来说一下 fx 的功能吧. 比如你写好了很棒的函数 , 它是这样的:
|
|
38
|
-
|
|
39
|
-
func.js
|
|
40
|
-
```javascript
|
|
41
|
-
module.exports = (input) => {
|
|
42
|
-
return parseInt(input.a, 10) + parseInt(input.b, 10)
|
|
43
|
-
}
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
它的作用就是计算两个数的和. 你把这个函数写在 `func.js` 这个文件里面。 这时候你希望可以将这个函数编程一个服务,对外提供一个 url 可以供外界访问. 但是想到 nginx, web server, api gateway…, 你头有点大了。 现在你可以简单的这样做。
|
|
47
|
-
|
|
48
|
-
```shell
|
|
49
|
-
fx up func.js
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
如果一切没有什么问题,你可以得到一个url.
|
|
53
|
-
|
|
54
|
-
```shell
|
|
55
|
-
$ fx list
|
|
56
|
-
|
|
57
|
-
+------------+---------+---------------+
|
|
58
|
-
| ID | STATE | URL |
|
|
59
|
-
+------------+---------+---------------+
|
|
60
|
-
| ce925443d5 | running | 0.0.0.0:40549 |
|
|
61
|
-
+------------+---------+---------------+
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
访问你的服务试试看
|
|
65
|
-
|
|
66
|
-
```shell
|
|
67
|
-
$ curl -X POST 0.0.0.0:40549 -H "Content-Type: application/json" -d '{"a": 1, "b": 1}'
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
你会得到 `2`. 这说明你的函数已经变成了一个服务了。
|
|
71
|
-
|
|
72
|
-
## fx 如何工作
|
|
73
|
-
|
|
74
|
-
fx 有两个部分组成,fx server 和 fx client, 最开始的 client 和 server 基于 websocket 进行通信,所有的交互基于 websocket message 来进行, 当时选择 websocket 的原因是因为其简单,能够快速验证我们的想法。当项目做完了演示了之后放到了 [Github](https://github.com/metrue/fx) 之后, 收到了很多的反馈,有同学提出了可以采用 RPC 架构来做,gRPC 如雷贯耳很长时间,就是没有机会去实践,但是后来工作一直很忙,所以没有能够及时完成迁移,然后社区的力量是强大的,一个就职于意大利FBK的哥们发Email和我说,他想参与维护 fx, 我简单看了他的Github主页了之后,就直接把他放到了 collaborator list 去了,后来他直接发了一个很大的 [Pull Request](https://github.com/metrue/fx/pull/100/files)过来,就是用 gRPC 替换了 websocket 的,我当然就很开心的做了merge.
|
|
75
|
-
|
|
76
|
-
所以现在的 fx 是一个基于 gRPC 框架的工具. 提供三个核心功能:
|
|
77
|
-
|
|
78
|
-
```shell
|
|
79
|
-
Usage:
|
|
80
|
-
$ fx up func1 func2 ... deploy a function or a group of functions
|
|
81
|
-
$ fx down func1 func2 ... destroy a function or a group of functions
|
|
82
|
-
$ fx list list deployed services
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
所以整个架构也很简单,fx up 会将 function 的定义内容传递给 fx server,fx server 接受到 function 的内容了之后,匹配到正确的 Dockerfile 和对应的构建镜像所需的资源, 然后会调用 Docker Engine 的 api 去构建相应的服务,最后把生成的服务的 URL 返回给客户端.
|
|
86
|
-
|
|
87
|
-
```shell
|
|
88
|
-
up/ deploy a function to service
|
|
89
|
-
-------------------------------------->
|
|
90
|
-
<--------------------------------------
|
|
91
|
-
down/ stop functions' services
|
|
92
|
-
-------------------------------------->
|
|
93
|
-
fx client <-------------------------------------- fx server
|
|
94
|
-
|
|
95
|
-
list/ list deployed services
|
|
96
|
-
-------------------------------------->
|
|
97
|
-
<--------------------------------------
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
## fx 支持哪些编程语言
|
|
101
|
-
|
|
102
|
-
由于 fx 的一个服务的背后都是一个 Docker Container, 所以 fx 几乎可以支持所有的编程语言,由于精力有限,目前 fx 支持这些编程语言:
|
|
103
|
-
* Golang
|
|
104
|
-
* JavaScript/Node
|
|
105
|
-
* Ruby
|
|
106
|
-
* Python
|
|
107
|
-
* Java
|
|
108
|
-
* PHP
|
|
109
|
-
* Julia
|
|
110
|
-
|
|
111
|
-
## fx 的未来
|
|
112
|
-
|
|
113
|
-
啥未来,就是一个小工具而已。
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 如何衡量一个团队是否值得加入
|
|
3
|
-
date: 2019-05-21T09:43:38.234Z
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
最近有人在 [Hacker News](https://news.ycombinator.com) 问 ["How do I find a meaningful software engineering job?"](https://news.ycombinator.com/item?id=17332796), 其中有一个人的回复我觉得有点意思, 而且和现在的看法有些些许的类似。
|
|
7
|
-
|
|
8
|
-
> I'm a late-career software developer. 30+ years in the trenches doing this...
|
|
9
|
-
> I've done "meaningful" work at companies that treated my like a consumable resource, and less meaningful work at companies that treated me like a person. I prefer the latter. My suggestion is don't jump at the first interesting work, look more for culture and career opportunity. You can find both, those jobs are not quite as rare as unicorns.
|
|
10
|
-
|
|
11
|
-
最近和常常和 [Jakehao](https://twitter.com/haojianzong) 聊聊工作这个事,什么样子的工作才是好工作,我们不断的跳槽到底在挑什么. 我和 Jake 经过这几年的工作经历,都觉得自己并没有单单为了工资而跳槽,由于我们俩都有过不成功的换工作经历,在一个自己不喜欢的地方和氛围下工作,是一种极其折磨人的状态,一般很难呆太久。在找工作的时候,我们两不时会聊自己的面试情况,自己的心态和感受,经过简单的总结之后,我们得到了这样一个公式
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
WGI = WLB * PV * SL * TA
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
> WGI ( Worth Going Index): 值得去指数
|
|
18
|
-
> WLB (Work Life Balance): 工作生活平衡
|
|
19
|
-
> PV ( Product Value ): 产品价值
|
|
20
|
-
> SL ( Salary Level ): 工资水平
|
|
21
|
-
> TA ( Team Atmosphere ): 团队氛围
|
|
22
|
-
WGI 越高,这个工作机会的价值越高,越值得我们去尝试;反之,WGI 越低则越表明这个工作机会的价值越低,越不值得我们尝试。
|
|
23
|
-
|
|
24
|
-
WGI 的这四个决定因素: 工作生活平衡 ( Work Life Balance, WLB), 产品价值( Product Value, PV ), 工资水平 ( Salary Level, SL), 和团队氛围 ( Team Atmosphere, TA ). 是来源我们两个数次的成功或者失败的换工作经历的总结而来的。
|
|
25
|
-
|
|
26
|
-
## Work Life Balance
|
|
27
|
-
工作生活平衡,966 在很多中国的 IT 公司不知不觉已经常态,这有点让人泄气,对很多人来说,也包含着有些无奈。 我是旗帜鲜明的排斥任何形式的加班的,我不喜欢任何形式的 Push。每一个人都是成年人,成年人就应该知道怎么规划自己的时间,怎么安排自己的工作,怎么去做任务的优先级排序,尽量少的给别人造成障碍和拖累拖累团队。绝大多数的加班都是无意义的,作为 Leader/Boss 让你的团队成员加班,就是赤裸裸用战术的勤奋来掩盖战略的愚蠢,无可争辩。
|
|
28
|
-
|
|
29
|
-
## Product Value
|
|
30
|
-
由于工作占据了我们生活的很大一部分,把自己那么大的时间和精力投入到一个没有太多意义的产品研发中,很难保持长久的激情。 如果参与到一个对自己,对这个社会有意义的产品开发中,每一次的代码的提交,都在让这个世界变得更好一点点,让人们的生活变得更好一点点,会让我们能保持一种充满激情的工作状态,而这种状态也让我们做事情事半功倍,每天的工作都是一种享受,也有助于我们有更多的时间去享受工作之外的生活。
|
|
31
|
-
|
|
32
|
-
## Salary Level
|
|
33
|
-
工资水平,我们都是平凡人,都需要买面包和牛奶。我们不是神,所以不能靠各种画出来的大饼来填饱肚子。
|
|
34
|
-
|
|
35
|
-
## Team Atmosphere
|
|
36
|
-
团队氛围,好的团队让每一个人都工作开心,相处融洽,相互帮助,分享知识,共同成长。好的团队并不是说要每一个人都要成为好朋友,我们都有自己的私人空间,尊重是一个好的团队的前提,尊重个人自由,尊重个人选择,尊重个人独立的想法。互助合作,每一个人都有新手时期,作为一个资深者应该给新人适当的给予帮助。团队中齐心协力才能让团队获得成功,但是团队成功并不意味着必须牺牲个人成功,相反,团队关心以及帮助团队成员获得个人的成功会更加有助于团队的成功。
|
|
37
|
-
|
|
38
|
-
有了这个公式之后,在我们找工作做选择有一个清晰的对比了,我把自己经历过的工作粗略的挨个计算了一下,结果如下:
|
|
39
|
-
|
|
40
|
-
```
|
|
41
|
-
Company WLB PV SL TA WGI
|
|
42
|
-
Synopsys 1 0.7 0.7 0.7 0.343
|
|
43
|
-
Second Spectrum 0.8 0.6 0.8 0.8 0.3072
|
|
44
|
-
Splunk 1 0.6 0.9 0.9 0.486
|
|
45
|
-
设计家 0.5 0.7 0.8 0.8 0.224
|
|
46
|
-
Udacity 1 0.9 0.8 0.9 0.648
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
不妨你也是计算一下你的前任和现任雇主们吧.
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 上海到阿姆斯特丹
|
|
3
|
-
date: 2024-09-27T17:56:10.267Z
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
## 前言
|
|
7
|
-
|
|
8
|
-
从上海来到阿姆斯特丹也一周了,两个小朋友,两个大人,一个决定,年初做这个决定,也曾有过很多迟疑,然而当决定做好了之后,两个相隔万里的城市,也仅仅是一张飞机票的距离。
|
|
9
|
-
|
|
10
|
-

|
|
11
|
-
|
|
12
|
-
## 决定
|
|
13
|
-
|
|
14
|
-
我很早就有在小朋友们的小学阶段,带他们去国外生活一段时间的想法,一方面是自己想去体验世界,一方面也是想让小朋友在小时候能感受不同的文化氛围。而现在是一个很好的时机,姐姐三年级,弟弟一年级,多少能自己照顾点自己,而同时又能相互陪伴。
|
|
15
|
-
|
|
16
|
-
当然更重要的是我和老婆的决定,我们两个人都在上海呆十年左右,工作暂时还算轻松稳定,有房无贷,我们两对于物质也没有啥过高的要求,但是你知道,在上海,无论是否有生活压力,每天的日程都是比较紧凑的。对于小朋友的教育,虽然心里有所期待,但是整体不是虎爸虎妈,健康快乐,健全人格为主。对于生活环境,我们都是小镇青年,从小学,中学,大学,到工作,也不断的从一个城市到一个城市,基本上对于各种环境也有一定的容忍度,自认为可以适应各种环境变化和文化差异。
|
|
17
|
-
|
|
18
|
-
不过显然这还是一个不小的决定,而且这个决定会给很多人带来变化:
|
|
19
|
-
|
|
20
|
-
**自己**: 还是原来的公司,原来的团队,原来的工作内容,只是换一个城市,需要去适应新的工作氛围,需要重新去经营和老板,以及身边的同事的关系。
|
|
21
|
-
|
|
22
|
-
**小朋友**: 他们需要去适应新的学校,新的教育方式,结交新的小朋友,对他们来说也是很大的挑战。但是和他们沟通之后,他们也拥抱我们的决定。
|
|
23
|
-
|
|
24
|
-
**伴侣**: 而我老婆也同样需要面对的新的挑战,陌生的环境,而且如果辞去当前的工作,意味她需要全部从零开始,她很坦白的和她老板坦白自己的想法,她老板也也很理解和宽容,可以不用辞职,去阿姆斯特丹远程工作两个月,尝试自己是否适应那边的生活,然后在做决定。
|
|
25
|
-
|
|
26
|
-
**父母**: 我们两个人的服务年龄都在60岁上下,目前能照顾自己,虽然他们都不是很同意我们去那么远的地方去工作生活,但是也拗不过我们的决定,我有妹妹,我老婆有弟弟,他们也能在紧急的时候帮我们照顾他们。一方面在上海的时候,他们也帮我们照顾小朋友很多年了,也想给他们自己的时间,让他们有自己的生活,我爸就特别想把车练好,然后开车走一走中国.
|
|
27
|
-
|
|
28
|
-
所以整个决定就变成了:**让我们去阿姆斯特丹生活一段时间吧,小朋友去当地国际学校,妈妈不辞职,远程工作一段时间,爸爸原职位不变,只是换城市工作。**
|
|
29
|
-
|
|
30
|
-
## 流程
|
|
31
|
-
|
|
32
|
-
决定做好了之后,流程就比较简单了,和老板提出自己想去阿姆斯特丹工作的想法,然后老板和对应的老板沟通商议,然后确定新 Offer,HR 发新的合同,签订合同之后就开始 Relocation 的流程了,这部分公司有专门的 Global Mobility 团队来负责。所以只需要按照他们的步骤来一步步进行就好了。
|
|
33
|
-
|
|
34
|
-
### 签证申请
|
|
35
|
-
|
|
36
|
-
公司有专门的服务公司来帮忙完成这一部分,也就是向荷兰移民局(IND) 申请高技术移民签证和家庭成员的居留签证。这个过程还是需要一定的时间,当然对于我们来说,就是根据他们的材料清单去准备材料即可。如果一切都顺利,就收到到 IND 的 Approval Letter,上面有所有成员的 V Number, 有了这个之后,就可以预约荷兰大使馆或者领事馆去递签证了,使馆和领事馆递签也需要带必要的文件,递签顺利的换,几天之后就可以收到盖好签证的护照。有了护照就可以开始后面的流程了。
|
|
37
|
-
|
|
38
|
-
### 海运
|
|
39
|
-
|
|
40
|
-
公司有安排专门的搬家公司帮我们全程完成搬家,非常专业的搬家服务,他们会先和你预约一个时间进行初步的沟通,了解大致需要海运的东西,可能是为后期的海运打包工具,和打包人员安排做准备。然后预约一个现场打包的时间,当天他们会全部帮你进行打包和搬运上他们的车,你只需要告诉他们需要打包和搬运的物品即可,基本上不需要你动手。
|
|
41
|
-
|
|
42
|
-
基本上如果你想把整个家从上海复制到阿姆斯特丹几乎没有什么问题,只是我们一切从简,只海运那些我们需要的东西,比如一箱书籍,厨具,三辆自行车,衣物和棉被,刚买不久的床垫,以及不少的其他东西。
|
|
43
|
-
|
|
44
|
-
### 机票
|
|
45
|
-
|
|
46
|
-
基本只要拿到了签好的护照,就可以让公司帮忙预定机票了,我们的时间比较的紧凑,拿到护照之后只有不到十天的时候来进行海运的安排和飞机票的购买了,不过最后好在一切都很顺利,公司定的机票的日期前一天,海运正好弄完。如果没有让公司购买指定的航司,公司一般会优先预定KLM的航班。
|
|
47
|
-
|
|
48
|
-
## 出发
|
|
49
|
-
|
|
50
|
-
前一天刚刚打包完海运,今天一大早就出发去浦东机场了,所有的安排都是紧凑的,四个大大的箱子,四个些许有点忐忑又有点其他的心。而且姐姐努力上进的心,竟然说要在机场参加全国青少年信息素养大赛 Python 编程挑战赛的复赛。所以就有这张我办理登机牌时候,姐姐还在努力写程序的照片.
|
|
51
|
-
|
|
52
|
-

|
|
53
|
-
|
|
54
|
-
### 飞行
|
|
55
|
-
|
|
56
|
-
我们乘坐的是 KLM 从上海浦东直飞阿姆斯特丹史基浦机场的航班,飞机基本满员,总共飞了13个小时50分钟,餐食还凑合,看看电影,玩玩游戏,睡睡觉,不知不觉也就到了。
|
|
57
|
-
|
|
58
|
-
### 落地
|
|
59
|
-
|
|
60
|
-
周六上海早上 11:30 出发,落地阿姆斯特丹的时间是下午的 19:05 分,跟着人群按照路标直接走到通关口即可,通关也很顺利,就简单问一下来阿姆斯特丹的目的,以及时间,看到我拿到的工作签证之后,盖个章便出来,去取行李。
|
|
61
|
-
|
|
62
|
-
公司有有安排好的出租车服务,取完行李按照公司提前发的路线图去等司机来接,看到小红书有不少朋友提到被出关开行李检查的经历,我们并没有发生,我也没有看到同飞机的任何人有被查,也许只是幸运。我们到了指定的候车点之后,直接打了司机的电话,天还很亮,上海三十几度的温度,到了阿姆斯特丹大约不到二十度,幸好我们都带来外套。几分钟之后司机就到了,司机很友善帮忙行李放到后备箱,很熟悉送到了公司安排的酒店。
|
|
63
|
-
|
|
64
|
-
### 酒店
|
|
65
|
-
|
|
66
|
-
公司为海外调到阿姆斯特丹工作的员工安排四周(单身)或者六周(家庭)的临时酒店,并且在酒店的接待处可以拿到一个小礼包,里面有一张公交卡, 这边是 OV Card, 和当地小零食,这个公交卡是为了在我们办理自己的各种卡之前方便出行用的。
|
|
67
|
-
|
|
68
|
-
我们的酒店位于 Cruiquiuseiland 的 YAYS Amsterdam Docklands, 入住之前短信和邮件都以及发送给我相关的入住信息,直接通过 pin code 就可以入住,一个两室的格局,可以做饭。当天到酒店时候,已经是晚上八点多了,所以洗漱结束之后就休息了。
|
|
69
|
-
|
|
70
|
-
## 第一周
|
|
71
|
-
|
|
72
|
-
这一整周天气都很好。这也是我选择七月来荷兰的原因,不想一开始进入 hard 模式。当然我这一周的主要任务有三个: 熟悉当地,BSN注册,居留证办理,银行卡办理。
|
|
73
|
-
|
|
74
|
-
### 第一天
|
|
75
|
-
|
|
76
|
-
因为正好是周六过来的,所以周日可以好好休息一天,调整一下时差。第二天早上,我们六点多就醒了,然后洗漱之后,就出门到附近走走,显然一大早除了运动的人,没有什么太多人,路上的人挺友善的打招呼,我们有点饿,不过基本上所有的店在 Google 地图上(还是 Yelp) 都显示尚未营业。在公交车车站,我们问一个老奶奶附近的超市在哪儿,是否已经开门,她英文挺好的,指路并且提到他们开门挺早,而且不远,她几乎每天都去。我们顺着她的方向走大约几百米,果然就到了。
|
|
77
|
-
|
|
78
|
-
超市和国内超市区别不大,不过大部分的商品信息多数是荷兰语。虽然很早,但是已经也有人采购东西,我们主要是购买一些面包,牛奶,蔬菜,和肉类,打算有空的时候做做饭,不了解的东西我都是直接用英文询问其他人,他们英文也挺好。
|
|
79
|
-
|
|
80
|
-
在我们回酒店的路途中,陆陆续续来来回回的人就多一些了,很多骑自行车的人,而路边也超多的自行车,不时就有人打招呼。
|
|
81
|
-
|
|
82
|
-
### 购物和交通
|
|
83
|
-
|
|
84
|
-
购物我基本上就直接去酒店附近的 Albert Heijin 或者 Jumbo,基本和国内的大超市也差多,生活用品基本上都可以买到,肉奶蛋类和国内价格似乎无差,蔬菜类会贵一些。如果你有一张 contactless 的 VISA 信用卡,大超市似乎应该都支持支付。不过我很失误,我只带了招商银行的mini信用卡,不支持 contactless, 基本上刷不了,幸好我带了一点欧元出来。
|
|
85
|
-
|
|
86
|
-
阿姆斯特丹的交通还是很便利的,有很多的选择: Train, Tram, Bus, Metro, Ferry, Bus, 当然最最最最最重要,还是 Bicycle 啦,自行车真的太重要了在这里,一方面是公共交通真的不便宜,另一方面,它真的应该是最方便的交通工具了。
|
|
87
|
-
|
|
88
|
-
### BSN 注册 和 IND 居留卡
|
|
89
|
-
|
|
90
|
-
公司的服务团队在我到阿姆斯特丹之前已经帮我预约好了 BSN 注册和 IND,所以我只需要按时间去到阿姆斯特丹外籍服务中心,现在叫IN Amsterdam。为了按时到达,我们早上吃饭早饭,就一起做上公交车,然后换乘电车到达了 IN Amsterdam。
|
|
91
|
-
|
|
92
|
-
因为我们家四个人都要办理,而且有小朋友,文件还是满多的,整个过程花了大约2个小时,办事人员也很友善,不过还是很顺利的,我们拿到了自己的 BSN 以及居留卡,从此就是合法阿姆斯特丹打工仔了。
|
|
93
|
-
|
|
94
|
-

|
|
95
|
-
|
|
96
|
-
在办理完 BSN 注册和居留卡之后我们在 IN Asterdam 的楼里吃午饭,没有想到,他们家还挺好吃,虽然略微有些贵,小朋友们很喜欢,我们吃的也很满意。
|
|
97
|
-
|
|
98
|
-
### 银行卡
|
|
99
|
-
|
|
100
|
-
公司把办理银行卡的时间约在 BSN 注册的下午,从 IN Amsterdam 到公司预约的银行 ABN AMRO 不是很远,公交车一会就到了,办理也很顺利,简单的信息了解,前几个字,就完成了我们两个人联合账户的初步开通,不过当场并不能拿到卡,需要审批完了之后后面直接邮寄到我的地址。
|
|
101
|
-
|
|
102
|
-

|
|
103
|
-
|
|
104
|
-
## 初印象
|
|
105
|
-
|
|
106
|
-
一周过去了,我也完成在阿姆斯特丹正常生活必备的一些步骤,新生活也慢慢展开了。阿姆斯特丹这一周给我的初印象大致是,
|
|
107
|
-
|
|
108
|
-

|
|
109
|
-
|
|
110
|
-
大家较为友好,也许是因为我接触的人还很少,但是整体来说,路上时不时都会有人友善的打招呼,遇到问题咨询的时候,大家也很耐心的解答。我们在路上掉了运动器材的包包,人们也很友善的提醒,我有一次在超市掉了二十欧纸币,也有人拿到外面找我归还;
|
|
111
|
-
|
|
112
|
-
英文的普及率很高,接触过的所有人都可以很流利的说英文,无论是公共部门的办事人员,还是路边的店员,或者是路人,无聊时上了年纪的老人,还是偶遇的年轻人,英文沟通都非常的顺畅。
|
|
113
|
-
|
|
114
|
-
城市比我想象中的漂亮,河道很多,建筑也很有特点,走在路上时不时都会有小惊喜,很可惜我们海运的三辆自行车还没有到,不然真的想好好骑行整个城市。
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 二月葡萄牙游记
|
|
3
|
-
date: 2025-02-25T19:42:53.549Z
|
|
4
|
-
external_discussions:
|
|
5
|
-
- platform: v2ex
|
|
6
|
-
url: https://v2ex.com/t/1115332
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
小朋友又迎来了一周的春假,十二月的冬假,去西班牙的巴塞罗那和马德里,小朋友蛮开心的,详见上一篇的博文 “[西班牙七天的旅行](https://blog.minghe.me/blog/%E8%A5%BF%E7%8F%AD%E7%89%99%E4%B8%83%E5%A4%A9%E7%9A%84%E6%97%85%E8%A1%8C) ”,以及我参与的小朋友们自己的小播客 “[西柚课间| 小宇宙 - 听播客](https://www.xiaoyuzhoufm.com/podcast/63f9f6ec75918da323982e2c) ”. 这次我们选择葡萄牙的波尔图 Porto 和里斯本 Lisbon, 短暂离开荷兰的冬天,去享受一下阳光吧.
|
|
11
|
-
|
|
12
|
-
几乎不太需要什么规划,两个城市都是热门欧洲旅行目的地,从阿姆斯特丹出发飞机直达,如果有什么需要提醒的:那就早点订机票和酒店吧,哪儿的旅行不需要早点订机票和酒店呢?早定早安心,而且省钱. 这次和上次的交通方式和酒店方案类似。
|
|
13
|
-
|
|
14
|
-
### 交通
|
|
15
|
-
|
|
16
|
-
* 阿姆斯特丹 → 波尔图: 荷兰航空,不到三个小时.
|
|
17
|
-
* 波尔图 → 里斯本: 火车, 接近三小时
|
|
18
|
-
* 里斯本 → 阿姆斯特丹: 荷兰航空,三小时.
|
|
19
|
-
|
|
20
|
-
### 酒店
|
|
21
|
-
|
|
22
|
-
我出行还是不习惯使用 Airbnb, 所以一般都选择酒店,而且每次都是家庭出行,所以需要家庭套房,所以价格也会相对高一些,不过这次价格相对可控。
|
|
23
|
-
|
|
24
|
-
在波尔图, 我们选择了 Vincci Hotel,在 Booking 上的评价其实还不错,这个酒店就在杜罗河边,不过整体设计中规中矩,没有太多惊艳的地方,不过早餐还是不错的,加上税8欧元的早餐还是蛮丰盛的,我们吃的都很满意. 在里斯本,我们选择了 Moxy Hotel,这酒店经济年轻,家庭房也很凑合,其实这个酒店不合适有钱的商务人士,也不适合真正想在酒店里玩耍的亲子需求的家庭,但是适合我们这样,简简单单,干干净净,年轻且些许时尚的“年轻”家庭.
|
|
25
|
-
|
|
26
|
-
## 波尔图
|
|
27
|
-
|
|
28
|
-
落地波尔图,小朋友们绝对好像回到爷爷奶奶家,气温很温暖。我们坐601 公交车从飞机场去酒店,一共27站,一路上对这个城市有了一些初印象:小城市,很多地方像中国的南方小县城,路边灰土灰土的,但是有山有树,上上下下,很有层次。下了车,沿着一条弯曲,有些地方甚至很狭窄的下山路,走到杜罗河边就到我们的酒店了
|
|
29
|
-
|
|
30
|
-
.
|
|
31
|
-
|
|
32
|
-
酒店入住之后简单收拾,然后休息到傍晚,就打车到市中心去找饭店吃饭了,饭店一般我直接都在 Google Map 上直接搜索,然后看着不错就直接去,波尔图的第一天晚上选择的这家饭店就在河边,我们坐在室外,天气不错,看着路边人们走来走去。我们点的很常规的食物,除了生蚝有点不合适(因为它真的是生的,我目前还是受不了生的腥味),其他都比较正常,海鲜饭,蒜香虾等都不错。
|
|
33
|
-
|
|
34
|
-
令人开心的是晚餐时候的邻桌是一对爱尔兰的夫妇,有五个小孩,最小的已经十五岁了,所以他们有大把的时间出来玩,不过除了之前到过香港,中国其他城市没有来过,不过他们很喜欢中国美食。我们聊的很开心,惜惜(女儿)滔滔不绝和他们分享各种事情,他们也很耐心和捧场,过程中他们也“分享”了很多英国和美国之间的各种Beef, 我说我女儿现在在说话的时候用很多 “like”,她说小朋友现在确实特别爱用 “like”, 而且受到美国英文习惯的影响非常大,然后列举好多中美英文差异的地方,从食物到足球,顺便还炫耀一下就算是大学,英国质量也比美国好(哈哈哈)。最后还给我们推荐了不少的英国食物。
|
|
35
|
-
|
|
36
|
-

|
|
37
|
-
|
|
38
|
-
吃完晚餐,沿着河边走走,正好听到街头艺人正在唱 “Hey, Jude”, 全场氛围很棒,买了一份炭烤栗子,边吃边逛回酒店。
|
|
39
|
-
|
|
40
|
-

|
|
41
|
-
|
|
42
|
-
第二天早上有点小雨,在酒店吃完早餐,我们就去打车到狮子喷泉,本来打算去波尔图大学看看一下,没想到就是一栋楼(后来听说只是其中的一个办公楼),路过莱罗书店,但是排队的人实在是太多了,所以我们就去买了伽莫修道院参观了。
|
|
43
|
-
|
|
44
|
-

|
|
45
|
-
|
|
46
|
-
我个人到异国他乡旅行,如果当地的导游服务不是很贵,我一般都喜欢购买导游服务,这次波尔图也一样,在 Booking 上买一个的导游服务,很便宜,一欧元一个人。英文讲解,带你走遍十几个主要景点。小哥是都柏林人,讲的还是挺有激情的,如果懂一些欧洲历史,听着可能还更好玩一些,而且可以一起讨论,蛮有意思的.
|
|
47
|
-
|
|
48
|
-

|
|
49
|
-
|
|
50
|
-
总共十几个人的团,团中还有另外一个中国小哥,简单聊了聊,碰巧他之前也在荷兰莱顿生活过。导游小哥带着我们三个多小时,走了十几个景点。 Fonte dos Leões ➝ Praça Gomes Teixeira ➝ Edifício da Reitoria da Universidade do Porto ➝ Igreja do Carmo ➝ Livraria Lello ➝ Torre dos Clérigos ➝ Antiga Cadeia da Relação ➝ Monumento a Dom Pedro IV ➝ São Bento Railway Station ➝ Rua das Flores ➝ Miradouro da Vitória ➝ Porto Cathedral (Sé Catedral) ➝ Praça da Ribeira ➝ Ponte de Dom Luís I
|
|
51
|
-
|
|
52
|
-

|
|
53
|
-
|
|
54
|
-
后来由于小朋友们实在是累了,所以我们在火车站那一站就放弃了,然后打车回酒店休息了.
|
|
55
|
-
|
|
56
|
-
晚上我们到一个很火的餐厅,排队了一个多小时,不过最后吃的还算满意,而且他们的服务也很到位,我们一家人吃的都很开心。
|
|
57
|
-
|
|
58
|
-
第二天是自由的一天,睡到自然醒,然后乘坐酒店门口的公交车,直接到 Matosinhos的海边,小朋友在沙滩玩了很久。直到饿了才打车回到市区吃午餐,然后在城市走走看看,波尔图主教座堂附近都值得走一走,最后徒步走路易一世大桥,走到另一边,就是一个小山坡草地,大家都坐在草地上,看着波尔图的城市风景,迎着夕阳,听着街头艺人的音乐,直到我们晚餐时间。
|
|
59
|
-
|
|
60
|
-

|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
万万没有想到,很少生病的惜惜竟然半夜发烧了,第二天早上还是感觉不是很舒服,早餐也吃的不多,因为我们下午一点多就要坐火车出发去里斯本了,本来打算早上再去逛一逛老城区,但是惜惜不舒服,所以计划就改成了,小朋友们在酒店休息,妈妈收拾行李,我去买退烧药。在葡萄牙买药很简单,简单的描述病情和小朋友基本信息,药师就会推荐相应的药物,并且询问我是否介意含有布洛芬。
|
|
64
|
-
|
|
65
|
-
买药的路线是一条僻静的上下山小道,是我们来时的路。
|
|
66
|
-
|
|
67
|
-
## 波尔图火车到里斯本
|
|
68
|
-
|
|
69
|
-
从波尔图到里斯本的火车,速度倒是还行,和国内高铁差不多,但是平稳程度和国内的高铁差太多了,惜惜在一半的时候在车上呕吐了,我只能和列车员说抱歉,列车员也是见怪不怪了,说这是很常见的。旁边的乘客很友好的给我们一些纸巾,甚至拿出了药物给我们,但是当我说她稍微有点发烧,而身后的弟弟有点咳嗽(波尔图的海鲜饭真的好咸),他们就默默的带上了口罩,显然是怕流感了。
|
|
70
|
-
|
|
71
|
-
*事实是确实流感了,我回到了阿姆斯特丹的第二天我就全身酸痛*。
|
|
72
|
-
|
|
73
|
-
## 里斯本
|
|
74
|
-
|
|
75
|
-
从波尔图到里斯本,有点点进城的感觉,火车站到酒店直接打车即可,在葡萄牙基本上可以实现打车自由,自从到欧洲生活,感觉忘记了自己也曾经有几个消费自由(比如全家自由,优衣库自由,外卖自由),到酒店了之后,已经五六点了,所以找了附近一个蛮火的餐厅,但是其实感觉一般.
|
|
76
|
-
|
|
77
|
-
其实 Moxy Hotel 早餐看上去还可以,成人单价14欧元,不算太贵,儿童基本上酒店都是免费吃早餐的,但是惜惜和佑佑去参观了早餐的食物之后,不是很喜欢,所以我们决定在其他地方去吃早餐,但是 Google Map 搜了半天都看不到合适,最后在酒店旁边的 Brunch 店解决了,十几欧的价格,三明治,烤吐司,两杯咖啡和一杯果汁,其实也蛮不错的.
|
|
78
|
-
|
|
79
|
-
第一天的站是 Torre de Belem (贝伦塔),葡萄牙航海时代的产物,四五百年的历史了,古老和些许的壮观,在海水的冲刷中又带些落寞的沧桑。人不少,我坐在草地边晒太阳,惜惜,佑佑和妈妈在水边玩耍,抓了几只小螃蟹和漂亮的贝壳。
|
|
80
|
-
|
|
81
|
-

|
|
82
|
-
|
|
83
|
-
欣赏完贝伦塔,继续沿着 Tejo River 往前走,就可以到达航海纪念碑了,碑上的三十三位航海时代的重要人物,可以一略葡萄牙在航海时代的辉煌,目前也是一座博物馆,可购票入内参观,不过这次不巧,博物馆闭馆,要到三月份才开放。
|
|
84
|
-
|
|
85
|
-
航海纪念碑继续前进不到三四百米即是热罗尼摩斯修道院(Mosteiro dos Jerónimos), 本来打算购票进去参观的,从外部看只是非常的壮观宏伟,但是小朋友对修道院不感兴趣,所以就放弃了。而且排队较长,所以带小朋友去 Museu de Marinha 的餐厅上个洗手间之后,坐在修道院前的小公园的石凳上,听着美妙的音乐,吃着美味的午餐,享受阳光,很惬意。
|
|
86
|
-
|
|
87
|
-

|
|
88
|
-
|
|
89
|
-
吃饱喝足,休息好之后,我们公园走一走,就打车去里斯本大学了:去任何城市旅行,去大学参观是常规项目。里斯本大学,说实话,才几天过去,但是其实没有留下太多印象,因为是在不懂这个大学,而且也没有整个过程也没有眼前一亮的地方,所以我们想以后我们去大学参观一定找一个对学校熟悉的人来当导游。
|
|
90
|
-
|
|
91
|
-

|
|
92
|
-
|
|
93
|
-
逛完大学,我们回酒店休息好了之后,就找了一家韩国烤肉店,因为好几天都吃的葡萄牙本地的餐食,想换个口味,没想这个决定让我们付出了惨痛的代价,第二天早上,佑佑练习的呕吐,而且轻微的发烧,显然是食物中毒了,我们因为呕吐完了之后应该就慢慢恢复了,但是早餐佑佑也吃很少,休息好几个小时,还是感觉不舒服,所以显然旅行计划只能改变,选择一些不费劲的方式:最后我们选择了坐有名的28路小黄车游览一下里斯本. 不过因为有一下午的时候,所以我先带着小朋友在 Martim Moniz Square 坐着晒太阳,惜惜还和一个大叔拿了鸟食喂了一会儿鸽子。不过偶尔就看到有人在广场的大叔底下小便,蛮大煞风景的。
|
|
94
|
-
|
|
95
|
-

|
|
96
|
-
|
|
97
|
-
28路小黄车还是可以坐一坐的,不过排队需要好一会,不过叮叮当当坐着,浏览着古老的城市,还是挺有感觉的,正好它的终点站是卡蒙斯广场(Praça Luís de Camões),是里斯本市中心的一个著名地标,向葡萄牙伟大的诗人 路易斯·德·卡蒙斯(Luís de Camões) 致敬. 我也顺便在那附近的一个药店买给佑佑一些药物,在那儿坐着看看人群,聊聊天,然后我们就会酒店了,晚上去吃了一家中餐,味道很地道,而且佑佑吃了一整份的汤包,以及麻婆豆腐和一点米饭,些许恢复体力。
|
|
98
|
-
|
|
99
|
-

|
|
100
|
-
|
|
101
|
-
第三天中午就要坐飞机会阿姆斯特丹了,所以早上就睡到自然醒,然后打车直接去机场,发现葡萄牙的 Bolt 司机比西班牙的司机友善很多,他们会主动的帮你拿行李,微笑服务,而且英文普遍还行。
|
|
102
|
-
|
|
103
|
-
## 后记
|
|
104
|
-
|
|
105
|
-
这次绝对不是那么让人享受的旅行,但是意料之外的事情,也让我们的旅行记录更加地丰富,经过这次旅行的生病,我们得到两个教训:出门带点药,以及不要去吃不能确保安全的食物(比如烤肉)。
|
|
106
|
-
|
|
107
|
-
最近正在惜惜和佑佑讨论下次旅行目的地,在英国和意大利之间角逐,期待下次旅途.
|