自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Life runs on code

做最好的自己

原创 macOS安装PyTorch跑MNIST数据集

知乎上看到一个问题很有意思:TensorFlow 真的要被 PyTorch 比下去了吗? ,大致看了下下面的回答,站队PyTorch确实不少。 自己就尝试跑一下PyTorch,感受一下: 安装Python3,直接去官网下载macOS版本的安装包即可; 配置pip,国内可以配置阿里云的源,加快访问...

2020-04-30 23:44:10 220 0

原创 Python的模块搜索路径和包管理

Python模块搜索路径 Python模块搜索路径的官方文档: https://docs.python.org/3/tutorial/modules.html#the-module-search-path When a module named spam is imported, the int...

2020-03-04 23:31:45 155 0

原创 Golang笔记:包管理机制

Go语言使用包组织源代码,并实现命名空间的管理。Go不强制包名和所在目录同名,但好的工程实践建议同名。包定义不包括目录路径,但引用一般是相对GOPATH的全路径引用,所以包一般都会放在公司或个人的域名目录下。 包引用 Go语言自带标准库的包在$GOROOT/src下面,可直接引用; 自定义的包和...

2020-03-01 17:54:35 83 0

原创 关于时间管理:计划要粗,记录要细

大部分时间管理的误区,就是把时间管理搞的太复杂了。耗费了大量的精力在事无巨细的规划上,太多精细的计划还往往最容易受到冲击,无法很好的执行并给人带来了负反馈。在樊登读书看过一个例子很有同感: 不要太大力气去做整理,因为整理这件事情本身不创造价值。有这么一个实验:给大学生做时间管理的实验。把学生成绩...

2020-02-23 21:46:21 133 0

原创 vim和source insight使用对比

从2019年开始,相对高频的使用了vim,之前一直是source insight用的多。为什么突然vim用的多了呢?因为某些外部因素,公司开始逐步不让用source insight了,再加上代码库的编译都是在Linux机器上,直接在SSH到机器上修改编译比较方便。 先说说Source Insigh...

2020-02-10 22:48:27 312 0

原创 关于程序员写文档和发帖子的一些看法

年前,部门做知识管理,让每个人把自己负责的模块的一些文档补齐一下,输出一些代码导读或者问题定位之类的帖子。完后,看同事们发的帖子,果然每个人都有不同的行文逻辑和写作风格,有的读起来清晰易懂逻辑顺畅,有的就比较发散很意识流,有的甚至都不知所云。写好文章其实也很重要的,既是对已有工作和知识的总结帮助自...

2020-01-31 22:45:17 135 0

原创 Linux C/C++ 程序员毕业工作四年多来的感想

时间过得真快,从2015年毕业参加工作,到现在2019年底,已经工作了四年多,自己也到了而立之年。从此以后,作为国内一名程序员,年龄就开始慢慢变为减分项,一想到整个行业和国内一线大厂都特么这个尿性真是蛋疼。不过还好在初期收入不错,可以早些完成自己人生的原始积累也算欣慰了些,也正所谓:有得必有失,有...

2019-12-31 23:56:46 135 0

原创 Linux shell脚本引用类似include其他脚本的方法

Shell 脚本规模大了总会比较难维护,但是很多时候又得必须用。适当的拆分文件的方法挺好,Shell脚本没有include或者import机制,查了资料就是用source命令来解决。 一个小例子: test.sh #!/bin/bash source add.sh add 1 2 add.sh...

2019-11-29 22:15:45 259 0

原创 DFS递归回溯求排列组合的C实现

深度优先搜索DFS本身很好理解,即按照一定顺序递归遍历一个图,但是如何把所有的满足要求的遍历方式给求出来,这里就需要结合回溯backtrace了。 在LeetCode中,回溯标签下的很多题目都是求排列组合的,这也算是一类经典类型的题目了。C/C++写的多人都会有个特点:写代码的时候脑子里都是内存布...

2019-10-25 08:28:12 205 0

原创 从"阿里P8程序员征婚"事件看如何正确的审视自己

2019年9月下旬的一个网络热点知乎链接:如何看待「86年男生阿里 p8 年薪近两百万,就想找一个90后独生女」一事 ? 附一下我比较欣赏的@Cat Chen的回答: 感觉是偏科状元想要匹配全科优才生,既不会说配不上,但也不至于强大到任意通吃,所以就看缘分咯。 我把他定义为偏科状元,因为他在描...

2019-09-30 00:25:27 415 0

原创 Linux C pthread多线程,join和detach

Linux C多线程使用,有一个注意点需要注意,新启动的子线程一定要在主线程join,或者本身被设置为detach,否则会引起资源泄露,如每个线程都有自己的运行stack,内核中的task_stuct数据结够等。正如,父子进程中的子进程退出没有被父进程join就会变成僵尸进程一样。 一个例子,最终...

2019-09-18 23:39:47 161 0

原创 x64 ASM 常用汇编指令

语法习惯 立即数,$ 开头 寄存器,% 开头 取地址里面的值,偏移量(%寄存器)// 除了 lea 取地址指令)外,lea就是取地址 load effecive address 整形操作通用后缀,后缀 [b w l q 1 2 4 8] byte word l… quadruple, 表示多少字节...

2019-08-28 23:51:59 16787 0

原创 小练习 - C语言实现一个极简通用vector

C语言库比较少,很大的原因就是没有泛型,也没有class。但是C语言作为一个较为底层的系统级语言,操纵内存还是很灵活的。模仿C++实现一个泛型vector,可以使用void*,使用的时候强转对应类型,或者使用宏来封装一些操作。 这里实现一个极简的vector,拥有增删查功能,存储的元素放在连续内存...

2019-08-21 22:11:36 203 0

原创 VIM使用小技巧

VIM的优势 如果做Linux C/C++开发,经常ssh到Linux服务器编辑各种文件,那么熟练使用VIM绝对可以提高工作效率。 VIM的高效体现在多模式,可以很方便快速的对文件进行各种编辑修改,而这恰恰是在软件开发中经常遇到的场景。VIM流行这么多年,很多操作都是经过多年沉淀下来的高效操作,熟...

2019-07-29 23:51:43 178 0

原创 Linux C/C++ 共享库so的搜索路径和顺序

共享库的搜索 共享库的搜索出了系统默认路径外,还可以通过下面方法指定。首先通过环境变量指定: 环境变量 LIBRARY_PATH 编译期查找动态链接库路径, 导出给Makefile或者在Makefile开头指定; LD_LIBRARY_PATH 运行期查找动态链接库的路径,会在...

2019-06-22 19:26:38 1000 0

原创 编程中的心流模式flow

周末看电影,接触到了心流这个概念,挺有意思。了解心流理论,可以指导我们进入一个更为高效预约的工作状态。 电影《社交网络》里程序员写代码出现了两次"wired in", 一次是肖恩帕克去参观扎克伯格的创业团队,其中的一名程序员没有回应肖恩的问候;另一次就是安德鲁怒找扎克伯格询问关...

2019-05-27 01:13:15 347 0

原创 C语言实现极简递归下降JSON parser解析器

JSON字符串解析利用递归下降非常容易实现。本文实现了一个不支持数组,数字解析只支持正数long类型,只支持ASCII字符集的极简JSON解析器,未实现的功能后面也比较容易扩展。

2019-04-28 23:47:39 427 0

原创 网络安全:非对称加密RSA算法

非对称加密 RSA算法 对极大整数做因数分解的难度决定了RSA算法的可靠性。 加密 RSA加密过程简单描述如下: 选两个大质数 p,qp, qp,q,计算n=p⋅qn=p\cdot qn=p⋅q; 随机选一个整数eee,满足eee和(p−1)(q−1)(p-1)(q-1)(p−1)(q−1) 互...

2019-03-31 20:48:03 117 0

原创 Golang笔记:iota常量生成器

Golang的常量表达式值在编译期计算,iota是Golang提供的常量生成器,用于生成一组以相似规则初始化的常量。一个例子: const ( Zero = iota // 0 First // 1 Second // 2 H...

2019-02-28 22:45:39 246 0

原创 Linux C信号编程:接管段错误信号SIGSEGV打印调用栈

有时候,线上环境没有开启coredump,这时把进程复位时的调用栈打印出来就非常有利于问题定位了。怎么做呢?也很简单,我们在程序中接管SGISEGV信号,在信号处理函数打印调用栈信息即可。 信号处理可以看:UNIX环境高级编程 内核机制可以看:Linux内核源代码情景分析 这两本书虽老了点,但写的...

2019-02-20 22:34:33 1121 0

原创 Go语言模型:Linux线程调度 vs Goroutine调度

调度本质上体现了对CPU资源的抢占。调度的方式可以分为: 抢占式调度。依赖的是中断机制,通过中断抢回CPU执行权限然后进行调度,如Linux内核对线程的调度。 协作式调度。需要主动让出CPU,调用调度代码进行调度,如协程,没有中断机制一般无法真正做到抢占。 Linux NPTL 线程库 ...

2019-01-31 23:10:42 1491 0

原创 CMake的常见用法总结

初识CMake C/C++项目规模大了,Makefile就不太好组织编译工程,尤其是Makefile涉及了要自己推导C/C++的头文件依赖,输出信息也一般都比较混乱,完全依赖对应作者。相比较之下,使用CMake来做编译工程,就会清晰很多,省掉了自动推导头文件依赖,而且输出信息美观,编译.o, .i...

2019-01-21 22:41:48 295 0

原创 Linux C/C++ 程序员毕业工作三年多来的感想

2018年最后一天,总结一下今年的工作感想。先回顾下前两年的总结: Linux C/C++ 程序员毕业工作两年多来的感想 Linux C/C++ 程序员毕业工作一年多来的感想 2018年以来我也写了几篇心得感想: 提高编程速度的一些个人经验 程序员工作后如何有效的学习 理论不扎实,编程不会有...

2019-01-01 12:31:02 2053 0

原创 C++使用Protobuf举例

安装cpp的protobuf 按官方指导来:https://github.com/protocolbuffers/protobuf/tree/master/src 下载release包,解压后编译安装即可。 一个小例子 一个proto文件定义如下: syntax = &am...

2018-12-25 22:35:20 1157 0

原创 提高编程速度的一些个人经验

对于常规的业务代码,常见自动化脚本,偶尔迸发的想法原型,快速写代码是有套路可寻的,并且可以做针对性训练。说说我个人的经验: 常见的API和编程模型,要记住,就像背单词一样。 比如:写代码经常用到STL,那么常见类和的API,跑跑demo理解后,背背用法,针对性的记几次,绝对可以快速提高写常规代码的...

2018-12-21 23:28:14 950 0

原创 Go语言使用Protobuf举例

Golang是内存安全的带垃圾回收的强类型语言,那么必然不鼓励直接拿到一个地址随便进行类型强转的,虽然通过unsafe包也可以做到。并且,Golang的结构体是不能设置单字节对齐的,所以发送一个结构化的msg给另一个进程时一定要做序列化,接收端收到再做对应的反序列化。当然,也可以使用XML/Jso...

2018-12-12 00:39:07 336 0

原创 Linux网络编程:基于epoll的IO多路复用并发模型

Linux网络编程用的比较多的就是基于epoll的IO多路复用模型。高性能Web服务器Nginx底层使用的就是epoll。 常见的并发模型对比 多线程模型 多线程并发模型一般使用同步IO,每个连接起一个线程,编程相对直观容易,但是连接数非常受限,在IO密集型场景吞吐量就比较低。一台计算机同时可以执...

2018-12-09 00:05:27 738 0

原创 小练习 - LeetCode151 Reverse Words in a String的C语言解法

LeetCode 151. Reverse Words in a String 很适合练习C语言基础,练习一个OJ题目除了找最佳解法,还可以多想想刻意去练习一些数据结构等其他知识点,让练习举一反三。 Given an input string, reverse the string word b...

2018-12-02 22:41:31 244 0

原创 Go语言模型:可变参函数的实现机制

Golang的可变参实现跟C/C++的不太一样,编译器把可变参解析成了一个切片结构传给了函数,充分利用了Go内置的数据结构。而C/C++的实现则要结合x86平台调用约定和ABI手册了,可以看:Linux C variadic可变参数:va_list 在x86和x64下的区别与实现原理。 一个Go的...

2018-11-29 23:30:03 99 0

原创 Go语言模型:string的底层数据结构与高效操作

Golang的string类型底层数据结构简单,本质也是一个结构体实例,且是const不可变。 string的底层数据结构 通过下面一个例子来看: package main import ( "fmt" &a...

2018-11-25 11:44:42 1760 5

原创 Go语言模型:切片slice的底层实现

Go语言的切片实现可以看runtime的slice.go文件,切片是Go语言内置的数据结构,编译器识别到切片语法操作时会自动调用runtime对应底层实现,所以用起来就非常方便,这也是语言级的实现比库实现的优势。 可以通过一个例子来看切片的内存模型: // go version: 1.7 pack...

2018-11-21 23:44:00 409 0

原创 Go语言模型:通过runtime源码和汇编看interface的底层实现

Go的汇编 要看懂Go的内存模型,就需要对Go runtime的源码和Go的汇编指令有一定的了解。Go的汇编是基于 Pan9 汇编的风格,。Go的runtime源码中有大量的汇编,比如goroutine的上下文切换肯定是要汇编的,切换栈帧和寄存器,这些是无法通过简单的function call来完...

2018-11-19 00:07:45 631 0

原创 C语言侵入式链表

C语言虽然没有泛型,但是拥有对内存的终极解释权限,这个也带给了C语言强大的表达能力。对于复杂数据结构,侵入式链表绝对是一个好的经典实现,Linux Kernel 在 2.1 之后就使用 list_head 的内嵌来实现双向循环链表。而且,glibc也提供了这种实现的标准库 glibc/includ...

2018-10-26 23:38:28 577 0

原创 C语言用结构体给另一个同类型结构体赋值: 用等号即可

看到很多C代码的结构体赋值都是用memcpy函数来拷贝,其实根本不需要,用等号直接赋值即可。结构体描述的是的一块连续内存的内存布局,用等号来用一个结构体给另一个结构体赋值,编译不会有任何问题,其效果显然也和人直觉认为的一样,拷贝对应内存。 通过反汇编看编译器的行为,效果跟memcpy一样,还省掉了...

2018-10-05 18:07:50 13225 0

原创 程序员工作后如何有效的学习

工作满三年了,做技术不能只顾埋头搬砖,也要定期回顾,思考未来,不要让自己成为那种一年经验用了十年的开发者。 工作中积累的局限 从自己的工作谈起,菊厂C/C++通信软件开发。工作三年来,第一年收获最多,编程方面技能基本补齐可以很好的应对业务需求的开发,问题的定位解决。但是,很多稍微深入一点的知识...

2018-09-09 12:31:54 6380 7

原创 macOS使用VirtualBox安装Ubuntu18,配置共享目录和ssh

之前一直使用Parallels Desktop,今天想装一下最新的Ubuntu18,总是出问题。于是尝试了下VirtualBox5这款开源的虚拟机软件,挺好用,比之前Parallels Desktop占用的资源少了很多。 配置共享目录 点击菜单栏中的 Devices->...

2018-09-08 19:45:29 664 0

原创 HTTP1.1 基础: 用C语言实现200行内的极简http server

对HTTP协议有了基础的了解后,可以看这篇: HTTP 基础: 请求和响应的消息交互细节, 就可以用纯C来实现一个极简的http server了。这个的http server主要完成此功能: 通过URL访问server根目录的html类型文件。代码如下: #include &am...

2018-09-02 23:38:55 3495 4

原创 HTTP1.1 基础: 请求和响应的消息交互细节

HTTP 基础概念 都8102年了,即使不是一名web程序员,也还是需要了解一下http基本知识的。下面是RFC2616对HTTP的描述: The Hypertext Transfer Protocol (HTTP) is an application-level protocol fo...

2018-08-26 16:36:01 2008 0

原创 ML笔记 01:TensorFlow相关基本概念和基于符号的编程范式

最近学习机器学习相关的东西,理论看了一部分后,想跑几个TensorFlow的小例子,在实践中体会一下,发下总是不能够很好的理解TensorFlow的代码。然后各种查资料,看了下TensorFlow的入门知识,才了解到TensorFlow的编程范式是一种典型的基于符号的编程范式,计算过程是延迟计算,...

2018-08-12 18:27:08 402 0

原创 ML笔记 00:机器学习类型 & 深度学习和传统机器学习的区别

人工智能的核心是机器学习。机器学习是一门专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能的学科。 机器学习分类 监督学习 监督学习是一个单次决策的过程。监督学习可分为回归(Regression)和分类(Classifica...

2018-07-31 00:09:31 2467 0

提示
确定要删除当前文章?
取消 删除