最新文章
Client-Server 2022年10月31日
网络IO+服务器高性能编程+数据库
PragmaticProgrammer 2022年10月31日
2.软件的熵(entropy)
Don't Live with Broken Windows.
3.石头汤与煮青蛙
每个人都会护卫他们自己的资源。这叫做“启动杂役”(start-up fatigue)。
人们发现,参与正在成功的事情要容易的多。
4.足够好的软件
让用户参与权衡
Make Quality a Requirements Issue
使质量成为需求问题
知道何时止步
5.你的知识资产
它们是有时效的资产(expiring asset)。
每年至少学习一种新语言
每季度阅读一本技术书籍
也要阅读非技术书籍
批判的思考
6.交流
了解你的听众
What do you want them to learn?
What is their interest in what you'have got to say?
How sophisticated are they?
How much detail do they want?
Whom do you want to own the in formation?
How can you motivate them to listen to you?
让文档美观
在今天,已经没有任何借口制作出外观糟糕的打印文档。
7.重复的危害
8.正交性
编码
让你的代码保持解耦
避免使用全局数据
避免编写相似的函数
9.可撤销性
如果某个想法是你唯一的想法,再没有什么比这更危险的事情了。
可撤销性
与我们开发软件的速度相比,需求、用户以及硬件变的更快。
要把决策视为是写在沙滩上的,而不要把它们刻在石头上。
灵活的架构
10.曳光弹
原型制作生成用过就仍的代码。曳光代码虽然简约,但却是完整的,并且构成了最终系统骨架的一部分。
11.原型与便笺
应制作原型的事物
原型制作是一种学习经验。其价值并不在于所产生的代码,而在于所学到的经验教训。
制作架构原型
主要组件的责任是否得到了良好定义?是否适当?
主要组件间的协作是否得到了良好定义?
耦合是否得以最小化?
你能否确定重复的潜在来源?
接口定义和各项约束是否可接受?
每个模块在执行过程中是否能访问到其所需的数据?是否能在需要时访问?
最后一项往往会产生最令人惊讶和最有价值的结果。
12.领域语言
有了适当的支持,你可以用大大接近应用领域的方法进行编程。你给了自己一个工具,能够让你更靠近他们的领域工作。
实现小型语言
易于开发还是易于维护?
14.纯文本的威力
杠杆作用
计算世界的每一样工具,从源码管理系统到编译器环境,再到编辑器及独立的过滤器,都能够在纯文本上进行操作。
15.shell游戏
GUI的好处是what you see is what you get。缺点是what you see is all you get。
17.源码控制
你可以运行自动的回归测试,确保当日的源码没有造成任何破坏。构建的自动化保证了一致性——没有手工过程,而你也不需要开发者记住把代码拷贝进特殊的构建区域。
18.调试
这是痛苦的事:
看着你自己的烦恼,并且知道
不是别人,而是你自己一人所致。第一准则:Don't Panic
19.文本操纵
Learn a Text Manipulation Language.
它们(文本操纵语言)嘈杂、肮脏、而且还有点用“蛮力”。如果使用有误,整个工件都可能毁坏。
20.代码生成器
21.按合约设计
语义不变项
一定要把固定的需求、不可违反的法则与那些仅仅是政策(policy)的东西混为一谈。
语义不变项——它必须是事物的确切含义的中西,而不受反复无常的政策的支配。
23.断言式编程
让断言开着
即使你确实有性能问题,也只关闭那些真的有很大影响的断言。
27.元程序设计
元数据是关于数据的数据
元数据是任何对应用进行描述的数据——应用该怎样运行、它应该使用什么资源,等等。在典型情况下,元数据在运行时,而不是编译时被访问和使用。
30.黑板
任何规则集的输出都可以张贴到黑板上,并触发更为适用的规则。
Using Blackboards to Coordinate Workflow 用黑板协调工作流
33.重构
与建筑相比,软件更像是园艺——它比混凝土更有机
不要对改动犹豫不决
不要试图在重构的同时增加功能
34.易于测试的代码
测试装备可以处理一些常用操作,比如记录状态、分析输出是否符合预期的结果、以及选择和运行测试。
测试应该是可组合的
35.邪恶的向导
向导是一条单行道——它们为你制作代码,然后就走了
36.需求之坑
需求很少存在与表面之上。通常,它们深深地埋藏在层层假定、误解和政治手段的下面
有一种能深入了解用户需求、却未得到足够利用的技术:成为用户
好的需求文档会保持抽象。在设计需求的地方,最简单的、能够准确地反映商业需要的陈述是最好的
需求不是架构。需求不是设计,也不是用户界面。需求是需要
37.解开不可解开的谜题
解开谜题的关键在于确定加给你各种约束,并确定你确实拥有的自由度
我们想先确定最为严格的约束,然后再在其中考虑其余的约束
38.等你准备好
软件开发仍不是科学,让你的直觉为你的表演做出贡献
把构建原型当做调查你的不适的一种方法时,一定要记住你为何这样做。你最不想看到的事情就是,你花了几个星期认真地进行开发,然后才想起来你一开始只是要写一个原型
39.规范陷阱
编写程序规范就是把需求归纳到程序员能够接管的程度的过程
但你可以确信,一旦他们看到运行的系统,你就会被各种变更要求淹没
有些选择常常只有在编码过程中才会显露出来
你应该倾向于把需求搜集、设计以及实现视为同一个过程
健康的开发过程鼓励把来自实现测试的意见反馈到规范中
40.圆圈与箭头
结构化程序设计——拥有长久的生命
盲目地采用任何技术,而不把它放进你的开发实践和能力的语境中,这样的处方肯定会让你失望
Dont't Be a Slave to Formal Methods
要记住谁是主人。不要变成方法学的奴隶
41.注重实效的团队
质量只可能源于全体团队成员都做出自己的贡献
对外界而言,看上去沉默寡言的项目团队是最糟糕的团队
花 30 分钟设计一个滑稽的标志,并把它用在你的备忘录和报告上
认为项目的各种活动——分析、设计、编码、测试——会孤立地发生,这是一个错误。它们不会孤立发生。它们是看待同一问题的不同方式,人为地分割它们会带来许多麻烦。
如果夜间构建能够自动运行各种测试,为什么要手工完成测试表单呢?
知道何时停止绘画。抵抗不断画下去的诱惑
42.无处不在的自动化
文明通过增加我们不加思索就能完成的重要操作的数目而取得进步
Don't Use Manual Procedures
使用 cron 我们可以自动安排备份、夜间构建、网站维护、以及其它任何可以无人照管地完成的事情
要让完全构建(full build)运行所有可用的测试。如果你没有定期运行测试,你可能会发现,应用因为3个月前做出的代码改动而失败。
自动化管理
43.无情的测试
好的项目拥有的测试代码可能比产品代码还多
因为我们不可能编写出完美的软件,所以我们也不可能编写出完美的测试软件。我们需要的对测试进行测试
Use Saboteurs to Test Your Testing 通过“蓄意破坏”测试你的测试
Test State Coverage, Not Code Coverage 测试状态覆盖,而不是代码覆盖
我们所说的“自动”意味着对测试结果也进行自动解释
Find Bugs Once 一个bug只抓一次
44.全都是写
任何形式的文档都只是快照(snapshot)
要在每个网页上放上日期戳或版本号
45.极大的期望
在抽象的意义上,应用如果能正确实现其规范,就是成功的。遗憾的是,这只能付抽象的账
要设法让你的用户惊讶。请注意,不是惊吓他们,而是要让他们高兴。
46.傲慢与偏见
Sign Your Work 在你作品上签名
TheArtOfUnixProgramming 2022年10月31日
1.2 性能-时间的指数曲线对软件开发过程所引起的结果,就是每过18个月,就有一半知识会过时。Unix 并不承诺让你免遭此劫,只是让你的知识投资更加稳定。
1.4 行为的最终逻辑尽可能被推后到使用端。
最终用户永远比操作系统设计者更清楚他们究竟需要什么。
1.6 哲学
每个程序只做好一件事
假定每个程序的输出都会成为另一个程序的输入
优先使用工具而不是拙劣的帮助来减轻编程任务的负担
编程的核心是数据结构,而不是算法
策略同机制分离,接口同引擎分离
1.6.3 把复杂的交互程序跟干粗活的算法程序分离
1.6.11 设计良好的程序将用户的注意力视为宝贵的资源,只在必要时才使用
1.7 Keep It Simple, Stupid!
2.4 过分依赖任何一种技术或者商业模式都是错误的——相反,保持软件及其设计传统的灵活性才是长存之道
4.1 200-400行之间的逻辑行代码是“最佳点”
4.2.2 正交性:每一个动作(无论是API调用,宏调用,还是语言运算)只改变一件事,不会影响其它
4.2.3 不要重复自身
4.2.5 依附于被人忽略的假定将导致非正交、不紧凑的设计,项目不是失败就是成为维护的梦魇
4.3.2 薄胶合层原则可以看做是分离原则的升华
4.5 OO语言鼓励“具有厚重的胶合和复杂层次”
过多的层次破坏了透明性
就算用OO,他们(Unix程序员)也尽可能保持对象设计的整洁清晰
4.6 全局变量同时也意味着代码不能重入;也就是说,同一个进程的多个实例可能彼此干涉
API的接入点是不是超过七个?有没有哪个类有七个以上的方法?数据结构的成员是不是超过七个?
5.27 Unix 文本文件的约定 P120
TheDesignOfEverydayThings 2022年10月31日
文章无缩略内容。
CppPrimer 2022年10月31日
文章无缩略内容。
CppPrimerPlus 2022年10月31日
如果一条语句可以解释为函数声明,那它就是函数声明
dec
(十进制)、hex
(十六进制)、oct
(八进制)
EffectiveCpp 2022年10月31日
1. 视 C++ 为一个语言联邦
C , pass-by-value
Object-Oriented C++ , pass-by-reference
Template C++
STL,对于迭代器和函数对象,pass-by-value
C++ 高效编程守则视状况而变化,取决你使用 C++ 的哪一部分。
8. 析构函数吐出异常就是危险
9. 绝不在构造函数和析构函数过程中调用virtual
函数
10. 令赋值运算符返回一个 reference to *this
11. copy and swap
12. 不要尝试以copying构造函数
实现另外一个copying assignment运算符
,或是反过来。应将共同机能放进第三个函数中
13. 以对象管理资源。
动态分配而得的array身上使用智能指针是个馊主意。
因为智能指针的析构函数内做的是delete,而不是delete []。
14. 资源管理类中小心copying
行为
禁止复制
引用计数
复制底部资源
转移所有权
shared_ptr<Typename>
允许指定删除器
EffectiveSTL 2022年10月31日
文章无缩略内容。
MoreEffecitveCpp 2022年10月31日
3. 绝不要以多态方式处理数组
多态和指针算术不能通用。数组对象几乎总是会涉及指针的算术运算,所以数组和多态不要混用。
如果能避免让一个具体类继承自另外一个具体类,你就不太能够犯“以多态方式来处理数组”的错误。
4. 非必要不提供 default constructor
缺少 default constructor 的类将不兼容于许多(不够严谨的)templates。
std::vector
不要求类型具有默认构造函数,因为可以显式初始化多个值。
5. 对定制的“类型转换函数”保持警觉
隐式的类型转换函数,害处多过好处
7. 千万不要重载 &&、|| 和, 运算符
会破坏掉这些运算符本身的短路求值属性。你无法模仿这些运算符本身短路求值的属性。
8. 了解各种不同意义的 new 和 delete
string str = new string("Test");
这一条语句调用的是 new operator,分配内存并调用 constructor;只有编译器有权利调用 constructor,程序员没有权利。void * opeartor new (size_t n);
这一条语句调用 operator new,只分配内存,没有任何 constructor 会被调用。
如果你打算在 heap objects 产生时自己决定内存分配方式,请写一个自己的 operator news,并使用 new operator,它将会自动调用你所写的 operator new。如果你打算在已分配(并拥有指针)的内存中构造对象,请使用 placement new。
10. 在 constructors 内阻止资源泄露(resource leak)
Reference 2022年10月31日
c++11 保证,多个线程下,局部静态变量也只会被初始化一次 https://stackoverflow.com/questions/8102125/is-local-static-variable-initialization-thread-safe-in-c11
模板类的静态变量定义可以直接写在头文件里,运行时即便各个cpp文件都引用了头文件,模板类中的静态变量也只会被初始化一次 https://stackoverflow.com/questions/1553854/template-static-variable
c++11中,嵌套类自动成为友元类 https://stackoverflow.com/questions/5013717/are-inner-classes-in-c-automatically-friends/14759603#14759603
<atomic>
std::atomic_flag c++11原子的布尔类型
std::atomic 对数据结构进行原子性封装,不可复制也不可移动
c++核心准则 http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
c++内存模型: http://zh.cppreference.com/w/cpp/language/memory_model
<thread>
std::thread c++11线程类
std::this_thread::yield() 避免忙等待
std::sleep_for() 按需等待
std::chrono c++11时间类
编译原理 2022年10月31日
文章无缩略内容。
ComputerSystems 2022年10月31日
文章无缩略内容。
NetWork 2022年10月31日
distribution system - 分布式系统
vpn - virtual private network 虚拟专用网络
B2C - Busness to Customer
B2B
G2C - Government to Customer
C2C
P2P - Peer to Peer
RFID - 无线射频识别
passive RFID 无源RFID
active RFID 有源RFID
GPS - Global Positioning System
NFC - Near Field Communication - 近场通信
PAN - Personal Area Network
LAN - Local Area Network
MAN - Metropolitan Area Network - 城域网
WAN - Wide Area Network - 广域网
ISP - Internet Service Provider
Protocol Stack 一个特定的系统所使用的一组协议,每一层一个协议,称协议栈
a stack of layer - 层次栈
a stack of level - 分级栈
二者都是每一层都建立在下一层的基础上
OSI Open System Interconnection
7.应用层
6.表示层
5.会话层
4.传输层
3.网络层
2.数据链路层
1.物理层
每一层都有 服务、接口、协议
TCP/IP - Transport Control Protocol / Internet Protocol - 传输控制协议/因特网协议
应用层 - 对应OSI 7
传输层 - 对应OSI 4
互联网层 - 对应OSI 3
链路层
UDP - User Datagram Protocol - 用户数据报协议
LTE - Long Term Evolution - 长期演进
WEP - Wired Equivalent Privacy - 有限等效加密 - 以被破解
WPA - Wifi Protected AccessITU - Internetional Telecommunication Union - 国际电信联盟
IEEE - Institute of Electical and Electronics Engineers - 电气和电子工程师协会
802.3 - 以太网
802.11 - WLAN
802.15 - 个域网 - 蓝牙
802.16 - 宽带无线 WIMAX
SONET - Synchronous Optical Network - 同步光纤网络
DSL - 数字用户线路
ADSL - Asymmetric DSL - 非对称数字用户线
尼奎斯特定理: 最大数据速率 = 2B×log2V(比特/秒)
V 以2为底的对数乘以 2B,B为带宽,V为离散等级
即 3KHz 的信道不可能超过 6000bps 的速度传输 V=2(二进制)的信号
RegularExpression 2022年10月31日
参考于正则表达式
有些人面临一个问题时会想:“我知道,可以使用正则表达式来解决这个问题”。于是现在他们有两个问题了。——Jamie Zawinski
通配符 '.'
StructureAndInterpretationOfComputerPrograms 2022年10月31日
在数学里,人们关心的是说明性的描述(是什么),而在计算机科学里,人们则关心行动性的描述(怎么做)
费马小定理
Words 2022年10月31日
RAM - Random Access Memory
ROM - Read Only Memory
DRAM - Dynamic RAM 动态随机访问存储器
SRAM - Static RAM
ASLR - Address-Space Layout Randomization 地址空间格局随机化
增加攻击者预测目的地址的难度,防止其直接定位代码位置
CLI - Command Line Interface 命令行界面
IPC - Inter-Process Communication 进程间通信
CGI - Common Gateway Interface 通用网关接口
Computer Graphics Interface 计算机图形标准接口
KDE - K Desktop Environment K桌面环境
GIMP - GNU Image Manipulation Program
GTK+ - GIMP Tooklit
PDF - Portable Document File 便携式文档格式
Bash - Bourne Again Shell
总结 2022年10月31日
文章无缩略内容。
Golang 2022年10月31日
文章无缩略内容。
gc 2022年10月31日
非分代,非紧缩,写屏障,并发标记清理
介绍 2022年10月31日
文章无缩略内容。
安装 2022年10月31日
文章无缩略内容。
Gdal 2022年10月31日
文章无缩略内容。
Qt 2022年10月31日
configure -opensource -confirm-license -static -release -opengl desktop -skip webengine -nomake tools -nomake examples -nomake tests -prefix "D:QtQt5.9.4_Static_MinGW" -qt-pcre -qt-freetype -platform win32-g++
关键参数
-skip webengine
使用 MinGW 时的关键参数
-qt-pcre
Tensorflow 2022年10月31日
文章无缩略内容。
Tools 2022年10月31日
pwd - print working directory
hostname - 计算机在网络中的名字
cd - change directory
pushd - push directory
popd - pop diectory
echo -n 不在最后加换行符,-e使用转义字符,二者都只在bash中
cut 处理多空格有不足
-b 字节
-c 字符
-f 域,第几个,与-d配合使用
-d 自定义分隔符,分成几个域
-n 取消分割多字符字符,与b一起
which 查看可执行文件的位置
whereis 搜索程序名字。不是实时更新的
locate 在数据库中查找文件。由系统维护,非实时更新
seq 生成序列
seq 10 → 1...10
seq 1 3 10 → 1,4,7,10
seq 1 10 → 1...10
seq -s "a" 1 10→结果为1a2a...9a10。指定了分隔符
seq -w 使所有字符宽度一样
export - 导出/设定一个新的环境变量
只在当前shell下有效
更有效的方法是在~/.bashrc下添加
less - 逐页浏览文件
nl 打印文件和行号
-b 后跟 a 表示空行也输出行号, t 表示空行不输出行号
-n 后跟 ln 表示最左方,rn 为单元栏内最右, rz 最右同时前面加0
-w< n> 后跟数字表示宽度
cat
-b 对非空行编号
-n 对所有行编号
head
-q 隐藏文件名
-v 显示文件名
-c < n> 显示n个字节
-n < n> 显示n行
tail
-f 循环读取,会不断更新
-q、-v 与head相同
-c、-n 与head相同
-s 与-f一起使用,表示两次读取的间隔
xargs - 用于管道中处理参数
-n< n1> 多行输出,把 n1 行看做一行
-d'n' 自定义分隔符
-i 可以用{} 表示前面的参数
-I 指定一个符号代替{}
-p 提示是否连续执行
find [path] [options] [test] [actions]
options
depth: 先对子目录执行查找
-maxdepth <n>最大深度
-mindepth <n>最小深度
-mount
test
-name file
-iname 忽略名字的大小写
-type d为目录,f为普通文件,b为块
-atime 最后访问时间 +n表示n天以前,-n表示n天以内
-ctime 最后变更时间,mv、chmod都 在此列
-mtime 最后内容修改时间
可以使用逻辑运算符 !、-a=-and、-o=-or
actions
print
grep [options] PATTERN [file]
options:
-c 行数
-E 扩展为正则表达式
-h 不在前面显示文件名
-i 忽略大小写
-l 只输出文件名
-v 取反
-n 行号
-r 递归查找目录
-q 不显示任何信息
tr
-s 删除重复的
-d 删除
-c 对第一个条件取反
md5sum 生成MD5
env - 查看你的环境
man - 阅读手册
apropos - 寻找手册页面
diff
使用 -c、-u而不是-e
patch
与diff可以配合使用
cron
ps
-A 列出所有执行中进程
-w 加宽显示更多信息
-au 显示较详细的资讯
-aux 显示所有进程,包含其它使用者
a 显示现在终端机上所有程序,包括其它用户的
c 只包含命令,而不是路径
e 包含使用的环境变量
f 用ASCII字符显示树状结构,表示程序间的相互关系
-H 与 f 类似,但不用 ASCII 码显示
-l 显示nice值,即优先级
-N 显示所有程序,除了执行ps的程序
会把僵死的进程描述为
z
(zombie)
bc - 计算器
awk 2022年10月31日
gawk - pattern scanning and text processing language
一行一行处理
g++ 2022年10月31日
-pedantic 警告出不符合标准,但编译器进行了处理的代码
-Wall 开启所有警告
gdb 2022年10月31日
GDB
调试core文件
gdb main core
查看coredump文件名格式
cat /proc/sys/kernel/core_pattern
可以产生coredump且不受大小限制,非永久生效
ulimit -cunlimited
远程调试时,设置符号表
set solib-search-path /home/zj/lib1:/home/zj/lib2
makefile 2022年10月31日
执行时选项
-jN
指定N个进程同时编译,编译东西太多时用以提升速度 -k
发现错误也继续执行 -n
输出将要执行的步骤,但不执行 -f filename
将 filename 文件当做makefile
如未指定 all,则只创建它找到的第一个目标
变量
$?
当前目标所依赖的文件中比当前目标还新的 $@
当前目标的名字 $^
所有当前依赖的名字 $<
为第一个依赖文件
函数
wildcard
SRC = $(wildcard *.c ./foo/*.c)
搜索当前目录及 ./foo/ 目录下所有以 .c 结尾的文件,生成一个以空格为间隔的列表,赋值给 SRC,当前目录下的只有文件名,子目录下的还带有路径信息
notdir
FILENAME = $(notdir $(SRC))
去除所有的目录信息
patsubst
OBJ = $(patsubst %.c %.o $(FLIENAME))
在 FILENAME 中找到所有以 .c 结尾的文件,然后把 .c 转换成 .o 赋值给 OBJ OBJ = $(FILENAME:.c=.o)
与使用 patsubst 效果相同
shareLib 2022年10月31日
两种库都为 .so, 生成方式完全一致, gcc -fPic -shared name.o -o name.so
装载时链接为普通的,打开时就需要 .so 库, 链接所有 .o 文件生成可执行文件时也需要提供所需的 .so 库
运行时链接是通过函数 dlopen() 实现的, 头文件 < dlfcn.h >中, 链接可执行文件时不需要提供库名, 但需要选项 -ldl
soft 2022年10月31日
RecodrMyDesktop - 录屏软件
redshift - 防蓝光
redshift -l 39.90:116.41 5500:4500
设置为经纬度为北京,白天5500,晚上4500,可以添加到开机启动项里sl - 一辆小火车飘过
cmatrix - 装逼软件
htop - 比 top 美观一点
thefuck -
pip install thefuck
输错命令时再输fuckshellcheck - 检查shell脚本的语法
eog - 查看图片的软件,已默认安装
evince - 查看pdf的软件,已默认安装
tmux 2022年10月31日
关机后保存的会话会消失
vim 2022年10月31日
文章无缩略内容。
Matplotlib 2022年10月31日
超过100种数据可视化效果
由各种可视化类构成,内部结构复杂,受Matlab的启发
matplotlib.pyplot 是绘制各类可视化图形的命令子库,相当于一个快捷方式
NumPyBase 2022年10月31日
ndarry - n维数组
广播功能函数
整合c/c++/fortran代码的工具
线性代数、傅里叶变换、随机数等
是 SciPy、Pandas的基础
底层由C实现
多种长度的int、float、complex
NumPyFunction 2022年10月31日
文章无缩略内容。
Pillow 2022年10月31日
pip install pillow
Python 2022年10月31日
文章无缩略内容。
qt 2022年10月31日
https://stackoverflow.com/questions/30583577/qt-qdebug-not-working-with-qconsoleapplication-or-qapplication
/etc/xdg/QtProject/qtlogging.ini 或 ~/.config/QtProject/qtlogging.ini 文件里添加如下
[Rules]
*.debug=true
qt.*.debug=false
questions 2022年10月31日
问题:双系统下,ubuntu长时间无法关机。
原因:与安装Windows&Linux双系统后两个系统时间相差8小时有关,解决双系统时间不同步的办法: timedatectl set-local-rtc 1
vpn 2022年10月31日
文章无缩略内容。
Etcd 2022年10月31日
高可用的分布式键-值数据库
(https://github.com/etcd-io/etcd)
简单: 定义良好的接口
安全: 支持TLS传输协议
快速: 10000写/s
可靠: Raft一致性算法
典型场景:
服务发现
配置管理
Mysql 2022年10月31日
文章无缩略内容。
Redis 2022年10月31日
文章无缩略内容。
coredns 2022年10月31日
灵活、可扩展DNS服务器
https://github.com/coredns/coredns
url-shorten 2022年10月31日
sudoku 2022年10月31日
文章无缩略内容。