浏览次数: 三月 6th, 2010 / 1 Comment » / by 小黑
+———————+———————+
| start_time | end_time |
+———————+———————+
| 2010-03-04 00:00:00 | 2010-03-19 00:00:00 |
| 2010-03-04 00:00:00 | 2010-03-20 00:00:00 |
| 2010-03-06 00:00:00 | 2010-03-07 00:00:00 |
| 2010-03-06 07:53:30 | 2010-03-06 07:53:30 |
| 2010-03-06 07:53:58 | 2010-03-06 07:53:58 |
| 2010-03-06 08:11:37 | 2010-03-06 08:11:37 |
| 2010-03-06 08:17:00 | 2010-03-06 08:17:00 |
| 2010-03-06 08:55:04 | 2010-03-31 00:00:00 |
| 2010-03-06 08:55:43 | 2010-03-31 00:00:00 |
| 2010-03-08 00:00:00 | 2010-03-16 00:00:00 |
| 2010-03-08 00:00:00 | 2010-03-22 00:00:00 |
| 2010-03-10 00:00:00 | 2010-03-24 00:00:00 |
| 2010-03-18 00:00:00 | 2010-03-27 00:00:00 |
| 2010-03-30 00:00:00 | 2010-04-05 00:00:00 |
+———————+———————+
找出在三月的活动日期(所谓活动日期就是在start_time以及end_time 之间的日期
所以结果是 4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,30
Posted in: 算法研究
浏览次数: 三月 5th, 2010 / 2 Comments » / by 小黑
老杨桌天发现我们的server被当成了肉鸡去扫描别的程序,而且/bin/*下所有指令无法使用… 尤其是这两天比较怪,server卡卡的,加上这两天跑来跑去的没有注意server… 多亏了老杨发现了啊…
入侵者给我们留下了些源码,正好用来学习下他怎么去扫描别人的,太好了,哈哈~~~
这两天有影响到http://fireeye.webbeb.com的访问质量,在此对所有用户表示抱歉,目前server没有什么大问题,这两天有空我们将继续修复server
Posted in: 项目经验
浏览次数: 二月 25th, 2010 / No Comments » / by 小黑
先用ssh来建立一个通讯管道
- ssh -NfD 8888 qq.com #我意淫一下QQ
然后再用浏览器设置一下代理
比如firefox =》设置=》网络=》设置=》手动配制代理
Socks 主机:localhost 端口: 8888
然后测试一下?
Posted in: shell, 网络
浏览次数: 二月 12th, 2010 / No Comments » / by 小黑
(转)http://i.19830102.com/archives/164
Python 版本:2.6
下载地址:http://www.python.org/download/releases/2.6.1/
下载msi文件并安装
MySQLdb版本: MySQL-python-1.2.2.win32-py2.6.exe
下载地址:http://home.netimperia.com/files/misc/MySQL-python-1.2.2.win32-py2.6.exe
参见:http://sourceforge.net/forum/forum.php?thread_id=2316047&forum_id=70460
常见问题:
1.ImportError: DLL load failed: 找不到指定的模块。
—————————————————————————————————-
- D:\Program Files\Python2.6>python
- Python 2.6.1 (r261:67517, Dec 4 2008, 16:51:00) [MSC v.1500 32 bit (Intel)] on win32
- Type “help”, “copyright”, “credits” or “license” for more information.
- >>> import MySQLdb
- Traceback (most recent call last):
- File “<stdin>”, line 1, in <module>
- File “D:\Program Files\Python2.6\Lib\site-packages\MySQLdb\__init__.py”, line 19, in <module>
-
- import _mysql
- ImportError: DLL load failed: 找不到指定的模块。
—————————————————————————————————-
解决方法:下载libmmd.dll(附件)和libguide40.dll(附件)两个dll文件并复制到python安装目录的Lib\site-packages下。
参见:http://sourceforge.net/forum/message.php?msg_id=5613887
2.ImportError: DLL load failed: 找不到指定的模块。
—————————————————————————————————-
- D:\Program Files\Python2.6>python
- Python 2.6 (r26:66721, Oct 2 2008, 11:35:03) [MSC v.1500 32 bit (Intel)] on win32
- Type “help”, “copyright”, “credits” or “license” for more information.
- >>> import MySQLdb
- D:\Program Files\Python2.6\lib\site-packages\MySQLdb\__init__.py:34: DeprecationWarning: the sets module is deprecated
- from sets import ImmutableSet
—————————————————————————————————-
解决方法:
1) file “__init__”, replace:
from sets import ImmutableSet
class DBAPISet(ImmutableSet):
with
class DBAPISet(frozenset)
2) file “converters.py”, remove:
from sets import BaseSet, Set
3) file “converters.py”, change “Set” by “set” (IMPORTANT: only two places):
line 48: return set([ i for i in s.split(',') if i ])
line 128: set: Set2Str,
参见:http://sourceforge.net/forum/message.php?msg_id=580894
原文: http://www.3gmatrix.cn/4/viewspace-16757.html
libmmd.dll
libguide40.dll
libmySQL.dll
Posted in: mysql, python
浏览次数: 二月 11th, 2010 / No Comments » / by 小黑

之前一直偷懒来着 就方了cn,us,tw的国旗图档,蒙混的使用了几个月,不过确实因为挂我们的代码的用户比较少,今天晚上花了点时间来改进了下流程,如上图
效果见: http://fireeye.webbeb.com
PS:今天倒腾qeephp以及nginx的rewrite也不是十分顺利,还好最终算是解决问题了…
Posted in: php
浏览次数: 二月 8th, 2010 / No Comments » / by 小黑
Suid/Sgid 在系统安全上面应用很多,比如passwd,ping等的shell
尤其是passwd,为什么普通用户能改动自己的密码而且能更新到/etc/passwd文件去呢?昨天晚上又和老杨探讨到深夜…两个疯子…
- # ls -l /etc/passwd
- -rw-r--r-- 1 root root 1515 Dec 17 17:16 /etc/passwd
上述权限为root可写,其他用户无权写入,继续找原因
- # whereis passwd
- passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man5/passwd.5.gz /usr/share/man/man1/passwd.1.gz
- # ls -l /usr/bin/passwd
- -rwsr-xr-x 1 root root 27768 Jan 7 2007 /usr/bin/passwd
看上面/usr/bin/passwd的权限为 rws 是’s’而不是’x',那么s就是:
* 一个进程如果没有SUID或SGID位,则euid=uid & egid=gid
* 一个程序设置了SUID,则euid和egid变成被运行的程序的所有者的uid和gid
所以对于普通用于运行passwd权限得到提升,所以能写入/etc/passwd文件,也因此对于开发suid/sgid程序的时候要特别注意安全。
可以使用附加组和组ID来设置合适的sgid来提高安全。
在C语言里面可以使用open和access函数来测试此特性
* open使用euid和egid来测试文件属性
* access使用uid和gid来测试文件树形
参考:
http://en.wikipedia.org/wiki/Setuid
http://blog.csdn.net/blackjack2007u/archive/2009/11/18/4827608.aspx
Posted in: c/c++
浏览次数: 一月 25th, 2010 / No Comments » / by 小黑
以前用PHP写socket server的时候停止socket服务器后,马上启动提示bind error: Address already in use,是因为还有client正在使用这个端口,是因为在TCP/IP里面time_wait状态也叫2MSL状态.
使用netstat指令来调试的时候可以看出此进程信息
- $ sudo netstat -anp|grep 8080
- tcp 0 0 127.0.0.1:8080 127.0.0.1:54248 TIME_WAIT -

根据《TCP/IP详解》中的TCP的建立和终止中有关”TCP的终止”的讲解
TCP的终止通过双方的四次握手实现。发起终止的一方执行主动关闭,响应的另一方执行被动关闭。
1. 发起方更改状态为FIN_WAIT_1,关闭应用程序进程,发出一个TCP的FIN段;
2. 接收方收到FIN段,返回一个带确认序号的ACK,同时向自己对应的进程发送一个文件结束符EOF,同时更改状态为CLOSE_WAIT,发起方接到ACK后状态更改为FIN_WAIT_2;
3. 接收方关闭应用程序进程,更改状态为LAST_ACK,并向对方发出一个TCP的FIN段;
4. 发起方接到FIN后状态更改为TIME_WAIT,并发出这个FIN的ACK确认。ACK发送成功后(2MSL内)双方TCP状态变为CLOSED。
我们不难看出上面的显示的结果的意思。根据TCP协议,主动发起关闭的一方,会进入TIME_WAIT状态(TCP实现必须可靠地终止连接的两个方向(全双工关闭)),持续2*MSL(Max Segment Lifetime),缺省为240秒.
Posted in: 网络
浏览次数: 一月 22nd, 2010 / No Comments » / by 小黑
今天中午在处理实验机Freebsd的时候,想删除一个cache目录,谁知道输入
rm *
的命令后,大概几秒后屏幕就跳出
/bin/rm: argument list too long
条件反射动作,上百度和google查找,找到解决方法和原因,原因是一个文件夹下文件太多,使用rm删除就会出现/bin/rm: Argument list too long错误.
解决方法:http://hintcnuie.javaeye.com/blog/431354
按网址上面写的输入
- ls | xargs -n 10 rm -fr ls
就解决了,这句解释为:输出所有的文件名(用空格分割) xargs就是将ls的输出,每10个为一组(以空格为分隔符),作为rm -rf的参数也就是说将所有文件名10个为一组,由rm -rf删除,这样就不会超过命令行的长度了.
另外找到用脚本的方法:
- for loop in `ls 目录路径`
- do
- rm -f $loop
- done
注意:$loop是删除的文件名,确保路径是否正确。
但这个还没有实验过。
转:http://www.lpfrx.com/archives/1601/
Posted in: shell
浏览次数: 一月 21st, 2010 / No Comments » / by 小黑
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://bigwhite.blogbus.com/logs/20147715.html
C语言语法简单,但内涵却博大精深;如果在学习时只是止步于表面,那么往往后期会遇到很多困难。typedef是C语言中一个很好用的工具,大量存在于已有代码中,特别值得一提的是:C++标准库实现中更是对typedef有着大量的使用。但很多初学者对其的理解仅局限于:typedef 用来定义一个已有类型的”别名(alias)”。正是因为有了这样的理解,才有了后来初学者在typedef int myint和typedef myint int之间的犹豫不决。很多国内大学的C语言课之授课老师也都是如是说的,或者老师讲的不够透彻,导致学生们都是如是理解的。我这里想结合C语言标准文档以及一些代码实例,也说说typedef。
int *p;
这样的代码是C语言中最最基础的一个语句了,大家都知道这个语句声明了一个变量p,其类型是指向整型的指针(pointer to int);如果在这个声明的前面加上一个typedef后,整个语义(semantics)又会是如何改变的呢?
typedef int *p;
我们先来看看C99标准中关于typedef是如何诠释的?C99标准中这样一小段精辟的描述:”In a declaration whose storage-class specifier is typedef, each declarator defines an identifier to be a typedef name that denotes the type specified for the identifier in the way described in xx”。
参照这段描述,并拿typedef int *p作为例子来理解:在一个声明中,如果有存储类说明符typedef的修饰,标识符p将被定义为了一个typedef name,这个typedef name表示(denotes)一个类型,什么类型呢?就是int *p这个声明(declarator)中标识符(indentifier)p的类型(int*)。
再比对一下两个声明:
int *p;
typedef int *p;
是不是有点”茅舍顿开”的感觉,int *p中, p是一个变量,其类型为pointer to int;在int *p前面增加一个typedef后,p变为一个typedef-name,这个typedef-name所表示的类型就是int *p声明式中p的类型(int*)。说句白话,typedef让p去除了普通变量的身份,摇身一变,变成了p的类型的一个typedef-name了。
为了巩固上面的理解,我们再来看看”C语言参考手册(C: A Reference Manual)”中的说法:任何declarator(如typedef int *p)中的indentifier(如p)定义为typedef-name,其(指代p)表示的类型是declarator为正常变量声明(指代int *p)的那个标识符(指代p)的类型(int*)。有些绕嘴,不过有例子支撑:
[例1]
typedef double MYDOUBLE;
分析:
去掉typedef ,得到正常变量声明=> double MYDOUBLE;
变量MYDOUBLE的类型为double;
=> “typedef double MYDOUBLE”中MYDOUBLE是类型double的一个typedef-name。
MYDOUBLE d; <=> d是一个double类型的变量
[例2]
typedef double *Dp;
分析:
去掉typedef ,得到正常变量声明=> double *Dp;
变量Dp的类型为double*,即pointer to double;
=> “typedef double *Dp”中Dp是类型double*的一个typedef-name。
Dp dptr; <=> dptr是一个pointer to double的变量
[例3]
typedef int* Func(int);
分析:
去掉typedef ,得到正常变量声明=> int* Func(int);
变量Func的类型为一个函数标识符,该函数返回值类型为int*,参数类型为int;
=> “typedef int* Func(int)”中Func是函数类型(函数返回值类型为int*,参数类型为int)的一个typedef-name。
Func *fptr; <=> fptr是一个pointer to function with one int parameter, returning a pointer to int
Func f; 这样的声明意义就不大了。
[例4]
typedef int (*PFunc)(int);
分析:
去掉typedef ,得到正常变量声明=> int (*PFunc)(int);
变量PFunc的类型为一个函数指针,指向的返回值类型为int,参数类型为int的函数原型;
=> “typedef int (*PFunc)(int)”中PFunc是函数指针类型(该指针类型指向返回值类型为int,参数类型为int的函数)的一个typedef-name。
PFunc fptr; <=> fptr是一个pointer to function with one int parameter, returning int
[例5]
typedef int A[5];
分析:
去掉typedef ,得到正常变量声明 => int A[5];
变量A的类型为一个含有5个元素的整型数组;
=> “typedef int A[5]“中A是含有5个元素的数组类型的一个typedef-name。
A a = {3, 4, 5, 7, 8};
A b = { 3, 4, 5, 7, 8, 9}; /* 会给出Warning: excess elements in array initializer */
[例6]
typedef int (*A)[5]; (注意与typedef int* A[5]; 区分)
分析:
去掉typedef ,得到正常变量声明 => int (*A)[5];
变量A的类型为pointer to an array with 5 int elements;
=> “typedef int (*A)[5]“中A是”pointer to an array with 5 int elements”的一个typedef-name。
int c[5] = {3, 4, 5, 7, 8};
A a = &c;
printf(“%d\n”, (*a)[0]); /* output: 3 */
如果这样赋值:
int c[6] = {3, 4, 5, 7, 8, 9};
A a = &c; /* 会有Warning: initialization from incompatible pointer type */
[例7]
typedef struct _Foo_t Foo_t;
分析:
去掉typedef ,得到正常变量声明 => struct _Foo_t Foo_t;
变量Foo_t的类型为struct _Foo_t;
=> “typedef struct _Foo_t Foo_t”中Foo_t是”struct _Foo_t”的一个typedef-name。
[例8]
typedef struct { … // } Foo_t;
分析:
去掉typedef ,得到正常变量声明 => struct { … // } Foo_t;
变量Foo_t的类型为struct { … // } ;
=> “typedef struct { … // } Foo_t “中Foo_t是”struct { … // }”的一个typedef-name。这里struct {…//}是一个无”标志名称(tag name)”的结构体声明。
[例9]
typedef struct { … // } Foo_t[1];
分析:
去掉typedef ,得到正常变量声明 => struct { … // } Foo_t[1];
变量Foo_t的类型为包含一个元素的struct { … // }类别的数组类型;
=> 这样一来,Foo_t在typedef定义后实际上就变成了一个struct { … // }数组类型。要问实际编程中会这么用typedef吗?你还别说,这还是C语言常用的一个小技巧,如果你有机会看到jmp_buf的类型定义,你就会发现jmp_buf在很多系统实现中也是如此定义的,大约类似:typedef struct XX {…} jmp_buf[1]; 这样做的目的大致是这样的:如果你在函数里定义了一个char a[n];那么a和&a作为参数传入某个函数时是等价的。看似传值,实则传址,在被调用函数中通过参数可直接修改数组a的元素的内容。另外这么做的目的是否是为了让代码更符合某些人的口味我还不得而知。
参考资料:
1、”ISOIEC-98991999(E)–Programming Languages–C”之Page 123;
2、C语言参考手册(中文版) 之 Page 119
Posted in: c/c++