http://hi.baidu.com/widebright/blog/item/eb039950a0c0996785352427.html
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
你也可以将这个服务在系统启动的时候自动启动:
在/etc/rc.d/rc.local这个脚本的末尾加上:
/sbin/service crond start
现在Cron这个服务已经在进程里面了,我们就可以用这个服务了,Cron服务提供以下几种接口供大家使用:
1、直接用crontab命令编辑
cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除某个用户的cron服务
crontab -e //编辑某个用户的cron服务
比如说root查看自己的cron设置:crontab -u root -l
再例如,root想删除fred的cron设置:crontab -u fred -r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e
进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt
这个格式的前一部分是对时间的设定,后面一部分是要执行的命令,如果要执行的命令太多,可以把这些命令写到一个脚本里面,然后在这里直接调用这个脚本就可以了,调用的时候记得写出命令的完整路径。时间的设定我们有一定的约定,前面五个*号代表五个数字,数字的取值范围和含义如下:
分钟 (0-59)
小時 (0-23)
日期 (1-31)
月份 (1-12)
星期 (0-6)//0代表星期天
除了数字还有几个个特殊的符号就是"*"、"/"和"-"、",",*代表所有的取值范围内的数字,"/"代表每的意思,"*/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。以下举几个例子说明问题:
每天早上6点
0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
每两个小时
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * * echo "Have a good dream:)" >> /tmp/test.txt
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3 command line
1月1日早上4点
0 4 1 1 * command line
每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。cron启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。
2、编辑/etc/crontab 文件配置cron
cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用 cron服务做一些事情。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/ //使用者运行的路径,这里是根目录
# run-parts
01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本
02 4 * * * root run-parts /etc/cron.daily //每天执行/etc/cron.daily内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行/etc/cron.weekly内的脚本
42 4 1 * * root run-parts /etc/cron.monthly //每月去执行/etc/cron.monthly内的脚本
大家注意"run-parts"这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了。
--------------------------------------
基本格式 :
* * * * * command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
crontab文件的一些例子:
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启lighttpd 。
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启lighttpd 。
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启lighttpd 。
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启lighttpd 。
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启lighttpd 。
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启lighttpd
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启lighttpd
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启lighttpd
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启lighttpd
1 前言
- 主要目的让大家了解一下怎么做PHP语言的扩展,仍然以上次叙述的Perl的扩展的例子——获得IP来源地址为例。
2 前提条件
- 假设你已经拥有了 LAMP (Linux+Apache+Mysql+PHP的缩写),并假设其安装路径分别是:
Apache:/usr/local/apache
Mysql:/usr/local/mysql
PHP:/usr/local/php
- 目前所叙述的实例可能与 mysql 没有太多的关系,所以无关紧要,但是 PHP 是必须安装的;
- 另外,需要 PHP 的源码,如果你没有,可以去 http://www.php.net 获取 PHP 源码,其源码路径位:
PHPSrc:/usr/local/php/src
- 末了说句,本实例完全在 Linux 64 位平台下演示,若有出入,可以随时联系笔者。
3 流程及步骤
- 其实制作PHP扩展非常简单, ext_skel 命令的帮助已说明得非常详细,如下所示:
[Cnangel@localhost ~]$cd /usr/local/php/src/ext
[Cnangel@localhost ext]$ext_skel --help
./ext_skel --extname=module [--proto=file] [--stubs=file] [--xml[=file]]
[--skel=dir] [--full-xml] [--no-help]
--extname=module module is the name of your extension
--proto=file file contains prototypes of functions to create
--stubs=file generate only function stubs in file
--xml generate xml documentation to be added to phpdoc-cvs
--skel=dir path to the skeleton directory
--full-xml generate xml documentation for a self-contained extension
(not yet implemented)
--no-help don't try to be nice and create comments in the code
and helper functions to test if the module compiled
- 尝试着创建一个扩展 getaddress :
[Cnangel@localhost ext]$ext_skel --extname=getaddress
Creating directory getaddress
Creating basic files: config.m4 config.w32 .cvsignore getaddress.c php_getaddress.h CREDITS EXPERIMENTAL tests/001.phpt getaddress.php [done].
To use your new extension, you will have to execute the following steps:
1. $ cd ..
2. $ vi ext/getaddress/config.m4
3. $ ./buildconf
4. $ ./configure --[with|enable]-getaddress
5. $ make
6. $ ./php -f ext/getaddress/getaddress.php
7. $ vi ext/getaddress/getaddress.c
8. $ make
Repeat steps 3-6 until you are satisfied with ext/getaddress/config.m4 and
step 6 confirms that your module is compiled into PHP. Then, start writing
code and repeat the last two steps as often as necessary.
- 上面的后续的帮助步骤已经说得比较清楚,一共 8 个步骤;
4 详细过程描述
4.1 建立扩展目录
- 方便的 ext_skel 命令能帮助建立一个扩展模型 getaddress ,系统会自动建立一个 getaddress 目录,其文件会相应的生成在 getaddress 目录内;
4.2 描述及编辑config.m4
- 用 ext_skel 建立的目录里面一般有 config.m4 这个文件,这里面有一些基础的宏定义:
- dnl 是注释;
- PHP_ARG_WITH 或者 PHP_ARG_ENABLE 指定了PHP扩展模块的工作方式;
- PHP_REQUIRE_CXX 用于指定这个扩展用到了C++;
- PHP_ADD_INCLUDE 指定PHP扩展模块用到的头文件目录;
- PHP_CHECK_LIBRARY 指定PHP扩展模块PHP_ADD_LIBRARY_WITH_PATH定义以及库连接错误信息等;
- PHP_SUBST 用于说明这个扩展编译成动态链接库的形式;
- PHP_NEW_EXTENSION 用于指定有哪些源文件应该被编译,文件和文件之间用空格隔开;
- 这里指定PHP扩展模块的工作方式为 PHP_ARG_ENABLE ,需要修改config.m4文件为:
[Cnangel@localhost getaddress]vim config.m4找到里面有类似几行:
dnl PHP_ARG_WITH(getaddress, for getaddress support,修改成:
dnl Make sure that the comment is aligned:
dnl [ --with-getaddress Include getaddress support])
dnl Otherwise use enable:
dnl PHP_ARG_ENABLE(getaddress, whether to enable getaddress support,
dnl Make sure that the comment is aligned:
dnl [ --enable-getaddress Enable getaddress support])
dnl PHP_ARG_WITH(getaddress, for getaddress support,
dnl Make sure that the comment is aligned:
dnl [ --with-getaddress Include getaddress support])
dnl Otherwise use enable:
PHP_ARG_ENABLE(getaddress, whether to enable getaddress support,
Make sure that the comment is aligned:
[ --enable-getaddress Enable getaddress support])
- 除了修改 config.m4 外,还需要修改的文件有 getaddress.c 、 php_getaddress.h 两个文件,下面会说到该文件的修改。
4.3 创建configure文件
- 源码修改:进入源代码根目录,使用工具 buildconf 创建 configure 文件,其命令如下:
[Cnangel@localhost getaddress]cd /usr/local/php/src
[Cnangel@localhost src]./buildconf
- 扩展修改:进入扩展目录,使用工具 phpize 创建 configure 文件,其目录如下:
[Cnangel@localhost getaddress]/usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519
4.4 创建Makefile文件
- 上个步骤中创建了 configure 文件,记住,一般在类unix系统中, configure 文件是一个可执行文件,用来创建编译过程中所用到的make命令所需要的Makefile文件,其创建过程如下:
./configure --enable-getaddress --with-apxs=/usr/local/apache/bin/apxs --with-php-config=/usr/local/php/bin/php-config
- 注意,如果你写的扩展与apache有关,则需要关联apxs,产生apache的modules。
4.5 编译过程
- 编译过程是一个调试过程,出现错误了需要检查 config.m4 、 getaddress.c 、 php_getaddress.h 这几个文件是否编写正确,编译的过程十分简单,命令如下:
make
4.6 安装扩展模块
- 安装扩展模块一般有两种安装,一种是直接:
make install
- 结果会安装到: /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/ 目录,然后在 php.ini 里面通过 extension_dir 将该目录设置为php的扩展目录,并在php.ini中打开这个扩展:
extension=getaddress.so
- 另外一种是直接复制。一般经过编译过程这个步骤后,会在 getaddress 目录下生成一个目录: modules ,该目录下面有一个已经编译好的.so文件,如果是静态编译,可能是.a或.la;把该文件复制到一个目录下,比如: /usr/loca/php/ext/ ,然后直接调用函数 dl 来调用其 api。
4.7 运行测试
- getaddress 目录下有一个 getaddress.php 文件专门用来测试你的扩展模块是否正确运行,该文件即可以作为 CGI 来运行又可以当作脚本执行,命令如下:
[Cnangel@localhost getaddress]php -f getaddress.php
Functions available in the test extension:
confirm_getaddress_compiled
Congratulations! You have successfully modified ext/getaddress/config.m4. Module getaddress is now compiled into PHP.
4.8 增添PHP扩展模块函数
- 上述讲了这么多,这节才是最主要的。PHP扩展模块主要有三个方面的作用:
- 增加PHP基础函数没有的功能或更加 OOP(Object Oriented Programming) 的思想供工程调用;
- PHP的扩展一般是汇编、C/C++等编译性语言缩写,二进制运行消耗时间比解释性语言实现同样的功能少得多;
- 由于PHP扩展一般是二进制的,所以一般来说不开源,很方便的保护了版权,能够进行商业运用。
- 默认的 getaddress.c 中, zend_function_entry 是导出函数列表, zend_module_entry 描述了模块的信息。
- 编写代码应该注意:
- 如果是C++开发,记住把getaddress.c的后缀改为cpp,并用extern "C"来把c相关代码包起来;
5 Bugs
- 在64位机器上和32位机器上会出现很大的差异,主要在QQWry.c文件;
- 多个引用php函数会出现corp dump情况,具体原因还未查清;
6 实例代码
- 注意,修复一处Bug:将
Z_STRVAL_P(file) == NULL代替
Z_STRLEN_P(file) == 0
7 总结
- 由于作者对C指针运用不太熟练,所以在操作指针时,往往会出现corp dump,这方面有待加强;
- 就PHP扩展来说,涵盖的面比较广,需要丰富的知识面做铺垫才能做好一个优秀的扩展。
参考:
http://tech.ddvip.com/2009-09/1252583445132022.html
目前该类库可以实现,简体中文 <-> 繁体中文编码互换,简体中文、繁体中文 -> 拼音单向转换,
简体中文、繁体中文 <-> UTF8 编码转换,简体中文、繁体中文 -> Unicode单向转换
@作者 Hessian(solarischan@21cn.com)
@版本 1.5
@版权所有 Hessian / NETiS
@使用授权 GPL(不能应用于任何商业用途,无须经过作者同意即可修改代码,但修改后的代码必须按照GPL协议发布)
@特别鸣谢 unknow(繁简转换代码片断)
@起始 2003-04-01
@最后修改 2003-06-06
@访问 公开
更新记录
ver 1.7 2005-07-26
修改了while循环导致的bug。此bug当字符串最后一个字符为"0"的时候将处理错误。
受影响方法: CHStoUTF8() , CHStoUNICODE()
ver 1.6 2005-05-16
构造函数增加了一个参数以便用户可以方便的在使用的时候设置配置文件路径
ver 1.5 2003-06-06
增加 UTF8 转换到 GB2312、BIG5的功能。
ver 1.4 2003-04-07
增加 当转换HTML时设定为true,即可改变charset的值。
ver 1.3 2003-04-02
增加 繁体中文转换至拼音的功能。
ver 1.2 2003-04-02
合并 简体、繁体中文转换至UTF8的函数。
修改 简体中文转换至拼音的函数,返回值更改为字符串,每一个汉字的拼音用空格分开
增加 简体中文转换为 UNICODE 的功能。
增加 繁体中文转换为 UNICODE 的功能。
ver 1.1 2003-04-02
增加 OpenFile() 函数,支持打开本地文件和远程文件。
增加 简体中文转换为 UTF8 的功能。
增加 繁体中文转换为 UTF8 的功能。
ver 1.0 2003-04-01
一个集合了中文简体,中文繁体对应各种编码互换的类库已经初步完成。
IBM出品PHP教程文章
概述
PHP 简介
源代码控制
利用 PHP 和 Subversion 从零开始创建一个 blog
开发
学习 PHP
开始了解 PHP V5 中的对象
用 PHP 走向动态
学习 PHP,第一部分
学习 PHP,第二部分
学习 PHP,第三部分
用 PHP 开发健壮的代码,第 1 部分
用 PHP 开发健壮的代码,第 2 部分:有效地使用变量
用 PHP 开发健壮的代码,第 3 部分:编写可重用函数 -- 充分利用函数
PHP 例解,第 1 部分:轻松的 Webzine 编辑和发送
PHP 例解,第 2 部分:深入研究 Webzine 编辑和发送
高级 PHP
高级 PHP V5 对象
用 PHP 构建 Web 服务
用 PHP 绘制 3-D 图像
使用 PHP 创建图形的巧妙方法
如何在 PHP 中使用正则表达式
结合 PHP 使用 HTML 表单
用 PHP 读取和编写 XML DOM
通过 PHP 脚本访问企业应用
PHP 设计
MVC 模式、类封装还是黑客代码——合理设计 PHP 项目
PHP 应用
使用 PHP 构建搜索优化应用程序,第 1 部分:入门
用 OpenLaszlo 装点 PHP 应用,第 1 部分: 创建交互式界面
用 OpenLaszlo 装点 PHP 应用,第 2 部分: PHP REST 和数据绑定
用 OpenLaszlo 装点 PHP 应用,第 3 部分: 添加数据库
使用 Snort 和 PHP 构建一个小型网络防御系统
用 PHP 使 Web 数据分析进入更高境界 -- 设计您的数据分析,做比简单原始计数更多的事
用 PHP 实现的简单线性回归:第 1 部分 -- 数学库在 PHP 中的重要性
用 PHP 实现的简单线性回归,第 2 部分 -- 解决输出和概率函数缺陷的数据研究工具
调试和监测
PHP 程序员的调试技术
集成
IBM 数据库服务器
使用 DB2 UDB 进行应用程序开发
用 PHP 开发 IBM Cloudscape 和 DB2 通用数据库应用程序
通过 PDO 将 PHP 连接到 DB2 和 Cloudscape
Zend Core for IBM 技术路线图
Zend Core for IBM - PHP 开发人员指南
DB2 Express-C:IBM 提供的免费大餐
IBM Web 和应用服务器
在 IBM HTTP Server 上部署 PHP 应用程序
IBM WebSphere 开发者技术期刊: 使用 PHP 和 J2EE 来实现通用的 Web 应用程序基础架构
在 Apache Geronimo 中运行 PHP 应用程序
第三方服务
使用 Web 服务和 eBay SDK 开发应用程序,第 1 部分: 构建 eBay 搜索引擎
使用 Web 服务和 eBay SDK 开发应用程序,第 2 部分:使用 eBay SOAP API 构建一个 eBay 搜索引擎
用 PHP、Derby 和 PayPal 创建 Web 店面,第 1 部分:设置基本数据库
用 PHP、Derby 和 PayPal 创建 Web 店面,第 2 部分:收集付款
用 PHP、Derby 和 PayPal 创建 Web 店面,第 3 部分: 设置订单、送货和电子邮件
用 PHP 创建 Amazon 店面,第 1 部分:用 Amazon ECS 获得内容
扩展
PHP 服务数据对象简介
如何使您的 PHP 应用程序变成聊天机器人
在 PHP 世界中选择最合适的模板
PEAR(PHP Extension and Application Repository)
PEAR 简介:用 PEAR 来写你的下一个 PHP 程序
PEAR 简介:常用模块
PEAR 简介:使用 PHPDoc 轻松建立你的 PEAR 文档
PEAR 简介:创建中间的数据库应用层
PEAR 实践:PHP 中 MVC 机制的实现
安全性
确保 PHP 应用程序的安全
审计 PHP,第 1 部分:理解 register_globals
PHP Zend 框架
理解 Zend 框架,第 1 部分:基础 -- 介绍 Zend 框架
理解 Zend 框架,第 2 部分: 模型-视图-控制器及添加数据库
理解 Zend 框架,第 3 部分: 提要(RSS)
理解 Zend 框架,第 4 部分: 使用 Zend_HTTP_Client 获取无提要的内容
理解 Zend 框架,第 5 部分: 创建 PDF 文件
理解 Zend 框架,第 6 部分: 发送电子邮件
理解 Zend 框架,第 7 部分: 搜索
理解 Zend 框架,第 8 部分:添加相关信息和服务
理解 Zend 框架,第 9 部分: 用 Ajax 和 JSON 添加交互性
CURL? 嗯,说来话长了~~~~
这东西现在已经是苹果机上内置的命令行工具之一了,可见其魅力之一斑
1)
二话不说,先从这里开始吧!
curl http://www.yahoo.com
回车之后,www.yahoo.com 的html就稀里哗啦地显示在屏幕上了~~~~~
2)
嗯,要想把读过来页面存下来,是不是要这样呢?
curl http://www.yahoo.com > page.html
当然可以,但不用这么麻烦的!
用curl的内置option就好,存下http的结果,用这个option: -o
curl -o page.html http://www.yahoo.com
这样,你就可以看到屏幕上出现一个下载页面进度指示。等进展到100%,自然就OK咯
3)
什么什么?!访问不到?肯定是你的proxy没有设定了。
使用curl的时候,用这个option可以指定http访问所使用的proxy服务器及其端口: -x
curl -x 123.45.67.89:1080 -o page.html http://www.yahoo.com
4)
访问有些网站的时候比较讨厌,他使用cookie来记录session信息。
像IE/NN这样的浏览器,当然可以轻易处理cookie信息,但我们的curl呢?.....
我们来学习这个option: -D <-- 这个是把http的response里面的cookie信息存到一个特别的文件中去
curl -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.yahoo.com
这样,当页面被存到page.html的同时,cookie信息也被存到了cookie0001.txt里面了
5)
那么,下一次访问的时候,如何继续使用上次留下的cookie信息呢?要知道,很多网站都是靠监视你的cookie信息,
来判断你是不是不按规矩访问他们的网站的。
这次我们使用这个option来把上次的cookie信息追加到http request里面去: -b
curl -x 123.45.67.89:1080 -o page1.html -D cookie0002.txt -b cookie0001.txt http://www.yahoo.com
这样,我们就可以几乎模拟所有的IE操作,去访问网页了!
6)
稍微等等~~~~~我好像忘记什么了~~~~~
对了!是浏览器信息~~~~
有些讨厌的网站总要我们使用某些特定的浏览器去访问他们,有时候更过分的是,还要使用某些特定的版本~~~~
NND,哪里有时间为了它去找这些怪异的浏览器呢!?
好在curl给我们提供了一个有用的option,可以让我们随意指定自己这次访问所宣称的自己的浏览器信息: -A
curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.yahoo.com
这样,服务器端接到访问的要求,会认为你是一个运行在Windows 2000上的IE6.0,嘿嘿嘿,其实也许你用的是苹果机呢!
而"Mozilla/4.73 [en] (X11; U; Linux 2.2; 15 i686"则可以告诉对方你是一台PC上跑着的Linux,用的是Netscape 4.73,呵呵呵
7)
另外一个服务器端常用的限制方法,就是检查http访问的referer。比如你先访问首页,再访问里面所指定的下载页,这第二次访问的referer地址就是第一次访问成功后的页面地址。这样,服务器端只要发现对下载页面某次访问的referer地址不 是首页的地址,就可以断定那是个盗连了~~~~~
讨厌讨厌~~~我就是要盗连~~~~~!!
幸好curl给我们提供了设定referer的option: -e
curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -e "mail.yahoo.com" -o page.html -D cookie0001.txt http://www.yahoo.com
这样,就可以骗对方的服务器,你是从mail.yahoo.com点击某个链接过来的了,呵呵呵
8)
写着写着发现漏掉什么重要的东西了!----- 利用curl 下载文件
刚才讲过了,下载页面到一个文件里,可以使用 -o ,下载文件也是一样。
比如,
curl -o 1.jpg http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG
这里教大家一个新的option: -O
大写的O,这么用:
curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG
这样,就可以按照服务器上的文件名,自动存在本地了!
再来一个更好用的。
如果screen1.JPG以外还有screen2.JPG、screen3.JPG、....、screen10.JPG需要下载,难不成还要让我们写一个script来完成这些操作?
不干!
在curl里面,这么写就可以了:
curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen[1-10].JPG
呵呵呵,厉害吧?!~~~
9)
再来,我们继续讲解下载!
curl -O http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG
这样产生的下载,就是
~zzh/001.JPG
~zzh/002.JPG
...
~zzh/201.JPG
~nick/001.JPG
~nick/002.JPG
...
~nick/201.JPG
够方便的了吧?哈哈哈
咦?高兴得太早了。
由于zzh/nick下的文件名都是001,002...,201,下载下来的文件重名,后面的把前面的文件都给覆盖掉了~~~
没关系,我们还有更狠的!
curl -o #2_#1.jpg http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG
--这是.....自定义文件名的下载?
--对头,呵呵!
#1是变量,指的是{zzh,nick}这部分,第一次取值zzh,第二次取值nick
#2代表的变量,则是第二段可变部分---[001-201],取值从001逐一加到201
这样,自定义出来下载下来的文件名,就变成了这样:
原来: ~zzh/001.JPG ---> 下载后: 001-zzh.JPG
原来: ~nick/001.JPG ---> 下载后: 001-nick.JPG
这样一来,就不怕文件重名啦,呵呵
9)
继续讲下载
我们平时在windows平台上,flashget这样的工具可以帮我们分块并行下载,还可以断线续传。
curl在这些方面也不输给谁,嘿嘿
比如我们下载screen1.JPG中,突然掉线了,我们就可以这样开始续传
curl -c -O http://cgi2.tky.3wb.ne.jp/~zzh/screen1.JPG
当然,你不要拿个flashget下载了一半的文件来糊弄我~~~~别的下载软件的半截文件可不一定能用哦~~~
分块下载,我们使用这个option就可以了: -r
举例说明
比如我们有一个http://cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 要下载(赵老师的电话朗诵 :D )
我们就可以用这样的命令:
curl -r 0-10240 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &
curl -r 10241-20480 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &
curl -r 20481-40960 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &
curl -r 40961- -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3
这样就可以分块下载啦。
不过你需要自己把这些破碎的文件合并起来
如果你用UNIX或苹果,用 cat zhao.part* > zhao.mp3就可以
如果用的是Windows,用copy /b 来解决吧,呵呵
上面讲的都是http协议的下载,其实ftp也一样可以用。
用法嘛,
curl -u name:passwd ftp://ip:port/path/file
或者大家熟悉的
curl ftp://name:passwd@ip:port/path/file
10)
说完了下载,接下来自然该讲上传咯
上传的option是 -T
比如我们向ftp传一个文件:
curl -T localfile -u name:passwd ftp://upload_site:port/path/
当然,向http服务器上传文件也可以
比如
curl -T localfile http://cgi2.tky.3web.ne.jp/~zzh/abc.cgi
注意,这时候,使用的协议是HTTP的PUT method
刚才说到PUT,嘿嘿,自然让老服想起来了其他几种methos还没讲呢!
GET和POST都不能忘哦。
http提交一个表单,比较常用的是POST模式和GET模式
GET模式什么option都不用,只需要把变量写在url里面就可以了
比如:
curl http://www.yahoo.com/login.cgi?user=nickwolfe&password=12345
而POST模式的option则是 -d
curl -d "user=nickwolfe&password=12345" http://www.yahoo.com/login.cgi
就相当于向这个站点发出一次登陆申请~~~~~
到底该用GET模式还是POST模式,要看对面服务器的程序设定。
一点需要注意的是,POST模式下的文件上的文件上传,比如
<form method="POST" enctype="multipar/form-data" action="http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi">
<input type=file name=upload>
<input type=submit name=nick value="go">
</form>
这样一个HTTP表单,我们要用curl进行模拟,就该是这样的语法:
curl -F upload=@localfile -F nick=go http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi
罗罗嗦嗦讲了这么多,其实curl还有很多很多技巧和用法
比如 https的时候使用本地证书,就可以这样
curl -E localcert.pem https://remote_server
再比如,你还可以用curl通过dict协议去查字典~~~~~
curl dict://dict.org/d:computer
今天就先讲到这里吧,呵呵。疯狂的curl功能,需要你---一起来发掘。
现在有点后悔浪费的时间
开始的时候,整天查手册,研究每一个函数的使用
然后去写自己想写的东西,遇到问题还是看手册,找各种类库资源,然后再写出自己的类库
一直到现在,自己的类库也不断的在升级和更新
以前刚学的时候,总把PHP看得很强大,看着别人的程序觉得很牛B,以为有什么牛B的手册里没有的东西以致于让自己不断的深入学习
其实是完全错误的,只要是PHP开发的,管它什么函数,什么类,什么框架
最终实现起来就是那些手册里最基本的PHP函数,只不过,人家玩的是编程思想,换个写法而已
所以,看别人的程序,只要看函数就行了,其他的没啥!除了PHP其他还有更多需要学习的东西
不管什么PHP程序,好像几年后不完全重写的很少,生命周期和学习开发成本太高了
所以个人站长做站,就不要去考虑什么可维护,什么可扩展,什么健壮,都是些不切实际的东西
只要跑起来快,实现了你想做的东西就行了,管它代码再难看,谁管它
只要流量大了,用户喜欢了,赚钱了,花点小钱,你爱咋整就咋整,而且还不用自己动手,这样的例子见得还少吗?
从实际我的应用中来看,给我赚钱最多的,是我用最少的时间,写得最垃圾的程序
花最多时间,写得最“牛B”的程序,反而是赚得最少的
完全是成反比的
技术仅仅是工具,不要被工具玩了
比程序开发重要的还有如下这些
1. 网站内容,结构,易用性,分析
2. 流量分析
3. SEO
4. 联盟
引用许三多的话:“做有意义的事!”
模仿百度你丫弄个SOSO
模仿新浪你丫整个空间
模仿雅虎你丫开通邮箱
模仿迅雷你丫整个旋风
模仿淘宝你丫开启拍拍
模仿跑跑你丫出QQ飞车
模仿泡泡你丫出个QQ堂
模仿163你丫出个相册
模仿UC你丫整个QQTalk
模仿我秀你丫开了个QQ播客
模仿起点你丫出个QQ图书
模仿支付宝你丫又来财富通
模仿联众你丫出了QQ游戏
模仿浩方你丫整了QQ对战平台
模仿CS你丫出了穿越火线
模仿劲舞团你丫又开始整QQ旋舞
模仿MSN你丫整个正在输入的状态
模仿智能ABC你丫弄QQ输入法
走别人的路,让别人无路可走————————老马座右铭
nohup: 忽略输入并把输出追加到"nohup.out"
#tail -f nohup.out
最早知道 " 星际译王" 这个程序,还是王垠的那篇《完全用linux工作》中知道的,以前一直是在FreeBSD系统上使用,安装也非常方便,直接ports就行了 :)
她非常精巧,可扩展的字典库和附录,以及可选安装的真人发声(比金山词霸发音标准多了!),这里所指的安装,只不过是解压复制而已
而且还是开源的,支持Linux,FreeBSD,Solaris,Win32
真是个好东西,别再为 金山词霸 的序列号发愁了~~~
OK,我们现在开始
一、在http://stardict.sourceforge.net/index.php下载以下3个文件
1、gtk-runtime-2.4.13-rev-a.exe (GTK 程序库)
2、stardict-2.4.4.exe (星际译王 程序)
3、WyabdcRealPeopleTTS.tar.bz2 (发声档案)
二、在http://stardict.sourceforge.net/Dictionaries.php下载所需的词典文件
比如我下载了:
stardict-cdict-gb-2.4.2.tar.bz2
stardict-kdic-computer-gb-2.4.2.tar.bz2
stardict-kdic-ec-11w-2.4.2.tar.bz2
stardict-langdao-ce-gb-2.4.2.tar.bz2
stardict-langdao-ec-gb-2.4.2.tar.bz2
stardict-oxford-gb-2.4.2.tar.bz2
stardict-powerword2007_pwqec-2.4.2.tar.bz2
stardict-xdict-ce-gb-2.4.2.tar.bz2
stardict-xdict-ec-gb-2.4.2.tar.bz2
在http://stardict.sourceforge.net/TreeDictionaries.php 下载附录资料
stardict-treedict-infoBrowse-zh_CN-2.4.2.tar.bz2
安装过程:
首先安装GTK运行环境,即先安装 gtk-runtime-2.4.13-rev-a.exe
安装星际译王主程序
安装WyabdcRealPeopleTTS.tar.bz2 (发声档案)
解压缩文件(过程有点漫长,慢慢等 :) )后将其放入星际译王安装目录下,即 ..\StarDict 下
安装字典文件
将字典文件解压后放入安装目录下的dic目录内即可,即..\StarDict\dic 内
安装附录文件
将附录文件stardict-treedict-infoBrowse-zh_CN-2.4.2.tar.bz2解压缩后得到的3个文件
infoBrowse-zh_CN.dict.dz
infoBrowse-zh_CN.ifo
infoBrowse-zh_CN.tdx
放入安装目录下的treedict目录内即可,即 ..\StarDict\treedict 内
安装即完成,启动星际译王,敬请的使用吧~~ :)
1、 数据库为 gtk_php
create table code_news
(
id int(9) not null default 0 auto_increment,
title char(255) not null,
author char(30) not null,
author_contact char(75) not null,
news text,
PRIMARY KEY (id),
UNIQUE ID (id)
);
2 、GTK 程序部分,用于图形化管理新闻 - admin.php
CODE:
[Copy to clipboard]
#!/usr/local/bin/php -q
<?
if(strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
dl('php_gtk.dll');
else
dl('php_gtk.so');
function destroy()
{
Gtk::main_quit();
}
function handle_select($clist,$row,$column,$event)
{
global $ret, $entry, $SELECTED_ID;
$id = $clist->get_text($row,0);
$SELECTED_ID = $id;
}
function add_record()
{
global $entry, $SELECTED_ID, $fields, $API_URL, $USERNAME, $PASSWORD;
while(list($f,$l) = each($fields))
{
$$f = $entry[$f]->get_text();
}
$news = $entry['news']->get_chars(0,$entry['news']->get_length());
$file = $API_URL.'?a=add&p='.$PASSWORD.'&u='.$USERNAME.
'&news[title]='.urlencode($title).'&news[author]='.urlencode($author).
'&news[author_contact]='.urlencode($author_contact).
'&news[news]='.urlencode($news);
$fp = fopen($file,'r');
if($fp)
{
$contents = trim(fread($fp,4096));
if(!eregi("^0:[A-Z]*",$contents))
{
clear_entries();
update_clist();
}
else
{
echo "n$contentsn";
}
}
reset($fields);
}
function delete_record()
{
global $entry, $SELECTED_ID, $USERNAME, $PASSWORD, $API_URL;
$file = $API_URL.'?u='.$USERNAME.'&p='.$PASSWORD.'&a=del&id='.$SELECTED_ID;
$fp = fopen($file,'r');
if($fp)
{
$contents = trim(fread($fp,4096));
if(!eregi("^0:[A-Z]*",$contents))
{
update_clist();
}
else
{
echo "n$contentsn";
}
}
}
function update_record()
{
global $entry, $SELECTED_ID;
echo "n************************* NOT IMPLEMENTED *************************n";
echo "nUPDATE RECORD : $SELECTED_IDn";
echo "n************************* NOT IMPLEMENTED *************************n";
}
function update_clist()
{
global $clist, $API_URL, $PASSWORD, $USERNAME, $ret;
// Grab everything from our API
$fp = fopen($API_URL.'?a=get&p='.$PASSWORD.'&u='.$USERNAME,'r');
if($fp)
{
$contents = fread($fp,4096);
if(!ereg("^0:[A-Z]*",$contents))
{
$clist->clear();
$ret = unserialize(trim($contents));
$clist->freeze();
while(list($id,$info) = each($ret))
{
// $info = $ret[$i];
$row = array($info['id'],$info['author'],$info['title']);
$clist->append($row);
}
$clist->thaw();
}
else
{
echo "nERROR: ".$contents."n";
}
}
}
function clear_entries()
{
global $entry;
$entry['title']->set_text('');
$entry['author']->set_text('');
$entry['author_contact']->set_text('');
// echo $entry['news']->get_text();
// $foo = $entry['news']->get_chars(0,$entry['news']->get_length());
// echo "n".$foo."n";
$entry['news']->backward_delete($entry['news']->get_length());
}
function delete_event()
{
return false;
}
$window = &new GtkWindow();
$window->connect('destroy','destroy');
$window->set_border_width(10);
$box = &new GtkVBox();
$window->add($box);
$box->show();
$fields = array(
title => 'Title: ',
author => 'Author: ',
author_contact => 'Author Contact: ');
// Set up our regular text fields
while(list($f,$l) = each($fields))
{
$vbox = &new GtkVBox();
$box->pack_start($vbox,false,false);
$vbox->show();
$vbox->set_border_width(3);
$hbox = &new GtkHBox();
$vbox->pack_start($hbox,false,false);
$hbox->show();
$label = &new GtkLabel("$l");
$label->set_usize(150,10);
$hbox->pack_start($label,false);
$label->show();
$entry[$f] = &new GtkEntry();
$hbox->pack_start($entry[$f],false);
$entry[$f]->show();
}
$vbox = &new GtkVBox();
$box->pack_start($vbox,false,false);
$vbox->show();
$vbox->set_border_width(3);
$label = &new GtkLabel('News:');
$vbox->pack_start($label);
$label->show();
$entry['news'] = &new GtkText();
$entry['news']->set_editable(TRUE);
$vbox->pack_start($entry['news']);
$entry['news']->show();
$buttons = array(
Add => 'add_record',
Delete => 'delete_record',
Update => 'update_record',
Clear => 'clear_entries',
Refresh => 'update_clist',
Quit => 'destroy');
$hbox = &new GtkHBox();
$hbox->set_border_width(3);
$vbox->pack_start($hbox,false,false);
$hbox->show();
while(list($l,$f) = each($buttons))
{
$button = &new GtkButton($l);
$button->connect('clicked',$f);
$hbox->pack_start($button);
$button->show();
}
$scrolled_win = &new GtkScrolledWindow();
$scrolled_win->set_border_width(5);
$scrolled_win->set_policy(GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
$titles = array('ID','Author','Title');
$clist = &new GtkClist(sizeof($titles),$titles);
$scrolled_win->add($clist);
$clist->show();
$USERNAME = md5('joestump');
$PASSWORD = md5('phpgtk');
$API_URL = 'http://127.0.0.1/gtk/news_api/api.php';
// Grab everything from our API
update_clist();
$clist->set_usize(400,300);
$clist->connect('select-row','handle_select');
$auto_resize = array(0,1);
for($i = 0 ; $i < sizeof($auto_resize) ; ++$i)
$clist->set_column_auto_resize($auto_resize[$i],true);
$vbox->pack_start($scrolled_win);
$scrolled_win->show();
$window->show_all();
Gtk::main();
?>
3、 用于执行管理程序,向数据库加入数据的代码 api.php
<?
// Change username and password accordingly
$link = mysql_connect('192.168.192.47','root','')
or die('0:DB ERROR');
mysql_select_db('gtk_php',$link) or die('0:DB ERROR');
// Create a username and password to protect the
// API from outside people. THIS IS VERY IMPORTANT!
$USERNAME = md5('joestump');
$PASSWORD = md5('phpgtk');
switch($a)
{
case 'add':
// Make sure we are getting the 4 fields
// we want
if(sizeof($news) == 4)
{
// Check the given username and password against
// the ones we have - $p and $u are md5()'d in the
// GTK app and then sent along so no one can easily
// decrypt them.
if($p == $PASSWORD && $u == $USERNAME)
{
// extract($news);
while(list($key,$val) = each($news))
$$key = addslashes($val);
$sql = "INSERT INTO code_news
(title,author,author_contact,news)
VALUES
('$title','$author','$author_contact','$news')";
$r = mysql_query($sql);
if($r)
{
if(mysql_affected_rows($r))
echo '1:SUCCESS';
else
echo '0:FAILURE';
}
}
else
{
echo '0:BAD PASSWORD';
}
}
else
{
echo '0:BAD INFO ARRAY';
}
break;
case 'get':
if($p == $PASSWORD && $u == $USERNAME)
{
$sql = "SELECT * FROM code_news";
$r = mysql_query($sql);
if(@mysql_num_rows($r))
{
while($row = mysql_fetch_assoc($r))
$ret[$row['id']] = $row;
echo serialize($ret);
}
else
{
echo '0:NO RECORDS';
}
}
break;
case 'del':
if($id)
{
if($p == $PASSWORD && $u == $USERNAME)
{
$sql = "SELECT * FROM code_news WHERE id='$id'";
$r = mysql_query($sql);
if(@mysql_num_rows($r))
{
$sql = "DELETE FROM code_news WHERE id='$id'";
$r = mysql_query($sql);
include('http://'.$SERVER_NAME.$PHP_SELF.'?u='.$USERNAME.'&p='.$PASSWORD.'&a=get');
}
else
{
echo '0:ID NOT ON RECORD';
}
}
}
else
{
echo '0:NO ID GIVEN';
}
break;
default:
echo '0:UNRECOGNIZED ACCESS';
}
?>
4 、显示新闻 不用多说了- news.php
<?
// Change username and password accordingly
$link = mysql_connect('192.168.192.47','root','')
or die('0:DB ERROR');
mysql_select_db('gtk_php',$link) or die('0:DB ERROR');
$sql = "SELECT * FROM code_news";
$r = mysql_query($sql);
if(@mysql_num_rows($r))
{
while($row = mysql_fetch_array($r))
{
extract($row);
echo '<b>'.$title.'</b>
';
if(ereg("@",$author_contact))
$href = 'mailto:'.$author_contact;
else
$href = $author_contact;
echo 'Posted By: <a href="'.$href.'">'.$author.'</a>
';
echo $news.'<hr>';
}
}
else
{
echo 'NO NEWS!';
}
?>
/*
A little sample script that takes SQL query from user, sends it to the MySQL server and
displays the result of query in new window.
DON'T FORGET TO CHANGE SERVER, USERNAME AND PASSWORD IN MYSQL_PCONNECT FUNCTION!!
I'll be glad for any comments.
Adam Rambousek - rambousek@volny.cz
*/
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
dl('php_gtk.dll');
else
dl('php_gtk.so');
$windows = array();
function delete_event($window, $event)
{
$window->hide();
return true;
}
function close_window($widget)
{
$window = $widget->get_toplevel();
$window->hide();
}
/*
Called when clist column is clicked. It sets sorting by the clicked column.
*/
function clist_click_column($clist, $column) {
$clist->set_sort_column($column);
$clist->sort();
}
/*
Function displaying the result of query.
*/
function do_query($query)
{
global $windows;
//if the query_window is opened, let's close it
if (isset($windows['query_window'])) {
close_window($windows['query_window']);
}
$window = &new GtkWindow;
$windows['query_window'] = $window;
$window->set_name('query_window');
$window->connect('delete-event', 'delete_event');
$window->set_policy(false, true,false);
$window->set_title('Query result');
$window->set_uposition(220,85);
$box1 = &new GtkVBox();
$window->add($box1);
//frame displaying entered sql query
$frame = &new GtkFrame('MySQL Query');
$box1->pack_start($frame,false);
$label = &new GtkLabel($query->get_text());
$frame->add($label);
//frame displaying clist with the query result
$frame = &new GtkFrame('MySQL Query Result');
$box1->pack_start($frame,true);
//we'll display the result with scrollbars
$scrolled_win = &new GtkScrolledWindow();
$scrolled_win->set_border_width(5);
$scrolled_win->set_policy(GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
$frame->add($scrolled_win);
/*here we deal with the result
if mysql_query called with the query entered in main window, return a result
we can display clist
*/
if ($result = mysql_query($query->get_text())) {
/*
at first, keys array contains the names of columns
*/
if ($data = mysql_fetch_array($result)) {
$i=0;
$keys = array();
while (list($key,$val) = each($data)) {
if ($i%2) $keys[]=$key;
$i++;
}
}
/*
now we can prepare the clist, keys are the titles of columns and the number
of columns is equal to the number of keys
*/
$clist = &new GtkCList(count($keys), $keys);
$clist->connect('click_column', 'clist_click_column');
//we sets the auto_resize for each column
for ($i=0;$i<count($keys);$i++) $clist->set_column_auto_resize($i, true);
$scrolled_win->add($clist);
/*
now the data from result
we get the data from each row to row_data array and then we append this
array to the clist as a new row
*/
do {
for($i=0; $i < count($data)/2; $i++){
$row_data[$i] = $data[$i];
}
$clist->append($row_data);
} while ($data = mysql_fetch_array($result));
}
$button = &new GtkButton('close window');
$button->connect('clicked', 'close_window');
$box1->pack_start($button,false);
$button->set_flags(GTK_CAN_DEFAULT);
$button->grab_default();
$window->show_all();
}
function main_window()
{
$window = &new GtkWindow();
$window->set_policy(false,true,false);
$window->set_name('main_window');
$window->set_title('MySQL Query sample');
$window->set_uposition(80,80);
$window->connect_object('destroy', array('gtk', 'main_quit'));
$window->connect_object('delete-event', array('gtk', 'false'));
$box1 = &new GtkVBox();
$window->add($box1);
$frame = &new GtkFrame('MySQL Query');
$box1->pack_start($frame,false);
$entry = &new GtkEntry();
$frame->add($entry);
$separator = &new GtkHSeparator();
$box1->pack_start($separator,false);
$button = &new GtkButton('Do Query');
$button->connect_object('clicked', 'do_query',$entry);
$box1->add($button);
$separator = &new GtkHSeparator();
$box1->pack_start($separator,false);
$button = &new GtkButton('Quit');
$button->connect_object('clicked', array('gtk', 'main_quit'));
$box1->add($button);
$window->show_all();
}
mysql_pconnect("SERVER","USERNAME","PASSWORD") or die("can't connect to server");
main_window();
Gtk::main();
?>
if (!class_exists('gtk')) {
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
dl('php_gtk.dll');
else
dl('php_gtk.so');
}
function destroy() {
Gtk::main_quit();
}
$window = &new GtkWindow();
$window->set_title("MySQL Manager");
$window->set_usize(300,300);
$window->connect('destroy', 'destroy');
$window->set_border_width(10);
$table=&new gtktable(5,3);
$window->add($table);
//add text boxes, button, and label
$usertext=&new gtklabel();
$usertext->set_text("Username:");
$table->attach($usertext,1,2,1,2);
$user=&new gtkentry();
$table->attach($user,2,3,1,2);
$passtext=&new gtklabel();
$passtext->set_text("Password:");
$table->attach($passtext,1,2,2,3);
$pass=&new gtkentry();
$table->attach($pass,2,3,2,3);
$sertext=&new gtklabel();
$sertext->set_text("Server:");
$table->attach($sertext,1,2,3,4);
$server=&new gtkentry();
$table->attach($server,2,3,3,4);
$conb=&new gtkbutton("Connect!");
$conb->connect('clicked','mconnect');
$table->attach($conb,1,3,4,5);
function put($what,$where) {
$where->set_text($what);
}
function mconnect() {
global $window,$pass,$user,$server;
$pass=$pass->get_text();
$user=$user->get_text();
$server=$server->get_text();
$conn=mysql_connect($server,$user,$pass);
mysql_select_db("simtown");
$q="select * from users";
while ($row=mysql_query($q)) {
print $row[0];
}
mysql_close($conn);
}
$window->show_all();
Gtk::main();
?>
发信站: BBS 水木清华站 (Tue Mar 11 10:30:27 2008), 站内
招聘职位 :C/C++软件工程师
招聘人数 : 7人
工作地点 :北京
职位描述 :Linux平台下的手机软件开发
职位要求 :
l 本科(2年以上工作经验)及硕士以上学历
l 精通C/C++语言编程,有扎实的编程功底和丰富的编程经验
l 掌握GTK+或QT开发,掌握GTK+者优先
l 熟悉嵌入式Linux,具有丰富开发经验
l 有输入法框架开发经验者优先
l 有模式识别、图象处理背景者优先
l 具有较强的团队精神,学习能力较强,能吃苦耐劳
l 较强的英语能力
应聘简历 投递地址:yan5.wang@samsung.com (请注明应聘职位)
简历接收 截止期限:2008年06月01日
官方没有出台正式方案之前,暂时先用这个(学习中,高手有更好的解决方案请跟贴):
在php.ini的[PHP-GTK]部分
加入php-gtk.codepage = gb2312 ;将php格式保存为ansi格式
php-gtk.codepage = uft-8 ;将php格式保存为utf8格式
在你创建的窗口时
$window = &new GtkWindow();
$window->style->font =
gdk::font_load("-unknown-宋体-normal-r-normal-*-*-120-*-*-p-*-gb2132-0");
这里调用gdk::font_load函数载入字体,注意是“GDK”,不是“GTK”
(顺便抗议一下,程序一长,居然自动截断掉,只好这样写了)
2、我的PHP-GTK程序为什么那么单调,而演示程序确有颜色?
首先要感谢hisunweb大师的耐心指导,本文才得以完成。
文章的开始,我要更正一下上次的笔误(没有人有意见吧 )
gdk::font_load("-unknown-simsun-normal-r-normal-*-*-120-96-96-p-*-gb2312-0");
同时,本文将给出中文化的更好的方法:
(1)、将PHP.INI中的[PHP-GTK]模块下
php-gtk.codepage = "gb2312"
(2)、在原PHP-GTK程序目录下新建mygtkrc文件,内容如下:
style "defaultfont"
{
font = "-unknown-simsun-normal-r-normal-*-*-120-96-96-p-*-gb2312-0"
}
class "GtkWidget" style "defaultfont"
(3)、在你的PHP-GTK程序的Gtk::main();之前加入
Gtk::rc_parse(dirname($argv[0]).'/mygtkrc');
现在你的PHP-GTK能够很顺利的现实中文了。
上面是开胃菜,下面开始重点:大家都看到了,我们在上面新建了一个文件(名字自己爱怎么写就怎么写,以下简称资源文件),这个文件有点类似HTML的 CSS样式,能够对PHP-GTK程序的风格进行解析,如字体、颜色等。如果我们需要鼠标移动到按钮上时,按钮显示颜色,可以在你的资源文件中这样定义:
style 'button_list' = 'button'
{
bg[PRELIGHT] = { 0, 0.75, 0x00 }
}
widget "main window.*GtkScrolledWindow.*GtkButton*" style "button_list"
同时,在你的程序中,我们要这样定义一个标志“main window”,就有点像HTML中的ID
$window = &new GtkWindow();
$window->set_name('main window');
这样一来,你的GtkScrolledWindow下的GtkButton鼠标经过时都有颜色,详见附带gtk.php程序。
资源文件如何定义了?我们前只有这些信息:
如假如一行
widget "main window.*GtkButton*" style "main_button"
该定义把"主窗口"中的所有按钮构件设置为资源文件中定义的"main_buttons"风格。
有几个指令用于改变一个构件的属性。
fg - 设置构件的背景色。
bg - 设置构件的前景色。
bg_pixmap - 设置构件的背景为一幅像素图。
font - 设置构件使用的字体。
另外,一个构件可以有几种状态,你可以为每种状态设置不同的颜色,图像和字体。这些状态是:
NORMAL - 构件的一般状态,如鼠标不位于构件上方,键未按下时构件所处的状态。
PRELIGHT - 当鼠标移到构件上方,在此状态下定义的颜色生效。
ACTIVE - 当处于构件上的鼠标键被按下或点击时,该构件被激活,相应的属性值将生效。
INSENSITIVE - 当构件被设置为不敏感(insensitive)时,它不能被激活,相应属性值起作用。
SELECTED - 选中一个对象时,取相应的属性值。
当用"fg"和"bg"关键字设置构件的颜色时,其格式是:
fg[<STATE>] = { Red, Green, Blue }
这里STATE是前述状态(PRELIGHT,ACTIVE,...)之一,Red,Green,Blue是范围0-1.0间的数值, {1.0,1.0,1.0}表示白色。这些数值必须是浮点型的,否则将被存为0,因此写为"1"的数值是无效的,应写为"1.0".0值写为"0"却不错,因为即使系统认不出也没关系。所有系统不认识的数值都会被设为0。
bg_pixmap除了用一个文件名取代颜色名外和以上格式很相似。
pixmap_path是一个由‘:’分隔开的路径表。当搜索你定义的图像文件时选择这些路径。
最后,可能你对font的定义很感兴趣,我把定义方法转过来,原汁原味,就不翻译啦~~(每一行对应一个参数)
foundry xxx (where the font was created. 'unknown' is okay)
family xxx (e.g. Arial)
weight xxx (e.g. bold, medium)
slant x (r - roman, i = italic, o = oblique)
setwidth xxx (e.g. normal, condensed)
addedstyle xxx (e.g. serif, sans. Leave blank for none)
pixelsize N (set either this or pointsize, not both)
pointsize N (point size, e.g. 120)
resx N (x res the font was created for, in dots per inch)
resy N (y res the font was created for, in dots per inch)
space x (m = monospaced, p = proportional, c = cell)
averagewidth N (average character width in pixels. 0 if unknown)
registry xxx (e.g. utf, iso8859 or adobe)
encoding xxx (e.g. 1 or 2 (for iso8859) or fontspecific)
例如:$font = gdk::font_load('-unknown-Arial-normal-r-normal--*-120-96-96-p-0-iso8859-1');
3、PHP-GTK的相关资源
作者:Verdana
http://kromann.info/php4-gtk.php
这里有从 CVS 源码编译的 php-gtk 的版本,每天更新
类似 php snaps, 不过容易出问题。
还有 php5 的 gtk 版本。
http://www.cweiske.de/phpgtk.htm
德国网站,但内容是英文的,很容易看懂
提供了 PHP-GTK AppWizard 下载
非常不错的软件,帮你自动生成 PHP GTK 程序,不需要写一行
代码,哈哈哈
提供 PHP-Themes 下载,非常漂亮啊~
http://www.cweiske.de/phpgtk_themes.htm
如果没有看上眼的也可以自己定制 :P
另外学 GTK 的话,就必须要提一下 winGlade ,呵呵~
一个 GUI 的 GTK 界面设计器。类似 VC 设计窗体一样
可以把控件拖来拖去,修改属性。
生成的是 xml 文件。
这里 http://wingtk.sourceforge.net/ 下载
4、AppWizard 确实很好,但是不能使用中文目录/文件,咋办咧^_^?
(1)、在同一目录下新建资源文件mygtkrc,内容如下:
style "defaultfont"
{
font = "-unknown-simsun-normal-r-normal-*-*-120-96-96-p-*-gb2312-0"
}
class "GtkWidget" style "defaultfont"
(2)、源程序解压后,appwizard.php-gtk的349行,也就是GTK::main();的前面一行加入:
Gtk::rc_parse(dirname($argv[0]).'/mygtkrc');
(3)、保存后,支持中文目录/文件名。第一次启动,需要等待一定的时间,俺的机器好像用了将近2分钟,不要认为是死机,值得等待。
以后遇到相同的中文问题,可以先尝试用上面的方法。
祝大家玩得开心,村民们有什么PHP-GTK的咚咚,全部贡献出来吧,人民会记住你的(村棍除外)。
注意:AppWizard第一次运行,不能放在带有中文的路径目录中,否则很可能会出错。
6、如何修改默认的PHP-GTK风格,比如我比较喜欢MAC风格?
将资源文件改名为“.gtkrc”,注意,前面有点号,这个过程可以通过DOS窗口实现(作者是这么说的),把它放到C:Documents and Settings{你的用户名}.gtkrc
例如有个文件内容如下
style "default"
{
bg[NORMAL] = "#ededed"
bg[PRELIGHT] = "#8db6cd"
bg[ACTIVE] = "#bababa"
bg[INSENSITIVE] = "#ededed"
bg[SELECTED] = "#8db6cd"
fg[NORMAL] = "#000000"
fg[PRELIGHT] = "#000000"
fg[ACTIVE] = "#000000"
fg[INSENSITIVE] = "#bababa"
fg[SELECTED] = "#000000"
engine "engradient"
{
use_gradient = TRUE
handlebox_marks = TRUE
scrollbar_marks = TRUE
}
}
widget "*" style "default"
style "tooltip"
{
bg[NORMAL] = "#ffffff"
}
widget "*gtk-tooltip*" style "tooltip"
将它改名.gtkrc,再放到:
C:Documents and Settings开心果目录下,以后你运行的PHP-GTK程序都是用这个风格。
当然,你必须拥有相应的风格库文件,否则只能显示主题颜色,框架不变,并提示找不到库文件。如果仅仅需要颜色主题,请把这一段删掉:
engine "engradient"
{
use_gradient = TRUE
handlebox_marks = TRUE
scrollbar_marks = TRUE
}
顺便提一句,AppWizard不能够生成我们所想要得PHP-GTK程序,它仅仅是个测试(JUST A TEST,作者又是这么说的),而且生成的代码垃圾一堆,继续寻找传说中的法宝~~
还有就是,PHP-GTK程序,得到ZEND的编码支持,也就是说,ZEND编译后PHP-GTK依然能够执行。
在此我谨代表一名山东学子,为八十万山东考生感到深切的惋惜与遗憾,曾经的我们,现在的你们,一年又一年,受伤的总是山东人!看看青海的1批理科线,438,这意味着什么?同一个大学里的山东学子平均要比青海的高出150分,这已经是语数外单科的总分了,想到这里,真的不知道该说什么
抱不平,有用吗?努力换来的是什么?遥遥无期的等待,只是盼望一次公平竞争的机会,仅此而已,然而却得不到。被认为死读书高分低能的山东人,也许只能在这样的事实面前,泪流心底。无语,真的无语
附:
文科1批 理科1批 文科2批 理科2批
山东 584分 582分 567分 557分
湖南 581分 536分 537分 482分
重庆 576分 544分 510分 488分
黑龙江569分 577分 504分 508分
贵州 566分 521分 503分 468分
吉林 565分 569分 497分 493分
甘肃 560分 558分 501分 507分
河南 557分 563分 513分 517分
陕西 557分 527分 520分 490分
安徽 553分 563分 513分 507分
浙江 550分 550分 516分 504分
云南 550分 530分 510分 475分
福建 547分 534分 487分 471分
山西 545分 546分 510分 511分
内蒙古543分 548分 502分 497分
辽宁 538分 515分 470分 433分
河北 537分 552分 503分 514分
湖北 532分 548分 508分 516分
宁夏 532分 498分 488分 457分
广西 528分 501分 470分 440分
天津 523分 522分 483分 466分
江西 520分 512分 487分 461分
北京 515分 502分 472分 455分
青海 490分 438分 425分 388分
江苏 330分 330分 300分 300分 (江苏实行课改,总分440)
朋友!你想戒掉网瘾吗?你想从沉迷的网游世界挣脱吗?
如果你想,那么,装中央民族大学校园网吧!
你的孩子沉迷网游无法认真学习吗?装中央民族大学校园网吧!
中央民族大学承诺,24小时质量保证让你的孩子无法正常游戏。强大的技术支持,保证让你的孩子5分钟掉一次线,练级、副本、任务、PK,一个都别想要。绝对让你体会宽带的价格,拨号的享受。
下面是对用户王同学的调查:
问:你觉得中央民族大学校园网好吗?
王:太好了!
问:为什么这么觉得呢?
王:现在我的已经从网游中彻底摆脱了。
问:效果这么好?
王:是啊,现在我一看到电脑就会吐,一看见网游的广告就会休克。
问:哇……了不起啊!
王:是啊,是啊!中央民族大学校园网让我从虚拟世界走了出来。不仅如此,我还越来越喜欢和家长交流。
问:为什么呢?
王:说话不会掉线。不会说着说着人就消失,让我很有存在感。
朋友!看到这里你还犹豫什么?拨打电话给我们吧!中央民族大学校园网,真正为用户着想!我们深知免费咨询会伤害用户的消费心理,让您的自尊受到伤害!所以,我们顶住社会压力,开放收费电话咨询!为了满足你奢侈的消费欲望,我们一直在努力!
中央民族大学的承诺:没有最慢,只有更慢!
中央民族大学的保证:没有掉线,只有无法连接