背景
12月11日下半年的软考成绩公布了,我这次三个科目(综合、案例、论文)都及格了,经过一年的备考,继上半年案例挂了之后,这次各科都及格了,终于二次上岸了,为这段学习经历画下了圆满的句号。
分享一下自己的备考的经验和感受吧。
复习一下linux内核中的同步管理机制,内核中用于同步管理的几个机制主要有:
1 | 自旋锁- 同一个时刻只能被一个代码路径持有锁,其他代码路径一直忙等待,不会休眠,适合占用锁比较短的场景,可以用于中断上下文 |
我有一台机器,经常换内核版本调试。机器是公司的产品,如果使用标准的内核启动的话,常常因为配置问题那个图形用户界面会登录不进去,就没办法在用户界面下配置IP。
之前也没有进行详细的了解,不晓得有一个netplan的工具可以配置IP。所以使用的方法也比较挫,就是在/etc/profile
文件中添加了几个命令配置IP的。
这样,就有一个问题,必须有用户登录才能触发执行这些命令。又刚好我有一个串口线接着机器,所以每次重启后我就先通过串口登录,触发IP配置命令,后面就可以使用ssh网络连接了。
最近呢,串口线让同事借走了,然后又有人连着我的机器进行驱动调试,经常就奔溃了,重启后又要接串口,一个串口线就要来回使用,很麻烦。
最近看了流密码算法的Crypto PMD,稍微总结一下。
Snow3g/Zuc PMD都是基于intel-ipsec-mb库实现的库。许多数据和操作都是公共的,代码都位于dpdk/drivers/crypto/ipsec_mb目录下。
intel-ipsec-mb库是为包处理提供的一个软件加密库,可以用在IPsec, TLS, Wireless等应用中。
ipsec_mb下还有多个pmd,对应不同的算法。不同pmd类型相关的数据会保存到ipsec_mb_pmds变量中,公共函数根据当前的pmd类型获取对应pmd的数据和函数处理数据。实现不同pmd的分离。PMD类型在PMD初始化时保存到dev的dev_private区域。
今天在看libkcapi源码的时候,看到了一个struct iocb的结构。注释说这个是什么AIO相关的数据结构。上网查了一下,这是Linux内置的异步I/O机制的一个概念。
今天把前段时间在项目中写的一个命令框架整理一下,剥离出来独立成一个动态库。
最近在写代码的时候,因为是一个全新的工程,也没有引入什么日志库,直接就printf输出调试了。
这个总归是有一点儿不雅,然后想到之前用的sysrepo这个开源库,他提供的那个日志功能挺简单的,支持向终端错误stderr输出日志,也支持向syslog输出日志,而且使用起来也比较简单,想着借鉴着写一个。
最近连续看了一个微信公众号小林coding
的图解网络的文章,收获挺多。在这里发文小结一下,也方便后续工作中查询。
这篇文章小结一下使用socket发送和接收网络包的流程。
插件顾名思义就是通过宿主程序提供的机制,影响宿主程序而实现特定功能的一种程序。
sysrepo
数据库的一个重要的功能是在数据变更的时候,通过共享内存文件保存变更的内容,然后通过变更内容的模块找到相关路径订阅的管道id,通过往管道文件中写入随机数据通知订阅处理线程取数据,然后进行对应的操作处理。
上一篇讲了sysrepo
使用管道做事件通知,至于处理数据则通过共享内存文件来保存。sysrepo
号称是共享内存型的数据库,主要就是由于其数据都是通过共享内存文件保存的。
基于buildroot框架进行的交叉编译,首先拷贝官网buildroot包,然后拷贝里面的nginx的脚本配置。然后运行make nginx
。
以下是前段时间编译nginx遇到的一些问题:
之前安装的虚拟机,选择的磁盘只有10G, 随着时间的推移,空间不够了。需要进行磁盘的扩容。
前面一文主要讲了buildroot
的使用及一些结构。 这里讲一下如何使用buildroot
来编译一个package
。
最近需要编译一个arm平台上面的nginx,项目使用的buildroot构建环境,实现自动化的编译。前期的构建工具之类的已经由平台组的同事弄好了,主要的工作就是进行nginx的交叉编译,中间陆续踩了许多坑,简单聊聊吧。
最近看代码,一些服务进程在main函数中会调用daemon函数创建守护进程,然后继续执行。 又联想到之前项目在调试的时候,一般在shell中会执行多次的程序名后加一个&符号,让进程进入后台执行,还可以看到终端的输出。有时候我们自己写的小程序,在shell中使用程序名执行,查看输出结果。
最近有了几天的空闲时间,又开始了学习的征程。之前在极客时间上面订阅了《从0开始学架构》的专栏,在专栏结束之后,作者还陆续增加了一些文章上去,其中有一篇就是讲中台的。
最近完成了项目CAN
协议模块的编写,CAN
作为一种总线类型,多台设备连接到总线上,在短距离传输上有其优势,套用相关公司的广告就是 “CAN协议 – 方便灵活 功能强大”:
近两周完成了MODBUS协议RTU格式的开发,包含了从站和主站的功能,算是完成一个简易版的MODBUS协议栈了,做个小结。
github不稳定,近期老是被墙,换到码云上去。
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。
CPU切换主要有两种方式, 一种是主动释放CPU, 另外一种就是其他进程抢占CPU。
进程分为实时进程和普通进程。 实时进程需要立刻执行返回结果,普通进程没有这个需求。
自从工作以来,渐渐的已经有大概十个年头了。时间真的是很快。自身也在不经意间不断的成长。在程序员这个行当里,有一个广为流传的35岁危机。在我看来,实际只是那些没有成长的人才需要担心。一年的经验用十年和扎扎实实地积累十年工作经验完全是两回事。
这个月有时间刷完了一遍极客时间上面订阅的《趣谈linux操作系统》这个专栏, 可以说比较系统的梳理了一下操作系统相关的基础知识。这个专栏是去年12.04号订阅的了, 订阅这个专栏的初衷是当时在准备换工作,发现工作后操作系统的知识只剩大学操作系统课程学习后的遗留映像,很多东西都模糊了,想着要好好全面的补一把相关知识,陆陆续续的学习了近10个月了,里面的内容应该还算是干货满满, 从原理到代码的讲解还是比较细节的。刷完一遍感觉收获多多,不论是复习巩固,还是温故而知新,都有所得。后面还需要安排二刷、三刷。里面有一个很好的观点, 读书先把书读厚,再把书读薄,又把书读厚。。。 其实,一直以来我学习也是按照这个套路来学习,一万小时定律嘛。
无论使用什么产品,照着使用指南进行一番操作是学习它最便捷快速的方法。使用指南都是给用户看的, 一般都是简单易懂,有示例。linux命令行也是一样。
上一周,我在调试项目性能指标时遇到了一个问题,支持的节点数在到达60718644时,程序就出错了。由于节点索引是一个27位的结构体位域,当值为60718644时,最高位为1,此时,代码中有一个转换函数,作了对位域的左移操作并赋给一个更大空间类型的变量,使得最后的结果不是预期的。show u code:
最近工作使用了几个小skill,优化了代码,还帮团队的小伙子搞定了插入排序的功能。现在有些年轻人技术有点不足啊, 一个二分查找插入搞了快一周还没完成, 汗!!!
由于共享库的优点,许多程序都采用了共享库作为通用的库,而减少了静态库的使用。系统中,就会存在许多的共享库, 各个版本不一。在编译的时候,会在可执行文件的.dynamic段中写入程序依赖的动态库的SO_NAME。SO_NAME是一个类似libname.so.3的字符串,表示依赖名称为name的动态库, 动态库的版本为3.x.x。对于linux,动态库有其命名的规则,为libname.so.3.1.2。版本号的定义遵循semver格式。在linux中,还会存在一个libname.so.3的软链接,指向name对应的主版本为3的最新的版本文件,这样就解决了版本的兼容问题。
1 | gcc -o main -lname // -lname 表示需要链接libname.so.a.b.c, 具体的版本由编译环境决定 |
gdbserver是用于远程gdb的工具, 可以实现远程调试代码。很多嵌入式平台没有安装gdb,可以通过gdbserver启动,然后在网络可达的另一台主机起一个gdb进行远程代码调试。gdbserver占用空间比较小, 很适合在嵌入式系统里使用。
鉴于这本书是精读过的, 按章节来个读后感比较有效。
看这边书的初衷是要重新复习一下C语言基础的语法,毕竟很长一段的工作没有用到C语言(严格的说OC也算是类C的语言吧)的,这本书也很适合初学者入门C语言, 感觉比谭xx的好一点吧,虽然我大学入门C语言的时候也是用的谭xx的书。
原本以为自己会从中学到一些遗漏的知识,结果却没有,看来C语言的基础在脑海中还是比较记忆深刻。每个章节后面是带有习题的,前几年也买过这个书,习题也都做过了,这次只是过一下内容,没有花时间做习题。只是粗粗的浏览了一下这本书。毕竟不需要在基础上面花太多时间,没有太大的意义。这个阶段,主要看书的所得应该是思想架构这类的,而不是太具体的实现细节,主要还是时间有限,O(∩_∩)O哈哈~。
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。
对于嵌入式开发这种对空间要求比较苛刻的环境,对程序包的大小还是比较敏感的。一来, 可以节省空间。二来,在一定程度上可以减少页错误导致的载入载出,提升程序的性能。第三,对一些低速网络(比如:zigbee)连接的设备,提升OTA升级的效率。
可执行文件都是elf格式的, 文件都是由各个段组成的,对文件大小的优化就可以归结为各个段的优化。
第一,可以去掉执行时不需要的段,比如:release版本不需要调试信息、符号表等, 可以直接strip掉。 第二,还可以缩小一些段的内容,比如代码段。通过优化合并代码,减少重复代码。数据段,对于一些全局变量,定义的时候可以不进行初始化,在程序启动的时候初始化,使得这些全局变量放到bss段,不占用程序大小。只读的数据段,主要是一些字符串、const等不可变量。在发布的时候,通过宏控制删除大部分无用的调试信息,仅保留必要的错误日志的信息输出,这样可以减少只读数据段的大小。这个是单个文件的优化思路。
对于同时运行不同程序的平台,可以使用动态库,共享基础库。
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。
欢迎访问博客,我是IT工程师小明,网名:fishmwei,是一个奋斗在一线的老程序员。
事情是这样的,项目在同一个系统下运行着2个程序A和B,A由同事负责,B由我负责。 A和B会有共享的一块内存, 内存主要分成几种情况:
各部分内存没有机制保证被合法读写, 只能通过代码写入的地址保证。 这种情况下, 应该各自封装接口,对地址越界的情况进行判断,然后通过接口调用,这样才能保证内存的安全访问。
人不读书要落后,每年都需要读一些书来支持自我提升。电子书也好、实体书也好、亦或者是极客时间/知乎上的专栏都可以纳入,看完之后,对应写一篇读后感总结之类的文章。书籍可以是新书,也可以是读过的书,不论是增长见识、还是温故而知新都是不错的体验。主要是要保证自己坚持写博客。
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。
在linux下开发的工程师们对CoreDump肯定都不陌生,但凡有些许经验的工程师都或多或少使用过CoreDump文件定位过崩溃问题。之前工作中,在Android系统下开发C++程序时, 经常用到CoreDump。 中间转行去搞iOS已经五年了, 最近换了新工作,遇到程序宕掉同事让我看一下coredump文件,一时还没有反应过来, 今天好好复习一下。
不要滥用设计模式
最近在做代码剥离重构, 有一个基础库A,作为面向业务开发者的接口库,随着业务的发展,很多内容都往里面塞。虽然,中间每次添加都或多或少考虑了解耦,抽象了很多协议接口,但架不住常年累月的堆积啊。
YTKKeyValueStore
是一个轻量级的sqlite数据库开源库,基于FMDB封装的一个key、value的数据库, 由猿题库团队开源。适用于数据量不大的情况,进行简单的数据存储。比如配置信息,或者用户信息等。
在工作中,我用它来存储版本及组件的信息, 通过查询数据,确认ipa是否升级以及确定组件是否需要更新(RN热更新)等策略。
有时候我们需要对某些对象作快照,需要复制对象当前的状态。OC中提供了copy/mutableCopy的方法。系统提供的集合类,比人NSArray、NSSet、NSDictionary都提供了对于的方法。 对于我们自定义的对象,则可以通过实现NSCopying/NSMutableCopying协议来实现对应的功能。
最近,业务方提了一个需求,希望RN页面支持横竖屏。就去研究了一下, 顺便聊聊遇到的一些问题。
首先,应用要支持横竖屏旋转, 首先要在工程配置中勾选支持的方向。然后,不同的ViewController通过实现对应的接口实现横竖屏, 以及代码调用接口来手动实现横竖屏切换。
工程 - General - Deployment Info - Device Orientation
UIViewController需要实现3个接口
1 | - (BOOL)shouldAutorotate { |
只有当shouldAutorotate为YES时,其它两个接口才生效。
UIInterfaceOrientationMask 标识支持的方向集合, UIInterfaceOrientation用于当控制器被present出来后的视图方向
我们看代码, 可以看到2个方向, 界面方向和设备方向
1 | // 用户界面方向 |
很多时候, 界面方向会和设备方向不一致(支持当前设备方向的前提下)。 我们可以调用接口使其自动旋转。
1 |
|
目前只能通过修改orientation的方向来达到切方向的功能
1 |
|
大部分应用window不是以UIViewController为rootViewController。 一般是TabbarController或者NavigationControler。 要使得他们支持横竖屏,需要额外添加一个分类, 重新对应的接口
1 |
|
具体实现代码 请参考github库 https://github.com/fishmwei/iOSLearnList
番外:最近家里添丁,事情比较多,挺久没有更新博客了, 以后坚持一周至少一篇。
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。
最近在详细阅读React-Native源码,准备出一系列React-Native源码的解析及实现原理的连载文章,后续一一发布。 同时对遇到的iOS知识点进行梳理。基于React-Native 0.59.9版本的代码讲解。
本文讲的是NSCache,在RCTImage库中使用到的, 具体可以看 RCTImage/RCTImageCache.m中_decodedImageCache的使用。
RCTImage把获取到的图片缓存到RCTImageCache中,具体保存在_decodedImageCache。对于没有loaderHandler处理的url的图片, 会先从cache中查找,否则就从网络下载。
react-native: 0.49.3
推广RN之后, 经常收到Bugly指派过来的bug, 只是因为调用栈中包含了RN的一个符号 RCTFBQuickPerformanceLoggerConfigureHooks。
看了一下代码, RCTFBQuickPerformanceLoggerConfigureHooks这个函数是个空函数, 没有任何实现。
1 | // RCTBridget.m |
在头文件中, 通过 attribute((weak)) 修饰了函数声明。
将本模块的RCTFBQuickPerformanceLoggerConfigureHooks转成弱符号类型,如果遇到强符号类型(即外部模块定义了RCTFBQuickPerformanceLoggerConfigureHooks),那么我们在本模块执行的RCTFBQuickPerformanceLoggerConfigureHooks将会是外部模块定义的RCTFBQuickPerformanceLoggerConfigureHooks。
如果外部模块没有定义,那么,将会调用这个弱符号,也就是在本地定义的RCTFBQuickPerformanceLoggerConfigureHooks
相当于增加了一个默认函数。
原理:链接器发现同时存在弱符号和强符号,优先选择强符号,如果发现不存在强符号,只存在弱符号,则选择弱符号。如果都不存在:静态链接,恭喜,编译时报错,动态链接:对不起,系统无法启动。
我们通过machoView可以看到即使是release的二进制文件, 符号中也存在RCTFBQuickPerformanceLoggerConfigureHooks这个符号。
堆栈符号化是根据地址相离最近的符号来解析的, 在没有上传符号表时,许多堆栈都会解析成 RCTFBQuickPerformanceLoggerConfigureHooks + 偏移地址。无形中加大了RN维护人员的问题定位的时间成本。
删掉这个RCTFBQuickPerformanceLoggerConfigureHooks函数的声明与实现。从此,再没有bug来骚扰。
另外,最新版本的react-native已经删除RCTFBQuickPerformanceLoggerConfigureHooks的实现了。
github删除该段代码的记录:
https://github.com/facebook/react-native/commit/c49d3653ef35bb3b932055027af0c0a6bab91d84#diff-3694567fdb59b754cc845377d26f6ee2
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。
做RN开发,需要fork一份官网的库,来做一些修修改改以满足业务需求。同样的, 在开发中也需要fork一些库,然后就修改。在源库不断演进之后,我们需要同步自身库的代码。 就需要进行代码同步了。
CocoaLumberJack是一个用于mac或者iOS的日志库,简单易用, 可扩展。
可以通过设置Logger,分别把日志写入文件、终端、系统日志中。
DDLogLevel 7个等级
库不大,代码结构比较清晰。
我们在install一些库的时候, 可能会看到一些提示, 表明这个js库已经废弃了, 让大家去用xx库的。
1 |
|
Hello EveryOne!
很久以前就萌生了要创建一个独立的个人博客,由于个人的懒惰,迟迟没有付诸实现。在此之前, 在QQ空间、百度空间、chinaUnix博客、简书上零零散散的发布着文章, 终了感觉还是需要一个属于自己搭建的专业的博客,经过漫长的岁月,近期终于铆足了劲,花了些时间在github上搭建好博客了。同时也创建了自己的个人公众号。从此就有一个发布个人博文的小天地了,不再流浪。
ChinaUnix博客地址: http://blog.chinaunix.net/uid/24459558.html
开篇是一个立Flag的时机, 嗯, 这个博客用来记录分享个人技术生涯的一些学习总结、经验分享以及想法杂谈,欢迎拍砖。
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei (IT攻城狮小明),欢迎沟通交流。