Effective STL 读后感

这本书的全名叫《Effective STL — 50条有效使用STL的经验》,书其实已经有点历史了,Meyers在2001年时给它写的前言,如今已经2022了。 正如上面所说,因为这本书已经有些年头了,如果你已经是C++11、14、17、20的使用者,可以把第6章函数子、函数子类、函数及其他的内容快速带过看,因为std::functional以及lambda函数已经让C++函数类支持有了显著提升。 简略写一下对我而言有用的一些经验: 第12条:切勿对STL容器的线程安全性有不切实际的依赖 多线程读是安全的 多线程对不同容器做写入是安全的 第14条:使用reserve来避免不必要的重新分配 尽管我认为这应该是C++ Engineer的常识了,不过还是有好多小朋友不知道这个点。 第23条:考虑用排序的vector代替关联容器 可以详细看一下。我觉得根本问题是map类的容器对cache不是很友好。连续内存访问总是很香的。 第25条:熟悉非标准的散列容器 写书的时候还没有stl::unordered_map。不过即便放2022年,我也觉得可以看看STL之外的散列容器实现,比如robin-hood-hashing。曾经用过比较坑的一个容器是boost::flat_map,千万别认为它是O(1)的实现。 第31条:了解各种与排序有关的选择 <algorithm>头文件里有很多宝藏,在选择自己实现之前,最好看看STL有没有帮你写好了轮子。 第32条:如果确实需要删除元素,则需要在remove这一类算法之后调用erase 曾经有个说法是std::move does not actually move anything, 对于std::remove也有点类似。 第44条:容器的成员函数优先于同名的算法 如题。 第47条:避免产生“直写型”(write-only)的代码 工程上非常中肯的一条经验。如果没有特殊原因(如及其苛刻的性能要求),尽量不要写出非常难懂的代码,不然几个月乃至几年之后你来调试自己写的代码时也会骂娘。 代码被阅读的次数远远大于它被编写的次数

esim.me “反向” eSim卡评测

esim.me 提供了一个实体SIM卡,能将eSIM的注册信息通过Android客户端写入到卡里。这种”反向”eSIM其实给各类漫游卡的注册购买提供了一个方案,虽然它本身的价格着实不便宜。 快递 我是直接从官网上购买,选择$9.95的便宜直邮,对应的应该是国际函件。 然后就是漫长的等待。这个快递在出德国国际交换局的时候就能在EMS官网查询到了。受疫情影响,从德国🇩🇪到国内,历经30天…好在海关还是比较给力的,第二天就放行了。 拆封 外包装就是很简单的一个泡沫信封,拆开来是小包装,里面只有一张说明书和一个3合1 卡板。 App & 卡激活 目前下载eSIM卡信息只支持Android App,看起来就像是个写号软件。卡号写进去之后是可以在iPhone上使用的,但如果需要变更注册新的eSIM卡还是得插回到Android机器上。 鄙人注册了个3HK的卡可用,扫描发来邮件里的二维码就能注册了。但是eSim.me的App还是有不少小bug的,使用起来偶尔会直接闪退,特别是写入了卡信息之后重启App就直接不显示了,但愿官方能恢复吧。

Surface Laptop3 屏幕闪烁 微软的品控堪忧

虽然已经是保修期外,但是这个屏幕在过保前一阵就很“自觉”地有偶发亮线。当时没去管他,并且过一两个小时自动好了,后面没有再复现过。 昨晚上正好用电脑,开机发现屏幕背光异常闪动,就像是背光坏掉一样,闪烁的频率高(但肉眼可见)。 感慨一下,这十年买过ThinkPad,XPS,Surface。联想一直被喷是美帝良心企业,但是手上的ThinkPad从来都是因为太旧了出掉的,没有一台是因为电池损耗外的硬件问题被淘汰的。XPS13还在手边,除了电池鼓包换过外,电源口的螺丝松了换过,也用了4年了。唯独这台Surface,特别符合“计划性报废”原则,买来刚两年,凉凉。 最近新入两台机,TP X1 Carbon/Nano,目前看来品控还行。

2021阅读书单

2021年看起来是放羊的一年,不知不觉阅读的时间减少了。 对冲之王:华尔街量化投资传奇 这本书当成小说来看挺不错的,讲的是华尔街(早期)的一些名角的发家史。这些人相互之间也有联系,书中很好地把他们串了起来。那么到底金融是不是赌博呢?看完我又感觉到了一丝矛盾。 另外,回想起这本书,也推荐一部华尔街主题的电影——《大空头》。 推荐指数:4/5 雪人 血腥、暴力、一丁点色情。这部悬疑小说看的时候会让人停不下来,疑云在最后一刻才得以破开。书中对于作案手法及过程描述的非常详细,看的有点瘆人… 此外这本书是我今年在Kindle (硬件)上看的唯一一本书,依然觉得Kindle目前还是只适合看小说,带有图片或者代码的书本还是iPad靠谱。 推荐指数:5/5 区块链:通往资产数字化之路 这本书居然是OREILLY出版。一本非常科普性质的书,如果对区块链的概念一无所知的话还是推荐阅读的,说它是技术书也勉强吧,里面还是有一丁点代码的。老实说看完这本书,我的资产数字化之路还是一样坎坷。 推荐指数:3/5 市场微观结构——理论与中国经验 好像是某“内部”人士写的一本书,讲了一些A股市场相比于国际市场在微观结构上特殊的地方,有一些实证研究,分上下两篇:理论基础、中国经验。下篇看起来能了解一些大陆市场的“发家史”,这本书虽然有点老了,但里面的市场特征有些在现如今还是能关注到的。 推荐指数:4/5 此外,以下是正在阅读的书… Trades, Quotes and Prices: Financial Markets Under the Microscope 这本书从非常量化的角度在解析市场微观结构,由浅及深。每一个章节的逻辑(看到目前)基本上是做一些假设,然后推导公式,最后会结合演算结果于实证。读起来需要一些高等数学或线性代数的知识,于我而言阅读起来还是有些吃力的,需要1小时或以上的连续阅读时间,不然下次读的时候”恢复现场”就得好久。 尽管如此,全书的结构条理是很清晰的,图表排版的也很翔实。 进度20%,推荐指数:4/5(啃起来有点吃力) 深入Linux内核架构 买过实体书里最厚的一本。这本书我是挑感兴趣的章节看的,对于Linux的方方面面写的算是详尽了,各个组件几乎都有涉及。对于复杂的概念逻辑或是结构,都能给出简明清晰的图来解释。现在想来这本书我应该早两年就开始看的,里面一些设计理念,在其他软件设计的场景里是通用的。 进度:35%,推荐指数:5/5

无聊工程: 使用境外流量卡创建一个家用局域网代理服务

题外话 如果不是某CuniqHK的卡签了合约,可能不会有这篇文章。因为在使用过程中我发现把卡插在手机里直接用会有很多不方便的地方,比如健康码、丰巢、共享单车之类的本地服务在使用外卡加载的时候会有各种奇奇怪怪的卡顿或者报错。 另外需要说明这个纯粹时用来花境外流量的无聊工程,因为现在有很多成熟且高性价比的替代方案可以选择。 软硬件需求清单 一张境外流量卡 一个随身WiFi设备:这个设备插在主机上,需要能被电脑识别成网卡。 一台运行Ubuntu的主机设备(虚拟机其实也可以,用Host模式接入本地网络),我用的廉价NUC 家中要有现成的无线路由器 能搞出啥呢? 在使用iOS的手机上可以使用”无线局域网”设置界面内的“HTTP”代理功能,连上Ubuntu主机开启的代理服务,走USB 4G网卡的线路上(外)网。 当然了,如果配合Clash之类的允许配置路由规则的App,费些功夫就能给不同的流量设置规则,使得流量卡线路和国内线路能够并用。本文只是想做PoC,所以没管这些。 配置步骤 首先,Ubuntu主机通过网线与主路由器相连。一般情形下,路由器设置一个“静态分配”的路由给这个Ubuntu主机,避免分配的局域网IP地址因为DHCP发生变动。 随后把USB 4G网卡也插上Ubuntu主机,正常情况下主机会识别到这个USB网卡,在终端输入ifconfig能看到它: 由于接入了两张网卡,ubuntu的默认路由里这两张网卡会有不同的优先级。通常来说后连入的设备优先级更低,这样在路由表走默认路由“兜底”的时候会走有线线路出去访问互联网。 这并不是我们想要的,所以需要通过命令来把路由表改一下,让enx0c5b8f279a64这个设备优先。 可以再输入一下route命令,看看是否Metric上的值发生了变化。 接着是配置一个代理服务器,又一个开源i项目叫gost(https://v2.gost.run/)的,很方便。如果要保持持续运行的话,最简单的就是用nohup或者tmux启动它。 代理服务器启动后,就可以在手机上设置了,最简单的http代理就能work。需要注意一点,如果使用的是socks类代理,要注意DNS解析不能使用客户端机器上的,不然会有dns污染的现象。HTTP代理似乎不受影响(参考此处)。 免责声明 本文仅做技术讨论。至于如何获取境外流量卡合法上网,那就各显神通吧。

奔驰 E300L (W213) 1:1高仿盲区辅助雷达拆解

之前淘宝上买的,事实证明这玩意儿是我交的学费,历经半年之后还是换成了原厂的,因为差距太大了。 首先简单介绍一下,这种1:1仿的雷达,安装位置是和原厂无异的,也是在后保险杠上,但是它的信号线是非原厂的,并且走线不需要过门控。很诡异的是在车机里也需要编程,编程后系统会有盲区辅助的开关,开关能使用,但和原厂的还是不大一样。信号线一路延伸到后视镜,最终接入到那个三角形的指示灯,指示灯线座的针脚线座是一样的,但是针脚定义和原厂的不一致。 值得注意的一点是整个雷达是有防水胶圈的,防水性能应该过关。 拆开后整个雷达分为两部分,正面是主控部分,背部全是毫米波天线。主控部分采用恩智浦(NXP)方案,主控芯片型号为FS32R274,它左侧的小长方形芯片也是NXP的,用于CAN收发的TJA1145T。雷达的接收器芯片,据查资料是TEF8105。 整套方案可以参考https://www.nxp.com/docs/zh/training-reference-material/TP-1-NXP-77GHZ-MILLIMETER-WAVE.pdf。 看了半天没找到接收器芯片,于是暴力把正面的电路板给解下来了(痛失一颗电容😓),反面的主要芯片是NXP的FS84,说是故障安全系统基础芯片,仍然不见雷达接收器芯片的踪影。

C++ SFINAE 检测是否存在某个名称的成员函数

SFINAE(Substitution failure is not an error) 被用在很多模板的花式操作里,笔者使用的时候多半是为了将运行时的多态替换成编译器的静态多态。 简单版:检测一个类T是否存在某名字的成员函数 举个例子,有如下的类定义: 希望能有一个静态的检测,能够实现 那么可以这样[1]: 基本逻辑是如果被测试的typename T有成员函数,那么调用HasSomeWhatFunction的静态方法test<T>()时,模板替换是按照返回值类型为one(char)来生效的;反之如果不存在SomeWhatFunction的函数,那么返回类型one的模板替换失败,继续查找,匹配到万能重载(catch-all overload) 的static two test(…)里。 这种做法的可读性在模板的骚操作里算是好的,但是它无法区分SomeWhatFunction的函数签名(参数类型、返回值类型)。 普通版:检测一个类T是否存在某签名的成员函数 接上个例子拓展一下: 这个就需要更复杂一些的逻辑了: 可以看到这个实现比之前的多定义了一个内部类Check。在初始化enum value值时会调用test,然后会尝试模板替换,进而想要去特化struct Check。如果失败了(不存在对应签名的函数),那么会回滚到static two test里。 这个实现其实能够覆盖许多场景了,但是还有一个奇怪的需求满足不了:如果要判断一个类的模板成员函数呢? 地狱版:检测一个类T是否存在某签名的模板成员函数 小改一下SomeWhatClass 如果需要检测void SomeTempMemberFunc<int, T&>是否存在,咋办? 搜了一圈,解释的最清楚的是参考[2]里面描述的,利用std::declval的解法。 几个知识点: decltype里利用了含有逗号运算符[3]的表达式; declval可以避开构造函数而使用类成员; 参考 [1] writing and using a C++ template to check for a function’s existence http://www.cplusplus.com/forum/beginner/70134/ [2] SFINAE Hell: detecting… Continue reading C++ SFINAE 检测是否存在某个名称的成员函数

更换到WordPress博客平台

这可能是我逐渐衰老的标志,因为Typecho是一个好的东西,但是和WordPress平台的定位明显是有区别的。 Typecho的一切都特别的简洁,对于喜欢稍加钻研的Coder其实是很不错的选择。Typecho提供了一个很稳定的脚手架,但是脚手架上的东西得自己找或者自己搭。约一年的使用,每当我需要什么新功能的时候,我都需要去Google搜一下,然后搜到的东西有60%概率是不能立即使用的,这让我没办法在时间有限的情况下去关注我想要提供的内容。但是存在即合理,这个特性(bug / feature?)让Typecho的用户享受到了很多DIY的乐趣,我是其中之一。 WordPress一向因为繁杂、体量大而被诟病,但不可否认的是当我想要什么功能的时候,我总能以比较快的速度找到相应的插件。这可能就是生态的力量,尽管很繁杂并且各种条条框框,但是稳定的代码支持和社区支持能够给“想集中精力在内容创作”上的人一个安全感。 特此写一篇文章,是因为我突然意识到WordPress和Typecho是两种范式(Paradigm),可以迁移到很多地方。 另外,推荐一下过程中使用的很好的Typecho插件ByeTyp。SQLite用户记得不要使用它的“最新“release (tag=1.4)版本,而是直接用最新的代码,不然会有SQL Query Error。

漫游卡网速实测视频 (中国电信澳门、3HK,CuniqHK)

中国电信澳门 落地运营商:中国电信 套餐:[储值卡]澳门及内地不过期数据包 3HK 落地运营商:中国联通 套餐:[储值卡]和记国际万能储值卡 中国联通香港 CuniqHK 落地运营商:中国联通 套餐:[合约卡]ONE大灣區 數據共享計劃 (通过对比就能发现上台卡和储值卡的速度差距)

AirTag简单评测——买来玩玩可以,认真你就输了

跟风买了4个AirTag,本来是安排放在两辆车里面,然后一个放书包里,另外个送给老婆大人体验的。 用来在车库找车子? 不现实 实际使用发现UWB技术的信号似乎很容易被金属屏蔽。一开始我是把AirTag放置在车子中间的储物格里的,好家伙出了车子直接信号微弱(不显示距离)。后来我淘宝了一个钥匙扣,挂在了后视镜下面。实测离开车子3米之内是可以定位到并且有方向的,但出了3米之外就要看运气了,能显示“就在附近”但是不一定能显示具体方向。超过5米直线距离的地方,那就基本上凉了。综上所述,这个信号的持续范围,不如我用车钥匙按一下然后目视寻找车灯闪烁的地方来的靠谱。 万一AirTag自己丢了呢? 一个小插曲是之前把车子拿去洗车,当时还没买保护套,结果这玩意儿直接被洗车师傅一波操作扔在了地板上,差点弄丢。在搜寻这个AirTag的时候我也尝试使用“查找”App,最初它提示在洗车店附近,这倒是给了我灵感。但是真到店之后,我发现我肉眼的搜寻速度比”查找”App反倒是更快一些… 那么能用在哪? 目前看来,挂在自己的行李箱(托运行李)或者书包上防丢是比较有实际效用的场景,甚至可以追到自己的托运行李当前是在什么位置了——当然这就要指望行李周围的iPhone用户了🥴。 被其他人找到了? 另外,这个AirTag本身是一个NFC标签。被我的Galaxy S20FE扫到的话,会显示一个链接,点进去是这样: