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

IE中iframe跨域丢失Session问题(续 p3p)

P3P,不算是新名词,但还是有些人不清楚。事实上我也不清楚。。。在百度上看到有这玩意就备份下来。说真的,我只是知道用,但不知道为什么用。额。。很明显,因为在ucenter同步的时候,在discuz的ui/api里有写过。

看内容吧。。。。

IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification)协议默认阻止第三方无隐私安全声明的cookie,Firefox目前还不支持P3P安全特性,firefox中自然也不存 在此问题了。

在frameset里面,也就是里面的frame是来自第三方站点(不同IP或不同域名),那么默认情况下IE会自动禁用这些站点的cookie, 也就是在请求某url时在HTTP header里不发送它们的cookie,包括session的cookie。注意,这些站点在response里面设置的cookie还是会被发送到浏 览器的。

在用户浏览a.php时 A.com写入的为第一方Cookie,其嵌入的iframe指向 b.php.这时B.com写入的就为第三方Cookie了,所以它是被IE当在了大门外。 所以,每次当用户提交的cookie提交时,就挂掉了.因为传不到真实的服务器.

解决方案.

PHP程序,可以直接在B网站中写入www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z

PHP代码
  1. <?php  
  2. header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');  
  3. ?>  
这样就能接受第三方的Cookie啦。

 

lighttpd的服务器

XML/HTML代码
  1. server.modules    = ("mod_setenv")  
  2. setenv.add-response-header = ( "P3P" => "CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR'")  
apache的服务器

XML/HTML代码
  1. <VirtualHost>  
  2. Header set P3P 'CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'  
  3. </VirtualHost>  
IIS的服务器www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z

增加一个网站http头来解决问题;www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
管理工具——〉选择一个网站——〉属性——〉 http头,增加一个http头www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
然后输入头名:P3Pwww.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
输入头内容:CP=CAO PSA OUR

jsp页面:

XML/HTML代码
  1. <%  
  2. response.setHeader("P3P","CP=CAO PSA OUR");  
  3. %>  
java代码最简单的办法,增加一个filte:
Java代码
  1. public class TransNameFilter extends HttpServlet implements Filter {  
  2. private static org.apache.commons.logging.Log logWriter =  
  3.    LogFactory.getLog(TransNameFilter.class.getName());  
  4.   
  5. /** 
  6. * 
  7. */  
  8. public TransNameFilter() {  
  9.    super();  
  10.   
  11. }  
  12. /* (非 Javadoc) 
  13.    * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) 
  14.    */  
  15. public void init(FilterConfig arg0) throws ServletException {  
  16.   
  17. }  
  18.   
  19. /* (非 Javadoc) 
  20. * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) 
  21. */  
  22. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  
  23.    throws IOException, ServletException {  
  24.   
  25.    HttpServletRequest hreq = (HttpServletRequest) request;  
  26.    String transName = hreq.getParameter("transName");  
  27.    if (Util.isNullOrEmpty(transName)) {  
  28.     logWriter.fatal(" there is no transName for this request");  
  29.    } else {  
  30.   
  31.     logWriter.info(" transName is " + transName);  
  32.    }  
  33.     
  34.    HttpServletResponse res = (HttpServletResponse) response;  
  35.         //iframe引起的内部cookie丢失  
  36.    res.setHeader("P3P","CP=CAO PSA OUR");  
  37.    if (chain != null)  
  38.     chain.doFilter(request, response);  
  39.   
  40. }  
  41.   
  42. /* (非 Javadoc) 
  43.    * @see javax.servlet.Filter#destroy() 
  44.    */  
  45. public void destroy() {  
  46.   
  47. }  
  48.   
  49. }  

Tags: session, cookie, p3p

JDK最新版本下载及JDK安装与配置

前文就说了,我最近在学scala,于是乎,我用日常我常用的IDE开始装scala插件,结果它告诉我需要安装jdk,一下子有点郁闷,原来,我安装系统时,为了装netbeans,都是装的JRE,因为我仅用来开发PHP。可是现在要JDK了,找不到地方下载呀。虽然我知道,它就在sun.com,但一下子急着找却找不到。

网上连这个都有现成的资料,而且会教你一步一步的配置这东西,这让我想起我在01年左右配置java环境的事情,想不到一下子过去10年了。10年之前我觉得java很复杂,那时候选择了学asp,和PHP,现在,又要走回去了。不过我还是坚持了一下下,没有用java,而的是scala,其实。。。他们两个很相象啊。

“工欲善其事,必先利其器”。进行程序开发,首先要安装开发相关的软件,并且熟悉这些工具软件的基本使用。本章介绍一下两类开发工具的使用,重点是 JDK最新版本以及JDK下载、安装和配置。

基础开发工具

基础开发工具是进行程序设计的基础,包含开发中需要的一些基本功能,例如编译、运行等,是其它开发工具的基础。Java语言的基本开发工具是SUN 公司免费提供的JDK。

实际开发中,为了方便和程序开发的效率,一般不直接使用基础开发工具,所以对于很多基础开发工具,只需要掌握其基本的使用即可。

集成开发环境(IDE)

集成开发环境是指将程序设计需要的很多功能,例如代码编辑、代码调试、程序部署等等一系列功能都整合到一个程序内部,方便程序开发,并提高实际的开 发效率,简化了程序设计中的很多操作。

Java语言的集成开发环境很多,常见的有Eclipse、JBuilder、NetBeans等等。由于实际开发中,基本都是使用集成开发环境进 行开发,所以在学习中必须熟练掌握该类工具的使用。一般集成开发环境的使用都很类似,在学习时只要熟练掌握了其中一个的使用,其它的工具学习起来也很简 单。

本文以Eclipse为例来介绍集成开发环境的基本使用。

JDK开发环境

JDK(Java Developer’s Kit),Java开发者工具包,也称J2SDK(Java 2 Software Development Kit),是SUN公司提供的基础Java语言开发工具,该工具软件包含Java语言的编译工具、运行工具以及执行程序的环境(即JRE)。

JDK现在是一个开源、免费的工具。JDK是其它Java开发工具的基础,也就是说,在安装其它开发工具以前,必须首先安装JDK。
对于初 学者来说,使用该开发工具进行学习,可以在学习的初期把精力放在Java语言语法的学习上,体会更多底层的知识,对于以后的程序开发很有帮助。

但是JDK未提供Java源代码的编写环境,这个是SUN提供的很多基础开发工具的通病,所以实际的代码编写还需要在其它的文本编辑器中进行。其实 大部分程序设计语言的源代码都是一个文本文件,只是存储成了不同的后缀名罢了。常见的适合Java的文本编辑器有很多,例如JCreator、 Editplus、UltraEdit等。

下面依次来介绍JDK的下载、安装、配置和使用。

1 JDK的下载

如果需要获得JDK最新版本,可以到SUN公司的官方网站上进行下载,下载地址为:
http://java.sun.com/javase/downloads/index.jsp
下 载最新版本的“JDK 6 Update 6”,选择对应的操作系统,以及使用的语言即可。

在下载Windows版本时,有两个版本可供下载,,分别是:

Windows Online Installation:在线安装版本,每次安装时都从网络上下载安装程序,在下载完成以后,进行实际的安装。

Windows Offline Installation:离线安装版本,每次安装时直接进行本地安装。通常情况下,一般下载离线安装版本。

其实如果不需要安装JDK最新版本的话,也可以在国内主流的下载站点下载JDK的安装程序,只是这些程序的版本可能稍微老一些,这些对于初学者来说 其实问题不大。

2 JDK的安装

Windows操作系统上的JDK安装程序是一个exe可执行程序,直接安装即可,在安装过程中可以选择安装路径以及安装的组件等,如果没有特殊要 求,选择默认设置即可。程序默认的安装路径在C:\Program Files\Java目录下。

3 JDK的配置

JDK安装完成以后,可以不用设置就进行使用,但是为了使用方便,一般需要进行简单的配置。由于JDK提供的编译和运行工具都是基于命令行的,所以 需要进行一下DOS下面的一个设定,把JDK安装目录下bin目录中的可执行文件都添加到DOS的外部命令中,这样就可以在任意路径下直接使用bin目录 下的exe程序了。

配置的参数为操作系统中的path环境变量,该变量的用途是系统查找可执行程序所在的路径。

配置步骤为:

1、“开始”>“设置”>“控制面板”>“系统”

如果控制面板的设置不是经典方式,那么可以在控制面板的“性能和维护”中找到“系统”。当然,也可以选择桌面上的“我的电脑”,点击鼠标右键,选择 “属性”打开。

2、在“系统属性”窗口中,选择“高级”属性页中的“环境变量”按钮。

3、在“环境变量”窗口中,选择“系统变量”中变量名为“Path”的环境变量,双击该变量。

4、把JDK安装路径中bin目录的绝对路径,添加到Path变量的值中,并使用半角的分号和已有的路径进行分隔。例如JDK的安装路径下的bin 路径是C:\Program Files\Java\jdk1.6.0_04\bin,则把该路径添加到Path值的起始位置,则值为:C:\Program Files\Java\jdk1.6.0_04\bin;C:\Program Files\PC Connectivity Solution\;C:\Program Files\Java\jdk1.6.0_04\bin;C:\j2sdk1.4.2_11\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem
以 上路径在不同的计算机中可能不同。

配置完成以后,可以使用如下格式来测试配置是否成功:
1、 打开“开始”>“程序”>“附件”>“命令提示符”
2、 在“命令提示符”窗口中,输入javac,按回车执行

如果输出的内容是使用说明,则说明配置成功。如果输出的内容是“’javac’不是内部或外部命令,也不是可执行的程序或批处理文件。”,则说明配 置错误,需要重新进行配置。

常见的配置错误为:

1)JDK的安装和配置路径错误,路径应该类似C:\Program Files\Java\jdk1.6.0_04\bin。

2)分隔的分号错误,例如错误的打成冒号或使用全角的分号

--EOF--http://developer.51cto.com/art/200907/134559.htm

Tags: java, jre, jdk, scala, netbeans

2001年以来的数据库技术领域回顾

2001 年对我自己来说,是一个比较重要的时间点--正式踏上工作岗位,也在这一年奠定了以后工作的技术方向。在 2001年,《程序员》杂志经过两期试刊后也已正式创刊。转眼间,杂志即将出版第 100 期,让人心生感慨。自己几年来持续关注数据库技术领域,《程序员》是一份很重要的参考信息来源。这里回顾一下自《程序员》创刊以来的数据库大事,算是一份 纪念,或有谬误,敬请指正。

 

2001

就从 2001 年说起吧, 2001年6月的ORACLE OpenWorld大会中,ORACLE发布了ORACLE 9i。相比上一个主要版本,也就是 Oracle 8i来说,最大的新产品特性就是真实应用集群(Real Application Clusters, RAC)了。ORACLE 9i的RAC在TPC-C的基准测试中打破了数项记录,一时间业内瞩目。刚在上一年发布 SQL Server 2000 的微软在这一年产品上没什么更大的动作,正在积极拼抢市场。而 MySQL 在 1月份发布了 3.23 产品版,给不少开源爱好者以欣喜。

DB2 在这一年产品上没什么亮点,但是以 10 亿美金收购了 Informix 的数据库的事情震动业界。记得自己当时正好有个 Informix 项目要实施,着实看了几天 Informix 技术文档。这一年国内数据库领域的一件值得一提的小事是 ITpub.net 的创建,这个当初看似不起眼的论坛,在随后的几年中涌现出了一大批数据库技术人才,很大程度上在国内普及了 Oracle 数据库技术。

 

2002

IBM 推出DB2数据库V8.1的测试版,估计是还在消化 Infomix 的客户资源,几个月之后正式版才能面试。而 Oracle 与 Sun 庆祝了 20 年的合作伙伴关系。之后,Sun 不复 .com 大潮中的明星范儿,Oracle 因为全力支持 Linux 也与 Sun关系愈加微妙。Oracle Open World 第一次在国内举行,地点是北京,会议规格不低,Larry Ellison 在会上进行了主题演讲,此前,这位软件界的传奇人物已经来过中国数次了。[喜欢IT八卦的人可以搜索一下《IT江湖水也深》这篇文章。]

微软连续第二年没有对 SQL Server 发布新版本。

MySQL 发布 4.0 Beta 版。从 4.0 开始,InnoDB 正式成为 MySQL 的默认引擎。在 InnoDB 的基础上,MYSQL对于事务的处理能力有了极大提升。

 

2003

SQL:2003 发布。这个版本针对 SQL:99 的一些问题进行了改进,支持 XML,支持 Window 函数、Merge 语句等。随着,会看到各大数据库厂商纷纷宣布新的版本中对该标准的支持,这是他们一贯的姿态。

MySQL 4.0 正式发布。在全文索引、嵌入式应用方面得到增强。这个时候的 MySQL 仍然缺乏一些企业级数据库的关键功能。

Oracle 这一年发布了 Oracle 10g, g 代表 Grid ,网格计算。这一年中"网格计算"火爆程度不亚于现在的"云计算",随后的几年,这个网格计算基本上还只存在于专家们的嘴里。所以,去年 Larry Ellison 在会议上对"云计算"表示不屑也是正常之举。在这一年,Oracle 也宣布针对Linux 64位环境的产品准备就绪,接下来的一年里,Oracle 宣称雇佣了近万人的 Linux 相关的开发人员,可谓不惜血本,当然,这些投入在日后得到了超值回报。从技术的角度上看,其贡献也是有目共睹的,在 I/O 能力、进程扩展能力上都作出很大贡献。

雅虎技术人何伟平的一篇《PostgreSQL 昨天,今天和明天》对于 PostgreSQL 的普及起到了很大作用。

 

2004

Danga Interactive 针对 LiveJournal.com 开发的Memcached 经过上一年的高频度发布,在这一年只发布了一个版本,标志着已经进入相对稳定阶段,只可惜养在深闺人未必识。关注者并不多。以此为滥觞,伴随着Web 2.0 的火热,类似的分布式对象缓存系统层出不穷,到现在已经成了各大网站标准配备。Memcached 的出现对于数据库方面相关应用设计也带来了更多思路。

这一年嵌入式数据库 SQLite 迎来了较大发展,版本3 完成开发并发布了稳定版。 这些努力为 SQLLite 获得 2005 Open Source Award 打下很好的基础。

我自己第一次给技术杂志投稿《书写历史的甲骨文》,当然是发在《程序员》。

 

2005

PostgreSQL 8.0 的发布宣告正式开始支持 Windows 平台,成为真正意义上的 Windows 平台数据库(Native Server)。这是 PostgreSQL 发展史上相当重要的一件大事。

微软时隔五年,终于发布了 SQL Server 新版,是为 SQL Server 2005。最大亮点在于对 XML 数据的支持,当时不少技术媒体对此都颇为关注。IBM 发布 DB2 V8.2。

Oracle发布了Oracle10g R2 版本,10g 的 R1 版本稳定性广为诟病,R2版本质量有很大增强,一部分用户终于可以放心一点从 9i 升级到 10g。10月,Oracle 抄了MySQL 后路,将 InnoDB 收归帐下。几年过去回头看,Oracle 此举对 MySQL 影响太大,直到现在,MySQL 也没能自己拥有一个超越 InnoDB 的存储引擎,当然,也不可能超出 InnoDB 的在线备份功能。历史不容假设,否则的话,或许 MySQL 最后仍将独立发展也说不定。 MySQL 在这一年发布5.0 Beta版,引入数个新特性,比如存储过程、触发器等,而这些其实是其他主流商业数据库早已实现的功能,从这个角度上看,MySQL和其竞争对手比较,仍 然是追赶者,甚至也落后于开源兄弟 PostgreSQL。

 

2006

IBM 在这一年发布了DB2 V9 ,最大特性是加入了 PureXML 支持。IBM 对 XML 方面寄予厚望,不过时间证明,XML 对于数据库市场的影响并没有那么大。

在嵌入式数据库方面,Oracle 收购 Berkeley DB 的母公司 Sleepycat Software。到此,MySQL 两个最重要的存储引擎都控制在 Oracle 手里(Falcon 引擎开发进度遥遥无期,最后不了了之),尽管现在来看关系并未僵化,但谁也说不好未来能怎样。Oracle也宣布推出Enterprise Linux,进军操作系统市场,开始和 Linux 厂商之间展开竞争又合作的关系。

SQL:2006发布,继续增强 XML方面的特性。Ingres,这个早期数据库流派的标识产品,以GPL版权形式开放代码。

 

2007

Oracle 发布 11g 数据库,引入物理 Data Guard 算是最大新功能。MySQL 的拥趸者要偷笑,其实 MySQL 的 Slave DB早就可以在恢复的同时提供查询的能力了。MySQL 宣布将对 5.0 提供两个变种,社区服务器(Community Server)与企业服务器(Enterprise Server),后者发布周期为1月一次,而社区服务器发布周期则不固定。

随着 Firefox 的发行量增加,其内嵌的SQLite 也赢得了大量部署用户。如果单纯从部署数量来看,SQLite 倒也堪称最流行的DB。

 

2008

2008年数据库领域的最大的事件,是 Sun 收购 MySQL, 价格 10 亿美元。一年多时间过去,回头来看,这次收购对于 MySQL 不是什么好事情。年尾,MySQL 发布 5.1 生产版,质量并不好,引起了不小争议。在这个版本中正式提供对分区(Partition)功能的支持。此外,在这一年中,开源社区对于 给MySQL 贡献的补丁和各种解决方案让人眼花缭乱,是可喜之事。Google 和 Facebook 等大站都对 MySQL 作出不小的贡献。

微软发布 SQL Server 2008,没有提供什么更扎眼的功能。其实关系数据库发展到现在,要想作出更大革新已经是几乎不可能的事情了。对于微软来说,Windows平台上 SQL Server 有其压倒性优势,可时过境迁,一方面的优势演变成了其他平台上的劣势。

PostgreSQL 8.3 发布,应该说从2008年开始,PostgreSQL 在市场上表现已经不容小视,以其为基础的集群BI系统 GreenPlum 已经引起了国内不少用户的关注。

SQL 标准SQL:2008 发布。从SQL:99 到 SQL:2009,可以看到标准修订的周期越来越短,多少也反映了对技术的需求之快。

 

2009

到现在为止,这篇文章还缺席 Sybase 的信息。必须要提一下的是,Sybase 将在3月份公布其列数据库(Column-based Database)的新版本:Sybase IQ 15 。说起来,Sybase 也是传统数据库厂商中唯一提供列数据库的公司。

此外,在云计算应用下涌现出的非关系型数据库(主要是Key/Value存储)产品渐欲迷人眼,有人在疑惑关系数据库已到末日。"关系数据库已死" 每隔几年就会有人跳出来喊,对关系型数据库(RDBMS)来说,百足之虫,死而不僵。

 

不是总结的总结

以上只是软件行业发展过程中的一个小小的阶段。如果要做点总结的话,我觉得这几年的值得探讨的一个地方就是 MySQL 的发展模式,从最初的近乎玩具的软件到现在对业界举足轻重的产品,其发展途径值得我们深思。反观国内,我们也有一些所谓的国产数据库,投入重金,多半昙花 一现,恐怕技术因素不是主要问题吧?


补充1) 应该说,时间就是善于和人开玩笑。这篇文章写完不久,就传来 Sun 被 Oracle 收购的消息。尽管现在还不能断定收购一定能完成,但这毕竟宣告了有关数据库技术的一个转折点。现在无从判断 MySQL 究竟发展方向如何,也或许,MySQL 的命运掌握在广大用户的手中。

补充2) 其实我非常想写一下"国产数据库",但出于某种原因考虑,还是放弃了。长期以来,那似乎是和我接触的数据库圈子并行的一个轨道。想来想去,还是不要徒增烦恼了吧。

补充3) 这是个变革的时代,新的数据库产品层出不穷。"乱花渐欲迷人眼"。

补充4) 这篇文章和我参与翻译的 Troubleshooting Oracle Performance 一书,似乎可以用来小声的宣布一件事,那就是我关注的技术领域重心早已不再是数据库了。再见,Database !

原文作者:Feng,来源于:http://www.dbanotes.net/database/database_history_summary_china.html

略有删节(主要是头和尾),本文也可以在《程序员》第100期可以查阅到

Tags: 数据库

一个很旧的PHP分词程序

这是一个比较老的分词程序,原文中的一些链接现在不是地址不正确就是打不开了。由此可以证明它是多老了。
再加上PHP直接进行分词的性能本来就不咋地,因此,建议仅仅用在很小的地方,比如自动添加TAG之类的。

原文如下:http://blog.sina.com.cn/s/blog_5677bc54010000i5.html

用PHP去做中文分词并不是一个太明智的举动, :p

下面是我根据网上找的一个字典档, 简易实现的一个分词程序.

(注: 字典档是gdbm格式, key是词 value是词频, 约4万个常用词)
代码请参见http://www.shi8.com/out/support/art_316.txt

PHP代码
  1. <?php  
  2. //中文分词系统简易实现办法  
  3. //切句单位:凡是ascii值<128的字符  
  4. //常见双字节符号:《》,。、?“”;:!¥…… %$#@^&*()[]{}|\/"'  
  5. //可以考虑加入超常见中文字: 的 和 是 不 了 啊 (不过有特殊字比如 "打的" "郑和" .. :p)  
  6.   
  7. //计算时间  
  8. function getmicrotime(){  
  9.     list($usec$sec) = explode(" ",microtime());  
  10.     return ((float)$usec + (float)$sec);  
  11. }  
  12. $time_start = getmicrotime();  
  13.   
  14.   
  15. //词典类  
  16. class ch_dictionary {  
  17.     var $_id;  
  18.   
  19.     function ch_dictionary($fname = "") {  
  20.         if ($fname != "") {  
  21.             $this->load($fname);  
  22.         }  
  23.     }  
  24.   
  25.     // 根据文件名载入字典 (gdbm数据档案)  
  26.     function load($fname) {  
  27.         $this->_id = dba_popen($fname"r""gdbm");  
  28.         if (!$this->_id) {  
  29.             echo "failed to open the dictionary.($fname)<br>\n";  
  30.             exit;  
  31.         }  
  32.     }  
  33.   
  34.     // 根据词语返回频率, 不存在返回-1  
  35.     function find($word) {  
  36.         $freq = dba_fetch($word$this->_id);  
  37.         if (is_bool($freq)) $freq = -1;  
  38.         return $freq;  
  39.     }  
  40. }  
  41.   
  42. // 分词类: (逆向)  
  43. // 先将输入的字串正向切成句子, 然后一句一句的分词, 返回由词组成的数组.  
  44. class ch_word_split {  
  45.     var $_mb_mark_list;    // 常见切分句子的全角标点  
  46.     var $_word_maxlen;    // 单个词最大可能长度(汉字字数)  
  47.     var $_dic;        // 词典...  
  48.     var $_ignore_mark;    // true or false  
  49.      
  50.     function ch_word_split () {  
  51.         $this->_mb_mark_list = array(","," ","。","!","?",":","……","、","“","”","《","》","(",")");  
  52.         $this->_word_maxlen  = 12;    // 12个汉字  
  53.         $this->_dic = NULL;  
  54.         $this->_ignore_mark = true;  
  55.     }  
  56.   
  57.     // 设定字典  
  58.     function set_dic($fname) {  
  59.         $this->_dic = new ch_dictionary($fname);  
  60.     }  
  61.   
  62.     function set_ignore_mark($set) {  
  63.         if (is_bool($set)) $this->_ignore_mark = $set;  
  64.     }  
  65.   
  66.     // 将字串切成句子再加以切分成词  
  67.     function string_split($str$func = "") {         
  68.         $ret = array();  
  69.          
  70.         if ($func == "" || !function_exists($func)) $func = "";         
  71.          
  72.         $len = strlen($str);  
  73.         $qtr = "";  
  74.   
  75.         for ($i = 0; $i < $len$i++) {  
  76.             $char = $str[$i];  
  77.   
  78.             if (ord($char) < 0xa1) {  
  79.                 // 读取到一个半角字符  
  80.                 if (!emptyempty($qtr)) {  
  81.                     $tmp = $this->_sen_split($qtr);  
  82.                     $qtr = "";  
  83.   
  84.                     if ($func != "") call_user_func($func$tmp);                     
  85.                     else $ret = array_merge($ret$tmp);                     
  86.                 }  
  87.   
  88.                 // 如果是单词或数字. 根据 char 将数据读取到 >= 0xa1为止  
  89.                 if ($this->_is_alnum($char)) {  
  90.                     do {  
  91.                         if (($i+1) >= $lenbreak;  
  92.                         $char2 = substr($str$i + 1, 1);  
  93.                         if (!$this->_is_alnum($char2)) break;  
  94.   
  95.                         $char .= $char2;  
  96.                         $i++;  
  97.                     } while (1);  
  98.   
  99.                     if ($func != "") call_user_func($funcarray($char));  
  100.                     else $ret[] = $char;                     
  101.                 }  
  102.                 elseif ($char == ' ' || $char == "\t") {  
  103.                     // nothing.  
  104.                     continue;  
  105.                 }  
  106.                 elseif (!$this->_ignore_mark) {  
  107.                     if ($func != "") call_user_func($funcarray($char));  
  108.                     else $ret[] = $char;                     
  109.                 }  
  110.             }  
  111.             else {  
  112.                 // 双字节字符.  
  113.                 $i++;  
  114.                 $char .= $str[$i];  
  115.                  
  116.                 if (in_array($char$this->_mb_mark_list)) {  
  117.                     if (!emptyempty($qtr)) {  
  118.                         $tmp = $this->_sen_split($qtr);  
  119.                         $qtr = "";  
  120.   
  121.                         if ($func != "") call_user_func($func$tmp);  
  122.                         else $ret = array_merge($ret$tmp);  
  123.                     }  
  124.   
  125.                     if (!$this->_ignore_mark) {  
  126.                         if ($func != "") call_user_func($funcarray($char));  
  127.                         else $ret[] = $char;  
  128.                     }  
  129.                 }  
  130.                 else {  
  131.                     $qtr .= $char;  
  132.                 }  
  133.             }  
  134.         }  
  135.          
  136.         if (strlen($qtr) > 0) {  
  137.             $tmp = $this->_sen_split($qtr);  
  138.   
  139.             if ($func != "") call_user_func($func$tmp);             
  140.             else $ret = array_merge($ret$tmp);             
  141.         }  
  142.   
  143.         // return value  
  144.         if ($func == "") {  
  145.             return $ret;  
  146.         }  
  147.         else {  
  148.             return true;  
  149.         }  
  150.     }  
  151.   
  152.     // 将句子切成词, 逆向  
  153.     function _sen_split($sen) {  
  154.         $len = strlen($sen) / 2;  
  155.         $ret = array();  
  156.   
  157.         for ($i = $len - 1; $i >= 0; $i--) {  
  158.             // 如: 这是一个分词程序  
  159.              
  160.             // 先取得最后一个字  
  161.             $w = substr($sen$i * 2, 2);  
  162.   
  163.             // 最终的词长  
  164.             $wlen = 1;  
  165.              
  166.             // 开始逆向匹配到最大长度.  
  167.             $lf = 0; // last freq  
  168.             for ($j = 1; $j <= $this->_word_maxlen; $j++) {  
  169.                 $o = $i - $j;  
  170.                 if ($o < 0) break;  
  171.                 $w2 = substr($sen$o * 2, ($j + 1) * 2);  
  172.                  
  173.                 $tmp_f = $this->_dic->find($w2);  
  174.                 //echo "{$i}.{$j}: $w2 (f: $tmp_f)\n";  
  175.                 if ($tmp_f > $lf) {  
  176.                     $lf = $tmp_f;  
  177.                     $wlen = $j + 1;  
  178.                     $w = $w2;  
  179.                 }  
  180.             }  
  181.             // 根据 $wlen 将 $i 偏移了  
  182.             $i = $i - $wlen + 1;  
  183.             array_push($ret$w);  
  184.         }  
  185.   
  186.         $ret = array_reverse($ret);  
  187.         return $ret;  
  188.     }  
  189.   
  190.     // 判断字符是不是 字母数字_- [0-9a-z_-]  
  191.     function _is_alnum($char) {  
  192.         $ord = ord($char);  
  193.         if ($ord == 45 || $ord == 95 || ($ord >= 48 && $ord <= 57))  
  194.             return true;  
  195.         if (($ord >= 97 && $ord <= 122) || ($ord >= 65 && $ord <= 90))  
  196.             return true;  
  197.         return false;  
  198.     }  
  199. }  
  200.   
  201.   
  202. // 分词后的回调函数  
  203. function call_back($ar) {     
  204.     foreach ($ar as $tmp) {  
  205.         echo $tmp . " ";  
  206.         //flush();  
  207.     }  
  208. }  
  209.   
  210. // 实例(如果没有输入就从 sample.txt中读取):  
  211. $wp = new ch_word_split();  
  212. $wp->set_dic("dic.db");  
  213.   
  214. if (!isset($_REQUEST['testdat']) || emptyempty($_REQUEST['testdat'])) {  
  215.     $data = file_get_contents("sample.txt");  
  216. }  
  217. else {  
  218.     $data = & $_REQUEST['testdat'];  
  219. }  
  220.   
  221. // output  
  222. echo "<h3>简易分词演示</h3>\n";  
  223. echo "<hr>\n";  
  224. echo "分词结果(" . strlen($data) . " chars): <br>\n<textarea cols=100 rows=10>\n";  
  225.   
  226. // 设定是否忽略不返回分词符号(标点,常用字)  
  227. $wp->set_ignore_mark(false);  
  228.   
  229. // 执行切分, 如果没有设置 callback 函数, 则返回由词组成的array  
  230. $wp->string_split($data"call_back");  
  231.   
  232. $time_end = getmicrotime();  
  233. $time = $time_end - $time_start;  
  234.   
  235. echo "</textarea><br>\n本次分词耗时: $time seconds <br>\n";  
  236. ?>  
  237. <hr>  
  238. <form method=post>  
  239. 您也可以在下面文本框中输入文字,提交后试验分词效果:<br>  
  240. <textarea name=testdat cols=100 rows=10></textarea><br>  
  241. <input type=submit>  
  242. </form>  
  243. <hr>  

文章引用自:http://www.im286.net/viewthread.php?tid=1157015

Tags: 分词, gbm

使用开源软件设计、开发和部署协作型 Web 站点

一直以来,IBM developworks都是我比较关注的网站,它上面有很多内容是IBM公司内部人员所写,也有一部分内容是业界领先人士根据自身经验写出的教程,因此,它一直是我的订阅对象之一。本文就是其中一篇比较旧的文章,最初发表于2007年3月15日,但是从今天的眼光来看,它还是有一定的学习价值,所以我贴出来了。

简介如下:(原文我就不贴了,大家可以点其中的链接我自己也会点过去看的)

现在,Web 站点已经成了业务的重要部分,而用来创建和部署 Web 站点的工具也变得更加灵活和容易使用。但是,复杂 Web 应用程序的开发并不轻松,它们需要的不只是标准的交互和更新方法(比如 blog)。组织中的每个应用程序常常还需要进行定制。

开放源码社区提供了各种工具,结合使用这些工具可以为复杂的 Web 应用程序创建一个有用的开发和生产环境。这个系列文章来自 IBM Internet Technology Group 团队,他们将展示如何把开放源码软件作为基础,并提供一种方法和一些改进来帮助简化 Web 站点的开发过程。尽管定制仍然是有必要的,但是这个系列讲解了如何使用开放源码工具和技术快速建立和运行复杂的 Web 站点。

在这个系列中,Internet Technology Group 团队通过一个虚构的组织,International Business Council(IBC),来展示如何更有效地尽可能地扩展 Web 站点的功能,这些功能包括文档存储、讨论组、专门的工作组、研讨会日程安排、日程议题描述、会话过期和其他任务。他们举例说明了创建这个 Web 站点需要用到下列开放源码工具:

  • Drupal - 开放源码的内容管理系统
  • MySQL - 开放源码的数据库
  • PHP - 可以使用 PHPMyAdmin 和 SQLBrowse 创建动态 Web 内容的开发语言
  • Apache - 开放源码的 Web 服务器
  • Eclipse - 开放源码的开发环境
  • CVS - 用于跟踪代码变更的代码管理系统

Internet Technology Group 团队会首先介绍业务场景以及选择开源工具的决定因素,他们还通过描述一个灵活的开发方法来讲解了应用程序的设计流程。这个流程可以用来设计 Web 站点或者应用程序的用户体验。接着,他们会一步一步地指导如何安装和使用前面所提到的开发工具套件。这些步骤包括:

  • 建立开发环境
  • Drupal 入门
  • 着重介绍 Drupal 与其它软件工具的交互(如 MySQL, Ajax 和 PHP)
  • 构建 Drupal 定制模块
  • 部署和调整安装

沿着这条道路,Internet Technology Group 团队同其他可选方案进行了对比,并讨论了如何通过集成其它软件组件来尽可能地增强这些工具。

现在就链接到 项目实现

Tags: php, 协同, 开源, 部署, 设计

Records:11123