0%

首先区分两个概念:位图与矢量图。

位图,又称光栅图像,指的是图像由点阵组成,就是最小单位由像素构成的图,只有点的信息,所以也叫做点阵图、像素图。常见的格式有:JPG、PNG、GIF等。

矢量图是根据几何特性来绘制图形,使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算得到的,特点是放大后图像不会失真,与分辨率无关,这也是矢量图与位图最大的区别。常见的格式有:CAD、Flash等。

下面介绍常见的图像压缩算法。

Read more »

之前看到尤瑟纳尔说过的一句话“世界上最肮脏的,莫过于自尊心”,就随手发在了网上。下面嘘声一片,这时候我又想起了一句话:你的问题是读书太少,想的太多。没别的意思,我们需要的是在大量信息摄入后的认真思考,而不是自我发酵式的空想。这周看了一本书《暗时间》,与你们分享一下。

《暗时间》来自一篇历时八年的博客。用作者的话说:“写博客这件事情给我最大的体会就是,一件事情如果你能够坚持做8年,那么不管效率的频率多低,最终总能取得一些很可观的收益。而另一个体会就是,一件事情只要你坚持得跃然久,‘坚持’就会慢慢变成‘习惯’。原本需要费力去驱动的事情便成了家常便饭,云淡风轻。”这本书的内容主要关于心智模式、学习方法和时间利用。

Read more »

十五年,第九张专辑:《再生》。

对于80末90初的人来说,相信很多都是听着羽泉的歌长大的。还记得小时候最开始听到的还是冷酷到底,热潮传遍了大街上的音箱店。那时候都还是用磁带来传播的,那时候最大的愿望就是能有一个播放机和这盘磁带。冷酷到底是羽泉发行的第二张专辑。除了冷酷到底这首歌,还有一首无比温暖的歌:彩虹。

02年的时候升入了初中,当时校园里流行着复读机,多半还都是步步高的,好久没听到步步高的消息了。然后就听到了羽泉的深呼吸。可以说深呼吸从此以后就成了羽泉的主旋律,特别在《再生》这张专辑中更能体现出来。“深呼吸,闭好你的眼睛,全世界有最清新氧气”,后来对这句歌词特别怀念,特别现在的时候。

在初中短暂的三年中,还有另一首歌一直陪伴着我:奔跑。这么一首正能量的歌曲一直陪伴我到高考。

Read more »

动态链接使用共享库的一个主要目的就是允许多个正在运行的进程共享存储器中相同的库代码,因而节约资源。那么,多个进程是如何共享一个程序的一个拷贝的呢?一种比较好的方法就是编译库代码,使得不需要链接器修改库代码,就可以在任何地址加载和执行这些代码。这样的代码就叫做位置无关的代码(position-independent code, PIC)。

PIC的特点是,它被加载到任意地址空间都可以正确的执行,这点是显著区别于可重定向文件的。其原理是PIC对常量和函数入口地址的操作都是基于PC+偏移量的寻址方式。即使程序被移动,但是PC也变化了,而偏移量是不变的,所以程序仍然可以找到正确的入口地址或者常量。那些引用了绝对内存地址的指令(比如绝对跳转指令)必须被替换为PC相对寻址指令。这些间接处理过程可能导致PIC的运行效率下降,但是目前大多数处理器对PIC都有很好的支持,使得这效率上的这一点点下降基本可以忽略。下面具体说明。

Read more »

链接(linking)就是将不同部分的代码和数据收集和组合成为一个单一文件的过程,在现代系统中,链接由叫做链接器(linker)的程序自动执行。典型的链接器把由编译器或汇编器生成的若干个目标模块整合成一个被称为载入模块或可执行文件的实体,其可以被操作系统直接执行。其中,某些目标模块是直接作为输入提供给链接器的;而另外一些目标模块则是根据链接过程的需要,从库文件中取得。

链接器使得分离编译(Separate Complication)成为可能,即若干个源程序可以在不同的时候单独进行编译,然后在恰当的时候整合到一起。下面我们主要来讨论下从源文件翻译成可执行目标文件的过程,随后再来讨论下静态链接和动态链接。

Read more »

主要讨论C语言怎样组织正在运行的程序的数据结构的细节。

我们知道知道在UNIX操作系统中,一个C语言文件经过预处理(cpp),编译(cc1),汇编(as)和链接(ld)后可以得到可执行文件a.out。我们可以用size命令(或nm、dump)检查可执行文件,它会告诉你这个文件中的三个段(文本段.text,数据段.data,.bss段)的大小。文本段包含程序的指令。由于程序的文本内容和大小都不会变化,链接器把指令直接从文件拷贝到内存中,不再处理。数据段包含经过初始化的全局和静态变量以及它们的值。BSS段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据段之后。当这个内存区进入程序的地址空间后全部清零,通常是memset全部置0。通常把数据段和BSS段统一称为数据区。上面这些内容可以通过size命令很直观的查看与验证。除了上面提到的程序指令、全局和静态变量,我们还有局部变量等数据需要存储。这就引出了堆栈段(stack)和堆空间(heap)。下面将详细讨论数据区、堆栈段和堆空间。

Read more »

C语言中数组与指针是不可分开而论的,下面先说说数组T a[n]。

1.数组的访问方式有两种:指针形式(a+i)和下标形式a[i]。而编译器对这两种方式的操作解析是一样:把a作为数组首元素的首地址,然后再加上i作为地址偏移,算出新的地址,然后从新的地址中取出值。而对于偏移的计算为isizeof(T)。如果计算过程反过来,也就是i[a]也具有同样的含义。

2.a表示什么?对于上面两种情况可以知道a表示数组首元素的地址。那么a还有其它的意义吗?当然,sizeof(a)=n*sizeof(T)。这里a表示数组的地址(把数组看成一个整体),而不是首元素的地址。实际上除了作为sizeof()的参数外,a都表示数组的首元素的地址。

Read more »

这里所说的符号是大家不常用的,而且可能出错的符号。不仅仅是指运算符,具体有注释符号,反斜杠,自增自减操作符。

1.关于注释符号

[cce_cpp tab_size=”4”]
int//i;
y = x/*p;
[/cce_cpp]
编译器剔除注释不是简单的剔除,而是用空格代替原来的注释。所以第一个表达式是正确的。而第二个表达式则会被编译器认为p为注释的一部分。

2.反斜杠(\)
C语言里以反斜杠(\)表示断行。编译器会将反斜杠剔除掉,跟在反斜杠后面的字符自动连接到前面一行。但是注意:反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格。

Read more »

Struct与union作为C语言的关键字,定义与用法这里就不说了。下面主要针对几点进行说明。

1.Struct与内存对齐

先看一下下面三个结构体,在不实验的情况下能确定的说出他们的大小?

[cce_cpp]
struct test1
{
    char a;
    char c;
    short b;
};

struct test2
{
    char a;
    short b;
    char c;
};

struct test3
{
    char a;
    int b;
    char c;
};
[/cce_cpp]

编译器会自动进行成员变量的对齐,以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对界(natural alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。

Read more »

最近在实验室白天完全是不敢看dota视频,连dota视频网页都不敢打开,太显眼了,但是又想关注有没有精彩视频更新,怎么样才能在不打开网站的情况下知道视频情况呢?
想了想,还是尝试用python写个小助手。python以前只是简单的看过,小白阶段。但是python上手确实太快了。下面就是刚才利用2个小时写的脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import urllib
import re

def dotareplay(url):
  content = urllib.urlopen(url).read()
  content = content.decode('utf-8')
  matchtitle = re.findall(u'<li class="v_title"><a href=".*" charset="100344-18935-[1-9]-2" target="video" title=".*">', content)
  if matchtitle:
  for eachtitle in matchtitle:
  findeachtitle=re.search('<li class="v_title"><a href="(.*)" charset="100344-18935-[1-9]-2" target="video" title="(.*)">', eachtitle)
  print findeachtitle.group(2)
  print findeachtitle.group(1)

def main():
  dotareplay('http://game.youku.com/')

if __name__ == '__main__':
  main()
Read more »