zend for eclipse 6.1 加上这个玩意就好了,不用zmtx zmrx (freeBSD)和rz (Linux)了,感觉不错。
实际开发时经常需要把新修改的文件丢到测试机上运行,通常使用的是SFTP方式,需要单独开着一个类似WinSCP的工具。
esftp是一款Linux插件,有了它就可以在Eclipse中上传、下载Linux服务器上的文件,不需要再单独使用别的软件。
安装、使用:
1,下载插件:http://sourceforge.net/projects/esftp
2,简单配置一下

用一下:

esftp目前存在的问题:当本地目录名与服务器上不同时,esftp不能正确将文件放到正确的目录下,不过个人觉得已经很好了!
实际开发时经常需要把新修改的文件丢到测试机上运行,通常使用的是SFTP方式,需要单独开着一个类似WinSCP的工具。
esftp是一款Linux插件,有了它就可以在Eclipse中上传、下载Linux服务器上的文件,不需要再单独使用别的软件。
安装、使用:
1,下载插件:http://sourceforge.net/projects/esftp
2,简单配置一下

用一下:

esftp目前存在的问题:当本地目录名与服务器上不同时,esftp不能正确将文件放到正确的目录下,不过个人觉得已经很好了!
谁有php操作共享内存的代码?
APC这个方案不错,得看:http://leepiao.blog.163.com/blog/static/48503130201121811722907/
$shm_id = shmop_open(0xff3, "c", 0644, 100);
用这句后出现以下错误,怎样解决
Call to undefined function: shmop_open()
解决方法:
Linux:(共享内存只适用于linux兼容系统)
php编译的时候,configure 后面加 --enable-shmop
Windows:
win,php.ini中 extension=php_shmop.dll 前的分号去掉,重启web服务器 !
必须参考:http://blog.csdn.net/laruence/archive/2008/04/15/2294451.aspx
2 share2.php 用于显示共享内存的内容
最近想用它做点什么,可是思想还不成熟,暂时先放个例子在这里,以便以后使用。
共享内存首先是使用内存空间,虽然不是直接访问内存地址,由于不受磁盘io和网络带宽限制,在性能方面,共享内存比其它数据交互方式有巨大的优势。跟memcache比,这个共享内存不需要依赖其他的服务,只需要php编译时加入shmop的支持即可。
其次,它是共享的,同一台机器上所有的程序,都有访问它的权利。常做进程间通信用。php程序,每次执行完,生命也就结束了。
但是共享内存中的数据不一样,直到销毁前,它能让一份数据一直保留在内存中。使后来的程序能够使用它。
下面是一个使用共享内存做的简单计数器。能很高效的记录次数,缺点是内存数据不能永久保存,可以用daemon每隔几分钟同步一次共享内存与数据库。
ipcs -h for help.
可以看到,共享内存的key, shmid,所有者,权限,大小,attach数,和状态。
删除共享内存可以用ipcrm -m shmid或ipcrm -M shmkey命令来完成。
看,现在那份放在共享内存中的数据已经被删掉了。
阅读全文
APC这个方案不错,得看:http://leepiao.blog.163.com/blog/static/48503130201121811722907/
$shm_id = shmop_open(0xff3, "c", 0644, 100);
用这句后出现以下错误,怎样解决
Call to undefined function: shmop_open()
解决方法:
Linux:(共享内存只适用于linux兼容系统)
php编译的时候,configure 后面加 --enable-shmop
Windows:
win,php.ini中 extension=php_shmop.dll 前的分号去掉,重启web服务器 !
必须参考:http://blog.csdn.net/laruence/archive/2008/04/15/2294451.aspx
<?php
if($stop!=1)
{
// 判断是否已经创建
$shm_id = @shmop_open(0xff3, "a", 0644, 100);
if($shm_id) {
echo "内存块已经创建\n";
exit();
}
// 创建 100 字节的系统标识为 0xff3 的共享内存块
$shm_id = @shmop_open(0xff3, "c", 0644, 100);
if(!$shm_id) {
echo "共享内存块创建失败\n";
}
// 写一些内容
for($i=0;$i<10;$i++)
{
$shm_bytes_written = shmop_write($shm_id, "共享块$i", ($i*10));
}
echo "创建成功";
shmop_close($shm_id);
}
else
{
// 是否存在
$shm_id = @shmop_open(0xff3, "a", 0644, 100);
if(!$shm_id) {
echo "没有找到共享内存块\n";
exit();
}
// 删除
if(!shmop_delete($shm_id)) {
echo "删除失败.";
}
shmop_close($shm_id);
echo "内存块删除完毕!";
}
?>
if($stop!=1)
{
// 判断是否已经创建
$shm_id = @shmop_open(0xff3, "a", 0644, 100);
if($shm_id) {
echo "内存块已经创建\n";
exit();
}
// 创建 100 字节的系统标识为 0xff3 的共享内存块
$shm_id = @shmop_open(0xff3, "c", 0644, 100);
if(!$shm_id) {
echo "共享内存块创建失败\n";
}
// 写一些内容
for($i=0;$i<10;$i++)
{
$shm_bytes_written = shmop_write($shm_id, "共享块$i", ($i*10));
}
echo "创建成功";
shmop_close($shm_id);
}
else
{
// 是否存在
$shm_id = @shmop_open(0xff3, "a", 0644, 100);
if(!$shm_id) {
echo "没有找到共享内存块\n";
exit();
}
// 删除
if(!shmop_delete($shm_id)) {
echo "删除失败.";
}
shmop_close($shm_id);
echo "内存块删除完毕!";
}
?>
2 share2.php 用于显示共享内存的内容
<?php
// 打开共享内存块 0xff3
$shm_id = @shmop_open(0xff3, "a", 0644, 100);
if(!$shm_id) {
echo "不能打开共享内存块\n";
exit();
}
// 读出里面的内容
$my_string = shmop_read($shm_id, 0, $shm_size);
if(!$my_string) {
echo "没有内容或者不能读\n";
}
echo $my_string."\n";
shmop_close($shm_id);
?>
// 打开共享内存块 0xff3
$shm_id = @shmop_open(0xff3, "a", 0644, 100);
if(!$shm_id) {
echo "不能打开共享内存块\n";
exit();
}
// 读出里面的内容
$my_string = shmop_read($shm_id, 0, $shm_size);
if(!$my_string) {
echo "没有内容或者不能读\n";
}
echo $my_string."\n";
shmop_close($shm_id);
?>
最近想用它做点什么,可是思想还不成熟,暂时先放个例子在这里,以便以后使用。
共享内存首先是使用内存空间,虽然不是直接访问内存地址,由于不受磁盘io和网络带宽限制,在性能方面,共享内存比其它数据交互方式有巨大的优势。跟memcache比,这个共享内存不需要依赖其他的服务,只需要php编译时加入shmop的支持即可。
其次,它是共享的,同一台机器上所有的程序,都有访问它的权利。常做进程间通信用。php程序,每次执行完,生命也就结束了。
但是共享内存中的数据不一样,直到销毁前,它能让一份数据一直保留在内存中。使后来的程序能够使用它。
下面是一个使用共享内存做的简单计数器。能很高效的记录次数,缺点是内存数据不能永久保存,可以用daemon每隔几分钟同步一次共享内存与数据库。
?php
$shm_id = shmop_open(0x00000001, "c", 0644, 4); //通过一个指定的key来打开一个共享内存,
//这个key可以是自己指定,也可以用ftok生成
$data = unpack('Ncount',shmop_read($shm_id, 0, 4)); //解包数据
$count = $data['count']+1; //加一
shmop_write($shm_id, pack('N',$count), 0); //打包数据
shmop_close($shm_id); //关闭共享内存
echo $count; //输出数字
exit(0); //退出
?>
命令行查看$shm_id = shmop_open(0x00000001, "c", 0644, 4); //通过一个指定的key来打开一个共享内存,
//这个key可以是自己指定,也可以用ftok生成
$data = unpack('Ncount',shmop_read($shm_id, 0, 4)); //解包数据
$count = $data['count']+1; //加一
shmop_write($shm_id, pack('N',$count), 0); //打包数据
shmop_close($shm_id); //关闭共享内存
echo $count; //输出数字
exit(0); //退出
?>
ipcs -h for help.
[root@localhost html]# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000001 262144 root 644 4 0
[root@localhost html]#
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000001 262144 root 644 4 0
[root@localhost html]#
可以看到,共享内存的key, shmid,所有者,权限,大小,attach数,和状态。
删除共享内存可以用ipcrm -m shmid或ipcrm -M shmkey命令来完成。
[root@localhost html]# ipcrm -M 0x00000001
[root@localhost html]# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
[root@localhost html]#
[root@localhost html]# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
[root@localhost html]#
看,现在那份放在共享内存中的数据已经被删掉了。

关于领导:领导说这事得1周完成。
关于技术经理:我们得加班加点可以完成。
关于下属:我们周末或者下班得迟一点回去了。
领导说:干完 了?
技术经理:干完了。
我问:上线了吗?
技术经理:没有。
要不就是修改了N个方案,一直在干活,没有任何积累,搞得精疲力尽,还得不到承认,搞个毛啊。优秀人才一个接一个的走,软件蓝领的照旧。接着搞,没有一个靠谱的。。。领导难道就一直是伯乐,但就是没有找到千里马?呵呵。思考中。。。
nm看可执行文件定义了哪些函数。
nm用来列出目标文件的符号清单。下面是nm命令的格式: nm [-a|--debug-syms] [-g|--extern-only] [-B][-C|--demangle] [-D|--dynamic] [-s|--print-armap][-o|--print-file-name] [-n|--numeric-sort][-p|--no-sort] [-r|--reverse-sort] [--size-sort][-u|--undefined-only] [-l|--line-numbers] [--help][--version] [-t radix|--radix=radix][-P|--portability] [-f format|--format=format][--target=bfdname] [objfile...]
如果没有为nm命令指出目标文件,则nm假定目标文件是a.out。下面列出该命令的任选项,大部分支持“-”开头的短格式和“—“开头的长格式。
* -A、-o或--print-file-name:在找到的各个符号的名字前加上文件名,而不是在此文件的所有符号前只出现文件名一次。
例如nm libtest.a的输出如下:
CPThread.o:
00000068 T Main__8CPThreadPv
00000038 T Start__8CPThread
00000014 T _._8CPThread
00000000 T __8CPThread
00000000 ? __FRAME_BEGIN__
…………………………………
则nm –A 的输出如下:
libtest.a:CPThread.o:00000068 T Main__8CPThreadPv
libtest.a:CPThread.o:00000038 T Start__8CPThread
libtest.a:CPThread.o:00000014 T _._8CPThread
libtest.a:CPThread.o:00000000 T __8CPThread
libtest.a:CPThread.o:00000000 ? __FRAME_BEGIN__
…………………………………………………………
* -a或--debug-syms:显示调试符号。
* -B:等同于--format=bsd,用来兼容MIPS的nm。
* -C或--demangle:将低级符号名解码(demangle)成用户级名字。这样可以使得C++函数名具有可读性。
* -D或--dynamic:显示动态符号。该任选项仅对于动态目标(例如特定类型的共享库)有意义。
* -f format:使用format格式输出。format可以选取bsd、sysv或posix,该选项在GNU的nm中有用。默认为bsd。
* -g或--extern-only:仅显示外部符号。
* -n、-v或--numeric-sort:按符号对应地址的顺序排序,而非按符号名的字符顺序。
* -p或--no-sort:按目标文件中遇到的符号顺序显示,不排序。
* -P或--portability:使用POSIX.2标准输出格式代替默认的输出格式。等同于使用任选项-f posix。
* -s或--print-armap:当列出库中成员的符号时,包含索引。索引的内容包含:哪些模块包含哪些名字的映射。
* -r或--reverse-sort:反转排序的顺序(例如,升序变为降序)。
* --size-sort:按大小排列符号顺序。该大小是按照一个符号的值与它下一个符号的值进行计算的。
* -t radix或--radix=radix:使用radix进制显示符号值。radix只能为“d”表示十进制、“o”表示八进制或“x”表示十六进制。
* --target=bfdname:指定一个目标代码的格式,而非使用系统的默认格式。
* -u或--undefined-only:仅显示没有定义的符号(那些外部符号)。
* -l或--line-numbers:对每个符号,使用调试信息来试图找到文件名和行号。对于已定义的符号,查找符号地址的行号。对于未定义符号,查找指向符号重定位入口的行号。如果可以找到行号信息,显示在符号信息之后。
* -V或--version:显示nm的版本号。
* --help:显示nm的任选项。
如:
nm -D /lib/libc.so.6 | grep log
nm用来列出目标文件的符号清单。下面是nm命令的格式: nm [-a|--debug-syms] [-g|--extern-only] [-B][-C|--demangle] [-D|--dynamic] [-s|--print-armap][-o|--print-file-name] [-n|--numeric-sort][-p|--no-sort] [-r|--reverse-sort] [--size-sort][-u|--undefined-only] [-l|--line-numbers] [--help][--version] [-t radix|--radix=radix][-P|--portability] [-f format|--format=format][--target=bfdname] [objfile...]
如果没有为nm命令指出目标文件,则nm假定目标文件是a.out。下面列出该命令的任选项,大部分支持“-”开头的短格式和“—“开头的长格式。
* -A、-o或--print-file-name:在找到的各个符号的名字前加上文件名,而不是在此文件的所有符号前只出现文件名一次。
例如nm libtest.a的输出如下:
CPThread.o:
00000068 T Main__8CPThreadPv
00000038 T Start__8CPThread
00000014 T _._8CPThread
00000000 T __8CPThread
00000000 ? __FRAME_BEGIN__
…………………………………
则nm –A 的输出如下:
libtest.a:CPThread.o:00000068 T Main__8CPThreadPv
libtest.a:CPThread.o:00000038 T Start__8CPThread
libtest.a:CPThread.o:00000014 T _._8CPThread
libtest.a:CPThread.o:00000000 T __8CPThread
libtest.a:CPThread.o:00000000 ? __FRAME_BEGIN__
…………………………………………………………
* -a或--debug-syms:显示调试符号。
* -B:等同于--format=bsd,用来兼容MIPS的nm。
* -C或--demangle:将低级符号名解码(demangle)成用户级名字。这样可以使得C++函数名具有可读性。
* -D或--dynamic:显示动态符号。该任选项仅对于动态目标(例如特定类型的共享库)有意义。
* -f format:使用format格式输出。format可以选取bsd、sysv或posix,该选项在GNU的nm中有用。默认为bsd。
* -g或--extern-only:仅显示外部符号。
* -n、-v或--numeric-sort:按符号对应地址的顺序排序,而非按符号名的字符顺序。
* -p或--no-sort:按目标文件中遇到的符号顺序显示,不排序。
* -P或--portability:使用POSIX.2标准输出格式代替默认的输出格式。等同于使用任选项-f posix。
* -s或--print-armap:当列出库中成员的符号时,包含索引。索引的内容包含:哪些模块包含哪些名字的映射。
* -r或--reverse-sort:反转排序的顺序(例如,升序变为降序)。
* --size-sort:按大小排列符号顺序。该大小是按照一个符号的值与它下一个符号的值进行计算的。
* -t radix或--radix=radix:使用radix进制显示符号值。radix只能为“d”表示十进制、“o”表示八进制或“x”表示十六进制。
* --target=bfdname:指定一个目标代码的格式,而非使用系统的默认格式。
* -u或--undefined-only:仅显示没有定义的符号(那些外部符号)。
* -l或--line-numbers:对每个符号,使用调试信息来试图找到文件名和行号。对于已定义的符号,查找符号地址的行号。对于未定义符号,查找指向符号重定位入口的行号。如果可以找到行号信息,显示在符号信息之后。
* -V或--version:显示nm的版本号。
* --help:显示nm的任选项。
如:
nm -D /lib/libc.so.6 | grep log
分析实施总结报告:
我的测试报告如下:(注意是我的)数据十几万条
采用zouql的索引优化后,每单条网站搜索的CPU负担至少上升一半,如果并发五六条搜索,那等着服务器挂好了
经过彻夜的分析与研究(本人不是程序员,没有理论基础,花的时间也久些)得出:
老柏默认的索引为多列索引,zouql的为单列索引.
看了N多资料后,发现多列肯定是优于单列索引,想想老柏默认的索引是有道理的,否则他不会这样设计的,因为程序的SQL表字段的调用,他最清楚^^
还原老柏默认索引后,性能马上提高一半多.忘了默认索引的朋友我帮大家贴一下:
首先删除所有的索引,除了ID那个,再运行下面:
ALTER TABLE `dede_archives` ADD INDEX `typeid` (sortrank,click,pubdate,senddate,lastpost,postnum);
ALTER TABLE `dede_archives` ADD INDEX `typeid_2` (typeid,typeid2);
ALTER TABLE `dede_archives` ADD INDEX `senddate` (memberID,mtype);
ALTER TABLE `dede_archives` ADD INDEX `title` (title,keywords);
在使用这个默认索引前,我自已也测试了几个多列组合,性能也有所下降,我搞着玩的^^
阅读全文
我的测试报告如下:(注意是我的)数据十几万条
采用zouql的索引优化后,每单条网站搜索的CPU负担至少上升一半,如果并发五六条搜索,那等着服务器挂好了
经过彻夜的分析与研究(本人不是程序员,没有理论基础,花的时间也久些)得出:
老柏默认的索引为多列索引,zouql的为单列索引.
看了N多资料后,发现多列肯定是优于单列索引,想想老柏默认的索引是有道理的,否则他不会这样设计的,因为程序的SQL表字段的调用,他最清楚^^
还原老柏默认索引后,性能马上提高一半多.忘了默认索引的朋友我帮大家贴一下:
首先删除所有的索引,除了ID那个,再运行下面:
ALTER TABLE `dede_archives` ADD INDEX `typeid` (sortrank,click,pubdate,senddate,lastpost,postnum);
ALTER TABLE `dede_archives` ADD INDEX `typeid_2` (typeid,typeid2);
ALTER TABLE `dede_archives` ADD INDEX `senddate` (memberID,mtype);
ALTER TABLE `dede_archives` ADD INDEX `title` (title,keywords);
在使用这个默认索引前,我自已也测试了几个多列组合,性能也有所下降,我搞着玩的^^

写了一个简单的队列任务处理。多进程任务,异步任务可能会用到这个(主要是命令行应用)
比如,任务的某个一个环节速度十分不稳定,可能执行几秒,也可能执行几分钟,
我就可以把那个环节包括前面的部分扔进队列,多跑几个进程,同时往队列里面写。
然后后面比较快的环节只跑一个处理任务就OK了。让整体速度达到更好的效果。
write.php: 将任务写入队列
<?php
/*
产生队列
*/
//用微秒生成队列文件名。因为会有多个队列,所以加了一个identifier来区分各个队列
function mt($identifier='default')
{
return sprintf("%.6f.%s",strtok(microtime(),' ')+strtok(''),$identifier);
}
while(1) //实际中尽量不要while(1) 非要while(1)记得任务完成要break
{
if(count(glob('./queue/*.identifier'))>=10) //队列最大长度,不限制的话硬盘可能会受不了哦。
{
sleep(1);//记住这里要sleep,否则队列满了cpu占用很高
continue;
}
$url = 'www.'.time().'.com'; //随便举个例子,我用时间戳生成了一个网址
echo "$url\r\n";
$fp = fopen('./queue/'.mt('identifier'),'w');
fwrite($fp,$url);
fclose($fp);
sleep(1);//这里不需要sleep,我sleep是因为我的任务太简单。
}
?>
read.php:
<?php
/*
处理队列
*/
while(1) //实际程序最好不要while(1)如果while(1),记得处理完任务要break
{
if($queue = glob('./queue/*.identifier'))
{
$q = array_shift($queue);
$url = file_get_contents($q);
echo $url."\r\n";
unlink($q);
}
sleep(1);//这里要不要sleep或sleep多久自己凭感觉来。
}
?>
比如,任务的某个一个环节速度十分不稳定,可能执行几秒,也可能执行几分钟,
我就可以把那个环节包括前面的部分扔进队列,多跑几个进程,同时往队列里面写。
然后后面比较快的环节只跑一个处理任务就OK了。让整体速度达到更好的效果。
write.php: 将任务写入队列
<?php
/*
产生队列
*/
//用微秒生成队列文件名。因为会有多个队列,所以加了一个identifier来区分各个队列
function mt($identifier='default')
{
return sprintf("%.6f.%s",strtok(microtime(),' ')+strtok(''),$identifier);
}
while(1) //实际中尽量不要while(1) 非要while(1)记得任务完成要break
{
if(count(glob('./queue/*.identifier'))>=10) //队列最大长度,不限制的话硬盘可能会受不了哦。
{
sleep(1);//记住这里要sleep,否则队列满了cpu占用很高
continue;
}
$url = 'www.'.time().'.com'; //随便举个例子,我用时间戳生成了一个网址
echo "$url\r\n";
$fp = fopen('./queue/'.mt('identifier'),'w');
fwrite($fp,$url);
fclose($fp);
sleep(1);//这里不需要sleep,我sleep是因为我的任务太简单。
}
?>
read.php:
<?php
/*
处理队列
*/
while(1) //实际程序最好不要while(1)如果while(1),记得处理完任务要break
{
if($queue = glob('./queue/*.identifier'))
{
$q = array_shift($queue);
$url = file_get_contents($q);
echo $url."\r\n";
unlink($q);
}
sleep(1);//这里要不要sleep或sleep多久自己凭感觉来。
}
?>
yum install openldap openldap-devel nss_ldap openldap-clients openldap-servers
cd php-5.2.8/
./configure 省略参数 --with-ldap --with-ldap-sasl
make ZEND_EXTRA_LIBS='-liconv'
make install
substr()函数可以分割文字,但要分割的文字如果包括中文字符往往会遇到问题,这时可以用mb_substr()/mb_strcut这个函数,mb_substr()/mb_strcut的用法与substr()相似,只是在mb_substr()/mb_strcut最后要加入多一个参数,以设定字符串的编码,但是一般的服务器都没打开php_mbstring.dll,需要在php.ini在把php_mbstring.dll打开。
举个例子:
echo mb_substr('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');
?>
输出:这样一来我的字
echo mb_strcut('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');
?>
输出:这样一
从上面的例子可以看出,mb_substr是按字来切分字符,而mb_strcut是按字节来切分字符,但是都不会产生半个字符的现象
举个例子:
echo mb_substr('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');
?>
输出:这样一来我的字
echo mb_strcut('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');
?>
输出:这样一
从上面的例子可以看出,mb_substr是按字来切分字符,而mb_strcut是按字节来切分字符,但是都不会产生半个字符的现象
在下找到了一个超详细配置教程,大家可以看看去 http://eidiot.net/lessons/fdt/
另外fdt的破解这里也有 , http://my.opera.com/smile_bug/blog/show.dml/192412
这里还有个eclipse的入门,可惜是英文的,偶看了一部分,还没坚持看完- -b
http://www.actionscript.com/Article/tabid/54/ArticleID/Optimizing-Your-Workflow-with-Eclipse-and-FDT/Default.aspx
这还有个针对上篇文章的快捷键总结
http://www.betriebsraum.de/blog/2006/03/12/eclipsefdt-shortcut-sheet/
偶发现这些资源或教程都会在 本站首页 http://www.nshen.net 更新,以后就不会发到blog里了恩。。
eclipse真是强大啊,好多方便的东西。得备忘一下
快捷键:
ctrl shift r 寻找类,很方便不用知道类的路径了
ctrl f 在本文件中查找,替换。当close查找窗口后,ctrl k 继续查找下一个,ctrl shift k 查找前一个
最常用的查找ctrl + J ,可以不用打开新窗口,查找下一个ctrl +J ,查找上一个ctrl shift j
ctrl h 在很多文件中都寻找某字符串,这都是flash灭有的。。
方法属性查找 ctrl+ o
在某变量或方法上按f3可以查找声明该变量或方法的地方
f4可以打开该属性的class类型
f5会打开该class的super class //好象没打开- -b
下边这个厉害了 (Type Hierarchy view),找个类,ctrl+T ,整个类库结构1清2楚了
另外fdt的破解这里也有 , http://my.opera.com/smile_bug/blog/show.dml/192412
这里还有个eclipse的入门,可惜是英文的,偶看了一部分,还没坚持看完- -b
http://www.actionscript.com/Article/tabid/54/ArticleID/Optimizing-Your-Workflow-with-Eclipse-and-FDT/Default.aspx
这还有个针对上篇文章的快捷键总结
http://www.betriebsraum.de/blog/2006/03/12/eclipsefdt-shortcut-sheet/
偶发现这些资源或教程都会在 本站首页 http://www.nshen.net 更新,以后就不会发到blog里了恩。。
eclipse真是强大啊,好多方便的东西。得备忘一下
快捷键:
ctrl shift r 寻找类,很方便不用知道类的路径了
ctrl f 在本文件中查找,替换。当close查找窗口后,ctrl k 继续查找下一个,ctrl shift k 查找前一个
最常用的查找ctrl + J ,可以不用打开新窗口,查找下一个ctrl +J ,查找上一个ctrl shift j
ctrl h 在很多文件中都寻找某字符串,这都是flash灭有的。。
方法属性查找 ctrl+ o
在某变量或方法上按f3可以查找声明该变量或方法的地方
f4可以打开该属性的class类型
f5会打开该class的super class //好象没打开- -b
下边这个厉害了 (Type Hierarchy view),找个类,ctrl+T ,整个类库结构1清2楚了
今天在做GSM模块收发短信中,遇到了一个问题,0X0D和0X0A会自动只收到0X0A,在网上查了下,果真有这个问题。
现在把原因及解决方法写出来:
在我们发送字符0x0d的时候,往往接受端得到的字符是0x0a 这是怎么回事,原因是在串口配置中c_iflag和c_oflag中存在从NL-CR 和CR-NL的映射,也就是说,串口能够把回车和换行看成一个字符,所以,此时我们应该屏蔽掉这些,用options.c_oflag &=~(INLCR|IGNCR|ICRNL|);和options.c_oflag &=~(ONLCR|OCRNL); 进行配置。
还有一个例子:
struct termios Opt;
int m_fd = open("/dev/ttyAM1", O_RDWR | O_NOCTTY | O_NDELAY);
if(m_fd==-1) perror("lcd_drawlib: Cannot open ttyAM1! \n" ) ;
//设置 串口的NL-CR 和CR-NL 的映射
tcgetattr(m_fd,&Opt); //首先读取系统默认设置options
Opt.c_iflag &=~(INLCR|IGNCR|ICRNL);
Opt.c_oflag &=~(ONLCR|OCRNL);
tcflush(m_fd,TCIFLUSH); /* Update the options and do it NOW */ //刷新和立刻写进去
//设置波特率
cfsetispeed(&Opt,B9600);
cfsetospeed(&Opt,B9600);
tcsetattr(m_fd,TCSANOW,&Opt);
write(m_fd, "\x0a", 1);
close(m_fd);
参考资料:http://www.oldlinux.org/oldlinux/viewthread.php?tid=7903,http://www.idcnews.net/html/edu/20070101/285934.html注意:参考中Opt.c_iflag写错,我已进行了修改
现在把原因及解决方法写出来:
在我们发送字符0x0d的时候,往往接受端得到的字符是0x0a 这是怎么回事,原因是在串口配置中c_iflag和c_oflag中存在从NL-CR 和CR-NL的映射,也就是说,串口能够把回车和换行看成一个字符,所以,此时我们应该屏蔽掉这些,用options.c_oflag &=~(INLCR|IGNCR|ICRNL|);和options.c_oflag &=~(ONLCR|OCRNL); 进行配置。
还有一个例子:
struct termios Opt;
int m_fd = open("/dev/ttyAM1", O_RDWR | O_NOCTTY | O_NDELAY);
if(m_fd==-1) perror("lcd_drawlib: Cannot open ttyAM1! \n" ) ;
//设置 串口的NL-CR 和CR-NL 的映射
tcgetattr(m_fd,&Opt); //首先读取系统默认设置options
Opt.c_iflag &=~(INLCR|IGNCR|ICRNL);
Opt.c_oflag &=~(ONLCR|OCRNL);
tcflush(m_fd,TCIFLUSH); /* Update the options and do it NOW */ //刷新和立刻写进去
//设置波特率
cfsetispeed(&Opt,B9600);
cfsetospeed(&Opt,B9600);
tcsetattr(m_fd,TCSANOW,&Opt);
write(m_fd, "\x0a", 1);
close(m_fd);
参考资料:http://www.oldlinux.org/oldlinux/viewthread.php?tid=7903,http://www.idcnews.net/html/edu/20070101/285934.html注意:参考中Opt.c_iflag写错,我已进行了修改
<?php
class EchoParam
{
function EchoValue($a,$b)
{
echo "value = ".$a*$b."\n";
}
function EchoValues($a,$b)
{
echo "jjjj";
}
}
class ClsFactory
{
public static function CreateNoCheckModel($classname)
{
return new $classname;
}
}
class Vmware
{
public function doProx($method, $args)
{
$model = ClsFactory::CreateNoCheckModel("EchoParam");
echo call_user_func_array ( array ($model, $method), $args);
}
public function __call($method, $args)
{ var_dump($method);
return $this->doProx($method, $args);
}
}
$a = 1;
$b = 88;
$mwallobj = new Vmware();
$mwallobj->EchoValue($a, $b);
$mwallobj->EchoValues($a, $b);
?>
class EchoParam
{
function EchoValue($a,$b)
{
echo "value = ".$a*$b."\n";
}
function EchoValues($a,$b)
{
echo "jjjj";
}
}
class ClsFactory
{
public static function CreateNoCheckModel($classname)
{
return new $classname;
}
}
class Vmware
{
public function doProx($method, $args)
{
$model = ClsFactory::CreateNoCheckModel("EchoParam");
echo call_user_func_array ( array ($model, $method), $args);
}
public function __call($method, $args)
{ var_dump($method);
return $this->doProx($method, $args);
}
}
$a = 1;
$b = 88;
$mwallobj = new Vmware();
$mwallobj->EchoValue($a, $b);
$mwallobj->EchoValues($a, $b);
?>
这个$method 就是调用的函数名,这就给代理前作判断,而可以代理后就调用modle层的方法,正是因为类Vmware没有这个方法名,而modle层有这个方法名,达到了代理认证的目的。
结果:
[root@vm0000055 ~]# php call_user_func_array.php
string(9) "EchoValue"
value = 88
string(10) "EchoValues"
jjjj
string(9) "EchoValue"
value = 88
string(10) "EchoValues"
jjjj
==========================================
call_user_func_array函数也可以调用类内部的方法的:
Class ClassA
{
function bc($b, $c) {
$bc = $b + $c;
echo $bc;
}
}
call_user_func_array(array('ClassA','bc'), array("111", "222"));
//显示 333
?>
注意POST:
$this->para['uid'] = $_POST['uid'];
$this->para['content'] =$_POST['content'];
GET接收:
$this->para['uid'] = $_GET['uid'];
$this->para['content'] =$_GET['content'];
中文问题:
var url="a.jsp?name=小李";
url=encodeURI(url);
url=encodeURI(url); //两次,很关键[具体为什么,我也不清楚]
/********************************************/
也有人写成var url="a.jsp?name=escape("小李")";
功能和encodeURI方法类似。
/********************************************/
xmlHTTP.setrequestheader("cache-control","no-cache");
xmlHTTP.setrequestheader("Content-Type","application/x-www-form-urlencoded");
xmlHTTP.setrequestheader("contentType","text/html;charset=uft-8")//指定发送数据的编码格式
xmlHTTP.open ("post",url,true);
PHP得做:urldecode()的操作。
用httpfox抓包,用httpwatcher调试js错误。
以下是Ajax POST提交方式提交:
阅读全文
$this->para['uid'] = $_POST['uid'];
$this->para['content'] =$_POST['content'];
GET接收:
$this->para['uid'] = $_GET['uid'];
$this->para['content'] =$_GET['content'];
中文问题:
var url="a.jsp?name=小李";
url=encodeURI(url);
url=encodeURI(url); //两次,很关键[具体为什么,我也不清楚]
/********************************************/
也有人写成var url="a.jsp?name=escape("小李")";
功能和encodeURI方法类似。
/********************************************/
xmlHTTP.setrequestheader("cache-control","no-cache");
xmlHTTP.setrequestheader("Content-Type","application/x-www-form-urlencoded");
xmlHTTP.setrequestheader("contentType","text/html;charset=uft-8")//指定发送数据的编码格式
xmlHTTP.open ("post",url,true);
PHP得做:urldecode()的操作。
用httpfox抓包,用httpwatcher调试js错误。
以下是Ajax POST提交方式提交:

$HTTP["host"] == "xd.sina.com.cn" {
server.document-root = "/opt/www/pengyou/framework2/"
accesslog.filename = space_logdir + "xd.sina.com.cn-access.log"
server.errorlog = space_logdir + "xd.sina.com.cn-error.log"
url.rewrite-once = (
"^/?$" => "/control/index.php",
"^/view/(.*)" => "/view/$1",
"^/(.*)" => "/control/$1",
)
}
PHP开发,个人觉得还是要轻量级去做框架,分为3个层次:data 层 modle层 control 层,而我们在data层里面可能会用到设计模式的单一模式,而在modle层里面可能采用简单工厂模式,而在control层里面有order模式,和代理(proxy层,让框架去自动调用),而这里面往往这些都在一个依赖倒转原则下(也就是会修电脑但你不会修收音机),其实就是一个里氏代换原则,让data modle control彻底的分开,就像电脑插槽一样,随时随地可以替换,而且很容易查到问题 的所在。
工厂类调用方式:
$smarty = ClsFactory::Create ( "libs::MySmarty" );
$this->template = 'myrecord.html';
工厂类实现方法:
class ClsFactory
{
function Create($classname)
{
$c = explode("::",$classname);
if(count($c) == 2)
{
$package = $c[0];
$classname = $c[1];
}
if(!class_exists($classname))
{
$classpath = SERVER_ROOT."/libs/";
//if($package) $classpath .= $package."/";
$classfile = $classpath.strtolower($classname).".class.php";
if(!file_exists($classfile)) return 0;
include($classfile);
}
if(!class_exists($classname)) {
return 0;
}
return new $classname;
}
}
路径定义:
./stdafx.php:define ( "SERVER_ROOT", dirname ( __FILE__ ) );
全局变量:
function init_www()
{
$need_include = array (
SERVER_ROOT,
SERVER_ROOT . DIRECTORY_SEPARATOR . "libs" . DIRECTORY_SEPARATOR,
SERVER_ROOT . DIRECTORY_SEPARATOR . "program" . DIRECTORY_SEPARATOR,
dirname ( SERVER_ROOT ) . DIRECTORY_SEPARATOR . "libs" . DIRECTORY_SEPARATOR );
$include_path = explode ( PATH_SEPARATOR, ini_get ( 'include_path' ) );
foreach ( $need_include as $path )
{
if (! in_array ( $path, $include_path ))
{
$include_path [] = $path;
}
}
ini_set ( 'include_path', join ( PATH_SEPARATOR, $include_path ) );
}
init_www ();
工厂类调用方式:
$smarty = ClsFactory::Create ( "libs::MySmarty" );
$this->template = 'myrecord.html';
工厂类实现方法:
class ClsFactory
{
function Create($classname)
{
$c = explode("::",$classname);
if(count($c) == 2)
{
$package = $c[0];
$classname = $c[1];
}
if(!class_exists($classname))
{
$classpath = SERVER_ROOT."/libs/";
//if($package) $classpath .= $package."/";
$classfile = $classpath.strtolower($classname).".class.php";
if(!file_exists($classfile)) return 0;
include($classfile);
}
if(!class_exists($classname)) {
return 0;
}
return new $classname;
}
}
路径定义:
./stdafx.php:define ( "SERVER_ROOT", dirname ( __FILE__ ) );
全局变量:
function init_www()
{
$need_include = array (
SERVER_ROOT,
SERVER_ROOT . DIRECTORY_SEPARATOR . "libs" . DIRECTORY_SEPARATOR,
SERVER_ROOT . DIRECTORY_SEPARATOR . "program" . DIRECTORY_SEPARATOR,
dirname ( SERVER_ROOT ) . DIRECTORY_SEPARATOR . "libs" . DIRECTORY_SEPARATOR );
$include_path = explode ( PATH_SEPARATOR, ini_get ( 'include_path' ) );
foreach ( $need_include as $path )
{
if (! in_array ( $path, $include_path ))
{
$include_path [] = $path;
}
}
ini_set ( 'include_path', join ( PATH_SEPARATOR, $include_path ) );
}
init_www ();