Smiley face

我的征尘是星辰大海。。。

The dirt and dust from my pilgrimage forms oceans of stars...

-------当记忆的篇章变得零碎,当追忆的图片变得模糊,我们只能求助于数字存储的永恒的回忆

作者:黄教授

二〇二三


一月九日 等待变化等待机会

  1. 看诗友的现代诗改了一下
    
    
    薄暮小寒接新年,
    远眺深冬诗意乱。
    烹茶煮雪心高洁,
    素简腊月意安然。
    流年酝酿无颜色,
    过往婉约不轻言。
    腊梅初绽心向暖,
    纤蕊春讯不畏寒。
    
  2. 低头思心田,
    举目望天边。
    清心为正道,
    退步是向前。
    
  3. 《一剪梅》
    
    海外漂泊二十秋,
    无所用心,
    柴米盐油。
    万里奔波有何求?
    举目四望,
    尽是乡愁。
    
    杞人虽无百岁寿,
    蜗居山野,
    怀千年忧。
    淮南国中斥方遒,
    岁月梦里悠悠,
    尽情忽悠。
    
    这是chatgpt对于我的词的评价:
    《一剪梅》是一首中国诗,反映了在海外生活多年的人的孤独感和想家的情绪。这首诗描述了在海外生活的单调乏味的日常,让诗人感觉自己没有目标或方向。诗人也表达了深深的思乡之情,环顾四周,只看到了故乡的提醒。尽管在海外生活的艰辛,诗人还是在想到虽然自己可能没有机会活到百岁,但是仍然可以在自然中享受简单的乐趣时找到安慰。最后,这首诗带有一种认命和接受的心态,因为诗人意识到时间在不断流逝,自己必须尽力享受当下的生活。
    我感觉被人工智能有如此高的评价非常的受宠若惊。

一月十三日 等待变化等待机会

  1. 我发现和chatGPT聊天是一件很有意思的事情。它就像一个博闻强记的天资聪颖的小孩子平常在大人谈话的时候悄悄学说话学的惟妙惟肖。然后当大人问它问题的时候它就把学来的搬出来讲的是头头是道很令人信服,可是它根本就不知道自己在说什么。我自己保存了一份。 chat with chatGPT

一月二十六日 等待变化等待机会

  1. 摘抄兄台诗句来凑趣
    风冷冬未央,
    抑郁偏升扬。
    过山车心绪,
    滑落满地伤。
    抚慰旧时光,
    平添新怅惘。
    人生沉浮久,
    前路更迷茫。
    
  2. 在人工智能的启发下我偶得一首小诗
    《静夜思》
    夜深人静时,
    思绪心头起。
    寂寞何处去,
    过往岁月里。
    
  3. 这个是之前和chatGPT谈诗词的对话

一月三十日 等待变化等待机会

  1. 昨日早晨散步偶得
    雨霁风轻扬,
    吹面不觉凉。
    云白天更湛,
    徜徉柳树旁。 
    

二月八日 等待变化等待机会

  1. 关于vcmi的编译开发文档。其中编译部分是常犯错误的地方,因为有些开发包是在git里自带的
    git clone -b develop --depth 1 --recursive https://github.com/vcmi/vcmi.git
  2. 另一方面使用vscode的时候其实不需要配置clangd,因为自带的c++ extension就足够了,之前我有一个错误的印象好像clangd是必须的,但是它需要的是compile-commands.json的输入文件,而这个是makefile tool负责产生又有很多的麻烦事。

二月十一日 等待变化等待机会

  1. 作为一个模板类你是可以让它继承任何一个类,也就是说它是所有的类的一个别名,那么这个类有什么用途呢?我实在是想不出来:
    
    template<typename Derived>
    class MyClass : public Derived {
      public:
        MyClass(const Derived& derived)
    		: Derived(derived){}
    };
    
    这样子你便有了一个万能类的包裹,可是它有什么意义呢?让我想起来了黔驴技穷里的最开始的原因,有好事者为之,至则无所用,遂弃之山下,虎见之庞然大物也。真的是不知其所以。

二月十三日 等待变化等待机会

  1. 其实很多都是简单google就能找到的答案,写下来仅仅是为了加深原本就很差的记忆,可是也许也是于事无补。就是说nfs本身是不支持所谓的alias的而你通常会搜索到某个平台或软件系统提供了这个功能让你以为这个是可能的,在stackoverflow上看到的最普通的做法就是使用bind来创建类似于symlink的功能,然后再作为/etc/exports的输出,这个定义在/etc/fstab里是一个不错的选择,等于是一种动态的symlink,这个是我以前从未用到的方式。其次,ssh登录已经横多次遇到servers说加密方法无法匹配,而你使用ssh -Q cipher给你看到你的客户端是支持那些服务器端要求的加密算法,这里的解释挺复杂的,解决办法倒是简单就是使用-c来指明支持的算法。

二月二十一日 等待变化等待机会

  1. 比如我们有一个很贪心的类想要多重继承自所有的类,那么你要怎么使用不同的父亲的方法呢? 因为这个时候你这么创建了一个实例,你使用它的size那么到底你指的是string还是vector的呢?你调用operator[]的时候又是哪一个呢?
  2. 在vcmi里有大量的enum,而且是经常混用的,那么简简单单一个数字代表的enum如何能够让我们清晰的维持强类型的优势而不混淆呢?我想用这个万能包装来加以区分: 它有什么好处呢?它保持了类型的区分,注意原始的enum不被看作强类型,至少它是不能被继承的基本类型,

二月二十四日 等待变化等待机会

  1. 很多时候一件事情要反复做了之后才有一点印象,比如对于terminal显示中文的问题,这个在本地固然是和系统中文支持相关的问题,归根结底都是一个locale在控制的问题,可是当我使用ssh登陆到一个中文安装正常的系统为什么没有显示中文文件名呢?这里当然是另一个问题,因为在ssh登陆之后创建一个新的shell的时候环境变量没有设置正确的问题,所以,最简单的是在.bashrc里设置
    
    export LC_CTYPE=en_US.UTF-8
    
    前提当然是首先要使用locale-gen生成你需要的语言包了。

二月二十七日 等待变化等待机会

  1. 偶然心血来潮想看看我当初到底报告了多少gcc的bug呢?
  2. 这个应该是一个常识,就是说如果你要利用std::hash那么你的类型必须是要实现的,如果不是系统默认的那些帮助你特殊化的类型的话。这个实际上是挺繁琐的因为你必须要入侵std的名字空间才能做到。给出的链接boost::hash也并没有什么魔法能够解决,因为你要使用hash就必须要告知怎么去实现,而标准库的做法就是去特例化std::hash的operator()函数。这个就是我今天偶然看vcmi代码的一点心得。
  3. 在boost里看到一个小的细节,就是什么是所谓的as_literal。我学到的一点就是把literal当作一个数组来对待进行特殊化处理: 这里传入参数是数组的引用,它防止了所谓的传参数数组变指针的种种麻烦事情,也只有模板能够帮助你区分指针和数组,当然这里还要特殊化const引用。
  4. 这里遇到geany的一个font的bug就是下划线不能显示的问题,其实这类问题我以前也遇到过好像是firefox显示的字体怪怪的,很多是所谓的cjk共享的那些字体吧,当时有好几年都不知所以然,后来偶然才明白是字体的问题和显示无关,所以,现在遇到这类问题就处变不惊了。所以看到这个帖子的修改geany配置的做法我是不以为然的,还是彻底的改字体来的简单。
    
    sudo apt install fonts-hack-ttf
    
    然后修改字体配置
    
    Edit > Preferences > Interface
    Fonts, Editor, "Hack Regular"
    Apply, OK.
    

二月二十八日 等待变化等待机会

  1. 基本上一个系统最简单的部分无非就是文件系统部分,这个是所有程序员最容易上手的部分也最没有什么争议的部分。所以,我先看了所谓的Archive部分,这个其实是3DO的原本游戏文件的压缩包(甚至不是压缩而是打包而已),我很惭愧这么多年从来没有看过它是什么,其实就是只有三种文件,一个是所谓的LOD,这个是所有游戏文件的打包,另外两个是流媒体部分分别是VID和SND,即视频和音频部分,包装方式也很简单,无非是开头说明多少文件,然后固定偏移开始是文件的元信息比如文件名和偏移大小等等。而我需要看的是所谓的存储游戏进度的文件,这个是所谓的“.GM1"文件实际上".GM1"的确是3DO的原版的存储文件,而vcmi使用的是".vcgm1"(client)和".vsgm1"(server)的存储文件,它们默认是存放在${HOME}/.local/share/vcmi目录下的。,这个我刚看了一个开头才意识到作者的处理思路是把所有的类都序列化,这个的确是我之前没有想到的,因为这个的确是很聪明的做法,与其费力不讨好的兼容原本3DO的存盘文件格式还不如这么简单的处理,因为这个serialize/deserialize对于将来代码的修改只要版本一致就没有问题,不需要逻辑提取存盘文件的元素了。这一点我其实早应该想到的,想想看几乎任何游戏到了一定阶段就是极其复杂的一个状态机,那么要去提取游戏的状态元素来精简的存储状态然后无缝的存取实在是很难的事情,还不如直接把各个类直接序列化来的容易。这个是最最普通的想法我却现在才意识到!

三月二日 等待变化等待机会

  1. 下载了英雄无敌3的经典的战略战术大全。这个是维基百科的网址链接。 这里是很酷炫的模拟器虽然我还不明白怎么用,但是看起来很好用的样子。
  2. 关于魔法相关的英雄特长加成的公式是通用的:
    
    HERO'S SPELL SPECIALTY
    This is true for all spell specialty heroes save Ciele and Luna, including Astral and Uland.
    Hero's spell specialty bonus is calculated as:
    (1 + Hero level * 0,03 / Unit level)
    
    这里的一个作战视频实验就是验证了这个公式的正确性:
    
    条件:普通英雄土系高级,等级15,魔力17那么复活怪物牛头怪(生命值50,等级5)。
    正常复活生命值: 50生命×魔力17+160=1010
    但是对于有复活特长的杰德特来说他的奖励增加值就是: 
    英雄等级15×系数0.03/牛头怪等级5=0.09,
    那么对应于复活生命值增加并取整就是0.09*1010=90,
    所以,总共就是1010+90=1100,对应复活的牛头怪个数就是1100/50=22
    
  3. 再次读《三体》感觉很多情节都和现实若即若离,在刚刚过去的世纪疫情大流行是否是ETO的一种基因导弹定向攻击潜藏在世界某个不知名的隐藏地点的破壁人呢?也许为了消灭罗辑ETO只好在全世界范围内释放广泛攻击的病毒,它只对于和罗辑相似的基因才产生致命伤害。
  4. 这两天看了长沙马王堆出土的《道德经》完全颠覆了我的认知,在二十几年前我认为道可道非常道,名可名非常名。我那个时候认为大道无名,其中精微奥妙不可意会只可言传。可是突然之间马王堆的版本加了两个语气词内容就完全不同了:道,可道也,非常道也。名,可名也,非常名也。什么意思?大道其实都是可以说清楚的,而且就是平常的道理;名字也不过就是个代号,都是可以说道的,都是平常的名字而已。真的是颠覆我的认知啊!
  5. cmake项目下如果要enable一个option就是使用-Doption=value的命令,在vcmi里有一个gtest那么要编译的话就是使用顶层的CMakeList.txt里的ENABLE_TEST来激活它。

三月三日 等待变化等待机会

  1. 这个是一个古老的问题。回答肯定是正确的,举的例子也很恰当,但是我以为这个需要额外的解释,因为单单一个SFINAE是不准确的,至少在我看来能够问出这样问题的人对于这个概念是不熟悉的吧?
  2. 我不止一次的反反复复的学习enable_if,但是依然脑子不清楚。这个真的是一个核心的核心啊。这个常犯的错误究竟是怎么回事呢?
    A common mistake is to declare two function templates that differ only in their default template arguments. This does not work because the declarations are treated as redeclarations of the same function template (default template arguments are not accounted for in function template equivalence).
    首先,我对于这个function template overloading就目瞪口呆,这里的水真的好深啊!
    1. 我从学习c++的几乎一开始就被教导函数如果只有返回值不同的话是不算做overloading的。这个就是一个金科玉律
      
      int foo(){return 0;}
      float foo(){return 1.0;}
      error: functions that differ only in their return type cannot be overloaded
      float foo(){return 1.0;}
      ~~~~~ ^
      
      可是如果这个模板函数他们的差别似乎仅仅是返回值啊! 这个似乎是破了那条金科玉律,当然模板定义不代表就是能够正确执行的,你在实例化的时候编译器就发现这个是不行的因为ambiguious,所以,这么看来这个依然是不能做到overloading的。
    2. 那么我们如何消除ambigious呢? 这个我们是做到了,可是你只能把I限制在0,1,比如 所以,看起来这两个函数与其说是返回值不同类型还不如说是模板参数不同的重载或者说特例化更准确。
    3. 通常enable_if最好用的就是定义函数的返回值因为函数返回值没有类型是被判作语法错误,注意void是允许的。这个当然对于ctor不适用因为我们不能拿返回值做文章,那么怎么能够造成语法错误呢?我直到这个时候才明白为什么大家通常都会犯这个错误!就是想当然的在ctor里多一个default类型参数。 这里为什么会出错? 编译器认为template<class Integer, class> T::T(Integer)和template<class Floating, class>>T::T(Floating)是redefinition,我怀疑原因在于这个模板的第二个参数是一个default type,而被作为class出现在模板函数原型中起不到作用吧?否则为什么模板第二个参数换作non-type的参数就可以了呢? 我后来才想到这里不是简单的模板擦数换成non-type而是说SFINAE!换言之在enable_if_t不成立的时候语法通不过就被安静的放弃了,那么问题是在上面错误的例子里typename=为什么没有发生呢?就是说enable_if_t ... =true发生了, 而前者没有!也许这个是编译器实现的特性吧?有一个默认的类型编译器就不想去验证哪怕语法typename=后面不成立也不报错?
    4. 吃完午饭我再次回头看觉得关键是这句话default template arguments are not accounted for in function template equivalence 那么什么是function template equivalence
      Function template overloading
      1. A non-template function is always distinct from a template specialization with the same type. 这个就是允许的重载哪怕你调用的时候是没有ambiguity的,比如
        
        bar(5); // non-template version
        bar<int>(6); // template version
        
      2. Specializations of different function templates are always distinct from each other even if they have the same type. 这两个模板函数,明显的模板参数就不一样,那么当然就是overloading了对吗? 比如: 你能说他们两个类型一样吗?
      3. Two function templates with the same return type and the same parameter list are distinct and can be distinguished with explicit template argument list. 这个我有些吃不准,之前的例子是否说明这个呢?
  3. 关于这个问题我感到有些不安,这个实在是复杂,作者说这个是一个问题,可是我实验后觉得是GCC的问题
    When determining if two dependent expressions are equivalent, only the dependent names involved are considered, not the results of name lookup. If multiple declarations of the same template differ in the result of name lookup, the first such declaration is used:
    决定提交这个gcc的bug
  4. vcmi里有一个相当的厉害的做法值得收藏。就是把lambda或者函数串起来,类似于std::any_of, all_of,不过是针对functor之类的,我试图检验一下它的and与or的优先级的问题,但是发现其实是很自然的结合律,我觉得大多数程序员都是接受的,不必修改,因为大家都是就近。唯一我想改进的是它使用了enable_if定义了一个default parameter,难道不应该放在模板参数里而不是放在实参里吗?这个我有些想不清楚,还是要做实验才行。

三月十一日 等待变化等待机会

  1. 我几乎已经完全忘记了基本的语法了。真的一日不见如隔三秋啊。比如看remove_extent的时候,对于一个数组类型T[]的自身的类型T来说,当T本身是数组是怎么样的呢?这个是一个小学生都能回答的问题,我却犹豫了。其实就是这个问题: 换言之,T[] ==> T对于int[3][4]来说就是T=int[4];
    static_assert的判断彷佛一系列的思想钢印我在内心深处还没有真的实现。因为对于数组和函数指针来说parser的过程是一个类似于递归的做法,也就是从最外层逐渐进入内层的过程,所以,一个指向长度为4的int数组的指针是这样子的int(*)[4],用思想钢印来表达就是
  2. 每天这样子的使用思想钢印来铸牢我的信念。

三月十三日 等待变化等待机会

  1. 在c++17的一个新功能里看到这个pack expansion in using-declaration 这个是什么鬼呢?我们不妨做一个实验 这个思想钢印说明了什么呢?首先,我们不考虑using那么我们的OverLoad继承了两个类,它接受两个整型或者浮点型的参数的functor,并且一个是less一个是greater,什么时候返回true就是很明确的了。但是这个using作为声明究竟有什么用法呢?
  2. 我在实验中意识到这个也是实现类似于all_of的一个做法,差别就在于标准库是以遍历的概念去做的,那么我这个是一个继承的,并且我对于每个的参数有着严格一致的要求,显然我这个意义不大: 首先,我这里是否有必要使用继承呢?我的理由是我需要两组不定参数,如果放在一个模板里我做不到使用的类和成员函数参数都是expansion。其次,我这里使用了fold expression意味着所有的参数都是一样类型的,这个比std::all_of的要求严格多了变成没有什么实际意义了。当然了你要是使用fold expression写一个模板函数不使用继承还真不知道要怎么做到。 在c++20以后还可以使用decltype(lambda)来作参数比如

三月十五日 等待变化等待机会

  1. 头条上有些博主也在谈c++的难,学了十几年依然是略有基础的样子,对于此我深有同感,但又觉得不足。因为看meta programming我感觉再学十年也许也只是入门而已。比如,我为了验证一个问题牵扯出无数的问题,然后暴露了我无数的无知。
  2. 我一直不知道declval是干什么的有什么用,因为尽管我对于它的定义是有印象就是不通过ctor产生对象,可是这个意味着什么呢?而且最最重要的是我错误的遗漏了最关键的它是rvalue_reference! 这个是思想钢印 这里实现的static_assert的用意是什么?首先我的主观意识里要明确什么叫做不能evaluate,其次作为lvalue是否就是evaluate呢?或者说作为reference是否就是参与到内存分配呢?我的朴素的理解就是凡是有名的变量就是分配了地址的对象或者变量吧?因为引用或者说指针就是分配了内存地址的变量。所以,跳过ctor的rvalue-reference是不允许分配内存的,因为这个违反了ctor设立的初衷,凡是例外必然有后果,所以,不允许。最后一点要强调是std::declval是一个函数,这个和很多的模板类不同,一个函数如果不是包裹在decltype里那么就是调用了,而我们要防止的就是它被作为引用的滥用。
  3. 偶然找到两首去年写的小诗
    牵马桥中抬头望,
    山巅高耸云中藏。
    美景只应天上有,
    全凭妙笔落华章。
    
  4. 这个是去年填的词:《钗头凤》看贾平凹贾浅浅父女玷污中国文坛气愤填膺,胸臆难平
    心里有,
    笔下落,
    佳句妙语天上求。
    几多思索,
    几多雕琢,
    磨,磨,磨。
    
    他妈的屎尿多你妈的藏污垢,
    贾氏父女真下作,
    自甘堕落,
    如此龌龊,
    堕,堕,堕。 
    
  5. 看才女有诗云云: 朦胧暮色夜轻寒, 佳女羞筹眷恋笺。 苦无佳句梅心惹, 明月照水问青禅。
    我就凑趣
    
    才女有心觅良缘,
    扭捏矜持露笔端。
    佳偶佳句何处觅?
    床前明月在天边。
    
  6. 我看到一条很美的枫叶的视频即兴作的小诗没想到得到不少的称赞
    从来枫叶不负秋,
    漫山遍野画中游。
    莫愁秋色留不住,
    相思片片心中留。
    
  7. 这个是以前改的诗
    天高云更淡,
    风轻气自闲。
    一排南归雁,
    悠悠入云端。
    

三月二十日 等待变化等待机会

  1. 这里是hp printer的最好的问题解答中心。之前我的驱动太老安装最新版一切问题都没有了。现在可以在命令行来扫描了。那么如何使用ADF来扫描呢?因为默认的hp-scan是只能使用glass的我使用scanimage命令结果就是要扫描成一系列的图像文件。比如
    
    scanimage  --resolution 300 --source ADF  -p  --batch=insurance%d.png --mode Gray
    convert $(ls -v *.png) insurance.pdf
    
    注意我这里使用ls -v来强迫数字排序否则默认是字母排序。这个是多么的麻烦呀。还是hp-scan好:
    
    hp-scan --dest=file,pdf --mode=gray --resolution=300 --adf --file=insurance-adf.pdf
    
  2. 有一个有趣的做法是ubuntu是可以在http://localhost:631来配置cups的,这个是ubuntu的做法,显然HP是用它自己的所谓的mDNS/SLP之类的服务来做到的。

三月二十一日 等待变化等待机会

  1. 头条上的才女秋水伊人经常发表新诗邀请诗友填空(最后一句是我添的):
    时光清浅草木心,
    岁月无痕觅知音。
    回首来路坎坷步,
    从来多情怨无情
    《期》
    山河无恙待春归,
    草木有心增春美。
    风雨多情知春意,
    鸿雁传书佳人催
    《寂》
    胭罗纱窗渐黄昏,
    潇湘妃子有泪痕。
    寂寞春闺西厢阅,
    借书还伞姻缘成
    春雨陌上花,
    乍晴出彩霞。
    天地同灿烂,
    相思更无涯
    春色渐深水墨浓,
    油菜花艳草木葱。
    风雨添彩诗画醉,
    才子佳人心相通
    夜半窗前雨万滴,
    梨花飘落护春泥。
    无心浅饮相思酒,
    有意深藏离别诗

三月二十四日 等待变化等待机会

  1. 在玩openAI的命令行工具,修改图片需要上传RGBA的png图像,那么这么一个简单的问题居然困扰我半天。
    1. 首先,使用什么工具?找了半天还是回到最好用的工具imageMagic,不过默认的安装包里没有命令行工具magick,我只好从源代码编译。
    2. 下载源码
      
       git clone https://github.com/ImageMagick/ImageMagick.git ImageMagick-7.1.1
       cd ImageMagick-7.1.1
      ./configure
      make
      sudo make install
      sudo ldconfig /usr/local/lib
       
      让我以外的是居然要自己调用ldconfig,为什么不在make里写好呢?
    3. 有了工具我才意识到,实际上我平常使用的convert就是链接这个库,完全没有必要自己编译源码安装啊!
    4. 怎么把一个普通的png增加一个channel呢?你按照这个去做却不行?
      
       magick gigi019.png   -background silver -alpha Background   test_silver.png
       $ file test_silver.png
      test_silver.png: PNG image data, 800 x 600, 8-bit/color RGB, non-interlaced
       
      这个说明了什么?alpha channel没有被添加?后来google才发现是被默认优化了必须强制要求png32:你的文件名
      
       magick gigi019.png   -background silver -alpha Background   png32:test_silver.png
       $ file test_silver.png
      test_silver.png: PNG image data, 800 x 600, 8-bit/color RGBA, non-interlaced
       
    5. 下一个问题是openAI要求正方形,结果是这样子的要使用-extent
      
       convert gigi019.png  -extent 600x600 png32:input.png
      $ file input.png 
      input.png: PNG image data, 600 x 600, 8-bit/color RGBA, non-interlaced
       

三月二十八日 等待变化等待机会

  1. 与chatGPT合作的诗:
     今夜无语问苍天,
     明月清风照人眠。
     寂寥长空思往事,
     满怀愁绪梦江边。
     
    今夜无语问苍天,
    繁星闪烁伴月圆。
    离愁别绪难消解,
    独倚栏杆泪满颜。
    
  2. 头条诗友征集最后一句
    《美人吟》
     美人微醺登望楼,
     凝望远帆亮歌喉。
     天香国色无人赏,
     红颜如水月如钩。
    

三月三十日 等待变化等待机会

  1. 关于Dalle的参数这个纯粹是一个技术细节的东西,对于非专业人士就是听天书,我怎么知道什么照相机的参数呢?我画出来的都是鬼魅一样的作品,我觉得这个东西做鬼片是超出人的想象力的,从此以后变态恐怖片再也不愁没有素材了。
    
     curl https://api.openai.com/v1/images/generations   -H "Content-Type: application/json"   -H "Authorization: Bearer $OPENAI_API_KEY"   -d '{
        "prompt": "Young Holy Mary in white robe, facing morning sunshine in wheat field, hands stretching above, face white as snow, eyes filled with tears, mouth opening slightly, lips are as red as blood, Nikon D810, ƒ/2.5, focal length: 85.0 mm, exposure time: 1/800, ISO: 200",
        "n": 1,
        "size": "1024x1024"
      }'
     
    这是其他的参数,我就是照抄而已。
    
      an illustration by Michael Sowa, but as photography.
      Sigma 85 mm f/1.4.
      Sigma 85 mm f/8
      
    但是这玩意纯粹是画鬼,因为人物的脸都是被扭曲的,尤其是有名有姓的名人的脸。

三月三十一日 等待变化等待机会

  1. 一早上都在和GPT讨论一句诗,这个是头条上的才女的补全的诗
    《寂》
    昨夜陈旧梦,
    今宵斑驳情。
    期许缱绻意,
    缠绵悱恻心。
    
  2. 重新安装微软雅黑字体
    
    cd /usr/share/fonts/winFonts/
    sudo mkfontscale (创建雅黑字体的fonts.scale文件,它用来控制字体旋转缩放)
    sudo mkfontdir (创建雅黑字体的fonts.dir文件,它用来控制字体粗斜体产生)
    sudo fc-cache -fv (建立字体缓存信息,也就是让系统认识雅黑)
    
    可是这个问题还真的是挺复杂的,其中的概念是非常的不一般。首先,你的输入法是否决定你的字体呢?当然不是,因为字体说到底是一个显示的glyphon,输入法只是告诉你编码。所以,我又一次对着geany的让人厌恶的cjk字体发脾气是找错了对象。因为这个是geany自己决定使用什么字体和我在系统里设定的字体是无关的,当然我首先要保证我设置的微软雅黑字体能够被应用程序找到才行。这里就是说fc-list看到的字体,可是我徒劳的去修改/etc/fonts/conf.avail/下面的中文font以及在.config/font.conf之类修改都是徒劳的,因为,这个纯粹是geany自己的选择,和系统的设置无关。当然,我在输入法筐子里看到的让我讨厌的cjk的font是输入法自带的和应用程序无关的。
  3. 那么要怎么改变输入法的那个筐子里汉字的显示呢?我还没有找到答案,可是这个关于fontconfig的部分很有希望的样子。其实完全是多余,因为在ibus-setup里是可以直接修改的。但是
  4. 比较两个笔记本关于font的配置,我依然无头绪,决定更改语言设置看看。结果这个的确是一个解决办法,就是说ibus/libpinyin在它的preview里显示中文输入字的时候也是遵循字体选择的原则,就是说所有font相关的match依然是遵守的,我之前仅仅在中文里设置了微软雅黑高于默认字体的排名(/etc/fonts/conf.avail下面众多的配置文件),但是我是在所谓的language-selector这类配置中设置微软雅黑的,对于默认语言为英文的系统来看它在preview里就不遵守。当然这个原因应该是和ibus的配置使用customs font不起作用的bug有关。否则我也不用这么大费周折了。
  5. 我不知道是什么原因,总之我修改了系统语言为中文之后自然是按照之前的逻辑解决了困扰我的cjk字库的问题,这个很明显,让我不明白的是我在30-cjk-alias.conf把微软雅黑添加到系统默认之前后ibus崩溃,我猜想是有些系统字体不全吧?这不是问题,问题是我把语言改回英文之后居然输入法preview里不再出现cjk的难看的字体了,我的问题突然解决了,难道说是重启吗?总之,莫名其妙解决了。
  6. 另一个更实在的解决方法是把我之前的ibus的用户数据倒出来然后导入就解决了我的问题,而且这个是自增长的,就是说我发现ibus把数据放在了.cache/ibus/libpinyin,当然是binary格式的,但是无所谓我知道它是可以多次叠加就行了。我去网上下载更多的字库就行了。而且这里有一个脚本号称可以给你的词库加上拼音,这个是神器啊,以后再实验吧。这个方法是调用其他网站的在线服务,不可取。

四月一日 等待变化等待机会

  1. 昨天复习了一下中文编码,可是我似乎更加的糊涂了。这个网站的资料很全,我就厚颜无耻的留下了一些拷贝。gb2312-80-table, cjk-table, 这里是gbk-table, 以及big5-table。我的疑惑来自于对于中文转拼音的实现问题,之前提到的这个脚本实际上没有什么玄奥的因为它是利用了一个网站在线来转很麻烦而且要注册。我下载了这个pinyin的库问题它的实现也是依赖于自带的一个文本的表预先把所有的汉字的拼音都写好了,可是我惊讶的发现这个汉字的编码我不明白,因为和中文的编码对不上。
  2. 我决定摘录这个文档来更好的理解各种中文编码的特点:

    There are a few ways of representing Chinese characters in computer. The following is a list of existing standards. I have tabulated the Chinese codes for easy referencing.

    Unicode

    This encoding characters has defined 20902 CJK characters. The advantage of using this standard is that you can display Simplified Chinese characters, Traditional Chinese characters, Korean characters and Japanese characters on the same HTML page. No other encoding standards is supporting that for the moment.

    GB Code

    GB (Guo Biao) Code is defined by China. It is the encoding standard used to represent Simplified Chinese characters. It has defined about 6763 Chinese characters (excluding all symbols). Countries such as China, Singapore and Malaysia are using this encoding standard.

    Every Chinese character is represeneted by a two byte code. The MSB of both the first and second bytes are set. Thus, they can be easily identified from documents that contain both GB characters and regular ASCII characters.

    GBK Code

    The Chinese authority soon realized that it cannot ignore the traditional Chinese characters. Thus, it had defined GBK (Guo Biao Kuozhan) to include all the traditional Chinese characters defined in Big 5. It claims that GBK is synchronized with Unicode standard, version 1.1.

    Big 5 Code

    Big 5 is the character encoding standard most commonly used for traditional Chinese characters. Regions / countries such as Taiwan, Hong Kong and Malaysia are using this encoding standard.

    Every Chinese Character is represented by a two byte code. The first byte ranges from 0xA1 to 0xF9, while the second byte ranges from 0x40 to 0x7E, 0xA1 to 0xFE.

    Note that the MSB of the two byte code is always set. Thus, in a document that contain Chinese characters and regular ASCII characters, the ASCII characters are still represented with a single byte.

    CNS-11643-1992

    CNS-11643-1992 is sometimes refered to as Chinese Standard Interchange Code. It is a Chinese character encoding standard defined by Taiwan in 1992. It has 16 planes. Each plane contains 94*94 = 8836 locations. Each location is supposed to be filled with a Chinese character. However, a lot of the locations are left blank.

    Every Chinese character is represented with two 7 bit ASCII codes. Each 7 bit is a printable ASCII character ranging from 0x21 to 0x7E. This implies the first character is every plane starts with code 0x2121.

    This encoding standard encompases much more characters than Unicode, GB or Big 5. A lot of characters are very rarely used. However, this encoding scheme is less popular than Big 5. This encoding scheme is used in the Chinese paging (pagers, beepers) industry. However, the paging industry uses only the first plane due to memory constraints in such devices.

    Since the characters in different plane may have the same coding, escape sequence is necessary to switch between character planes.

    References

    You may find more information about various encoding schemes in these web sites.

    自己总结提炼一下:gb2312-80是简体,big5是繁体,gbk等于前两者之和,cjk就是unicode,就是中日韩的之和。
  3. 这里是另一个快速更新词表的方法,就是下载他的这个local.db,这个方法和更新user data是不同的,因为后者是放在用户的.cache目录下的用户数据,而更新这个表代表着全局的数据更新。
  4. 国家语委会的资料没有想象的丰富,但是应该是相当的有用的,因为chatGPT建议我来查询词频的。
  5. 我觉得只有真正理解了编码原理才能明白这个是cjk的编码,使用它来把汉字转换为拼音的确是可以,问题是你要把其中的日语韩语过滤掉。我在想是否应该转为utf-8的汉字的表呢?相比之下我始终不理解这里的编码是什么?

四月二日 等待变化等待机会

  1. 一个如此简单的问题折磨了快一天多。源自于我对于python几乎一窍不通,它有一个天生的优势就是它有一个内生的unicode函数,而在python3直接变为默认的字符串类str,也就是说它直接能够识别UTF-8的encoding并把它转为原本的unicode,而这一点就是我一直没有想明白的,因为我没有理解到UTF-8只是unicode的一个传输过程的编码,它本身的unicode编码就是我昨天心心念念的cjk的编码,因为它们就是一回事,那么我为什么始终没有意识到这么个简单的问题呢?我觉得我是被误导了,并不是我真的很愚蠢,就是说这个表从3400开始让我觉得不可理解因为汉字是从4E00开始的,并且我天然的认为日韩没有拼音这一说,我真的错了,这些字我不认识并不代表它们没有拼音啊!
  2. 所以,我也可以使用这个表来把汉字加上拼音,这个转换不是完全确定的,因为多音字的原因,但是足够好了。这个简单的代码省却了任何多余的库的羁绊。的确为了这么简单一个转换,你值得去写一个库吗?

四月五日 等待变化等待机会

  1. 和ChatGPTicon联手创作。我出题写的第1句和第4句,人工智能写的中间两句
    今夜无语问苍天,
    星河静听我独言。
    相思难耐梦难成,
    情到深处恨无边。
    
  2. 头条才女征集最后一句:
    《寂》
    月入闺窗亦无言,
    念君千里夜难眠。
    相知总把相思引,
    无情常被痴情牵。
    
  3. 朝看彩云暮看霞, 不知君行到哪家, 千里相思举头望, 今夜月圆到天涯。
  4. 看到头条诗友作品忍不住要改一下
    相思叶下忆相思,
    片缕情丝寄月池。
    痴心却惹容颜老,
    莫等花凋两不知。
    
    我改了一下,我觉得更加的正能量。
    相思叶下忆相思,
    片缕情丝寄月池。
    痴心哪怕容颜老,
    花开花谢两厢知。
    
  5. 看头条诗友调侃一下
    桃花夭夭落不停,
    玉女逢春自多情。
    郎有心来妾有意,
    甘心受缚待郎擒。
    
  6. 头条才女征集最后一句
    《美人吟》
    美人微醺登望楼,
    凝望远帆亮歌喉。
    天香国色无人赏,
    红袖舞罢枉凝眸。
    
  7. 头条才女征集最后一句
    《寂》
    昨夜陈旧梦,
    今宵斑驳情。
    期许缱绻意,
    酝酿旖旎心。
    
  8. 头条美女的诗调侃一下
    日常工作无滋味,
    夜色昏沉寻暧昧。
    心知生活走不出,
    散步再远终将回。
    
  9. 《散步偶得》
    寂寥小径草长长,
    春寒料峭无花香。
    梦里不知家何在,
    只把他乡作故乡。
    

四月六日 等待变化等待机会

  1. 如何理解usb设备,这里看了好几遍还很困难。usb-devices这个命令给出了更加详细的信息。

四月十二日 等待变化等待机会

  1. 直接使用stable-diffusion还是有门槛的,因为对于AI/python基本零基础确实很困难,但是使用stable-diffusion-webui就容易多了。很多艺术家都能够掌握,对于一般的程序员来说不是什么大问题。之前,我被纯粹误导去尝试coreboot的安装编译,因为我看了youtube上一个自称是教授以色列民族舞蹈的老师的视频给忽悠了,他号称希望在一台旧的thinkpad上开机使用某种蓝牙设备操纵他的音响而不得不更新笔记本的bios,我被深深的震撼了,难道一个舞蹈老师都能做到的我却不行吗?事实上真的不行!首先,你要刷bios这个不使用主板厂商提供的工具在通常的uefi启动界面下安装新的bios几乎是不可能,因为你只能通过开源的工具直接拆开笔记本找到芯片去烧机器,我的粗浅的理解就是最最基本的SPI模式,这个东西我的理解就是硬件互联的最基本的通讯协议,应该和i2c一样的基础,所以,才有可能去烧机器,但是这个从操作系统层面几乎是不可能的。所以,你要直接去烧bios,那么就用外部工具,作者使用草莓派来作,这个也不是最难的,因为编译coreboot需要交叉编译其实对于软件开发还不是头疼的,因为要亲自动手去连线草莓派和芯片的管脚我就望而却步了。我仅仅在我的笔记本上最最普通的交叉编译了coreboot一下尝试payload是自带的elf的模块在qemu上模拟一下helloworld就花了一天多,因为我没有意识到你必须使用32位目标系统,否则总有编译错误。但是这个仅仅是打通编译,你要真的作还是要在草莓派上编译,当然,通过在笔记本上先走一下省却了很多的摸索,毕竟草莓派交叉编译慢得多。我至此完全不相信博主的鬼话,他绝对是一个披着羊皮的狼,一个假装舞蹈老师的硬件工程师,否则熟练使用各种工具编译就不大可能。我被忽悠了。
  2. 那么使用stable-diffusion-webui有什么难度呢?我一开始也是这么认为,那么多头条上对于计算机编程零基础的艺术家都能掌握能有多复杂?可是一个controlnet配置居然还是卡了我大半天,后来还是参照这个视频才搞明白了一点。因为现在很多东西变化太快,很多博主一个月前的帖子就和当前有很多不同。最大的一个地方就是如果没有使用--xformers是不会激活controlNet的,至少我是这么认为的,而且作者介绍我使用stable-diffusion的v1-5-pruned-emaonly.ckpt把它放在models/Stable-diffusion下,当然这个是原本就应该明白的概念,我因为零基础并不知道,直到看到有一个placeholder文件名说让你把checkpoint文件放在这里。总之,通过extension直接安装是不行的。而从huggingface下载controlNet的model已经不是完全必要的,因为目前的版本帮你下载了主要的模型。
  3. 总而言之,这个工具对于美工是神器,也就意味着这一行很多人可能要失业如果不尽快掌握它的话。而对于非人工智能专业的程序员来说没有优势,因为这个是一个审美与想象力以及图形方面专家的工作。

四月十三日 等待变化等待机会

  1. 找到了这个非常详细的流程,但是需要使用草莓派作为spi programmer。
  2. 我的显卡是RTX4050只有6G显存可能是门槛级别的吧,经常报出显存不足的错误。
  3. 我缺乏最基础的知识,这里是i2c+SPI入门的介绍,可能我读过很多遍类似的,但是几乎都是不甚了了。
  4. 折腾了好久也许这个hlsdl是唯一可以用的吗?这些参数是我使用浏览器inspect得到的。
    
    hlsdl -v -h 'authority':'vod.1958xy.com' -h 'origin':'https://www.1958xy.com' -h 'referer':'https://www.1958xy.com/'  -h 'sec-ch-ua':'"Not:A-Brand";v="99", "Chromium";v="112"' -h 'sec-ch-ua-mobile':'?0' -h 'sec-ch-ua-platform':"Linux"  -h 'sec-fetch-dest':"empty" -h 'sec-fetch-mode':'cors' -h 'sec-fetch-site':'same-site'  -u 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' -o my.mp4  https://vod.1958xy.com/c79a3318bcac4269abd1575b81502ad1/26662597f53492246b7b2380be75c6c7-ld-encrypt-stream.m3u8
    

四月十四日 等待变化等待机会

  1. 关于AES-128的key我总是认为是16bytes,但是遇到176bytes就全然不明所以然,包括大多数的工具软件都是如此。直到看这个解释,还是太麻烦了。我不可能自己去实现这个我只是想知道openssl怎么用而已。

四月十五日 等待变化等待机会

  1. 这个真的是头疼的问题,我研究了两天也没有结果,还是把思路理一下吧:
  2. 只有这篇文章把HLS问题讲的比较通俗易懂。所以,我觉得我的问题大部分还是存在于AES-128的基础问题,这里要澄清一个概念,它不是简单的对称加密的key。这一点我的概念是彻底错误的,否则也不会那么被美国NSA推崇了。

    The working of AES is explained below:

    It consists of 10 rounds for 128-bit keys, 12 rounds for 192-bit keys & 14 rounds for 256-bit keys. One round involves multiple processing stages like substitution, transposition and mixing of the input plaintext to transform it into the final output of ciphertext.
  3. 习总说复杂问题没有简单解决办法,可是,我要找的视频是古董级的网络上到处都是,于是我找到了一个不加密的视频网站,嘿嘿。就是pangzitv.com,使用简单的命令就能下载了。当然解析度是很差的。首先找到m3u8,然后使用这个命令
    
    ffmpeg -y -headers 'host':'cdn69.pzvcdn.com' -headers 'origin':'https://m.pangzitv.com' -headers 'referer':'https://m.pangzitv.com'  -headers 'sec-fetch-dest':"empty" -headers 'sec-fetch-mode':'cors' -headers 'sec-fetch-site':'cross-site'  -user-agent 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' -i “https://url/to/m3u8" -c copy yourfilename.mp4
    
    这就是不加密的问题,但是我认为这个胖子电视都是盗版吧?所以,黑吃黑没有什么可耻的。
  4. 昨天尝试了althttpd感觉还是不错的,因为它满足了我简单的要求。不要那么复杂的功能,我就要一个文件服务器而已。
  5. 我似乎开始明白我不能以openssl的命令行工具来思考问题,因为AES是一个计算量很大的工作,没有人会使用软件实现的函数来作的,所以,根本不存在直接调用AES_decrypt这个函数的机会,而且,我现在需要的是firefox里面如何使用的,也就是这里。我感觉大体上就是对应的unwrapkey这个功能。

四月十七日 等待变化等待机会

  1. 我最后只好问AI,谷歌的bard似乎没有openAI的gpt4来的强,我反复的确认了GPT4对于RFC的理解,我认为这个问题是由西影网通过下载的aliplayer的js脚本来实现的。这个脚本太复杂了对于零基础的我是无法理解的。

    Media Source Extensions (MSE) is a W3C specification that allows browsers to play adaptive streaming media formats like HLS and MPEG-DASH by using JavaScript. MSE extends the capabilities of the HTML5 video and audio elements by allowing JavaScript to generate media streams for playback.

    Firefox, like many other modern browsers, supports MSE to enable playback of adaptive streaming formats, even if there's no native support for specific streaming protocols like HLS. MSE serves as a foundation for JavaScript libraries like hls.js, video.js, and others to implement HLS playback in Firefox and other MSE-supported browsers.

    Here's a high-level overview of how MSE works in Firefox:
    1. A webpage with an HTML5 video or audio element is loaded in Firefox.
    2. JavaScript on the page uses the MSE API to create a MediaSource object, which represents a media source for the video or audio element.
    3. The JavaScript code appends SourceBuffer objects to the MediaSource. SourceBuffers hold the media data that will be played by the video or audio element.
    4. The JavaScript code downloads the media segments (e.g., HLS segments) and feeds them into the appropriate SourceBuffers. The segments are demuxed, decoded, and prepared for playback by the browser's media engine.
    5. The video or audio element uses the MediaSource object as its source, and the media playback is controlled by the JavaScript code, which manages the download and buffering of the media segments.

    By using the MSE API, JavaScript libraries like hls.js can create a custom HLS playback implementation for Firefox and other MSE-supported browsers, providing a seamless playback experience for adaptive streaming formats.

  2. 之前我一直不肯接受这个m3u8不符合标准的理由是浏览器都能正常播放,而我一直以为这个是符合html5的结果,现在看来这个都是浏览器之外的脚本的功劳。

四月十九日 等待变化等待机会

  1. 《清平乐  -头条怀古》
    六盘山畔,
    万里征途半。
    主席诗词冲霄汉,
    经典金句永赞。
    
    遥想伟人音容,
    胸中豪气汹涌。
    今日世界潮流,
    崛起中华巨龙。
    
    
    注:古人云行百里者半九十,六盘山是长征最后的几个险关,可是越到后面越需要坚韧不拔的意志精神。今天中华民族崛起也到了一个关键时刻,越是成就巨大越是前途险恶。总书记告诫我们今年有可能遇到惊天巨浪,所以,任重而道远。与各位共勉。
    

五月十六日 等待变化等待机会

  1. https://tubitv.com真的是一个不错的电影网站,但是一开始我发现无法下载,后来发现它把音频和视频分在多个m3u8文件里,所以,ffmpeg支持多个输入,这个就很简单的了:
    
    ffmpeg -y -protocol_whitelist "crypto,file,http,https,tcp,tls" -headers 'authority':'akamai2.tubi.video' -headers 'origin':'https://tubitv.com' -headers 'referer':'https://tubitv.com/' -headers 'sec-ch-ua':'"Not:A-Brand";v="99", "Chromium";v="112"'  -headers 'sec-ch-ua-mobile':'?0'  -headers 'sec-ch-ua-platform':'"Linux"' -headers 'sec-fetch-dest':"empty" -headers 'sec-fetch-mode':'cors' -headers 'sec-fetch-site':'cross-site'  -user_agent 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' -i 
    

五月二十三日 等待变化等待机会

  1. 我想这个又是old new story的老生常谈了,就是我突然发现一个再普通不过的命令出错了,比如我要使用cmake,居然报错,我查看它的版本也出错,然后我发现which cmake指向的是/usr/local/bin/cmake,显然的,我怀疑是之前安装AI的一大堆库造成的,或者归结于为什么我的$PATH变量要把local放在正常的前面?我一开始看到在/etc/environment里有这样的定义,也不知道是不是我手动加上的,注释后重启还是一样,这个就让我狐疑了,回忆从前shell的基本过程借助google帮助回忆才意识到这个不是普通在/etc下通常的配置里作的:environment,profile,这个当然也排除了某些shell的专门做法,而是在login.defs里作的。这个做法我以前没有接触过,那么看样子只能卸载新安装的库了?
    
    nick@nick-sager:~$ file $(which cmake)
    /usr/local/bin/cmake: Python script, ASCII text executable
    
    我看到这里心里真的是气不打一处来!这个是什么样的流氓行为呢?有什么必要这样子做呢?这个和黑客的行为有什么区别呢?所以,我对于安装python的库非常的厌烦,这些人简直就是无法无天,比java的库还要可恶!
  2. 这里有一个小技巧就是搜索exact match的文件名,比如我使用locate来找cmake这个文件想看看是哪一个包安装的:
    
    locate -r /cmake$
    
    这里的$是结尾的regex,之前我使用^cmake$反而不行因为这个会包含文件夹,而你即便配合-b也就是basename也不起作用,这两个选项看来是冲突的,但是/cmake$完美的解决了这个问题。我是看到这里的评论才受到启发的。其实互联网上有近乎无穷的知识,但是如何分辨使用其实也是一个同样困难的问题,chatGPT这方面目前看来还为时过早的一个重要原因是:实践是检验真理的唯一标准。除非你让chatGPT像一个Linux的使用者一样把所有的阐述都实践一次甚至多次,而问题的环境千千万万这如何能够做到?
  3. 我究竟能够靠编译ffmpeg源代码获得什么呢?其实我是想看看是否下载closed caption功能有没有实现,虽然我已经看到大家说没有了。不过呢,ubuntu的标准库是4.4版实在是有些老了,因为现在最新的是6.0版了,值得尝试一下。
  4. 看到编译命令里有一个bash -r,原来这个是所谓的restricted,这个要求相当的严格似乎杜绝了不法行为。turning off restricted mode with set +r or set +o restricted.这个是我通常看到的shell script的开头部分吗?

五月二十七日 等待变化等待机会

  1. ffmpeg实际上是能够识别timed_ID3
    
      Program 1 
      Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, progressive), 854x462 [SAR 792:793 DAR 24:13], 23.98 fps, 23.98 tbr, 90k tbn, 47.95 tbc
      Stream #0:1[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 130 kb/s
      Stream #0:2[0x102]: Data: timed_id3 (ID3  / 0x20334449)
    
    但是ts文件被拷贝到mp4之后是空的。这里是非常复杂的metadata的部分。

六月二日 等待变化等待机会

  1. 收到这个bug的更新,我一开始还以为我的记忆力已经完全丧失了因为我根本认不出这个东西。后来才意识到这个是一个类似于metabug的bug family,我其中提过几个。关于generic lambda的深入见解这个是非常的震聋发聩的。我想摘录这些来理解:
    The closure type for a non-generic lambda-expression has a public inline function call operator (13.5.4) whose parameters and return type are described by the lambda-expression’s parameter-declaration-clause and trailing-return-type respectively. For a generic lambda, the closure type has a public inline function call operator member template (14.5.2) whose template-parameter-list consists of one invented type template-parameter for each occurrence of auto in the lambda’s parameter-declaration-clause, in order of appearance. The invented type template-parameter is a parameter pack if the corresponding parameter-declaration declares a function parameter pack (8.3.5). The return type and function parameters of the function call operator template are derived from the lambda-expression’s trailing-return-type and parameter-declarationclause by replacing each occurrence of auto in the decl-specifiers of the parameter-declaration-clause with the name of the corresponding invented template-parameter.
    原本的论文是这里。 这里举的例子真的是一句顶一万句!
    1. 首先,作者说这么一个关于generic lambda的应用:
      
      auto glambda = [](auto a) { return a; };
      int (*fp)(int) = glambda;
      
      这里的潜台词是我琢磨了一两天才领悟的非常浅显的道理:你为什么要定义一个generic lambda的类型呢?完全不必要!因为你需要的不是lambda的类型,你需要的只是lambda代表的函数原型,或者说functor的类型对于你是无意义的,因为你很有可能使用的场景是兼容的函数指针!
    2. 所以,这里的应用就是典型的,你有一个应用使用的是这样子的fp的函数指针,那么你可以使用你定义的万能的lambda来带入,因为你要牢牢记得:使用lambda的最典型的场景是把它作为函数参数来传递,因为lambda可以隐含的转型为函数指针!如果不明白这一点那就纯粹是闭门造车带来的空想。
    3. 大师给出了如何实现这样子的generic lambda,这个是非常非常的有深度的揭示: 这个值得一步一步的分析理解!
    4. 首先,要明确这里的Closure在真实的代码是使用所谓的随机数生成的一个匿名结构,因为lambda的用意就是不要重用!这个是一个local代码或者说用后即焚的类,只不过为了说明我们给了一个名字而已。
    5. 这里就是我们的lambda的用户代码部分,比如
      auto glambda = [](auto a) { return a; };
      也许编译器可以把用户的代码部分return a;直接拷贝到这里来,就是说在这个Closure或者说lamba就好像functor一样的实现了一个函数模样的调用它的operator()
    6. 为什么我们需要这样一个static方法呢?并不是我们调用它的operator()应用functor需要,而是纯粹因为我们需要把lambda能够自由转换为函数指针的需求,这个高难度在后面的函数指针类型声明以及如何实现直接把Closure转换为函数指针而实现的一个类型转换operator 请注意这里的要点是函数指针的类型要如何获得 看到这里你应该能够领悟到之前为什么我们需要一个static的lambda_call_operator_invoker方法吧?因为只有static方法才能得到函数指针,因为我们不能使用member function!
    7. 最后一步是如何自动返回函数指针,这里当然是说如何自动转换类型的operator。 就是因为之前我们获得了函数指针的类型fptr_t所以才能实现这个特殊的operator fptr_t。当然这一切都是模板类型的。
    8. 这一切的一切为的就是这一行代码:
      
      int(*funPtr)(int) = Closure{};
      
      不要害怕这个语法,因为funPtr是一个类型为int(*)(int)的函数指针类型的变量,而我们把这个变量初始化了一个Closure的实例,为什么一个类的实例可以赋值给一个函数指针变量呢?这就是之前的operator fptr_t的威力!
    9. 我们还是需要验证一下这个方法是真的指向了之前的generic lambda
  2. 我为什么花了这么多时间折腾这个,因为这个是不行的 我之前一直想通过这样获得lambda的函数指针类型,实际上是不行的,因为这个获得的是匿名的类型即lambda的类型,根本无法获得函数指针类型。
  3. 我现在图省事使用s3cmd结果忘记了需要添加MIME,比如
    
    s3cmd put --mime-type='text/html' 2023.htm s3://www.staroceans.org/2023.htm
    

六月三日 等待变化等待机会

  1. 《虞美人》--归去来兮
    
    斗转星移十余载,
    等闲识沧海。
    和平年代忧战危,
    昔日列强如今累卵堆。
    
    茅舍广厦身外物,
    只要保心初。
    敢问天地有多宽?
    去看今夜星河浪花翻。
    

六月十日 等待变化等待机会

  1. 我一开始期待使用gdb跟踪一下ffmpeg来看看mpegts的parsing为什么识别了字幕的timed_ID3但是后来字幕没有被下载的问题,可是这个需要先学习它的结构,这个又是一个复杂的问题。

七月六日 等待变化等待机会

  1. 口占一绝
    
    海外漂泊久,
    日夜增乡愁。
    今日归乡梓,
    举杯斥方酋。
    

七月十八日 等待变化等待机会

  1. 《无题》
    
    残月挂天边,
    街灯照眼前。
    海面平如镜,
    平明刚入眠。
    
  2. 《无题》
    
    久居海外思故乡,
    回乡要跨太平洋。
    忽然一日归故里,
    边海小城胜苏杭。 
    

七月二十一日 等待变化等待机会

  1. 《无题》
    
    人说白发源于忧,
    惊见白鹭满身愁。
    从来忧愁存心上,
    哪有心忧搔白首?
    
    这是受启发的源头
    菩萨蛮·金陵赏心亭为叶丞相赋
    宋·辛弃疾
    青山欲共高人语。联翩万马来无数。烟雨却低回。望来终不来。
    人言头上发。总向愁中白。拍手笑沙鸥。一身都是愁。
    
  2. 早上锻炼,看消息北约准备拉日本加入有感
    《如梦令》----看北约意欲东扩亚洲
    
    北约东亚云集,
    战败不改脾气。
    媒体同声曰:
    美帝依旧单极。
    可惜,可惜!
    神州崛起无敌!
    
  3. 潮平海天阔,
    心正浩气多。
    海礁历练久,
    璞玉更需硺。 
    

七月二十九日 等待变化等待机会

  1. 超强台风和厦门擦肩而过,早晨起来散步遭大雨淋头,看着街道上被齐根拔起的大树压弯了护栏有感而发:
    台风过后狼藉地,
    骤雨浇身落汤鸡。
    海外漂泊二十载,
    观局烂柯1一盘棋。
    
    1:烂柯人这个典故应该源自于一则奇异传说,大体讲的是:一个樵夫进山中砍柴,半路中看到两个神仙下棋,便驻足观看。待棋局结束,樵夫发现自己砍柴的斧头已经烂掉了,下山回家发现家乡物是人非,自己认识的人已死了很久。

八月一日 等待变化等待机会

  1. 爬山时候想到一个上联:湖边古月照湖水。

    这里古月为胡,湖边有水,胡水为湖。下联还是不太容易对吧?

    想了很久有一个不工整的下联:侍旁寸土立侍人。
  2. 因为《罗刹海市》大火,我凑热闹买了《聊斋志异》温习功课。第一篇《考城隍》里有一句:有心为善,虽善不赏;无心为恶,虽恶不罚。这个让我颇为感触。这个是司法实践的理想还是原则?比如西方社会每每遇到犯罪嫌疑人辨称有精神疾病而逃避法律制裁,而一大堆的名流精英为了所谓的出名或者简单的政治正确而热衷于慈善,这些是否应该予以税收的奖励?前者符合无心为恶,虽恶不惩的原则,后者违背了有心为善,虽善不赏。这应该如何抉择呢?
  3. 聊斋里的那句诗很不错:有花有酒春常在,无烛无灯夜自明

八月二日 等待变化等待机会

  1. 电源管理是一个远比我想象的复杂,这里的大侠说:
    This is highly dependent on hardware. Most laptops at the hardware level, will not allow you to stop charging the battery. LION batteries actually benefit from a small uncharge - recharge cycle, and most laptops will have that cycle built in at the hardware level.

八月五日 等待变化等待机会

  1. 这里有一个关于lambda的例子,我看的烧脑。 这里是运行的例子。首先,vglambda是一个lambda,并且返回一个lambda,它本身需要一个lambda作为它的参数,可是它返回的lambda需要的参数是一个parameter pack,所以,q是一个返回的lambda,这个lambda本身不再需要参数了,因为它已经把参数固化到内部的传入的lambda了。我感觉我的CPU要被烧爆了。

八月十五日 等待变化等待机会

  1. 雨霁云开天复明,
    风吹湖皱水波兴。
    搜肠索句又一载,
    不吐不快笔不停。
    

八月十八日 等待变化等待机会

    和chatGPT联合创作
  1. 玄夜凄风却倒吹,
    寂寞夜色待闷雷。
    孤灯独照离人影,
    两地同心盼早归。
    
  2. 昨夜西风断续吹,
    孤魂陌路载酒回。
    寒夜漫漫无尽路,
    怯扰良宵不扣扉。
    
  3. 今夜无语问苍天,
    颠沛流离又一年。
    思前想后难决定,
    愁肠百结寄笺篇。
    
  4. 锦被不耐四更寒,
    相思整夜泪伴眠。
    思念如潮涌心海,
    岁月往事树藤缠。
    

八月二十日 等待变化等待机会

  1. 游园博苑有感
    兴起游园趁天阴,
    淡云轻风海不惊。
    行到水穷看云起,
    坐待日落听鸟鸣。
    
  2. 早晨起来打算去游园博苑,天降细雨,甚乐!
    鹭岛清晨细雨菲,
    牛毛蛛丝漫天飞。
    相思仰面承甘露,
    合欢舒展开心扉。
    
  3. 坐鼓浪屿轮渡有感
    
    云淡风轻扬,
    海平水波荡。
    今朝游鼓浪,
    心底多舒畅!
    
  4. 风雨未至湖水平,
    乌云压顶鸟不惊。
    人道今日大风雨,
    我欲行山听海音。
    
  5. 游鼓浪屿后记
    
    重游鼓浪观沧海,
    德记海滩看日出。
    深巷曲折斜阳静,
    古宅落寞墙草疏。 
    
  6. 登山海歩道回归角望海上迷雾有感
    
    人道海上有仙山,
    烟波浩渺无人识。
    坐待疾风散迷雾,
    红日当空一望知。
    
  7. 合欢最惜春宵刻,
    相思常怨离人错。
    孤直凛凛不老松,
    傲立山巅白云遏。
    
  8. 东山好风光,
    湖面风最凉。
    蜿蜒步行道,
    恰似水中廊。 
    
  9. 湖边古月照今人,
    离别愁绪诉冰轮。
    今古同尝愁滋味,
    时代阻隔胜商參。 
    
  10. 雨中绕筼筜。
    晴日游鼓浪。
    何惧风和雨。
    四季都可赏。 
    
  11. 游鼓浪屿后记
    
    夏日轻舟登鼓浪,
    故地重游忆往昔。
    深巷不期游人至,
    空滩只与海潮期。
    老宅墙草稀稀立,
    古榕须根密密织。
    兴尽返家回头望,
    一角红楼绿树依。
    
  12. 老爸视角的游鼓浪屿后记
    
    重游鼓浪觅儿迹,
    德记海滩游泳初 。
    深巷曲折捉迷藏,
    古宅落寞墙草疏。
    
  13. 游鼓浪屿后记
    
    朝云红日碧海渡,
    一片红楼万绿出。
    深巷曲折斜阳静,
    古宅落寞荒草疏。 
    
  14. 香花彩蝶惜,
    古树芳草依。
    凛凛孤直松,
    自在石中立。
    
  15. 赞山海步道
    
    山海飞长龙,
    蜿蜒绕长风。
    盘旋接古道,
    傲立伴劲松。
    
  16. 老爸的忆往昔
    《西江月》--忆居鼓浪屿
    
    领馆洋楼旧容,
    人民天地新生。
    鼓浪屿优美风景,
    饮誉世界闻名。
    
    闲来海里游泳,
    忙去工作奋争。
    居无定所四年整,
    任它苦乐不惊! 
    
    我的看今日
    《西江月》--重游鼓浪屿(多谢老刘斧正)
    
    鸣蝉最喜长夏,
    修竹偏爱劲松,
    相思合欢伴古榕。1
    花开还看金凤。2
    
    黄沙一片依旧,
    白发几根不同,
    儿时记忆无影踪。
    回首人生如梦。
    注1:鼓浪屿随处可见相思树,合欢树,以及树龄逾百的古榕树
    注2:指凤凰树,又名金凤,花开十分红艳 
    

八月二十二日 等待变化等待机会

  1. 观山海步道
    
    龙盘入云台,
    峰转天地开。
    风吹愁雾散,
    一望沧海来。
    
  2. 观山海步道
    	
    曲径通幽台。
    花径为谁开?
    登临观沧海。
    才知故人来。
    
  3. 观卧石
    
    卧石睡山巅,
    人道才入眠。
    回首观沧海,
    波涛已千年。
    
  4. 观青松
    
    身正影更直,
    气节为人师。
    傲立千百年,
    名节常入诗。
    
  5. 观竹
    
    有节方自高,
    虚心身不飘。
    夏日叶婆娑,
    寒冬迎风傲。
    
  6. 七夕节前游盼归塔
    
    盼归塔前盼回归,
    相思树下说相思。
    离人最恨月圆夜,
    牛郎织女盼七夕。
    
  7. 步道小景
    
    云淡风从容,
    蝉噪鸟无声。
    路转峰回处,
    一望景不同。
    
  8. 步道小景
    
    满眼苍翠绿,
    花开一点红。
    人生起起落,
    四季有枯荣。
    
  9. 步道小景
    
    山有树增色,
    鸟为林添音。
    行山我自乐,
    小诗畅我心。
    
  10. 步道小景
    
    花香才引蝶,
    竹直因有节。
    无心为恶戒,
    有意作恶绝。
    
  11. 步道小景
    
    总道云有意,
    日日向山依。
    一日大风起,
    杳杳无踪迹。
    
  12. 看统一
    
    大道有玄机,
    万物终归一。
    千古悠悠事,
    尽在一盘棋。
    
  13. 看统一
    
    莫说我心非你心,
    人间正道同此理。
    自古人心盼正朔,
    哪有中华不统一?
    
  14. 看统一
    
    分分合合不可期,
    偏安一隅无生理。
    聚大吞小属常态,
    螳臂挡车成粉畿。
    
  15. 观云
    
    总道云有意,
    日日向山依。
    一日风吹散,
    相聚还有期。
    
  16. 行山海
    
    山有树长依,
    湖有鱼常栖。
    我行山海道,
    只与云相期。
    
  17. 东山水库
    
    白鹭凫水向湖栖,
    密林深处有人居。
    花径不扫无常客,
    柴扉已朽人不知。
    
  18. 观云
    
    总道云有意,
    特爱向山居。
    纵使风吹散,
    相聚还有期。
    
  19. 观山
    
    我欲向山居,
    山云不可矣。
    我等凡夫子,
    何曾真皈依。
    
  20. 有风来
    
    风从何处来?
    云散为谁开?
    我欲乘风去,
    不识琼宇台。
    
  21. 好逍遥
    
    我行步道诗几篇,
    东芳山庄长凳眠。
    清风送爽不思动,
    自在逍遥胜神仙。
    

八月二十七日 等待变化等待机会

  1. 我观山海步道桥如蟠龙娇妖翱翔于山岭
    《十六字令--桥》
    
    桥,
    娇妖盘旋冲九霄。
    仰天啸,
    群山竟折腰!
    
  2. 之前钗头凤词牌格式不对,赶紧改,感觉很草草:
    《钗头凤》--填词
    
    心中构,
    笔下有,
    佳句妙语天上求。
    有沉默,
    有转折,
    几多思索,
    几多雕琢,
    磨,磨,磨。
    
    屎尿多,
    藏污垢,
    贾氏父女真下作,
    一丘壑,
    够猥琐,
    自甘堕落,
    如此龌龊,
    堕,堕,堕。	
    
  3. 《钗头凤》--曾记否
    
    曾记否,
    常聚首,
    觥筹交错向天吼。
    长思索,
    为什么?
    一无所有,
    终日奔波,
    错,错,错。
    
    赴异国,
    成异客,
    二十载漂泊蹉跎。
    人生半,
    回乡转,
    几多相聚,
    几多离散,
    烦,烦,烦。
    
  4. 《钗头凤》--思念久
    
    思念久,
    白了首,
    故乡山水哪里有?
    趁今夜,
    船儿月,
    长风一勒,
    风驰电掣,
    乐,乐,乐。
    
    思不得,
    心忐忑,
    异乡异国为异客。
    回乡切,
    近乡怯,
    喜怒哀乐,
    向谁宣泄?
    别,别,别。
    
  5. 由于众所周知的原因必须改:
    《清平乐》--看世界
    
    风云变幻,
    有一间客栈。
    昔日兄弟兵戎见,
    大哥阴谋浮现。
    
    全力对弟围攻,
    鹰犬爪牙跟风。
    小弟沉着应对,
    看谁能与争锋?
    
  6. 由于众所周知的原因必须改:
    《清平乐》--看世界
    
    风云变幻,
    全球格局变。
    世界经济都打乱,
    各国忙着备战。
    
    霸道经济中空,
    困兽四处行凶。
    白兔成竹在胸,
    放手一搏对攻。
    
  7. 由于众所周知的原因必须改:
    《清平乐》--无题
    
    死生看淡,
    谁不服就干。
    世界人民都惊叹,
    死人不过百万。
    
    昔日道义巅峰,
    今日遍吹东风。
    借债从不发愁,
    坐待海啸山崩。
    
  8. 保存一个版本吧。

八月三十一日 等待变化等待机会

  1. 白鹭洲赞
    
    青青白鹭洲,
    白云碧水流。
    欲寻芬芳处,
    行过小桥头。
    
  2. 观厦门海沧大桥有感
    
    天降火屿1厦海分,
    一桥飞架锁厦门。
    海沧2桑田经沧海,
    天工神笔今日闻。
    注1:火烧屿是横亘在厦门与海沧之间的一个无名岛,厦门大桥经此连接厦门和海沧。
    注2:海沧区位于厦门本岛西面,是岛外距离厦门本岛最近的一个区。
    
  3. 海湾公园夜景有感
    
    (一)
    前朝星辰今夜明,
    天边电闪无雷鸣。
    风暴将至胸臆塞,
    湖边古月照我行。
    (二)
    昨夜星辰今夜明,
    电闪无声风却凝。
    无边夜幕无边路,
    湖边古月照我行。
    (三)
    玄夜繁星风自停,
    眺望海沧1灯火明。
    万籁俱寂无心睡,
    湖边古月照我行。
     
    注1:海沧区和厦门岛隔海相望。
    

九月一日 等待变化等待机会

  1. LLVM发来战报说我以前提的一个bug已经在版本15就解决了。注意这里的static_assert失败是正确的,因为两个矛盾的static_assert必有一个是失败的。而之前clang之所以错误是它对于两个矛盾的static_assert置若罔闻,不置可否显示它并不明白其中的对错。至于GCC么差的就很远了,我估计几年内都不一定会去修改。似乎clang vs GCC的胜利局面已定了?
  2. 这是一首想象中的汉朝铁骑征服匈奴的行军图。
    汉军出塞图
    
    日暮关山渺,
    月出惊飞鸟。
    铁骑映雪行,
    马嘶接吹角。
    
    结果我用。chatGPT生成一幅画,你猜是怎么样的?双头六腿马。
  3. 散步白鹭洲
    
    信步白鹭堤,
    绕湖到日西。
    微风挥汗去,
    碧水泛涟漪。
    
  4. 哪怕是更复杂的例子clang也是游刃有余的,其中的警告我懒得修改了,因为在语法上讲当然要有返回值,可是我仅仅是需要一个类型,并不想在类型定义的时候使用lambda来定义它如何实现。

九月四日 等待变化等待机会

  1. 一日行山海步道恰遇急风骤雨。
    雨中偶得
    
    风急雨骤迎面浇,
    扶栏暂立观海潮。
    波涛汹涌千万里,
    傲立不倒大海礁。
    
  2. 一日走完山海步道在回家的BRT车上听到各个车站名偶得
    回家小记
    
    日暮回家单程票,
    人道正过龙山桥1。
    心中才想题金榜2,
    轻车已然到文灶3注1,2,3:都是厦门BRT公交车站名,分别是龙山桥站,金榜公园站,和文灶站。
    

九月六日 等待变化等待机会

  1. 早上台风还未离去,阴云密布,看高楼耸立云端有感。
    《十六字令•楼》
    
    楼,
    刺破云霄意未犹。1
    低头看,
    白云一把收。 
    
    注1:我问老刘刺破改为直冲如何?老刘曰:不好!刺破才能低头看。我深以为然。老刘真乃我诗友也。
    
  2. 随后大雨倾盆,奔跑至亭中避雨偶得。
    《如梦令•今早出门不久》
    
    今早出门不久,
    突遇瓢泼雨骤。
    淋成落汤鸡,
    却道洗衣不够。
    等候,
    等候,
    躲雨全身发臭。 
    
  3. 圣何塞爬山的群主发出爬山号召令,结果有成员报告右腿疼,戏作一首:
    《如梦令•群主号令不久》
    
    群主号令不久,
    却道腿痛在右。
    爬山就腿疼?
    难道昨夜小酒?
    借口!
    借口!
    莫做拄杖老叟! 
    

九月七日 等待变化等待机会

  1. 	
    忆鼓浪屿
    
    小径无人风自停,
    熟人过路鸟不惊。
    黄沙白浪夏蝉噪,
    相思合欢伴我行。
    
  2. 	
    记昨日大雨倾盆
    
    瓢泼大雨浇不停,
    有雨无风心不惊。
    筼筜湖畔风景秀,
    人在画中我独行。 
    
  3. 	
    筼筜湖即景
    
    天阴云脚低,
    湖平倒影晰。
    绿草接碧湖,
    白鹭凫水栖。

九月十三日 等待变化等待机会

  1. 	
    参观重庆动物园金鱼馆有感
    
    荷叶亭亭立,
    廊桥款款曲。
    人在亭中坐,
    金鱼桥下栖。
    
  2. 	
    看犀牛有感
    
    自古英雄比熊犀,
    钢筋铁骨一身皮。
    不怕蚊蝇不怕热,
    全赖身上一层泥。
    
  3. 	
    忽然之间
    
    露从昨夜白,
    忽忆圣何塞。
    他乡非故乡,
    漂泊十二载。
    
  4. 	
    忽然之间
    
    露从昨夜白,
    昨夜不再来。
    抬手发微信,
    问君在不在?
    
  5. 	
    无题
    
    昨日来陪都,
    恰好逢白露。
    沧海添一粟,
    人生走一步。
    
  6. 	
    口占一绝
    
    五光十色洪崖洞,
    游人如织车如龙。
    千里人间同一夜,
    这里风光大不同。
    
  7. 	
    慨叹重庆网红打卡地洪崖洞
    
    洪崖观景十一台,
    层层不同有心裁。
    天然地势无可比,
    人气商圈靠人栽。
    
  8. 	
    静夜思
    
    露从昨夜白,
    新月谁剪裁?
    人去月犹在,
    月来人不来。
    
  9. 	
    《丑奴儿》
    
    年少不识个中味,
    不肯低头,
    不肯低头。
    总道宁死毋自由。
    
    海外漂泊二十秋,
    夫复何求?
    夫复何求?
    开口言愁自觉羞。 
    

九月二十日 等待变化等待机会

  1. 	
    游泳池述怀
    
    艰难困苦多愁绪,
    颠沛流离少安居。
    山高林密鸟飞尽,
    路远草深人行独。
    人生百年三万日,
    再多一世也不足。
    余生再驱八万里,
    人问便道子非鱼。
    

九月二十二日 等待变化等待机会

  1. 	
    我爱华为
    
    惊鸿一瞥找有年,
    友来又去受熬煎。
    一人敌十亮匕首,
    两肋长刀才出肩。
    

九月二十九日 等待变化等待机会

  1. 	
    最爱筼筜行不够,
    榕树荫里白鹭洲。
    待到晚间微风起,
    镜湖映月游人稠。
    
  2. 	
    不知所云
    
    月到中秋分外明,
    筼筜灯火掩群星。
    游人放歌扰白鹭,
    镜湖鱼龙跃水精。
    
  3. 	
    中秋未至月未圆,
    四海不靖寝难安。
    佳节何须佳人伴,
    家有糟糠亦婵娟。
    

十月三日 等待变化等待机会

  1. 	
    筼筜湖畔行
    
    白鹭洲畔白鹭飞,
    筼筜湖里鱼虾肥。
    蓝天碧水白云日,
    流连美景无心回。
    
  2. 	
    秋日行
    湖平心胸阔,
    天蓝意气高。
    云白观湖影,
    风劲听海潮。
    
  3. 游南山禅寺
    
    旗旛风曳心未动,
    江流水转意难从。
    喝云1何须矜卓尔,
    餐风却要证从容。
    
    注1:喝云乃是禅宗一派,南山禅寺是其发祥地。故而有“喝云斋”

十月四日 等待变化等待机会

  1. 抖音上看到成千上万的游人骑骆驼游敦煌彷佛古代西征大军不禁有感而发
    	
    昨夜才闻西征令,
    今早万驼向西行。
    丝路曲折路漫漫,
    不到敦煌誓不停。
    

十月八日 等待变化等待机会

  1. 中秋一过天气就凉爽起来了,不禁有感而发
    	
    飒飒秋风不觉寒,
    悠悠白鹭凫水闲。
    晦暗浑噩又一日,
    了却残生每一天。
    

十月十六日 等待变化等待机会

  1. 	
    捣练子
    
    杏林湾,棕榈滩,
    水秀广场水韵园。
    长廊通幽伞盖路,
    隔海相望园博苑。
    

十月十七日 等待变化等待机会

  1. 友人陪同游览虎溪岩寺,这才明白这个虎溪大有来头。
    佛门传说,虎溪在庐山东林寺前,相传晋僧慧远居东林寺时,送客不过溪。一日陶潜(陶渊明)、道士陆修静来访,与语甚契,相送时不觉过溪,虎辄号鸣,三人大笑而别。后人于此建三笑亭。
    所以,才有三笑岩,就是记录这个佳话。
    	
    谢兄台昨日相伴游览虎溪岩寺
    
    昨日相陪过虎溪,
    今朝又临鸿山寺。
    无虑云深不识路,
    登顶偏爱此山低。
    
    后来我们讨论认为闽南的禅宗似乎受江西影响很大,也许是徒子徒孙流传过来的。
  2. 老布说鸿山寺非常的商业化,大门开在马路边,甚至为了香客方便安装电梯,完全没有了同年的记忆模样。
    鸿山寺记忆
    
    儿时记忆鸿山寺,
    藏在陋巷人莫识。
    修行本应居绝顶,
    为求香火愿山低。
    
    老布改了改:
    儿时记忆鸿山寺,
    藏在陋巷人莫识。
    修行何必居绝顶,
    但求大众有山梯。
    
    我说所谓的山梯又高又陡而烧香拜佛之人大多数是年老体病怎么爬的上去呢?老布说那就电梯吧。
    儿时记忆鸿山寺,
    藏在陋巷人莫识。
    修行何必居绝顶,
    普度大众有电梯。
    
    鸿山寺怎么看都不像是禅宗清修之所在
    送客岂能过虎溪?
    不居绝顶难修习。
    为求香火开别殿,
    佛祖背后财神逼。
    

十月二十三日 等待变化等待机会

  1. 筼筜湖赋(抄录于筼筜湖边)
    
    少怀凌云志,
    乐水欲展翅。
    咏离骚兮洛书河图,
    钓文王兮赤壁怀古。
    碧水芳洲地,
    风云际会处。
    一湾筼筜水,
    处处筼筜竹。
    一框筼筜景,
    几曲筼筜赋!
    
    鸿蒙开兮地牛负,
    燕山动之中生代,
    钟宅断之侏罗纪,
    筼筜湾接九龙注。
    嘉禾穗丰年受土,
    筼筜渔火岁月古。
    一船一灯摇曳明灭,
    名列八景繁星垂暮。
    客航凤屿外,
    沽酒盐田埔。
    波镜港湾阔,
    风正一帆桴。
    岁月新兮港变湖,
    浮屿筑兮连东渡,
    围海成兮余雍沪。
    于是乎,
    泱泱神州兮闽南有岛,
    离离鹭岛兮岛中有湖,
    渺渺碧湖兮湖内有洲,
    湖名筼筜,
    洲称白鹭。
    
    噫乎!
    筼筜秀色,
    世界惊殊,
    鹭岛三绝,
    宜旅宜住。
    晨曦旭日,
    晓桥紫雾。
    格外远岫,
    问晴启户。
    扁柏荫浒,
    绿藤绕筑。
    潮来澎湃入闸,
    清浊云影留,
    咸淡风声附。
    晌午蝉虫,
    鸣畔雁凫。
    忽闻闷雷,
    疏林凉风,
    虚云凝霄,
    烟雨倾覆;
    须臾放晴,
    清气朗海天,
    彩虹耀江渚。
    暧暧狐尾山,
    依依绿波洑。
    远眺斜桥横空,
    仰望银鹰划弧。
    秀色岂止可餐,
    彩霞缀锦荟鲈。
    水上广场爱心牵手,
    音乐公园侣影飘馥。
    
    呜呼!
    西堤二三里,
    别墅八九处,
    落叶织金凤凰木,
    盖伞阴绿梧桐树。
    池鱼归渊,
    鹭恋故土。
    最爱夕阳下,
    堤头观白鹭。
    红日近,
    白云孤。
    厦门新开埠,
    湖畔多掌故。
    江头问渠,
    湖心筑岛,
    引来绿水还湖。
    曲径携侣,
    书院斟酌,
    指点世界拼图。
    筼筜美景,
    可思可忆,
    鹭岛故事,
    可歌可诉。
    华灯上兮,
    湖光惊艳,
    银河西流,
    环湖画幅。
    觅得新钩月,
    咖啡暖小屋。
    几许绿意浸初心,
    一片冰心入玉壶。
    水瀑垂帷,
    星汉为幄,
    说寰宇景福,
    论海峡通途。
    
    善耶!
    南国钟灵秀,
    白鹭女神驻,
    心地徘徊不忍去,
    天上人间醉几度!
    颂曰:
    潜有多鱼兮,
    西雍振鹭;
    天地一绝兮,
    惟此佳湖!
    
    林光纪 二〇二〇年秋	
    

十月二十六日 等待变化等待机会

  1. 突然发现国产的昆仑固件部分开源了,当然是所谓的openBMC部分,原本这个就是FB开源项目吧?作为一个门外汉我只有编译的能力,而且我对于yocto/bitbake始终停留在闻其名不知其义的地步。不管怎样编译看看。作者测试的平台是ubuntu14.04,我在Ubuntu22.04需要额外安装lz4因为抱怨的是lc4c这个包找不到。此外,bitbake里抱怨gitee.com下载使用ssl有问题,我看到作者之前是使用https,我就又改回去了(meta-phosphor/recipes-phosphor/webui/webui-vue_git.bb)。这个也许是不必要的,因为后来我发现我的git://都不成功,我不知道怎么设置,只能使用git config来替换url,但是这个问题不解决总是会有问题的。
    
    . setup feitenge2000 
    bitbake obmc-phosphor-image
    
  2. 国内诸事甚好唯有防火墙严重制约开发人员,虽然专业公司使用VPN不是问题,可是对于一般人来说实在是一种烦恼,为什么连github.com都要封禁呢?最后我发现了一个所谓的gitclone.com,于是把openBMC项目中所有的github.com都替换为了gitclone.com/github.com
  3. 替换网址之后我才发现gitclone.com有三种推荐方法,替换url是最后一种办法。
    
    // 方法一(设置git参数)
    git config --global url."https://gitclone.com/".insteadOf https://
    git clone https://github.com/tendermint/tendermint.git
    // 方法二(使用cgit客户端)
    cgit clone https://github.com/tendermint/tendermint.git
    // 方法三(替换URL)
    
    F:>git clone https://gitclone.com/github.com/tendermint/tendermint.git
    Cloning into 'tendermint'...
    remote: 对象计数中:67188,完成.
    remote: 压缩对象中:100%(19987/19987),完成.
    remote: Total 67199(delta 45743),rouned 66648(delta 45294)
    Receiving objects: 100%(67188/67188),66.04MiB | 1.29Mib/s
    Resolving deltas: 100%(45/43/45/43), done
    
    
  4. 这里又是一个基本的常识就是git protocal的设置问题:它需要开放9418端口。 我发现无法解决,于是采用url替换在git config里是最方便的:
    
    git config --global url."https://gitclone.com/".insteadof git://gitclone.com/
    
  5. 这个修改更加的普遍,但是我不理解第二步是怎么回事:
    shell中执行git config --global --edit打开git配置文件,添加如下内容

    [url "https://"]
      insteadOf = ssh://
    [url "https://"]
      insteadOf = git://
    

十一月四日 等待变化等待机会

  1. 最爱筼筜湖畔行,
    坐看银鱼跃水精。
    白鹭不理凡间事,
    傲立镜湖修禅心。
    
  2. 遥想晨雨筼筜湖
    
    叶绿花更娇,
    雨微径自悄。
    银鱼跃湖面,
    白鹭掠树梢。
    

十一月九日 等待变化等待机会

  1. 我当初提的gcc的bug我现在几乎完全看不懂。这个真的是令我绝望了。我已经差不多半年没有写过甚至看过一行代码了。
  2. 我无意中整理以前微信收藏的文章,我唯一能看懂的就是我和作者一样非常的抵触Logical Volume

十二月十日 等待变化等待机会

  1. 筼筜湖散步有感
    
    水浅鱼自现,
    夜深月更明。
    人生恒有信,
    苍天也有晴。
    
  2. 无题
    
    孤山本无意,
    闲云偏来依。
    块垒藏胸次,
    风吹身难低。
    
  3. 无题
    
    闲云岂有意?
    清风怎可依?
    唯有垂杨柳,
    总是在湖堤。
    
  4. 处变不惊
    
    天道渺渺未可知,
    人生漫漫路常迷。
    生逢变世何所似?
    一片闲云半山依。
    

十二月十三日 等待变化等待机会

  1. 读书是最好的暴露自己无知的手段。我曾经以为学习了二十年c++总该略知一二吧,结果看祖师爷Bjarne Stroustrup《C++ Programming Language》,每读一页我就惶恐一次,不敢说醍醐灌顶有所领悟,但绝对是震聋发聩一般的当头棒喝!大师对于自己创立的语言真的是字字珠玑般的拆解,每一个例子甚至每一段话每一行注释可能都是呕心沥血的真言。

十二月十六日 等待变化等待机会

  1. 你对于模板函数resolve究竟理解多少呢?一试就知道。 为什么出错?参数的类型是要匹配的,这里的参数类型 已经被具体化为一个函数指针,它当然无法匹配模板函数里的参数,因为这个参数也是一个模板类型。这个纯粹就是画蛇添足,因为正确的做法往往是最简单的, 你不必担心编译器推理类型。这个是可以的。注意到大师在书里的例子里特别注释说参数必须要给出模板参数,因为编译器对于函数参数是模板类型的话是不做模板参数推理的。也就是说,这个是通不过的。
  2. 今天实际上学到的一个最实用的知识点是模板类型里如果有模板参数,你需要给出它的模板类型的所谓的框架,就是说它的参数需要的是个数而不是具体的类型。比如: 这里我们定义了一个模板参数F,它本身也是一个模板类型,并且我们指定它只有一个模板参数,这里我们无需为它的模板参数命名,因为它就是一个所谓的placeholder,指明了个数而已。
  3. 在我尝试模板函数重载失败之后我才意识到如果使用模板类就不存在刚才的问题了,这里的两个模板函数究竟选择哪一个呢?答案是更加specialization的那一个。因为这个一般性的模板函数 不如上面那个更加的特殊化。所以,当模板函数的参数是一个模板类,或者说是一个模板的functor的话函数匹配就是我们预期的更加特殊化的情形。我的体会是当模板函数的参数也是一个模板函数的时候,编译器首先拒绝自己去作模板参数化的动作,其次,如果你给作为参数的模板函数参数化之后,这个参数就变成了一个普通函数指针,这个时候它就是只能匹配一个普通的类型,而如果你画蛇添足的在最初的模板函数里把参数定义为你期待的模板函数的话,编译器反而无所适从说找不到匹配,因为参数已经使得从抽象变成了具体,现在想再从具体变回抽象是来不及了。而作为functor的模板类则不然,它始终就是完整的保存着作为一个类型,那么它是可以帮助编译器识别谁是更加specialization的匹配。 所以,这里的点就是使用functor,而不是使用模板函数作为你的参数。因为前者是会保存你的作为类型的所有信息,而后者一旦作为参数就立刻要具象化的变成一个普通的函数指针类型。比如 这个模板函数如果被作为参数来传递,你必须指明它的模板参数,也就是说你不说明参数是half<int>的话,编译器拒绝作推理,这一点包含了作为参数的模板functor,参数必须明确。但是一旦这么作了,前者就蜕变为了一个失去了模板函数特征的普通类型比如就是一个具体的函数指针:int (*)(int),而后者却依旧保留着作为模板类的所有类型信息,这个就是关键的部分。

十二月十八日 等待变化等待机会

  1. 读祖师爷的书应该是一种享受,因为老头子不单是在给你上课更是用令人信服的具体例子来征服你的思想。比如一个老生常谈的问题几乎就是人人都会遇到的:如何使用lambda来作为容器的比较函数参数呢?大师是基于c++11的旧体制给出的答案是利用lambda无缝隙转为函数指针的方式在容器的constructor里传递: 你一定已经注意到了我尝试初始化容器数据的无效努力了吧?因为我是基于更新版本的标准使用decltype的新能力做到的 这里lambda是作为一个类型来定义容器的类型的,这个好处就是你可以腾出constructor来初始化数据,这个对大多数人是一个无用的好处。

十二月十九日 等待变化等待机会

  1. 祖师爷问了一个简单的问题,结果证明我答不上来。比如你要定义个最普通的模板容器,而你的考量是对于指针类型和非指针类型要作不同的实现,那么你要怎么使用specialization来分类实现呢? 然后呢?这里我就将信将疑不知道如何去作了。首先是所谓的complete specialization就是具体的类型给足了去做 但是这么作过于具体了,如果是其他类型的指针难道你要每一种都做吗?所以,这里引入了所谓的partial specialization 这里首先是不使用不带任何参数的模板标识<>因为那个是之前的complete specialization,它完全不需要任何类型参数了,因为是完全具体的一个类型的特例化。而这里我们还会i依赖于模板参数类型的特例化。其次,我们必须要在模板类里明确的指出它的类型参数,这里就是Vector<T*>,再者,祖师爷使用继承,我只是示范没有这个需求了。总之,模板特殊化是非常考验能力的领域。我一开始还想使用concepts来限制,发现其实似乎不用吧?
  2. 闲居有感
    
    筼筜柳前乘风去,
    五老松下对云居。
    风云变幻战云密,
    天竺岩寺我观鱼。
    
  3. 
    厦门历史上有大八景、小八景、景外景之设。最早刊载“鹭门八景”的是薛起凤编纂的《鹭江志》,成书于清乾隆三十一年(1766年)。“鹭门八景”均有绘图,由蒋国梁配七绝各一首,林兆鲲配诗词各一首。
    
    《洪济浮日》
    
    荒台有石绕藤萝,
    古洞长留云雾多。
    午夜行吟登绝顶,
    遥看红日浴清波。
    
    《筼筜渔火》
    
    万顷筼筜水接天,
    夜来渔火出云烟。
    辉煌千点官浔外,
    明灭三更凤屿前。
    
    《阳台夕照》
    
    阳台山势独危然,
    隔尽狮山半壁天。
    最爱夕阳无限好,
    胜他云雨说当年。
    
    《万寿松声》
    
    片瓦禅堂隐薜萝,
    龙鳞更喜老松多。
    不知鼓在松枝上,
    只道空中骤雨遏。
    
    《虎溪夜月》
    
    石势稜层结化城,
    东林胜概旧知名。
    寻常一样天边月,
    尺在藤萝分外清。
    
    《鸿山织雨》
    
    两山相夹势斜欹,
    来往纷纷客路岐。
    风雨骤来南又北,
    宛然织女弄机丝。
    
    《五老凌霄》
    
    五老峰高插碧霄,
    悬崖石壁亦岧峣。
    为钟为鼓音长在,
    猿鹤沙虫已寂寥。
    
    
    《鼓浪洞天》
    
    纵横四里环沧海,
    石洞开时别一天。
    鸡犬桃花云水外,
    更从何处问神仙。
    

十二月二十六日 等待变化等待机会

  1. 盛宴小记
    
    当年毕业后,
    今日才相见。
    闻名忆旧容,
    依稀似当年。
    珍馐配玉液,
    盛宴逢圣诞。
    宴罢道珍重,
    出门月正圆。
    
  2. 把之前的改了一句。
    闲居有感
    
    筼筜柳前乘风去,
    五老松下对云居。
    氤氲闾阎钟鼎地,
    天竺岩寺好观鱼。
    
  3. 读鲁迅旧诗有感,改了一下
    
    血沃加沙肥劲草,
    霜凝黑土发春花。
    戏子政客穷凶恶,
    百姓泪洒噪暮鸦。
    
  4. 也许海边生活着两种不同类型的人。一种称之为i守成者,他们留在海边过着祖祖辈辈传承下的传统的;一种称之为探索者,他们杨帆出海可能历尽疾风险浪,探索了无数蛮荒险恶的异域边疆,当他们终于驾船回到出发的海边家乡时候却不一定满载着满满的收获,也许他们的获得在探索的惊涛骇浪中被当作压舱石被抛弃了以便逃过大风浪的险境,也许他们的探索原本就是一无所获只是在海图成功的标注了一个新的区域,或者更加无趣的是他们只是重复了之前探索者到过的疆域故而在前人已经穷尽的矿洞里发现了已经被淘尽的矿砂,然而当这些探索者面对当初留在海边过着日出而作日落而息的儿时同伴质询的眼光,他们应当如何回答这样一个问题:如果你的探索并没有比留在海边打鱼的同伴获得更多,甚至是更少的收获,那么这种出海探索是否还值得后人效仿,或者你是否能够回答一个直面的问题这是否值得?

    也许探索者可以尝试着回答,不论我们带回了多少物质的收获,出海探索的人生经历就是一种无比的收获。修改一下看似无关的切瓦拉当年对于南美被解放者的回答似乎也同样有效,如果你们获得了某些收获,不要忘记因为曾经有人离开了这里。


十二月二十八日 等待变化等待机会

  1. 对于concept我有一种错误的观念,就是把它当作一个选择支来使用,虽然它的实现看起来是一个判断得到true/false的那么简单,但是在模板的specialization里却不能使用,因为concept实际上是限制而不是选择支的不同实现,因为在我看来specialization更像是一种分情况的不同实现。比如,我需要一个模板类针对指针类型和非指针类型有不同的实现,那么我作了一个concept 那么我能够使用这两个对立的concept来制作同一个模板类的不同参数吗?比如 这个毫无问题,我指明了我的限制在非指针情况下,然后照猫画虎就不行了,因为一个模板不能定义两次 这样子是不行的,因为编译器认为你定义这个模板类使用了受限制的类型Pointer T指针因为它最初的定义就是类型参数NoPointer T不能是指针。那么这个时候如果我们屈从于一开始的类型参数而尝试specialization呢?也是不行,因为这个是自相矛盾,好比自己打自己的脸 表面上看编译器允许你这么编译,可是一旦实例化你就看到它明确不可以,因为concept是在实例化进行检验的闸口你过不去这道坎:
    <source>:27:16: error: template constraint failure for 'template<class T> requires NoPointer<T> struct Vector'
    27 | Vector<int*> v1;
    | ^
    <source>:27:16: note: constraints not satisfied
    所以,针对以上问题的解决办法是先用最宽泛的模板参数定义一般情况,然后再用concept来specialization 换作浅显的语言就是concept要用在你的specialization而不是一开始就在模板一般参数时候使用选择支,这个也许是非常简单的道理,我还是经过实践才体会到。
  2. 祖师爷有一个例子来说明函数重载的解决的问题,就是说编译器往往会就近解决。比如我们在基类和子类都定义了一个重载了参数类型的方法,那么在调用子类的时候编译器是否会严格的按照参数类型去解决呢? 基类使用int类型, 子类使用double类型参数,然后我们实际使用一下它们: b.f(i);是没有争议的,因为类型和调用的类都是简单明了,关键是derived.f(i);到底是调用基类的方法吗?照理说应该是因为参数类型更加的匹配,但是实际上编译器偷懒了,因为他看到在子类里有一个重载的同名函数参数可以经过转换后使用,这个是合法的。那么怎么来防止这个问题呢?祖师爷给出了很简洁的办法就是使用using这里更加揭示出了类的本质就是namespace 我这里故意把using Base::f;放在子类的最后来显示在namespace里的using是无所谓顺序的,一旦加入namespace就没有办法剔除,这个反而是namespace polution的问题。顺序不是问题,关键是在于参与。这里也同样的揭示了编译器的做法,就是说只有在多个重载的选择都摆在台面上时候才做选择,而如果能够简单经过合法类型转换就达到的就不再去费劲的搜索更加匹配的,这个是合理的,一鸟在手胜过十鸟在林

十二月三十日 等待变化等待机会

  1. 我之前应该是没有安装cuda,或者是没有安装官方版本,至少不是官方默认安装,也许是为了防止版本冲突吧?那么是否应该使用这个官方安装呢?

Smiley face