Category技术

第一次宕机

上周四篇的任务没有完成……

开了好多的坑没有补,两篇文章没有呢写完就感冒了。头痛、流鼻涕,就没有再写下去。如此难得的借口,索性把ACM也停掉了,没有再继续做题……

这两天感觉好多了,今天正跃跃欲试摩拳擦掌准备ACM的时候,突然收到了两条宕机的信息。各种紧张啊,寝室又不能上网,网站到底怎么样了完全不知道啊………………

于是下午抓紧到电子阅览室,结果……

好吧……重启了一下……一下……………………

附上这次宕机的监控报告,表示这是换主机以来的第一次宕机,好有纪念意义的说

(= =)

 

做SEO需要你的用心【转】

 

我一直深信一个原则,无论你从事任何行业,一定要对所从事的工作用心。在说SEO之前,先和大家分享一个十多年前在外地打工的故事。

那时我在一个电子厂上班,当时,对于我来说,单纯的把上班当做一个敷衍行的行为,相信有90%的上班族都是和我一样的行为,上班就是为了那点工资,能够偷懒就偷懒,能少干点活儿就少干点。我们没有太多的想法,也不会去考虑企业的利益。我有一个很好的朋友,和我一起进入了这家电子公司,他的态度和我完全不同,他对公司的产品和运营非常感兴趣,而且经常为公司提出一些改进的意见。和他一起工作的几位同事都嘲笑他,说他拍马屁,说他自不量力,不就是一个小小的基层员工吗,哪儿来那么多屁事。

因为是好朋友,我就把同事们说他的坏话告诉他,他对我说,这是一种工作态度问题,既然已经从事了一份工作,就要热爱这份工作,不然做一份工作就没有意义,他还说,他不喜欢消极的生活,做事情就要用心做好。当时,我特别不能理解这句话的意思,我心里是这么想的,一个最底层的小员工,你做的再好又怎么样,到最后还是一个小员工。每次,我们谈起工作态度的问题,就会发生矛盾,只有转移其它的话题。令我不可思议的是,他的很多意见竟然被公司采纳了,按照他的意见,公司进行了很多调整,为公司创造了不菲的价值。不到一年的时间,他就被提拔为我们部门的经理了。

也许不是每个老板都能慧眼识金,也许不是每个人都像他一样幸运,但从这个故事中,我们学到了很多。如果你打算从事一份工作,要么就用心做好,要么就直接放弃。不幸的是,大多人都在敷衍的工作,敷衍着生活。

对于从事SEO的站长来说,有几个是用心的呢,你是否问过自己呢。其实,从一些行业论坛中就能看出这个行业的基本情况,而如今很多看似比较有深度的论坛,进去后才会发现,原来这里是盗版横行之地,无数的盗版,无数的垃圾链接,从这些垃圾回复中就能看出,这些站长是否在用心去在做SEO,随随便便把一篇文章复制过来,粘贴到自己的博客上,就美其名曰为原创文章,不知道有多少人都在重复着这样的动作。

那么多做SEO的站长,有几个认真分析过竞争对手的网站,有几个认真的写过文章,有几个注意过用户体验,有几个站长有自己的思路和想法呢。基本都是人云亦云,人家怎么做,我就怎么做。站长的拿来主义非常严重,一个模板拿过来就用,你分析过模板的安全性吗,你确定你用的模板不存在恶意代码吗。人家说wordpress安全,你就用wordpress,你可知道,网站安全不是靠一个网站程序就决定的。网站出了问题,你分析过吗,研究过吗,知道问题出在哪里吗。

用心,体现在很多细节上,包括一篇文章的标题怎么写,内容怎么写,包括到每一个标点符号的运用。只要你用心了,搜索引擎一定会看到,用户也会看到。经常看到一些错误的观点,不停的被转载,明明是错误的,为什么我们还要去转播呢,你可知道,就是这一篇文章,就可能影响众多用户对你的网站评价。用户来到一个网站,如果看到的东西都是真实的,都是站长用心写的,他们无形中会对网站产生一种好感。而当用户看到几篇垃圾文章后,马上把你的网站列为黑名单。

我们不妨问下自己,对于SEO,我们真的用心了吗。

文章由 奇热网 http://www.mishi8.com/供稿。

当小白兔遇上大灰狼

欢乐的视频开场

转自PKAV技术宅小组,感谢@only_guest

=========我是罪恶的分割线==========

RT,这类信息你是不是也收到过?!

唔,QQ上最近出现了好多这类的信息。一般都是通过做一个假的空间登陆页面来获取用户的QQ密码一类诈骗。如图示:

昨晚,又收到了一条这类的消息。本打算默默回句话提醒一下对方改改密码,岂不知那盗号的居然还没有下线。于是就有了如下的对话……

盗号的好嚣张!!貌似到这里盗号者灰溜溜的下线了?!

所以今天写这篇文章的目的就是告诉大家这类链接背后的故事……

============我是正文的分割线==============

鸣谢PKAV技术宅小组提供的视频演示~

 

看到这里一定有人会说:既然这么恐怖,那么我们小白兔又改如何防御呢?

答案是:无法防御,防不胜防……

但是我们可以尽可能的不让自己上当~尽管小白兔无法与大灰狼匹敌,但是至少我们可以做到不去点陌生的链接,不去随便输自己的用户名密码。然后嘛,把这些诈骗的信息发给技术大牛来解决。

最后,为了更多的小伙伴们的账号安全,用力的转起吧!

欢迎↓点击下面↓的分享到按钮分享~



双路由器的设置方法(多图杀猫)

准备:

路由器两个,分别命名为路由器1(本例为腾达的一款路由器)、路由器2(本例为TP-lINK

网线一根

保证在只有路由器1的情况下能上网

1,设置计算机为自动获得IP

2,设置路由器1

1》登陆

2打开路由器1DHCP功能(重要!!)

点击DHCP服务器勾选启用

3》修改路由器1LANIP地址,就是路由器自己的IP,目的是与之后设置的路由器2IP不冲突。其实修改哪个都是无所谓的,只要不冲突就行…………

OK,路由器1设置完毕了

3,连接路由器2

做一根网线,插入路由器1的任意一个LAN口,另一头插路由器2WAN口。如图(网上 的图)

4,设置路由器2

1》链接到路由器2

2》登录路由器2

唔……TP-lINK的登录界面

3》修改路由器2LANIP,就是上文说的与路由器1不冲突~

4》修改路由器2的链接方式

修改为动态IP即可。

(上文我们启用了路由器1DHCP功能,则路由器2与路由器1下分的任意一台电脑处于平等关系,理论上会使路由器2下分的电脑速度有所减慢,但由于路由器2作为一个单独的设备存在,所有路由器2下分的机器指向路由器2的网关,使得安全性大大提高~PS:追求速度的话就把路由器2HUB使用,水晶头插入路由器2LAN口)【如果括号内的话读了两遍还是不懂的话就无视掉吧~~~~

5关闭路由器2DHCP功能【重要!!】(这一步之所以放在最后是因为设置完后要重启路由器的)

6》按照提示重启路由器2

OK,大功告成!

计算机可根据需要选择使用路由器1或路由器2上网~

【转载】linux下的gcc和gdb调试

GCC调试基础知识

以hello.c为例子,可以设置选项生成hello.i, hello.s, hello.o以及最终的hello文件:

hello.c : 最初的源代码文件;

hello.i : 经过编译预处理的源代码;

hello.s : 汇编处理后的汇编代码;

hello.o : 编译后的目标文件,即含有最终编译出的机器码,但它里面所引用的其他文件中函数的内存位置尚未定义。

hello / a.out : 最终的可执行文件

(还有.a(静态库文件), .so(动态库文件), .s(汇编源文件)留待以后讨论)

   如果你不通过-o指定生成可执行文件名,那么会默认生成a.out. 不指定生成文件名肯能覆盖你上次生成的  a.out.

e.g.

$ gcc hello.c

在不给gcc传递任何参数的情况下, gcc执行默认的操作: 将源文件编译为目标文件–> 将目标文件连接为可执行文件(名为a.out) –> 删除目标文件.

-c生成.o文件时,默认生成与源代码的主干同名的.o文件。比如对应hello.c生成hello.o. 但也可在生成目标文件时指定目标文件名(注意同时要给出.o后缀): $ gcc -c -o demo.o demo.c

$ gcc -Wall -c hello.c              : 生成hello.o

$ gcc -Wall -c -save-temps hello.c : 生成hello.i, hello.s, hello.o

注意-Wall 选项的使用场合:仅在涉及到编译(即会生成.o文件时,用-Wall)

多文件编译、连接

——————————————————————————–

如果原文件分布于多个文件中:file1.c, file2,c

$ gcc -Wall file1.c file2.c -o name

若对其中一个文件作了修改,则可只重新编译该文件,再连接所有文件:

$ gcc -Wall -c file2.c

$ gcc file1.c file2.o -c name

注意:若编译器在命令行中从左向右顺序读取.o文件,则它们的出现顺序有限制:含有某函数定义的文件必须出现在含有调用该函数的文件之后。好在GCC无此限制。

编译预处理

——————————————————————————–

以上述的hello.c为例, 要对它进行编译预备处理, 有两种方法: 在gcc中指定-E选项, 或直接调用cpp.gcc的编译预处理命令程序为cpp,比较新版本的gcc已经将cpp集成了,但仍提供了cpp命令. 可以直接调用cpp命令, 也可以在gcc中指定-E选项指定它只进行编译预处理.

$ gcc -E hello.c                            == $ cpp hello.c

上述命令马上将预处理结果显示出来. 不利于观看. 可采用-c将预处理结果保存:

$ gcc -E -c hello.i hello.c              == $ cpp -o hello.i hello.c

注意, -c指定名称要给出”.i”后缀.

另外, gcc针对编译预处理提供了一些选项:

(1) 除了直接在源代码中用 #define NAME来定义宏外,gcc可在命令行中定义宏:-DNAME(其中NAME为宏名), 也可对宏赋值: -DNAME=value 注意等号两边不能有空格! 由于宏扩展只是一个替换过程,也可以将value换成表达式,但要在两边加上双括号: -DNAME=”statement”

e.g. $ gcc -Wall -DVALUE=”2+2″ tmp.c -o tmp

如果不显示地赋值,如上例子,只给出:-DVALUE,gcc将使用默认值:1.

(2) 除了用户定义的宏外, 有一些宏是编译器自动定义的,它们以__开头,运行: $ cpp -dM /dev/null, 可以看到这些宏. 注意, 其中含有不以__开头的非ANSI宏,它们可以通过-ansi选项被禁止。

查看宏扩展

1, 运行 $ gcc -E test.c ,gcc对test.c进行编译预处理,并立马显示结果. (不执行编译) 2, 运行 $ gcc -c -save-temps test.c ,不光产生test.o,还产生test.i, test.s,前者是编译预处理结果, 后者是汇编结果.

利用Emacs查看编译预处理结果

针对含有编译预处理命令的代码,可以利用emacs方便地查看预处理结果,而不需执行编译,更为方便的是,可以只选取一段代码,而非整个文件:

1,选择想要查看的代码

2,C-c C-e (M-x c-macro-expand)

这样,就自动在一个名为”Macroexpansion”的buffer中显示pre-processed结果.

生成汇编代码

——————————————————————————–

使用”-S”选项指定gcc生成以”.s”为后缀的汇编代码:

$ gcc -S hello.c

$ gcc -S -o hello.s hello.c

生成汇编语言的格式取决于目标平台. 另外, 如果是多个.c文件, 那么针对每一个.c文件生成一个.s文件.

包含头文件在程序中包含与连接库对应的头文件是很重要的方面,要使用库,就一定要能正确地引用头文件。一般在代码中通过#include引入头文件, 如果头文件位于系统默认的包含路径(/usr/includes), 则只需在#include中给出头文件的名字, 不需指定完整路径. 但若要包含的头文件位于系统默认包含路径之外, 则有其它的工作要做: 可以(在源文件中)同时指定头文件的全路径. 但考虑到可移植性,最好通过-I在调用gcc的编译命令中指定。

下面看这个求立方的小程序(阴影语句表示刚开始不存在):

#include <stdio.h>

#include <math.h>

int main(int argc, char *argv[])

{

double x = pow (2.0, 3.0);

printf(“The cube of 2.0 is %fn”, x);

return 0;

}

使用gcc-2.95来编译它(-lm选项在后面的连接选项中有介绍, 这里只讨论头文件的包含问题):

$ gcc-2.95 -Wall pow.c -lm -o pow_2.95

pow.c: In function main':

pow.c:5: warning: implicit declaration of function pow’

程序编译成功,但gcc给出警告: pow函数隐式声明。

$ ./pow_2.95

The cube of 2.0 is 1.000000

明显执行结果是错误的,在源程序中引入头文件(#include <math.h>),消除了错误。

不要忽略Warning信息!它可能预示着,程序虽然编译成功,但运行结果可能有错。故,起码加上”-Wall”编译选项!并尽量修正Warning警告。

搜索路径

首先要理解 #include<file.h>和#include”file.h”的区别:

#include<file.h>只在默认的系统包含路径搜索头文件

#include”file.h”首先在当前目录搜索头文件, 若头文件不位于当前目录, 则到系统默认的包含路径搜索头文件.

UNIX类系统默认的系统路径为:

头文件,包含路径: /usr/local/include/ or /usr/include/

库文件,连接路径: /usr/local/lib/          or /usr/lib/

对于标准c库(glibc或其它c库)的头文件, 我们可以直接在源文件中使用#include <file.h>来引入头文件.

如果要在源文件中引入自己的头文件, 就需要考虑下面的问题:

1, 如果使用非系统头文件, 头文件和源文件位于同一个目录, 如何引用头文件呢?

——我们可以简单地在源文件中使用 #include “file.h”, gcc将当前目录的file.h引入到源文件. 如果你很固执, 仍想使用#include <file.h>语句, 可以在调用gcc时添加”-I.”来将当前目录添加到系统包含路径. 细心的朋友可能会想到: 这样对引用其它头文件会不会有影响? 比如, #include<file.h>之后紧接着一个#include<math.h>, 它能正确引入math.h吗? 答案是: 没有影响. 仍然能正确引用math.h. 我的理解是: “-I.”将当前目录作为包含路径的第一选择, 若在当前目录找不到头文件, 则在默认路径搜索头文件. 这实际上和#include”file.h”是一个意思.

2, 对于比较大型的工程, 会有许多用户自定义的头文件, 并且头文件和.c文件会位于不同的目录. 又该如何在.c文件中引用头文件呢?

—— 可以直接在.c文件中利用#include“/path/file.h”, 通过指定头文件的路径(可以是绝对路径, 也可以是相对路径)来包含头文件. 但这明显降低了程序的可移植性. 在别的系统环境下编译可能会出现问题. 所以还是利用”-I”选项指定头文件完整的包含路径.

针对头文件比较多的情况, 最好把它们统一放在一个目录中, 比如~/project/include. 这样就不需为不同的头文件指定不同的路径. 如果你嫌每次输入这么多选项太麻烦, 你可以通过设置环境变量来添加路径:

$ C_INCLUDE_PATH=/opt/gdbm-1.8.3/include

$ export C_INCLUDE_PATH

$ LIBRART_PATH=/opt/gdbm-1.8.3/lib

$ export LIBRART_PATH

可一次指定多个搜索路径,”:”用于分隔它们,”.”表示当前路径,如:

$ C_INCLUDE_PATH=.:/opt/gdbm-1.8.3/include:/net/include

$ LIBRARY_PATH=.:/opt/gdbm-1.8.3/lib:/net/lib

(可以添加多个路径,路径之间用:相隔,.代表当前目录,若.在最前头,也可省略)

当然,若想永久地添加这些路径,可以在.bash_profile中添加上述语句.

3, 还有一个比较猥琐的办法: 系统默认的包含路径不是/usr/include或/usr/local/include么? 我把自己的头文件拷贝到其中的一个目录, 不就可以了么? 的确可以这样, 如果你只想在你自己的机器上编译运行这个程序的话

前面介绍了三种添加搜索路径的方法,如果这三种方法一起使用,优先级如何呢?

命令行设置 > 环境变量设置 > 系统默认

与外部库连接

——————————————————————————–

前面介绍了如何包含头文件. 而头文件和库是息息相关的, 使用库时, 要在源代码中包含适当的头文件,这样才能声明库中函数的原型(发布库时, 就需要给出相应的头文件).

和包含路径一样, 系统也有默认的连接路径:

头文件,包含路径: /usr/local/include/ or /usr/include/

库文件,连接路径: /usr/local/lib/          or /usr/lib/

同样地, 我们想要使用某个库里的函数, 必须将这个库连接到使用那些函数的程序中.

有一个例外: libc.a或libc.so (C标准库,它包含了ANSI C所定义的C函数)是不需要你显式连接的, 所有的C程序在运行时都会自动加载c标准库.

除了C标准库之外的库称之为”外部库”, 它可能是别人提供给你的, 也可能是你自己创建的(后面有介绍如何创建库的内容).

外部库有两种:(1)静态连接库lib.a

(2)共享连接库lib.so

两者的共同点:

.a, .so都是.o目标文件的集合,这些目标文件中含有一些函数的定义(机器码),而这些函数将在连接时会被最终的可执行文件用到。

两者的区别:

静态库.a : 当程序与静态库连接时,库中目标文件所含的所有将被程序使用的函数的机器码被copy到最终的可执行文件中. 静态库有个缺点: 占用磁盘和内存空间. 静态库会被添加到和它连接的每个程序中, 而且这些程序运行时, 都会被加载到内存中. 无形中又多消耗了更多的内存空间.

共享库.so : 与共享库连接的可执行文件只包含它需要的函数的引用表,而不是所有的函数代码,只有在程序执行时, 那些需要的函数代码才被拷贝到内存中, 这样就使可执行文件比较小, 节省磁盘空间(更进一步,操作系统使用虚拟内存,使得一份共享库驻留在内存中被多个程序使用).共享库还有个优点: 若库本身被更新, 不需要重新编译与它连接的源程序。

静态库

下面我们来看一个简单的例子,计算2.0的平方根(假设文件名为sqrt.c):

#include <math.h>

#include <stdio.h>

int

main (void)

{

double x = sqrt (2.0);

printf (“The square root of 2.0 is %fn”, x);

return 0;

}

用gcc将它编译为可执行文件:

$ gcc -Wall sqrt.c -o sqrt

编译成功,没有任何警告或错误信息。执行结果也正确。

$ ./sqrt

The square root of 2.0 is 1.414214

下面我们来看看刚才使用的gcc版本:

$ gcc –version

gcc (GCC) 4.0.2 20050808 (prerelease) (Ubuntu 4.0.1-4ubuntu9)

现在我用2.95版的gcc把sqrt.c再编译一次:

$ gcc-2.95 -Wall sqrt.c -o sqrt_2.95

/tmp/ccVBJd2H.o: In function main':

sqrt.c:(.text+0x16): undefined reference to sqrt’

collect2: ld returned 1 exit status

编译器会给出上述错误信息,这是因为sqrt函数不能与外部数学库”libm.a”相连。sqrt函数没有在程序中定义,也不存在于默认C库 “libc.a”中,如果用gcc-2.95,应该显式地选择连接库。上述出错信息中的”/tmp/ccVBJd2H.o”是gcc创造的临时目标文件,用作连接时用。

使用下列的命令可以成功编译:

$ gcc-2.95 -Wall sqrt.c /usr/lib/libm.a -o sqrt_2.95

它告知gcc:在编译sqrt.c时,加入位于/usr/lib中的libm.a库(C数学库)。

C库文件默认位于/usr/lib, /usr/local/lib系统目录中; gcc默认地从/usr/local/lib, /usr/lib中搜索库文件。(在我的Ubuntu系统中,C库文件位于/urs/lib中。

这里还要注意连接顺序的问题,比如上述命令,如果我改成:

$ gcc-2.95 -Wall /usr/lib/libm.a sqrt.c -o sqrt_2.95

gcc会给出出错信息:

/tmp/cc6b3bIa.o: In function main':

sqrt.c:(.text+0x16): undefined reference to sqrt’

collect2: ld returned 1 exit status

正如读取目标文件的顺序,gcc也在命令行中从左向右读取库文件——任何包含某函数定义的库文件必须位于调用该函数的目标文件之后!

指定库文件的绝对路径比较繁琐,有一种简化方法,相对于上述命令,可以用下面的命令来替代:

$ gcc-2.95 -Wall sqrt.c -lm -o sqrt_2.95

其中的”-l”表示与库文件连接,”m”代表”libm.a”中的m。一般而言,”-lNAME”选项会使gcc将目标文件与名为”libNAME.a”的库文件相连。(这里假设使用默认目录中的库,对于其他目录中的库文件,参考后面的“搜索路径”。)

上面所提到的”libm.a”就是静态库文件,所有静态库文件的扩展名都是.a!

$ whereis libm.a

libm: /usr/lib/libm.a /usr/lib/libm.so

正如前面所说,默认的库文件位于/usr/lib/或/usr/local/lib/目录中。其中,libm.a是静态库文件,libm.so是后面会介绍的动态共享库文件。

如果调用的函数都包含在libc.a中(C标准库被包含在/usr/lib/libc.a中,它包含了ANSI C所定义的C函数)。那么没有必要显式指定libc.a:所有的C程序运行时都自动包含了C标准库!(试试 $ gcc-2.95 -Wall hello.c -o hello)。

共享库

正因为共享库的优点,如果系统中存在.so库,gcc默认使用共享库(在/usr/lib/目录中,库文件以共享和静态两种版本存在)。

运行:$ gcc -Wall -L. hello.c -lNAME -o hello

gcc先检查是否有替代的libNAME.so库可用。

正如前面所说,共享库以.so为扩展名(so == shared object)。

那么,如果不想用共享库,而只用静态库呢?可以加上 -static选项

$ gcc -Wall -static hello.c -lNAME -o hello

它等价于:

$ gcc -Wall hello.c libNAME.a -o hello

$ gcc-2.95 -Wall sqrt.c -static -lm -o sqrt_2.95_static

$ gcc-2.95 -Wall sqrt.c -lm -o sqrt_2.95_default

$ gcc-2.95 -Wall sqrt.c /usr/lib/libm.a -o sqrt_2.95_a

$ gcc-2.95 -Wall sqrt.c /usr/lib/libm.so -o sqrt_2.95_so

$ ls -l sqrt*

-rwxr-xr-x 1 zp zp 21076 2006-04-25 14:52 sqrt_2.95_a

-rwxr-xr-x 1 zp zp   7604 2006-04-25 14:52 sqrt_2.95_default

-rwxr-xr-x 1 zp zp   7604 2006-04-25 14:52 sqrt_2.95_so

-rwxr-xr-x 1 zp zp 487393 2006-04-25 14:52 sqrt_2.95_static

上述用四种方式编译sqrt.c,并比较了可执行文件的大小。奇怪的是,-static -lm 和 /lib/libm.a为什么有区别?有知其原因着,恳请指明,在此谢谢了! :)

如果libNAME.a在当前目录,应执行下面的命令:

$ gcc -Wall -L. hello.c -lNAME -o hello

-L.表示将当前目录加到连接路径。

利用GNU archiver创建库

$ ar cr libhello.a hello_fn.o by_fn.o

从hello_fn.o和by_fn.o创建libihello.a,其中cr表示:creat & replace

$ ar t libhello.a

列出libhello.a中的内容,t == table

(也可创建libhello.so)

关于创建库的详细介绍,可参考本blog的GNU binutils笔记

调试

——————————————————————————–

一般地,可执行文件中是不包含任何对源代码的参考的,而debugger要工作,就要知道目标文件/可执行文件中的机器码对应的源代码的信息(如:哪条语句、函数名、变量名…). debugger工作原理:将函数名、变量名,对它们的引用,将所有这些对象对应的代码行号储存到目标文件或可执行文件的符号表中。

GCC提供-g选项,将调试信息加入到目标文件或可执行文件中。

$ gcc -Wall -g hello.c -o hello

注意:若发生了段错误,但没有core dump,是由于系统禁止core文件的生成!

$ ulimit -c  ,若显示为0,则系统禁止了core dump

解决方法:

$ ulimit -c unlimited  (只对当前shell进程有效)

或在~/.bashrc 的最后加入: ulimit -c unlimited (一劳永逸)

优化

——————————————————————————–

GCC具有优化代码的功能,代码的优化是一项比较复杂的工作,它可归为:源代码级优化、速度与空间的权衡、执行代码的调度。

GCC提供了下列优化选项:

-O0 : 默认不优化(若要生成调试信息,最好不优化)

-O1 : 简单优化,不进行速度与空间的权衡优化;

-O2 : 进一步的优化,包括了调度。(若要优化,该选项最适合,它是GNU发布软件的默认优化级别;

-O3 : 鸡肋,兴许使程序速度更慢;

-funroll-loops : 展开循环,会使可执行文件增大,而速度是否增加取决于特定环境;

-Os : 生成最小执行文件;

一般来说,调试时不优化,一般的优化选项用-O2(gcc允许-g与-O2联用,这也是GNU软件包发布的默认选项),embedded可以考虑-Os。

注意:此处为O!(非0或小写的o,-o是指定可执行文件名)。

检验优化结果的方法:$ time ./prog

time测量指定程序的执行时间,结果由三部分组成:

real : 进程总的执行时间, 它和系统负载有关(包括了进程调度,切换的时间)

user: 被测量进程中用户指令的执行时间

sys : 被测量进程中内核代用户指令执行的时间

user和sys的和被称为CPU时间.

注意:对代码的优化可能会引发警告信息,移出警告的办法不是关闭优化,而是调整代码。

成功解决开机显示Floppy disk(s) fail(40)

开机显示Floppy disk(s) fail(40),很久以前就有这个问题。现成功解决:

方法如下:开机后按Del键,进入BIOS,移动光标到Standard CMOS Features处,再把光标移动到DriveA处,回车,选中None,按F10键,再按Y键保存设置后回车

继续:1装网卡

2系统

3驱动

4维护

 

任务不少

Vim 常用快捷键

  • 退出
  • :q 不修改退出
    :q! 强制退出
    :wq 保存退出
    :wq! 强制保存退出
    :w !sudo tee % 以root身份强制保存
    (:x) 同:wq 去掉括号,插件转义
    shitf+zz 同:wq

  • 搜索
  • / 在文件中向下搜索
    ? 在文件中向上搜索
    n 向前重复搜索
    N 向后重复搜索

  • 移动
  • :n 将光标定位到第n行
    gg 将光标定位到第一行
    :$ 将光标定位到最后一行 同G
    H 将光标定位到屏幕的顶端
    M 将光标定位到屏幕的中间
    L 将光标定位到屏幕的底端

  • 复制粘贴撤销
  • yy 复制光标当前行
    nyy 复制当前行开始n行
    :A,B co C 将A到B行的内容复制到第C行,最后行为$
    v 可视选择 光标移动选择文本
    p : 粘贴到当前光标后
    P : 粘贴到当前光标前
    u : 撤销
    Ctrl+R 撤消还原

  • 删除(同剪切,可粘贴)
  • dd 删除当前行
    ndd 删除当前行开始n行
    :nd 删除第n行
    :A,Bd 删除A到B行
    x 删除一个字符
    nx 删除n个字符
    dw 删除一个单词
    ndw 删除n个单词
    dG 删除当前光标到文件末尾的所有内容
    d0 删除当前光标到本行行首的所有内容
    d$ 删除当前光标到本行行尾的所有内容

  • 移动
  • :A,B mo C 将A~B行的内容移动到C行,最后行为$

  • 其他
  • . 重复上一命令

    邂逅电脑

    一九九九年,我还在上幼儿园。却一直对幼儿园有反感,每次都是趁老师把我从妈妈手中接过来时“逃跑”。逃跑的次数多了,爸爸妈妈不得不想办法了。

    一次爸爸郑重地把我叫到客厅,跟我签订了一份“协议”:“在此之的一个星期里坚持到幼儿园上学,认真听讲。那样爸爸就会买来一 台电脑。”出于对电脑的好奇,我变郑重地在黄色纸条上墙上了自己的名字……

    转眼间,一个星期过去了,得到老师好评的我高高兴兴回家了,门口大大小小的纸箱告诉我,爸爸真的把电脑买回家。

    推开家门,只见两位叔叔在电脑前敲打着什么,,爸爸在旁边看着。正当我打量着这台机器时,爸爸已经把两位叔叔送走了。

    爸爸指导我:“你把这个(鼠标)拿起来晃晃试试。”天真的我把鼠标拿起来,放到空中不停摇晃……爸爸耐心地告诉我鼠标要放到鼠标垫上,平移。晚饭后,爸爸把《开天辟地学电脑》放入光驱,一家三口学习其电脑来。

    第二天,爸爸通过请教同事知道了如何在电脑中打字。晚上,第一次看到自己的名字出现在显示器上,是我增加了对这台机器的好奇之心。

    我渐渐明白,一切应用程序是建立在操作系统上的。于是首先学习的便是操作系统的安装。当时主流的操作系统为windows98,并且当时的操作系统安装通过dos实现。于是,小学2年级的我得过了如format(格式化)、setup(安装)、dir(查看)等文件指令。其中对以上指令的尝试,都是在第一台电脑上完成的,几次都险些失败。

    现在,我已经完全掌握了windows98~windows7操作系统的安装方法、vb编程、photoshop、flash及网页制作,小时候的好奇心装换成了对电脑的求知欲,去挖掘更多的电脑知识,去挖掘更多的电脑知识。

    电脑仍有许多秘密值得去探索……

    Windows中Shift键的妙用

    落絮飞雁注:

    这篇文章是02年小站《金色的房子》中的唯一一篇『技术文』,也算是我发布的第一篇文章。放到这里来纪念一下。

    Ps:本文转载自网络,作者不详。


     

    在Windows中,Shift键有很多作用,尤其是当它和其他功能键组合时。比如大家会经常使用Ctrl+Shift来切换输入法;用Shift+Space在中文输入状态的半角与全角之间快速切换;在开机进入Windows时按住Shift键禁止系统的自启动项目运行;在光驱中放入光盘时按住Shift键可以防止光盘自动播放……实际上,Shift键还有很多妙用,我们一起来瞧一瞧:

    1.关闭多级文件夹窗口

    在资源管理器中按住Ctrl键并单击文件夹,可以把这个文件夹及其子文件夹均在单独的窗口中打开,那么我们关闭这些文件夹是不是要一个一个地关闭呢?当然不用,我们可以按住Shift键并点击“关闭”按钮,这样这个文件夹窗口及其上级的所有文件夹窗口都将被关闭。

    2. 轻松进ZIP

    一般情况下,我们在资源管理器中将文件(可多选)用鼠标拖至ZIP文件上时,鼠标会显示出“+”号状态。此时,如果松开鼠标,则会弹出“加入文件”对话框,选择“Move Files”命令完成加入文件。如果我们同时按住“Shift”键,则文件会直接加入,不弹出对话框。

    3. 另类的Shift键使用方法

    大家都知道Delete键是删除光标之后的字符,但同时按住Shift+Delete可以删除光标之前的字符。如果对选中的文字按Shift+Delete等同于剪切,Shift+Insert等同于粘贴(注:该方法只适用于记事本等几个软件)。

    4. 选择连续文件

    先选择第一个文件,按住Shift键再选择另一个文件,这时两个文件对角线之间的所有文件均会被选中。

    5. 直接删除文件

    按住Shift键同时,按Delete键即可以不通过回收站直接将文件删除。

    6. 更改文件的关联程序

    对于一个无关联的文件,我们可以先按住Shift键,再用鼠标右击那个文件,然后在弹出的菜单中选择“打开方式”,来重新选择它的关联程序。

    浙ICP备15034340号 | 浙公网安备 33011802000441号

    | 阿里云提供计算服务 | 本站由WordPress驱动

    © 2019 落絮飞雁的个人网站

    Theme by Anders NorénUp ↑