Dec
29
被牛逼哄哄的Snoopy雷到了。
事情是这样的,今天打开 http://acm.whu.edu.cn/woj 检查oak的运行情况
发现在status的第二页有好多个submit都处于Running状态
ssh到服务器上去看了一下,发现Judge在Compile OK以后就挂掉了。
有一堆Stack的信息,但是看不太懂~
DEBUG了一阵,定位到了错误:在判断Restricted_Function的那个函数里面。
加入了调试代码以后的大概结构是这样的:
然后发现非常神奇地,程序输出的是
然后跟上一堆程序出现错误的信息。
于是我就懵了,居然一个return语句也能出现错误?
然后请教snoopy大牛,经过一番七荤八素的DEBUG以后,终于找到了症结所在:
原来在Restricted_Function里面定义的那个char f[30]空间太小了
由于是分配在栈空间里面的,所以在运行的时候,出现了少量越界写入的情况
在程序返回的时候,由于返回地址等被未预料到的字符覆盖了,于是就出现了上述问题。
一个return语句也能"出错",暴露出这样严重的内存使用问题
——可能存在于任何地方,写程序的时候务必要小心啊!
同时,通过这种方式"定位"到的错误点,未必就是错误真正发生的地方!
事情是这样的,今天打开 http://acm.whu.edu.cn/woj 检查oak的运行情况
发现在status的第二页有好多个submit都处于Running状态
ssh到服务器上去看了一下,发现Judge在Compile OK以后就挂掉了。
有一堆Stack的信息,但是看不太懂~
DEBUG了一阵,定位到了错误:在判断Restricted_Function的那个函数里面。
加入了调试代码以后的大概结构是这样的:
......
bool Restricted_Function(){
char f[30], ...;
......
cout << "DEBUG 1" << endl;
return false;
}
......
bool WOJ_JUDGE(){
......
cout << "DEBUG 0“ << endl;
if(Restricted_Function(){
cout << "DEBUG 2" << endl;
return RF;
}
cout << "DEBUG 2" << endl;
......
}
bool Restricted_Function(){
char f[30], ...;
......
cout << "DEBUG 1" << endl;
return false;
}
......
bool WOJ_JUDGE(){
......
cout << "DEBUG 0“ << endl;
if(Restricted_Function(){
cout << "DEBUG 2" << endl;
return RF;
}
cout << "DEBUG 2" << endl;
......
}
然后发现非常神奇地,程序输出的是
引用
DEBUG 0
DEBUG 1
DEBUG 1
于是我就懵了,居然一个return语句也能出现错误?
然后请教snoopy大牛,经过一番七荤八素的DEBUG以后,终于找到了症结所在:
原来在Restricted_Function里面定义的那个char f[30]空间太小了
由于是分配在栈空间里面的,所以在运行的时候,出现了少量越界写入的情况
在程序返回的时候,由于返回地址等被未预料到的字符覆盖了,于是就出现了上述问题。
一个return语句也能"出错",暴露出这样严重的内存使用问题
——可能存在于任何地方,写程序的时候务必要小心啊!
同时,通过这种方式"定位"到的错误点,未必就是错误真正发生的地方!
Dec
29
据说MySQL是从v4.0开始支持事务(Transaction)的,一直没去试过。
今天心血来潮,于是就玩了一下。
首先,mysql里面有一个状态量叫做 autocommit ,默认值是1
也就是说,当你提交一个SQL语句以后,这条语句会被立即执行并修改数据库内容(如果有必要的话)。
所以如果你想要开始一个事务,那么首先应该把这个东东设置为0,有这么几种方法:
1. 提交SQL语句 START TRANSACTION;
2. 提交SQL语句 BEGIN;
3. 提交SQL语句 SET AUTOCOMMIT=0;
4. (PHP) mysqli_autocommit($conn, false);
然后就可以开始进行你想做的数据库修改了,比如INSERT, UPDATE, DELETE
修改完以后,如果返回的结果有不对劲的地方,OK,试试
1. 提交SQL语句 ROLLBACK;
2. 或者(PHP) mysqli_rollback($conn);
然后你就会发现数据库好像根本没有操作过似的
(其实仔细观察的话会发现auto_increment那个字段的max值变大了-____-)
如果一切OK,那么就用这个:
1. 提交SQL语句 COMIIT;
2. 或者(PHP) mysqli_commit($conn);
注意,在提交COMMIT以后,数据库的改动就正式写到硬盘,不能撤销啦。
给俩例子吧:
a. 在MySQL命令行下进行的操作
OK,再来个PHP版本的:
今天心血来潮,于是就玩了一下。
首先,mysql里面有一个状态量叫做 autocommit ,默认值是1
也就是说,当你提交一个SQL语句以后,这条语句会被立即执行并修改数据库内容(如果有必要的话)。
所以如果你想要开始一个事务,那么首先应该把这个东东设置为0,有这么几种方法:
1. 提交SQL语句 START TRANSACTION;
2. 提交SQL语句 BEGIN;
3. 提交SQL语句 SET AUTOCOMMIT=0;
4. (PHP) mysqli_autocommit($conn, false);
然后就可以开始进行你想做的数据库修改了,比如INSERT, UPDATE, DELETE
修改完以后,如果返回的结果有不对劲的地方,OK,试试
1. 提交SQL语句 ROLLBACK;
2. 或者(PHP) mysqli_rollback($conn);
然后你就会发现数据库好像根本没有操作过似的
(其实仔细观察的话会发现auto_increment那个字段的max值变大了-____-)
如果一切OK,那么就用这个:
1. 提交SQL语句 COMIIT;
2. 或者(PHP) mysqli_commit($conn);
注意,在提交COMMIT以后,数据库的改动就正式写到硬盘,不能撤销啦。
给俩例子吧:
a. 在MySQL命令行下进行的操作
mysql> use t;
mysql> CREATE TABLE `test`(`id` int primary key auto_increment, `name` char(50));
mysql> START TRANSACTION;
mysql> INSERT INTO `test` VALUES (NULL, 'a');
mysql> COMMIT; #或者 mysql> ROLLBACK;
mysql> SELECT * FROM `test`;
看看效果如何?mysql> CREATE TABLE `test`(`id` int primary key auto_increment, `name` char(50));
mysql> START TRANSACTION;
mysql> INSERT INTO `test` VALUES (NULL, 'a');
mysql> COMMIT; #或者 mysql> ROLLBACK;
mysql> SELECT * FROM `test`;
OK,再来个PHP版本的:
<?php
$conn = new mysqli("localhost", "root", "123456", "t");
$conn->autocommit(false);
$res = $conn->query("INSERT INTO `test` VALUES(NULL, 'a')");
if($res)
$conn->commit();
else
$conn->rollback();
$conn->close();
?>
$conn = new mysqli("localhost", "root", "123456", "t");
$conn->autocommit(false);
$res = $conn->query("INSERT INTO `test` VALUES(NULL, 'a')");
if($res)
$conn->commit();
else
$conn->rollback();
$conn->close();
?>
Dec
29
#include<iostream>
using namespace std;
char l[] = "Felix021";
void print(char a){
for(int i = 7; i >= 0; --i){
cout << ((a >> i ) & 1);
}
}
int main(){
for(int i = 0; l[i]; ++i){
print(l[i]);
}
cout << endl;
return 0;
}
using namespace std;
char l[] = "Felix021";
void print(char a){
for(int i = 7; i >= 0; --i){
cout << ((a >> i ) & 1);
}
}
int main(){
for(int i = 0; l[i]; ++i){
print(l[i]);
}
cout << endl;
return 0;
}
Dec
27
修改模板的时候希望能在 搜索框 实现这样一种效果:
默认显示内容为Search... ;鼠标点击激活后自动清空; 失去焦点以后如果内容为空,重置为Search...
记得IE有个onFocusOut事件,试了一下,确实OK
但是,非常遗憾地,FireFox没有这个事件。
又是Google又是Baidu,然后发现自己犯了Shability:
原来还有一个onBlur事件,就是用来作这件事情的。
默认显示内容为Search... ;鼠标点击激活后自动清空; 失去焦点以后如果内容为空,重置为Search...
记得IE有个onFocusOut事件,试了一下,确实OK
但是,非常遗憾地,FireFox没有这个事件。
又是Google又是Baidu,然后发现自己犯了Shability:
原来还有一个onBlur事件,就是用来作这件事情的。
<input type="text" value="Search..." onfocus="if(this.value=='Search...')this.value='';" onblur="if(this.value=='')this.value='Search...';"/>
Dec
23
发现听到这些语句的频率越来越高,而且我总是不能马上反应过来
每次都以为现在病毒事业蒸蒸日上,已经大规模入侵手机操作系统了呢
然后一听描述就是
哎呀,有个autorun.inf
哎呀,打不开了手机了,弹出“打开方式”对话框
哎呀,文件找不到了,但是空间显示还是那么多
汗ing...
解决办法:
资源管理器 -> "工具"菜单 -> "文件夹选项..." -> "查看"选项卡 ->
去掉 "隐藏受保护的操作系统文件(推荐)"前面的勾勾
然后下面选择 "显示所有隐藏文件和文件夹"
点击确定,然后看看文件出来没?
打开命令提示符: 开始->运行->输入 cmd 回车
然后应该会看到一个黑黑的窗口,光标闪动。
看看你的手机/MP3分配到了哪个盘,比如说是F
输入 F: (有个冒号),然后回车
然后输入 dir /a 回车
看到最后一列了不?就是你手机/MP3上的所有文件吧
依次输入
然后再看看MP3,文件是不是出来了?
每次都以为现在病毒事业蒸蒸日上,已经大规模入侵手机操作系统了呢
然后一听描述就是
哎呀,有个autorun.inf
哎呀,打不开了手机了,弹出“打开方式”对话框
哎呀,文件找不到了,但是空间显示还是那么多
汗ing...
解决办法:
资源管理器 -> "工具"菜单 -> "文件夹选项..." -> "查看"选项卡 ->
去掉 "隐藏受保护的操作系统文件(推荐)"前面的勾勾
然后下面选择 "显示所有隐藏文件和文件夹"
点击确定,然后看看文件出来没?
打开命令提示符: 开始->运行->输入 cmd 回车
然后应该会看到一个黑黑的窗口,光标闪动。
看看你的手机/MP3分配到了哪个盘,比如说是F
输入 F: (有个冒号),然后回车
然后输入 dir /a 回车
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\ooxx>F:
F:\>dir /a
驱动器 F 中的卷是 Nokia ooxx
卷的序列号是 1234-5678
F:\ 的目录
2003-01-01 00:00 <DIR> Music
2008-12-23 10:44 <DIR> Photos
2008-12-23 10:44 <DIR> 视频
0 个文件 0 字节
2 个目录 1,060,593,664 可用字节
(C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\ooxx>F:
F:\>dir /a
驱动器 F 中的卷是 Nokia ooxx
卷的序列号是 1234-5678
F:\ 的目录
2003-01-01 00:00 <DIR> Music
2008-12-23 10:44 <DIR> Photos
2008-12-23 10:44 <DIR> 视频
0 个文件 0 字节
2 个目录 1,060,593,664 可用字节
看到最后一列了不?就是你手机/MP3上的所有文件吧
依次输入
引用
attrib -s -r -h 文件名
然后再看看MP3,文件是不是出来了?
Dec
21
把bo-blog搭建到了whuacm的服务器上
但是不想让首页看起来让人觉得陌生
于是花了几个小时,以whuacm主页的css为参照
把原先那个模板的css乱改一通
然后就变成这样了
看起来很简洁的吧?
于是自己也换上^_^
提供下载吧(才83K),更新版,修正了一些错误,更漂亮了点儿~
但是不想让首页看起来让人觉得陌生
于是花了几个小时,以whuacm主页的css为参照
把原先那个模板的css乱改一通
然后就变成这样了
看起来很简洁的吧?
于是自己也换上^_^
提供下载吧(才83K),更新版,修正了一些错误,更漂亮了点儿~
下载文件 (已下载 1316 次)
Dec
20
做校赛的报名系统,插入队伍的时候要考虑队名是否重复,于是想到了使用MySQL的正则表达式。
以前虽然一直知道MySQL有正则表达式,但是因为有LIKE在,所以一直还不需要用它。
正好这次有了机会,就去试试吧。
MySQL的关键字 REGEXP 允许在SQL语句中匹配忽略大小写的POSIX正则表达式。
其实MySQL的文档里面写得非常详细了,给出了很多的例子,可以在这里看到
http://dev.mysql.com/doc/refman/5.1/zh/regexp.html
这里主要是记录一下在PHP里面还需要进行怎样的处理:
其实很简单,两个函数:
1。preg_quote()
转义正则表达式中的特殊字符,详情参见 http://cn.php.net/preg_quote
这本来是PHP为PCRE的正则表达式准备的,不过这里也是可以用的。
2。mysql_real_escape_string()
这个函数是用来转义特殊的SQL字符,同时也可以防止SQL注入攻击。
PHP文档的说明为:
本函数将 unescaped_string 中的特殊字符转义,并计及连接的当前字符集,因此可以安全用于 mysql_query()。
它有一个兄弟,mysql_escape_string(),不过不能针对当前字符集进行处理,所以不够安全
另外如果使用mysqli的话,也可以使用mysqli_real_escape_string()。
综合起来就是这样:
$team_name = mysql_real_escape_string(preg_quote($team_name));
$query = " SELECT * FROM `teams` WHERE `team_name` REGEXP '{$team_name}' ";
然后再ooxx地去查询吧。。。
以前虽然一直知道MySQL有正则表达式,但是因为有LIKE在,所以一直还不需要用它。
正好这次有了机会,就去试试吧。
MySQL的关键字 REGEXP 允许在SQL语句中匹配忽略大小写的POSIX正则表达式。
其实MySQL的文档里面写得非常详细了,给出了很多的例子,可以在这里看到
http://dev.mysql.com/doc/refman/5.1/zh/regexp.html
这里主要是记录一下在PHP里面还需要进行怎样的处理:
其实很简单,两个函数:
1。preg_quote()
转义正则表达式中的特殊字符,详情参见 http://cn.php.net/preg_quote
这本来是PHP为PCRE的正则表达式准备的,不过这里也是可以用的。
2。mysql_real_escape_string()
这个函数是用来转义特殊的SQL字符,同时也可以防止SQL注入攻击。
PHP文档的说明为:
本函数将 unescaped_string 中的特殊字符转义,并计及连接的当前字符集,因此可以安全用于 mysql_query()。
它有一个兄弟,mysql_escape_string(),不过不能针对当前字符集进行处理,所以不够安全
另外如果使用mysqli的话,也可以使用mysqli_real_escape_string()。
综合起来就是这样:
$team_name = mysql_real_escape_string(preg_quote($team_name));
$query = " SELECT * FROM `teams` WHERE `team_name` REGEXP '{$team_name}' ";
然后再ooxx地去查询吧。。。
Dec
17
最近发现可爱的Intrepid速度变得非常慢,慢到不可理喻。
打开终端都需要等好久
firefox的页面就像PPT一样地给我脸色看
VirtualBox里面的WinXP就压根不给我面子了
打字的时候通常我可以在按完一系列按键以后
再看着汉字一个一个冒出来
就像回到了我可爱的上一台小黑装着Win2k Advanced Server的那个时候。
百度和google告诉我,有人也遇到过这种问题
于是按照他的解决方案把~/.scim删掉,但是没用。
于是我试着把Compiz-Fusion的Desktop Cube特效关掉
启用Desktop Plane.
于是一切都解决了。
看来以后还是少折腾Intel的GMA X3100吧。
打开终端都需要等好久
firefox的页面就像PPT一样地给我脸色看
VirtualBox里面的WinXP就压根不给我面子了
打字的时候通常我可以在按完一系列按键以后
再看着汉字一个一个冒出来
就像回到了我可爱的上一台小黑装着Win2k Advanced Server的那个时候。
百度和google告诉我,有人也遇到过这种问题
于是按照他的解决方案把~/.scim删掉,但是没用。
于是我试着把Compiz-Fusion的Desktop Cube特效关掉
启用Desktop Plane.
于是一切都解决了。
看来以后还是少折腾Intel的GMA X3100吧。