Nov
4
好久没有写了,写错了好久,后来发现是挂在指针上了,真杯具。
#include <stdio.h>
#include <stdlib.h>
#ifdef __GNUC__
#define WARN_IF_UNUSED __attribute__ ((warn_unused_result))
#else
#define WARN_IF_UNUSED
#endif
struct node {
int v;
struct node *next;
};
struct linklist {
struct node *head;
struct node *tail;
};
WARN_IF_UNUSED int init(struct linklist ll[], int n) {
int i;
for (i = 0; i < n; ++i) {
ll[i].head = (struct node *)malloc(sizeof(struct node));
if (ll[i].head == NULL) {
return 0;
}
ll[i].head->next = NULL;
ll[i].tail = ll[i].head;
}
return 1;
}
void dump(struct linklist *ll) {
struct node *p = ll->head->next;
while (p != NULL) {
printf("%d ", p->v);
p = p->next;
}
printf("\n");
}
WARN_IF_UNUSED int push(struct linklist *ll, int v) {
struct node *p = (struct node *)malloc(sizeof(struct node));
if (p == NULL) {
return 0;
}
p->v = v;
p->next = NULL;
ll->tail->next = p;
ll->tail = p;
return 1;
}
int isEmpty(struct linklist *ll) {
return (ll->head->next == NULL) ? 1 : 0;
}
int pop(struct linklist *ll) {
if (isEmpty(ll)) {
exit(1);
}
struct node *p = ll->head;
ll->head = p->next;
free(p);
return ll->head->v;
}
void radixSort(int a[], int n) {
struct linklist ll[10];
int flag, i, j, t, fact = 1;
if (init(ll, 10) == 0) {
exit(2);
}
do {
printf("---------------\n");
flag = 0;
for (i = 0; i < n; ++i) {
t = a[i] / fact % 10;
flag += !!t;
//printf("%d: %d\n", a[i], t);
if (push(&ll[t], a[i]) == 0) {
exit(2);
}
}
for (i = 0, j = 0; i < 10; ++i) {
printf("%d: ", i);
dump(&ll[i]);
}
for (i = 0, j = 0; i < 10; ++i) {
while (isEmpty(&ll[i]) == 0) {
a[j] = pop(&ll[i]);
j++;
}
}
fact *= 10;
}while (flag != 0);
}
int main() {
int a[] = {26,62,187,32,8754359,45324,54654,0,331,321312,12,4324,87,98};
#define N (sizeof(a) / sizeof(int))
radixSort(a, N);
int i;
for (i = 0; i < N; ++i) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
#include <stdlib.h>
#ifdef __GNUC__
#define WARN_IF_UNUSED __attribute__ ((warn_unused_result))
#else
#define WARN_IF_UNUSED
#endif
struct node {
int v;
struct node *next;
};
struct linklist {
struct node *head;
struct node *tail;
};
WARN_IF_UNUSED int init(struct linklist ll[], int n) {
int i;
for (i = 0; i < n; ++i) {
ll[i].head = (struct node *)malloc(sizeof(struct node));
if (ll[i].head == NULL) {
return 0;
}
ll[i].head->next = NULL;
ll[i].tail = ll[i].head;
}
return 1;
}
void dump(struct linklist *ll) {
struct node *p = ll->head->next;
while (p != NULL) {
printf("%d ", p->v);
p = p->next;
}
printf("\n");
}
WARN_IF_UNUSED int push(struct linklist *ll, int v) {
struct node *p = (struct node *)malloc(sizeof(struct node));
if (p == NULL) {
return 0;
}
p->v = v;
p->next = NULL;
ll->tail->next = p;
ll->tail = p;
return 1;
}
int isEmpty(struct linklist *ll) {
return (ll->head->next == NULL) ? 1 : 0;
}
int pop(struct linklist *ll) {
if (isEmpty(ll)) {
exit(1);
}
struct node *p = ll->head;
ll->head = p->next;
free(p);
return ll->head->v;
}
void radixSort(int a[], int n) {
struct linklist ll[10];
int flag, i, j, t, fact = 1;
if (init(ll, 10) == 0) {
exit(2);
}
do {
printf("---------------\n");
flag = 0;
for (i = 0; i < n; ++i) {
t = a[i] / fact % 10;
flag += !!t;
//printf("%d: %d\n", a[i], t);
if (push(&ll[t], a[i]) == 0) {
exit(2);
}
}
for (i = 0, j = 0; i < 10; ++i) {
printf("%d: ", i);
dump(&ll[i]);
}
for (i = 0, j = 0; i < 10; ++i) {
while (isEmpty(&ll[i]) == 0) {
a[j] = pop(&ll[i]);
j++;
}
}
fact *= 10;
}while (flag != 0);
}
int main() {
int a[] = {26,62,187,32,8754359,45324,54654,0,331,321312,12,4324,87,98};
#define N (sizeof(a) / sizeof(int))
radixSort(a, N);
int i;
for (i = 0; i < N; ++i) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
Nov
1
前天释出正式版,在公司花了几分钟下好ISO,昨天拷回去刻盘安装。
非常赞。用了2.6.31的kernel, Gnome 2.28, Firefox 3.5,速度很快。
Grub用的是1.97Beta4,跟以前的Grub不一样了,配置文件也不能直接手工改了,不很习惯。
启动的时候屏幕很少闪啊闪的切换了,启动速度也很快。
网络很方便使用,比以前更贴心了。
有很多很漂亮的桌面壁纸。
输入法换成了IBus而不是那ooxx的scim了,安装拼音以后觉得方便了非常多。
。。。
总之最深刻的印象就是,快,非常快。
非常赞。用了2.6.31的kernel, Gnome 2.28, Firefox 3.5,速度很快。
Grub用的是1.97Beta4,跟以前的Grub不一样了,配置文件也不能直接手工改了,不很习惯。
启动的时候屏幕很少闪啊闪的切换了,启动速度也很快。
网络很方便使用,比以前更贴心了。
有很多很漂亮的桌面壁纸。
输入法换成了IBus而不是那ooxx的scim了,安装拼音以后觉得方便了非常多。
。。。
总之最深刻的印象就是,快,非常快。
Oct
29
---# GNU的tail源码阅读笔记
---++ 获取源码
tail和head等原本是属于textutils软件包的,后来被统一合并到coreutils软件包中了。coreutils的主页是:http://www.gnu.org/software/coreutils/,可以从这里下载到所有的源码。如果你使用的是Ubuntu系统,还可以直接运行命令 apt-get source coreutils 直接从源中获取代码。
---++ 编译
先编译一下。跟其他开源软件基本上一致,先./configure一下,没有问题的话就make之。make结束以后,生成的可执行文件就在src目录下面
---++ 阅读
为了方便阅读,先ctags -R一下,生成tags;然后vim src/tail.c就打开了源码。代码比较细碎,零零散散2000多行,花了两三个小时才看完,大致读懂了代码的主干流程,这里记录一下。
* 初始化,有些乱七八糟的initialize_main/set_program_name/setlocale/bingtextdomain/textdomain都可以忽略,没做什么实事。atexit还算有点用,设置了退出的时候要把stdout关闭。
* 解析命令行参数。先上了个obsolete_parse_option(option都不加个复数s),貌似是为了兼容以前的命令行参数方式(posix2_version在200112这个版本以前的)。然后又来一个parse_options,这个就是按照man里面的格式来解析参数了。具体的参数man tail就可以看到,不多说。
* 判断一下输入是不是源于stdin,如果是的话,修改一下file和n_files。
* 然后给文件结构体分配空间,填进去每个文件的名字,然后是一个循环,调用tail_file来输出每个文件(传入结构体F[i]的指针)的内容
看看tail_file:
* 打开文件,失败的话当然就over了,return
* 看看要不要输出文件名(可以在命令后参数指定-q, -v)
* 调用tail函数输出需要输出的内容。tail函数根据是要输出行还是输出字符(命令行参数-c)来决定调用tail_lines还是tail_bytes。
* tail_lines: 如果是输出末尾n行,就调用file_lines函数,从文件的末尾开始,往前找到要开始输出的位置,调用dump_remainder输出;如果要输出第n行以后的内容,就调用start_lines跳过前n行,也是调用dump_remainder输出。
* tail_bytes和tail_lines的结构基本相同,不过那个函数是start_bytes了。
* 如果有-f参数(follow, 不断输出文件中新增加的内容), 检查一下文件的状态;否则就可以关闭了
* 如果指定了-f参数,那么执行if(forever && n_viable)这一段。其中n_viable是可以继续tail的文件的数量。
* 如果linux内核支持inotify特性(监控文件的变化,并发出通知),那么调用tail_forever_inotify函数来跟踪文件的变化(添加inotify的watch,然后用select来处理)。
* 否则使用tail_forever函数,做法是循环输出每个文件新增加的内容(上次读取的时候记录一下读取的位置),然后nanosleep一段时间(默认是1.0s)。
---++ 获取源码
tail和head等原本是属于textutils软件包的,后来被统一合并到coreutils软件包中了。coreutils的主页是:http://www.gnu.org/software/coreutils/,可以从这里下载到所有的源码。如果你使用的是Ubuntu系统,还可以直接运行命令 apt-get source coreutils 直接从源中获取代码。
---++ 编译
先编译一下。跟其他开源软件基本上一致,先./configure一下,没有问题的话就make之。make结束以后,生成的可执行文件就在src目录下面
---++ 阅读
为了方便阅读,先ctags -R一下,生成tags;然后vim src/tail.c就打开了源码。代码比较细碎,零零散散2000多行,花了两三个小时才看完,大致读懂了代码的主干流程,这里记录一下。
* 初始化,有些乱七八糟的initialize_main/set_program_name/setlocale/bingtextdomain/textdomain都可以忽略,没做什么实事。atexit还算有点用,设置了退出的时候要把stdout关闭。
* 解析命令行参数。先上了个obsolete_parse_option(option都不加个复数s),貌似是为了兼容以前的命令行参数方式(posix2_version在200112这个版本以前的)。然后又来一个parse_options,这个就是按照man里面的格式来解析参数了。具体的参数man tail就可以看到,不多说。
* 判断一下输入是不是源于stdin,如果是的话,修改一下file和n_files。
* 然后给文件结构体分配空间,填进去每个文件的名字,然后是一个循环,调用tail_file来输出每个文件(传入结构体F[i]的指针)的内容
看看tail_file:
* 打开文件,失败的话当然就over了,return
* 看看要不要输出文件名(可以在命令后参数指定-q, -v)
* 调用tail函数输出需要输出的内容。tail函数根据是要输出行还是输出字符(命令行参数-c)来决定调用tail_lines还是tail_bytes。
* tail_lines: 如果是输出末尾n行,就调用file_lines函数,从文件的末尾开始,往前找到要开始输出的位置,调用dump_remainder输出;如果要输出第n行以后的内容,就调用start_lines跳过前n行,也是调用dump_remainder输出。
* tail_bytes和tail_lines的结构基本相同,不过那个函数是start_bytes了。
* 如果有-f参数(follow, 不断输出文件中新增加的内容), 检查一下文件的状态;否则就可以关闭了
* 如果指定了-f参数,那么执行if(forever && n_viable)这一段。其中n_viable是可以继续tail的文件的数量。
* 如果linux内核支持inotify特性(监控文件的变化,并发出通知),那么调用tail_forever_inotify函数来跟踪文件的变化(添加inotify的watch,然后用select来处理)。
* 否则使用tail_forever函数,做法是循环输出每个文件新增加的内容(上次读取的时候记录一下读取的位置),然后nanosleep一段时间(默认是1.0s)。
Oct
20
写了一段代码实现在页面上直接统计成绩的功能。
打开Firefox(注意,不支持IE6,原因是IE6的浏览器URL只支持到435个字符的js代码,IE8支持到2083,但是懒得测试了)
登录 http://202.114.74.198 OR http://202.114.74.199
点击:成绩与重修查询 -> 多科查询
或者直接打开 http://202.114.74.199/stu/query_score.jsp
然后将下列代码全部copy到页面的地址栏,回车,看到结果。
p.s. 默认情况下是先讲成绩分别以“先课程类型升序 再成绩降序”排序。可自行修改。
压缩版:
非压缩版:
打开Firefox(注意,不支持IE6,原因是IE6的浏览器URL只支持到435个字符的js代码,IE8支持到2083,但是懒得测试了)
登录 http://202.114.74.198 OR http://202.114.74.199
点击:成绩与重修查询 -> 多科查询
或者直接打开 http://202.114.74.199/stu/query_score.jsp
然后将下列代码全部copy到页面的地址栏,回车,看到结果。
p.s. 默认情况下是先讲成绩分别以“先课程类型升序 再成绩降序”排序。可自行修改。
压缩版:
javascript:var trs=new Array();trs=getData();sorttrs(10,1);sorttrs(9,0);display(trs);function sorttrs(col,di){var i,j,t;for(i=0;i<trs.length-1;++i){for(j=1;j<trs.length-i-1;++j){if(di==0){if(trs[j][col] > trs[j+1][col]){t=trs[j];trs[j]=trs[j+1];trs[j+1]=t;}}else{if(trs[j][col]<trs[j+1][col]){t=trs[j];trs[j]=trs[j+1];trs[j+1]=t;}}}}}function display(){var gb=0,gx=0,zb=0,zx=0;var gbx=0,gxx=0,zbx=0,zxx=0;for(var i=1;i<trs.length;++i){var a=trs[i][8]*trs[i][10];var b=new Number(trs[i][8]);switch(trs[i][9]){case '公共必修':gb+=a;gbx+=b;break;case '公共选修':gx+=a;gxx+=b;break;case '专业必修':zb+=a;zbx+=b;break;case '专业选修':zx+=a;zxx+=b;break;}}document.writeln("公共必修: "+gb+"/"+gbx+"="+(gb/gbx)+"<br/>");document.writeln("公共选修: "+gx+"/"+gxx+"="+(gx/gxx)+"<br/>");document.writeln("专业必修: "+zb+"/"+zbx+"="+(zb/zbx)+"<br/>");document.writeln("专业选修: "+zx+"/"+zxx+"="+(zx/zxx)+"<br/>");document.writeln("总学分: "+(gbx+gxx+zbx+zxx));document.writeln("<table border=\"1\">");for(var i=0;i<trs.length;++i){document.writeln("<tr>");for(var j=0;j<trs[i].length;++j){var td=trs[i][j];if(i==0){td='<b>'+td+'</b>';}document.writeln("<td>"+td+"</td>");}document.writeln("</tr>");}}function getData(){function countTDChilds(tr){var trc=tr.childNodes;var count=0;for(var i=0;i<trc.length;++i){if(trc[i].tagName=="TD")count++;}return count;}function getTDChilds(tr){var trc=tr.childNodes;var tds=new Array();for(var i=0;i<trc.length;++i){if(trc[i].tagName=="TD")tds.push(trc[i].innerHTML);}return tds;}var isIE=document.all?true:false;var frames=document.getElementsByTagName("iframe");var doc=null;for(var i=0;i<frames.length;++i){if(frames[i].name=="mainIFR"){if(isIE){doc=frames[i].document;}else{doc=frames[i].contentWindow.document;}break;}}if(doc==null)doc=document;var tbl=doc.getElementsByTagName("table")[0];var tb=null;for(var i=0;i<tbl.childNodes.length;++i){var tb=tbl.childNodes[i];if(tb.tagName=='tbody')break;}var trs=new Array();for(var i=0;i<tb.childNodes.length;++i){var obj=tb.childNodes[i];if(obj.tagName=='TR'){if(countTDChilds(obj)==11){trs.push(getTDChilds(obj));}}}return trs;}
非压缩版:
javascript:
var trs = new Array();
trs = getData();
sorttrs(10, 1); /* 成绩,降序 0升序,1降序 */
sorttrs(9, 0); /* 课程类型,升序 */
display();
function sorttrs(col, di){
var i, j, t;
for(i = 0; i < trs.length - 1; ++i){
for(j = 1; j < trs.length - i - 1; ++j){
if(di == 0){
if(trs[j][col] > trs[j+1][col]) {
t = trs[j];
trs[j] = trs[j+1];
trs[j+1] = t;
}
} else {
if(trs[j][col] < trs[j+1][col]) {
t = trs[j];
trs[j] = trs[j+1];
trs[j+1] = t;
}
}
}
}
}
function display(){
var gb = 0, gx = 0, zb = 0, zx = 0; /*g=公共 z=专业 b=必修 z=选修*/
var gbx = 0, gxx = 0, zbx = 0, zxx = 0; /*公共必修学分*/
for(var i = 1; i < trs.length; ++i){
var a = trs[i][8] * trs[i][10];
var b = new Number(trs[i][8]);
switch(trs[i][9]) {
case '公共必修': gb += a; gbx += b; break;
case '公共选修': gx += a; gxx += b; break;
case '专业必修': zb += a; zbx += b; break;
case '专业选修': zx += a; zxx += b; break;
}
}
document.writeln("<html>\n<head>\n <title>成绩<\/title>\n<\/head>\n<body>");
document.writeln("公共必修: " + gb + " / " + gbx + " = " + (gb/gbx) + "<br/>");
document.writeln("公共选修: " + gx + " / " + gxx + " = " + (gx/gxx) + "<br/>");
document.writeln("专业必修: " + zb + " / " + zbx + " = " + (zb/zbx) + "<br/>");
document.writeln("专业选修: " + zx + " / " + zxx + " = " + (zx/zxx) + "<br/>");
document.writeln("总学分: " + (gbx + gxx + zbx + zxx));
document.writeln("<table border=\"1\">");
for(var i = 0; i < trs.length; ++i){
document.writeln(" <tr>");
for(var j = 0; j < trs[i].length; ++j){
var td = trs[i][j];
if(i == 0){
td = '<b>' + td + '</b>';
}
document.writeln(" <td>" + td + "</td>");
}
document.writeln(" </tr>");
}
document.writeln('</body>\n</html>');
}
function getData(){
function countTDChilds(tr){
var trc = tr.childNodes;
var count = 0;
for(var i = 0; i < trc.length; ++i) {
if(trc[i].tagName == "TD") count++;
}
return count;
}
function getTDChilds(tr){
var trc = tr.childNodes;
var tds = new Array();
for(var i = 0; i < trc.length; ++i){
if(trc[i].tagName == "TD") tds.push(trc[i].innerHTML);
}
return tds;
}
var isIE = document.all?true:false;
var frames = document.getElementsByTagName("iframe");
var doc = null;
for(var i = 0; i < frames.length; ++i){
if (frames[i].name == "mainIFR"){
if(isIE){
doc=frames[i].document;
}else{
doc = frames[i].contentWindow.document;
}
break;
}
}
if(doc == null) doc = document;
var tbl = doc.getElementsByTagName("table")[0];
var tb = null;
for(var i = 0; i < tbl.childNodes.length; ++i){
var tb = tbl.childNodes[i];
if(tb.tagName == 'tbody') break;
}
var trs = new Array();
for(var i = 0; i < tb.childNodes.length; ++i){
var obj = tb.childNodes[i];
if(obj.tagName == 'TR'){
if(countTDChilds(obj) == 11){
trs.push(getTDChilds(obj));
}
}
}
return trs;
}
var trs = new Array();
trs = getData();
sorttrs(10, 1); /* 成绩,降序 0升序,1降序 */
sorttrs(9, 0); /* 课程类型,升序 */
display();
function sorttrs(col, di){
var i, j, t;
for(i = 0; i < trs.length - 1; ++i){
for(j = 1; j < trs.length - i - 1; ++j){
if(di == 0){
if(trs[j][col] > trs[j+1][col]) {
t = trs[j];
trs[j] = trs[j+1];
trs[j+1] = t;
}
} else {
if(trs[j][col] < trs[j+1][col]) {
t = trs[j];
trs[j] = trs[j+1];
trs[j+1] = t;
}
}
}
}
}
function display(){
var gb = 0, gx = 0, zb = 0, zx = 0; /*g=公共 z=专业 b=必修 z=选修*/
var gbx = 0, gxx = 0, zbx = 0, zxx = 0; /*公共必修学分*/
for(var i = 1; i < trs.length; ++i){
var a = trs[i][8] * trs[i][10];
var b = new Number(trs[i][8]);
switch(trs[i][9]) {
case '公共必修': gb += a; gbx += b; break;
case '公共选修': gx += a; gxx += b; break;
case '专业必修': zb += a; zbx += b; break;
case '专业选修': zx += a; zxx += b; break;
}
}
document.writeln("<html>\n<head>\n <title>成绩<\/title>\n<\/head>\n<body>");
document.writeln("公共必修: " + gb + " / " + gbx + " = " + (gb/gbx) + "<br/>");
document.writeln("公共选修: " + gx + " / " + gxx + " = " + (gx/gxx) + "<br/>");
document.writeln("专业必修: " + zb + " / " + zbx + " = " + (zb/zbx) + "<br/>");
document.writeln("专业选修: " + zx + " / " + zxx + " = " + (zx/zxx) + "<br/>");
document.writeln("总学分: " + (gbx + gxx + zbx + zxx));
document.writeln("<table border=\"1\">");
for(var i = 0; i < trs.length; ++i){
document.writeln(" <tr>");
for(var j = 0; j < trs[i].length; ++j){
var td = trs[i][j];
if(i == 0){
td = '<b>' + td + '</b>';
}
document.writeln(" <td>" + td + "</td>");
}
document.writeln(" </tr>");
}
document.writeln('</body>\n</html>');
}
function getData(){
function countTDChilds(tr){
var trc = tr.childNodes;
var count = 0;
for(var i = 0; i < trc.length; ++i) {
if(trc[i].tagName == "TD") count++;
}
return count;
}
function getTDChilds(tr){
var trc = tr.childNodes;
var tds = new Array();
for(var i = 0; i < trc.length; ++i){
if(trc[i].tagName == "TD") tds.push(trc[i].innerHTML);
}
return tds;
}
var isIE = document.all?true:false;
var frames = document.getElementsByTagName("iframe");
var doc = null;
for(var i = 0; i < frames.length; ++i){
if (frames[i].name == "mainIFR"){
if(isIE){
doc=frames[i].document;
}else{
doc = frames[i].contentWindow.document;
}
break;
}
}
if(doc == null) doc = document;
var tbl = doc.getElementsByTagName("table")[0];
var tb = null;
for(var i = 0; i < tbl.childNodes.length; ++i){
var tb = tbl.childNodes[i];
if(tb.tagName == 'tbody') break;
}
var trs = new Array();
for(var i = 0; i < tb.childNodes.length; ++i){
var obj = tb.childNodes[i];
if(obj.tagName == 'TR'){
if(countTDChilds(obj) == 11){
trs.push(getTDChilds(obj));
}
}
}
return trs;
}
Oct
19
unsigned int a = 1;
int b = 0;
while (a + b >= 0) {
b--;
}
int b = 0;
while (a + b >= 0) {
b--;
}
#gcc -S a.c -o a.S
然后看到对应这些代码
movl $1, -4(%ebp)
movl $0, -8(%ebp)
L2:
movl -4(%ebp), %eax
leal -8(%ebp), %eax
decl (%eax)
jmp L2
movl $0, -8(%ebp)
L2:
movl -4(%ebp), %eax
leal -8(%ebp), %eax
decl (%eax)
jmp L2
阿牛如果有兴致的话,不妨研究一下AT&T的汇编。
Oct
18
// modified from http://acm.scs.bupt.cn/hefei/hefei.js
String.prototype.trim= function(){
// 用正则表达式将前后空格
// 用空字符串替代。
return this.replace(/(^\s*)|(\s*$)/g, "");
}
/**
* enables highlight rows in data tables
*/
function table_Init(container) {
// for every table row ...
try{
var rows = container.rows;
for ( var i = 0; i < rows.length; i++ ) {
for (var j = 0 ; j < rows[i].cells.length ; ++j) {
rows[i].cells[j].className = 'nowrap';
if (j > 3) {
try {
var text = rows[i].cells[j].innerHTML;
var AC = new RegExp("^\\d+/\\d+$");
var TRY = new RegExp("^\\d+/--$");
var NOTTRY = new RegExp("^0/--$");
if (NOTTRY.test(text)){
//rows[i].cells[j].className += ' notry';
}
else if (TRY.test(text)){
rows[i].cells[j].className += ' try';
}
else if (AC.test(text)){
rows[i].cells[j].className += ' ac';
}
}
catch (err) {
}
}
}
// ... with the class 'odd' or 'even' ...
if (i % 2 == 1) {
rows[i].className = 'odd';
}
else {
rows[i].className = 'even';
}
// ... add event listeners ...
// ... to highlight the row on mouseover ...
//if ( navigator.appName == 'Microsoft Internet Explorer' ) {
// but only for IE, other browsers are handled by :hover in css
rows[i].onmouseover = function() {
this.className += ' hover';
}
rows[i].onmouseout = function() {
this.className = this.className.replace( ' hover', '' );
}
// }
}
}
catch (err){
alert(err.description);
}
}
String.prototype.trim= function(){
// 用正则表达式将前后空格
// 用空字符串替代。
return this.replace(/(^\s*)|(\s*$)/g, "");
}
/**
* enables highlight rows in data tables
*/
function table_Init(container) {
// for every table row ...
try{
var rows = container.rows;
for ( var i = 0; i < rows.length; i++ ) {
for (var j = 0 ; j < rows[i].cells.length ; ++j) {
rows[i].cells[j].className = 'nowrap';
if (j > 3) {
try {
var text = rows[i].cells[j].innerHTML;
var AC = new RegExp("^\\d+/\\d+$");
var TRY = new RegExp("^\\d+/--$");
var NOTTRY = new RegExp("^0/--$");
if (NOTTRY.test(text)){
//rows[i].cells[j].className += ' notry';
}
else if (TRY.test(text)){
rows[i].cells[j].className += ' try';
}
else if (AC.test(text)){
rows[i].cells[j].className += ' ac';
}
}
catch (err) {
}
}
}
// ... with the class 'odd' or 'even' ...
if (i % 2 == 1) {
rows[i].className = 'odd';
}
else {
rows[i].className = 'even';
}
// ... add event listeners ...
// ... to highlight the row on mouseover ...
//if ( navigator.appName == 'Microsoft Internet Explorer' ) {
// but only for IE, other browsers are handled by :hover in css
rows[i].onmouseover = function() {
this.className += ' hover';
}
rows[i].onmouseout = function() {
this.className = this.className.replace( ' hover', '' );
}
// }
}
}
catch (err){
alert(err.description);
}
}
Sep
16
zz from 康神的Blog @ http://blog.kangkang.net/index.php/archives/229
1、首先记住这句话:永远不要承认自己是高手,因为这个称号是要付出代价的。
2、接到陌生电话后,一定要问清楚对方有什么事情,然后再告诉他(她)当前你目前所在的位置。
3、永远不要试图通过电话或者QQ解决某个问题,对方很有可能不知道菜单是什么东西,这不能怨他们,只能怨你自己,因为你永远懒于解释给他们听。
4、不要想着立马可以解决遇到的问题,因为你所遇到的总是崩溃的系统或者处于崩溃边缘的系统。
5、如果对方允许你重新安装系统,那就不要试着去做任何修复工作,因为重装系统是最快解决问题的办法。
6、除了询问哪些资料需要备份,你不要提问对方任何问题,除非你的心理承受能力特别强。
7、学会保守做人,每次开工前,都记得告诉对方:“我可能无法最终解决问题,还要继续吗?”。
8、对电脑的外观检查永远是第一位的,看看线路是否连接正常,看看USB接口是否连接了其他设备等等。
9、相信硬件的抗噪能力,尽可能的情况下,不要打开对方的机箱。没有做成医生,反倒被当作破坏者,那是很悲哀的事情。
10、做好被别人数落的心理准备,因为不懂电脑知识的人,往往懂得如何评价别人。
11、如果人家说他的内存有200G,你千万不要纠正说是硬盘,否则,你的噩运即将来临。
12、不知道菜单是什么东西的人,一般也会知道虚拟内存是怎么回事的,按照他的要求去调整就可以了,反正这个不会影响到你完成修理工作。
13、告诉对方,你没有任何杀毒软件,否则,您所安装的杀毒软件都是最差的,也是问题最多的。
14、别让自己成为处理打印机故障的高手,告诉你,打印机的麻烦事情可比电脑多多了。
15、坚决不要帮别人购买电脑,尤其是组装机,除非你想背上吃回扣的骂名,然后每天屁颠屁颠的去帮他们处理故障。
16、不要反感以下两句话,它会伴随你很久时间:
第一句:“我的电脑又出大问题了。”
第二句:“你还是过来帮我看看吧。”
另外忠告在办公室工作的朋友,要记住以下几点原则:
1、尽量不要去动别人的电脑,否则,若干天以后,你的这一行动会导致他的系统崩溃并带来埋怨。
2、不要去纠正别人的任何错误,除非你有说服别人的超强能力。
3、尽可能的前提下不要互相传递任何电子文档,因为你的文件很有可能被指责为病毒。
4、不要害怕指责,因为你无法逃避。
1、首先记住这句话:永远不要承认自己是高手,因为这个称号是要付出代价的。
2、接到陌生电话后,一定要问清楚对方有什么事情,然后再告诉他(她)当前你目前所在的位置。
3、永远不要试图通过电话或者QQ解决某个问题,对方很有可能不知道菜单是什么东西,这不能怨他们,只能怨你自己,因为你永远懒于解释给他们听。
4、不要想着立马可以解决遇到的问题,因为你所遇到的总是崩溃的系统或者处于崩溃边缘的系统。
5、如果对方允许你重新安装系统,那就不要试着去做任何修复工作,因为重装系统是最快解决问题的办法。
6、除了询问哪些资料需要备份,你不要提问对方任何问题,除非你的心理承受能力特别强。
7、学会保守做人,每次开工前,都记得告诉对方:“我可能无法最终解决问题,还要继续吗?”。
8、对电脑的外观检查永远是第一位的,看看线路是否连接正常,看看USB接口是否连接了其他设备等等。
9、相信硬件的抗噪能力,尽可能的情况下,不要打开对方的机箱。没有做成医生,反倒被当作破坏者,那是很悲哀的事情。
10、做好被别人数落的心理准备,因为不懂电脑知识的人,往往懂得如何评价别人。
11、如果人家说他的内存有200G,你千万不要纠正说是硬盘,否则,你的噩运即将来临。
12、不知道菜单是什么东西的人,一般也会知道虚拟内存是怎么回事的,按照他的要求去调整就可以了,反正这个不会影响到你完成修理工作。
13、告诉对方,你没有任何杀毒软件,否则,您所安装的杀毒软件都是最差的,也是问题最多的。
14、别让自己成为处理打印机故障的高手,告诉你,打印机的麻烦事情可比电脑多多了。
15、坚决不要帮别人购买电脑,尤其是组装机,除非你想背上吃回扣的骂名,然后每天屁颠屁颠的去帮他们处理故障。
16、不要反感以下两句话,它会伴随你很久时间:
第一句:“我的电脑又出大问题了。”
第二句:“你还是过来帮我看看吧。”
另外忠告在办公室工作的朋友,要记住以下几点原则:
1、尽量不要去动别人的电脑,否则,若干天以后,你的这一行动会导致他的系统崩溃并带来埋怨。
2、不要去纠正别人的任何错误,除非你有说服别人的超强能力。
3、尽可能的前提下不要互相传递任何电子文档,因为你的文件很有可能被指责为病毒。
4、不要害怕指责,因为你无法逃避。
Sep
15
突然发现这代码我写过n遍了,真不爽。。。
<?php
$dirname = "ooxx";
$pattern = 'google';
$replace = 'baidu';
$DontReplace = true;
replace_rec($dirname);
function replace_rec($dirname, $layer = 0){
global $DontReplace;
static $cnt = 0;
$dir = scandir($dirname);
natcasesort($dir);
foreach($dir as $item){
if($item == '.' || $item == '..') continue;
$path = "$dirname/$item";
if(is_dir($path)){
replace_rec($path, $layer+1);
}else if(is_file($path)){
$str = file_get_contents($path);
if(strpos($str, $pattern) === false) continue;
if($DontReplace == false){
$str = str_replace($pattern, $replace, $str);
file_put_contents($path, $str);
}
$cnt++;
for($i = 0; $i < $layer; $i++) echo ' '; echo "$cnt: $path\n";
}else{
echo "UNKNOWN TYPE\n";
}
}
}
?>
$dirname = "ooxx";
$pattern = 'google';
$replace = 'baidu';
$DontReplace = true;
replace_rec($dirname);
function replace_rec($dirname, $layer = 0){
global $DontReplace;
static $cnt = 0;
$dir = scandir($dirname);
natcasesort($dir);
foreach($dir as $item){
if($item == '.' || $item == '..') continue;
$path = "$dirname/$item";
if(is_dir($path)){
replace_rec($path, $layer+1);
}else if(is_file($path)){
$str = file_get_contents($path);
if(strpos($str, $pattern) === false) continue;
if($DontReplace == false){
$str = str_replace($pattern, $replace, $str);
file_put_contents($path, $str);
}
$cnt++;
for($i = 0; $i < $layer; $i++) echo ' '; echo "$cnt: $path\n";
}else{
echo "UNKNOWN TYPE\n";
}
}
}
?>