手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表分类:PHP

phing的配置文件

 官网上有一份phing的基本配置文件,网上又找了一份比较复杂的,根据自己的项目对比一下喽

官网配置文件:
http://www.phing.info/docs/guide/stable/chapters/GettingStarted.html
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <project name="FooBar" default="dist">  
  4.   
  5.     <!-- ============================================  -->  
  6.     <!-- Target: prepare                               -->  
  7.     <!-- ============================================  -->  
  8.     <target name="prepare">  
  9.         <echo msg="Making directory ./build" />  
  10.         <mkdir dir="./build" />  
  11.     </target>  
  12.   
  13.     <!-- ============================================  -->  
  14.     <!-- Target: build                                 -->  
  15.     <!-- ============================================  -->  
  16.     <target name="build" depends="prepare">  
  17.         <echo msg="Copying files to build directory..." />  
  18.   
  19.         <echo msg="Copying ./about.php to ./build directory..." />  
  20.         <copy file="./about.php" tofile="./build/about.php" />  
  21.   
  22.         <echo msg="Copying ./browsers.php to ./build directory..." />  
  23.         <copy file="./browsers.php" tofile="./build/browsers.php" />  
  24.   
  25.         <echo msg="Copying ./contact.php to ./build directory..." />  
  26.         <copy file="./contact.php" tofile="./build/contact.php" />  
  27.     </target>  
  28.   
  29.     <!-- ============================================  -->  
  30.     <!-- (DEFAULT)  Target: dist                       -->   
  31.     <!-- ============================================  -->  
  32.     <target name="dist" depends="build">  
  33.         <echo msg="Creating archive..." />  
  34.   
  35.         <tar destfile="./build/build.tar.gz" compression="gzip">  
  36.             <fileset dir="./build">  
  37.                 <include name="*" />  
  38.             </fileset>  
  39.         </tar>  
  40.   
  41.         <echo msg="Files copied and compressed in build directory OK!" />  
  42.     </target>  
  43. </project>  
 
第三方配置文件 :
参考:https://gist.github.com/leric/1216551
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.    
  3. <project name="ucenter" default="deploy">  
  4.    
  5.     <!-- Target: config 设置变量,控制部署到不同环境-->  
  6.     <target name="config">  
  7.         <property name="svn_user" value="leric" />  
  8.         <property name="svn_pass" value="" />  
  9.         <input propertyname="deploy_env">Deploy to Env(prod|test):</input>  
  10.         <if>  
  11.             <equals arg1="${deploy_env}" arg2="prod" />  
  12.             <then>  
  13.                 <property name="project_home" value="/opt/www/ucenter" />  
  14.                 <property name="web_servers" value="www.ucenter.com,www2.ucenter.com" />  
  15.                 <property name="web_server_user" value="leric" />  
  16.                 <property name="web_server_pass" value="leric" />  
  17.             </then>  
  18.         </if>  
  19.         <if>  
  20.             <equals arg1="${deploy_env}" arg2="test" />  
  21.             <then>  
  22.                 <property name="project_home" value="/opt/www/ucenter" />  
  23.                 <property name="web_servers" value="127.0.0.1" />  
  24.                 <property name="web_server_user" value="root" />  
  25.                 <property name="web_server_pass" value="123456" />  
  26.             </then>  
  27.         </if>  
  28.     </target>  
  29.    
  30.     <!-- Target: build  Checkout from svn, and make tar.gz -->  
  31.     <target name="build" depends="config">  
  32.         <echo msg="Export code from svn..." />  
  33.         <input propertyname="export_revision">Revision to export from svn:</input>  
  34.         <svnupdate  
  35.            svnpath="svn"  
  36.            revision="${export_revision}"  
  37.            username="${svn_user}" password="${svn_pass}"  
  38.            nocache="true"  
  39.            todir="./"/>  
  40.    
  41.         <echo msg="Creating archive..." />  
  42.         <delete file="./dist.tar.gz" />  
  43.         <tar destfile="./dist.tar.gz" compression="gzip" prefix="rev_${export_revision}">  
  44.             <fileset dir="./" defaultexcludes="true">  
  45.                 <include name="**" />  
  46.                 <exclude name="**/.svn" />  
  47.             </fileset>  
  48.         </tar>  
  49.     </target>  
  50.    
  51.     <!-- Target: deploy   Upload tar.gz, switch to uploaded revision  -->  
  52.     <target name="deploy" depends="config,build">  
  53.         <foreach list="${web_servers}" param="web_server" target="deploy_one" />  
  54.     </target>  
  55.     <target name="deploy_one">  
  56.         <scp username="${web_server_user}" password="${web_server_pass}"  
  57.                 host="${web_server}" todir="${project_home}/revs"  
  58.                 file="./dist.tar.gz" />  
  59.    
  60.         <ssh username="${web_server_user}" password="${web_server_pass}"  
  61.                  host="${web_server}"  
  62.                  command="cd ${project_home}/revs; tar zxf dist.tar.gz; rm dist.tar.gz;" />  
  63.    
  64.         <ssh username="${web_server_user}" password="${web_server_pass}"  
  65.                  host="${web_server}"  
  66.                  command="rm -f ${project_home}/current; ln -s ${project_home}/revs/rev_${export_revision} ${project_home}/current" />  
  67.     </target>  
  68.       
  69.     <!-- Target: switch    Switch current revision  -->  
  70.     <target name="switch" depends="config">  
  71.         <foreach list="${web_servers}" param="web_server" target="switch_one" />  
  72.     </target>  
  73.     <target name="switch_one">  
  74.         <ssh username="${web_server_user}" password="${web_server_pass}"  
  75.              host="${web_server}"  
  76.              command="ls -al ${project_home}/revs" />  
  77.         <input propertyname="revision">Revision to set as active:</input>  
  78.         <ssh username="${web_server_user}" password="${web_server_pass}"  
  79.              host="${web_server}"  
  80.              command="rm -f ${project_home}/current; ln -s ${project_home}/revs/rev_${revision} ${project_home}/current" />   
  81.     </target>  
  82.       
  83.       
  84.     <!-- Target: update_deps  Update server setting by execute scripts(database, crontab, restart service, etc.)  -->  
  85.     <target name="update_deps" depends="config">  
  86.         <foreach list="${web_servers}" param="web_server" target="update_deps_one" />  
  87.     </target>  
  88.     <target name="update_deps_one">  
  89.         <ssh username="${web_server_user}" password="${web_server_pass}"  
  90.              host="${web_server}"  
  91.              command="cd ${project_home}/current; sudo cp crontab /etc/cron.d/ucenter" />  
  92.         <ssh username="${web_server_user}" password="${web_server_pass}"  
  93.              host="${web_server}"  
  94.              command="cd ${project_home}/current; php app/scripts/migration.php" />  
  95.         <input propertyname="confirm_sql">Confirm database migration sql script(yes|no):</input>  
  96.         <if>  
  97.             <equals arg1="${confirm_sql}" arg2="yes" />  
  98.             <then>  
  99.                 <ssh username="${web_server_user}" password="${web_server_pass}"  
  100.                      host="${web_server}"  
  101.                      command="cd ${project_home}/current; php app/scripts/migration.php execute" />  
  102.             </then>  
  103.         </if>  
  104.     </target>  
  105. </project>  
详细的文档还是看官方吧:http://www.phing.info/trac/wiki/Users/Documentation,我目前是在利用phpstorm的phing进行测试,但事实上还不如直接用命令行罢了,自从phpstorm升到6之后,对于一些可执行文件都开始用phar进行封装了。这是一件好事。
 
为了更好的使用phing,还是需要把文档看完的:http://www.phing.info/docs/guide/stable/,事实上phing在几年前就准备开始尝试了,但最终都没有正式在项目里使用。为了以后更好的管理和发布项目,想了想,还是先试一下。
事实上,我是想将一份代码分发到N台服务器,所以我最近在做不停的尝试。。。也考虑过用git进行分发,只是还没有开始罢了。估计下一步就会用git进行测试了

Tags: phing

淘宝客程序中获取图片尺寸

 在sablog上看到淘宝客图片的尺寸,还有,在各种各样的网站上都看到了一些尺寸,其实,这些都是大家在摸索

然而,官方早就有了文档,只是我们没有看到罢了。比如在这里:http://www.taobao.com/market/market/mobile/yuanjin.php?spm=0.0.0.0.Zz1B0Y,点击【获取图片】,你会发现,原来官方提供了N个尺寸,
XML/HTML代码
  1. 淘宝后台的图片尺寸规格如下:  
  2. ZoomAddType _80x40.jpg 84(代表相素为80*40)以下类似  
  3. ZoomAddType _60x30.jpg 63  
  4. ZoomAddType _300.jpg 300  
  5. ZoomAddType _81x65.jpg 81 65  
  6. ZoomAddType _110x90.jpg 110 90  
  7. ZoomAddType _24x24.jpg 24  
  8. ZoomAddType _30x30.jpg 30  
  9. ZoomAddType _40x40.jpg 40  
  10. ZoomAddType _60x60.jpg 60  
  11. ZoomAddType _70x70.jpg 70  
  12. ZoomAddType _80x80.jpg 80  
  13. ZoomAddType _100x100.jpg 100  
  14. ZoomAddType _110x110.jpg 110  
  15. ZoomAddType _120x120.jpg 120  
  16. ZoomAddType _160x160.jpg 160  
  17. ZoomAddType _170x170.jpg 170  
  18. ZoomAddType _250x250.jpg 250  
  19. ZoomAddType _310x310.jpg 310  
  20. ZoomAddType _670x670.jpg 670  
  21. ZoomAddType _620x10000.jpg 620 10000  
这时候,你是什么情况?有没有和你的小伙伴一样都惊呆了?嗯,我在网上看到的这些:
XML/HTML代码
  1. 缩图常见尺寸:  
  2.   
  3.   _40x40.jpg  
  4.   _70x70.jpg  
  5.   _100×100.jpg  
  6.   _120x120.jpg  
  7.   _160x160.jpg  
  8.   _320x320.jpg  
  9.   _480x480.jpg  
  10.   _600x600.jpg  
  11.   _sum.jpg(缩略图专用,其实是80x80)   
  12.   _b.jpg(大图专用,220x220)  
和上面的尺寸不太一样,不过也差不多了,做一个merge吧。
 
获取淘宝图片的方法如下:
 
大小: 42.1 K
尺寸: 500 x 352
浏览: 1734 次
点击打开新窗口浏览全图
不算太复杂吧?
 
 
 
 

Tags: 淘宝客

python的八荣八耻

 不要惊讶我将它放到PHP分类里,这是我在啄木鸟社区上看到的,看看那些在python上坚持了这么多年的人,在学习领会胡主席的八荣八耻后,对自己的要求:

以动手实践为荣 , 以只看不练为耻; 以打印日志为荣 , 以单步跟踪为耻; 以空格缩进为荣 , 以制表缩进为耻; 以单元测试为荣 , 以人工测试为耻;  以模块复用为荣 , 以复制粘贴为耻; 以多态应用为荣 , 以分支判断为耻; 以Pythonic为荣 , 以冗余拖沓为耻; 以总结分享为荣 , 以跪求其解为耻;

原文地址在:http://wiki.woodpecker.org.cn/moin/Py8Rong8Chi

我是觉得可以适用于任何语言。当然pythonic之类的就需要套用自己当前语言了。

Tags: python

升级 金价实时查

【写了一半,一个手势向左,回到了上一页,写的内容全没了,我晶】

 

这个【金价实时查】最初是为我老婆做的,买了点纸黄金,让她能够看看,本来是有个纸黄金网站的,但是那是flash的手机没法看。所以就采用了数据抓取的方式来获取这些数据
嗯,初期的时候很简单,第一版只有黄金,后来加了白银。可惜这个工具并没有让她赚钱,反而现在亏了NNN多。。你懂的。。。
为了适配iphone的屏幕,我采用了bootstrap,因为我偷懒了,但发现bootstrap的CSS要100多K,jquery又要100多K,为了这点东西,要加载这么多的代码,好象不太合算啊?
所以我尝试了index.manifest这个玩意,也用了html5的localStorage,因为我是这么想的,我的数据5分钟才更新,如果他关闭了再打开,在1分钟之内,就不应该再请求网络了嘛。
于是,折腾了很久,为了index.manifest,因为他默认连当前页也缓存了,所以我的一些更新都没有办法体现出来苦逼。
但最后参考了一些网站,用iframe来处理了,希望有用,不过我后面还是准备放到首页的index.manifest,其他数据用tmpl来加载。。放到下一版了
 
原来很多想做的功能,到现在都没有做的:
1、微博定期发布
2、转发到朋友圈之类
3、发短信通知好友或自己
4、预警短信(设置一个值,定义百分点)
5、其他。。。。
 
欢迎用手机访问 http://ixyz.sinaapp.com ,看一下黑黑

转:如何设计一个优秀的API

 说起来,提供API供客户端调用,已经都做了两年多了,这两年多里,辛酸泪一把,API上线后,随着客户端版本的不停升级,功能越做越多,API越来越复杂,这时候,你TMD还得兼容旧系统,一点点的累积,过了半年,一看,还有N多人在用旧系统,想死的心都有了。开新接口?旧接口就不管了?这也不是一个办法。。。

所以,看到这篇文章的时候,我转一下,顺便自己也学一下,别人说的不一定就是对的,偏听则暗,兼听则明嘛 。(作者提供的API和我提供的不算一致,但也差不了很多,原来。。。。都是两年多,被这两年折腾的吧?)

原文来自:http://www.biaodianfu.com/how-to-design-a-good-api.html

到目前为止,已经负责API接近两年了,这两年中发现现有的API存在的问题越来越多,但很多API一旦发布后就不再能修改了,即时升级和维护是必须的。一旦API发生变化,就可能对相关的调用者带来巨大的代价,用户需要排查所有调用的代码,需要调整所有与之相关的部分,这些工作对他们来说都是额外的。如果辛辛苦苦完成这些以后,还发现了相关的bug,那对用户的打击就更大。如果API经常发生变化,用户就会失去对提供方失去信心,从而也会影响目前的业务。

但是我们为什么还要修改API呢?为了API看起来更加漂亮?为了提供更多功能?为了提供更好的性能?还是仅仅觉得到了改变了时候了?对于用户来说,他们更愿意使用一个稳定但是看起来不那么时髦的API,这并不意味着我们不再改进API了。当糟糕的API带来的维护成本越来越大时,我想就是我们去重构它的时候。

如果可以回头重新再做一遍,那么我心目中的优秀的API应该是怎么样的?

判断一个API是否优秀,并不是简单地根据第一个版本给出判断的,而是要看随着时间的推移,该API是否还能存在,是否仍旧保持得不错。槽糕的API接口各种各样,但是好的API接口对于用户来说必须满足以下几个点:

  • 易学习:有完善的文档及提供尽可能多的示例和可copy-paste的代码,像其他设计工作一样,你应该应用最小惊讶原则
  • 易使用:没有复杂的程序、复杂的细节,易于学习;灵活的API允许按字段排序、可自定义分页、 排序和筛选等。一个完整的API意味着被期望的功能都包含在内。
  • 难误用:对详细的错误提示,有些经验的用户可以直接使用API而不需要阅读文档。

而对于开发人员来说,要求又是不一样的:

  • 易阅读:代码的编写只需要一次一次,但是当调试或者修改的时候都需要对代码进行阅读。
  • 易开发:个最小化的接口是使用尽可能少的类以及尽可能少的类成员。这样使得理解、记忆、调试以及改变API更容易。

如何做到以上几点,以下是一些总结:

1、 面向用例设计

如果一个API被广泛使用了,那么就不可能了解所有使用该API的用户。如果设计者希望能够设计出被广泛使用的API,那么必须站在用户的角度来理解如何设计API库,以及如何才能设计出这样的API库。

2、 采用良好的设计思路

在设计过程中,如果能按照下面的方式来进行设计,会让这个API生命更长久

  • 面向用例的设计,收集用户建议,把自己模拟成用户,保证API设计的易用和合理
  • 保证后续的需求可以通过扩展的形式完成
  • 第一版做尽量少的内容,由于新需求可以通过扩展的形式完成,因此尽量少做事情是抑制API设计错误的一个有效方案
  • 对外提供清晰的API和文档规范,避免用户错误的使用API,尤其是避免API(见第一节)靠后级别的API被用户知晓与误用

除此之外,下面还列出了一些具体的设计方法:

  • 方法优于属性
  • 工厂方法优于构造函数
  • 避免过多继承
  • 避免由于优化或者复用代码影响API
  • 面向接口编程
  • 扩展参数应当是便利的
  • 对组件进行合理定位,确定暴露多少接口
  • 提供扩展点

3、 避免极端的意见

在设计API的时候,一定要避免任何极端的意见,尤其是以下几点:

  • 必须漂亮(API不一定需要漂亮)
  • API必须被正确地使用(用户很难理解如何正确的使用API,API的设计者要充分考虑API被误用的情况:如果一个API可能会被误用,那么它一定会被误用)
  • 必须简单(我们总会面临复杂的需求,能两者兼顾的API是更好的API)
  • 必须高性能(性能可以通过其他手段优化,不应该影响API的设计)
  • 必须绝对兼容(尽管本文一直提到如何保证兼容,但是我们仍然要意识到,一些极少情况下会遇到的不兼容是可以容忍的)

4、 有效的API评审

API设计完成以后,需要经过周密的设计评审,评审的重点如下:

  • 用例驱动,评审前必须提供完善的使用用例,确保用例的合理性和完备性。
  • 一致性,是否与系统中其他模块的接口风格一致,是否与对称接口的设计一致。
  • 简单明了,API应该简单好理解,容易学习和使用的API才不容易被误用,给我们带来更多的麻烦。
  • API尽可能少,如果一个API可以暴露也可以不暴露,那么就不要暴露他,等到用户真正有需求的时候再将它成为一个公开接口也不迟。
  • 支持持续改进,API是否能够方便地通过扩展的方式增加功能和优化。

5、 提高API的可测试性

API需要是可测试的,测试不应依赖实现,测试充分的API,尤其是经过了严格的“兼容性整合测试”的API,更能保证在升级的过程中不出现兼容性问题。兼容性整合测试,是指一组测试用例集合,这组测试用例会站在使用者的立场上使用API。在API升级以后,再检测这组测试用例是否能完全符合预期的通过测试,尽可能的发现兼容性问题。

6、 保证API的向后兼容

对于每一个API的设计者来说,都渴望做到“向后兼容”,因为不管是现在的API用户,还是潜在的API用户,都只信任那些可兼容的API。但向后兼容有多个层次上的意义,而且不同层次的向后兼容,也意味着不同的重要性和复杂度。

7、 保持逐步改善

过去我们总希望能将现有的“不合理”的设计完全推翻,然后按照现在“美好”的思路,重新设计这个API,但是在一段时间以后,又会碰到一样的状况,需要再推翻一次。 如果我们没有有效的逐步改善的办法,依靠推翻现有设计,重新设计API只能让我们回到起点,然后重现之前的过程。 要有一套行之有效的持续改善的办法来在API兼容的同时,改善API使之更好。

8、 把握API的生命周期

每一个API都是有生命周期的,我们需要让API的生命周期更长,并且在API的生命周期结束时能让其平滑的消亡。

  • 告诉用户我们是如何设计的,避免误用,提供指导,错误的使用往往是缩短API寿命的一大杀手
  • 提供试用期,API不可能一开始就是稳定,经过试用的API才能有更强的生命力
  • 为API分级:内部使用;二次开发使用;开发或试用中;稳定;弃用API。避免API被滥用的同时,我们可以通过调整API的级别,来扩大其影响力,也能更优雅的结束一个API的生命周期。

开发API的过程其实就是一个沟通交流的过程。沟通的双方就是API用户和API设计者。

9、 一些具体的实施方案

在一个API不可避免要消亡或者改变的时候,我们应该接受并且面对这个事实,下面列举了几种保证兼容性的前提下,对API进行调整的办法:

  • 将API标记为弃用,重新建立一个新的API。如果一个API不可避免要被消亡,这是唯一的办法。
  • 为其添加额外的参数或者参数选项来实现功能添加
  • 将现有API拆成两部分,提供一个精简的核心API,过去的API通过封装核心API上实现。这通常用于解决用户需要一个代码精简的版本时。
  • 在现有的API基础上进行封装,提供一个功能更丰富的包或者类

一些好的API示例:

  1. Flickr API,这里是文档的示例,同时提供了一个非常方便的API测试工具
  2. Mediawiki API
  3. Ebay API,这里有一个非常详尽的文档示例
----EOF---
总之,尽信书则不如无书,借鉴一下总还是没错的