月度归档:2023年07月

云南之旅支出分析

云南之旅支出分析

云南之旅的支出总体分析也做完了,接下来聊一下本次的支出。

支出明细参考 Airtable

总支出

本次旅行 6 月 17 号开始,6 月 25 日结束,共计 9 天。总支出 15309 元,日均开支 1701 元,日人均开支 850 元。

支出结构

对所有的支出条目进行梳理后,我发现不出意外的,在支出最大头的是出行相关。

而在出行相关中,成本最高的是机票,其次是一嗨租车。一嗨租车因为实际上是我租了多天,所以单日成本可控。

除了行之外,成本比较低的是住,可以看到,我在住上面花费了非常少的成本,主要的原因还是因为我去的时候云南还是属于淡季,所以整体的开销还好。

在游玩和景点方面,整体花费的不算特别多,成本大头的是伴手礼和旅拍的照片,其他的景点其实就还好。再加上我们俩基本上也没怎么去特别贵的景点,也就开销一般啦~

吃的方面,这次来云南吃了不少当地的美食,所以开支比较大,符合预期(当然,比重还是有点收到惊吓),但总体还在可接受范围内。

总结

旅游真的烧钱。。。不过穷家富路,出门了就别太在乎钱,不然还不如不出门。下次还去!

不过下次我可能会优化一下我的一些选择,比如租车可能会选择携程租电车 + 保险,来节约一些交通的开支。

给 mdbook 增加备案号显示

给 mdbook 增加备案号显示

由于 Gitbook 长期不维护,为了保障整个架构持续可用,所以导致我不得不从 Gitbook 迁移到 mdbook。

在使用 mdbook 的时候,有个问题是,我的不少电子书域名都是备案过后的,mdbook 又不像 gitbook 支持可以在目录里跳转外链,因此我需要自己实现给 mdbook 添加一个外链。

实现思路

由于没办法直接通过在 Markdown 当中实现跳转外链,那么一个比较简单粗暴的方法就是直接在模板当中添加,刚好 mdbook 在文档中有说明具体的操作方法

你只需要在 mdbook 的根目录中创建一个 theme 文件夹,并生成一个 index.hbs 文件,用于渲染页面。

接下来,你只需要在适当的位置添加上你需要的代码即可(下方的 toc 后面的 有序列表便是我手动添加的)

   <nav id="sidebar" class="sidebar" aria-label="Table of contents">
            <div class="sidebar-scrollbox">
                {{#toc}}{{/toc}}

                 <ol class="chapter">
                    <li class="chapter-item expanded "><a href="https://beian.miit.gov.cn/" target="_blank">这里是你的备案号</a></li>
                </ol>

            </div>
            <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>

        </nav>

参考文档

https://github.com/rust-lang/mdBook/issues/1354

淄博之旅

淄博之旅

我去淄博其实是两个月之前了,由于拖延症,一直没写,于是我想,如果我再不写,可能我再也不会写了吧。OK,那就开始动手写吧!

缘由

我去淄博是在 5 月初,彼时我刚提车,于是便决定开车从天津前往淄博,一方面是练练车,另一方面刚好最近淄博火热,也去看看令人好奇的淄博烧烤。

人文景点

八大局

淄博作为一个以烧烤、烟火气火起来的城市,既然来,自然重点是看大家的生活,所以,到淄博的第一站,自然是少不了到八大局溜达溜达

不过,当我去的时候,八大局已经在网络上火了很久,所以现场的人非常多。八大局也逐渐有了网红街的感觉了,比如紫米饼,已经被叫”网红紫米饼“了。

考虑到排队正版的紫米饼时间太长,讨厌排队的我最终选择了一家非正版的紫米饼,试了试,味道还行。可能正版会更好吃,但排队实在太讨厌了…

齐盛湖公园

从八大局出来,我们便开车去酒店休息,到了晚上,来到了淄博张店区的齐盛湖公园,据说这里有一个「海岱楼书店」,是曾经的最美书店,于是也跑来打卡,看看这个最美书店。

从外景来看,楼宇与湖光一起,远处还有山光,雀实不错。

走到近处,颜值也还算是能打

进入到里面后,内里的设计不像外部那么的古朴,反倒是还挺现代化的。但这个设计,挺讨喜的。

作为一个最美书店,还是值得打卡的。

自然景观

潭溪山

由于安排了比较长的时间来淄博玩,所以我们除了逛一逛人文景观,还去了淄博的潭溪山景区,看看淄博的自然风光。

潭溪山的风光整体来说,还不错,与云南、西藏没办法比,但依然算得上清秀。

潭溪山的话,我自己最喜欢的应该是这个透明栈道了。作为一个有恐高症的人,走这个透明栈道属实是胆战心惊,但,还是要走!

旅行建议

淄博市是一个纵向偏长,横向较窄的城市布局,而我们在抖音上看到的八大局、烧烤一般都是在中间的张店区,而如果你只玩了张店区,你就错过了淄博的更多内容,淄博的临淄区、周村区、淄川区、博山区也有各自的特色和风格,如果你来了,我建议你除了在张店玩一玩,还要留有更多时间去看看更多不一样的淄博。

淄博市行政区划图

店铺推荐

在淄博的时候,我们吃了不少的烧烤,我最推荐的是淄川区的程大牛肉,这家店是牛肉烧烤专卖店。

一句话来描述的话,在我看来,程大牛肉是在用潮汕牛肉的思想做烧烤,这家和别家不一样,他是按部位卖牛肉烧烤的!你可以吃不同位置的牛肉做成的牛肉串!

推荐去试试看!不过,需要注意的是,他们家是预约制度的,所以你最好提前打电话联系一下,预约一个位置,以确保自己有位置。

总结

这次第一次来,我们只是简单玩了玩,对于淄博有一个更不一样的认识,而更加细致的内容,依然需要进一步的来淄博看看,体验一下淄博更细节的内涵,还要再去的!

APILetter S1E5 如何设计一个符合 RESTFul 风格的批量操作的 OpenAPI 接口?

APILetter S1E5 如何设计一个符合 RESTFul 风格的批量操作的 OpenAPI 接口?

批量创建、批量更新、批量删除

批量获取说完了,接下来我们来聊聊批量更新,实际上批量更新、批量创建虽然有场景,但也不多,在这种场景下,我们已经很难像批量获取那样,在原有资源上进行操作,而是需要借助批量资源来实现批量操作。

以用户资源(User)为例,当我们需要对其进行批量创建、删除、更新时,我们需要创建一个批量资源 BulkUser,并通过对 BulkUser 操作,来创建用户。Bulk User 本质上是将请求的多个资源转换为了异步的任务,在发起后,开发者可以在任务结果中查询具体的值来使用。

如何理解异步的任务?
这里异步的任务更多是一种设计表现,并不强制要求一定异步。异步的表现设计和相关的接口实现,是为了给后续留出纵向扩展的空间。既 无论是否行为是否真实异步,都需要在返回结果中返回任务 ID & 任务状态,以便于开发者自行实现异步处理的逻辑。

{
    "code":0,
    "data":{
       "job":{          "id":"123",          "status":"ok"        },
        "results":[
            {
            ...
            }
        ]
    }
}

批量创建

批量创建用户的操作和创建单个用户的操作是比较接近的,主要差异点在于 Path 上有区别,且传递参数时,会传递多个资源的属性。

批量创建用户

# request
POST /bulk_users/

{
    "users":[
        {
            // user1
            ...
        },
        {
            // user2
            ...
        }
    ]
}
# response
HTTP/1.1 200 OK
{
    "code":0,
    "data":[
       {
            // user1
            ...
        },
        {
            // user2
            ...
        }
    ]
}

批量更新用户

批量更新时,你已经知道了你需要更新的资源的 ID,因此,可以这样设计的你的接口:

#request
PUT /bulk_users?id[]=1&id[]=2

{
    "gender":"other"
}

# response
HTTP/1.1 204 No Content
{
 "code":0,
    "data":[
       {
            // id=1
            ...
        },
        {
            // id=2
            ...
        }
    ]
}

批量删除

有了上面的几个例子,批量删除就比较好定义了。就像这样:

#request
DELETE /bulk_users?id[]=1&id[]=2

# response
HTTP/1.1 200 OK
{
 "code":0,
    "data":[
       {
            // id=1
           "status":"deleted"
        },
        {
            // id=2
            "status":"deleted"
        }
    ]
}

总结

批量操作在获取场景,可以考虑通过 List + Filter 的方式,或搜索的方式来实现一套更加标准的搜索接口,而规避提供定制化的自定义接口。从规范的视角,两者都是符合规范的,也可以都对用户提供,并不互斥。而对于没办法复用的创建、更新、删除,则可以考虑使用创建异步任务的方式,来实现批量操作,给开发者一个明确的异步预期,让开发者可以自行查询业务的实现方式。

云南之旅流水账

云南之旅流水账

云南之旅玩的非常的尽兴,6.17 ~ 6.25 ,全程共计 9 天,玩了昆明、大理、丽江、泸沽湖四个不同的地方,几乎每个地方待了 2 天左右,还是有非常多值得去和值得纪念的东西。不过,由于实在太多了,所以只能用流水账的方式来记录。在流水帐当中,着重说一些大面上的事情,而具体每个地方的更加详细的描述,则通过单独为每一个地方写一篇文章来说。

不过,为了方便你了解我的行程(抄作业),我在 Google Map 上准备了一份地图,方便你了解我去过的地方。如果你感兴趣的话,可以点击这个链接,看到我去的每一个地方,以及相应的评价。

行程总览(Overview)

日期地点描述
6.17天津,昆明,遵义天津飞昆明,遵义茅台机场中转; 落地后入住酒店,在昆明逛了南强街和南屏步行街
6.18昆明,大理早上去滇池,下午从昆明站出发前往大理,到大理后取车前往酒店入住后去大理古城.
6.19大理环洱海,期间去了喜洲古镇、大理圣托里尼
6.20大理,丽江逛崇圣寺三塔、坐感统索道上苍山,晚上还车并从大理坐车前往丽江,晚上住在丽江古城附近。
6.21丽江逛丽江古城、拍照、吃纳西族黑山羊火锅。
6.22丽江,泸沽湖吃过桥米线,从丽江出发去泸沽湖,晚上吃摩梭族烤鱼。
6.23泸沽湖,大理环泸沽湖,吃摩梭族烤鸡,下午开车回大理,并在大理古城拍照
6.24大理,昆明早上在大理吃过早餐,就开车出发去昆明,下午入住斗南花市旁的全季酒店,晚上逛斗南花市。
6.25昆明上午逛云南省博物馆,下午在翠湖公园溜达后,前往昆明长水国际机场。
9 天旅途的 Overview

感受

1. 云南的气候宜人

云南的气候是这次我体会最为深刻的。我在云南旅行的时候,恰逢天津正是高温的时刻,相比之下,云南的最高温不过 30 度简直是太过凉爽。

不过,虽然最高温不过 30 度,但在中午时刻,依然是比较热的,只是没有像北方是“烤”的感觉。而云南的湿度也不高,也不会有广东的“蒸”的感觉。

从气候上来讲,我觉得云南是比海南广东(太蒸),华北平原(太烤)要更好的。太宜居了。

旅行期间天津的天气, 来源 2345
旅行期间昆明的天气,来源 2345

不过,美中不足的是云南的紫外线强度也是太强了。云南 9 天,基本上每天都会喷安耐晒,整个旅程下来,我的小臂/脸上还是黑了一个色号。再去云南,我觉得我可能会直接选择穿防晒衣,物理防晒,最为靠谱。

2. 云南的风景美如画

云南的风光对我来说,可以比肩 19 年在西藏出差时的西藏风景。

蓝天、白云、青草地,还有洱海、泸沽湖这样的水,非常的舒服了。下面贴几张图,让大家感受一下(以下照片均出自原相机,无滤镜,但拍摄设备有 iPhone 13 和 Pixel 6):

从昆明机场到塘子巷时地铁上拍的天和飞机
昆明机场廊桥上拍的天空和机场
滇池风景
滇池水上风景
洱海边拍的苍山
洱海边
泸沽湖夜景(晚上八点左右)
泸沽湖草海
泸沽湖俯瞰
泸沽湖里格半岛

如此美景,我最大的感受就是,悔不该当初,我就应该带上相机来的!这次出行为了方便,我只带了拍立得和手机,所以拍不出我所看到的美景,再来我要带上我的6400、广角镜、长焦镜,把这些美景都拍下来!

3. 云南的美食很特别

这次去云南,赶上雨季推迟,所以没能吃当地的野生菌(我很想试试见手青,据说是云南的顶尖美味)。但也还是吃到了一些好吃的/ 特别的。

比如:在喜洲古镇吃到了炸蝎子🦂。

比如,云南的粑粑,感觉就是各种不同的馅饼。

也吃到了云南必吃的鲜花饼,现烤的是真的太好吃了。

傣族风情手抓饭也少不了

总结

云南这次的旅行给我的感受还是很深刻的,先简单总结三点。更细节的,后面一篇篇来。

可以肯定的是,云南,我还会再去的。