TDD, 测试驱动

TDD, 测试驱动 测试驱动设计确保对系统的更改不会导致系统丢失或破坏现有功能 测试驱动开发是敏捷开发中的一项核心实践和技术, 也是一种设计方法论。TDD 的原理是在开发功能代码之前, 先编写单元测试用例代码, 测试代码确定需要编写什么产品代码。TDD 虽是敏捷方法的核心实践, 但不只适用于XP (Extreme Programming), 同样可以适用于其他开发方法和过程。 TDD 的基本思路就是通过测试来推动整个开发的进行, 但测试驱动开发并不只是单纯的测试工作, 而是把需求分析, 设计, 质量控制量化的过程。 TDD 的重要目的不仅仅是测试软件, 测试工作保证代码质量仅仅是其中一部分, 而且是在开发过程中帮助客户和程序员去除模棱两可的需求。TDD 首先考虑使用需求 (对象、功能、过程、接口等), 主要是编写测试用例框架对功能的过程和接口进行设计, 而测试框架可以持续进行验证。 优缺点 优点: 在任意一个开发节点都可以拿出一个可以使用,含少量bug并具一定功能的产品。 缺点: 增加代码量。测试代码是系统代码的两倍或更多。 TDD = TFD + Refactoring (TFD - Test First Development) 计算机领域: Test Drived Develop

2012-12-10 · 1 min · 46 words · -

USB, Universal Serial Bus

USB, Universal Serial Bus USB 即"Universal Serial Bus",中文名称为通用串行总线。是在 PC 领域广为应用的新型接口技术。USB 接口具有传输速度更快,支持热插拔以及连接多个设备的特点。目前已经在各类外部设备中广泛的被采用。目前USB接口标准有: USB1.1, USB2.0, usb 3.0 USB1.1 传输速度 12Mbps/秒 USB2.0 速度 480Mbps, 向下兼容USB1.1。 USB3.0 为 5Gbps 全双工 usb 接口颜色 黑色插孔:黑色插孔就代表一般的普通USB插孔,没有特殊含义,早期的表示USB 1.0,现在多代表USB 2.0插孔。 蓝色插孔:蓝色插孔代表USB 3.0。USB 2.0 为 480Mbps 半双工,而 USB 3.0 为5Gbps 全双工,理论上能达到 USB 2.0 速度的10倍。 黄色插孔:黄色USB插孔又被称为Powered USB,一般为“USB 2.0 + 关机可充电"接口,支持在关闭电脑的时候,为USB提供电源。方便关机为手机、MP3等进行充电,而且还不会造成浪费。 USB 线序 G C D V, 黑 绿 白 红 USB接口有四根线,中间触点短的两根用于数据传输,外侧另两根供电。 红色: 电源线 (vcc+) , V 白色 (port-) : 负数据线, D 绿色 (prot+) : 正数据线, C ...

2012-12-09 · 1 min · 85 words · -

PropertyPlaceholderConfigurer

PropertyPlaceholderConfigurer http://callan.iteye.com/blog/161540 关于PropertyPlaceholderConfigurer与PropertyOverrideConfigurer PropertyPlaceholderConfigurer,允许在spring的配置文件中加入properties文件,可以将一些动态参数移到properties中. <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:config/jdoserver.properties"/> </bean> 但是好像在属性文件定义中却不支持多个属性文件的定义,比如不能这样用config/*.properties。 经过查看源码,发现可以使用locations属性定义多个配置文件: Java代码 <property name="locations"> <value>classpath:config/maxid.properties</value> <value>classpath:config/jdoserver.properties</value> </list> </property> 使用外部属性后如下: Java代码 <img src="http://callan.iteye.com/images/icon_star.png" alt="收藏代码" /> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.agent.driver}"/> <property name="url" value="${jdbc.agent.main.url}"/> </bean> PropertyOverrideConfigurer: 在spring所有的bean初使化以后,将bean的值强行改变 Xml代码 <img src="http://callan.iteye.com/images/icon_star.png" alt="收藏代码" /> <bean id="configBean" class="org.springframework.beans.factory.config.PropertyOverrideConfigurer"> <property name="location"> <value>hello.properties</value> </property> </bean> <bean id="helloBean" class="com.HelloBean"> <property name="word"> <value>Hello!</value> </property> </bean> 定义HelloBean,注入word的值为hello. 在hello.properties中 helloBean.word=Welcome! word初使为hello后,当bean全加载完,PropertyOverrideConfigurer将helloBean.word的值改成为welcome.

2012-12-08 · 1 min · 63 words · -

jdbc driver

jdbc driver jdbc driver: com.MySQL.jdbc.Driver oracle.jdbc.driver.OracleDriver jdbc url: jdbc:MySQL://localhost:3306/xxxxxx jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:xxxxxx

2012-12-08 · 1 min · 10 words · -

Debian 6 squeeze TightVNC Server

Debian 6 squeeze TightVNC Server 1 安装 如果已经安装了图形用户界面,只需要在bash中apt-get install tightvncserver。 sudo apt-get install tightvnc* vnc client: xtightvncviewer 2 运行 2.1 普通运行 在bash中输入tightvncserver,第一次运行需要设置访问密码。 每次启动tightvncserver都会返回一个编号。 编号在这句中: New 'X' desktop is wqvm-debian:2 可见启动的编号为2。使用VNC客户端去连接时,默认用这个编号+5900得到端口号去连接。 2.2 自动运行 写入rc.d即可。 2.3 终止运行 tightvncserver -kill :2 注意将上一行中的2修改为你在运行tightvncserver中得到的编号,即可关闭这个VNC Server的进程。 3 与vnc4server比较 貌似vnc4server最后一版是2005年发行,距今很久了。说明比较稳定,但是可能落后了。 我安装了vnc4server后不能直接从客户端连接,可能还需要更多的配置。 4 参考资料 http://news.metaparadigma.de/linux-setting-up-a-debian-vnc-server-237/ 英文的。 http://www.cnblogs.com/yangzhao/archive/2011/08/20/2147387.html

2012-12-08 · 1 min · 49 words · -

nginx rewrite

nginx rewrite 理解地址重写 与 地址转发 地址重写与地址转发是两个不同的概念。 地址重写 是为了实现地址的标准化,比如我们可以在地址栏中中输入 www.baidu.com. 我们也可以输入 www.baidu.cn. 最后都会被重写到 www.baidu.com 上。浏览器的地址栏也会显示www.baidu.com。 地址转发:它是指在网络数据传输过程中数据分组到达路由器或桥接器后,该设备通过检查分组地址并将数据转发到最近的局域网的过程。 因此地址重写和地址转发有以下不同点: 地址重写会改变浏览器中的地址,使之变成重写成浏览器最新的地址。而地址转发他是不会改变浏览器的地址的。 地址重写会产生两次请求,而地址转发只会有一次请求。 地址转发一般发生在同一站点项目内部,而地址重写且不受限制。 地址转发的速度比地址重定向快。 Rewrite 指令 该指令是通过正则表达式的使用来改变URI。可以同时存在一个或多个指令。需要按照顺序依次对URL进行匹配和处理。 该指令可以在server块或location块中配置,其基本语法结构如下: # Context: server, location, if server { # 规则:可以是字符串或者正则来表示想匹配的目标url rewrite {规则} {定向路径} {重写类型}; rewrite regex replacement [flag]; } rewrite:该指令是实现URL重写的指令。 regex:用于匹配 URI 的正则表达式。 replacement:将regex正则匹配到的内容替换成 replacement。 flag: flag标记。 例如客户端请求 http://foo.bar.com/foo/bar, nginx 送到 regex 匹配的字符串是 /foo/bar flag有如下值: last: 本条规则匹配完成后,继续向下匹配新的location URI 规则。(不常用) break: 本条规则匹配完成即终止,不再匹配后面的任何规则(不常用)。 redirect: 返回 302 临时重定向,浏览器地址会显示跳转新的URL地址。(默认值) permanent: 返回 301 永久重定向。浏览器地址会显示跳转新的URL地址。 比如如下列子: rewrite ^/(.*) http://www.baidu.com/$1 permanent; # 说明: # rewrite 为固定关键字,表示开始进行rewrite匹配规则。 # regex 为 ^/(.*)。 这是一个正则表达式,匹配完整的域名和后面的路径地址。 # replacement就是 http://www.baidu.com/1这块了,其中1是取regex部分()里面的内容。如果匹配成功后跳转到的URL。 # flag 就是 permanent,代表永久重定向的含义,即跳转到 http://www.baidu.com/$1 地址上。 Rewrite 指令可用的全局变量 $host: 变量中存放了请求的URL中的主机部分字段,比如 http://xxx.abc.com:8080/home 中的 xxx.abc.com. ngx_http_rewrite_module 模块用来使用正则表达式 (PCREs) 改变请求的 URI,返回重定向,并有条件地选择配置。 ...

2012-12-08 · 5 min · 863 words · -

SIteMesh

SIteMesh 转自:http://javauu.com/thread-27-1-1.html 一、SIteMesh介绍 一、SiteMesh简介 SiteMesh是由一个基于Web页面布局、装饰以及与现存Web应用整合的框架。它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的banner,一致的版权,等等。 它不仅仅能处理动态的内容,如jsp,php,asp等产生的内容,它也能处理静态的内容,如htm的内容,使得它的内容也符合你的页面结构的要求。甚至于它能将HTML文件象include那样将该文件作为一个面板的形式嵌入到别的文件中去。所有的这些,都是GOF的Decorator模式的最生动的实现。尽管它是由java语言来实现的,但它能与其他Web应用很好地集成。与传统区别如下图: SIteMesh官方地址: http://www.opensymphony.com/sitemesh/index.html SIteMesh官方下载: http://www.opensymphony.com/sitemesh/download.html SIteMesh 2.3下载: http://www.javauu.com/downloads/resource/sitemesh-2.3.zip 二、SiteMesh原理 SiteMesh框架是OpenSymphony团队开发的一个非常优秀的页面装饰器框架,它通过对用户请求进行过滤,并对服务器向客户端响应也进行过滤,然后给原始页面加入一定的装饰(header,footer等),然后把结果返回给客户端。通过SiteMesh的页面装饰,可以提供更好的代码复用,所有的页面装饰效果耦合在目标页面中,无需再使用include指令来包含装饰效果,目标页与装饰页完全分离,如果所有页面使用相同的装饰器,可以是整个Web应用具有统一的风格。

2012-12-07 · 1 min · 15 words · -

FreeMarker

FreeMarker http://www.oecp.cn/hi/hailang/blog/146 一、 FreeMarker简介 FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。 所谓模板,就是一份已经写好了基本内容,有着固定格式的文档,其中空出或者用占位符标识的内容,由使用者来填充,不同的使用者给出的数据是不同的。在模板中的占位符,在模板运行时,由模板引擎来解析模板,并采用动态数据替换占位符部分的内容。 FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 文等。 二、 FreeMarker的优点和缺点 (一) FreeMarker的优点 1.使用FreeMarker的优点之一,可以彻底的分离表现层和业务逻辑。 使用JSP 开发过程中在页面中大量的存在业务逻辑的代码,使得页面内容凌乱,在后期大量的修改维护过程中就变得非常困难。 FreeMarker根本不支持Java脚本代码。 FreeMarker的原理就是: 模板+数据模型=输出 ,模板只负责数据在页面中的表现,不涉及任何的逻辑代码,而所有的逻辑都是由数据模型来处理的。用户最终看到的输出是模板和数据模型合并后创建的。 2.使用FreeMarker的优点之二,可以提高开发效率。 在我们以往的开发中,使用的都是JSP 页面来展示数据的,即所谓的表现层。我们都知道,JSP在第一次执行的时候需要转换成Servlet类,开发阶段进行功能调适时,需要频繁的修改JSP,每次修改都要编译和转换,那么试想一天中我们浪费在程序编译的时间有多少。相对于JSP来说,FreeMarker模板技术不存在编译和转换的问题,所以就不会存在上述问题。而且开发过程中,我们在不必在等待界面设计开发人员完成页面原形后,我们再来开发程序。 3.使用FreeMarker的优点之三,使得开发过程中的人员分工更加明确。 以往用JSP展现数据时,作为程序员的我们,并不熟悉界面设计技术,反之界面开发人员,也并不熟悉程序语言。对两者而言,交替性的工作本身就有难度。有时候稍有不慎,可能会将某个页面元素删除或去掉了某个程序符号,使得页面走样或程序错误,这样就需要双方相互沟通协作,解决出现的问题。有时候因为项目中的时间,任务量等因素的存在,可能这个工作就由一个人来完成,这样就可能加大某一方开发人员的工作量。 使用FreeMarker后,作为界面开发人员,只专心创建HTML文件、图像以及Web页面的其他可视化方面,不用理会数据;而程序开发人员则专注于系统实现,负责为页面准备要显示的数据。 (二)FreeMarker的缺点 1.使用FreeMarker的缺点之一,应用FreeMarker模板技术,在修改模板后,可能会看到已经过期的数据。如: 生成静态的HTML页面后,如果一旦模板改变,而没有及时更新模板生成的HTML页面的话,用户看到的就是过期的数据。 2.使用FreeMarker的缺点之二,FreeMarker模板技术在应用过程中,FreeMarker中的变量必须要赋值,如果不赋值,那么就会抛出异常。想避免错误就要应用if/elseif/else 指令进行判段,如果对每一个变量都判断的话,那么则反而增加了编程的麻烦。 3.使用FreeMarker的缺点之三,FreeMarker的map限定key必须是string,其他数据类型无法操作 4.使用FreeMarker的缺点之四,FreeMarker不支持集群应用。为了编成的方便性,把序列化的东西都放到了Session中,如Session,request等,在开发的过程中确实方便,但如果将应用放到集群中,就会出现错误。 通过以上的阐述,希望可以令您清晰FreeMarker的优点和缺点,旨在抛砖引玉。有什么问题可以留下您的宝贵留言,我非常愿意与大家讨论。

2012-12-07 · 1 min · 33 words · -

serialVersionUID

serialVersionUID serialVersionUID作用: 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 有两种生成方式: 一个是默认的1L,比如: private static final long serialVersionUID = 1L; 一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如: private static final long serialVersionUID = xxxxL; 当你一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个 提示功能告诉你去定义 。在Eclipse中点击类中warning的图标一下,Eclipse就会 自动给定两种生成的方式。如果不想定义它,在Eclipse的设置中也 可以把它关掉的,设置如下: Window ==> Preferences ==> Java ==> Compiler ==> Error/Warnings ==> Potential programming problems 将Serializable class without serialVersionUID的warning改成ignore即可。 如果你没有考虑到兼容性问题时,就把它关掉,不过有这个功能是好的,只要任何类别实现了Serializable这个接口的话,如果没有加入serialVersionUID,Eclipse都会给你warning提示,这个serialVersionUID为了让该类别Serializable向后兼容。 如果你的类Serialized存到硬盘上面后,可是后来你却更改了类别的field(增加或减少或改名),当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。 但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,可避开不兼容性问题。

2012-12-07 · 1 min · 45 words · -

axel

axel Axel 通过打开多个 HTTP/FTP 连接来将一个文件进行分段下载,从而达到加速下载的目的。对于下载大文件,该工具将特别有用。 #安装: sudo apt-get install axel sudo pacman -S axel axel -s 102400 https://download.jetbrains.8686c.com/idea/ideaIU-2017.1.2.tar.gz -s: 限速: 如 -s 102400,即每秒下载的字节数,这里是 100 KB -n: 限制连接数: 如 -n 5,即打开 5 个连接 下载目录会有一个.st文件, 会自动断点续传 http://linuxtoy.org/archives/axel.html

2012-12-02 · 1 min · 35 words · -

Awesome

Awesome http://confusedfly.yo2.cn/articles/awesome%E7%AE%80%E4%BB%8B.html 什么是平铺窗口管理器 这里首先需要解释一下窗口管理器(Windows Manager)和桌面环境(Desktop Environment)的概念。窗口管理器负责绘制窗口的边框,处理窗口运行比如移动、最小化之类的行为。 而桌面环境则是窗口管理器的超集,它使用窗口管理器及其其他软件提供一个完整的工作环境。比如说,gnome就是一个桌面环境,默认使用metacity作为窗口管理器。 那么什么是平铺式窗口管理器?简单来说,所谓的平铺就是之所有的窗口都不会相互重叠,而是自动的被调整大小使得它们能够刚好占满整个屏幕。这和传统的桌面环境的概念相差很大,也许你会疑问这样的环境下如何工作? 事实上对于Linux这种需要大量使用命令行的操作系统来说平铺式窗口管理在很多情况下能够极大的提升你的工作效率。举个例子,很多时候你都需要打开好几个shell。在gnome底下这就意味着好几个会相互遮挡命令行窗口,大多数时候如果你想要同时看到这些窗口上面的内容就得费神费力的调整它们的位置和大小。而在平铺是窗口下面你完全不需要为这些事情烦心。 另外一个可能会促使你使用平铺的理由就是,用它来调整、切换窗口几乎可以不使用鼠标。这对于硬派的linux狂热者以及痛恨使用笔记本触控板的人来说也是一个不错的选择。 看看下面这个来我桌面的屏幕截图能对awesome有一个直观的印象 如果你是第一次看到Awesome这样的桌面截图一定会觉得手足无措,最常见的窗口边框不见了,你甚至都没法儿关闭或者是最小化一个窗口。事实上在Awesome中是用不着窗口边框的。它默认就提供了9个标签,你大可把不同的窗口分散在这9个标签中而不用去费神调整它们之间的位置,想要切换的时候简单的用快捷件就可以在各个虚拟桌面之间切换。 显然它并不像 gnome,KDE一样有眼花缭乱的桌面特效,但平铺式窗口关注的主要是在其下工作的效率。比如说在写php代码的时候我可以在一个标签中打开四五个shell运行vim同时修改多个文件,然后在另外一个标签中打开一个浏览器。这样可以很快速的输入代码和切换窗口,而你的手甚至不需要离开键盘! 为什么是Awesome 平铺式窗口管理器并不是一个新概念,根据维基百科里面的介绍早在施乐公司几十年前最早开始研究图形界面的时候就已经有了平铺的概念了 (尽管和现在我说的不太一样) ,linux下面也有不少成熟的平铺式窗口管理器-Ion, XMonad都是有名的平铺窗口管理器。但是比较之下Awesome有不少鲜明的特点: 体积小,运行迅速 不过在3.0以后的版本似乎向变得巨大和缓慢的方向发展的趋势 支持多种窗口布局 事实上awesome并不仅仅支持平铺,它还支持好几种各不相同的窗口布局方案 使用Lua脚本的配置文件使得它的灵活性非常高 由于lua脚本的强大能力,Awesome 3.0甚至把窗口管理器运行的逻辑部分放到了配置文件里面。好处是这使得很多其他窗口管理器里面不可能做到的用法在这里变成了可能,坏处是配置文件及其庞大和复杂。 更新迅速 它的作者一直在不停地完善awesome,每次版本升级都能带来一些方便的新特性。不过弊端是造成了awesome的配置文件一直都在改变,说不定什么时候自己以前的配置文件就不能用了 多显示器支持 事实上我一直很羡慕官方网站上awesome运行在多显示器机器上面的截图,口水流了一地。 对于喜欢折腾自己电脑的人来说Awesome是一个很不错的玩具 不过Awesome所依赖的几个底层库还没有进入稳定版本,而awesome自身也在频繁的更改当中,因此在ubuntu源中的awesome还是老旧的2.4版 (不过ArchLinux源里面倒是有最新版的包) ,想要用awesome的ubuntu用户还是得自己编译才行。编译方法将在以后的文章里面

2012-11-30 · 1 min · 34 words · -

SpringMVC

SpringMVC http://www.iteye.com/blogs/subjects/springmvc-explore 《Struts2技术内幕» 本文是专栏文章 (SpringMVC深度探险) 系列的文章之一,博客地址为: http://downpour.iteye.com/blog/1330537 在我们熟知的建立在三层结构 (表示层、业务逻辑层、持久层) 基础之上的J2EE应用程序开发之中,表示层的解决方案最多。因为在表示层自身的知识触角很多,需要解决的问题也不少,这也就难免造成与之对应的解决方案层出不穷。 笔者在很多讨论中经常可以看到类似"某某框架已死",或者"某某框架已经足以打败所有其他的框架"的言论。**事实上,每一种解决方案都有着自身独有的存在价值和历史背景。**如果单单从某一个方面或者某几个方面去看一个框架,那么评论难免有失偏颇。 所以,整个系列的第一篇文章,我们脱开SpringMVC框架本身,把SpringMVC放到一个更大的知识体系范围之中,讲一讲整个Web开发领域、尤其是MVC框架的发展历程。正如"认识历史才能看清未来",当我们能够正确审视整个MVC框架的发展历程,也就能够分析它的发展趋势,并且站在一个更高的高度来对所有的解决方案进行评价。 两种模型 从整个B/S程序的运行结构来看,J2EE的表示层解决方案实际上是对"请求-响应"模式的一种实现。既然谓之"请求-响应"也就势必存在着两大沟通角色: 由于这两大角色的承载载体和编程语言实现基础都不同,因而也就产生了两种截然不同的针对表示层的解决方案的设计思路: 以服务器端应用程序为主导来进行框架设计 以浏览器页面组件 (及其自身的事件触发模型) 为主导来进行框架设计 业界对于上述这两种不同的设计模型也赋予了不同的名词定义: 前一种被称之为MVC模型;后一种则被称之为组件模型,也有称之为事件模型。 **注: **笔者个人对于这两种模型的概念定义并不是非常认同。因为在笔者个人的观点认为,MVC模型的定义角度所针对的是编程元素的划分;而组件模型 (事件模型) 的定义角度是动态交互方式的表述。所以我们在这里强调的是解决方案自身所设立的基准和侧重点的不同。 从使用者的社区力量上来看,无疑MVC模型获得了更多程序员的青睐。这里面的原因很多,我们在这里也不想过多展开对两种不同编程模型之间的讨论。不过在这里,我们将针对同一个业务场景 (用户注册) 分别给出基于这两个编程模型的代码示例,帮助读者了解这两种编程模型在设计思想上的不同之处。 【MVC模型】 在MVC模型中,我们选取当前比较热门的两大框架Struts2和SpringMVC作为代码示例。 首先,我们将用户注册场景中最为核心的"用户类"定义出来: Java代码 <img src="http://downpour.iteye.com/images/icon_star.png" alt="收藏代码" /> public class User { private String email; private String password; // 省略了setter和getter方法 } 紧接着是一个简单的JSP表单: Html代码 <img src="http://downpour.iteye.com/images/icon_star.png" alt="收藏代码" /> <form method="post" action="/register"> <label>Email:</label><input type="text" name="email" /> <label>Password:</label><input type="password" name="password" /> <input type="submit" value="submit" /> </form> 上述这两段代码无论是SpringMVC还是Struts2,都可以共用。而在请求响应处理类 (也就是Controller) 上的设计差异是两个框架最大的不同。 ...

2012-11-30 · 2 min · 420 words · -

字符串匹配算法总结

字符串匹配算法总结 KMP虽然经典,但是理解起来极其复杂,好不容易理解好了,便起码来巨麻烦! 老子就是今天图书馆在写了几个小时才勉强写了一个有bug的、效率不高的KMP,特别是计算next数组的部分。 其实,比KMP算法速度快的算法大把大把,而且理解起来更简单,为何非要抓住KMP呢?笔试出现字符串模式匹配时直接上sunday算法,既简单又高效,何乐而不为? 说实话,想到sunday算法的那个人,绝对是发散思维,绝对牛。当我在被KMP折磨的够呛的时候,我就琢磨,有没有别的好算法呢??琢磨了半天也没想出个所以然来。笨啊,脑子不够发散。 下面贴上一位兄弟写的算法总结,很简单 (建议KMP部分就不用看了,看了费脑子) 。 参见: http://hi.baidu.com/willamette/blog/item/02bd0b5599c8b4c0b645ae06.html 趁着做Presentation的功夫,顺便做一个总结 字符串匹配: -willamette 在匹配串中寻找模式串是否出现,注意和最长公共子序列相区别(LCS: Longest Common Substring) **-: ** Brute Force(BF或蛮力搜索) **算法: ** 这是世界上最简单的算法了。 首先将匹配串和模式串左对齐,然后从左向右一个一个进行比较,如果不成功则模式串向右移动一个单位。 速度最慢。 那么,怎么改进呢? 我们注意到Brute Force 算法是每次移动一个单位,一个一个单位移动显然太慢,是不是可以找到一些办法,让每次能够让模式串多移动一些位置呢? 当然是可以的。 我们也注意到,Brute Force 是很不intelligent 的,每次匹配不成功的时候,前面匹配成功的信息都被当作废物丢弃了,当然,就如现在的变废为宝一样,我们也同样可以将前面匹配成功的信息利用起来,极大地减少计算机的处理时间,节省成本。^_^ 注意,蛮力搜索算法虽然速度慢,但其很通用,文章最后会有一些更多的关于蛮力搜索的信息。 **-: KMP算法 ** 首先介绍的就是KMP 算法。 原始论文: Knuth D.E., Morris J.H., and Pratt V.R., Fast pattern matching in strings, SIAM Journal on Computing, 6(2), 323-350, 1977. 这个算法实在是太有名了,大学上的算法课程除了最笨的Brute Force 算法,然后就介绍了KMP 算法。也难怪,呵呵。谁让Knuth D.E. 这么world famous 呢,不仅拿了图灵奖,而且还写出了计算机界的Bible ( 业内人士一般简称TAOCP). 稍稍提一下,有个叫H.A.Simon 的家伙,不仅拿了Turing Award ,顺手拿了个Nobel Economics Award ,做了AI 的爸爸,还是Chicago Univ 的Politics PhD ,可谓全才。 ...

2012-11-27 · 5 min · 898 words · lcf

Database

Database SQL tuning 类 列举几种表连接方式 等连接 (内连接) 、非等连接、自连接、外连接 (左、右、全) Or hash join/merge join/nest loop(cluster join)/index join ?? ORACLE 8i,9i 表连接方法。 一般的相等连接: select * from a, b where a.id = b.id; 这个就属于内连接。 对于外连接: Oracle中可以使用"(+) “来表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN LEFT OUTER JOIN: 左外关联 SELECT e.last_name, e.department_id, d.department_name FROM employees e LEFT OUTER JOIN departments d ON (e.department_id = d.department_id); 等价于 SELECT e.last_name, e.department_id, d.department_name FROM employees e, departments d WHERE e.department_id=d.department_id(+) 结果为: 所有员工及对应部门的记录,包括没有对应部门编号department_id的员工记录。 RIGHT OUTER JOIN: 右外关联 SELECT e.last_name, e.department_id, d.department_name FROM employees e RIGHT OUTER JOIN departments d ON (e.department_id = d.department_id); 等价于 SELECT e.last_name, e.department_id, d.department_name FROM employees e, departments d WHERE e.department_id(+)=d.department_id 结果为: 所有员工及对应部门的记录,包括没有任何员工的部门记录。 FULL OUTER JOIN: 全外关联 SELECT e.last_name, e.department_id, d.department_name FROM employees e FULL OUTER JOIN departments d ON (e.department_id = d.department_id); 结果为: 所有员工及对应部门的记录,包括没有对应部门编号department_id的员工记录和没有任何员工的部门记录。 ORACLE8i是不直接支持完全外连接的语法,也就是说不能在左右两个表上同时加上(+),下面是在ORACLE8i可以参考的完全外连接语法 select t1.id,t2.id from table1 t1,table t2 where t1.id=t2.id(+) union select t1.id,t2.id from table1 t1,table t2 where t1.id(+)=t2.id ...

2012-11-27 · 15 min · 3180 words · lcf

快速匹配字符串

快速匹配字符串 假设内存有一个大字符串集,里面含有约1000万个字符串,如何快速知道该字符串集是否含有某个指定的测试字符串 ? (假设内存能放下这么多字符串) 方法一: hashCode法 方法二: Trie树 http://zh.wikipedia.org/wiki/Trie HashCode法 01 def sampleHashMap(strSet: Set[String]): Map[Int, Set[String]]={ 02 strSet.groupBy{ 03 s => s.hashCode 04 } 05 } 06 07 def contain(str: String, sampleMap: Map[Int, Set[String]]): Boolean = { 08 sampleMap.getOrElse(str.hashCode, Set[String]()).exists(_ equals str) 09 } 10 11 // 测试 12 val sampleSet = Set("a","b","c","AA","Archer","Jack"); 13 val sampleMap = sampleHashMap(sampleSet); 14 println(contain("Archer", sampleMap)); // true 15 println(contain("A", sampleMap)); // false 16 println(contain("a", sampleMap)); // true Trie树法 01 sealed abstract class Trie { 02 def contains(msg: String): Boolean = contains(msg, this) 03 04 @scala.annotation.tailrec 05 private def contains(msg: String, trie: Trie): Boolean = (msg, trie) match { 06 case (null, _ ) | (_ , null ) => false 07 case (StringCase(head, tail), TrieNode(edges)) => edges.get(head) match { 08 case None => false 09 case Some(subTrie) => contains(tail,subTrie) 10 } 11 case (StringCase(_,_), TrieLeaf()) => false 12 case _ => true 13 } 14 } 15 16 case class TrieNode(edges: Map[Char, Trie]) extends Trie{ 17 assert(edges.size > ) 18 } 19 case class TrieLeaf extends Trie 20 21 object StringCase{ 22 def unapply(s: String): Option[(Char, String)] ={ 23 if (s == null || s == "" ) None 24 else Some(s.head, s.tail) 25 } 26 } 27 28 object Trie{ 29 30 def apply(strs: String*): Trie ={ 31 apply(strs.toSet); 32 } 33 34 def apply(strSet: Set[String]) : Trie = { 35 if (strSet.size == || strSet == Set("")) TrieLeaf() 36 else { 37 val char2TrieSet = strSet.filter(_.length > ).groupBy(_.head).mapValues{ 38 strs => strs.map(_.tail) 39 }.mapValues{ 40 strs => apply(strs) 41 } 42 TrieNode(char2TrieSet); 43 } 44 } 45 46 } 47 48 val trie= Trie("abc","ac","b") 49 println(trie) 50 assert(trie.contains("") == true); // true 51 assert(trie.contains(null) == false); //false 52 assert(trie.contains("a") == true); // true 53 assert(trie.contains("b") == true); // true 54 assert(trie.contains("ab") == true); //true 55 assert(trie.contains("ac") == true); //true 56 assert(trie.contains("abc") == true); //true 57 assert(trie.contains("acb") == false); // false 58 assert(trie.contains("abcd") == false); //false 59 assert(trie.contains("bc") == false); //false

2012-11-26 · 2 min · 328 words · lcf

what if

what if 如果…将会怎么样 例句与用法: What if it is true? 如果这是真的又该如何呢? What if he doesn’t agree? 如果他不同意该怎么办呢? What if he comes back now? 如果他现在回来怎么办? What if I fail! 即使我失败了又怎样!

2012-11-25 · 1 min · 28 words · -

citrix

citrix install, uninstall, and update dpkg --list | grep -i icaclient download https://www.citrix.com/downloads/workspace-app/linux/workspace-app-for-linux-latest.html for ubuntu 24.04 Support for Ubuntu 2404 To support Citrix Workspace app for Linux on Ubuntu 2404, backporting the webkit2gtk library is required. Follow the steps below to backport the library based on your architecture: For x64 architecture: Add the following packages for jammy: sudo apt-add-repository deb http://us.archive.ubuntu.com/ubuntu jammy main sudo apt-add-repository deb http://us.archive.ubuntu.com/ubuntu jammy-updates main sudo apt-add-repository deb http://us.archive.ubuntu.com/ubuntu jammy-security main ...

2012-11-25 · 1 min · 167 words · -

normalize.css 简介

normalize.css 简介 大部分情况下,我们在页面中使用 CSS Resets 解决不同浏览器对 HTML 元素的默认 CSS 设置的差异。CSS normalization 则与 CSS Resets 不同,为了页面具有相同的表现,CSS Resets 对大多元素的样式进行了复位操作,而 normalize.css 则在保留原有表现的基础上进行值的重设并修复一些浏览器的 Bug。

2012-11-24 · 1 min · 20 words · -

SASS

SASS http://www.ruanyifeng.com/blog/2012/06/sass.html 作者: 阮一峰 日期: 2012年6月19日 学过CSS的人都知道,它不是一种编程语言。 你可以用它开发网页样式,但是没法用它编程。也就是说,CSS基本上是设计师的工具,不是程序员的工具。在程序员眼里,CSS是一件很麻烦的东西。它没有变量,也没有条件语句,只是一行行单纯的描述,写起来相当费事。 很自然地,有人就开始为CSS加入编程元素,这被叫做"CSS预处理器" (css preprocessor) 。它的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件。 各种"CSS预处理器"之中,我自己最喜欢SASS,觉得它有很多优点,打算以后都用它来写CSS。下面是我整理的用法总结,供自己开发时参考,相信对其他人也有用。 一、什么是SASS SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护。

2012-11-24 · 1 min · 15 words · -

自适应网页设计 (Responsive Web Design)

自适应网页设计 (Responsive Web Design) http://www.ruanyifeng.com/blog/2012/05/responsive_web_design.html 作者: 阮一峰 日期: 2012年5月 1日 随着3G的普及,越来越多的人使用手机上网。 移动设备正超过桌面设备,成为访问互联网的最常见终端。于是,网页设计师不得不面对一个难题: 如何才能在不同大小的设备上呈现同样的网页? 手机的屏幕比较小,宽度通常在600像素以下;PC的屏幕宽度,一般都在1000像素以上 (目前主流宽度是1366×768) ,有的还达到了2000像素。同样的内容,要在大小迥异的屏幕上,都呈现出满意的效果,并不是一件容易的事。 很多网站的解决方法,是为不同的设备提供不同的网页,比如专门提供一个mobile版本,或者iPhone / iPad版本。这样做固然保证了效果,但是比较麻烦,同时要维护好几个版本,而且如果一个网站有多个portal (入口) ,会大大增加架构设计的复杂度。 于是,很早就有人设想,能不能"一次设计,普遍适用",让同一张网页自动适应不同大小的屏幕,根据屏幕宽度,自动调整布局 (layout) ? 一、“自适应网页设计"的概念 2010年,Ethan Marcotte提出了"自适应网页设计” (Responsive Web Design) 这个名词,指可以自动识别屏幕宽度、并做出相应调整的网页设计。

2012-11-24 · 1 min · 31 words · -