Never Give Up
来学校一个多星期了,本来打算去实习的,由于学校的规定,没去成。也罢,最后的校园生活了,好好享受吧。
在图书馆意外的发现了《疯狂的程序员》,记得还是大一的时候看的,当时没写完,看的还是连载。说起来这本书对我的影响还是蛮大的,看了之后在我心里埋下了一颗种子,那就是成为一名程序员。现在两年过去了,这颗种子也生根发芽,慢慢的长大了。我也将在毕业后投入到写程序的工作中,成为一名程序员。“程序员的双手就像魔术师的双手,将枯燥无味的代码变成丰富多彩的软件。”这是小说中的一句话,小说主人公绝影就是在这句话的影响下,决定成为一名程序员的。虽然没有像小说中的主人公那般专精一门技术,但自信C++水平还是不错的。也许我也是那种必须要有工作压力才能动力的学习的人吧。
这一次看小说是有不一样的感悟的。大一时好多技术上的东西不懂,因为无知所以神秘,越是神秘的东西越是激发好奇心,正是这种强烈的好奇心,加之小说相当励志,使我看后热血沸腾,立马下定决心苦练编程绝技,将来也要成为牛人。现在再回顾小说,那种要大干一场,成为绝顶高手的激情少了,更多的是对这几年自己学习,生活的回忆,小说许多情节也理解了,我想这就是成熟吧,相对而言的成熟。
正像小说结尾一般,结束同时也是开始。我的大学时光就要结束了,崭新的工作才刚刚开始。向着真正的疯狂的程序员努力吧,Never give up!
Dr.com密码读取程序
//读取本地机器保存的密码 //时间2008年6月22日16:35:13 #include <stdio.h> #include <string.h> #include <conio.h> #include <windows.h>//windows.h是c的库函数,用于编写win窗口 #define BUFSIZE 0x60/*这是一个宏定义,表示凡是在程序中出现的BUFSIZE变量,都被赋于值0x60再纠正你一下,在宏定义中,一般用大写*/ const char* szFilename = "\\micsystem.bin"; char* decipher(char buf[], int len) { double f1 = 9.9465868287297208320e-06, f2 = 96.00000, f; char* szPlainText; int i, r; char c; szPlainText = (char *)malloc(len); for(i = 0; i < len; i++){ if (buf[i] < 0x20 || buf [i] > 0x7E) continue; else{ c = buf[i] - 0x20; r = (0x75B9 * (i + 1)) % 0x188B9; // 第一轮余数计算 f = (double)r * f1 * f2; // 浮点运算 c = (c - (int)f) % 0x5F; // 最后一轮余数运算,结果 if(c <= 0) c += 0x7F; else c += 0x20; szPlainText[i] = c; } } return szPlainText; } int main() { char szFilePath[128]; char buf[BUFSIZE] = {0}; FILE* fp; GetSystemDirectory(szFilePath, MAX_PATH); strcat(szFilePath, szFilename); if((fp = fopen(szFilePath,"r")) != NULL) { fgets(buf, BUFSIZE, fp); printf("%s", decipher(buf, strlen(buf))); getch(); fclose(fp); } else{ printf("\ncannotopenfile:%s\n", szFilePath); return 1; } return 0; }
几个快速的代理
archlinux重要配置文件备份
/etc/inittab
#
# /etc/inittab
#
# Runlevels:
# 0 Halt
# 1(S) Single-user
# 2 Not used
# 3 Multi-user
# 4 Not used
# 5 X11
# 6 Reboot
## Only one of the following two lines can be uncommented!
# Boot to console
id:5:initdefault:
# Boot to X11
#id:5:initdefault:
rc::sysinit:/etc/rc.sysinit
rs:S1:wait:/etc/rc.single
rm:2345:once:/etc/rc.multi
rh:06:wait:/etc/rc.shutdown
su:S:wait:/sbin/sulogin -p
# -8 options fixes umlauts problem on login
c1:2345:respawn:/sbin/agetty -8 38400 vc/1 linux
c2:2345:respawn:/sbin/agetty -8 38400 vc/2 linux
c3:2345:respawn:/sbin/agetty -8 38400 vc/3 linux
c4:2345:respawn:/sbin/agetty -8 38400 vc/4 linux
c5:2345:respawn:/sbin/agetty -8 38400 vc/5 linux
c6:2345:respawn:/sbin/agetty -8 38400 vc/6 linux
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# Example lines for starting a login manager
#x:5:respawn:/usr/sbin/gdm -nodaemon
#x:5:respawn:/usr/sbin/gdm -nodaemon
#x:5:respawn:/usr/bin/kdm -nodaemon
#x:5:respawn:/usr/bin/slim >& /dev/null
x:5:once:/bin/su frog -l -c "/bin/bash --login -c startx >/dev/null 2>/dev/null"
# End of file
archlinux2009.2设置流程
装好archlinux后,该好好设置一番了。现将设置流程总结如下:
(1)安装拼音输入法
先安装yaourt,这是一个类似pacman的包管理软件,不过它能从aur中下载。到这里下载:
http://aur.archlinux.org/packages.php?ID=5863
$tar -xzvf yaourt-0.9.2.5.src.tar.gz
$cd yaourt-0.9.2.5
$makepkg
之后使用
# yaourt -S ibus ibus-pinyin
安装ibus,像搜狗拼音一样好用,并且更新很快。
(2)安装无线
# pacman -S wireless_tools
# pacman -S iwlwifi-5000-ucode
#ifconfig wlan0 up
#iwconfig wlan0 essid "MP508" key 1234567890 //"MP508"是无线路由的名字,key后是wep类型密码
#dhcpcd wlan0
至此无线可用
要开机自动使用无线,需要安装netcfg软件
#pacman -S netcfg
在/etc/network.d/examples中复制无线设置文件样本到/etc/network.d/中,我把它命名为wirelessp
CONNECTION="wireless"
DESCRIPTION="A wep encrypted wireless connection using static ip"
INTERFACE=wlan0
SCAN="no"
SECURITY="wep"
ESSID="MP508"
KEY="1234567890"
IP="static"
IFOPTS="192.168.1.100 netmask 255.255.255.0 broadcast 255.255.255.255"
GATEWAY="192.168.1.1"
DNS1=192.168.1.1
DNS2=208.67.222.222
设置如上,我使用到是静态地址。
再在/etc/rc.conf文件中设置NETWORKS项
NETWORKS=(wirelessp)
在lenovo ideapad Y430上安装archlinux2009.2
不知道什么原因,ubuntu8.1在我的笔记本运行地不是很好。奇怪是把ubuntu8.1当成livecd用反而比安装后更快,可能是安装后升级导致系统不稳定吧。在两次安装ubuntu后,终于忍不住安装自定制程度高,专为i686优化过到archluinx。经过一番周折,终于使archlinux还算良好到运行在我到ideapad Y430上。以下记录安装设置过程:
(1)下载archliunx安装文件,可以刻碟安装,也可以通过U盘安装,如果网速快,通过网络安装也不错。虽然据说可以硬盘安装,但我照网上教程试了下,发现安装2009.02使无法成功,可能版本太新的缘故。我选择到是archlinux-2009.02-core-i686.img 通过U盘安装,插入U盘,不用挂载,在bash中输入
dd if=archlinux-2009.02-core-i686.img of=/dev/sdb
我的U盘是设备sd1。
(2)现在开始安装,通过U盘启动电脑。之后输入命令 /arch/setup 接着就是按安装菜单顺序设置。设置文件
/etc/rc.conf /etc/hosts
#<ip-address> <hostname.domain.org> <hostname>
127.0.0.1 foolfrog.localdomain foolfrog
/etc/locale.gen 去掉
#zh_CN.GB18030 GB18030
#zh_CN.GBK GBK
#zh_CN.UTF-8 UTF-8
#zh_CN GB2312
前的#号。
之后就是安装了,等了十几分钟,安装完毕,重启进入系统。
深度介绍Linux内核是如何工作的
牛津字典中对"kernel"一词的定义是:"较软的、通常是一个坚果可食用的部分。"当然还有第二种定义:"某个东西核心或者最重要的部分。"对Linux来说,它的Kernel无疑属于第二种解释。让我们来看看这个重要的东西是如何工作的,先从一点理论说起。
广义地来说kernel就是一个软件,它在硬件和运行在计算机上的应用程序之间提供了一个层。严格点从计算机科学的角度来说,Linux中的Kernel指的是Linus Torvalds在90年代初期写的那点代码。
所有的你在Linux各版本中看到的其他东西--Bash shell、KDE窗口管理器、web浏览器、X服务器、Tux Racer以及所有的其他,都不过是运行在Linux上的应用而已,而不是操作系统自身的一部分。为了给大家一个更加直观的感觉,我来举个例子,比如 RHEL5的安装大概要占据2.5GB的硬盘空间(具体多大当然视你的选择安装来定),在这其中,kernel以及它的各个模块组件,只有47MB,所占 比例约为2%。
在kernel内部
那么kernel到底是如何工作的呢?如下面的图表。Kernel通过许多的进入端口也就是我们从技术角度所说的系统调用,来使得运行在它上面的应用程序可用。Kernel使用的系统调用比如"读"和"写"来提供你硬件的抽象(abstraction)。
从程序员的视角来看,这些看起来只是普通的功能调用,然而实际上系统调用在处理器的操作模式上,从用户空间到Kernel空间有一个明显的切换。同时,系统调用提供了一个"Linux虚拟机",可以被认为是对硬件的抽象。
Kernel提供的更明显的抽象之一是文件系统。举例来说,这里有一段短的程序是用C写的,它打开了一个文件并将内容拷贝到标准的输出:
#include <fcntl.h>
int main()
{
int fd, count; char buf[1000];
fd=open("mydata", O_RDONLY);
count = read(fd, buf, 1000);
write(1, buf, count);
close(fd);
}
在这里,你可以看到四个系统调用的例子:打开、读、写和关闭。不谈这段程序语法的细节,重点是:通过这些系统调用Linux Kernel提供了一个文件的"错觉",而实际上它不过是一堆数据有了个名字,这样一来你就不必去与硬件底层的堆栈、分区、头和指针、分区等交涉了,而是 直接以例子中的方式与硬件"交流",这也就是我们所说的抽象(abstraction),将底层的东西以更易懂的方式表达出来。
台前幕后
系统文件是Kernel提供的较为明显的一种抽象。还有一些特性不是这么的明显,比如进程调度。任何一个时间,都可能有好几个进程或者程序等待着运行。 Kernel的时间调度给每个进程分配CPU时间,所以就一段时间内来说,我们会有种错觉:电脑同一时间运行好几个程序。这是另外一个C程序:
#include <stdlib.h>
main()
{
if (fork()) {
write(1, "Parent\n", 7);
wait(0);
exit(0);
}
else {
write(1, "Child\n", 6);
exit(0);
}
}
在这个程序中创建了一个新进程,而原来的进程(父进程)和新进程(子进程)都编写了标准输出然后结束。注意系统调用fork(), exit() 以及 wait()执行程序的创建、结束和各自同步。这是进程管理和调度中最典型的简单调用。
Kernel还有一个更加不易见到的功能,连程序员都不易察觉,那就是存储管理。每个程序运行得都好像它有个自己的地址空间来调用一样,实际上它跟其他进 程一样共享计算机的物理存储,如果系统运行的存储过低,它的地址空间甚至会被磁盘的交互区暂时寄用。存储管理的另外一个方面是防止一个进程访问其他进程的 地址空间--对于多进程操作系统来说这是很必要的一个防范措施。
Kernel同样还配置网络链接协议比如IP、TCP和UDP等,它们在网络上提供机器对机器(machine-to-machine)和进程对进程 (process-to-process)的通信。这里又会造成一种假象,即TCP在两个进程之间提供了一个固定连接--就好像连接两个电话的铜线一样, 实际中却并没有固定的连接,特殊的引用协议比如FTP、DNS和HTTP是通过用户级程序来实施的,而并非Kernel的一部分。
Linux(像之前的Unix)在安全方面口碑很好,这是因为Kernel跟踪记录了每个运行进程的user ID和group ID,每次当一个应用企图访问资源(比如打开一个文件来写入)的时候,Kernel就会核对文件上的访问许可然后做出允许/禁止的命令。这种访问控制模式 最终对整个Linux系统的安全作用很大。
Kernel还提供了一大套模块的集合,其功能包括如何处理与硬件设备交流的诸多细节、如何从磁盘读取一个分区、如果从网络接口卡获取数据包等。有时我们称这些为设备驱动。