推荐新加坡的餐厅:Ma Maison

没想到我会专门写一篇博客来推荐一家餐厅,哈哈。今天想写的餐厅叫 Ma Maison,经常和同事朋友去,食物比较好吃,价格也相对优惠。所以想专门推荐一下。

Ma Maison 是一家日本餐厅,但是有两种风格:Tonkatsu Ma Maison, 顾名思义,专门做炸猪排;Ma Maison 洋食屋,顾名思义是西餐风格。

Tonkatsu Ma Maison, 各种各样的炸猪排,非常好吃。套餐包括饮料(茶),米饭(白米饭或者糙米饭),猪排,卷心菜沙拉,味增汤。猪排炸的恰到好处,外酥里嫩。味增汤也很好喝。除了猪排之外,其他的食物都可以 refill,管饱。最早听说这家餐厅是同事 YX 告诉我的,他的评价是:回中国之后最想念的就是这里的炸猪排,在中国还没吃到这么好吃的。

Ma Maison 洋食屋,我们最早去的就是这家。也算是比较正宗的西餐:按照前菜(一般是汤),主菜(主菜配面包 or 米饭,还有一小团意大利面),甜品的顺序上菜。我们最喜欢吃的是牛排,如果当前的 Daily Lunch Set 是牛排的话,可以透过玻璃看到厨房里面火舌四起,很有观赏性。

一餐的价格包括服务费和消费税在 20新币 – 30新币左右,水(或者咖啡,茶)免费,湿巾免费(细节很好),在新加坡算是非常实惠的价格了。

全岛现在有很多分店了,樟宜机场也有。除了新加坡,马来西亚新山也有一家,在 Southkey: Tonkatsu by Ma Maison – The Mall Mid Valley Southkey。

Westgate 门店,图片来自官网 (但是其他图片是我自己拍的)
Tonkatsu 门店
新加坡 Ma Maison 位置

食物

洋食屋
Tonkatsu 猪扒饭

优惠

优惠策略很有意思,有好几种:

  • Daily Lunch Set: 工作日午餐可以以比较便宜的价格吃到一份套餐,每日的套餐不一样,可以从官网查看,比如 AnchorPoint 分店的每日午餐列表可见这里
  • 盖章:注册会员之后会有两张卡片和一个 $10 off 的优惠券。卡片使用来集章的,分成午餐和晚餐两种:
    • 午餐:每吃一顿午餐可以得到一个章,收集齐 10 个章可以兑换一张免费午餐券;很多店有 Double Chop Day,消费一顿午餐可以获得两个章。这样的话,相当于买5送1.
    • 晚餐:每吃一顿晚餐可以得到一个章,收集齐 10 个章可以兑换 10 张 $10 off 的券。
  • Lady’s Night: Group 里面有一位女生,可以享受 20% off 优惠;
  • Early Bird 优惠:午餐去的比较早可以享受。

每一家分店的政策可能不同。我觉得最核心的就是 Daily Lunch 和集章,已经兑换了 30 张 $10 off 晚餐券以及 4 张午餐券了(说明我光顾太多次啦,哈哈)。

集章的卡片和优惠券
兑换的免费午餐券
还是优惠券
过生日的时候邮寄给我们的贺卡,很贴心,其实也是一张优惠券
 

Python 复用装饰器代码

前几天同事问我一个问题:Python 代码中,两个函数装饰器部分的代码太多了,而且有很多重复的,能否复用?这个问题我一开始也没完全听明白需求是啥,不过看了他的代码就明白了。

这里,我将他的代码简化如下:

这里,hello_woldhello_world2 的装饰器部分几乎相同,唯一不同的部分是 @add_args("bar", "bar1") 的第二个参数不同。所以他想要服用装饰器部分的代码。想要达到的效果如下面这个写法,希望能和上面的代码完全等同。

这个需求是用 click 这个库定义子命令的时候,子命令之间有很多重复的。在 golang 中,使用 cobra 库可以将一部分参数都抽象出来,复用这部分代码。在 Python 中,click 库看起来不太容易做到这一点。我觉得也许可以抽象出来命令 Group 来解决这个问题,但是同事听了直摇头,觉得 command sub1 sub2 这种敲下去两层子命令不太好,一层子命令是能接受的极限了。

有没有一种方法,能够复用这部分重复的代码,还不影响命令的 UI(怎么,Cli 也是一种 UI!)

回来试了一下,发现是完全可以做到的。

如果了解装饰器基础知识,可以直接跳到文末看答案。上面没有列出源代码的四个装饰器,源代码如下:

Python 中的函数是一等公民

这句话的意思是,Python 中的函数和其他变量一样,可以被创建,修改,赋值,可以作为参数。

下面是一个 decorating_bark 函数,这里面什么也没有做,传进来一个函数,拿到一个函数,只是为了证明函数可以作为一个参数一样传递和返回。

输出结果是:

当然,也可以做点什么,这段代码中的 bark 拿到函数之后,返回了一个新的函数,新的函数先是 print 了一下,然后调用原来的函数:

注意在 cat_say = bark(cat_say) 这一行,bark 所返回的新的函数赋值给了原来的 cat_say。运行的结果如下:

两行内容都是打印在 cat_say() 调用的时候发生了,说明它的行为被 bark(cat)的返回值给替换了。

这两个函数 decorating_barkbark 就是上面的装饰器,但是这一段内容中我们没提起过装饰器,都是在讲函数。

Python 中装饰器是什么?

cat_say = bark(cat_say) 这一行,我们也可以这么写:@bark。但是这一行必须要写在 def 的上方:

这就是装饰器了。所以,装饰器只是一个语法糖。它没有给 Python 添加新的功能,只是让代码看起来更漂亮简洁了一些。

可以传入参数的装饰器

下面这个例子复杂了一些:

但是我们只用上面学过的内容,不需要任何新的知识,就可以理解它。

you_decide_what_to_say("oh!") 只是一个函数调用,我们将 @ 这个语法糖去掉,就变成了下面这样:

看起来还是有一些复杂,我这么写,就简单了:

对照最初的语法糖,可以看到所谓“带有参数的装饰器”,本质其实就是一个函数调用,这个函数调用会返回一个函数,返回的函数才是装饰器,用来装饰 def 的函数。

换句话说,“带有参数的装饰器” 的本质是一个装饰器制造器(decorator maker,我发明的叫法)。

由于这个例子中,实际的装饰器什么也没做,所以看起来还相对简单。有了这些知识,我们可以来看最后一个装饰器,它比上一个增加的内容,就是对函数本身做了修改。

其中,add_args 是一个制造装饰器的函数,function_wrapper 是它制造出来的装饰器,real_func 是真正会返回的函数,会去替换原来的函数,它的内部调用了原来的函数,不过调用之前,它先修改了入参。

我还专门画了一个直观的图:

Python 带有参数的装饰器分解

答案

到这里,可以发现装饰器的代码也是可以复用的,因为我们可以将其当作函数来调用:

注意,包装的顺序很重要,因为装饰器是有顺序的,最里面的会先执行,最外面的后执行。读者可以复制到前面的代码中,会发现输出完全一样。这样做我们只是删除了语法糖,只使用了最原始的函数。(其实,代码中没有地方在定义装饰器,而只是在定义函数!装饰器是函数调用的语法糖)

但是,我们是否可以继续使用语法糖来复用这部分代码呢?答案是可以的。

因为 @ 必须在 def 的上方使用,所以我们必须要有 def 才行。那要 def 什么呢?我们只是想组合起来已有的装饰器,并不想改变原来的函数的行为。那就随便 def 一个新函数好了,只是新函数的内部啥也不用做,原原本本将原来的函数返回即可。

最后,上文中的 general_decorator 的实现可以如下:

读者若有兴趣,可以看下之前写过的另一篇有关装饰器的内容:Python装饰器兼容加括号与不加括号的写法。之后,相信如果看到装饰器的代码,就可以信心满满地说:“哈,我知道,这只不过是函数而已!”

不过,装饰器切不可滥用。一般定义装饰器的场景是制作框架,比如像 Flask 这种 web 框架,或者 Celery 这种异步框架。框架的制作者将装饰器定义好,用户就可以使用这些装饰器,好处是,用户看起来是在写普普通通的函数,但是确能通过装饰器告诉框架一些额外的信息,和框架配合工作地很好。

作为一个语法糖,装饰器可以很好的标记出来函数一些特殊的属性。它的目的是提高代码的可读性。可惜的是,笔者遇到过很多使用装饰器的代码,解决的问题确是普通的显式函数调用就可以完成的,使用装饰器反而让代码看起来更加复杂,语义上也说不过去,降低了代码的可读性。

什么时候该用函数调用,什么时候该用装饰器?这其实是需要在朝着写好代码的漫漫长路上不断练习的。但是我有一个捷径:如果你要标记这个函数的属性,比如标记它是异步任务,标记它失败需要自动重试(@retry),标记它和某一个 @api_route 关联,那么几句设计成装饰器;如果这个是函数本身的逻辑,比如需要先干这个再干那个,这三个函数都需要先干这个再干其他的。“这个”就是显式函数调用的场景。

 

Prometheus & Grafana No Data 排查手册

经常有同事来问我为什么从 Grafana 面板上看不到数据,其实排查思路是基本固定的,按照查询的链路一步一步看每一个组件里面是否有这个数据。之前写了一个排查文档,但是发现没有人阅读,遇到问题还是直接找我。今天画了一个图片版本的,更加清晰一些。在这里也贴一下。点击图片可以查看大图。

 

去远航

之前觉得像泰坦尼克号这样的游轮旅行是距离普通人很遥远的一件事,甚至觉得这种东西不存在了,因为飞机快太多了,水上交通只有轮渡和货轮才有存在的必要。后来听说还有游轮这种东西,但是目的已经不是交通了,而是在船上游玩。

相比于其他旅行,邮轮之旅最好的地方就是几乎不用做攻略,不用做计划,反正一直都在船上,也不需要预定住宿,不需要交通。喜欢什么玩什么,喜欢什么吃什么。非常适合带父母旅行,或者带小朋友来玩。所有的项目都是现场排队,唯一要预定的是丝绸之路演出,但事实证明,不预定也 ok 的,无非入场晚一点而已,观看效果也不会太差。整个行程可以不像旅游一样有压力,当作放松之旅就可以啦。

邮轮的模式

就是你只需要支付住宿的钱,其他的都是免费的,包括:游玩项目,吃饭,观看演出,参加 party。简单来说,预定的时候支付了一笔住宿费,后面都不用花钱了。(我在船上就一分钱没花)。当然,上船之后都有收费项目,比如免费的饮料都不含酒精,酒水是要收费的。游玩项目免费的只是浅尝辄止,想要继续精进(比如冲浪,风洞跳伞)都是要额外付费的。餐厅也有付费餐厅,有的时候付费餐厅的人会去免费餐厅拉客。比较赞的一点是,所有的收费项目都是明码标价,绝对不对在不知不觉中被隐藏小费,体验非常好。

上船之后护照会被收走,发一张房卡,叫做 seapass。航程结束之后不回收,可以留作纪念。在船上很多项目都要刷这张卡,所有的消费也都是刷这张卡消费。有一点神奇的是,在滨城和普吉岛下船的话,也是刷这张卡?! 不需要护照,刷卡绑定照片核对,所以下船的话卡片千万不能丢了。

船上也可以用现金消费,不过用的是美金。(另外船上的紧急电话也是 911,这船就像是美国的飞地)

可以提前下载一个官方的 app,上船之后可以连接船上 wifi。如果购买上网套餐的话,就能上网,如果不购买上网套餐,相当于在一个局域网,只能使用 app:能够看每天的项目,可以在 app 内和船上的朋友聊天,可以看 shiptime (航程如果跨越时区,手机的自动调整在海上是不准确的),可以 reserve 一些项目,也可以看自己的消费账单。

预定方式和价格

官网直接预定即可,即使有其他做旅游的平台和公司,其实也都是在这里订的,然后收你一些手续费。有意向要去玩的话可以多刷一刷他们的网站,不定时会有折扣。房间有不同类型:无窗,有遮挡窗,阳台房,有遮挡阳台房等。我们定的阳台房,阳台房价格一晚1000人民币(每人)算是不错了的,刷到的话可以下手。

正常一间房间就是住两个人,如果是1人去玩的话,价格几乎跟2人一样。带小朋友的话,官网也经常能刷到免费带小朋友的活动。

我们这一次坐的船是海洋光谱号(Spectrum of the Seas)。皇家加勒比是一个比较大的邮轮公司,旗下的邮轮游很多,不同的城市有不同的船和航线,有的时候船也会调往其他地方。海洋光谱号去年和今年(2014年)三月前都是在东南亚的航线,但是3月份就会去上海了,所以官方上可以看到新加坡出发的,从3月开始就没有了。上海的朋友就可以订到海洋光谱号了。也会有一条(唯一一次)从新加坡到上海的单向航线。

选择房间

船头和船尾会晃动的厉害一些,怕晕船尽量选低楼层,船中间的房间。但其实船两头正常人也能接受,船很大,很难晕船的。99% 的时间都是跟陆地一样。

6层和13层会比较吵,因为餐厅,剧院,Party 在4、5层,13层以上是活动区。

房间会有一张沙发,沙发拉出来下面一层也可以是一张床,所以一个房间可以住下四个人。有需要的话可以让客房服务铺好这张“床”。4个人的话也可以订两个房间,然后阳台可以打通(都是组合的钢板,可以拆),也比较舒适。

我感觉船晚上会加速,晃动的厉害一些。有一个小插曲,有一天晚上我总觉得有一些噪音随机出现,找了半天没找到是在哪里发出来的。最后实在受不了,就去前台问了一下。前台说是衣橱里面的衣架,刚刚来了一个人问一样的问题,最后发现是衣架晃动的声音。我回去看了一下,果然是。

吃饭

船上餐厅有收费餐厅和付费。付费的我都没去过,所以不写了。

免费餐厅主要有两种:Main Dining Room 和帆船餐厅。

  • Main Dinning Room 是西餐,仪式感非常强,整套的西餐刀叉,每次进去服务员都会帮女士拉出座椅,菜单也是西式的前菜+主菜+甜品的风格,会吃到一些自助餐厅吃不到的东西。缺点是上菜速度有些慢,如果赶时间看演出的话最好不要去。
  • 帆船餐厅就是自助了,品质相当于景区 Resort 酒店的自助水平,还是不错的,虽然是算不上惊艳,但是很干净,进去之前每个人都要洗手,餐厅很注意卫生,比如,禁止用使用过的杯子二次接水。缺点是有些游客素质差,不排队,没礼貌。

其他还有一些小餐厅,泳池附近有戏水餐厅,有冰激凌站,热狗车,都是免费的。早餐也可以叫 Room Service,在阳台上看着大海吃早餐,也是免费的。

所有的服务员都非常友好,简直是海底捞级别的服务。最后一天每一个餐厅的服务员和厨师都出来跳舞,气氛很赞。

演出

每晚都有演出,这些演出超出我的预期了,非常精彩,有歌舞,杂技,魔术,二人滑稽戏等等。建议观看!一般每个演出在同一天有两场,可以安排下吃饭时间,不要错过。

Party

晚上有各种 party,青少年 party,单身 party,虚拟烟花 Party 等等。

我觉得最有意思的是一个 Silence Party。现场有dj,但是没音响,大家都戴耳机,耳机有一圈 LED 颜色,表示当前的频道的颜色:有蓝绿两个音乐频道,可以自己切换,耳机颜色不同的人可能跳不到一块去,而且自己看不到自己耳机的颜色。有的时候会觉得自己格格不入。关掉耳机,感觉大家都和僵尸一样。

除了 Party,可以留意 app 上提示的当晚服装建议,有正装夜之类的。但是我们的船每天都是 casual.

上网

前面提到过如果买了上网套餐就可以上网了。使用的网络是 starlink,速度测试大约 2MiB/s,但是非常稳定,体验很好,视频通话,看 youtube,Netflix 都是足够的。

上网认证的步骤做的体验很好,首次登陆需要创建一个 wifi 账号,然后后续用这个账号登陆。我们买的是每人1个设备套餐,登陆第二个设备,前一个设备会提示你要不要 logout,wifi 认证成功率 100%,一次都不掉链子。

有一种作弊手段是,用一个路由器连接 wifi,然后将其共享给所有的人用。安卓手机就可以做到这种效果。不过我没用过,看网上这样说可以。

The Key

类似于特权卡吧,买了的话,Seapass 会带有一个 key 的标志。包括的权益主要有:

  • 上网套餐(1设备);
  • 快速登船和下船,包括在目的地下船,比较实用;
  • 上船当天额外一顿午餐;
  • 餐厅固定座位;
  • 演出专属位置:演出前 key 会员先进入,演出前 15min 所有人都可以进入。不顾实际体验是都不管,所以这条几乎没用。

核心卖点就是上网套餐了。在约定游轮之后,邮箱会经常收到折扣信息,我是刷到 35% 入手的,只比购买上网套餐贵了一点点。需要注意的是如果购买的话,必须整个房间一起购买,所以有人认为单纯需要上网的话,The key 比作弊共享的方式贵太多了。

在目的地下船

前面提到过下船不需要护照,只需要 seapass 卡就可以了。不在高峰时间下船,速度非常快,几乎10-20分钟就能到目的地。

下船方式分成两种:

  • Dock: 船会停在码头上,直接出船的 Gateway 就可以从码头出去,没有海关检查,速度很快;
  • Tender: 船不会靠近码头,会有小船从游轮将游客接送到码头。

我们的行程是包括滨城和普吉岛,滨城是 Dock,靠近 George Town,普吉岛是 Tiner,靠近巴东海滩。都是在景区,所以出去转一圈非常方便。

下船的话要注意船上的规定,回来要过安检的,比如酒水就可能不让带上船,买了的话会收走,行程结束归还。

另外,如果去过了目的地,不下船也是一个很好的选择,一个是时间短,这么短也玩不了多少内容。另一个是在下船时间,船上人比较少,可以少排队体验一些项目。

游玩项目

  • 模拟跳伞:就是在风洞里面飞行,第一次体验,挺好玩的。免费体验是 1分钟的课程。
  • 甲板冲浪:分成两种,趴着到跪起来的,和站的的,因为用的不一样的板子,很刺激。但是排队的地方太晒了,注意防晒。
  • 碰碰车:很好玩,有时候很少人排队,可以经常去看看,人少就上。
  • 射箭:个人也比较喜欢。后面人少,也可以尽情玩。
  • 乒乓球:公司就有,所以没啥兴趣。
  • 篮球:也没啥兴趣;
  • 体感游戏机:小朋友很喜欢,我玩的时候有个小孩在指导我,我每次路过都看到这小孩在玩这个,感觉可能是一个 NPC。
  • 儿童游戏厅:不是投币的,是直接刷房卡。
  • 露天泳池
  • 室内日光浴场
  • 泡泡浴
  • 北极星(可以看作是只有一个舱的魔天伦):我们想定的时候系统坏了,可惜了,没体验过。
  • 南极球(我们去的时候关闭了)
  • 高层透明玻璃的走道:惊险又刺激。
  • 以及到处都有的躺椅:躺一躺也是不错的,中间还有露天电影,晚上放电影,白天放可爱猫咪的视频。
  • 赌场:建议出海不要涉赌,我们去剧院的路上要穿过赌场,拍了一些照片。有很多中年人大叔大妈在里面玩。机器的玩法居然也是刷 seapass 卡就可以下注,我觉得这可太恐怖了,没有花钱的感觉,说不定不知不觉就输了一大笔。

~~贴图时间~~

碰碰车欢乐多
甲板冲浪
整整齐齐的餐厅
学习的叠餐巾,跌的是蜡烛
学习叠毛巾,叠的是北极熊
主餐厅的牛排
船头的日光浴场
晚上的船上泳池
演出
从滨城码头看海洋光谱号
滨城,著名的自行车
房间墙壁都是钢铁的,门也是,所以可以用各种磁铁。
演出
Silence party,每个人都戴着耳机
从船上看滨城码头
模拟跳伞
帆船自助餐厅
在阳台上吃早餐,这天到了普吉岛
Costa Serena 号,这艘游轮和我们一起停在了滨城和普吉岛。看起来比海洋光谱号小很多。这是他们的官网
普吉岛的海滩,上次来普吉岛正好是一年前了,可惜这篇游记躺在草稿箱一年还没有写完
从普吉岛的 tender 看海洋光谱号
船的顶楼景色
船上的日落
晚上的船
船上顶层的跑道
回到了新加坡

其他网友写的:

 

站立提醒软件推荐:stretchly

之前在这篇博客《沉浸式工作》推荐过一个站立办公的软件,定时提醒。它好的地方是可以在锁定屏幕的时候认为你正在休息,但是有一个很让我苦恼的问题:就是它的提醒依赖通知,容易被忽略。

尝试了其他几款软件之后,我现在觉得用的 stretchly 非常好,推荐一下。从名字可以看出来,它的本意不是提醒站立,而是定时提醒你休息,伸伸懒腰,眼睛离开屏幕。但是意思差不多。

它工作的方式是用一个页面盖住当前的屏幕,告诉你该休息了。一些细节处理的非常好。

  • 如果有外接屏幕,两个屏幕都会盖住。
  • 当前在使用的 app 也不会失去焦点,降低了误操作的概率,也不会造成意外的错误。

弹出框也是可以暂时跳过的,也可以设置强制模式让它永远不能跳过。

Stretchly 提醒弹出的界面

Mac 安装方法:

也支持 Windows 和 Linux,更多安装方式见这里官方网站