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;
}

 

几个快速的代理

chinagrows.com

www.proxyie.cn

www.proxicate.net

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还提供了一大套模块的集合,其功能包括如何处理与硬件设备交流的诸多细节、如何从磁盘读取一个分区、如果从网络接口卡获取数据包等。有时我们称这些为设备驱动。

继续阅读