【转】wxPython评估笔记

wxPython评估笔记

|  | 评论(4)

最近写的一点笔记,留作备忘。

================================================================

wxPython(1)wxWidgets

新开张的一个项目需要同时支持Windows和Linux的图形界面,以及内里对复杂XML的处理。又需要去寻找solution了。XML的处理简单,交给Perl去做,Perl的hash结构和simple xml模块足够快速打败这个任务。而且Perl程序也可以很方便地打包(linux上用pp,Windows上用ActivePerl)成可移植二进制包。而GUI的跨平台设计,简单的考虑,有三个可能方向:

QT - 在Linux可用QT Designer,WYSIWYG的设计界面很方便。Windows上不详。但是QT的license对商业应用有限制 
Java - 人人都知道它跨平台,我们之前开发GUI也都一向用控件集合SWT+文档视图类JFace,不过这玩意的开发效率和运行效率都真的不咋地 
wxWidgets - 最近几年比较热门的一个C++图形库,本质上用本地控件,在不同平台上效果会和本地主题一致,图形库在Linux上是基于GTK的,Windows上基于Windows Platform SDK。形式上它和MFC框架很像,用过MFC的人多半都能很快进入状况。

我以前MFC玩得多了,Qt和Java也都有所了解也都不太满意,那么首先拿wxWidgets体验下,需要关注的是安装、快速开发、打包

Windows安装

首先需要一个本地C++编译器。当然可以装MinGW之类的编译器,我懒得搞了,装了个Visual Studio.NET 2003,比较老的版本了。其实微软网站上现在Visual Studio.NET C++ 2008 express是免费下载的,但我不确定那个免费的包里头有没有Wind32 Platform SDK,也许需要另外装SDK。总之装好之后把nmake所在目录加到Windows系路径,把Platform SDK目录加到系统库路径后面就方便了。

然后下载wxWidgets安装。下载的其实是源代码2.8.9版本,需要编译成本地*.o文件,这个还满费时间的。具体编译过程看readme就好,需要注意的是要选择语言格式和后台图形库支持,我选的是UNICODE和gtk2。建议选这两个,因为是主流。

现在就可以用了。找几个例子程序(源代码包里面有的)来编译下,如果有问题,多半都是因为库的路径等原因,稍微调整一下就好。

Linux安装

这个就方便了,现成用g++编译。同样要注意选UNICODE编译选项。

快速开发

很多geek是看不上快速开发工具滴。。。我也同意快速开发工具(RAD tool)并不是那么重要,因为很多稍微复杂一点的界面操作都是快速开发工具做不了的,还是得写代码。但是当你对一个库里头有些什么控件都没概念的时候,一个好的快速开发环境能让你省很多翻书翻手册的时间。很不幸,我试验过了wxDev-C++和wxGlade,前者在我机器上极端不稳定,后者只支持 sizer方式定位控件。

Java 比较熟悉的同志可以把wxWidgets的sizer类类比成Java的container类,对于只玩过MFC的同志们可能有点陌生。简单说,以前 Visual Studio里头,把一个控件拉到dialog后,生成的代码或者资源文件里控件的位置和大小是用(x,y)绝对值来表示的;这个思维很直接,不需要解释。wxWidgets觉得这样不好,当整个窗口被拉大的时候,控件就全挤左上角了,不好看,所以发明了sizer类动态管理控件的位置。 wxWidgets中有很多sizer类,sizer类可以套sizer类或者控件。很像那个装在盒子里的人。。。不过,写HTML写得多的人(这个,很多人折腾过自己blog的模板吧)应该能理解,HTML里面定位不就是用表格和frame嵌套的方式套来套去达到在不同的分辨率下都可以看么,就是太麻烦了。--当然wxWidgets还是支持绝对定位方法的,找不到快速

打包

我没找到合适的打包工具,虽然说编译的是本地可执行代码,可是我得手工把一些wxWidgets的库拉出来才能脱离开发环境运行。麻烦。。。

考虑到用C++开发还需要处理异常,忒麻烦,退缩了,想其它办法去

 

资料

网上很容易找到《Cross-Platform GUI Programming with wxWidgets》和它的中文版本《使用wxWidgets进行跨平台程序开发.pdf》,看起来用它的人还真不少。这本书再加wxWidgets自带的帮助和例子程序,基本上就够用了。

 

================================================================

wxPython(2)Python

前文说到,直接用wxWidgets还是很麻烦的,调查了一下,基于wxWidgets,有很多wrapper,例如wxPerl, wxPython, wxRuby,分别是用Perl/Python/Ruby来包装C++的wxWidgets。先去调查了一下wxPerl,开发度很差,人气很比较差,现在基本是停滞状态。wxRuby是新事物,人气满旺但开发度不够。wxPython大家都认为已经做得不错了。到SourceForge上搜了一圈,发现 Linux上的某BT软件,还有我以前用过的本地blog编辑工具zoundry,都是用wxPython做的,这两个用户量都不小。另外,Zoundry现在开源了,用CVS软件(在windows上可以用TortoiseCVS,Linux自带svn)下载了源代码运行起来,界面很酷。

那么先花几个小时学一下Python。这个脚本语言的语法和支持对象的VB有点像,习惯了C++/Java/Perl这种“类C”语言的人难免刚开始有点皱眉头,但是其实习惯了它的逻辑就好:例如说用空白正确缩进在Python里很重要,重要到了关系程序能不能正确和正常运行的程度;例如说它的函数没有明显的结尾,没有花括号结尾也没有return也可以;变量名没法像perl的use strict一样强制预先定义。

因为要处理XML,考察了一下Python的XML处理。像我这样被perl庞大而且强大的开发者代码共享社区的CPAN宠坏了的人发现Python没有一个好用的开发者社区的时候还是满震惊的。花了不少时间在搜索引擎上才明白ActiveCode上Python的代码比较多,但是也是在找了几个版本之后才找到一个好用的,和Perl的XML::Simple用法相当的XML2Obj模块。

用 XML2Obj读的XML文件到内存以后,是一个嵌套的dictionary,这种结构相当于Perl的hash, 但是,真难用啊,居然没有Data::Dumper模块可以把这个dictionary给打印出来,还得在XML2Obj里面写一个 xmlTree2String( )函数。

有一本叫《A byte of Python》的书,里面有一节叫“Why not Perl?” ,是打击Perl的,理由是用perl开发大型程序很困难--这个人明显没有好好用Perl的面向对象特性的,我们做的Perl程序都相当复杂了,照样组织得好好的。但就是他,也不得不承认Perl的CPAN社区太强大了,希望能够把Perl的模块转到Python上。我很奇怪为啥没有人来组织一个类似的社区网站。

最后,基本上我觉得学计算机语言没啥好说的,看看语法,安装开发环境跑几个例子就好。Python的电子书很容易找到,在这个网站www.pythonid.com里面直接能下载到很多,我就是花了几个小时随便看了两三本,发现网上有人比我还激进,号称十分钟可以学会Python,:-)

参考链接

华蟒用户新闻组 http://groups.google.com/group/python-cn

Python news group http://groups.google.com/group/python

以上两个新闻组的地址是用来搜索的,要发言还得设置outlook express用NNTP协议连新闻服务器。

 

================================================================

wxPython(3)wxPython

对Python语法和面向对象方式稍有了解就可以来玩wxPython了。下载wxPython安装。我在Windows上下载的是runtime binaries, 在Windows XP上安装运行没有任何问题。但是在Linux上只有源代码可以选择,编译的时候出问题了(我的wxWidgets版本是2.8.9),某个类缺少一个 CreateBitmap()方法。看了一下,似乎只是一个wrap而已,自己加一个空的CreateBitmap()就好?搜索一下,果然有人给出了patch,和我想的一样。

Python下使用wxWidgets编程,不二的教程就是《wxPython in Action》,虽然这本书已经有了中文版,但是500多页16开读起来也不是那么容易的,我的办法是直接运行和阅读源代码,可以急速读完:D

使用wxPython的开源项目很多,用wxPython做关键词在google code或者sourceforge上一搜一大把项目,其实我前面推荐的zoundry是很复杂的项目,推荐一个litebook,比较简单易学。另外,豆瓣网是全用python开发的,而网上能搜到的一些豆瓣插件也往往是用python写的,例如“豆瓣好友跟踪”,也有源代码可以参考。

下面说说wxPython的快速开发工具了。wxPython的界面有两种写法,一种是用自带的XRCeditor,创建一个叫XRC的XML文件,界面和控件都写成XML格式固化。因为我的软件的界面会有动态元素,所以跳过这种先进方式,直接寻找用源代码创建控件的方法。

搜来搜去,发现大家都在提一个叫BOA的工具。当下Windows版,安装,然后,呃,开始菜单里什么都没有增加呀?想了下,BOA自己称自己也是基于wxPython的,那么全硬盘搜索下"boa.py”,果然在python的site packages里面找到了,直接python boa.py,一个类似于以前Delphi开发环境的GUI就出来了。

前面说过wxWidgets的布局是用一个叫sizer的类,我不用搞那么复杂,直接按绝对像素布置控件就好。那么就简单了,在BOA里创建一个 frame, frame上创建几个panel, 把控件放在不同的panel里想要的位置,然后点那个对勾图标,代码就生成好了。直接运行,想要的窗口就出来了。BOA还支持消息映射,可以在GUI里添加消息映射和消息处理函数。

结论:Python+wxWidgets+BOA 非常好用!

 

================================================================

wxPython(4)distribution

基于wxPython的软件做好,一定要打包的,你没法保证目标机器上的运行环境和本机一致。

打包Python程序有很多种选择,在Windows上很简单,用py2exe。只要写一个setup.py, 然后使用python的标准分发接口disutilis的标准用法

python setup.py py2exe

如果setup写得不对会生成很多文件,希望出来的结果干净一点,setup.py要这样写,设置bundle_files

from distutils.core import setup  
import py2exe  
includes = ["encodings", "encodings.*"]  
options = {"py2exe":  
            {   "compressed": 1,  
                "optimize": 2,  
                "includes": includes,  
                "bundle_files": 1  
            }  
          }  
setup(     
    version = "0.1.0",  
    description = "radargraph",  
    name = "radargraph",  
    options = options,  
    zipfile=None,  
    windows=[{"script": "myApp.py", "icon_resources": [(1, "myApp.ico")] }],    
    )

其中myApp.py和myApp.ico要改成自己的文件。做出来的有一个win32可执行程序,一个vc7的dll,两个文件而已,很干净。大小大约在4M到10M之间。

在Mac上据说py2App的表现和py2exe一样方便,我没有Mac系统没法试验。

在Linux上有点麻烦,我试验了Python自带的freeze.pl,以及cx_FreezepyInstaller。这三种工具都有标准python disutils接口,使用方法都一样,写一个setup.pl文件(当然不同的工具对这个的格式要求可能不一样,详细见各个工具的手册和例子),然后运行python setup.pl xxx (这里xxx是各工具的名字)。

试验结果如下,pyInstaller, 打包失败,原因不详,也许是我setup.pl写得不好?但我看了又看,没看出问题,然后发现它网站上的例子我也编译不成功,没耐心了。 freeze.pl打包成功,但是拷到其它Linux机器上运行失败,因为库文件没有拷全。我估计自己手工把python和wxWidgets的*.so 文件拷过来应该可以,但是查找dependency很麻烦啊。cx_Freeze是最后一棵稻草。运行下来,嘿嘿,所有*.so都拷全了,虽然有些不必要的gcc的*.so它也拷过来了。最后做出来的是一个可执行文件和十多个so文件,其中libwx_gtk2ud_core-2.8.so.0文件就有 20M。这个tar.gz之后还有20多M。。。确实能够工作,可是尺寸太大了!我们想要的是一个能够通过email发给客户的版本,这个太巨。

-----------另外,关于wxPython用到的资源文件----------

用 BOA来在界面上创建Bitmap图标或者bitmap时,生成的代码是直接调用bitmap文件。这样子生成的可执行文件,在目标机器上可能会找不到资源。解决方法是参考《wxPython in Action》的第二章的例子代码,里面有个images.py,是由Python的XRCeditor里面的encode_bitmaps.py生成的资源文件。打开encode_bitmaps.py看一下就明白应该怎么做,会生成一个python文件,里面有若干PyEmbeddedImage对象(和第二章的例子有点不一样了)。例如

Image_title = PyEmbeddedImage( 
    "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAAA3NCSVQICAjb4U/gAAAek0lE" 
)

要用的时候就在需要BITMAP的地方Image_title.GetBitmap()就好了。缺点是这样改之后,BOA就不能load这个项目了,因为BOA不认PyEmbeddedImage。

----------------------------------------------------------

继续寻找新方法。大家都知道,连接Python和C/C++库的桥梁有: 
1. 直接使用Python提供的C API - 这个很麻烦 
2. SWIG 其实SWIG不只支持Python, 它功能很强大,很多脚本语言都用它和C接口。当年wxPython开发时1.0版本用方法1,后来没法维护了,最后只好改成SWIG。缺点是很繁琐。 
3. Boost.Python 据说用这个接口C++很方便 
4. Pyrex 

pyrex,是一种新的脚本语言。它用类似于Python的语言来写代码,然后用pyrex工具变成C代码,最后编译成可执行程序。同时pyrex代码中可以使用和调用Python代码。于是有些人就利用这个方式来通过pyrex把python变成C,再编译成可执行代码。David McNab有一个关于如何做的教程,我试验过了,简单的Python程序可以;但是对于wxPython程序,转出来的C文件编译不成功,看起来对于wxWidgets的支持有问题。

参考

牡蛎的如何编译Python程序 
Pyrex, 和Python的C扩展

------------------------------------------------------------

最后这个项目可耻地还是用了Java SWT+Jface。原因就是20M的可执行包太大了。其实,对于没有这种限制的项目,wxPython+BOA+cx_Freeze真是飞速、稳定、可分发的开发环境,强烈推荐。

Continue reading 【转】wxPython评估笔记

it-e-30 Electronic Learning

Never in the history of the world has the rate at which new information is created increased

so rapidly. According to a study done at the University of California-Berkeley, "the amount of

new information stored on paper, film, magnetic and optical media has roughly doubled in the

last three year." The study estimates that about, "Five exabytes of new informationroughly five

billion gigabyteswas created in 2002 alone." How can one keep up with the rapid increase in

information?

One of the many uses of the computer is for e-learning. Derek Shockley defines e-leaning as,

"The delivery of a learning, training or education program by electronic means." Therefore

e-learning can involve a computer, cell phone, television and DVD play, etc. The new way of

learning goes beyond the classroom and textbooks to make use of the latest technology to teach

people in a variety of settings with a variety of methods.

E-learning can be divided into 3 main categories: computer based teaching (CBT), distance

learners and their tutors, and finally classroom instruction online. The first category is a method

where the learner learns at his or her own pace. The material has all been prepared ahead of time

and is available on a CD-ROM or via the Internet through a browser. Some examples of this type

of learning include: children's educational software, on-line tutorials, searchable reference

material, etc.

The second method, distance learning, allows the student to communicate with a real person.

This person is usually knowledgeable in the area of study and can be contacted through an

Internet chat session, e-mail, telephone, etc. This method usually includes some kind of

self-study component, but the learner is periodically in contact with someone else who assesses

their progress, answers questions the learner has and may provide extra motivation for learning.

Some examples of this type of e-learning include: an e-mail based study program where one

lesson must be completed before receiving the next one, a home schooling program where a

teacher receive completed lessons by e-mail for evaluation, and so on.

The third method can be described as a virtual classroom. The students that make up the class

are physically separate, but are again connected through some electronic medium like a satellite

link, the Internet, etc. Some examples include: video conferencing, a satellite broadcasted training

program, etc. Within each category, one can find many different environments to provide this

learning opportunity. As technology advances, more e-learning possibilities will become available.

What advantages does e-learning have over more traditional forms of education? Since

e-learning is usually electronic, it's much easier to update and distribute than a textbook for

example. Also, one presenter is able to "teach" many students in different locations and at

different times in some cases. Although the initial development costs for a good course can be

costly, the maintenance and distribution costs are not as expensive. The transportation costs, and

course fees for a traditional several-day course are often much more expensive.

The concept of e-learning, however, is still relatively new. A poorly designed course will not keep

a person's attention for very long. It's been reported that between 20%~50%

of distance learners don't finish the courses they have started. A pre-prepared course cannot

adjust to the level and interests of the students as easily as a good teach can. Although, a well

designed course can tailor the material to the level and interest of each student to a certain degree.

The biggest obstacle to e-learning, however, is the mindset of the individual as well as high level

management. People are still willing to pay 2,000 USD for a 3-day course with a live instructor

than to pay a fraction of the cost to cover the same material through e-learning on the Internet.

What will e-learning look like in another 5, 10 or even 15 years? As technology develops

and the tools to develop quality e-learning courses evolve, one can expect to see an even greater

emphasis on e-learning in the future. Some of the technologies currently being perfected include

things like teleconferencing with a holographic display (3D realistic image using light) of the

student and instructor together. In the future learners will put on special LCD goggles and use

haptic (touch) technologies to give the feeling of actually being in a real situation to learn a

particular skill. Faster Internet speeds and more powerful computers will provide more realistic

multimedia applications to stimulate learners. More experience with e-learning courses will also

provide higher quality courses in the future.

Learning cannot be limited to the first 20 years of one’s life. With the constantly changing

environment we live in, learning is something that needs to happen regularly for our entire

lifetime. Whether you need to learn a new programming language or want to know how to grow

roses, the relatively new world of e-learning will provide you with many opportunities to expand

your knowledge. Go ahead and learn something new today!

 

1, tutor  ['tju:tə]
vt. 辅导;约束
n. 导师;家庭教师;助教
vi. 当家庭教师;(美)在家庭教师指导下学习

2, pace  [peis]
n. 速度,步调,步法
v. 踱步,缓慢的走,引导
3, obstacle  ['ɔbstəkl]
n. 障碍
4, mindset  ['maindset]
n. 意向,精神状态
5, evolve  [i'vɔlv]
v. 进展,进化,展开
6, haptic  ['hæptik]
adj. 触觉的

Continue reading it-e-30 Electronic Learning

memcached 入门

memcached的安装见

http://www.iteye.com/topic/844687

它要依赖libevent ,见

http://blog.chenlb.com/2008/12/install-memcache-and-libevent.html

http://www.cnblogs.com/taosim/articles/2025260.html

Continue reading memcached 入门

php介绍

javaphp比较:

参见文章:

http://blog.csdn.net/jinxfei/archive/2010/08/10/5801280.aspx

http://www.zendstudio.net/archives/some-php-development-tips-from-my-own/

上手复杂度:PHP

我用 Java 做了 2-3 年的 Swing 开发,然后转向WEB,第一个接触的框架是 Struts,当时的感受就是要配置的东西太多了,前后鼓捣了三个多月,才感觉渐入佳境了。

如今PHP从开始了解到现在总共三个月左右的时间(而且只是业余时间),其中有一周的时间在看PHP官网的文档,了解主要的语言特性,后面基本上就是边看边改代码,并照猫画虎的写东西。虽说当年对软件开发的理解不能和今天相提并论,但客观的说,PHP的确简单、易学,而且特别适合做WEB开发。

开发感受:各有胜场

PHP
最让我不爽的地方:

经常是出错后屏幕一片空白(White ScreenOf Death,都有专有名词了,可见这是PHP出错表现的一大特性),什么信息都没有。

这可通过error_reporting (打印在web容器log里)和 display_errors(直接在输出上显示)来设置
开发工具的auto complete能力远不如javaIDE方面还在起步阶段

PHP比较爽的地方:

php中,数组和哈希表等价,而且是使用最广泛的数据结构,变长参数+数组做参数,能大大提高写代码的灵活性。

基本上不用为NPE(null pointer error)担心。Php存在垃圾自动回收机制

访问数据库比JDBC简单多了,不用什么持久化框架也能很快的写出类似DAO的代码。Php也存在ORM框架,但是php的特点不适合搞这些东西,php就是要简单,高性能,针对特定应用。

许多专为WEB设计的特性,使得从页面获取信息,或者向页面输出信息都变得非常轻巧。

谈不上爽或者不爽的特性:

echo 的内容直接到前台页面上了,一开始我以为echojavaSystem.out一样,会写到日志。

由于不像Java那样对classpath以及class的路径有着严格的要求,一时之间还不习惯,原来创建一个Java类放在什么地方基本上没什么可考虑的,但现在经常要决策一个文件该放在哪个目录下。

因为可以OOP,也可以不OOP,所以,增加新功能点的时候,经常很纠结O还是不O

代码风格啊!太习惯了getData这样的命名,是在不适应get_data这样的函数,因此,执着着,没有入乡随俗的改过来,也好,一眼就可以看出,哪些是属于框架的,哪些是属于我的。
平台对比
如果拿PHPJAVA比,我觉得PHP是瑞士军刀,而JAVA则是家庭五金维修工具N件套,N >=100,在解决网站开发这一问题上,PHP的确是小巧、易用,但也有不尽如人意的地方。
比如,我发现J2EE中几乎必不可少的JDBC连接池,在PHP中约等于无,所以,用户请求过来,如果需要访问数据库,都是现连、现取、现关,究其原因,是架构不同造成的。
  实际上,J2EE中有Web Container的概念,用户请求是由Container分配的线程完成的,线程可以使用进程的内存空间交互数据;PHP是依附于Apache的,每 次用户请求,Apache都启动一个新的进程来执行PHP脚本,进程执行完,一切资源都回收了,所以在默认情况下,一个PHP脚本想要留下点全局的东 西并不容易(我一开始就被 global 这个关键词给骗了);当然,也不是说不同的请求之间完全没法交换数据,只是这样需要使用共享内存,或者使用文件做持久化。
不过,Apache用进程处理请求应该比线程模式要更加健壮,因为在J2EE中,因为一个线程的问题导致整个Container挂掉的情况屡见不鲜。
OOP
PHP主流版本已经对OOP的支持很好,但因为历史原因,好多PHP的开源项目的代码都是不那么OOP的。一开始,我是跟着框架的习惯,用不怎么OOP的方式写代码,在写了十几个零散的函数之后,终于忍不住,又全部重构成对象了。
  做了这么多年的JavaOOP的思想已经非常深入,虽然当年从学校出来的时候,也是从结构化程序设计转向面向对象的,但N年之后,再从面向对象转向结 构化,这种不习惯的感觉更加强烈。也许是OOP真的是更加符合自然的思考习惯吧,现在看着一长串的零散的函数,很有一种不安全的感觉,况且还要挖空心思的 为方法起名,以避免冲突,累!
总结
1、应该把PHP纳入自己的开发工具箱
2PHP不够完美,但可圈可点之处甚多。
3、面向对象为PHP增色不少
4、在开源领域,PHP方面比较发达的是最终应用,所以才有那么多人使用wordpress建独立博客,哪怕没有开发经验;JAVA方面比较发达的是开发框架和类库,给程序员们使用的。从这个角度来讲,Java是个小众的语言。 

php联合java

http://hi.baidu.com/lei0827/blog/item/28439a4e923234ced1c86a18.html

直接调用的方式

1、种是用php自身带的模块调用java(经过网友的证明发现这种方法不好)。

2、通过php-java-bridge模块调用java。(经过网上普遍推荐)。[最新的版本实现是基于pjb,感觉倒不如直接用http调用.]


间接调用的方式

3、通过webservice或者直接http方式访问java服务

 

xmpp php

http://code.google.com/p/xmpphp/ 这个稍微强一点

http://www.code.blitzaffe.com/pages/phpclasses/files/jabber_client_52-11

由于php对多线程支持的不好,且对象生命周期短,几个php xmpp库都不理想,不知道怎么实现webchat。

考虑的问题:怎么在1个session里面保持住连接,不至于每次请求都登陆一次吧。

 

php运行环境:

web服务器(apache, nginx)--开源免费

php--开源免费

zendframework--开源免费

经过实际应用证明的高性能,稳定,可用。

http://blog.s135.com/post/314/

http://lin128.blog.51cto.com/407924/277272

http://guogoul.com/2008/07/08/nginx_2/

 

使用php的应用:

www.yahoo.com

www.baidu.com

www.sina.com

www.163.com

www.sohu.com

这些就足够了

Continue reading php介绍

php基础

先花一分钟看看常见符号和函数: http://www.chinaz.com/program/2010/0331/110317.shtml

 

echo和print的区别

PHP 和 HTML 最简单的交互是通过 print 和 echo 语句来实现的,在实际使用中, print 和 echo 两者的功能几乎是完全一样。可以这么说,凡是有一个可以使用的地方,另一个也可以使用。但是,两者之间也还是一个非常重要的区别:在 echo 函数中,可以同时输出多个字符串,而在 print 函数中则只可以同时输出一个字符串。同时,echo函数并不需要圆括号,所以echo函数更像是语句而不像是函数。

echo 和 print 都不是函数,而是语言结构,所以圆括号都不是必需的。他们的区别在于:
(1) echo可以输出多个字符串,像下面这样:
echo 'a','b','c';
如果你非要加上圆括号,注意写成echo ('a','b','c');是错误的,应该写成:
echo ('a'),('b'),('c');
它没有像函数的行为,所以不能用于函数的上下文
(2) print只能输出一个字符串,它可以表现得像一个函数,比如你可以如下使用:
$ret = print 'Hello World';
所有它能用在更复杂的表达式中。
另外,echo的效率相对比较快~

如下代码:

<?php
$a='hello ';$b='php world!';echo $a,$b.'<br />';//echo 可以用逗号分隔字符串变量来显示print $a.$b.'<br />';//而print不能使用逗号,只能用点号分隔,print $a,$b.'<br />';//使用逗号时报错。
?>

echo    命令和    print    命令    相同,没有区别  
echo    函数    和    print    函数    有区别。  
echo()    无返回值,与echo    命令相同  
print()    有返回值,成功,返1,false,返0.    
printf()    和    sprintf()    类似,均为格式化输出,不同的是前者输出到标准输出,后者输出到变量  
形如  
echo    <<<    EOT  
EOT;  
print    <<<    EOT  
EOT;  
的书写格式,其含义如下:  
<<<    运算符,将由自定义分界符间的内容视为字符串,可对其间的变量做处理  
EOT    自定义分界符,结束时必须位于行首

传址与传值:

>$a = 1; function go(&$b) { $b = $b + 1; } go($a); echo $a; ========系统输出2,因为函数直接修改了$a的数值

Continue reading php基础

html5 demo赏析

http://html5demos.com/观赏html5 demo

 

Storageevents

可监听本地存储localStorage里面某一项的改变事件

 

dataset (data-*attributes)

<div id="test" data-name="viael.dataset" data-height="short">This element hasdata</div>

el.dataset.name = "via el.dataset"

el.dataset.height = "short"

注意属性是以data-开头的

 

History API usingpushState

使用pushState函数修改浏览器历史记录。

 

Browserbased file readingNot part of HTML5

通过FileReader 获得文件控件的路径

 

Drag files directlyinto your browserNot directly part of HTML5

原理同上,浏览器可就收外部拖拽的文件。

 

Simple chatclient

利用websocket

 

Two videosplaying in sync

Vedio标签 currentTime控制播放进度

 

Interactive canvas gradients

Canvas & Video
Video

Canvas 

Canvasvideo特性

 

ContentEditable

标签的contenteditable 属性使得标签及其子标签都可编辑

 

GeolocationWorkson Safari Mobile too

使用navigator.geolocation

 

postMessagesame domain

postMessagecross domain

 

使用postmessage跨域请求,接收页面需要代码(window.onmessage)监听消息

 

drag and drop

drag anything

新增了可监听的事件,使用dataTransfer 

offline detectionWorks on Safari Mobile too

如下代码:

addEvent(window, 'online', online);

addEvent(window, 'offline', online);

 

navigator.onLine testsDoesn't use events, only polls

使用navigator.onLine属性判断

 

on/offlineevent tests

window , body都提供online/offline事件

offlineapplication using the manifestFF 3.6 isstill buggy - doesn't request manifest after initial load

使用window.applicationCache存储。

 

Storage

Window的两个属性sessionStorage,localStorage

 

Web SQL DatabaseStorage

Web SQLDatabase - rollback test

openDatabase ,transaction,executeSql Web Workerswatch out - uses a lot of CPU!

使用Worker对象,多线程

使用postmessage传递参数(调用方和worker线程之间),使用onmessage事件监听。

 

IndexedDB

是一种轻量级NOSQL数据库

window.indexedDB = window.mozIndexedDB || window.webkitIndexedDB;

var request = indexedDB.open("MyTestDatabase"); 

http://rainsilence.iteye.com/blog/984569

Continue reading html5 demo赏析

push pull poll 长连接 websocket pushlet cometd

IBM总结文章:

http://www.ibm.com/developerworks/cn/web/wa-lo-comet/

 

里面推荐的pushlet之前使用过的,这次再看一下,看源码和试验ajax push实质仍然是pull技术。?

它的脚本库没有考虑到其他脚本库,使用window.onEvent来作为回调,不是很好。

示例不是很好,只写了pull方式的。

不建议用,看到用的人没多少,网上的帖子都是粘来粘去,没有实际的例子,日期很早,最近的没有。

看他的文档也写的不清楚,看了一天没看明白,还是不知道怎么用。确定不是自己理解力问题。

 

webqq通过观察应该是长轮询,再看到这边篇帖子的大讨论:

http://www.iteye.com/topic/785931?page=7

主要以下几点:

认为是长轮询实现

认为长轮询较好:

长轮询的优势是,如果没有消息,客户端N秒才会有一次请求。
如果有消息,也会立即发送到客户端。(如果刚好回应完一个请求时有新消息... 还是有一定延时)
与iframe + script方式的长连接相比,它实现更简单,也不会在浏览器下显示“正在加载”信息。

按个人理解,使用带部分缓冲的长轮询能减少服务器开锁
即有新消息并不立即返回,而是等待一定时间,以免消息频繁时过多轮询。[这又存在延迟的问题]

长连接存在进度条一直加载的问题。

 

服务端要配合使用nio(tomcat6.jetty支持)较好,否则压力较大。

别的实现有使用cometD的。

 

之前自己做过长连接,主要问题是浏览器一直在转,让人很不舒服,而且容易崩溃。

flash主要是防火墙的问题。

 

长轮询比较好实现,注意客户端要延长超时时间。

一般的长poll是不需要comet就可以实现的,只不过Tomcat6之后支持Bayeux协议可以使用nio/异步servlet来提高性能。

Ext.Ajax.request({
                    url : 'LongPoll',
                    timeout:360000,//延长超时
                    success : function(response, opts) {
                        console.log('finish');
                        dorq();
                    },
                    failure : function(response, opts) {
                        console.log('server-side failure with status code '
                                + response.status);
                    }
                });

 

这里有一些列很好的文章:

反向Ajax:

第1部分:Comet介绍 http://kb.cnblogs.com/page/112185/

Forever Iframe

Forever Iframe(永存的Iframe)技术涉及了一个置于页面中的隐藏Iframe标签,该标签的src属性指向返回服务器端事件的servlet路径。每次在事件到达时,servlet写入并刷新一个新的script标签,该标签内部带有JavaScript代码,iframe的内容被附加上这一script标签,标签中的内容就会得到执行。

1. 优点:实现简单,在所有支持iframe的浏览器上都可用。

2. 缺点: 没有方法可用来实现可靠的错误处理或是跟踪连接的状态,因为所有的连接和数据都是由浏览器通过HTML标签来处理的,因此你没有办法知道连接何时在哪一端已被断开了。

Multi-part XMLHttpRequest

1. 优点:只打开了一个持久连接,这就是节省了大部分带宽使用率的Comet技术。

2. 缺点:并非所有的浏览器都支持multi-part标志。某些被广泛使用的库,比如说用Java实现的CometD,被报告在缓冲方面有问题。例如,一些数据块(多个部分)可能被缓冲,然后只有在连接完成或是缓冲区已满时才被发送,而这有可能会带来比预期要高的延迟。

流方式,服务端要知道客户端是否关闭也是个问题,否则客户端已经断开,服务端仍在运行,可能的解决办法是心跳,那不跟poll差不多了。

第2部分: WebSocket http://kb.cnblogs.com/page/112616/

第3部分:Web服务器和Socket.IO http://kb.cnblogs.com/page/114594/

第4部分:Atmosphere和CometD http://kb.cnblogs.com/page/116653/

Atmosphere和CometD都是稳定的、开源的反向Ajax解决方案,我们在Ovea选用的是CometD,因为我们在一个集群环境内部为移动设备开发可伸缩的事件驱动应用,我们完全掌控基础设施(我们使用Jetty)。不过,在没有额外开发的情况下,如果你正在出售web应用且希望你的反向Ajax功能在尽可能多的服务器上都可运作的话,CometD可能不是最好的选择。但现在随着越来越多的Web应用开始支持Servlet 3.0规范,CometD的局限性呈下降趋势。说到传输层,余下的主要差异则取决于对WebSocket的支持。

关于servlet 3.0 参见 http://kazge.com/archives/635.html ,在此文中主要指异步servlet处理。Ovea是php网站,但是使用java的CometD来做comet服务?

作者还是倾向于cometD,但是cometD要求jetty6以上以及任何支持Servlet 3.0规范的服务器中

第5部分:事件驱动的Web开发 http://kb.cnblogs.com/page/117099/

comet有多种实现,long poll,长连接,上面的文章仍然推荐long poll。

cometD可以使用websocket作为传输协议。

WebSockets与Bayeux/CometD http://www.infoq.com/cn/news/2010/05/websockets-bayeux

文中提到的Greg Wilkins是jetty作者

http://www.htmlgoodies.com/html5/tutorials/making-html5-websockets-work.html#fbid=x32iZkQSYda

此文中写道支持websocket的浏览器有:

IEFirefoxChromeSafariOpera
10~6.014.05.0 (partial support*)11.0 (partial support*)

支持webscoket的服务容器有

Java的Jetty(原文竟然写作Betty)  Oracle的Glassfish

php 的Wamp and XAMPP, lighttpd的mod_websocket

python的Tornado

nodejs + http://socket.io/  (socket.io是javascript库,包括服务端和客户端,所以要在nodejs上跑了)

微软的那就不说了

 

再来总结一下:

Well,本来是想找到关于websocket的有利消息,但是让我失望了。原因是:

1:目前主流的php服务器支持不行:apache,ngix不支持, java中的tomcat7,jboss7,webshpere8都还没支持。

2:浏览器支持也不给力:目前只FF6,Chrome14支持,况且websocket还只是个html5草案。

3:假使花个大力气做出来了,然后你发现其实long poll也能同样做的更好,不知你会怎么想。

再来看看CometD这个东西:

引用http://kb.cnblogs.com/page/116653/ 中的话:

1. 优点

从客户端到服务器端,以及从一个独立的Java客户端到服务器端,CometD提供了一个完整的解决方案。框架有详尽的文档说明,有一个很好的API,且非常容易使用。最重要的是,它拥有一种事件驱动的方法。CometD和Bayeux是许多事件驱动应用的构成部分,其他的反向Ajax框架并未提供任何的事件驱动机制,使得最终用户不得不开发自己的定制解决方案。

javascript有dojo和jquery的支持。

CometD支持许多必需的功能,比如说重连接、可靠的超时检测、回退、批处理、消息确认,以及更多你不会在其他反向Ajax框架中找得到的功能。CometD可让你实现最可靠的、低延时的通信。

2. 缺点
除了Jetty for Comet(Tomcat)之外,CometD目前并未支持任何的Servlet 2.5容器,其也不支持Glassfish/Grizzly WebSocket。

我的观点:

java实现,所以,关php什么事?关那么多的php 应用什么事?这不过是java众多框架中的又一个。

不支持Servlet 2.5容器,我自己实现long poll还不是一样?啊,对,它在上面封装了一层,不过这个转换服务器的情况真的很可能发生吗?即使会,转换的工作会很难吗?它的封装对性能有影响吗?

我难道有点势力吗,用了java鄙视.net,用了php轻视java?

Continue reading push pull poll 长连接 websocket pushlet cometd

将目录或指定文件使用img2py进行处理

img2py 可以将图片文件存成文本文件,但它不支持多个文件处理,这特别在我的目录下有许多的文件,如果一个个处理的话,会非常麻烦。于是为了解决目录及支持多个文件的问题,我编写了下面的小程序,希望对你有用。

import wx.tools.img2py as img2py
import getopt
import sys
import os
import os.path

def usage():
    print """
%s [-d directory][-h] -o outputfile files
""" % sys.argv[0]

def main():
    if len(sys.argv) == 1:
        usage()
        sys.exit(1)
    try:
        opts, fileArgs = getopt.getopt(sys.argv[1:], "d:o:h")
    except getopt.GetoptError:
        usage()
        sys.exit(1)

    imagedir = ''
    outputfile = ''
    for opt, val in opts:
        if opt == "-h":
            usage()
            sys.exit(1)
        elif opt == "-d":
            imagedir = val
        elif opt == "-o":
            outputfile = val

    convert(outputfile, imagedir, fileArgs)

def isImageFile(filename):
    f, ext = os.path.splitext(filename)
    if os.path.isfile(filename) and ext.lower() in ('.gif', '.png', '.bmp', '.jpg', '.ico'):
        return True
    else:
        return False
           
def convert(outputfile, dir='', imagefiles=[]):
    files = []
    files.extend(imagefiles)
    if dir:
        f = [os.path.join(dir, x) for x in os.listdir(dir) if os.path.isfile(os.path.join(dir, x))]
        files.extend(f)
    files = list(set([x for x in files if isImageFile(x)]))
    for i, x in enumerate(files):
        name = os.path.splitext(os.path.basename(x))[0].lower()
        cmd =[]
        if i != 0:
            cmd.append('-a')
        cmd.append('-n')
        cmd.append(name.capitalize())
        cmd.append(x)
        cmd.append(outputfile)
        os.system("img2py %s" % " ".join(cmd))
   
if __name__ == '__main__':
    main()

我们在写gui程序的时候,经常会用到一些图标图片资 源,对此有几种解决办法,有人喜欢用zip模块将其打包,用的时候取出来,因为python读取zip文件也是很方便的,有人则干脆不打包,直接放在一个 子目录中,用的时候直接读取。而我则喜欢将其转换为.py文件,作为模块调用。

我在看wxPython程序的例程的时候,[encode_bitmaps.py]发现它的图片是从一个模块(.py文件)中调入的,于是很好奇,顺藤摸瓜,于是发现:

wxPython安装好之后,会在 wx\tools 目录下安装一些工具,其中名为img2py.py的工具。
这个工具可以很方便的将我们程序中所用到的图片或者图标资源转换成py文件,这样我们在需要使用这些图片资源的时候,只需要
import 这些扩展名为.py的模块文件即可

在命令行下输入img2py.py并回车,可以查看详细的帮助信息。而一般情况下,我们所要做的,只是将图片转换为.py文件

例如,我有一个ico文件,想用其作为我程序的托盘图标

那么我可以这样做

首先,将其转换为 .py 文件

img2py.py myicon.ico myicon.py 

 

然后,在程序中导入这个模块

import myicon 

最后,当我需要用它的时候,只需要:

icon = myicon.geticonIcon() 

注意,如果你的myicon.py中没有geticonIcon()方法,只需要加入如下一行语句即可:

geticonIcon = icon.GetIcon 

怎么样,是不是很方便?

在 wx\tools 目录下还有一些其他的工具,具体用法还有待大家发掘

--------------------------------------------------

目的:
        即为img2py的用处,img2py是将图像转为以py文件存储的程序,简化了程序过程中读文件的处理。

开发环境:eclipse+pydev插件

步骤:
1,在 eclipse工程中增加个含有main函数的模块,用来处理图片到py,代码如下:
'''
Created on 2009-6-16
@author: fengxuanshuo

This is a way to save the startup time when running img2py on lots of
files...

'''
import sys
from wx.tools import img2py

command_lines = [
                 "-a -F -n book   pictures/right_menu/222.png   ../main/images.py",
                 "-a -F -n boo   pictures/right_menu/111.png   ../main/images.py",
                 "-a -F -n ook_red   pictures/right_menu/000.png   ../main/images.py",
                 ]

if __name__ == '__main__':
    for line in command_lines:
        args = line.split()
        img2py.main(args)

其中command_lines为命令行执行内容,程序需要的图片都可以处理,而且目标文件可以有多个,名字自己取。

2,执行新增加的模块,就会发现 main目录多了个images.py文件。

3,更新eclipse pydev工程:pydev插件并没有常用的那个add file to project选项,不过有pydev->source format python files.

4,然后再原工程里面就可以用图片py文件了(可能有些版本,在生成py文件的时候不会加import相关库的语句,需要手动添加)

5,images.py 在wxpython demo 中的用法
定义全局变量 images: images =None
在app里面声明全局的images : globel images
import imgaes as i
images = i

其他py文件类似,这么做的好处在demo的注释里面说了,不罗嗦了,over

Continue reading 将目录或指定文件使用img2py进行处理

jsp 缓存, html 缓存, ajax缓存,解决方法

 

有关页面缓存问题.这个问题上网找了 好多.但发觉各种解决方法,都彼此分离,没有一篇统一的解决方法,本人近日,也遇到了页面缓存的问题,根据网上各页面缓存的解答,做了一个总结。

1.服务器端缓存的问题, 防止JSP页面缓存:

  1. <% 
  2. // 将过期日期设置为一个过去时间 
  3. response.setHeader("Expires", "Sat, 6 May 1995 12:00:00 GMT"); 
  4. // 设置 HTTP/1.1 no-cache 头 
  5. response.setHeader("Cache-Control", "no-store,no-cache,must-revalidate"); 
  6. // 设置 IE 扩展 HTTP/1.1 no- cache headers, 用户自己添加 
  7. response.addHeader("Cache-Control", "post-check=0, pre-check=0"); 
  8. // 设置标准 HTTP/1.0 no-cache header. 
  9. response.setHeader("Pragma", "no-cache"); 
  10. %> 

<% // 将过期日期设置为一个过去时间 response.setHeader("Expires", "Sat, 6 May 1995 12:00:00 GMT"); // 设置 HTTP/1.1 no-cache 头 response.setHeader("Cache-Control", "no-store,no-cache,must-revalidate"); // 设置 IE 扩展 HTTP/1.1 no-cache headers, 用户自己添加 response.addHeader("Cache-Control", "post-check=0, pre-check=0"); // 设置标准 HTTP/1.0 no-cache header. response.setHeader("Pragma", "no-cache"); %>

当然,每一个页面都包含这些代码会很繁琐,可以通过自定义过滤器 (Filter)的方法来处理相关的页面

2.防止html页面缓存

  1. <meta http-equiv="pragma" content="no-cache"> 
  2. <meta http-equiv="cache-control" content="no-cache"> 
  3. <meta http-equiv="expires" content="0">    

<meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0">

3.防止Ajax缓存

如果,你的页面,已经设置了防止JSP,HTML的页面缓存,但发觉页面缓存, 始终存在,就要考虑是否Ajax造成的页面缓存了。

1)设置了,如上1,2之后

Ajax缓存,产生的原因是:request, url的地址上:
IE中如果XMLHttpRequest提交的URL与历史一样则使用缓存,根本不向服务器端提交。因此无法取到刚提交的数据。

针对ajax,需要如下设置:

方法一:加时间戳 var url = BaseURL + "&timeStamp=" + new Date().getTime();
方法二:加随机数 var url = BaseURL + "&r=" + Math.random();

总结:原引(http://www.javaeye.com/topic/150162)

在jsp页面中,光是使用html的<meta> tag是无法禁止缓存的。一定要加上

response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);

有人肯定会说,这个跟html的tag设置没有不同啊。的确,我也觉得,但实践证明,没有这几句,光靠html tag不行。

所以当action会返回页面时,有以下这两种情况:

a,返回的页面没有写上上面的禁止cache的语句(或者只写了html tag)。IE存储的是URL link + page result(cache eabled)。这也就是导致了之前为什么还会有cache的原因

b,返回的页面写上了禁止cache语句 。IE存储的是URL link + page result(cache disabled)。这样才能够实现到我们想要的目的。每次都会真正的发出request。

Continue reading jsp 缓存, html 缓存, ajax缓存,解决方法

Pagination


Total views.

© 2013 - 2019. All rights reserved.

Powered by Hydejack v6.6.1