TheBadZhang's Blog - 编程
type: channel
link: http://www.tbz.io/index.php/category/coding/
items: 凸包（Convex Hull）
items: 线性代数的本质
items: URI URL URN
items: 《51 单片机快速入门》读书笔记
items: 【转载】CppTemplateTutorial
items: std::tuple
items: 《C++ Primer》5th 读书笔记
items: 使用 TinyProxy 代理
items: 程序员升职记全成就
items: OJ 需备算法

凸包（Convex Hull）
type: item
date: 2021-04-21T12:09:53+00:00

线性代数的本质
type: item
date: 2021-02-03T13:47:20+00:00
description: https://blog.csdn.net/a514371309/article/details/81604194 原文链接：https://www.cnblogs.com/TenosDoIt/p/3214096.html 从大学开始接触矩阵论和线性代数，记了很多公式，但是总感觉徘徊在线性代数的门外没有进去，感觉并没有接触到它的核心概念，不巧看到了这篇博客，顿时醍醐灌顶，豁然开朗，记录与此： 比如说，在全国一般工科院系教学中应用最广泛的同济线性代数教材（现在到了第四版），一上来就介绍逆序数这个古怪概念，然后用逆序数给出行列式的一个极不直观的定义，接着是一些简直犯傻的行列式性质和习题——把这行乘一个系数加到另一行上，再把那一列减过来，折腾得那叫一个热闹，可就是压根看不出这个东西有嘛用。 大多数像我一样资质平庸的学生到这里就有点犯晕：连这是个什么东西都模模糊糊的，就开始钻火圈表演了，这未免太无厘头了吧！于是开始有人逃课，更多的人开始抄作业。这下就中招了，因为其后的发展可以用一句峰回路转来形容，紧跟着这个无厘头的行列式的，是一个同样无厘头但是伟大的无以复加的家伙的出场——矩阵来了！多年之后，我才明白，当老师犯傻似地用中括号把一堆傻了吧叽的数括起来，并且不紧不慢地说：“这个东西叫做矩阵”的时候，我的数学生涯掀开了何等悲壮辛酸、惨绝人寰的一幕！自那以后，在几乎所有跟“学问”二字稍微沾点边的东西里，矩阵这个家伙从不缺席。对于我这个没能一次搞定线性代数的笨蛋来说，矩阵老大的不请自来每每搞得我灰头土脸，头破血流。长期以来，我在阅读中一见矩阵，就如同阿Q见到了假洋鬼子，揉揉额角就绕道走。 事实上，我并不是特例。一般工科学生初学线性代数，通常都会感到困难。这种情形在国内外皆然。瑞典数学家Lars Garding在其名著Encounter withMathematics中说：“如果不熟悉线性代数的概念，要去学习自然科学，现在看来就和文盲差不多。然而“按照现行的国际标准，线性代数是通过公理化来表述的，它是第二代数学模型，这就带来了教学上的困难。”事实上，当我们开始学习线性代数的时候，不知不觉就进入了“第二代数学模型”的范畴当中，这意味着数学的表述方式和抽象性有了一次全面的进化，对于从小一直在“第一代数学模型”，即以实用为导向的、具体的数学模型中学习的我们来说，在没有并明确告知的情况下进行如此剧烈的paradigm shift，不感到困难才是奇怪的。 大部分工科学生，往往是在学习了一些后继课程，如数值分析、数学规划、矩阵论之后，才逐渐能够理解和熟练运用线性代数。即便如此，不少人即使能够很熟练地以线性代数为工具进行科研和应用工作，但对于很多这门课程的初学者提出的、看上去是很基础（Base）的问题却并不清楚。比如说： 1、矩阵究竟是什么东西？ 2、向量可以被认为是具有n个相互独立的性质（维度）的对象的表示，矩阵又是什么呢？ 3、我们如果认为矩阵是一组列（行）向量组成的新的复合向量的展开式，那么为什么这种展开式具有如此广泛的应用？特别是，为什么偏偏二维的展开式如此有用？ 4、如果矩阵中每一个元素又是一个向量，那么我们再展开一次，变成三维的立方阵，是不是更有用？ 5、矩阵的乘法规则究竟为什么这样规定？为什么这样一种怪异的乘法规则却能够在实践中发挥如此巨大的功效？很多看上去似乎是完全不相关的问题，最后竟然都归结到矩阵的乘法，这难道不是很奇妙的事情？难道在矩阵乘法那看上去莫名其妙的规则下面，包含着世界的某些本质规律？如果是的话，这些本质规律是什么？ 6、行列式究竟是一个什么东西？为什么会有如此怪异的计算规则？行列式与其对应方阵本质上是什么关系？为什么只有方阵才有对应的行列式，而一般矩阵就没有（不要觉得这个问题很蠢，如果必要，针对mxn矩阵定义行列式不是做不到的，之所以不做，是因为没有这个必要，但是为什么没有这个必要）？而且，行列式的计算规则，看上去跟矩阵的任何计算规则都没有直观的联系，为什么又在很多方面决定了矩阵的性质？难道这一切仅是巧合？ 7、矩阵为什么可以分块计算？分块计算这件事情看上去是那么随意，为什么竟是可行的？ 8、对于矩阵转置运算AT，有(AB)T=BTAT，对于矩阵求逆运算A-1，有(AB)-1=B-1A-1。两个看上去完全没有什么关系的运算，为什么有着类似的性质？这仅仅是巧合吗？ 9、为什么说P−1AP得到的矩阵与A矩阵“相似”？这里的“相似”是什么意思？ 10、特征值和特征向量的本质是什么？它们定义就让人很惊讶，因为Ax=λx，一个诺大的矩阵的效应，竟然不过相当于一个小小的数λ，确实有点奇妙。但何至于用“特征”甚至“本征”来界定？它们刻划的究竟是什么？ 这样的一类问题，经常让使用线性代数已经很多年的人都感到为难。就好像大人面对小孩子的刨根问底，最…

URI URL URN
type: item
date: 2021-02-03T13:46:06+00:00
description: 曾经我天真的以为URI和URL是一样的，只是不同叫法而已，然后某一天有人告诉我这两个不一样，so我发现是时候好好研究一下这两个概念了。 URI：Uniform Resource Identifier，统一资源标识符 URL：Uniform Resource Location统一资源定位符 它们有什么关系 URI是一个用于标识互联网资源名称的字符串。 该种标识允许用户对网络（Network）中（一般指万维网）的资源通过特定的协议进行交互操作。URI的最常见的形式是统一资源定位符（URL），经常指定为非正式的网址。更罕见的用法是统一资源名称（URN），其目的是通过提供一种途径。用于在特定的命名空间资源的标识，以补充网址。 通俗地说，URL和URN是URI的子集，URI属于URL更高层次的抽象，一种字符串文本标准。 三者关系如下图： 图示 有什么区别 上面虽然大概介绍了这两者的区别，不过感觉还是有些模糊，下面着重研究区别。 首先，URI，是统一资源标识符，用来唯一的标识一个资源。而URL是统一资源定位器，它是一种具体的URI，即URL可以用来标识一个资源，而且还指明了如何locate这个资源。而URN，统一资源命名，是通过名字来标识资源，比如mailto:java-net@java.sun.com。也就是说，URI是以一种抽象的，高层次概念定义统一资源标识，而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI； URL是URI的一种（通过那个图就看的出来吧）。但也不是所有的URI都是URL哦，就好像蝴蝶都会飞，但会飞的可不都是蝴蝶啊！ 让URI能成为URL的当然就是那个“访问机制”，“网络位置”。e.g. http:// or ftp://.。URN是唯一标识的一部分，就是一个特殊的名字。 下面就来看看例子吧，当来也是来自权威的RFC： ftp://ftp.is.co.za/rfc/rfc1808.txt (also a URL because of the protocol) http://www.ietf.org/rfc/rfc2396.txt (also a URL because of the protocol) ldap://[2001:db8::7]/c=GB?objectClass?one (also a URL because of the protocol) mailto:John.Doe@example.com (also a URL because of the protocol) news:comp.infosystems.www.servers.unix (also a URL because of the protocol) tel:+1-816-555-1212 telnet://192.0.2.16:80/ (also a URL because of the protocol) urn:oasis:names:specification:docbook:dtd:xml:4.1.2 这些全都是URI, 其中有些是URL. 哪些? 就是那些提供了访问机制的. 各自的组成 URI Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的； URI一般由三部组成 ①访问资源的命名机制 ②存放资源的主机（Host）名 ③资源自身的名称，由路径表示，着重强调于资源。 URL URL是Internet上用来描述信息资源的字符串，主要用在各种WWW客户程序和服务（Services）器程序上，特别是著名的Mosaic。 采用URL可以用一种统一的格式来描述各种信息资源，包括文件、服务器的地址和目录等。 URL一般由三部组成 ①协议(或称为服务方式) ②存有该资源的主机IP地址(有时也包括端口号) ③主机资源的具体地址。如目录和文件名等 现在，你明白了了吗，欢迎提出意见和补充哦 作者：daixinye 链接：https://www.zhihu.com/question/21950864/answer/154309494 来源：知乎 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。 统一资源标志符URI就是在某一规则下能把一个资源独一无二地标识出来。拿人做例子，假设这个世界上所有人的名字都不能重复，那么名字就是URI的一个实例，通过名字这个字符串就可以标识出唯一的一个人。现实当中名字当然是会重复的，所以身份证号才是URI，通过身份证号能让我们能且仅能确定一个人。那统一资源定位符URL是什么呢。也拿人做例子然后跟HTTP的URL做类比，就可以有：动物住址协议://地球/中国/浙江省/杭州市/西湖区/某大学/14号宿舍楼/525号寝/张三.人可以看到，这个字符…

《51 单片机快速入门》读书笔记
type: item
date: 2021-02-03T13:43:00+00:00
description: 51 单片机快速入门 [TOC] keil uVision5 第一步，点亮你的 LED 电源 晶振 复位电路 特殊功能寄存器 程序下载 第二步，硬件基础（Base）知识 电磁干扰 三极管 三八译码器 流水灯 定时器与数码管 中断与数码管动态显示 矩阵 LED 按键 步进电机与蜂鸣器 实例练习 UART串口通信 1602 液晶 1602 与 串口 i2c和e2prom ds1302 红外通信 模数转换和数模转换 RS-485 与 modbus协议 多功能电子钟 单片机开发常用工具 万用表 示波器 逻辑分析仪

【转载】CppTemplateTutorial
type: item
date: 2021-02-03T13:39:00+00:00
description: C++ Template 进阶指南 [TOC] 0. 前言 0.1 C++另类简介：比你用的复杂，但比你想的简单 C++似乎从它为世人所知的那天开始便成为天然的话题性编程语言。在它在周围有着形形色色的赞美与贬低之词。当我在微博上透露欲写此文的意愿时，也收到了很多褒贬不一的评论。作为一门语言，能拥有这么多使用并恨着它、使用并畏惧它的用户，也算是语言丛林里的奇观了。 C++之所以变成一门层次丰富、结构多变、语法繁冗的语言，是有着多层次的原因的。Bjarne在《The Design and Evolution of C++》一书中，详细的解释了C++为什么会变成如今（C++98/03）的模样。这本书也是我和陈梓瀚一直对各位已经入门的新手强烈推荐的一本书。通过它你多少可以明白，C++的诸多语法要素之所以变成如今的模样，实属迫不得已。 模板作为C++中最有特色的语言特性，它堪称玄学的语法和语义，理所应当的成为初学者的梦魇。甚至很多工作多年的人也对C++的模板部分保有充分的敬畏。在多数的编码标准中，Template俨然和多重继承一样，成为了一般程序员（非程序库撰写者）的禁区。甚至运用模板较多的Boost，也成为了“众矢之的”。 但是实际上C++模板远没有想象的那么复杂。我们只需要换一个视角：在C++03的时候，模板本身就可以独立成为一门“语言”。它有“值”，有“函数”，有“表达式”和“语句”。除了语法比较蹩脚外，它既没有指针也没有数组，更没有C++里面复杂的继承和多态。可以说，它要比C语言要简单的多。如果我们把模板当做是一门语言来学习，那只需要花费学习OO零头的时间即可掌握。按照这样的思路，可以说在各种模板书籍中出现的多数技巧，都可以被轻松理解。 简单回顾一下模板的历史。87年的时候，泛型（Generic Programming）便被纳入了C++的考虑范畴，并直接导致了后来模板语法的产生。可以说模板语法一开始就是为了在C++中提供泛型机制。92年的时候，Alexander Stepanov开始研究利用模板语法制作程序库，后来这一程序库发展成STL，并在93年被接纳入标准中。 此时不少人以为STL已经是C++模板的集大成之作，C++模板技止于此。但是在95年的《C++ Report》上，John Barton和Lee Nackman提出了一个矩阵乘法的模板示例。可以说元编程在那个时候开始被很多人所关注。自此篇文章发表之后，很多大牛都开始对模板产生了浓厚的兴趣。其中对元编程技法贡献最大的当属Alexandrescu的《Modern C++ Design》及模板程序库Loki。这一2001年发表的图书间接地导致了模板元编程库的出现。书中所使用的Typelist等泛型组件，和Policy等设计方法令人耳目一新。但是因为全书用的是近乎Geek的手法来构造一切设施，因此使得此书阅读起来略有难度。 2002年出版的另一本书《C++ Templates》，可以说是在Template方面的集大成之作。它详细阐述了模板的语法、提供了和模板有关的语言细节信息，举了很多有代表性例子。但是对于模板新手来说，这本书细节如此丰富，让他们随随便便就打了退堂鼓缴械投降。 本文的写作初衷，就是通过“编程语言”的视角，介绍一个简单、清晰的“模板语言”。我会尽可能地将模板的诸多要素连串起来，用一些简单的例子帮助读者学习这门“语言”，让读者在编写、阅读模板代码的时候，能像 if(exp) { dosomething(); }一样的信手拈来，让“模板元编程”技术成为读者牢固掌握、可举一反三的有用技能。 0.2 适宜读者群 因为本文并不是用于C++入门，例子中也多少会牵涉一些其它知识，因此如果读者能够具备以下条件，会读起来更加轻松： 熟悉C++的基本语法； 使用过STL； 熟悉一些常用的算法，以及递归等程序设计方法。 此外，尽管第一章会介绍一些Template的基本语法，但是还是会略显单薄。因此也希望读者能对C++ Template最基本语法形式有所了解和掌握；如果会编写基本的模板函数和模板类那就更好了。 诚如上节所述，本文并不是《C++ Templates》的简单重复，与《Modern C++ Design》交叠更少。从知识结构上，我建议大家可以先读本文，再阅读《C++ Templates》获取更丰富的语法与实现细节，以更进一步；《Modern C++ Design》除了元编程之外，还有很多的泛型编程示例，原则上泛型编程的部分与我所述的内容交叉不大，读者在读完1-3章了解模板的基本规则之后便可阅读《MCD》的相应章节；元编程部分（如Typelist）建议在阅读完本文之后再行阅读，或许会更易理解。 0.3 版权 本文是随写随即同步到Github上，因此在行文中难免会遗漏引用（ref）…

std::tuple
type: item
date: 2021-02-03T09:14:00+00:00
description: tuple 模板是 pair 模板的泛化，但允许定义 tuple 模板的实例，可以封装不同类型的任意数量的对象，因此 tuple 实例可以有任意数量的模板类型参数（Parameter）。tuple 模板定义在 tuple 头文件中。 tuple 这个术语也适用于很多其他的场景，例如数据库，这里一个 tuple 就是由一些类型的不同数据项组成的，这和 tuple 的概念相似。tuple 对象有很多用途。当需要将多个对象当作一个对象传给函数时，tuple 类型是很有用的。 tuple 的操作 生成 tuple 对象的最简单方式是使用定义在 tuple 头文件中的辅助函数 make_tuple()。这个函数可以接受不同类型的任意个数的参数，返回的 tuple 的类型由参数的类型决定。例如： auto my_tuple = std::make_tuple ( Name{"Peter"，"Piper"}, 42, std::string{"914 626 7890"} ); my_tuple 对象是 tuple<Name，int，string> 类型，因为模板类型参数是由 make_tuple() 函数的参数推导出来的。如果提供给 make_tuple() 的第三个参数是一个字符串常量，my_tuple 的类型将是 tuple<Name,int,const*>，这和之前的不同。 tuple 对象的构造函数提供了可能会用到的每一种选择。例如： std::tuple<std::string, size_t> my_tl;//Default initialization std:: tuple<Name, std::string> my_t2 {Name {"Andy", "Capp"},std::string{“Programmer”}}; std::tuple<Name,std::string> copy_my_t2{my_t2}; // Copy constructor std::tuple<std::string, std::string> my_t3 {"this", "that"}; // Implicit conversion tuple 中的对象由默认构造函数用默认值初始化。为 my_t2 调用的构造函数将参数移到 tuple 的元素中。下一条语句会调用拷贝构造函数来生成 tuple，在最后一个构造函数调用中，将参数隐式转换为 string 类型并生成了一个 tuple 元素。 也可以用 pair 对象构造 tuple 对象，pair 可以是左值，也可以是右值。显然，tuple 只能有两个元素。下面有两个示例： auto the_pair = std::make_pair("these","those"); std::tuple<std::string, std::string> my_t4 {the_pair}; std::tuple<std::string, std::string> my_t5 {std::pair <std::string, std::string > { "this", "that"} }; 第二条语句从 the_pair 生成了一个 tuple，它是一个左值。the_pair 的成员变量 first 和 second 可以隐式转换为这个 tuple 中的元素的类型。最后一条语句从右值 pair 对象生成了一个 tuple。 可以用任何比较运算符来比较相同类型的 tuple 对象。tuple 对象中的元素是按照字典顺序比较的。例如： std::cout << std::boolalpha << (my_t4 < my_t5) << std::endl; tuple 对象中的元素是依次比较的，第一个不同的元素决定了比较结果。my_t4 的第一个元素小于 my_t5 的第一个元素，因此比较结果为 true。如果是相等比较，任何一对不相等的对应元素都会使比较结果为 false。 tuple 对象的成员函数 swap() 可以将它的元素和参数交换。参数的类型必须和 tuple 对象的类型一致。例如： my_t4.swap (my_t5); 通过调用成员函数 swap() 来交换 my_t4 和 my_t5 对应的元素。显然，tuple 中所有元素的类型都必须是可交换的，tuple 头文件中定义了一个全局的 swap() 函数，它能够以相同的方式交换两个 tuple 对象的元素。 因为 tuple 是 pair 的泛化，所以它的工作方式不同。pair 的对象个数是固定的，因此它们有成员名。tuple 中的对象数目是不固定的，所以访问它们的机制必须能够满足这种情况。函数模板 get() 可以返回 tuple 中的…

《C++ Primer》5th 读书笔记
type: item
date: 2021-01-29T14:13:00+00:00
description: 《C++ Primer》5th 读书笔记 虽然说是这本书的笔记，但是还是会引入一些书外面的概念和新版标准的部分内容 对于不属于这本书的特殊的地方我会额外加以标注 [TOC] 第 1 章 开始 C++ 超级基础（Base）， 可以看我之前写的关于c++的必知必会的文章 UB(Undefined-Behaviors) 未定义行为 char 是 signed char 还是 unsigned char 是未定义的 int 是大于等于 short 小于等于 long 的 流 流可以作为 condition，用于判断是否到了流末尾，当到达流末尾时为 false，所以我们经常可以看到如下的写法 int n; while (std::cin >> n) { // do somthing... } 此时调用了 std::cin 类的 >> 函数，往 n 中输入数据，返回的是 std::cin 类的 istream 对象，到达流末尾时（通常这个标记为 EOF(End-Of-File)），在windows上可通过 Ctrl-z 和 Ctrl-d 输入 EOF 符号，标志流结束。 >> 作为一个函数，同理 std::cout << "Hello World" << std::endl; 的 << 也是一个函数，但是你会发现，其中存在多次调用，因为 std::cout<< 的返回值是一个 ostream 对象，即 std::cout 本身，所以实现了上面这样子的连续调用，但实际上，这个操作可以像下面这样分解， std::cout << "Hello World"; std::cout << std::endl; 这两种写法是完全等价的，于是就引出了一个问题，线程安全，因为，这个操作可以被等价分成两份，所以它的操作是不原子的，就可能在别的线程中，被插入，造成输出顺序混乱，比如输出了 Hello World123123\n 但是你想要输出的是 Hello World\n123123 其中，上面的\n的是转义字符，让换行看起来更加明显。解决办法也是有的，使用原子锁，但是这个内容是在后面学习多线程时才会讲到的，所以这里不加以赘述。 字面量 字面量大致可以分为两种，一种是语言提供的字面量，一种是库提供的字面量 语言提供的字面量，例如（其实我也没有仔细研究过具体哪些属于哪些，反正把自己知道的都列出来了） // 指针字面量 nullptr; // 布尔字面量 true;false; // 整数字面量 auto a = 1; // int a auto b = 0x1; // int b auto c = 01; // int c // 二进制字面量在 c++14 中引入 auto d = 0b1; // int d auto e = 1u; // unsigned int e auto f = 1ll; // long long f auto uf= 1ull; // unsigned long long f auto g = 1l; // long g // 其实这些后缀大小写都是可以的，为了方便书写，这里都写小写 // 浮点数字面量 auto h = 1.0l; // long double h auto i = 1e-1; // double i auto j = 1.0f; // float j auto k = 1e-1f; // float k // 字符(串)字面量 auto l = "Hello"; // const char *l auto m = u"World"; // const char16_t *m auto n = U"你好"; // const char32_t *n auto o = u8"世界"; // const char8_t *o auto p = L'！'; // wchar_t p auto q = '!'; // char q 但实际上，部分字面量会根据自己的数据大小自动变更数据类型，如果数据超过了long所能承载的范围，就会自动变为 long long，类型都是所能承受的最小类型，当然，char和short不在此列； 用户自定义字面量 使用运算符重载的方式 auto operator"" end(something) { } 就可以弄一个 somethingend 的一个字面量，something 作为参数（Parameter）传入 函数，处理后返回 第 I 部分 C++ 基础 第 2 章 变量和基本类型 初始化与赋值 其实这个是老生常谈的问题了，因为总是有非常多的事情，在这个上面纠结 int a = 10; // mov DWORD PTR [rbp-4], 10 int b; // int d = a; // …

使用 TinyProxy 代理
type: item
date: 2020-08-25T11:24:00+00:00
description: tinyproxy 的部署和使用不完全指北 tinyproxy - GitHub 介绍 Tinyproxy 是一个面向 POSIX 系统开发的轻量级的开源 HTTP/HTTPS 代理守护进程（Progress），其设计目标是快而小，从底层开始进行设计，保证了在高速的同时体积依然很小。它适用于需要完整 HTTP 代理特性，但系统资源又不足以运行大型代理的场景，比如嵌入式部署。 Tinyproxy 对小规模网络（Network）非常有用，这样的场合下大型代理会使系统资源紧张，或有安全风险。 Tinyproxy 的一个关键特性是其缓冲连接的理念。从效果上看， Tinyproxy 对服务（Services）器的响应进行了高速缓冲，然后按照客户端能够处理的最高速度进行响应。该特性极大的降低了网络延滞带来的问题。 支持匿名模式： 可让您配置哪些 HTTP标头可被允许通过，哪些 HTTP标头应被阻止。 这使您既可以限制从HTTP服务器向Web浏览器发送的数据（例如Cookie），也可以限制从Web浏览器到HTTP服务器发送的数据（例如版本信息）。 支持 HTTPS： 可以通过 CONNECT 请求（Request）来转发 HTTPS 连接。Tinyproxy 允许进行 HTTPS 连接的转发，而且无需通过 CONNECT 方法以任何形式修改流量内容（请参阅ConnectPort 指令）。 使用 AddHeader 指令，您可以向传出的流量里添加或插入 HTTP 标头信息。 远程监视： 通过使用远程监视工具，您可以远程获知代理统计信息、日志和访问信息，从而确切了解代理的繁忙程度。 负载监视： 可配置成当负载达到某个程度时，拒绝新的代理请求。 访问控制： 可设置特定的 IP 地址或者 IP 段才可访问。 安全： 不需要 root 权限。 只需进行一些配置（比如，将 Tinyproxy 创建的文件设为由非 root 用户拥有，并让它在大于 1024 的端口上运行），就能让 Tinyproxy 在没有任何特殊权限的情况下运行，从而将系统受到破坏的风险降至最低。 您可以配置 Tinyproxy 来实现 访问控制，从而仅允许来自特定子网或特定接口（Interface）的请求，从而确保那些随机（Random）出现的、未经授权的人不能使用您的代理。 轻量化： 只需要极小的系统资源。 Tinyproxy 的体积很小，也仅需少量系统资源。在使用 glibc 时，内存占用一般大约 2 MB，而 CPU 占用会随着连接数量线性增长（具体取决于连接速度）。因此，Tinyproxy 可用在比较老旧的计算机上，或者用在基于 Linux 的路由器等网络设备上，而不会对设备性能造成明显的影响。 支持基于 URL 的过滤。 支持透明代理 使客户端无需进行任何配置即可使用代理。您也可以将其用作您网站的反向代理前端。 支持多级代理。 开源： Tinyproxy 采用 GNU GPL 协议（版本2及以上）分发。 易于构建： Tinyproxy 的构建和运行仅需一个最小化的 POSIX 环境。同时，它可以用其他附加库来添加额外功能。 稳定： 它的设计致力于防止缓冲区溢出。代码结构的简单也确保了此类bug易于定位。 高自由度： 如果您要构建自定义Web代理，可以轻松地修改 Tinyproxy 以满足您的自定义需求。 源码结构非常简单，遵循 KISS 原则。 因此，可以把它作为基础（Base），来实现您可能需要Web代理执行的任何操作。 安装 直接安装 通过下面的命令在不同平台上直接安装 tinyproxy 服务 [RHEL](Red Hat Enterprise Linux) / CentOS / Fedora yum install tinyproxy 从 EPEL 仓库（Repository）中安装 Tinyproxy。 Debian / Ubuntu apt install tinyproxy Archlinux / manjaro pacman -S tinyproxy openSUSE zypper in tinyproxy FreeBSD，OpenBSD 或 NetBSD 可以使用 pkg_add 程序来安装 pkg install tinyproxy Mac OS 对于 Mac OS X 用户，可以查看 MacPorts 来检查其中的 Tinyproxy 端口是否已是最新版本。 如果您觉得您操作系统（Operating System）中的 Tinyproxy 二进制软件包不是最新的，请联系该操作系统的软件包维护者。 如果这行不通，您也可以从源代码编译（Compiler）得到最新的稳定版本。 homebrew install proxy 手动安装 最新版下载链接： http…

程序员升职记全成就
type: item
date: 2020-07-15T11:17:00+00:00
description: 程序员升职记 Human Resource Machine https://steamcommunity.com/sharedfiles/filedetails/?id=550015574 收发室 INBOX OUTBOX INBOX OUTBOX INBOX OUTBOX 繁忙的收发室 a: INBOX OUTBOX JUMP a a: INBOX OUTBOX INBOX OUTBOX JUMP a 复印楼层 COPYFROM 4 OUTBOX COPYFROM 0 OUTBOX COPYFROM 3 OUTBOX 扰码处理器 a: INBOX COPYTO 0 INBOX OUTBOX COPYFROM 0 OUTBOX JUMP a 咖啡时间 多雨之夏 a: INBOX COPYTO 0 INBOX ADD 0 OUTBOX JUMP a 零扑灭运动 a: b: INBOX JUMPZ b OUTBOX JUMP a 三倍扩大室 a: INBOX COPYTO 0 ADD 0 ADD 0 OUTBOX JUMP a 零保护行动 JUMP b a: OUTBOX b: c: INBOX JUMPZ a JUMP c 八倍扩大装置 a: INBOX COPYTO 0 ADD 0 COPYTO 0 ADD 0 COPYTO 0 ADD 0 OUTBOX JUMP a 加运算走廊 a: INBOX COPYTO 0 INBOX COPYTO 1 SUB 0 OUTBOX COPYFROM 0 SUB 1 OUTBOX JUMP a 四十倍扩大器 a: INBOX COPYTO 0 ADD 0 COPYTO 0 ADD 0 COPYTO 0 ADD 0 COPYTO 0 ADD 0 COPYTO 1 ADD 0 ADD 1 OUTBOX JUMP a 均衡之间 JUMP b a: COPYFROM 0 OUTBOX b: c: INBOX COPYTO 0 INBOX SUB 0 JUMPZ a JUMP c 最大值室 JUMP c a: COPYFROM 0 b: OUTBOX c: INBOX COPYTO 0 INBOX SUB 0 JUMPN a ADD 0 JUMP b 斗志注入 绝对正能量 JUMP c a: COPYTO 0 SUB 0 SUB 0 b: OUTBOX c: INBOX JUMPN a JUMP b 专属休息室 a: b: INBOX JUMPN d INBOX JUMPN e c: COPYFROM 4 OUTBOX JUMP b d: INBOX JUMPN c e: COPYFROM 5 OUTBOX JUMP a 海滩天堂 计时器 a: INBOX COPYTO 0 b: c: OUTBOX BUMPDN 0 JUMPN d JUMP c d: BUMPUP 0 JUMPZ a BUMPUP 0 JUMP b JUMP d a: b: c: OUTBOX d: INBOX JUMPN f JUMPZ a COPYTO 0 OUTBOX e: BUMPDN 0 JUMPZ c OUTBOX JUMP e f: COPYTO 0 OUTBOX g: BUMPUP 0 JUMPZ b OUTBOX JUMP g 乘法研讨会 JUMP b a: COPYFROM 0 OUTBOX b: COPYFROM 9 COPYTO 0 INBOX COPYTO 1 INBOX COPYTO 2 c: JUMPZ a COPYFROM 0 ADD 1 COPYTO 0 BUMPDN 2 JUMP c BUMPUP 9 JUMP k a: ADD 1 b: ADD 1 c: ADD 1 d: ADD 1 e: ADD 1 f: ADD 1 g: ADD 1 h: ADD 1 i: ADD 1 j: OUTBOX k: INBOX COPYTO 1 INBOX JUMPZ j SUB 9 JUMPZ i SUB 9 JUMPZ h SUB 9 JUMPZ g SUB 9 JUMPZ f SUB 9 JUMPZ e SUB 9 JUMPZ d SUB 9 JUMPZ c SUB 9 JUMPZ b SUB 9 JUMP a 零结尾字符串 JUMP c a: ADD 0 b: OUTBOX c: INBOX JUMPZ b d: COPYTO 0 INBOX JUMPZ a ADD 0 JUMP d 斐波那契参上 a: INBOX COPYTO 0 COPYFROM 9 COPYTO 1 COPYTO 2 BUMPUP 1 b: ADD 2 COPYTO 3 COPYFROM 0 SUB 1 JUMPN a COPYF…

OJ 需备算法
type: item
date: 2020-05-20T12:52:34+00:00
description: OJ 必须要了解的算法（如果要和别人比时间的话） 1. 数据量巨大的时候 std::cin, std::cout TLE (超时) static bool speedUP = [](){std::ios::sync_with_stdio(false); cin.tie(nullptr); return true}(); // 静态变量先于 main 函数初始化，以实现直接调用 lambda 函数 // std::ios::sync_with_stdio (false); 用以关闭 同步功能，不写缓存，不 flush // cin.tie (nullptr); 用于绑定输入流，nullptr 为当前输入流 // 写了一个 lambda 函数并调用了 https://byvoid.com/zhs/blog/fast-readfile/ https://zhuanlan.zhihu.com/p/35652783 https://www.jianshu.com/p/fa8ad995d300 2. 快速整数平方根（牛顿迭代打表）（std::sqrt 的 4 倍） inline int mysqrt(int n) { static int table[256] = { 0, 16, 22, 27, 32, 35, 39, 42, 45, 48, 50, 53, 55, 57, 59, 61, 64, 65, 67, 69, 71, 73, 75, 76, 78, 80, 81, 83, 84, 86, 87, 89, 90, 91, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 128, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 144, 145, 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 178, 179, 180, 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, 189, 189, 190, 191, 192, 192, 193, 193, 194, 195, 195, 196, 197, 197, 198, 199, 199, 200, 201, 201, 202, 203, 203, 204, 204, 205, 206, 206, 207, 208, 208, 209, 209, 210, 211, 211, 212, 212, 213, 214, 214, 215, 215, 216, 217, 217, 218, 218, 219, 219, 220, 221, 221, 222, 222, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 239, 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 253, 253, 254, 254, 255 }; int xn; if (n >= 0x7FFEA810) return 0xB504; if (n >= 0x10000) { if (n >= 0x1000000) { if (n >= 0x10000000) { if (n >= 0x40000000) { xn = table[n>> 24] << 8; } else { xn = table[n>> 22] << 7; } } else { if (n>= 0x4000000) {…