蚀心酸菜鱼

This is not the end. It is not even the beginning of the end. But it is, perhaps, the end of the beginning.

0%

风险

提到打枪,最常见的问题之一就是会不会铅中毒。CDC和WHO的指导建议是血铅水平没有安全界限,也就是任何接触铅都会增加健康风险。诊断治疗中,美国常用的参考值3.5 µg/dL(3.5 mcg/dL,公制常用单位为35 µg/L)只是说明接触铅的水平超过了97.5%的儿童,应该更加注重观察症状以及努力减少含铅物质的接触。

但既然烟草和酒精这两种广为人知的有明确证据的致癌物仍然被人们广泛使用,可能人类自我毁灭倾的向和对死亡的恐惧并不能在无限的历史中收敛。我,既不抽烟也不喝酒,但收敛酸铅底火点燃无烟火药产生高温高压燃气推动铅铸成的弹头以接近声速冲出挂铅膛线的枪管这一过程给我所带来的乐趣远超过从铅中毒的风险的恐惧。可能那些热爱烟酒的人也是这样想的吧?

(靠谱的)诊断

目前一般的共识是,只要遵循用去铅洗手液等清洁流程,避免在靶场喝水进食,回家后及时更换清洗衣服,在通风处清理枪支即可最小化风险。本人接触射击运动四年,一直以来都严格遵循第一条,但后几条偶尔会忘记。由于个体差异和环境等因素,人和人的血铅不能一概而论,这里附上我的血铅检测数据仅供参考:

2024年8月:17 µg/L

2025年6月:32 µg/L

备注:2024年8月之前练习射击的频率大概是每个月一次,室内外靶场大约一半一半。

2024年8月-2025年6月这段时间开始接触Practical shooting,大概平均每周去一次靶场每个月去一次比赛。

焦虑来源

https://www.recoilweb.com/lead-levels-from-shooting-188440.html

最近一次去测血铅的动机主要就是这篇文章。但考虑到这种文章的作者连医学诊断相关代码都没搞懂,可信度存疑:ICD-10(International Classification of Diseases, 10th Revision)作者误写为IDC-10;标题中 R53.83 为 Other fatigue,虽然铅中毒会导致疲劳但相比之下 R78.79: Finding of abnormal level of heavy metals in blood明显是更合适的选择。

其中对于 heavy metal challenge test 的诊断/治疗方法和主流医学观点不同,引用的naturopathic砖家观点也看起来很神棍。目前没有尿液铅含量的标准参考范围,(对于只懂枪不懂科学的红脖子而言)使用螯合剂后测尿样后比之前的尿样铅含量显著增加,确实看起来很有立竿见影的效果。But this is exactly how chelation works…大多数健康人,无论是否有铅中毒,这一套操作下来都会有重金属含量上升。而使用螯合剂等排铅药物的风险是否大过收益仍然存疑,更不用说一般的治疗方案在血铅超过450 µg/L时才会考虑用排铅药物。我要是遇到这种医生,我肯定先问ta能不能拼出EDTA这个词来确定这人是不是神棍再说。

相反的观点

这两篇文章的主要观点都是无论是Chelation Therapy还是heavy metal challenge test,都应该当且仅当有明显的重金属中毒症状时才使用。

https://my.clevelandclinic.org/health/treatments/chelation-therapy

https://nutritionfacts.org/blog/are-provoked-urine-challenge-tests-for-heavy-metals-a-scam/

靠谱的研究

https://pmc.ncbi.nlm.nih.gov/articles/PMC5379568/

这篇元分析表明,铅的来源主要为两方面:含铅烟雾和物理接触,而含铅烟雾的来源又分为底火中的铅化合物和铅制弹头两部分。物理接触主要来源是含铅颗粒附着与皮肤,衣服等物体表面。参考的CDC/NIOSH建议水平是50 μg/L,射击者的血铅水平在100-400 μg/L不等。预防措施包括射击后更换衣物、避免射击场所吸烟和饮食、以及使用无铅底火和子弹。可以看到,这和目前大多数人的共识基本一致。

值得一提的是使用消音器等增加back pressure的枪口装置时又会明显增加射手吸入的含铅烟雾,因此使用消音器时应该更加注意防护。

误解

另一方面,关于射击运动中铅的暴露也存在很多误解。

误解一:现在子弹都是无铅底火

对于9mm等centerfire子弹,无铅底火是常见的选择,但并非所有制造商都在用。比如Federal的Catalyst primer只有在比较贵的几种9mm才有

对于.22lr等rimfire,由于其制造工艺特殊(旋转弹壳从而将底火通过离心力散布到边缘一圈),收敛酸铅几乎是唯一选择,至少根据我的搜索没有找到无铅底火的选择。

误解二:全金属被甲(Full Metal Jacket, FMJ)弹头不会有铅外露

FMJ弹头的生产流程导致弹头其实后面是裸露的铅,火药燃气的高温下不可避免会有一部分气化。

另外即使是Total Metal Jacket(TMJ)弹头在膛线的挤压下也会有少量铅残留在枪管内(挂铅)。特别是.22lr这种弹头就算是铜弹头也只是Copper wash,也就是一层薄薄的铜,其作用和铅弹头上的蜡一样为润滑。

误解三:只用无铅弹头

无铅弹头一般是Frangible Projectile和Lead-Free Projectile的统称,前者一般用于近距离打钢靶防止溅射的弹头导致受伤;后者常见是铜质合金弹头,一般用于步枪口径狩猎,价格较贵。

对于不使用钢靶的射击运动,更好的选择是Federal Syntech,CCI Clean-22等高分子聚合物(塑料)包裹的弹头,比较常见,也可以避免枪管挂铜挂铅。

总结

事实上,从工业革命开始人类对铅的使用就在增加。尽管臭名昭著的汽油抗爆震剂四乙基铅也停止生产使用,含铅水管和含铅油漆却仍然还存在,因此对铅的接触几乎不可避免。对于大多数人遵循上述操作流程,再上点心的定期测血铅观察即可。

个人的角度,该打枪还是得打,但需要注意防护。下单买了3M OV AG P100 Professional Multi-Purpose Respirator以后每次去靶场都戴上,P100的粉尘过滤应该足以抵挡大多数含铅颗粒,Organic Vapor/Acid Gas(OV/AG)应该也能去除火药燃气的味道,顺便解决消音器燃气喷脸的问题。此外准备把子弹和靶场包放到单独房间存放,同时注重清理枪的房间的通风。


题外话,对烟酒征重税是大多数政府的常见操作,而美国只有加州少数州对子弹额外征税,华盛顿州有相关立法在进行但仍未完成。从健康的角度这似乎并非坏事,但考虑到美国人对小政府的执着和对政府预算使用的不信任,短期并不具有太多可行性。

上个月去亚特兰大的时候心血来潮租了辆Polestar 2,体验只能说差强人意,首次租电车也踩了不少坑。以后虽然可能不会主动选择电车,但也有必要记录一下踩过的坑,避免再次受挫。

Polestar 2: 勉强及格的电车

优点

电车一贯的加速快

动能回收可选低或者完全关闭

全景停车影像(主要是对于观察侧方距离有用)

人机交互不太蠢(且能用CarPlay)

缺点

低配居然连Adaptive Cruise Control都没有?车道居中也没有?虽然这得怪Hertz的版本没有Pilot pack,但是没了这些功能电车的主要优势就所剩无几了啊…我一直觉得电车的正确使用方式是城区动能回收+高速辅助驾驶,但是这次真的是体验大打折扣。本来临时起意打算去两小时车程的景点Rock City也懒得去了,毕竟全靠自己开往返也挺累的。

电车特有的底盘高。毕竟要放电池也没办法,但是车内空间确实大打折扣。高的人容易碰头,长发的人容易车门夹头发

充电

价格功率迷惑

首先不能绕过的话题是电池充电曲线。和电脑手机的锂离子电池类似,大多数车电量较满时充电功率较低,只有电量较低时才能大功率快充。Polestar 2似乎在50%以下才可以75kW充电,之后充电功率会显著降低。因此租到电车后搜一下battery charging curve可能会有所帮助。

根据我的观察,充电桩收费方式主要有如下几种:

  1. 按时间收费

没什么好说的,但第一次使用时误以为充电停止后就会停止收费。实际上是直到充电线插回去前都会持续收费。

有些是收费停车+免费充电,也可以算到这种。但收费停车+免费充电的话如果没有空的充电桩就会感觉是我亏了…

  1. 按时间收费,但是价格会变

比如前几小时较便宜,之后涨价;或者闲置不再充电后收取闲置费用;或者按时段价格变化。虽然可能可以提高充电桩利用率但也变相要求下载App注册,否则更加容易被坑

  1. 按电量收费

一般是一笔每次使用收费+充电电量的价格,有些电价还会按时间而变。感觉是更加公平的方式,因为不同车以及不同电量情况下充电功率也不同,按电量收费也更接近成本。但这种方式似乎只有快充充电桩才有,而有些快充又是按照时间收费的,导致比较充电成本成为了极其困难的一件事情。

便捷程度有待提高

有些充电桩需要下载App注册就不用说了,但就算愿意下App然后对着ChargePoint找也会有各种问题:

一般的加油站几百米外都能看到,但是充电桩就算按照地图上的定位找也有些难度,还是得靠PlugShare等网站的文字图片说明才能找。

另外有些不完全对外开放的充电桩永远是玄学。如果是员工或者公寓内部的我可能也就不费心去找了,但Dealership的充电桩就属于这种很气人的折中点:地图上有并且App里甚至显示免费充电,但可能有Dealer自己的车占着充电桩,也可能有员工看着不让你充;但是如果下班时候后去充就可能畅通无阻……

大多数酒店虽然能找到充电桩,虽然使用方便但是这种未必便宜(按时间收费);快充的缺乏以及价格迷惑又导致单纯充电变成一件费时费力的事情,反倒不如最后一天还车前找个最便宜的加油站。或许Tesla的超充会好一点吧

Hertz电量几乎永远不准

说实话我以为租车公司的系统已经高级到能自动同步电量了,但实际上Hertz的系统是完全没升级还在用油量的老一套。总之具体见下一节的Pro Tip 1,2,3,并且还车的时候最好能当面和员工说自己取车时的电量以防被加收EV recharge fee

电量限制

充电前记得提高电量限制。比如Hertz的车似乎默认限制80%,中间我手贱reset了一次车机之后限制变成了70%,导致两次都是以为一晚能充满结果到了这个百分比就停了,好在几次都是市区开问题也不大

Hertz @ ATL: 快逃

ATL机场Avis据说需要车库排大队,National又太贵,Hertz评价虽然一般但至少之前Ultimate Choice拿车比较快,就决定赌一把看看。剧透:赌输了。

晚上到的时候整个Hertz的Ultimate Choice区域就没什么车,有一辆Tesla Model 3但走到旁边才意识到玻璃上写了不能租;于是退求其次选择旁边的Polestar 2

Pro Tip 0: Hertz的车基本都是中低配,只有Toyota才能基本保证有辅助驾驶,其他车型都是看了才知道

放完行李上车才发现只有23%的电,当时估计了一下感觉足够开到酒店就走了,没想到这里给自己挖了一个坑。

Pro Tip 1: 和油车记录油量一样,租电车的时候一定要拍照记录电量

出门的时候明明有三四个口,但是由于是Hertz和下属公司共用,出门就花了几十分钟。然后出口处的员工也没有看电量而是直接写了个100%……

Pro Tip 2: 租电车的时候要明确告诉员工电量不满让对方如实标注,再不济也要在合同或者车钥匙上标记一下

还车的时候和油车一样把钥匙放车里就走了,结果到了机场就发现收据写的out 100% in 35%然后$被收了EV recharge fee。很明显这属于能坑一个是一个了,回家后找客服退款倒还不算太难,直接表示会退款给我。

Pro Tip 3: 还车的时候如果电量不足75%一定要告诉员工自己取车时的电量,顺便拍照,否则肯定会喜提$35 EV recharge fee,只能等事后找客服去解释退款

最后顺便吐槽一下亚特兰大水族馆,说是电车充电就能有停车优惠,实际上就算去要了validation sticker还是按照原价收取的,还是直接停可口可乐世界免费充电吧。

总结

下次租车我还会租电车么?可能还会以体验Tesla为目的再尝试一次,其他品牌就完全不值得了。

之前独自生活的时候,大多数时间都是坐在电脑前。而现在更想投入一些时间和精力在客厅上,因此稍微记录一下自己的Setup。最初我并不对智能电视感兴趣,毕竟从游戏机到HTPC有太多种观看内容的方式了,而智能电视臭名昭著的广告更是让我倾向于选择功能越少越好的电视。但市场决定了大多数价格合理的电视都附带个安卓系统,用了一段时间后总结了一点个人的使用心得:

硬件

  • Soundbar

VIZIO All-in-One 2.1 Soundbar 价格尚可,AIO体积小且setup省事,且2.1声道对于电视音响已经是显著提升了。本来想考虑3.1但是没看到折扣合适的产品,而5.1又没有合适的空间摆放。

  • 二合一键鼠

Microsoft All-in-One Media Keyboard 一开始我用的是单独的键盘和鼠标,但明显还是带触控板的二合一产品更方便。

  • 电源线

杂牌磁吸电源线,主要用于给Switch/PS4手柄充电。顺带一提Xbox精英手柄二代自带的充电盒很好用,价格不是问题的话一定要买

  • AirPlay 电视棒

Roku Streaming Stick 4k 我的电视并不原生支持Airplay,因此需要一个尊贵的Apple TV的下位替代。本来以为官方认证的Works with Apple Airplay效果会比各种第三方软件好,但实际投屏并不稳定,响应延迟和断连都是家常便饭。现在主要用于出门旅行时带着以及给不智能的电视用。

软件

  • FLauncher

Google Play即可下载,方便启动non-TV app。建议把遥控器可自定义功能的按键设置为FLauncher,方便快速启动如下两个app

  • Kiwi Browser

Google Play上就没几个电视能用的浏览器,因此直接sideload。先启用开发者模式和ADB调试再通过ADB安装,搞过安卓这一套的应该都熟悉。而且Kiwi的好处是支持大多数Chrome extension。装个AdBlock就再也不用看广告,再装个油猴即可解除B站区域限制。需要注意UI没对遥控器做过优化,大多数操作都需要键鼠。

  • Bilibli HD

基本同上。原本是为了安卓平板适配,部分操作会比浏览器顺手,但看区域限制的番剧还得上Kiwi Browser

背景

航空里程是航空公司常见的积分系统,其名称来源于初期积分比例正比于搭乘航班所飞行的里程。而如今它更像是航空公司发行的一种货币,主要来源也从飞行扩展到消费甚至直接购买,消耗途径也不再仅仅是里程票(Award Flight)而是可以兑换奖品甚至现金。

由于篇幅所限,本文将主要介绍常见的获取方式(信用卡开卡/积分转里程,或者直接购买里程)以及看似划算的兑换方式(里程票,少数里程可以直接换钱),从而有效劝退想要入坑的读者🤣

为什么我要写这篇博客

一句话就是因为我拿不到钱。靠里程票赚钱的人太多了,从票务代理到自媒体KOL都想分一杯羹。不可否认他们确实把这个市场做大了,但我也想从不同的立场分享一些他们不会告诉你的观点和事实。在此先介绍一些劝人入门航空里程的观点,以及我玩了几年里程票的评价:

观点:航空里程比返现更值,证据是各个公众号博主KOL对于航空里程的估值

评价:估值不能轻信,因为利益相关:博主为了赚钱那肯定会把里程价值吹上天,这样才能吸引更多的人来用我的推广链接开信用卡。更大的博主可能和航司有更紧密的合作,比如航司卖分会有专属推广链接最后提成,那从博主的立场同样是忽悠越多人来买越好。

观点:里程票能省钱。进阶版本是:开几张信用卡的开卡就能换越洋头等舱获得帝王般的体验。

评价:很难,具体原因将会在下节隐性成本中具体陈述。另外,不要轻易被消费主义洗脑:你真的需要商务舱头等舱么?

兑换里程票的隐性成本

首先,让我们先理解一下里程票从经济学的角度到底是怎么回事:

我个人对里程票的浅薄理解是价格歧视+客户粘性。价格歧视就是通过里程票的兑换限制来筛选出对价格不敏感的消费者,让他们放弃使用里程而选择现金购票从而获取更多利益。此外,由于里程和货币并不直接挂钩,里程票并不会影响航司定价策略。客户粘性则是通过里程票这一奖励制度鼓励消费者乘坐自己已经有一些里程的航空公司的航班,从而提升忠诚度。

总之,里程注定要比现金更难用,从航空公司的角度里程票只是用来填满航班的工具。所以每个航班只会放几张里程票,也就导致里程票的可用性较低(availability比较差),对应的是更多潜在时间成本。而近些年来航司发展的趋势是根据数据分析通过取消航班和超售等手段提升上座率,里程票的意义进一步降低,兑换也更加的困难。另一个趋势是里程票逐渐变为动态兑换,即所需里程和现金价格按某个比例直接换算,虽然availability较好但是基本完全失去了省钱的意义。

当然也有很多人看到了里程票的可用性较低带来的机会,推出了众多里程票搜索的工具,例如point.me, Roame, PointsYeah以及Seats.aero。根据我的使用经验,大多数工具的免费部分尚可一用,付费部分完全不值得,毕竟淘金热大多数赚钱的都是卖工具的。

此外,另一方面的成本是购买和持有里程:里程可以认为是航空公司发行的一种货币,但供给和兑换比例完全由航司控制,二级市场基本没有(大多数航司都禁止里程交易),并且完全没有利息。因此只建议手里留点里程小赌怡情尚可,不要期望都能以最高价值用出去。与之密切相关的话题是里程估值,我个人认为唯一有参考意义的是兑换的上下限:一般上限为航司卖分价格,下限为动态定价价格或者航司回购(例如Pay yourself back)价格。由于里程票较低的可用性以及现金票的价格波动范围较大,直接用机票价格除以兑换里程的方式几乎不具有参考意义。

行程规划

既然每个航班里程票的数量都极其有限,那么最好的应对方式就是拓宽自己的选择空间。比如接受转机的线路,降低对于出行时间的要求,以及充分利用里程票的规则。

从转机到停留再到弃程

转机是最主要的增加选择空间的方式之一,另一种是选择灵活的出行时间。以LAX-PEK举例,由于航权规定只有中美航司可以执飞直飞航班;而如果选择转机则几乎所有亚洲航空公司都提供转机线路,大致可以将里程票选项提高一个数量级。出行时间要求同理,如果把出行窗口期从一天改为一周,假设班期是每天都有,选项数量将会增加六倍。

停留和开口也是里程票兑换中常见概念,简单说前者就是超过24小时的转机,后者指到达机场和出发机场不同,主要目的都是在途中顺便玩几天以及增加选择空间。具体的使用方式因航司而异,可以参考其他博客的介绍。值得一提的是停留开口在现金票中也适用,航司网站或者OTA选择Multi city即可搜索。

弃程即在转机时下飞机并离开机场而不前往目的地。严格意义来说弃程违反机票的使用协议,但客观角度弃程和误机等情况难以区分,因此偶尔使用一次并不会造成严格的后果。我个人的理由是航司不仅拥有定价权甚至还试图个性化定价以最大化利益,那么我最大化个人的利益当然无可厚非。现金票中弃程主要是因为票价,而里程票中弃程主要是为了避免Married Segment从而更多的选择空间。以LAX-ICN-PEK举例,如果单独搜索LAX-ICN可能没有里程票,但LAX-ICN-PEK却搜的出来并可以出票,可能是航司为了提升ICN-PEK的上座率或者和其他也运营ICN-PEK段的航司竞争才设置了这种限制。注意弃程只能放弃最后一段或者多段,以及最好不要带托运行李。Skiplagged能搜到这类弃程票,但知道规则后也可以自己手动搜索目的地周围的城市。

航班选择

这一步和上一步一般同时进行,主要是为了筛除不符合自己要求的航班。

  • 中转次数和飞行时间

超过两次转机的航线不是所有人都能接受,单程16小时也过于极限。此外中转不仅包括转机,开车或者火车前往其他城市也是可以考虑的选择;如果中转城市有熟人也可以增加停留或者分开出票住几晚。

  • 转机签证

得益于中国大陆护照少的可怜的免签国家,转机的限制主要是是否需要签证。另外即使有些国家可以在满足一定条件下免签或者发过境签,也建议在时间金钱允许的情况下申请签证,以免遇到不熟悉情况的航空公司地勤拒绝发登机牌。转机复杂性的巅峰大概是疫情时期各个国家的要求,现在已经几乎消失了;只有涉及港澳台的行程比较复杂(大陆-台湾-美国不行,但是美国-台湾-大陆可以,每天一点地缘政治学)

  • 里程来源

首选已经有里程或者信用卡积分可以转点的航空公司的常旅客项目,其次是需要开新的信用卡刷开卡消费的,最次选项是花钱买里程(仅在需要少量积分时考虑)。不推荐和陌生人买卖里程,熟人的话看关系。

  • 兑换常旅客项目

由于不同航空公司联盟有不同的合作关系,因此同一个航司执飞的航班可以用多个常旅客项目出票。近几年的里程票查询工具一般都可以直接显示以上两点,按需查询即可。此外不同常旅客项目的里程票更改取消政策也不一样,可以先出一张方便取消的然后出发前蹲临期里程票说走就走。

  • 幽灵票

有的常旅客项目显示有票但是出不出来,因此需要打客服电话人工查询或者通过其他常旅客项目交叉验证。

上策:提前一年订票

确定了具体航班后,最有效的订里程票的方式是提前一年订票。国际航班大多数都有放票规律,比如提前365天在航司国家当地凌晨放一个航班的一张头等舱和两张商务舱。要注意的是不同兑换常旅客项目能够看到且出票的时间不同,可能会因为时差等因素而差几个小时,因此需要提前查询准备好抢票。

中策:持续关注

相信大多数人都不会提前一年确定自己的行程,而且后疫情时期很多航司也在逐渐增加班次。这种时候建议迭代出票:先买一张自己能接受范围内最合适的,之后持续蹲守等别人取消或者开新航班。我一般是把搜索页存手机书签没事时就刷刷,上文提到的各种工具往往也都有(付费)提醒功能,足够硬核的话写爬虫或许也是一个思路。

下策:说走就走

一般国际航班提前14-21天的价格会有较大的变动,可能会大幅上涨因为这时候订的人都是商旅人士不得不飞航司只能含泪赚钱(顺便把超售的便宜机票踢下去);也可能会下降以提升上座率充分利用空间。对于后者的情况,航司也可能会放出更多的里程票。如果行程非常灵活,等到最后一刻的里程票也是一个思路,但代价是酒店租车价格可能更高。

成功劝退

TL;DR: Cash is king. 花钱买机票最简单,也比较稳妥

当然就是现金票也有对应的玩法,主要需要注意这几点:

  1. 信用卡:返现多+延误取消险

虽然概率不大,但一旦遇到航班延误确实会显著影响心情。美国常见的信用卡延误险都是6/12小时起赔,并且需要注意是否要求航班是往返以及是否要求全部票款用该卡支付。相比之下中国大陆的信用卡的延误险2-3小时即可申请赔付,但往往要求更多(需要上个月消费满一定金额或者需要指定购票渠道等)。至于需要单独花钱买的保险一般都不建议买。

一般有延误险的信用卡在机票类别上的返现比例都不低,但是注意有些卡要求使用银行自家Travel portal(本质上是online travel agencies/aka OTA)预定才有返现。

  1. 选择订票渠道

相关的话题是是否要从OTA订票:
好处是一般OTA可能返现多(比如叠加shopping portal返现,参考Cashback Monitor),可以同时积累OTA的积分和航空公司的里程,并且用户体验可能更好(取决于具体航司和OTA)。

坏处是改退可能困难,另外OTA的附加服务价格可能比航司更贵(如选座,托运行李,更改取消费用等)。有些情况OTA的价格会比航司官网更高。

另外有些机票价格和出票国家地区相关,因此对于跨国航班可以用出发国家和到达国家的OTA/货币选项都搜一遍比较价格。

  1. 购买后持续关注价格以及航班变化

价格比较简单,设置一个机票价格-取消费用的价格提醒这样如果有更划算的取消重订即可。航班变化可能是好事,比如可以把红眼航班免费改到正常时间等。

尾声

一些个人感悟和入门用不到的高阶玩法

曾经我也天真的认为我只要按照规矩来就能用里程坐上A380的头等舱,就能用Mileage run获得高级会籍,就能成为Up in the Air中的精英常旅客。而现在,我很高兴有一份不用出差的工作。

航空飞行的意义永远都是从出发地到达目的地,更大的空间和更好的餐食只是锦上添花。我个人的建议是如果你的财务状况允许,现金买一两次商务舱头等舱体验一下这种所谓的舒适飞行体验是否被夸大了。如果财务状况不足以支持这种消费,那当然是积分换钱用于投资,不要浪费时间在航空里程上,除非你真的很享受搜索兑换里程票的过程。我曾经以为我是这种人,但随着航司把规则变得越来越复杂以及自己时间成本越来越高,我早晚也会放弃。

高阶玩法主要包括个性化的里程票搜索结果,比如美联航联名信用卡持卡人可以看到更多的里程票空位;有些航空公司只给自家金卡等高级会员放里程票。有些票务代理也会买卖里程甚至提供廉价机票,来源往往是盗刷信用卡或者低价收购的里程换的票,都不建议购买但是你知道这是怎么来的就好。

最后,如果你看到这里还没被劝退,那么你至少已经知道如何继续学习下去了, good luck & have fun.

Beancount本地部署指南 (又称:前MoneyWiz用户是如何逃离beancount.io的)

前言:我为什么要记账,以及我为何开始用Beancount

Beancount是一款用户较多褒贬不一的文本记账软件。在使用Beancount之前,我的主力记账是MoneyWiz 3这款App,再之前似乎是网易有钱(现已停止运营)何随手记。平心而论,使用网易有钱以及MoneyWiz的时候我并没有太注重于收支,仅仅是想让自己在使用非现金支付的时候更有花钱的感觉。

MoneyWiz虽然整体用户体验还不错,但个人使用时遇到的主要问题有如下几点:

  • 从2021年左右变为订阅制,MoneyWiz 3基本已经停止维护
  • 涉及货币转换的部分虽然支持手动指定汇率,但是非常难用
  • 不支持Multiple Posting,即每笔交易只能有一个支出类别和一个账户(注:刚刚发现其实支持,只是我从来没用过)
  • UI操作略繁琐,并且我没有Mac只能在iPad上记账,这大概也就是我从没用过Multiple Posting的原因吧…

相比之下Beancount这种纯文本记账的方式至少易用性方面有较大提升,Fava自带的编辑器也还不错。同时文档也较为完善,比如How Inventories Work等几篇文章对于我初期开始使用也有较大的帮助。

Beancount.io != Beancount,但也不是不能用

Beancount.io其实就是一个Hosted Beancount + fava,外加支持(用户体验极差的)app。现在似乎还把免费版砍了,新注册用户只有$10/月的选项。其实新用户用它上手未尝不可,如果觉得不适合可以立即止损;但自己长期使用还是自己搭服务比较好,并且数据文件是纯文本也方便使用Version control。如果你准备使用Beancount.io的话,推荐这个Tampermonkey脚本自动关掉烦人的弹窗:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// ==UserScript==
// @name Beancount Close popup
// @namespace https://beancount.io/ledger/
// @version 0.1
// @description Close upgrade popup
// @author You
// @match https://beancount.io/ledger/0/editor/
// @icon https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant none
// @run-at document-end
// ==/UserScript==

function clickClose (jNode) {
document.getElementsByClassName("muted close svelte-radrxh")[0].click();
}

waitForKeyElements ("body > svelte-component > div > div.content.svelte-radrxh > button", clickClose);

Beancount本地部署

这里可以直接找到Docker image,需要注意的是默认没有AuthN,任何人只要知道端口即可访问账本。因此建议按照教程配置反向代理。或许最理想的情况是将反向代理共同打包至一个Dockerfile内,不过考虑到上游dependency过多这大概也需要频繁更新吧。

AAD Authentication

熟悉的老朋友,直接走流程就好。被AAD毒打过一次之后这次没踩太多的坑,唯一需要注意的就是类型记得选Web。

添加其他用户

在 Azure Active Directory - Default Directory 中,Manage - Users 输入其他用户的邮箱,对方会收到一封来自 invites@microsoft.com 的邀请邮件。注意邀请邮件可能会在垃圾邮件里,接受之后对方即可使用AAD登录验证OAuth了。别忘了在oauth2-proxy的Authorized_email也加上对应的邮箱。

局域网访问 Redirect URI

很明显AAD的工程师们尽可能的想办法要求人们使用https了(RFC 8252也是这么要求的),但是局域网部署的话我真的不需要https。然而Redirect URI用http就只能localhost,最后还是硬上了https自签名证书也是证书对吧

oauth2-proxy想用https的话最重要的一点是要提供tls-key!这大概是我花时间最多的部分了,一直试图理解为什么--https-address的端口拒绝连接,最后恍然大悟都没有证书和密钥当然没有TLS…但oauth2-proxy也不能说一点责任没有,--tls-cert/key-file是空的至少应该打个log提示一下啊…

顺带一提,上次见到Redirect URI是在Chrome extension申请OAuth implicit grant flow的时候,由于http/https的限制没法使用chrome-extension://这种格式,最后终于发现https://<app-id>.chromiumapp.org/*这样的格式才是正确的Redirect URI

TODO

以后有时间可以看看如何使用Lets encrypt的证书,就可以上个真正的https了。

Subaru VIP 折扣

众所周知,买车最难的一步是讲价。“宁可相信世上有鬼,不要相信销售的破嘴”,就算知道这一点我也希望尽量避免和销售正面交锋。而Subaru VIP就是一种避免讲价的选择,与之类似的还有Mazda S-Plan以及一些其他的员工折扣项目。Subaru VIP的特点之一是即使公司和Subaru没有任何关系也可以通过各种非营利组织的会员获取,最常见的是ASPCA(美国防止虐待动物协会)。

资格

ASPCA的会员有两种方式可以获得Subaru VIP,一是直接捐款$500,二是过去六个月内均保持会员身份。我因为想要尽早下单订车就选择了前者。其他的非营利组织大多数也是类似的两种方式,部分组织只需几十美元就可以获得一整年会员,更适合预期在一年内买车的情况。

折扣价

ASPCA的折扣价是低于MSRP的发票价格(Invoice price),包括配件。以我购买的Subarz BRZ Premium (M6) 为例,发票价格大概是MSRP的95.3%。配件的发票价格基本是MSRP的65%左右,因此用了VIP program之后基本也不用担心强制加装的配件。

讨价还价

即使用了Subaru VIP避免了主要的讲价部分,实际上仍然有一部分的讨价还价。销售依然会推销保养或者延长保修等套餐,但这部分相对容易拒绝。如果是贷款买车,贷款的利率等因素也需要讨价还价。

时间线

Day 0: 邮件确认经销商接受Subaru VIP,同时得知有一辆BRZ预计大概两个月后到达

Day 1: 给ASPCA捐款,收到确认后立即申请VIP验证表格,当天收到并发给经销商

Day 45: 询问具体到达时间

Day 54: 得知预计到达时间延后一个月

Day 108: 再次询问具体到达时间,得知预计到达时间已到但是实际上何时能够到达未知

Day 120: BRZ到达

Day 121: 前往经销商付款,签合同,拿钥匙

杂谈

付款提车的时候才知道这家经销商要求查询信用报告,只得同意。万幸是只查询了Equifax,整体影响并不大。

Trust, but also verify. 任何不能快速验证的回答,都不值得当真。因此ChatGPT最适合的领域是简单的脚本编程和翻译润色,因为运行一次或者读一次即可验证正确与否。

需求

Jetson Nano默认从Micro SD卡启动,但是无论是顺序读写还是随机访问其性能都不如大多数的SSD。手头也有一块三星T5 1TB 闲置,于是决定重装系统的同时研究如何才能使用USB移动硬盘作为根目录。

踩过的坑

  1. 找对版本
    Jetson Linux支持Nano的最新版本是32.7.3,官网上更新的35.1基于Ubuntu 20.04 + 内核版本5.10但是并不支持Nano。事关bootloader所以还是需要严格按照支持版本来的,安装后可以自行升级内核。

  2. 不建议在Jetson Nano上进行操作
    老老实实的按照文档在Ubuntu上刷最不容易出问题,我一开始头铁结果不小心清了QSPI之后变砖了只能跳线进Recovery Mode。

  3. root file system
    参考后文,我首次刷完后可以正常启动但重启后无法正常引导。刷了几次系统之后实在懒得折腾了,影响范围也仅限启动,因此就不进一步研究了。

步骤

  1. 救砖
    电脑安装qemu-user-static

    1
    sudo apt-get install qemu-user-static

    下载驱动和文件系统:Driver Package & Sample Root Filesystem,解压缩:

    1
    2
    3
    4
    5
    $ tar xf ${L4T_RELEASE_PACKAGE}
    $ cd Linux_for_Tegra/rootfs/
    $ sudo tar xpf ../../${SAMPLE_FS_PACKAGE}
    $ cd ..
    $ sudo ./apply_binaries.sh

    准备好Micro USB线连上电脑,MicroSD卡插入,跳线接FRC pins确保进恢复模式,跳线接J48用DC电源,最后插上DC电源开机
    如果不确定的话可以用lsusb确认Jetson硬件的型号,确认好后即可开刷:

    1
    sudo ./flash.sh jetson-nano-qspi-sd mmcblk0p1

    刷完后QSPI-NOR也会一并恢复,再插上电就能看到Nvidia的图标了,并且可以从SD卡启动。

  2. USB启动
    详见Flashing to a USB Drive,前9步即可。

  3. micro SD卡迁移
    上述文档中:

    To set up a flash drive manually for using as root file system
    可能并不适用于Jetson Nano,按这步刷完后依然需要SD卡才能启动,且启动时遇到过各种问题。个人建议是跳过这步,依旧把/boot放置于micro SD卡中。此时可采用较小容量的micro SD卡。以下假设micro SD为/dev/<sdx>,经实验2GB的micro SD卡可行。
    确保micro SD卡的文件已经备份后,创建GPT分区:

    1
    $ sudo parted /dev/<sdx> mklabel gpt

    类似文档,创建APP分区。此时为方便对齐可采用百分比:

    1
    sudo parted -a optimal /dev/<sdx> mkpart APP 0% 100%

    格式化为ext4文件系统并挂载:

    1
    2
    sudo mkfs.ext4 /dev/<sdx>1
    sudo mount /dev/<sdx>1 /mnt

    最后用rsync复制原micro SD卡到新的小容量micro SD卡即可,记得替换挂载点:

    1
    sudo rsync -a /mnt/bigSDCard/boot/ /mnt/smallSDCard/boot/

    重启就完成了!效果如图:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $ lsblk
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    loop0 7:0 0 16M 1 loop
    loop1 7:1 0 43M 1 loop /snap/snapd/17885
    loop2 7:2 0 59.1M 1 loop /snap/core20/1782
    loop3 7:3 0 30M 1 loop /snap/node/6871
    sda 8:0 0 931.5G 0 disk
    └─sda1 8:1 0 931.5G 0 part /
    sdb 8:16 0 465.8G 0 disk
    └─sdb1 8:17 0 465.8G 0 part /mnt/hdd
    mtdblock0 31:0 0 4M 0 disk
    mmcblk0 179:0 0 1.9G 0 disk
    └─mmcblk0p1 179:1 0 1.9G 0 part
    zram0 252:0 0 495.5M 0 disk [SWAP]
    zram1 252:1 0 495.5M 0 disk [SWAP]
    zram2 252:2 0 495.5M 0 disk [SWAP]
    zram3 252:3 0 495.5M 0 disk [SWAP]

    mmcblk0即小容量micro SD卡。

参考链接

NVIDIA Jetson Linux 32.7.3 文档

终于在Azure Static Web Apps上面创建了自己的博客。其间遇到的最大问题是Azure Static Web Apps并不支持punycode域名,因此只能注册个新的,原来的域名作为URL masking……