人人网的开源框架paoding-rose(2) 上次写过rose,说到文档不全,其实不是文档不全,而是我没有细细看,文档还是写的很详细的,而且源码注释很规范,加上源码注释和文档,rose框架还是很容易的掌握的。 在安全性设计上面打算采用spring security来实现的,把spring security集成到系统用了几天的时间,这样系统就是spring + spring security + rose的设计了。 其中的遇到的问题是spring security 需要配置自己的过滤器,而在rose的系统中只需要配置一个过滤器,配置两个过滤器就出抛出已经有过滤器的异常,我把spring security的过滤器去掉了,只配置了一个rose的过滤器,再按照配置spring security的方式配置好了。在配置过程中,就是一个不断尝试,试着配出来的。 配置好了,就是项目启动不再出现异常情况,运行也不报错了。可预期的结果并不是我要的结果。我过滤的方式是通过url来控制权限的,spring security对正常的url是可以进行控制的,对pathinfo格式的url就不能做控制。这个问题纠结了好久,我还询问过开发rose框架的作者,他给我的解释是rose本身就是一个独立的context,它的parent是root context,这样说来,rose就和spring security是属于两个context了,当然不能控制了。 根据日志记录,这样的解释说不过去,从日志记录中,spring security对url都是做过滤的,首先是rose对url进行过滤,接着是spring security进行过滤。在看rose源码的时候,有这样的一段注释。“如果一个请求在Rose中没有找到合适的类来为他服务,Rose将把该请求移交给web容器的其他组件来处理。” 这样才能解释通道理,也可以和日志记录对应起来。rose先做了处理,无法处理的时候才交给其他容器做处理的。 我想尝试先让spring security先来处理,这样处理之后,spring security却不会请求交给rose来处理,这块尝试了好久,没有找到解决的办法,最终只跟踪到spring security中的一个异常对象,在rose处理了,就不会把异常抛出,这个也是spring security不能处理rose请求的原因的。结果是我解决不了,引入spring security就放弃了。 引入spring security我是想偷工的,没有偷成。反过来也想想,引入了新框架进来,就会增加系统的负担,我还是希望系统轻巧一点。 可安全性总是要做的,了解spring security的原理,同理写一个了。spring security是按照面向切面的思路,通过过滤器来实现的。rose的过滤器很好用,不仅可以设置过滤器,还可以设置局部和全局的过滤器,还可以设置过滤器的权重,满足什么时候,什么场景,采用什么过滤器。 我写的基本可以用起来,满足了我的基本要求了。现在也仅仅是满足需求,对一些漏洞还需要继续的修补。
nginx和tomcat的集成笔记在php下面,php+mysql+apche称之为黄金搭配,apache作为官方的web服务器,用户相当的多!在nginx出现之后,以绝对的高性能抢夺了大家的眼球,这些都是网络上说的。不过至少,有很多大型的网站都在用,比如新浪、搜狐、腾讯、豆瓣、人人等等等。我本来是打算采用php+nginx做为架构的,时间、能力不允许啊!还是回归自己的路了,tomcat当然是首选的服务器,数据库当然是mysql。这几个月,有些顺了,最近有些偏离轨迹,工作没做好,今天挨批了,认错。人啊!在顺一点的时候,真会忘乎所以的!受点打击是好事,能清醒不少!扯远了!还是继续原来的话题。我分别在win2008 和虚拟机ubuntu10.10上面搭建了nginx-0.9.6+tomcat-7.0.11的服务器,这样,还可以做负载均衡!win下面nginx-0.9.6+tomcat-7.0.11的搭建在http://nginx.org/en/download.html下载nginx,zip格式的是win平台的,tar.gz格式的是linux平台的解压之后,在DOS下面直接使用D:serverginx-0.9.6ginx.exe,就可以启动nginx,默认是80端口,打开http://localhost/ 就能看到nginx的欢迎界面!tomcat7依旧使用D:serverapache-tomcat-7.0.11instartup.bat启动,默认8080端口,打开http://localhost:8080/ 就能看到tomcat的欢迎界面!我的目的是能够实现就行,具体的一些细节配置信息,要根据时间的环境再配置。我的额配置如下:打开D:serverginx-0.9.6confginx.conf内容worker_processes 1;events {worker_connections 1024;}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream tomcat_server {server localhost:8080;}server {listen 80;server_name localhost;location / {proxy_set_header Host $host;proxy_set_header X-Forwarded-For $remote_addr;proxy_pass http://tomcat_server;index index.html index.htm index.jsp;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}}完成,重启一下tomcat和nginxnginx的停止命令:D:serverginx-0.9.6ginx.exe -s stop再次打开http://localhost/ 就打开的tomcat的欢迎页面了,http://localhost:8080/ 也是可以访问的。ubuntu下面nginx-0.9.6+tomcat-7.0.11的搭建对了,我使用的jdk是1.6的版本,取当前最新版的稳定版本,安装jdk并且配置好环境变量,tomcat解压后,修改tomcat-7.0.11/bin/startup.sh的权限,简单就使用sudo chmod 777 *,其实这些shell脚本有可执行的权限就可以了。这时启动startup.sh,打开http://192.168.128.131:8080/ 就是tomcat的界面了,我的ubuntu的虚机ip是192.168.128.131,把防火墙关闭了。在linux下面安装软件就是麻烦,可能这就是证明是技术N人的方法吧!下载的linux下的nginx是二进制文件,需要编译,才能安装的,这样也稳定。解压nginx-0.9.6.tar.gz,进入nginx-0.9.6,开始编译sudo ./configure编译 很有可能出错,缺少依赖库,会有提醒的,根据提醒安装就行。我在ubutnu上面搭建了git服务器,现在只缺少g++,使用命令sudo apt-get install g++ 就可以安装好了。我之前配置过apache,apache使用的也是80端口,和nginx冲突,看修改端口,我嫌麻烦,就直接卸载了。sudo apt-get remove apahce2卸载之后,可能会有一些遗留无用的,使用sudo apt-get autoremove 可以自动卸载还需要PCRE的支持,在 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下载就可以,我用的是8.02的版本,其实最新版是8.12的,他们的排序有问题,这个能用就行了。PCRE也是二进制文件,需要编译安装。解压pcre-8.02.tar.gz 进入pcre-8.02 快的话,可以用sudo ./configure && make && make install 一次搞定,我习惯一句一句执行,这样可以看看编译情况。PCRE好了之后,就开始编译nginx了,命令依旧可以用 sudo ./configure && make && make install使用sudo /usr/local/nginx/sbin/nginx 来启动nginx,打开http://192.168.128.131 就能看到nginx的欢迎页面。使用sudo /usr/local/nginx/sbin/nginx -s stop 来停止nginx。开始配置文件,我是把win下面的配置copy过来的。用sudo /usr/local/nginx/sbin -t 可以验证配置文件是否正确用sudo /usr/local/nginx/sbin/nginx 启动nginx,就可以发现这个时候,这次打开是tomcat的欢迎界面了!今天的任务就算是完成了!还有一些遗憾是,因为安装的时候,nginx用的是root权限编译安装的,tomcat用的是普通管理员,最后不能把tomcat和nginx作为开机的自动启动项。应该是可以设置的,今天的目的已经完成,暂时就作为手动启动额吧!现在操作linux,我都是使用ssh来完成的,现在公司里面,登录ssh后都有一些欢迎信息,还把一些常用的命令、目录打印了出来,方便使用,我也把tomcat和nginx的命令整理了出来,修改的方法如下:1.编辑 vi /etc/issue.net2.vi /etc/ssh/sshd_config 找到 #Banner /some/path 并修改。去掉#号的注释,然后把路径指向 /etc/issue.net 这个文件。改为:Banner /etc/issue.net3.重启 sshd服务或者重启机器,就能看到欢迎信息了我的 /etc/issue.net 内容Welcome to dapeng.metomcat7 /apps/tomcat-7.0.11/bin/startup.sh/apps/tomcat-7.0.11/bin/shutdown.shnginx sudo /usr/local/nginx/sbin/nginxsudo /usr/local/nginx/sbin/nginx -s stop注意:在ubuntu下面执行脚本或者命令,在脚本或者命令前加sudo
本来是打算找一个模板直接使用的,没有找到到合适的,自己写好麻烦的啊!很早就知道960css的这个框架了,趁这个机会学学,找到一篇比较容易入门的基础,推荐阅读。 CSS框架已经出现很长时间了,关于这些框架的用处也被我们讨论了很多遍了。有人说,CSS框架不够先进,还有人说这些框架大大的节省了他们的开发时间。在此,我们将不再讨论这个问题。 前段时间,我了解到了CSS框架。经过对Malo、BluePrint和960做了实验对比后,我得出一个结论:我最喜欢960CSS框架。 本教程将解释这个框架的基本原理,这样你就可以用960来快速进入开发。 基本原理 你必须知道一些基本原理来“学习这个框架是如何工作的”。你可以通过实验(或者是用firebug)来学习它,不过我也将会在这里为你介绍它。让我们开始吧。 不要编辑960.css文件 首先是一个小提示:不要编辑960.css文件,否则,将来你将不能更新这个框架。因为尽管我们需要布局我们的HTML,我们将创建一个独立的CSS文件。 加载网格 因为我们可以使用一个外部文件的CSS代码,我们必须在我们的HTML网站中加载它们,我们可以通过以下代码来实现: <link rel=”stylesheet” type=”text/css” media=”all” href=”path/to/960/reset.css” /> <link rel=”stylesheet” type=”text/css” media=”all” href=”path/to/960/960.css” /> <link rel=”stylesheet” type=”text/css” media=”all” href=”path/to/960/text.css” /> 这些做好了之后,我们必须添加我们自己的CSS文件。例如,你可以叫这个文件为style.css或site.css或者其它任何名字。用下面代码引用这个文件: <link rel=”stylesheet” type=”text/css” media=”all” href=”path/to/style.css” /> 容器 在960框架中,你可以选择名为.container_12和.container_16的两个容器class。他们都是960px的宽度(这就是为什么叫960),它们的不同是分的列数不同。.container_12被分割为12列,.container_16被分割为16列。这些960px宽的容器是水平居中的。 网格/列 有很多列宽可供选择,而且在这两个容器里,这些宽度也不相同。你可以通过打开960.css文件来查看这些宽度。但是这对于设计一个网站来说是不必要的。有一个小技巧可以让这个框架更加易用。 比如,你想要在你的容器里建两列(叫sidebar/content)。你可以这样做: <div class=”container_12″> <div class=”grid_4″>sidebar</div> <div class=”grid_8″>main content</div> </div> 可以看到,你的第一列(grid_4)的数字加上第二列(grid_8)的数字正好是12。也就是说,你不必知道每一列的宽度,你可以选择列宽通过一些简单的数学计算。 如果我们要建一个4列的布局,代码可以是这样的: <div class=”container_12″> <div class=”grid_2″>sidebar</div> <div class=”grid_6″>main content</div> <div class=”grid_2″>photo’s</div> <div class=”grid_2″>advertisement</div> </div> 正如你所看到的那样,这个系统依然很完美。但是如果你想使用嵌套的列的话,你会发现它是有问题的。比如,如果后面三列都属于content列: <div class=”container_12″> <div class=”grid_2″>sidebar</div> <div class=”grid_10″> <div class=”grid_6″>main content</div> <div class=”grid_2″>photo’s</div> <div class=”grid_2″>advertisement</div> </div> </div> 你会发现这错位了,不过不用着急,这正是我们下一节要说的。 间距 默认情况下,每列之间都有间距。每一个grid_(这里代表数字)class左右都有10个像素的间距。也就是说,两列之间,总共有20px的间距。 20px间距对创建一个有足够宽的空白间距的布局来说是很棒的,它可以让一切看起来很自然。这也是我喜欢使用960的原因之一。 在上面的例子中,我们遇到了个问题,现在我们就来解决它。 问题是,每一列都有左右边距。而嵌套的三列中,第一列和最后一列是不需要边距的,解决方法是: <div class=”container_12″> <div class=”grid_2″>sidebar</div> <div class=”grid_10″> <div class=”grid_6 alpha”>main content</div> <div class=”grid_2″>photo’s</div> <div class=”grid_2 omega”>advertisement</div> </div> </div> 我们可以简单的添加”alpha“样式来去掉左边的间距,添加“omega”样式来去除右边的间距。这样我们刚刚创建的这个例子在任何浏览器里面就很完美了(当然包括IE6)。 样式 好了,你现在已经完全了解如果用960框架来创建一个网格布局的基本原理了。当然,我们也可以添加一些样式到我们的布局中。 <div class=”container_12″> <div id=”sidebar” class=”grid_2″>sidebar</div> <div id=”content” class=”grid_10″> <div id=”main_content” class=”grid_6 alpha”>main content</div> <div id=”photo” class=”grid_2″>photo’s</div> <div id=”advertise” class=”grid_2 omega”>advertisement</div> </div> </div> 因为CSS使用特性来确定哪一个样式声明具有高于其它样式的优先级。”id“比class更重要。 用这种方法,我们可以在自己的文件中重写那些被class设定的规则(比如宽度,padding,边框等)。 我也添加一些样式,它们整整花费了我5分钟来整理整个例子。查看示例的源代码和样式声明。. 搞定 就这样。你已经学习了如果使用960框架来建立跨浏览器兼容性和整洁的布局了。当你完全掌握了960框架后,你将大大地减少编写CSS的时间。 如果你还不理解,研究一下示例吧。 我留给你的问题: 你使用960CSS框架吗?或者你使用其它框架?你认为框架可以帮你提升你的代码吗? Translate From: divitodesign 来源:http://www.qianduan.net/960css-the-framework-of-the-basic-principles-of.html
php框架也是多多,了解一些mvc就能吹说写出一个什么样的框架,有了学java的经验,我在选择框架的时候,直接是在php比较专业的论坛中看大家的推荐,推荐的都比较多,也各有特点,我着重看了zend、codeigniter、thinkphp的架构和使用。 zend是官方的产品,完全的oop设计,作为企业开发的首选。 codeigniter轻巧简便,很轻量级。 thinkphp国产货,也是轻便灵巧的路。 都属于精品吧!zend作为的官方的产品,市场上面肯定有他的份额存在,而作为快速开发,还是有些臃肿了。codeigniter很灵便,看网站的介绍,也有很多成功的网站案例,毕竟外国货,虽说有全套的中文文档,还是少些。thinkphp灵巧,中文的文档也多,在功能上面也不逊色与codeigniter,比较推荐爱国者使用。
这里我并不说是axis1和axis2的什么不同,只是最近接触到了axis1和axis2的应用而已。 情况是这样滴。 公司的系统架构是公司外部系统的接口交互都要走公司的接口层,再由接口层将信息透传给公司内部的各个系统。 接口层使用axis2来架构,我这块的接口部分是使用axis1架构的,这个框架用了好几年,相当的成熟,看代码中的注释,最早的有02年写的代码,听说是很早那一批海归写的。 按理来说,高版本一般都会是兼容低版本的,况且对于axis来说,只要是标准的wsdl就可以,可还是有些区别的。 我使用axis1可以正常调用和返回,接口层可以调用也可以返回,看日志,调用的输入和输出都是正常,可在接口层那边就是取不到数据。同事和我整整查了一中午问题,公司对接口很厉害的高手也没有个办法。 最后,还是用最底层的办法来查,webService的本质还是xml,查看输入和输出的xml,输入没有什么问题,输出还是发现了一些端倪。 作为一个返回对象,属性内容是包含在ns的标签中的,在我们输出的xml文件中,ns标签标签中出现的是mutilhref="#01" ,在ns的标签外面,有个#01的标签,在#01中包含着输出的内容。接口层使用的是axis2取数据是从ns的标签中取的,当然是取不到标签外的值,axis1是可以取到的。 让接口层改用axis1,为了保持整个框架的统一,肯定不能改,我们改成axis2,时间不允许。有问题就google、baidu了,最近google搜索,都是搜索的繁体或者英文,简体的好些不是很方便,有时google还打不开,有些厌恶baidu的搜索了,现在用有道多一些。对于axis1和axis2的这个问题,整个网络上面,就只有一个09年的帖子提到,让关闭一些wsdd中globalConfiguration的sendMultiRefs设置为flase。 设置为false之后,再次调用,ns标签外的对象就被包含在ns中,不会采用引用的方式了。 在http://axis.apache.org/axis/java/reference.html有几个配置的解释,没看到有中文的解释,按照我自己的理解,意译下。 sendMultiRefs true/false flag to control whether multirefs are sent or not. 是否使用引用对象的方式 sendXMLDeclaration true/false flag to control whether the <?xml?> declaration is sent in messages 是否包含xml头文件的信息 sendXsiTypes true/false flag to enable/disable sending the type of every value sent over the wire. Defaults to true. 是否在每个值中都标注值的类型参数
最近公司在搞封闭开发,其实也就是把相关的几个部门的人集中在一起做开发,这样很便于交流。公司要求加班,这次的加班的报酬还算不错,让人有些能加班就有钱的欲望。不过,这钱是一方面,另外一方面是要有干活的激情。这一方面,我觉得公司很差劲,让人觉得是这就是一场买卖,我干活,你给我钱,给不了人一种归属感,有谁会很有心的用干啊! 我很佩服之前公司的老板,本来就是做销售出身,换了好几十个工作,阅历丰富。和他聊天,如果脑子不清晰点,就会被他进去,但说的都是很有道理,而且,说起来,会让人很兴奋。在公司打硬仗的时候,他的勇气论很受用,每个人都能拼了命的去做,这点也就是现在我所在公司缺少,我现在还没发现有哪个人有这样的能力。 这几天每天都是2点了才睡觉,每天我都是想着早点睡的。晚上回来都快10点了,再稍微先乱整一下,就11点了,再想看点东西、写点东西,就过12点了。现在有点自己的想法,就想快点去做,每天都在逼自己,先把这段时间忙过完吧!忙完,一定要出去转转。前几天在看TYPECHO的源码,其中有说到,采用组件的模式,在基本完整的看完TYPECHO的源码后,需要纠正一下我的观点,TYPECHO采用的WIDGET的方式,MVC的模式在主题中还是使用的,一个稍有架构的系统,最起码的要求应该就是UI层和逻辑层的分离。本来是打算自己用PHP写一套适用于自己的框架的,在研究TYPECHO后,这个对我这个半路出家的PHPER来说,还是有相当的难度的,考虑后,决定使用一些框架来做吧!看过一些PHP的框架,thinkphp、 codeigniter、zend framework还有一些其他的,各有特色吧!我的选择是简单、能快速上手、扩充性好的,如果能在性能上也有优势,那就更好了!