技术的极限(1): 从编程开始

下一篇: 技术的极限(2): 概念应该基于事实

目录
** 0x01 跨平台C++基础库
** 0x02 windows上的VC包管理器
** 0x03 单文件C/C++库
** 0x04 图灵完备的mov指令
** 0x05 计算机科学自学指南
** 0x06 Android上的终端termux
** 0x07 为什么要用消息中间件(消息队列)
** 0x08 curl on windows
** 0x09 C Data Structures and Algorithms
** 0x0A C++拷贝构造函数和赋值操作符重载
** 0x0B C++ RAII
** 0x0C 古代文献电子化
** 0x0D Google不索引老页面
** 0x0E 扫描隧道显微镜(Scanning Tunneling Microscope, STM)
** 0x0F 如何学习

0x01 跨平台C++基础库

代码bx

发现这个跨平台基础库不错,很简洁的设计和实现,代码风格上使用C++ namespace管理模块。

0x02 windows上的VC包管理器

代码vcpkg

推荐给大家一个windows下管理C++第3方库的工具,微软官方出品,再也不用熬夜装库了,官方源里面的库已经在持续丰富中,C++的包管理器早就应该有了。初学者往往会觉的命令行程序没有界面,觉的不够高大上,学编程的时候一定要奔着GUI程序去,其实无论是在Linux还是Windows上,命令行程序往往是效率的代名词,可以极大的解放开发者或者工具使用者的生产力。Linus最著名的两个作品:Linux和Git,Git就是一个纯命令行程序,改变了全世界程序员的开发方式。所以,如果你学习编程,你应该重视命令行程序。

0x03 单文件C/C++库

代码One file to rule them all, 单文件C/C++库

对于喜欢直接使用源代码依赖,以及最小化库依赖的程序员来说,单文件C/C++库是最合适的选择,这个github仓库整理了许多单文件C/C++库。代码在开发的过程中,一般不会在一个文件里写上所有的代码,在开发中代码的分项目、分模块、分文件夹管理是十分有必要的。程序员日常开发中有一大部分时间在思考如何更好的组织源代码的文件夹结构、文件夹和文件的命名上。但是,以源代码为发布目标的时候,将代码的结果合并到单一文件是一个常见的选择,这样做的主要目的是让代码的发布、使用变的直截了当。

0x04 图灵完备的mov指令

原文mov is Turing-complete

作者Stephen Dolan证明了mov指令是图灵完备的。于是有人(chris domas)从这篇论文的理论出发,实现了只用mov指令的编译器,在这个视频里,chris domas对实现的过程做了详细介绍:movfuscator:youtube ,包括了mov指令如何实现x==y判断、如何做分支、循环;全部用mov指令之后,代码的控制流变的直线型,然后他还进一步把mov的多种变种指令剔除、泛化成一种,最后生成的指令序列超级简洁。这里有墙内的链接 ,项目的github地址是:movfuscator:github

0x05 计算机科学自学指南

原文Open Source Society University

github上有人做了个CS自学指南,包括基础introduce CS, core CS, advance CS, final project, professional CS。看上去比很多计算机科学系的课程设计都好,完全自学这些课程不错。但是完全自学的成本也是很高的,实际上我不只一次见到过这类自学的文档,但是存在一些问题。例如,教程内容什么都有,从基础到高深,但是其实很少有人是真正的“完全自学”,如果他们在设计的时候考虑到这点,能够针对“偶尔自学”,或者针对“任何时候进来插一脚”这类学习需求来编排,那么被实际使用的频率应该会高很多。

这提醒了我们,信息不是收集的越完备越好,而是你要能让人们非常有效率和不带负担的检索、自然的拿起一个卡片来学习。否则,茫茫多的资料,是该点击呢,还是点击呢?技术的极限系列会通过持续的思考这些核心要素来制作!

0x06 Android上的终端termux

步骤

  1. 直接下载这个apk:https://f-droid.org/repo/com.termux_57.apk
  2. 输入help查看内置命令。
  3. 输入pkg install xxx 安装其他命令,例如pkg install git,然后你就可以git clone ...
  4. 安装脚本语言:pkg install lua / pkg install node,然后你就可以进入脚本语言的交互式命令行写代码。
  5. 安装编辑器:pkg install vim,然后可以方便的阅读代码,音量键是ctrl/shift键的作用,可以方便的敲组合键。例如打开vim,输入i进入编辑模式,音量键+c退出,输入:q!强制退出。

0x07 为什么要用消息中间件(消息队列)

以下是我个人的思考结果:

  1. 消息中间件把进程间通信和网络通信的底层细节屏蔽,提供统一的接口。
  2. 自动解决包拼接的问题,tcp是基于单字节的流传输协议,你需要自己做包的encode和parser,并且parser是针对1字节流。消息中间件一般提供基于消息粒度的接口。
  3. 消息中间件提供了一些常用的消息通信模式,例如:发布-订阅模式,广播模式等。这是一个理由。自己写的话,也需要做这些事情,细节还多。通信模式一般伴随着一套协议,例如AMQP协议。
  4. 消息中间件可能会提供持久化的能力,如果你的程序处理不过来,它会在中间提供队列的能力,队列还有一定的持久化策略支持。这提高了系统的可用性和吞吐能力。这个角度上它有点像电容的作用。
  5. 消息中间件提供一个消息的多种传输模式,例如:保证一个包只会被发一次,或者一个包可以发多次等等策略。
  6. 以上这些能力,让你在选择用一台机子多进程(单机多个子服务),或者多台机子多进程(多机多服务),搭建这样的构架的时候,不用解决tcp这层传输 到应用层上述需求之间的那些提供可靠有策略传输的实现细节。
  7. 各种不同的消息中间件的区别在于实现语言、功能侧重、对IO/存储支持上的各不相同。理解清楚为什么要使用消息中间件,就像我们必须理解为什么要用tcp而不用udp一样。

0x08 curl on windows

原文microsoft curls too

一个命令行工具在所有主流操作系统里都支持,这非常不一样,从此它就是默认可用的。可惜了,wget没有同时入选,大概是curl功能上覆盖了wget吧,在没有默认内置之前,很多人更喜欢装wget,因为小巧。

0x09 C Data Structures and Algorithms

代码cdsa

This repository is an ongoing project of implementing generic data structures and algorithms in ANSI C.

这是github上一个纯C的通用数据结构库。如何实现纯C的数据结构实现可以同时阅读 C语言接口与实现 这本书。数据结构与算法是每一个认真的程序员或早或晚都要深入理解的部分,编程从某个角度来说完全体现在对“证明与计算”的理解力上。

0x0A C++拷贝构造函数和赋值操作符重载

这是个C++初学的常见坑,拷贝构造函数和赋值操作符,如果你把这个类当作「值语义」来使用,那么就必须重载这两个。 什么叫做「值语义」?简单说就是你会直接把它的值传入一个函数,或者赋值给另一个同类型变量。与之对应的是,如果你保证只用它的指针,则可以不重载这两个,你用不到。

0x0B C++ RAII

在用C++的话,可以把数据库开始事物(begin transaction)放到构造函数里,把回滚(rollback)/提交(commit)放到析构函数里,这个对象创建和释放的时候,会自动做这两件事,这是C++的RAII(资源创建即初始化)能力保证的,C++保证构造函数里创建的资源一定准备好并可以被所有成员函数使用,同时保证对象生命周期结束之前一定会调用析构函数释放资源。当然不这么写也可以,单独封装一组open/close或者init/uninit方法好了,但是就要保证自己配对调用。

0x0C 古代文献电子化

原文中國哲學書電子化計劃
十分方便查阅,这是个好项目,建议用PC浏览器打开。

“中國哲學書電子化計劃是一個線上開放電子圖書館,為中外學者提供中國歷代傳世文獻,力圖超越印刷媒體限制,通過電子科技探索新方式與古代文獻進行溝通。收藏的文本已超過三萬部著作,並有五十億字之多,故為歷代中文文獻資料庫最大者。 歡迎參閱先秦兩漢、漢代之後或維基區資料庫目錄,或參考系統簡介、常見問答集、使用說明和相關工具。若欲尋找特定著作,可使用書名檢索功能一併檢索本站各種主要原典資料。”

0x0D Google不索引老页面

原文Google Memory Loss

搜索引擎和常用APP的行为正在发生改变。搜索引擎不再提供老页面的索引,这是合理但是不那么友好的事情。音乐APP不再提供精确搜索,而是提供一堆的「XXX 系」音乐,这是合理但是不友好的事情,特别是当你想搜索「儿歌」播放给儿童听,但是搜到的只是「儿歌系」的流行歌一样。这个世界的社交APP和新闻APP被推荐算法占据着,不再以精确的人际关系和主动关注分类呈现。

这样的世界,在悄悄地改变着人们的日常信息流,你注意到了么?

0x0E 扫描隧道显微镜(Scanning Tunneling Microscope, STM)

参考扫描隧道显微镜

原来看到原子的原理这么简单。探测的核心是找到一种方式检测到目标的某种能量波动:

  1. 被动等待目标能量对你的设备起作用,例如Ligo这种大杀器,是守株待兔。
  2. 主动发射某种能量,目标物导致能量波动,从而获得信号,像STM。
  3. 如果对一个种群做跟踪标记,之后再搜集跟踪标记的统计数据,同理。

扫描隧道显微镜的工作原理简单得出乎意料。就如同一根唱针扫过一张唱片,一根探针慢慢地通过要被分析的材料(针尖极为尖锐,仅仅由一个原子组成)。一个小小的电荷被放置在探针上,一股电流从探针流出,通过整个材料,到底层表面。当探针通过单个的原子,流过探针的电流量便有所不同,这些变化被记录下来。电流在流过一个原子的时候有涨有落,如此便极其细致地探出它的轮廓。在许多的流通后,通过绘出电流量的波动,人们可以得到组成一个网格结构的单个原子的美丽图片。

0x0F 如何学习

原文how to study
步骤

  • Introduction
  • Manage your time
  • Take notes in class & rewrite them at home
  • Study hard subjects first & study in a quiet place
  • Read texts actively & slowly, before & after class
  • Do your homework
  • Study for exams
  • Take Exams
  • Do research & write essays
  • Do I really have to do all this?
  • Are there other websites that give study hints?

学习的步骤可以看作是一个迭代程序

WHILE there is a next sentence to read, DO:
  BEGIN { while }
    Read it, SLOWLY;
    IF you do not understand it, THEN
      BEGIN { if }
        re-read the previous material, SLOWLY;
        re-read the incomprehensible sentence, SLOWLY;
        IF you still don't understand it, THEN
           ask a fellow student to explain it;
        IF you still don't understand it, THEN
           ask your Teaching Assistant (TA) to explain it;
        IF you still don't understand it, THEN
           ask me;
        IF you are in an upper-level course & you still don't understand it, THEN
           write a paper about it (!)
      END { if } 
END; { while }

证明和计算是两件不同的事情,总的来说传统数学偏向静态的证明和静态的计算。而程序则偏向动态的计算。

posted @ 2018-02-04 23:42  ffl  阅读(1860)  评论(4编辑  收藏  举报