懒惰是人类进步的源动力

  • 奔驰 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是否存在某名字的成员函数

    举个例子,有如下的类定义:

    class SomeWhatClass {
    public:
      void SomeWhatFunction(int x, double y);
    };

    希望能有一个静态的检测,能够实现

    static_assert(HasSomeWhatFunction<SomeWhatClass>::value, "expecting true");

    那么可以这样[1]:

    template <typename T>
     class HasSomeWhatFunction {
       typedef char one;
       struct two { char x[2]; };
       template <typename C>
       static one test(decltype(&C::SomeWhatFunction));
       template <typename C>
       static two test(…);
     public:
       enum { value = sizeof(test(0)) == sizeof(char) };
     };

    基本逻辑是如果被测试的typename T有成员函数,那么调用HasSomeWhatFunction的静态方法test<T>()时,模板替换是按照返回值类型为one(char)来生效的;反之如果不存在SomeWhatFunction的函数,那么返回类型one的模板替换失败,继续查找,匹配到万能重载(catch-all overload) 的static two test(…)里。

    这种做法的可读性在模板的骚操作里算是好的,但是它无法区分SomeWhatFunction的函数签名(参数类型、返回值类型)。

    普通版:检测一个类T是否存在某签名的成员函数

    接上个例子拓展一下:

    class SomeWhatClass {
    public:
      void SomeWhatFunction(int x, double y);
    };
    
    // 希望能检测函数签名
    static_assert(!HasSomeWhatFunction_Double<SomeWhatClass>::value, "not expecting");
    static_assert(HasSomeWhatFunction_Int_Double<SomeWhatClass>::value, "expecting");

    这个就需要更复杂一些的逻辑了:

     template <typename T>
     class HasSomeWhatFunction_Double {
       typedef char one;
       struct two { char x[2]; };
       
       template <typename C, void (C::*)(double)>
       struct Check;
       
       template <typename C>
       static one test(Check<C, &C::SomeWhatFunction> *);
       
       template <typename C>
       static two test(…);
     public:
       enum { value = sizeof(test(0)) == sizeof(char) };
     };
    
     template <typename T>
     class HasSomeWhatFunction_Int_Double {
       typedef char one;
       struct two { char x[2]; };
       
       template <typename C, void (C::*)(int, double)>
       struct Check;
       
       template <typename C>
       static one test(Check<C, &C::SomeWhatFunction> *);
       
       template <typename C>
       static two test(…);
     public:
       enum { value = sizeof(test(0)) == sizeof(char) };
     };

    可以看到这个实现比之前的多定义了一个内部类Check。在初始化enum value值时会调用test,然后会尝试模板替换,进而想要去特化struct Check。如果失败了(不存在对应签名的函数),那么会回滚到static two test里。

    这个实现其实能够覆盖许多场景了,但是还有一个奇怪的需求满足不了:如果要判断一个类的模板成员函数呢?

    地狱版:检测一个类T是否存在某签名的模板成员函数

    小改一下SomeWhatClass

    class SomeWhatClass {
    public:
      template <typename T>
      void SomeTempMemberFunc(int X, T& t);
    };

    如果需要检测void SomeTempMemberFunc<int, T&>是否存在,咋办? 搜了一圈,解释的最清楚的是参考[2]里面描述的,利用std::declval的解法。

    template <typename T>
    class HasTempMemberFunc {
      struct dummy {};
      constexpr static int int_holder {};
      
      template <typename C, typename P>
      static auto test(P& p) 
      -> decltype(std::declval<C>().SomeTempMemberFunc(int_holder, p), std::true_type());
    
      template <typename C, typename P>
      static std::false_type test(...);
    public:
      static const bool value = std::is_same<std::true_type, 
                                             decltype(test<T, dummy>(nullptr))>::value;
    };

    几个知识点:

    • 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 template methods https://blog.quasardb.net/2015/04/12/sfinae-hell-detecting-template-methods

    [3] SFINAE示例 https://zh.cppreference.com/w/cpp/language/sfinae#.E7.A4.BA.E4.BE.8B

  • 更换到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)

    中国电信澳门

    落地运营商:中国电信

    套餐:[储值卡]澳门及内地不过期数据包

    Screen_Recording_20210523-201216_Speedtest (1).gif

    3HK

    落地运营商:中国联通

    套餐:[储值卡]和记国际万能储值卡

    Screen_Recording_20210523-201546_Speedtest (1).gif

    中国联通香港 CuniqHK

    落地运营商:中国联通

    套餐:[合约卡]ONE大灣區 數據共享計劃

    (通过对比就能发现上台卡和储值卡的速度差距)

    Screen_Recording_20210523-202153_Speedtest (1).gif

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

    no-airtag.png

    跟风买了4个AirTag,本来是安排放在两辆车里面,然后一个放书包里,另外个送给老婆大人体验的。

    用来在车库找车子? 不现实

    实际使用发现UWB技术的信号似乎很容易被金属屏蔽。一开始我是把AirTag放置在车子中间的储物格里的,好家伙出了车子直接信号微弱(不显示距离)。后来我淘宝了一个钥匙扣,挂在了后视镜下面。实测离开车子3米之内是可以定位到并且有方向的,但出了3米之外就要看运气了,能显示“就在附近”但是不一定能显示具体方向。超过5米直线距离的地方,那就基本上凉了。
    综上所述,这个信号的持续范围,不如我用车钥匙按一下然后目视寻找车灯闪烁的地方来的靠谱。

    万一AirTag自己丢了呢?

    一个小插曲是之前把车子拿去洗车,当时还没买保护套,结果这玩意儿直接被洗车师傅一波操作扔在了地板上,差点弄丢。在搜寻这个AirTag的时候我也尝试使用“查找”App,最初它提示在洗车店附近,这倒是给了我灵感。但是真到店之后,我发现我肉眼的搜寻速度比”查找”App反倒是更快一些…

    那么能用在哪?

    目前看来,挂在自己的行李箱(托运行李)或者书包上防丢是比较有实际效用的场景,甚至可以追到自己的托运行李当前是在什么位置了——当然这就要指望行李周围的iPhone用户了🥴。

    FindMy-AirTag.jpg

    被其他人找到了?

    另外,这个AirTag本身是一个NFC标签。被我的Galaxy S20FE扫到的话,会显示一个链接,点进去是这样:
    AirTag-Found-By-Android.jpg

  • [洋垃圾专业户] 在2021年启动一台Symbian S60手机 Sony Ericsson U1

    一些几年前望眼欲穿的手机,最终还是被我在淘宝找到并买了下来。开机的那一刻似乎能翻倒出很多青春,但是青春毕竟东流去。

    微信图片_20210306170524.jpg

    Sony Ericsson这个厂牌目前都已然是过去式了。3.5英寸和TFT这两个参数已经能看出它的年代,发布于2009年的U1 (又叫Satio或Idou)是电阻屏的触屏手机,它运行着索爱定制的Symbian 9.4, Series 60 rel. 5系统。网络方面,这个机型支持WCDMA与WiFi,令人震惊的是它竟然还能加载Google页面(当然了是用的非大陆联通卡)。

    微信图片_20210306170357.jpg

    600 MHz Cortex-A8,256MB RAM看起来都不怎么样,但是在当时已经算是顶配了。索尼作为AB公司股东,自然也要把自家的影像技术加上去。这个手机有个很漂亮的镜头滑盖,打开是一枚1200万像素的的摄像头(是全球第一部内置1210万像素镜头的手机),并且还有氙气闪光灯!

    微信图片_20210306170518.jpg

    20000101002.JPG(图:用Sony Ericsson U1拍摄的iPhone 12 Pro)

    系统体验上感觉也没什么可以说的,S60v5的系统其实有些卡顿的,另外就是这个电阻屏实在是反人类——特别是要用屏幕上的软键盘打字。系统自带了些许App,我竟看到了Youtube的身影,然而打开就一直在转圈。另外尝试了下Google Map,地图其实能正常显示,只不过手机只能依靠GPS定位,在室内就没法使用了。

    微信图片_20210306170531.jpg

    逝者如斯夫,不舍昼夜。

  • 3HK 國際萬能卡(內地及港澳台漫遊卡) 评测

    能在大陆地区有漫游流量的储值卡,似乎就还有这张没试过。

    概览

    Key Value
    面值 $198
    預設組合 (由2020年9月24日起生效) 15GB內地及港澳台數據包括: 10GB流動數據 + 5GB 社交媒體數據; + 2000分鐘本地通話
    有效期(啓用後) 395日
    內地副號服務 $19/30日

    *其他信息见这里

    这张卡是可以充值续包的,个人认为价格还算合理的是$198的內地及港澳台 – 365日/11GB+5GB社交媒體數據包,不过这个价格跟重新买一张卡(不算运费)也差不多了。

    激活

    到货后插卡即可激活,不需要额外的设置,只要打开数据漫游就能上网了。3HK在大陆的漫游运营商是中国移动,信号覆盖度是可以保证的。
    激活后会收到短信告知手机号码,以及套餐的一些信息。漫游情况下是没有VoLTE的,iOS设置里连相关选项都没有。

    测速

    这张卡目前在大陆的iOS机型上,最多能上到4G网络。在Galaxy S20 FE上插卡,发现也只能有4G网络,上不去5G。实际体验上其实延迟还比较低,特别是微信什么的,相比CuniqHK漫游状态下的响应要快不少。但是论带宽(不知道是不是移动的关系)就那么紧巴巴一点,莫非移动本身4G网速就被限制了?

    3HK_ROAMING_SPEEDTEST.jpg

    有意思的是iOS里是能选上5G选项的,但是在明显有5G网络的地方这张卡仍然连上的是4G,所以目测是没有5G漫游权限了。
    3HK_IOS_ROAMING_5G.jpg

  • [书单] 2020阅读书单

    发现一些博主都有记录书单的好习惯,而且越牛的大佬书单越是长。所以我就从此开始记录一下读过的书吧。

    《Python数据分析基础教程, Numpy学习指南(第二版)》

    英文书名Numpy Beginner’s Guide, Second Edition

    薄薄一本书,作为Numpy入门可以,但是我更推荐Numpy和Pandas官方的文档,因为本质上都是一些接口介绍和例子,还不如直接搜最新的看。

    推荐指数:2/5

    《量化股票组合管理——积极性投资组合构建和管理的方法》

    英文名是Quantitative Equity Portfolio Management, An Active Approach to Portfolio Construction and Management.

    这本书对于我这种金融初学者是很友好的,由浅入深介绍一些量化的基本概念,全书的公式量不是很多,基本上能够看得懂。全书主要围绕因子以及股票组合展开,从因子模型的构建到投资组合的构建,再到交易成本和绩效分析,整套流程都过了一遍。

    一些缺点:一些深入的内容是一笔带过的。另外寻觅机器学习的读者是无法从本书中获益的。这个跟这本书的性质有关。总的来说是一本不错的入门书,类比一下就是《C++ Primer》以上,《Effective C++》未满。

    推荐指数:4/5

    《积极性投资组合管理——控制风险获取超额收益的数量方法》

    A Quantitative Approach for Providing Superior Returns and Controlling Risk.

    这是本不错的书。上面一本是初级,这本我认为是中级。书中公式量和难度明显高了一节,说实话书中的一些公式我没有完全看懂,所以它是值得你遇到问题时再细看一两遍的那种书。CAPM、风险、收益分解、估价、信息处理、执行……想找的量化关键词,里面都有,而且例子和公式并存。本书中仍以因子为突破点,讨论α和β收益,以及一丢丢机器学习的苗头。另外我觉得这本书更像一本教材,因为后面还有练习题。

    缺点:需要一些线性代数基础知识,公式多了一些。另外此书讨论的股票操作周期是偏低频的(日频、周频为主),希望做高频一点分析的话,可能理论体系不能完全适用。

    推荐指数:4/5

    Mastering the C++17 STL

    这本书是Kindle上买的,主要介绍C++17的新特性,讲的还挺全面,并且有理有据有例子。相比C++11/14之流,C++17在语言特性上又丰富了不少。至于这种更新是好是坏,我觉得至少它比C++20让我看得懂一些吧。

    推荐指数: 3/5

    《一九八四》

    这本书是奥威尔的经典之作,其实是基于现实的科幻。文中的一些点,很遗憾,我在当今社会已经看到了苗头,并且我真希望它不不要继续进展下去。鉴于本站是ICP备案的良好网站,我就不细说了。

    推荐指数:5/5
    同样推荐的还有《美丽新世界》(推荐指数3/5),写的没这本扣人心魂。

    《Python 源码深度剖析》

    这是一个在线付费书籍(作者不是我)https://www.imooc.com/read/76

    有一本Python2时代的《Python 源码剖析》是非常经典的,但是原作者断更很久了。这本看下来,作为C++/Python coder,我基本上能对Python里面发生的一些细节有更深的了解,并且这个书的插图配的很好,比阅读干巴巴的文字更有效率。需要一点点的C++以及操作系统、数据结构的背景知识,就能比较流畅地阅读了。

    推荐指数:4/5

    《Python深度学习》

    1. 基于Keras的Python深度学习入门手册。适合我这种机器学习菜,书中内容以实践为主,基础知识介绍地比较全面,但是一些细节是不会去深入的。有点像Tutorial吧。

    推荐指数:3/5

    Hands-On Machine Learning for Algorithmic Trading: Design and Implement investment strategies based on smart algorithms that learn from data using Python

    好家伙,这个书名够长的!这本书写的有点“强行拼凑”的感觉,前面开篇介绍一些金融的基础知识,基本上属于非常浅的知识,后面开始介绍各种ML模型,Topic Modelling, Word Embedding, CNN, RNN, RL真的是应有尽有,但是介绍完一通后,和“因子”“量价”沾边的比例不是很大,有些是强行扯上关系,当然你叫它“基本面量化”我也不大好反对。

    推荐指数:1/5

  • Download Manager SD Card Navigation 奔驰原厂导航SD卡地图数据更新软件

    benz_download_manager.JPG

    如题,之前发现下载速度奇慢,而且容易下载到错误的版本,还是分享一份给有需要的人吧。

    进入界面后,用户名和密码都是DLM.

    202209更新:

    链接:https://pan.baidu.com/s/15e9hBRiaT0zw7_Bm14LSug?pwd=4ewc
    提取码:4ewc

  • 找到一个不错的Typecho hCaptcha插件

    最近苦于机器人的垃圾评论,找了半天发现hCaptcha这个东西很好用。本以为小众的typecho需要自己手写,后来搜了一下发现已经有大佬帮忙写好了插件,地址是https://github.com/plok5202008/Typecho-HCaptcha

    使用起来也挺方便,

    1. 控制台-插件里启用HCaptcha,然后点击插件的设置,填写自己的site key和secret。没有这两个东西的话去https://www.hcaptcha.com/创建一个新用户即可,免费。
    2. 控制台-外观页面点入编辑当前外观,然后右侧选择comments.php文件。找到提交评论的按钮,一般是<button type="submit" class="submit">,在上面加一行
    <?php $this->hCaptcha(); ?>

    大功告成。