技术栈
探索各种泛IT领域遇到的技术问题,主要着眼入门技术。
干燥剂007860
这个作者很懒,什么都没留下…
展开
-
C语言(数组的地址)
总有人会对数组的地址这个概念产生怨念,他们认为一个数组a本身就是地址,殊不知数组名a只是其首元素的地址,而&a才是数组a的地址。 拓展:假设有一个数据 int a[5];那么,a代表的是a[0]的地址,换句话说,a等价于&a[0],假如这个地址值是0x123,那么a+1的值是0x127,因为这个1代表的是1个int(4个字节)型数据。另外,&a代表的是整个数原创 2016-02-25 09:36:39 · 2018 阅读 · 0 评论 -
Linux并发(POSIX信号量)
System-V的信号量是老古董,除非万不得已,否则我们一般用POSIX信号量,好用、简单、靠谱。 拓展:POSIX信号量分为两种,分别是POSIX无名信号量和POSIX有名信号量,这两种信号量比之前介绍的system-V的信号量机制要简洁,虽然没有后者的应用范围那么广泛(尤其在一些老系统中,因为system-V的信号量机制要更古老一些),但是POSIX良好的设计使得他们更原创 2016-03-24 10:36:43 · 970 阅读 · 1 评论 -
Linux音视频(alsa库的移植须知)
移植ALSA库时,要注意将编译出来的share/alsa整个目录内容拷贝到开发板的相同路径下,否则依赖于alsa库的应用程序会报错。原创 2016-02-29 10:21:15 · 1237 阅读 · 2 评论 -
Linux并发(task_struct结构体)
Linux下的进程也好,线程也罢,在内核中统统都以任务(task)的面目示人,他们用一样的内核数据结构来表示。 拓展:内核中用一个非常大的结构体来表达进程或者线程(统称任务task),下面是这个结构体的掠影:如果没什么意外,这个结构体可能是这个宇宙中最大的单个变量了,一个结构体就有好几k那么大,想想他包含了一个进程的所有信息,这么庞大也不足为怪了。LINUX原创 2016-03-14 11:30:50 · 535 阅读 · 1 评论 -
音视频(色深)
用多少个bit来表示一个像素点的颜色值,被称为色深,即bpp(bits per pixel)。一个像素点所对应的字节数越多,其色彩深度越深,表现力就越细腻。 拓展:我们通常听到的1600万色的液晶显示屏,指的也是色深的概念。这个数是怎么算出来的呢?实际上这种屏幕的一个像素点由4个字节组成,如下图所示。红绿蓝每种原色用一个字节来表达,每种颜色有256个梯度值,原创 2016-03-01 10:36:03 · 846 阅读 · 1 评论 -
Linux并发(函数的可重入性)
可重入函数是并发编程中必须要考虑的问题,否则代码就会有隐患,更糟糕的是这些隐患往往只能在特定场景下才能复现。 拓展:一个函数所谓的可重入性,是在多线程的语境下的概念:一个函数如果同时被多条线程调用,他返回的结果都是严格一致的,那么该函数被称为“可重入”函数(reentrance funciton),否则被称为“不可重入”函数。 在使用不可重入函数时要注意:多原创 2016-03-25 13:49:06 · 1423 阅读 · 0 评论 -
Linux并发(多线程)
进程实际上是一个线程组,因此一个多线程进程就是一个团队,里面的每一条线程都可以被单独调度,提高了程序执行的并发性。 拓展:通常,对于一个多任务的程序来说,需要创建多条线程,但是线程的多寡应该是由任务的轻重来决定的,因此对于一个更加灵活的多线程程序而言,更高级的使用技巧是所谓的线程池。下面是一个线程池的实现模板样图,并处于初始状态: 有这么几点原创 2016-03-15 14:29:20 · 2579 阅读 · 1 评论 -
Linux并发(易混淆的基本API)
初学者十有八九都会误以为signal函数是给进程发信号的,误以为kill函数是杀死进程的,还误以为exec函数栈是用来创建新进程的。 拓展:正确的理解是:1,signal()用来注册一个信号的出发行为。2,kill()用来向进程或者进程组发送指定信号。3,exec函数族用来改变一个现有进程的代码段。编辑原创 2016-03-26 11:29:02 · 421 阅读 · 0 评论 -
C语言(对内存的理解)
很多人学习C语言总是不得要领总是不入门,明明听了很多课,明明买了很多书,却无法独自写出规范像样的代码,要领在哪里?门在哪里? 拓展:学习编程要踏入的第一个门槛是对内存的深刻理解,记住一句话:任何数据、变量、指针甚至是函数,都是一块一块的内存。对他们取址,就是取得这块内存的首地址。从中我们还要有一个非常重要的结论:内存从本质上来讲都是一样的,所以理论上你只要有权限,那原创 2016-03-27 16:16:02 · 2116 阅读 · 0 评论 -
内核链表
“你,听过双向链表吗?”“恩恩,最简单的线性数据组织……” “装逼,知道它的优缺点吗” “恩恩,插入删除快速,遍历比较慢,而且……”“行了,知道内核链表吗”“恩恩,传统链表没有实现逻辑分离,因此操作接口……”“喂!你真的是一个,应届生?”“恩恩。”“你,明天过来找人事部的张小姐签……”“签你妹!每次打断我说话,滚!”“原创 2016-04-26 09:13:00 · 700 阅读 · 0 评论 -
漫谈C语言指针入门
天啊!为什么你学了3年还是无法正确理解指针地址的概念?别扯淡你一看C语言就懵逼,琢磨LOL英雄属性你挺6啊!拓展:有人一提到指针地址,就会一脸懵逼,因为在他们的脑海中,指针的概念始终建立不起来,总感觉自己跟指针之间隔着一层迷雾,那我现在就用1分钟的时间,拨开你们之间的这层迷雾!首先你要知道,计算机编程世界中的任何东西,都是一块块的内存!然后,指针是什么?那当然是一原创 2016-04-06 10:26:36 · 48319 阅读 · 40 评论 -
C语言(函数与宏)
普通函数的调用需要切换上下文的时间开销,因此如果一个函数非常短而且执行非常频繁,你应该考虑将其设计为内联函数,或者C语言的宠儿:宏。 拓展:实际上,宏和函数并不能完全彼此替换,因为宏参数跟函数参数不同,宏参数传递的是一个单纯的没有类型的标识符名字,而函数参数传递的是一个带数据类型的数值。比如下面的宏就无法用函数来替换:#define PRINT(member原创 2016-02-28 13:37:33 · 646 阅读 · 0 评论 -
C语言(三眼怪物)
听说C语言里住着一只三眼怪兽!专吃小朋友!他的名字叫三目条件运算符,赶紧跑啊! 拓展:C语言里唯一的三目运算符,即平常说的条件运算符。为什么是三目呢?来露把脸:(目标表达式1) ? (目标表达式2) : (目标表达式3)其逻辑是:先问一下目标表达式1为真吗?如果是就取表达式2的值作为整个表达式的值,否则就取表达式3作为整个表达式的值。例如:int a原创 2016-04-03 15:31:04 · 836 阅读 · 0 评论 -
Linux并发(控制线程不撞车的红绿灯)
信号量就是代码世界里的红绿灯,没有它,许多代码横冲直撞必将导致严重的“车祸”。 拓展:LINUX中可能用到的信号量有3种:Ststem-V信号量POSIX有名信号量POSIX无名信号量他们虽然有很多显著不同的地方,但是最基本的功能室一致的:用来表征一种资源的数量,当多个进程或者线程争夺这些稀缺资源的时候,信号量用来保证他们合理地、秩序地使用这些资源,而不会陷原创 2016-03-22 10:09:02 · 1019 阅读 · 1 评论 -
C语言(调试技巧)
C语言中的调试语句通常使用条件编译语句来框定,在不需要修改源代码的情况下,能非常方便地使能和清除调试语句。 拓展:例如有如下代码:// example.cint main(void){ printf("这条语句是正常语句");#ifdef DEBUG printf("这条是调试语句");#endif原创 2016-03-11 11:09:29 · 4014 阅读 · 0 评论 -
C语言(内存管理)
C语言的对内存的管理几乎是放任不管的,一切的分配、读写、释放等行为统统丢给程序开发者,C语言对开发者的要求更高,它牺牲了易用性来获取高效率。 拓展:C语言使用三个函数来申请动态内存(即堆内存): malloc()/calloc()/realloc(),使用free()来释放动态内存。C语言不关心你什么时候调用它们。 最常用的函数是malloc(),callo原创 2016-02-26 16:04:35 · 423 阅读 · 0 评论 -
C语言(思维陷阱)
编程开发的初学者若能掌握“机器思维”的技巧往往能事半功倍,但熟练掌握该技能后却要避免陷入思维陷阱。 拓展:所谓机器思维,就是贴近计算机运行的原理,充分利用计算机的优势。电脑最大的特点就是效率高,最擅长的事情就是循环操作,因此我们能使用循环来处理很多事情。但是一旦形成这样的思维习惯,也许就会陷入思维陷阱了。正确的姿势是:对算法时刻保持一定的数学敏感度,尽可能地将数学融原创 2016-04-05 07:46:53 · 949 阅读 · 0 评论 -
Linux并发(多线程协作)
一个程序里的线程数,就像一家公司里的员工数一样,太少了忙不过来,太多了入不敷出。因此我们需要有更好的机制来协调它们。 拓展:最理想的情况是:让进程有一些初始数目的线程(所谓的线程池),当没有任务的时候这些线程自动进入睡眠,有了任务他们会立即执行任务,不断循环。进程还应该可以根据自身任务的繁重与否来增删线程的数目,当所有的任务都完成了之后,所有的线程还能妥当地收官走人,不带走原创 2016-03-23 13:35:47 · 1322 阅读 · 1 评论 -
C语言(类型转换)
一个变量的类型如果被强制转化,这个转化也是中间过程,为了便于运算。但是该变量原有的类型、值都不会因此而改变。原创 2016-02-27 13:36:02 · 371 阅读 · 0 评论 -
C语言(支持插件的软件实现原理)
平常使用的库文件分为静态库和动态库,而用的最多的动态库还分为静态联编和动态加载两种方式,所谓的动态加载就是插件式管理动态库,是非常实用的技术。 拓展:假设有两个库,一个叫libxxx.so,一个叫libyyy.so,他们都实现了函数init(),但是功能不同,现在我们可以使用以下函数来动态加载指定的动态库:void *handle = dlopen("libxxx.原创 2016-03-12 17:08:42 · 3359 阅读 · 0 评论 -
C语言(关键字const)
const是C语言中最坑爹的关键字,典型挂羊头卖狗肉,const本意是常量,但是C语言const只能用来定义只读变量。 拓展:const在C语言中的作用,基本都是用来修饰指针的,而且都是前置修饰:const int *p = &a; // 前置修饰int *const p = &a; // 后置修饰前置修饰时,我们可以通过指针p访问到数据a,但是无法通过指针原创 2016-03-13 09:03:04 · 477 阅读 · 0 评论 -
C语言(一个真实的故事)
曾经有一个简单又不失牛逼的小技巧,老师教的时候我没有珍惜,等到同事因为用了这个技巧升任总工才后悔莫及,如果上天再给我一次机会,我会对老师说:我要学!如果非要定个学习时间,我希望是:立马! 拓展: 这是一个真实的故事。 一个以往的学生就职东莞易事特,一家做新能源的上市公司,去年年底升任其部门总工(软件开发总工程师)工资升到1.2w,我说你工作半年这么N原创 2016-04-13 10:19:31 · 5332 阅读 · 0 评论 -
C语言(总有刁民想害朕)
“总有刁民想害朕,他们总说:我是老古董,既没有面向对象的功能,又不提供泛型编程,更可恨的是:害得他们挂科!挂科是什么鬼?” —— C语言 拓展:面向对象是一种思想,一种构建软件结构的思路,而不是某种编程语言,C语言即便没有类,但同样可以使用结构体和函数指针,来实现面向对象的思想。整个Linux内核除了极少量的汇编代码,全部都是C语言编写的,其中的设备模型、虚拟文件系原创 2016-03-28 13:44:29 · 886 阅读 · 0 评论 -
C语言(如何优雅地使用字符串)
C语言中使用字符串有两种方式,用char型指针、用char型数组。他们有什么区别和联系? 且听我一一道来。C语言表示字符串的两种方式,look:char *s1 = "abcde"; // s1 是指针char s2[] = "uvxyz"; // s2 是数组首先,任何常量都将被放置到一个固定的内存区域,叫 .ro原创 2016-05-30 11:26:05 · 2045 阅读 · 0 评论 -
Shell脚本(最坑爹的括号)
写过Sell脚本的同学都应该有这样的感触:偶尔多写了或者少写了一个空格,就会报出奇奇怪怪的错误,由于空格是不可见字符,因此排查此类错误最靠谱的方式是,不要犯这个错误。Shell中有一个最基本的命令叫test,它可以测试数值、测试字符串和测试文件属性,是用得最多的命令,look:当我们在执行分支语句、循环语句的时候,一般都离不开它,比如下面的脚本原创 2016-04-22 11:07:26 · 1785 阅读 · 0 评论 -
Linux基础(FTP服务搭建)
昨天有两个同学在QQ(2437231462)上问我,说虚拟机的共享文件夹突然不能用了,找不到/mnt/hgfs了怎么办?我当时的回答是使用samba或者ftp来替代共享文件夹,同学又问FTP怎么搞?想到这个问题也许不止一个人会遇到,干脆就写篇短文回答一下。在Ubuntu下搭建FTP服务其实很简单,废话不讲,直接来步骤。第一,确保你的Ubunt原创 2016-05-18 10:04:11 · 1000 阅读 · 0 评论 -
Linux编程(文件描述符)
在Linux编程世界中,不可能没听过文件描述符这个概念,我们操纵任何设备的时候,几乎都要通过它来达成的,它究竟是何方神圣呢?随我描述符科学家来一探究竟。首先,我们在Linux下打开文件用的都是如下代码:int fd = open(... ...);当然有同学可能会说,有时也可以用fopen(),但是fopen()只是标原创 2016-04-23 06:51:45 · 496 阅读 · 0 评论 -
这四个原则能让你变得幸运
你一定见到过这样的人,学业有成,职场情场都春风得意,好像所有的运气他都占了。为什么有些人看起来就那么幸运,有些人就少了一些运气呢?公众号“千古刘传”有篇文章说,幸运是可以像技能一样学习的,然后总结了四个原因。第一点,你要有广泛的知识领域。因为大部分幸运都是在特定的专业领域发生的。假设有这么一个人,他PPT做得很好,在做PPT这件事儿上,肯定比那些不会做的转载 2016-05-19 09:10:52 · 1003 阅读 · 0 评论 -
听说今天是个节
“哇耶!今天是六一节!”“工作有着落了吗?”“…… 虽然大学快毕业,但他们都说我还像个孩子”“工作有着落了吗?”“…… 我小时候,梦想着有一天能住进迪士尼”“工作有着落了吗?”“滚粗!大六一的你不能说点别的吗?”“今年贵庚?”“……”一般的套路,今天的微信推送短文,画风应该是如下这样的。原创 2016-06-01 10:18:17 · 961 阅读 · 2 评论 -
Linux基础(vi,我的最爱)
很多时候我们需要在多个源程序之间实现函数、宏定义、外部变量等的跳转查询,甚至有时候需要到内核或库源代码里窥视他们真面目,这对于windows的各种IDE而言都是基本功能,但是我最爱的vi呢?可不可以提供这个趁手的功能呢?vi是我的最爱,不仅因为他的高效,还因为他支持插件,今天只讲一款,叫ctag,用来干嘛?当然就是帮我们做代码定义跳转啦。废话少讲,来搞搞:第一,原创 2016-05-09 20:00:08 · 1470 阅读 · 0 评论 -
C语言(调试绝活)
众所周知,写一段稍微复杂的代码,就会马上面临调试的需要,而最基本的检测程序运行情况的调试技巧,就是在代码中安插许多 “警哨” 来帮助我们监视随时可能发生的异常。技术上这没啥好说的,只是对于一个代码洁癖晚期患者来说,怎样写得干净又漂亮,是一件比写代码本身更重要的事情。先来一段反面教材看看:像上述程序那样的话,将不原创 2016-05-20 09:53:36 · 1708 阅读 · 0 评论 -
Linux基础(烧写系统)
某些情况下,我们可能会因为间歇性的脑残和手贱导致把粤嵌开发板GEC210的系统给搞死,比如在某神秘原因的驱使下,众目睽睽地删掉系统的关键性目录,然后目光呆滞地面对被格掉的板子,束手无策,默默流泪。今天我就是来挽救这些失足青年的。首先,面对kernel或者文件系统出问题的板子,我们有两种办法来挽救,第一是使用SD卡,第二是使用USB接口+fastboo原创 2016-05-22 13:57:09 · 1968 阅读 · 0 评论 -
Shell命令(readelf)
今天翻翻老本,翻到一款上天入地的神器 —— readelf,据说用它可以拂开云雾,抽丝剥茧,去伪存真,深入其里。它就像一把精工刀,专用于对ELF格式文件进行外科手术般的解剖,今天我们来见识见识。先来看看什么是ELF格式文件:在Linux中,ELF是标准的可执行文件格式,其全称是Executable and Linkable Format。 换句话说:原创 2016-05-16 17:59:38 · 952 阅读 · 0 评论 -
C语言(二维数组)
有同学在面对二维数组的时候,常常会犯浑。尤其是使用函数传参的时候,有老师讲到一维数组传参后就等价于一级指针,部分同学举一反三自学成才,想当然地认为二维数组传参后就等价于二级指针,这是错误的。假如,有如下代码:int a[2][3]; // 一个二维数组function(a); // 将二维数组传参给一个函数 上述代码中,就是将一个二维数组传递给一个函原创 2016-05-05 10:34:06 · 924 阅读 · 0 评论 -
Linux基础(Ubuntu网络配置)
最近在QQ经常听到有人喊救命:快来人啊!不得了啦!Ubuntu连不上网啊!今天,我代表月亮,来消灭……哦不!来拯救亿万黎民于水火!我是谁?我就是传说中的Ubuntu科学家。Ubuntu是一个依赖于网络的系统,没有网何止我们活不了,他也活不下去。那在虚拟机里的Ubuntu要是连不上网了,该怎么办呢?首先明确一下,网络的问题是复杂的,并不能保证一剂猛药直戳病灶,立原创 2016-04-14 09:08:32 · 19817 阅读 · 0 评论 -
C语言(浮点精度)
关于C语言的浮点数精度问题,很多人存在误解,他们往往认为精度指的是float、double和long double三种数据类型,这是片面的。 拓展:浮点数的二进制存储细节:对于每个不同的浮点数,都有相应的最小可辨识精度(即δ),此最小可辨识精度随着该浮点数的数值变化而变化,具体究竟是多少要具体分析该浮点数的二进制存储内部细节,找到其指数域之后才能确定,我们根原创 2016-03-29 10:06:20 · 11387 阅读 · 1 评论 -
Linux基础(文件类型)
Linux下一切(除网卡)皆文件的概念深入人心,那么世界万物在Linux系统中被分成多少种文件呢?他们有什么特点呢?Linux下除网卡外,任何东西都被归类为以下七种文件之一:块设备文件(block),简称 b字符设备文件(character),简称 c本地套接字(socket),简称 s符号链接文件(linkage原创 2016-04-15 07:51:37 · 703 阅读 · 0 评论 -
Linux基础(软件安装)
在Linux中,安装软件通常有三种途径:既可以使用安装包,也可以借助于APT,还可以从源码安装。他们各有特点,操作方式也不尽相同。Linux下的软件既可以是软件安装包,就像windows一样,也可以是源码包。而对于安装包而言,不同的Linux发行版所使用的格式不一样,比如RedHat使用的是yum格式安装包,Ubuntu则使用deb格式以Ubuntu为例,安原创 2016-04-28 08:08:08 · 727 阅读 · 0 评论 -
Shell脚本(自动填充函数模板)
最近很多同学在看我视频教程的时候,对 vii 这货很好奇,vii 是 vi 的亲戚吗?为什么用它新创建一个新程序能自动填充程序框架代码呢? 今天就来扒一扒这货。其实,vii 是我写的一个脚本,跟 vi 没半毛钱关系,只不过借用一下这个名字而已。那这个脚本长什么样呢?look:下面听我详细为你解析上面的代码,来看第1行:#!/bin/bash原创 2016-05-10 10:28:06 · 2671 阅读 · 0 评论 -
算法(让人着迷的傅里叶分析)
世界是复杂的,世界又是简单的。一切复杂的事物,背后总有最简单的元素。一切计算机软件的基本运算单元都是0和1,一切亚原子粒子本质都是超弦的不同震荡模式,而一切波形,竟然都可由最简单正弦波叠加而成!这就是理工领域最重要的基本算法——傅里叶分析。一般而言,说到傅里叶级数和傅里叶变换,似乎都会觉得比较高深莫测,或者是枯燥乏味,但是,这个数学工具是迄今为止人类科技进步的一把最重要最锋利的尖刀原创 2016-05-24 11:49:09 · 4542 阅读 · 0 评论