软件设计中的一些技术积累

单板中存在一些不经思考的设计。如,配置文件,很多都复制一个.bak的作为备份,担心配置文件损坏的情况下可以读取相同内容的备份。这个设计看上去考虑的很周全,其实不然。因为配置文件只会在开机读取一次,中间不会被修改等,损坏的几率极低极低。如果担心文件损坏单板仍然可以正常跑,那么所有的执行文件,库文件等更重要的文件也必须复制一份,明显这是不现实。单板具有异常还原,已经具有镜像备份,也就是说,配置文件损坏会导致程序启动不了,就会进入回退机制,镜像备份里也是有这个配置文件的,自然就能还原。所以,单板中经常出来的.bak配置文件纯属多余。 


关于软件里的时间核心原则。历史数据库中存储满时,需要删除最早的记录。请问你怎么删除?是删除数据库中最开始的那些行,还是根据时间列排序然后删除时间最早的?正确应该是前者(删除最开始的那些行),因为这才是代表真实时间的记录,越后的行一定代表越晚记录的数据。而时间一列,仅仅是物理时钟的一个数值记录,物理时钟并不能等于真正的时间,根据时间一列来判断,和物理时钟耦合了。这个核心原则在分布式系统中尤为明显。因此,数据库中的行顺序才是真正反映时间先后的判断依据。


今天突然发现,密码在老外那,其实有两个单词的,一个是大家天天碰到的password,一个是今天才发现的passphrase. 微软对两者进行了比较陈述,password真就是一个word,如xx@3c$; passphrase是连续的单词组成的,如, My birth is xx yy, 长度比较长, 具有一定的含义. 很多对安全要求较高的,英文里其实是要求输入passphrase,翻译为中文都成了密码. 



最近听了几个敏捷的培训,那个教练带过某通信公司的敏捷,他的感觉和我所理解的几乎一样. 学了敏捷的流程2周,感觉很有用,但是2周之后,问题就来了,最核心的就是人的能力不够,包括开发人员和需求人员.开发人员编码能力差,导致后期的维护成本非常大;需求人员没有办法弄出好的需求,没有写出好的用户故事. 那个教练最大的感触就是:1.客户领导对敏捷的期望过高;2.人的能力达不到,做敏捷就会很受限.国外的说敏捷对人的能力要求不高,我和那个教练对此同样都持保留态度. 就像打羽毛球,拿个拍子挥,这么简单的动作都能差别这么大,更不要说软件开发这么复杂的智力活动. 习武之人有句格言:练武不练功,到老一身空. 敏捷流程就像武,能力就像功. 


犹太人的聪明和好学确实让我惊呆了。我的酒店老板Moshe,和他聊了很久,他知道的东西太多了,一下就知道中兴是干什么的,一下子就猜到我是程序员等等,他的知识面让我惊呆了。和中国那些酒店老板只会知道搓麻将和收钱的强不知道多少倍。难怪以色列的人均GDP是旁边国家的几十倍。某公司的网管只有4人做出来的东西比我们十几个人干出来的强太多了,这差距真是值得我们反思。他们的CTO非常的厉害,我轻轻点了一下,他就知道了整个设计架构,他TM厉害了。 


什么是协程(coroutine)?很多人只知道进程和线程,并不知道什么是协程。举例,函数A调用函数B,函数B再调用函数A,对于传统的routine,那么执行函数A会有什么结果?结果是堆栈爆了。传统的routine认为被调用者属于调用者。但实际上这里A和B是同等地位的。协程(coroutine)的概念是,A和B的地位是平等,那么应用协程的A和B的堆栈里,分别是调用B和调用A,而不是传统的调用B,调用A,调用B,调用A。。。无限下去。用了协程的概念,A和B的调用使用就可以不受限制了,无论使用多久,堆栈都不会爆掉,而且内存使用量是一个很小的恒定值。 
消耗资源方面,进程>线程>协程,为什么呢?进程是共享堆和栈,线程和协程都只共享堆。线程默认栈消耗为1M,而协程默认只需要消耗栈4KB。从资源上,协程是最轻巧的。从调度上,一般而言,线程是由操作系统调度,叫抢占式(preemptive) ,这存在系统盲目调度导致的性能损失;而协程一般由程序员进行调度,叫协作式(cooperative),协程自己根据设计在特定地方产生我放弃操作的信号以便另一个协程开始工作,整体调度非常高效


动态编译的语言不一定比静态编译的语言慢,采用JIT的动态语言是动态优化输出的,举例,处理文本的函数,由于文本的内容是使用时才知道的,因此,静态编译是无法去优化的,JIT技术则可以根据文本的内容优化输出,所以此时可以更快。在其他类似的场合,JIT都可以更快。动态语言一般会将源码生成字节码后,再运行,因为源码到字节码比较费时间。运行中,根据执行到的字节码再转为机器码,字节码到机器码的时间很短了,所以应用JIT的动态语言可以做到运行很快。


TTT培训的笔记:1.每个小组讨论中,总会有一个急性子、有责任的会站出来。(如果没有,只能点名了)2.讲师的一个标准动作是,培训前应该调查。学员想听的与讲师想讲的不一定一致,如果不一致,应该反馈给培训任务下达人 3.如果手不知道怎么放,可以拿一个东西。点名时,不能手指学员,应该选用手背。4.推荐书目《未来是湿的》,《一个演员的自我修养》。5 碰到不懂的提问。可以采用a,这是个好问题、或求助现场;b,如果很自信,直接说不懂 6 如果领导来了现场,不建议无视,应请他上台讲话,让领导站在自己一边,否则领导来可以会变成考察自己的培训效果。如果中间过程才来到,可以在一个节点的时候,再请他讲话 7 麦肯锡对70年代和80年代的性格进行分析,70年代有性格缺陷,虚伪,言行不一;80年代正常。 8 准备不充分时,可以用衣着来补,从衣着,让别人认为你们是个身价高的人,面试时也是这样,女士带一个名牌包,会让人认为你身价比较高。


以前在win下用eric开发python,转到wingide后,总显示cp936的编码转换问题,中文总是乱码。当时就觉得cp936是啥,为啥eric会选择这么偏门的编码。现在才知道,cp936就是微软的code page936,可以简单等同于GBK或GB2312-80,cpxxx的标示方法在很多场合都会碰到。


以前单板代码打开文件直接是/root/xxxx,现在需要pc上进行单元测试,又不能赋予pc上的用户root权限(防止损害统一环境).那么一个比较好的方法就是采用~/xxxx来打开文件,~ 代表的是用户的home目录, 单板采用root用户(home目录为/root),所以~/xxxx等价于/root/xxxx. 这样pc单元测试时,普通用户就可以在自己的home目录下执行可写权限操作,而不需要改动代码. 需要注意的是: ~是shell带来的,不是系统, 所以C语言执行system("cat ~/xxx.txt")是正确的,但是,fopen("~/xxx.txt","r")就会找不到文件. 采用 getenv("HOME"),就可以获取执行程序的用户home路径. python采用import getpass; getpass.getuser()间接获取或os.environ['HOME']获取. 


前几天,帮同事刷微信活动的点击率. 其实这是很简单的事情. 用以前教的mitmproxy方法,获取微信的页面真实地址. 然后, 通过curl url的方式等价点击页面,为了加快速度, 建议采用subprocess的Popen方式,这样不会出现os.system任务串联阻塞的问题. 然后一个for循环就能一会刷上几千几万的点击率了. 



微信出现过几次需要发红包才能看的红包照片, 其实是可以免费查看的. 过年时,采用python的mitmproxy(man in the middle proxy)100%成功率地解析了红包照片的真实链接. 在电脑(ubuntu)安装mitmproxy后, 输入mitmproxy -p xx_port即可建立http代理, 手机的wifi设置那, 设置代理ip为电脑的ip, 端口为刚才xx_port, 那么手机的所有http(s)都会被mitmproxy记录. 微信朋友圈看到红包照片后,千万不要急着去点击, 微信做了一定的反解析, 第一次点击时,就会进入微信内部数据,后面再怎么点,都不会再加载,自然就解析不了,这和普通照片是不一样的. 开启mitmproxy后并确认可用后, 点击红包照片, 这时会多了一个地址, 方向键移动到那, enter进入, 按e, 再按u, 就会出现url链接, 按住shift后才能用鼠标选择复制地址, 然后粘贴到浏览器上, 瞧, 红包照片就被你免费看到了,呵呵.


windows的cmd特别的难用. 其实从win7开始, 自身就默认集成了powershell, powershell除了支持cmd, 更关键的是可以使用linux的N多指令, 比cmd好用多了, 写windows脚本,也不用特意去学windows的cmd命令了. 


我们的数据字典具有实时数据,参数等数据类型,怎么理解这些数据类型?将其抽象为另一种模型就好理解了,所谓数据,只有人类和机器可以访问,根据这个访问权限原则来建模,R代表只读,RW代表可读写。信息(厂家信息等):人类(R),机器(R);实时数据(模拟量,状态量):人类(R),机器(RW);参数:人类(RW),机器(R);可设状态量(时间):人类(RW),机器(RW)。正好覆盖了权限的常见枚举类型。可以发现,我们的控制类型,是无法归类在这里的。在其他厂家,如易达,AIO等,控制类型不属于数据类型之一,而是属于命令。我们的共享内存中也是没有控制类型的。根据这样的建模抽象,就可以很好地理解数据类型的本质。


在所有针对客户任意输入的地方, 都应该做好安全保护,否则会产生命令注入攻击. 举例, 用户名,客户写成 ;rm -rf / 那么, 很有可能你的单板就被格式化了. 因为内部实现可能是system(" change_username.sh name.bak name"), 在shell中等价于 change_username.sh name.bak ;rm -rf / 在你想要的语句执行后,注入的删除全盘的语句就会执行, 单板byebye. 如果对name加单引号, 试图将输入都变成字符串,以为注入无法执行,也是不够的, 举例 ';rm -rf /;'就可以绕过你的保护删除你全盘. 


excel的比较,其实使用bcompare就可以胜任,选择data compare分支,就能比较excel了 


excel表中,如果需要统计一列中“xx”出现的次数,假设在B列,可以使用=countif(B:B,"xx"),即可自动求出总数,非常方便。举例,开发故障列表中,每个人的故障有“待确认”,“待解决”等状态,用这个公式,可以自动在总表中得出全部人的不同故障状态统计,省时省力。

猜你喜欢

转载自blog.csdn.net/yyw794/article/details/78114470
今日推荐