Mar
22
看了一个帖子,讨论这个问题的
URL: http://bbs.chinaunix.net/archiver/?tid-1399973.html
第一页4L的说法是正确的,那些的确是滥用管道,不过这个问题放到后面讨论。
感觉第一页末尾beginner-bj的测试方法不很对头,于是自己写了个小程序测试一下:
测试结果如下:
看来管道两头确实是协同工作的(从管道的原理也可以推知)
一头写,一头读,同时处理,这样可以提高CPU的利用率,特别是在多CPU的时候
不过总体来说,我想应该是会多占用一些CPU(进程之间的切换什么的?)。
然后关注一下滥用管道的问题,这个直接引用第二页某楼的vbs100童鞋的大作,应该可以说明问题了:
URL: http://bbs.chinaunix.net/archiver/?tid-1399973.html
第一页4L的说法是正确的,那些的确是滥用管道,不过这个问题放到后面讨论。
感觉第一页末尾beginner-bj的测试方法不很对头,于是自己写了个小程序测试一下:
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char * argv[]){
char cmd[1024];
if(argc < 3) {
printf("Not Enough Parameters.\n");
return 1;
}
int a, b;
sscanf(argv[1], "%d", &a);
sscanf(argv[2], "%d", &b);
sprintf(cmd, "sleep %d | sleep %d", a, b);
system(cmd);
return 0;
}
#include<stdlib.h>
int main(int argc, char * argv[]){
char cmd[1024];
if(argc < 3) {
printf("Not Enough Parameters.\n");
return 1;
}
int a, b;
sscanf(argv[1], "%d", &a);
sscanf(argv[2], "%d", &b);
sprintf(cmd, "sleep %d | sleep %d", a, b);
system(cmd);
return 0;
}
测试结果如下:
引用
felix021@felix021-laptop:~/code$ g++ a.cpp
felix021@felix021-laptop:~/code$ ./a.out 1 2
felix021@felix021-laptop:~/code$ time ./a.out 2 2
real 0m2.035s
user 0m0.000s
sys 0m0.020s
felix021@felix021-laptop:~/code$ time ./a.out 2 3
real 0m3.039s
user 0m0.012s
sys 0m0.016s
felix021@felix021-laptop:~/code$ time ./a.out 4 3
real 0m4.020s
user 0m0.016s
sys 0m0.004s
felix021@felix021-laptop:~/code$ time ./a.out 6 3
real 0m6.034s
user 0m0.004s
sys 0m0.020s
felix021@felix021-laptop:~/code$ ./a.out 1 2
felix021@felix021-laptop:~/code$ time ./a.out 2 2
real 0m2.035s
user 0m0.000s
sys 0m0.020s
felix021@felix021-laptop:~/code$ time ./a.out 2 3
real 0m3.039s
user 0m0.012s
sys 0m0.016s
felix021@felix021-laptop:~/code$ time ./a.out 4 3
real 0m4.020s
user 0m0.016s
sys 0m0.004s
felix021@felix021-laptop:~/code$ time ./a.out 6 3
real 0m6.034s
user 0m0.004s
sys 0m0.020s
看来管道两头确实是协同工作的(从管道的原理也可以推知)
一头写,一头读,同时处理,这样可以提高CPU的利用率,特别是在多CPU的时候
不过总体来说,我想应该是会多占用一些CPU(进程之间的切换什么的?)。
然后关注一下滥用管道的问题,这个直接引用第二页某楼的vbs100童鞋的大作,应该可以说明问题了:
引用
正确的是
$ grep 'some word' urfile
但是更方便的是
$ <urfile grep 'some word'
这样可方便改 grep 的参数
还有经常用的
$ cat urfile | grep 'some word' | wc -l
其实直接可以用
$ <urfile grep -c 'some word'
$ grep 'some word' urfile
但是更方便的是
$ <urfile grep 'some word'
这样可方便改 grep 的参数
还有经常用的
$ cat urfile | grep 'some word' | wc -l
其实直接可以用
$ <urfile grep -c 'some word'
Mar
22
之前下载的最新版本不行,用了这个帖子10L给的链接下载的就OK了,然后自己写了KeyCode.ini(贴在11L),噢也!
http://www.dayhand.com/bbs/viewthread.php?tid=13906&extra=page%3D2
--
捐了2块钱,支持国产。
http://www.dayhand.com/bbs/viewthread.php?tid=13906&extra=page%3D2
--
捐了2块钱,支持国产。
Mar
21
4.兼容内存颗粒编码
32MB
K4S561632,三星 Samsung
HY57V561620,现代 Hynix
MT48LC32M16,镁光 Micron
64MB
K4S511632,三星 Samsung
HY57V121620,现代 Hynix
HYB39S512160,英飞凌 Infineon
网上查了一下K4S511632在武汉哪里能买到,找到两条信息,记录一下
启浩国际有限公司武汉代表处 ~ 邢建斌
Q1026052092 ~ 13429832768 ~ 027-87741225 ~ widekey2008ic@hotmail.com
武昌区珞瑜路阜华大厦D栋2203室
武汉德创微电子商行 ~ 彭先生
027-51854612/4613 ~ 13476858615 ~ Q344568920 ~ haitao0208@163.com
洪山区珞瑜路158号华中电子市场3288室 ~ http://whdc.ic37.com
--
@ 23:55
Google了一下 "HY57V121620 027",发现只有一篇,就是我的Blog,收录时间:14分前。。。
32MB
K4S561632,三星 Samsung
HY57V561620,现代 Hynix
MT48LC32M16,镁光 Micron
64MB
K4S511632,三星 Samsung
HY57V121620,现代 Hynix
HYB39S512160,英飞凌 Infineon
网上查了一下K4S511632在武汉哪里能买到,找到两条信息,记录一下
启浩国际有限公司武汉代表处 ~ 邢建斌
Q1026052092 ~ 13429832768 ~ 027-87741225 ~ widekey2008ic@hotmail.com
武昌区珞瑜路阜华大厦D栋2203室
武汉德创微电子商行 ~ 彭先生
027-51854612/4613 ~ 13476858615 ~ Q344568920 ~ haitao0208@163.com
洪山区珞瑜路158号华中电子市场3288室 ~ http://whdc.ic37.com
--
@ 23:55
Google了一下 "HY57V121620 027",发现只有一篇,就是我的Blog,收录时间:14分前。。。
Mar
17
我自己试了下,蛮好的,Ubuntu下面终于有lyrics了。
-- zz from http://linuxtoy.org/archives/lrcdis.html --
lrcdis 是由 xiooli、solcomo、bones7456、oldherl 等同学编写的一个 Bash 脚本,该脚本允许你以外挂方式来显示歌词。目前,lrcdis 支持 Linux 下的大多数音乐播放器,包括 Rhythmbox、Amarok、Quod Libet、Exaile、Audacious、MPD、MPlayer、MOC 等等。
...
首次运行 lrcdis,它将在 $HOME/.config 目录下建立配置文件 lrcdis.conf。通过此文件,你可以决定歌词以何种模式显示(有 CLI、OSD、notify、fifo 等选择)、下载歌词的保存位置、使用哪一个音乐播放器等。
当你使用上述音乐播放器中的一款播放歌曲时,lrcdis 将根据该歌曲的 ID3 标签或文件名来自动下载歌词,并以你指定的模式显示,整个过程由脚本自动完成,无需你额外操心。
lrcdis 可从 Google Code 下载。
http://code.google.com/p/lrcdis/
-- zz from http://linuxtoy.org/archives/lrcdis.html --
lrcdis 是由 xiooli、solcomo、bones7456、oldherl 等同学编写的一个 Bash 脚本,该脚本允许你以外挂方式来显示歌词。目前,lrcdis 支持 Linux 下的大多数音乐播放器,包括 Rhythmbox、Amarok、Quod Libet、Exaile、Audacious、MPD、MPlayer、MOC 等等。
...
首次运行 lrcdis,它将在 $HOME/.config 目录下建立配置文件 lrcdis.conf。通过此文件,你可以决定歌词以何种模式显示(有 CLI、OSD、notify、fifo 等选择)、下载歌词的保存位置、使用哪一个音乐播放器等。
当你使用上述音乐播放器中的一款播放歌曲时,lrcdis 将根据该歌曲的 ID3 标签或文件名来自动下载歌词,并以你指定的模式显示,整个过程由脚本自动完成,无需你额外操心。
lrcdis 可从 Google Code 下载。
http://code.google.com/p/lrcdis/
Mar
16
其实得自己做个map
$ vim ~/.vimrc
$ vim ~/.vimrc
"F5 for comment
vmap <F5> :s=^\(//\)*=//=g<cr>:noh<cr>
nmap <F5> :s=^\(//\)*=//=g<cr>:noh<cr>
imap <F5> <ESC>:s=^\(//\)*=//=g<cr>:noh<cr>
"F6 for uncomment
vmap <F6> :s=^\(//\)*==g<cr>:noh<cr>
nmap <F6> :s=^\(//\)*==g<cr>:noh<cr>
imap <F6> <ESC>:s=^\(//\)*==g<cr>:noh<cr>
vmap <F5> :s=^\(//\)*=//=g<cr>:noh<cr>
nmap <F5> :s=^\(//\)*=//=g<cr>:noh<cr>
imap <F5> <ESC>:s=^\(//\)*=//=g<cr>:noh<cr>
"F6 for uncomment
vmap <F6> :s=^\(//\)*==g<cr>:noh<cr>
nmap <F6> :s=^\(//\)*==g<cr>:noh<cr>
imap <F6> <ESC>:s=^\(//\)*==g<cr>:noh<cr>
Mar
15
BFS @ 2009-03-14
A,搜索,没做。
B,搜索,没做。
C,计算几何,没做。
D,加密算法,Boluor没做完。
E,模拟,Sandy写的,trick是需要先判断下一个走的人是谁(B/W)。
F,表达式的计算,我之前没有看题目,但是扫了一下,觉得应该很简单,回头写一下,应该不难吧。
G,计算几何,超简单的一个等比方程解一下;trick在于两个int加起来以后会OverFlow。
H,字符串处理,数据量很小,不要Trie,用map+set搞定。
I,没看。
J,DP,Sandy推出一个方程,和他讨论了一下,就被拖到机房去,然后他写了AC了。
oak真是相当的不堪阿,sigh。
--
党员活动室确实很适合看电影,音效非常好。
--
贴上我写的代码:
A,搜索,没做。
B,搜索,没做。
C,计算几何,没做。
D,加密算法,Boluor没做完。
E,模拟,Sandy写的,trick是需要先判断下一个走的人是谁(B/W)。
F,表达式的计算,我之前没有看题目,但是扫了一下,觉得应该很简单,回头写一下,应该不难吧。
G,计算几何,超简单的一个等比方程解一下;trick在于两个int加起来以后会OverFlow。
H,字符串处理,数据量很小,不要Trie,用map+set搞定。
I,没看。
J,DP,Sandy推出一个方程,和他讨论了一下,就被拖到机房去,然后他写了AC了。
oak真是相当的不堪阿,sigh。
--
党员活动室确实很适合看电影,音效非常好。
--
贴上我写的代码:
Mar
13
花了n久的时间终于搞清楚了,丫丫的,真麻烦
编译:
这个mysql目录是某个mysql的源码目录,如果有安装mysql-devel可能是在/usr/ooxx/mysql,没有的话自己去down源码
编译:
引用
g++ -Imysql/include -Lmysql/lib -o a.out a.cpp -lmysqlclient -lz
这个mysql目录是某个mysql的源码目录,如果有安装mysql-devel可能是在/usr/ooxx/mysql,没有的话自己去down源码
#include<iostream>
#include<string>
#include<fstream>
#include"mysql.h"
using namespace std;
MYSQL * conn = NULL; //MySQL连接句柄
//读取配置
bool read_conf(string &dbhost,
string &dbuser,
string &dbpass,
string &dbname){
ifstream is("judge.conf");
is >> dbhost >> dbuser >> dbpass >> dbname;
return true;
}
bool query(){
int status, state, state2;
MYSQL_RES * res;
MYSQL_ROW row;
string cmd;
MYSQL *conn, mysql;
string dbhost, dbuser, dbpass, dbname;
if(read_conf(dbhost,dbuser, dbpass, dbname)){ //读取数据库
if (mysql_init(&mysql) == NULL){
fprintf(stderr, "初始化错误\n");
return false;
}
conn = mysql_real_connect(&mysql, dbhost.c_str(), dbuser.c_str(),
dbpass.c_str(), dbname.c_str(), NULL,
"/var/run/mysqld/mysqld.sock", 0);
if(conn == NULL){ //连接失败
fprintf(stderr, "连接失败!\n");
return false;
}
}else{ //读取配置失败
fprintf(stderr, "读取配置失败!\n");
return false;
}
cmd = "SELECT OOXX FROM OOXX";
cout << "Command: " << cmd << endl;
state = mysql_query(conn, cmd.c_str());
cout << "state: " << state << endl;
if(state != 0){//查询出错
fprintf(stderr, "%s\n", mysql_error(conn));
return false;
}
res = mysql_store_result(conn);
cout << "affected_rows:" << conn->affected_rows << endl;
while(row = mysql_fetch_row(res), row != NULL){
printf("%s\n", row[0]);
}
return true;
}
int main(){
query();
return 0;
}
#include<string>
#include<fstream>
#include"mysql.h"
using namespace std;
MYSQL * conn = NULL; //MySQL连接句柄
//读取配置
bool read_conf(string &dbhost,
string &dbuser,
string &dbpass,
string &dbname){
ifstream is("judge.conf");
is >> dbhost >> dbuser >> dbpass >> dbname;
return true;
}
bool query(){
int status, state, state2;
MYSQL_RES * res;
MYSQL_ROW row;
string cmd;
MYSQL *conn, mysql;
string dbhost, dbuser, dbpass, dbname;
if(read_conf(dbhost,dbuser, dbpass, dbname)){ //读取数据库
if (mysql_init(&mysql) == NULL){
fprintf(stderr, "初始化错误\n");
return false;
}
conn = mysql_real_connect(&mysql, dbhost.c_str(), dbuser.c_str(),
dbpass.c_str(), dbname.c_str(), NULL,
"/var/run/mysqld/mysqld.sock", 0);
if(conn == NULL){ //连接失败
fprintf(stderr, "连接失败!\n");
return false;
}
}else{ //读取配置失败
fprintf(stderr, "读取配置失败!\n");
return false;
}
cmd = "SELECT OOXX FROM OOXX";
cout << "Command: " << cmd << endl;
state = mysql_query(conn, cmd.c_str());
cout << "state: " << state << endl;
if(state != 0){//查询出错
fprintf(stderr, "%s\n", mysql_error(conn));
return false;
}
res = mysql_store_result(conn);
cout << "affected_rows:" << conn->affected_rows << endl;
while(row = mysql_fetch_row(res), row != NULL){
printf("%s\n", row[0]);
}
return true;
}
int main(){
query();
return 0;
}
Mar
12
简单写一下吧:
1. 自定义一个struct t,是set里要放的东西。
2. 定义一个仿函数cmper (仿函数functor,其实就是一个重载了operator()用于比较前述struct的类)。
3. 使用这样的语句: set<struct t, cmper> a; 来定义一个包含struct t的set容器。
4. 使用则样的语句: set<struct t, cmper>::iterator ap; 来定义一个对应的迭代器。
@ 2009-03-16补充:其实重载 bool operator < 也可以,就不需要仿函数了。
具体代码如下:
1. 自定义一个struct t,是set里要放的东西。
2. 定义一个仿函数cmper (仿函数functor,其实就是一个重载了operator()用于比较前述struct的类)。
3. 使用这样的语句: set<struct t, cmper> a; 来定义一个包含struct t的set容器。
4. 使用则样的语句: set<struct t, cmper>::iterator ap; 来定义一个对应的迭代器。
@ 2009-03-16补充:其实重载 bool operator < 也可以,就不需要仿函数了。
具体代码如下:
#include<iostream>
#include<set>
using namespace std;
struct t{ //set里的东西
int i; //可以再增加其他内容,为了简单只写了一个
t(){i = 0;} //构造函数
t(int _i):i(_i){} //构造函数
friend inline ostream & operator <<(ostream &os, const t & a){ //重定向operator <<,纯粹是为了方便输出
return (os << a.i);
}
};
class cmper{ //仿函数
public:
bool operator()(const t &a, const t &b)const{ //重载operator ()
return a.i < b.i;
}
};
set<t, cmper> a; //定义一个set
int main(){
a.insert(t(3));
a.insert(t(1));
a.insert(t(2));
set<t, cmper>::iterator ap; //定义一个迭代器
for (ap = a.begin(); ap != a.end(); ap++){ //遍历
cout << (*ap) << endl;
}
return 0;
}
#include<set>
using namespace std;
struct t{ //set里的东西
int i; //可以再增加其他内容,为了简单只写了一个
t(){i = 0;} //构造函数
t(int _i):i(_i){} //构造函数
friend inline ostream & operator <<(ostream &os, const t & a){ //重定向operator <<,纯粹是为了方便输出
return (os << a.i);
}
};
class cmper{ //仿函数
public:
bool operator()(const t &a, const t &b)const{ //重载operator ()
return a.i < b.i;
}
};
set<t, cmper> a; //定义一个set
int main(){
a.insert(t(3));
a.insert(t(1));
a.insert(t(2));
set<t, cmper>::iterator ap; //定义一个迭代器
for (ap = a.begin(); ap != a.end(); ap++){ //遍历
cout << (*ap) << endl;
}
return 0;
}
//重载example
struct t{
int i;
bool operator < (const t & a)const{
return i < a.i;
};
};
struct t{
int i;
bool operator < (const t & a)const{
return i < a.i;
};
};