2009年海外Web设计风潮(上)

Tags: Web, dev, others

这是 Smashing Magazine 花费几个月的时间研究编写的 2009 年 Web 设计风格与潮流,Smashing Magazine 的编辑们对当前流行的大量 Web 设计风格进行分析,总结出那些可能在 2009 年风行的潮流,包括新的设计元素,新的图形方式,并给出大量的漂亮的示例。这是第一部分10个潮流,第二部分15个潮流将于下周推出。

2009 Web 设计风潮

  1. 凸版印刷风格
  2. Web Design Trends 2009

  3. 富UI

    Web Design Trends 2009

  4. 透明 PNG

    Web Design Trends 2009

  5. 大字体

    Web Design Trends 2009

  6. 代用字体

    Web Design Trends 2009

  7. 灯箱框

    Web Design Trends 2009

  8. 媒体块

    Web Design Trends 2009

  9. 杂志式样

    Web Design Trends 2009

  10. 幻灯滚动

    Web Design Trends 2009

  11. 重点展示区域

    Web Design Trends 2009

 

1. 凸版印刷风格

这种风格有些出人意料,可能因为之前很少有人使用。该风格在在各种主题的网站中都有,但主要用于产品设计或在线服务类网站。

 

2. 富UI

现代 Web 中的 UI 变得越来越漂亮,越来越好用。过去的一年,Web 中的 UI 有了显著提高,有了一种接近桌面的感觉。Ajax 和 Flash 被广泛使用。

特别是我们比去年看到了更多留白区域,还看到很多现代的 UI 技术会显示用户同系统之间交流的视觉状态,比如,按钮在正常和被按下时显示不同的样子,用户同系统交互时能及时得到反馈,另外,越来越多的服务可以被用户定制。

这些设计显示 Web 设计师将更多精力放到了用户体验上。

 

3. 透明 PNG

使用 PNG 实现透明虽然不被 IE6 支持,却在过去的一年大行其道。设计师们似乎正在尝试将背景图片和内容融合并实现一些印刷媒体的风格。比如,将 PNG 半透明图片放到整体背景的某个区域上,用来加亮显示这个区域,如标题或声明。一些 PNG 同名技术还用来实现灯箱框效果。

Smashing Magazine 去年曾有篇使用透明效果实现创意设计的文章,很多设计师在他们的作品中开始尝试这些技巧。有趣的是,透明效果常被用于页首和页尾部分,不过也有些例外

 

4. 巨大字体

以前文章中我们曾介绍过巨型字体设计,2009年,巨型字体设计还会风行,尤其是那些设计社,以及展示型,产品介绍型,或在线服务型网站,他们会使用巨型字体显示重要信息。

巨型字体设计中使用的字号往往超过36px,设计师们对字体编排注入了更多关注,以实现更漂亮,更连贯,更值得信赖的站点。

 

5. 代用字体

设计师们还把更多注意力放到字体上,虽然经典的 Web 字体,Helvetica, Arial, Georgia 以及 Verdana 等仍占主流,一些代用字体正浮出水面(如 sIFR)。

有趣的是,这些字体会和设计无缝地衔接,设计师们似乎并非为字体而字体,而是要将字体同他们的设计结合在一起实现更漂亮的效果。

 

6. 灯箱效果

灯箱框是第二代弹窗,它们比第一代基于 JavaScript 的弹窗更友好,可以让用户将注意力集中到最重要的部分。这些窗口一般由用户的某个行为激发,并显示在其它内容的上层,他们有时候是半透明的,并包含一个关闭按钮。

 

7. 媒体块

随着宽带接入的普及,用户现在可以承担更丰富的内容,设计师们也借机提出更有吸引力的内容。越来越多产品网站使用媒体块显示视频,让用户更容易理解 这些内容。用户只需靠在椅子上看视频,不需要一步一步往下点,这些食品通常比较短,直奔主题,虽然很正规,但也包含一些娱乐性。

不过请注意,视频应当是你内容展示方式的次要选项,并不是所有人都有宽带接入,也不是所有人都喜欢有视频播放(他们可能正在后台听网络收音机或播放音乐),另外,也不是所有人都启用了 Flash 和 Javascript。

 

8. 杂志外观

传统印刷媒体设计中使用的编排技术也出现在 Blog 设计中,文章的编排,文字排版,图片甚至对其方式。基于网格的设计也很流行,但主要用于展示与产品页以及大型博客,极少用于公司网站或网店。

 

9. 滚动幻灯导航

幻灯片水平和垂直滚动,可以向不同方向滚动,当前项加大加亮。这种导航技术可以让用户快速直观地浏览站点中的内容。一般常用语娱乐性网站,另外,设计者还可以使用该技术展示他们的作品。

 

10. 在重点位置做形象展示

网站的左上方一般是一个站点最重要的区域,因为那是用户注意力最集中的地方。因此,在那个部位放上网站中最重要的信息是明智之举。

事实上很多设计师正是这样做的,不管是 Web 程序,公司网站,在线服务还是作品展示,设计师们将口号或简介性内容放在那里,并使用醒目的排版给用户以良好的第一印象。这些内容长短不一,不管哪种方 式,但它们都占据可观的空间,一般横跨整个幅面,高度在250到400之间。不过这些形象展示性区域一般并不用于博客或在线商店。

 

未完待续

本文国际来源:http://www.smashingmagazine.com/2009/01/14/web-design-trends-for-2009/
中文翻译来源:COMSHARP CMS 官方网站(35公里译)

No Comments 2009-01-20 20:25:17 by No.0023

2008年国外最佳Web设计/开发技巧、脚本及资源总结

Tags: GAE, dev

2008-最佳-前端开发

今天是2008年的最后一天,彬Go为大家奉上今年的最后大餐,这篇文章将为大家总结08年国外一些比较不错的前端开发相关的教程、技巧、脚本、实 例及工具资源等,有一些是曾经彬Go发表过的翻译文章。实在是丰盛的需要消化很久…无论您是刚入门的前端开发菜鸟,还是有多年前端开发经验的高手,我相信 下面的这些日志总会有您需要的!

工具&Web应用

13个可能会让你说”Thank You”的必不可少的开源应用

14个免费工具让你了解为什么人们会放弃访问你的网站

40+CSS生成器

74个我们可能已经忘记的适合网页设计师的很棒的Web应用

50+能提高你的网站速度和性能的技巧和资源

15个可以监视网站人气的工具

20个免费的SEO网站分析工具(已翻译成中文)

11个功能强大甚至可以替代标准应用程序的Firefox3扩展插件

10个你至少应该了解的免费照片管理软件

作为Web前端开发工程师应到感谢的15件事

15个前端开发/网页设计师必备的Bookmarklet(已翻译成中文)

20大的PHP开发框架

66个学习网页设计基础的链接

Web开发工具箱: 120 +Web开发新工具

脚本、补丁及Hack

40大免费Ajax及JavaScipt代码

所有顶级网站应有的15个关键元素

将PSD效果图转换为HTML/CSS的10大教程

30+JavaScript, Ajax & CSS工具提示脚本

50+漂亮的基于纯CSS的导航脚本

40+最热门的wordpress秘诀和技巧30+ More

30+让你大开眼界的Web前端开发视频教程

19个CSS菜单教程来为你的网站添加更多趣味

精选30个优秀的CSS技术和实例(已翻译成中文)

34+免费通讯(Email等)用HTML模板

50个优秀的Ajax教程

12种Javascript解决常见浏览器兼容问题的方法(已翻译成中文)

15个有帮助的基于浏览器的Web前端开发工具

75个(真正的)很有帮助的JavaScipt技术

63个必不可少的Wordpress Hack、教程、帮助文件和手册

Web设计/开发最佳使用手册(19)

10个针对Worpress有用的RSS技巧和Hack

20个神奇的Javascipt脚本原型、元素、Widgets、类…

10个聪明的JavaScipt技术用来提升你的UI界面

10个你必须知道的很棒的Ajax特效

35个使用简便的Ajax/JavaScipt导航解决方案

10大CSS按钮教程列表

10个免费图表脚本

技巧

10个精通PHP的原理

6个简单方法来改善您的HTML邮件

整理及优化CSS代码的7个原则(已翻译成中文)

保持你的代码整洁的12个原则

10个改善你编程的高级PHP技巧

使用CSS为图片添加更多趣味的5种方法(已翻译成中文)

10个优化技巧

所有网站都应具备的10个SEO元素

来自8为极具灵感的演讲者的10个网络应用技巧

编写赏心悦目的代码的7种方法

10个CSS简写技巧让你永远受用(已翻译成中文)

10个Web开发小技巧

15个必须学会的CSS技巧

101个CSS技术-第一部分,第二部分

资源

推荐20个关于网站可用性及界面设计的网站(已翻译成中文)

精选31个网站界面设计实践教程(已翻译成中文)

成为Web设计/开发自由职业者所要遵循了53个步(60+资源)

Ajax网页趋势研究,什么是最好的免费Ajax资源?(70+最佳Ajax资源)

155个Wordpress资源、教程、插件、主题、Ajax、播客…庞大的WP列表

10个非常棒的Ajax及Javascript实例资源网站(已翻译成中文)

精选2008年最佳设计素材资源&灵感 (已翻译成中文)

10种JavaScript特效实例让你的网站更吸引人

精选15个国外CSS框架(已翻译成中文)

41个最佳Mootools Ajax实例下载

推荐20个让你学习并精通CSS的网站(已翻译成中文)

65个优秀的jQuery资源(教程、手册、电子书、demo、插件…)

300+Jquery, CSS, MooTools 和 JS的导航菜单资源(已翻译成中文)

推荐12款可用于前端开发的免费文本编辑器

网页设计必备的10套漂亮图标集(已翻译成中文)

生成器

25个用于网页设计的颜色调色板生成器资源

12款免费在线工具帮助你创建和托管你的网站

25款Web2.0生成器

插件和主题

10个用来得到更多评论的最棒的插件

将Wordpress变为CMS系统的20大插件

你会用在Wordpress主题或博客中的10款插件

10款用于评分和投票的Wordpress插件

30款确实有用的Wordpress插件

你早晚会用到的130款Wordpress插件-第一部分-第二部分

18个让你的博客更专业的Wordpress插件

7个创建你自己的CSS画廊的Wordpress主题

 

 

英文原文:Best of 2008 for developers: 2008+ tips, tricks, scripts and sources!
翻译原文:2008年国外最佳前端开发技巧、脚本及资源总结(暴风彬彬)

原载:彬Go-集前端开发/网页设计/网站可用性/用户体验于一体的趣味互联网生活



来自:http://blog.bingo929.com/

No Comments 2009-01-01 22:40:42 by No.0023

The Best Cheat Sheets for Web Developers

Tags: dev

1. jQuery Cheat Sheet

jQuery Cheat Sheet

2. Mootools Cheat Sheet

Mootools Cheat Sheet

3. Ruby on Rails Cheat Sheet

Ruby on Rails Cheat Sheet

4. Django Cheat Sheet

Django Cheat Sheet

5. YUI Cheat Sheet

YUI Cheat Sheet

6. Prototype Cheat Sheet

Prototype Cheat Sheet

7. Scriptaculous Cheat Sheet

Scriptaculous Cheat Sheet

8. extJs Cheat Sheet

extJs Cheat Sheet

9. Javascript Cheat Sheet

Javascript Cheat Sheet

10. HTML Cheat Sheet

HTML Cheat Sheet

11. CSS Cheat Sheet

CSS Cheat Sheet

12. Mod_Rewrite Cheat Sheet

Mod_Rewrite Cheat Sheet

13. Regular Expressions Cheat Sheet

Regular Expression Cheat Sheet

14. PHP Cheat Sheet

PHP Cheat Sheet

15. MySQL Cheat Sheet

MySQL Cheat Sheet

16. SEO Cheat Sheet

SEO Cheat Sheet

 

 

No Comments 2008-11-06 17:34:21 by No.0023

gcc

Tags: dev

八月初 Mark Mitchell 发布了 GCC 4.3.2 版本,GCC是GNU编译集合,包括C, C++, Objective-C, Fortran, Java, and Ada编译器等。从这里下载最新的GCC: http://gcc.gnu.org/mirrors.html



让我们了解一下GCC 4:

在过去的几年中,GNU Compiler Collection (GCC)一直在做GCC 3 到 GCC 4 的主要版本转换。GCC 4是一个重要的版本,GCC 4 新增了很多新的最优化框架(和新的中间代码生成),新的架构和语言支持,多种新属性和选项变化。了解GCC 4新的属性和它们的优点很有必要。

GCC是所有开发的基石,不管是对开源世界和闭源世界。它让操作系统和架构能够运行。当一个新的处理器出现,它必须依赖一个GCC版本支持(GCC在后台为它提供代码生成)。GCC也让开源操作系统Linux得以运行,让Linux进入嵌入开发领域成为现实……

但是GCC并不是静止的,新的处理器架构不停的出现,新的研究发现更好的方式来生成最优化代码,所以GCC也在一直在发展中,并且成功的发布了新的主要版本GCC 4。本文将浏览GCC的核心修改,让你熟悉新的编译标准。

首先简短复习一下的GCC历史:

GCC 最初是GNU C Compiler,由大名鼎鼎的 Richard Stallman 同学 在1987年首次发布。Richard开始这个项目于1984年,期望建立一个免费的C编译器,能够被使用和修改。GCC 最初跑在早期的Sun和DEC VAX系统上。

作为一个开源的编译器(意味着源代码是公开的),其他开发者也在热心帮助修复bug,更重要的是升级GCC支持新的语言和其他目标架构。不久以后,它的名称变成GNU Compiler Collection,它已经支持多种语言和最流行的架构。

GCC发布历史:



今天GCC已经成为最流行的编译器,支持Ada, Fortran, the Java™ language,  C 的变种 (C++ 和 Objective-C),以及覆盖了最大范围的处理器架构(支持30种处理器家族),GCC源代码移植到了超过60种平台,也是目前现存的最复杂的开源 系统,GCC现在拥有大概150万行源代码。

在开始之前简单了解GCC的基本架构:

编译器是一种pipeline管道架构,通过不同的层次为不同类型的数据进行通讯(见下图)。前台编译器针对特殊语言,包括特定语言的语法分析 器,解析为树状结构和中间状态代码(使用注册转换语言Register Transfer Language:RTL)。后台编译器提供与语言无关的解析和针对特定目标架构的创建结构。为了达到这个目标,最优化使用RTL创建更快速或者更简洁代 码(如果可能,两者同时兼顾)。最优化的RTL被代码生成器获取,然后生成目标代码。



GCC 4的核心转换:

GCC 4 提供许多标准编译器组件的修改,最大更改是通过引进树静态单一分配(tree Static Single Assignment:SSA)格式对代码最优化的支持。GCC 4 对于 警告warning和错误error的展示是非常彻底的(事实上,一些特定的警告信息在GCC 4中已经显示为错误)。GCC 4的一个退步是它并不是GCC 3创建对象的字节编译,这意味着GCC 3编译的代码必须通过GCC 4重新编译。不幸的是,这样的成本就要增加。

让我们看看GCC 4 的主要进步。

4.0 发布系列:

4.0系列(4.0.4是最后版本),是GCC 进入 第4版的第一步,所以并不推荐使用在生产环境中,这个版本包含很多修改,一个是前面介绍的树静态单一分配SSA,另外一个是autovectorization自动矢量化。

在GCC 4之前,中间代码名叫Register Transfer Language (RTL),RTL是一个低层的代码,非常类似于汇编语言(从LISP S-expressions获得灵感)。RTL的问题是它对转换成最终目标提供了优化,确失了解释信息。当需要支持更好的分析和优化的时候,Tree SSA 设计用来同时独立于语言和目标。

Tree SSA 引入了两个新的中间代码,第一个叫 GENERIC ,这是一个普通的树结构,用来形成前台树格式。 GENERIC 树转换为 GIMPLE格式和子序列控制流图来支持基于SSA的最优化。最后SSA树转换为RTL,这用于后台来做最终目标的代码生成。简单的说,就是,引入 Tree SSA的好处就是提供新的中间代码让高层和低层的最优化都做到最好。

GCC 4另外一个有趣的变化是添加了loop vectorizer 循环矢量(也是基于Tree SSA框架)。Autovectorization 自动矢量化让编译器标识代码内的分级进程循环,让目标处理器能够获得矢量指令的优势。结果是获得更加严格和高效的目标代码。另一个基于循环优化的是 Swing Modulo Scheduling (SMS),通过减少构造层平行数量来构建最小循环指令管道。

最后 4.0 系列引入很多C 和 C++ 修改,新的Fortran 前台,支持Fortran 90 和 95 (而不是古老的Fortran 77,GCC 3支持)。新的Ada 2005功能,支持更多Ada新的架构。

4.1发布系列:

改进的属性支持和更精确的分支可能性预判。两个很有用的优化是更好的内联支持和减少本地指令缓存能力。如果函数是内联方式,编译器不再频繁执行。 而且热点调用区域将更可能通过内联来保持代码数量尽可能小,获得内联函数的优势。GCC能够帮助分段函数进入热点或者冷静区域。保持热点函数放在一起,获 得更好的指令缓存。

前台做了系列更新,包括支持Objective-C++。同时有大量针对java核心库(libgc)的更新。后台引入对IBM® System z™ 9-109 处理器支持,包括支持128位指令代码,Electronics Engineers (IEEE)浮点数,和内建原子内存存取能力。如果这些还不够吸引眼球,那么后台现在还能够发出保护堆栈攻击的指令,这意味着,如果缓冲buffer溢出 被检测到,将重新排列保护指针不会崩溃。一些内建功能也被更新,用来保护缓冲buffer不会被过量请求占用。

4.2发布系列:

4.2版本继续支持更好的优化,同时包括语言和处理器架构的进步。后台更新包括对Sun的UltraSPARC T1处理器支持(代码名称Niagara),同时支持Broadcom的SB-1A MIPS 芯片。前台修补了C++可视化处理机制,支持Fortran 2003 输入/输出流扩展。但是4.2最有趣的更新是添加了C,C++和Fortran编译器的OpenMP功能。

OpenMP是一个多线程实现,允许编译器生成平行任务和数据代码。

OpenMP一个概念:代码能够通过区域注释,这块区域平行处理能够被处理器直接使用。代码转换成多线程程序,用来处理代码块存在,然后在代码块结束后进入每个线程。

下图提供了处理器如何工作的示例。



4.3发布系列:

这个发布系列显示功能和支持架构的加速进步 (比如很多陈旧的架构支持被删除)。新的语言支持,比如添加对Fortran 2003支持。新的处理器支持,包括支持Coldfire 处理器家族, IBM System z9 EC/BC 处理器,Cell broadband engine 晶格宽带引擎架构的互协作处理器单元(Synergistic Processor Unit :SPU),支持SmartMIPS等。你将发现Thumb2的编译和库支持(简洁的ARM指令)以及对ARMv7架构支持,支持 Core2 处理器和Geode处理器家族。

4.3 发布以后:

已经开始4.4版本开发了,这个版本即将发布,在4.4版本中OpenMP的3.0版本规格将应用到C, C++, 和 Fortran中。

编译器现在允许你定义一个在函数层进行优化的级别,(代替文档层,原先是缺省设置)。这个功能提供优化参数,提供独立的选项做优化。

最后处理器将添加Picochip支持,这是一个16位多核处理器。

GCC的未来?

GCC的未来是光明的。GCC将支持更多的处理器和架构,GCC几乎涵盖整个开发语言。开发方面还支持一系列不同的语言,比如 Mercury,GHDL(一个用于VHDL的GCC前台语言),和 统一的并行C语言(Unified Parallel C language :UPC)。

由于GCC的进步,几乎所有的软件将从GCC的进步中获得好处(从Linux和Berkeley软件到Apache等),通过GCC 4进行软件编译将更加简洁和快速。

来自:ibm.com

No Comments 2008-11-06 17:27:32 by No.0023

firebug

Tags: dev

Firefox扩展Firebug是一个全功能的Web 应用程序调试器,可以协助Web黑客洞悉复杂的Web 应用程序的内部工作机制。它有两种版本:一种可以跨浏览器使用的组件Firebug Lite,另一种是专用于专用于火狐浏览器的扩展Firebug。本文将着重向读者介绍前者的用法。

一、简介

浏览器扩展Firebug提供了一个集成环境,我们能够在其中对感兴趣的Web 应用程序进行的全面的分析(参见图1)。它提供了许多功能,可以探索DOM结构、动态地修改HTML 代码、跟踪和调试JavaScript代码、监视网络请求和响应等等。

 

 
图1  浏览器扩展Firebug

二、利用Firebug控制台劫持函数

Firebug控制台可以用来计算表达式。作用如同命令行JavaScript解释器。在控制台中,我们不仅可以输入JavaScript表达式(例如,Alert (‘Message’);),而且还能接收错误消息。如下图所示:

 
图2  Firebug控制台

您也可以动态插入代码,举例来说,如果要测试一个Web 应用程序,该程序有一个从窗口对象导出的方法,称为performRequest。应用程序使用该方法从客户端发送请求到服务器。我们更感兴趣的可能是这个函数请求的信息,所以我们将在控制台中提供下列命令来劫持该方法:

window._oldPerformRequest = window.performRequest;

window.performRequest = function () { console.log(arguments);

window._oldPerformRequest.apply(window, arguments) }



上述代码实际上将用我们自己的函数替换原先的performRequest函数,我们的函数执行时将在控制台中列出所有参数。当函数调用结束时,我 们将代码流程重定向到oldPerformRequest定义的原先的performRequest上,它将执行要求的操作。现在,我们已经明白如何在无 需改写Web 应用程序的方法的情况下来劫持函数。

二、利用Firebug浏览和动态修改HTML元素

许多Web开发人员和设计者经常忽视HTML 源代码的可读性,尤其是用所见即所得的编辑器产生的页面。这会加剧我们审查其源代码的难度,这时,我们就需要使用其他一些工具来重新组织页面的各个部分。当然,我们可以使用DOM Inspector来探索这些结构欠佳的HTML 源代码,而Firebug也能达到同样的目的,下面是Firebug的HTML视图。

 

 
图3   Firebug的HTML视图

如图3所见,可以选择并展开当前视图中的每个HTML 元素。当鼠标停在某个元素上的时候,浏览器就会高亮显示对应元素。在右边的窗口,显示了关于式样、布局和DOM 特性的信息。DOM信息极为有用,当您想查询各种不同类型的属性可用时,几乎与DOM Inspector一样。此外,我们也可以用它探索应用程序运行机制。举例来说,AJAX应用开发人员经常会为图像、链接及其他类型的html 元素添加附加的属性,而这些属性和方法可能是应用程序逻辑的关键部分。

HTML视图还能用于动态地修改应用程序文档的结构。我们可以通过按下键盘上的删除键来删除所选定的元素,或者修改各个元素的属性,方法是在元素属 性上双击并设置它的值。注意,HTML 结构的改变可能对页面更新事件不起作用。如果希望变化固定下来,可以使用GreaseMonkey脚本。

三、利用Firebug调试JavaScript脚本

Ajax 应用程序通常涉及JavaScript、XML和 按需信息检索。它们的规模常常超过正常应用程序,并且运行起来很像是桌面应用程序。因为大量使用JavaScript,所以您将发现标准漏洞估计程序将无 法覆盖所有可能的攻击方式。就像二进制程序测试一样,我们需要使用调试器来跟踪代码、分析程序结构和调查潜在的问题,Firebug为我们提供了所有这些 功能,下图向我们展示了Firebug脚本调试器视图。

 

 
图4  Firebug脚本调试视图

在图4中我们可以看到一个断点,其位于第2行。 断点是些伪指令,用来通知JavaScript解释器当代码抵达这些断点时停止/中止该进程。一旦程序暂停,我们就可以查看存放在全局、局部变量中的当前 数据,甚至更新它们。我们不仅可以通过它来了解程序正在干什么,并且还能取得对应用程序的完全控制。

在图4的右边,您可以看到监视和断点列表。断点列表包含我们在当前调试的代码中设置的全部断点。您可以迅速禁用和启用断点,但是却无需知道断点的精确位置。

监控列表提供了一个机制来监视DOM结构中的变化。举例来说,如果想知道某个的值在程序运行过程中的变化情况,只须简单创建一个相应的的监控条目即可。

DOM是存放Web 应用程序的内容的地方。DOM结构提供了动态编辑页面的所有必要功能,比如去除和插入html 元素、初始化计时器、创建和删除Cookie等等。DOM 是所有的Web 应用程序最为复杂的组件,所以对它的检查也是最难的。然而,Firebug 能够提供有用的DOM 视图,它的使用跟DOM Inspector一样。图5展示了Firebug的DOM 视图。

 
图 5  Firebug的DOM视图

如上图所示,DOM包含一个长长的元素表。我们可以查看当前可用的一些函数。通过使用Firebug的DOM 视图,我们可以检查当前打开的应用程序的各个部分。我们可以在一个树状结构中查看当前可用的所有属性和对象,并可以展开这些元素和对象来查看他们的子属性。

五、利用Firebug监视网络

Firebug最强大的的特性之一是网络流量监控功能。当我们想要监视应用程序内部发出的Web请求时,这个视图极为有用。当 然,LiveHttpHeaders扩展也可用来监视网络,但是它会把全部请求显示在一个列表中,而Firebug却可以详细查看每个请求的每个字符。

 

 
图6  Firebug的网络视图

在网络视图的顶部,我们可以选择不同类型的网络活动,在上图中我们要查看所有请求。 然而,您可以只列出特定对象发出的请求。Firebug一个更为有趣的特性是该扩展将会记录全部网络活动,不管它是否打开。这个特性跟扩展 LiveHttpHeaders有所不同,后者只有当它打开时才会记录网络事件。然而,与LiveHttpHeaders扩展不同的是,Firebug不 能重放网络活动,但是将能更细致的观察网络流量。下图展示了Firebug正在检查请求和响应头以及发送的参数。

 
图7  利用Firebug查看网络请求

六、Firebug Lite简介

Firebug Lite是一个跨浏览器的组件,能够轻易地嵌入到需要测试的应用程序中它是专为开发人员而非安全研究人员设计的,并且没有Firefox扩展版本那样多的用途。然而,它在某些情况下是非常有帮助的,比如需要在Internet Explorer、Opera及其他不支持Mozilla平台的跨平台安装(XPI)型文件的浏览器中调试应用程序时。

使用firebug lite之前,必须在需要调试的应用程序内嵌入一些脚本标签。我们必须在使用FireBug的应用程序页面内放入下列脚本标签:

 language="javascript" type="text/javascript"
src="/path/to/firebug/firebug.js">

要跟踪应用程序中的某个变量时,可以使用控制台对象。举例来说,如果我们想要跟踪下列循环中变量item的变化,可以使用下列代码:

function (var item in document)

console.log(item);



七、结束语

Firefox扩展Firebug是一个全功能的Web 应用程序调试器,可以协助Web黑客洞悉复杂的Web 应用程序的内部工作机制。本文详细介绍了在安全测试过程中的使用方法,如劫持函数、浏览和动态修改HTML元素、操作DOM、监视网络以及调试脚本等等。 最后,我们还对Firebug Lite做了简要介绍。

 

from http://soft.ccw.com.cn/news/htm2008/20081031_534852.shtml

No Comments 2008-11-06 12:42:09 by No.0023

用 Python + django 10分鐘內作出一個 blog

Tags: Python, dev, Django

Ruby on Rails 的官方網站上有 15 分鐘作出一個 weblog 的 screencast,的確 demo 了 RoR 開發的快速。不過萬萬不可太迷信只有 RoR 能這麼神速,根據最近擠出一點時間看 django 的東西後,我也想先來作個「10分鐘做出 blog 的挑戰」。(由於還不太會用製作 screen cast 的軟體,所以只能用文字介紹..)這篇文章只是描述一下建構過程,所以不會介紹 django 環境的安裝設定,請讀者見諒。

稍微簡介一下 django,它是一個基於 Python 語言的 Web 開發框架(framework)。

建立 project 及 app

在 django 的環境裡,一個 project 裡可以有很多個 application,如此一來同一個 project 下的 application 便能共用同一套環境設定。所以我們先在命令列下執行 django-admin.py 來建立一個 project:

django1

先來改一下 demo/settings.py 的設定,裡面設定我們會用 sqlite3 來作資料庫的引擎,然後產生一個 demo.db 的檔案來當資料庫,再設定一些時區及 template 目錄等:

DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'demo.db'
...
TIME_ZONE='Asia/Taipei'
LANGUAGE_CODE='zh-tw'
...
TEMPLATE_DIRS = (
...
'.',
)

INSTALLED_APPS = (
'django.contrib.admin',
..
'demo.blog', # 等一下就會產生
)

然後在 demo 目錄下建立一個 blog 的 app:

圖片 1

然後在 demo/blog/models.py 裡建立需要的 model(DB Table):

from django.db import models

class Category(models.Model):
name = models.CharField(max_length=32)
def __unicode__(self):
return self.name
class Admin:
pass

class Article(models.Model):
title = models.CharField(max_length=64)
published_at = models.DateTimeField('date published')
content = models.TextField()
category = models.ForeignKey(Category)
def __unicode__(self):
return self.title
class Admin:
pass

然後可以看看 django 產生的 SQL DDL,確定的話就用 syncdb 來建立資料庫表格:

django3 django4

其中會要求你建立一個管理者帳號,這是為了之後進管理介面發表文章使用的帳號。完成這些動作之後,修改一下 demo/urls.py 的內容:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
(r'^blog/', include('demo.blog.urls')),
(r'^admin/', include('django.contrib.admin.urls')),
)

先在 demo/blog/ 下建立一個 urls.py 的檔案,然後在命令列下輸入 python manage.py runserver,再打開瀏覽器輸入網址 http://localhost:8000/admin/ 馬上就有一個後台介面可以使用了呀!

django5 django6
發表文章的介面還蠻好用的呢

登入後你就可以直接建立 Category 及 Artical 的內容,這不就是一個現成的文章發表介面了嗎?一開始操作到現在不會超過5分鐘吧!

文章列表、單篇文章

可以發表文章之後,當然是要能夠瀏覽呀,所以我們馬上打開 demo/blog/urls.py 這個檔案,然後貼上下列的 code:

from django.conf.urls.defaults import *
from demo.blog.models import Article

info_dict = {
'queryset': Article.objects.all(),
}

urlpatterns = patterns('',
(r'^$', 'django.views.generic.list_detail.object_list', info_dict),
(r'^(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', info_dict),
)

然後再分別建立 demo/blog/article_list.html 及 demo/blog/article_detail.html 這兩個檔案,分別表示文章列表及文章內容:

article_list.html:

{% if object_list %}
{% for article in object_list %}
<div class="article">
<div class="title"><a href="/blog/{{ article.id }}">{{ article.title }}</a></div>
</div>
{% endfor %}
{% else %}
<p>對不起沒有文章喔!</p>
{% endif %}

article_detail.html:

<div class="article">
<div class="title">標題: {{ object.title }}</div>
<div class="pub_date">{{ object.published_at }}</div>
<div class="content">{{ object.content }}</div>
<div class="category">發表於: {{ object.category.name }}</div>
</div>
<p><a href="/admin/blog/article/{{ object.id }}">修改</a></p>
<p><a href="/blog">BACK</a></p>

這樣很快就弄出一個很像樣的 blog (只是不能留言 XD),網址在 http://localhost:8000/blog/。

django7 django8

很快吧!當然我忽略了美工,也沒有客製化一下後台,不過 Web 開發愈來愈可怕了….真怕這種開發框架愈來愈多,老板都覺得寫網頁沒什麼了呢!

值得一提的是,django 在 runserver 之後,都會把程式碼 compile 成 pyc 檔,看起來效率應該還不錯,也許要等我多玩熟一點才能做些實驗囉。

from http://blog.ericsk.org/archives/815

 

1 Comment 2008-10-20 16:58:36 by No.0023

120+网页开发资源汇集

Tags: dev

"工欲善其事,必先利其器。"花大量时间去找资源和工具是件令人痛苦的事,好在有大善人为我们做了这件事,这里有超过 120 个网络开发资源,因篇幅过长,以下只是一部分,更多请见文末链接。



参考手册和综合资源:

TechCheatSheets-收集各类编程的清单和参考指南。
Creative Commons-用它给你做的网络应用程序授以部分或全部权限。
Yahoo! Design Pattern Library-雅虎设计模式库(带详解的常见问题最佳解决方案)

综合开发工具:

TurboDbAdmin-一个基于浏览器、用来察看和编辑数据库且无需刷新和提交的解决方案
GENNIT-帮您生成代码,节省大量时间
Kaosweaver-Dreamwaver拓展,包括"高级随机图片"和"面包屑"( Breadcrumbs ,"面包屑型"网站架构)。

应用程序开发工具:

Coghead-用直观的界面开发基于网络的应用程序。
Iceberg On Demand-一个基于网络用来开发、分享和销售网络应用程序的平台。
Nenest-一个网络应用程序框架,包括一个表单开发工具和数据库,且无需编程。

代码片断(Code Snippets)、搜索引擎和宝库(Repositories):

krugle-一个代码搜索引擎。
All The Code-源码搜索引擎。
Ohloh-开源软件目录。

开发环境及框架:

BackBase Ajax 360-一个企业级 Ajax 开发框架。
Maguma Workbench-全功能的 PHP & Python 集成开发平台
Tapestry-用来开发动态、强健、高可拓展性 Java 网络应用程序的开源框架。

聚合(Mashup)与API:

OpenKapow-聚合编辑器和主机寄存(hosting)服务。
Dapper-允许你抓取来自任何网站的 RSS、XML 或任何其他类型的订阅,使之对你的聚合或其他应用程序有效。
OpenLayers-允许你把一个动态地图放置在任何网页上。

测试、查错和工程管理:

spigit-它是一个可供开发者展示他们的新想法和开创一个专业的网络的社区。通过模拟,使你能在发布一个beta之前去开发和完善你的构想。
Rainbow9-在线编码、测试 javascript、css和html。
16bugs-容易而不冒失的 bug 查找

Ruby & Ruby on Rails 资源及工具:

Ruby on Rails-一个偏爱常规的开源网络框架。
Instant Rails-一个"运行时"(runtime)方案,预置Ruby, Rails, Apache and MySQL,无需安装。
Nitro-Ruby和Javascript网络应用程序框架,轻易创造出 Web 2.0 应用程序。

Ajax 资源及工具:

ajaxload.info-这个易上手的网络应用程序使你创造出基于AJAX的载入条、花朵(和其他形态的),用以显示网站载入状态。
Aptana-免费、开源的以 Javascript 为中心创建 AJAX 应用程序的开发环境。(不错,我用过,也可编辑CSS)
Mini ajax-提供免费、简易、可下载的 ajax & dhtml 代码。

PHP 资源及工具:

PHP Object Generator-生成完整的 PHP4/PHP5 面向对象代码。
Symfony-一个 PHP5 工程专用的网络应用程序框架,有简单模版、Ajax 支持、智能 URL 等功能。
CakePHP-它是一个快速的PHP开发框架,提供结构化的框架使各种水平的 PHP 用户都能快速地开发出可伸缩性的网络应用程序。

Flash 资源及工具:

flashvillage-免费高质量 flash 模版。需注册才能下载。
Dontclick.it-一个用以创建免点击用户界面的框架。
Flash Developer Center-Adobe 公司的flash 开发者中心,提供下载、实例、快速启动和社区。

Python 资源及工具:

Pylons-将 Ruby、Python & Perl 结合在一个轻量级的网络框架中,使之能在快速开发的同时,依然保持可拓展性。
zope-支持 Python 网络应用程序的开源应用程序服务器。
Spyce-使网络开发又变得有趣。

 

from http://www.wujianrong.com/archives/2008/10/120.html

No Comments 2008-10-20 09:00:27 by No.0023

代码之美(精选版)

Tags: dev, others

本迷你书是《代码之美》的精选版(互动出版网购买), 包括正则表达式匹配器、最美丽的代码、美丽测试、NASA火星漫步者任务中的高可靠企业系统、美丽的并发、以REST方式集成业务伙伴等。《代码之美》由 华章图书出版公司出版,全书收录的皆为软件设计领域中的一组大师级作品。每一章都是由一位或几位著名程序员针对某个问题给出的完美的解决方案,并且细述了 这些解决方案的巧妙之处。

《Beautiful Code》是由Greg Wilson在2006年构思的,本书的初衷是希望从优秀的软件开发人员和计算机科学家中提炼出一些有价值的思想。他与助理编辑Andy Oram一起走访了世界各地不同技术背景的专家。一堆如雷贯耳的名字居然出现在同一本书中,怎能不令人兴奋?! 你是程序员吗?你对代码之美的认识是什么?33位作者,33个来自不同开发领域的专业经验,33种不同的意见。你想知道牛人们对代码之美是怎么想的吗? 其实,这本书最奇妙的地方还不在于这一点,而在于,如果你知道这些作者的名字,你肯定会忍不住去看一看。如果你不知道这些作者的名字,你更加会忍不住去看 一看。因为你知道这些人的观点肯定不会让你失望!

免费下载,购买原版《代码之美》

如果你喜欢本书,请通过购买本书原版《代码之美》支持华章图书出版公司和InfoQ中文站。 免费下载这本书(PDF) 免费下载这本书(PDF)

 

from http://www.infoq.com/cn/minibooks/beautiful-code

No Comments 2008-10-18 15:37:45 by No.0023

count_history_cmd.py

Tags: Python, dev

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import os

def f(his, n):
    lines = open(os.path.join(os.getenv('HOME'), his)).readlines()
    d = {}
    for line in lines:
        line = line.split()
        if not line: continue
        s = line[0]
        if line[0] == 'sudo':
            s = line[1]
        d[s] = d.get(s, 0) + 1

    l = sorted(d.items(), key=lambda t: t[1], reverse=True)
    for t in l[:n]:
        print '%s : %d' % (t[0].ljust(16), t[1])

if __name__ == '__main__':
    from optparse import OptionParser
    parser = OptionParser()
    parser.add_option('-f', '--file', dest='f', default='.history',
                      help='the history file', metavar='FILE')
    parser.add_option('-c', '--count', dest='c', type='int', default='30',
                      help='for display count', metavar='COUNT')
    (options, args) = parser.parse_args()
    f(options.f, options.c)

 

运行结果:

Shell:~ >: count_his_cmd
cd               : 4895
ls               : 4533
vi               : 988
man              : 679
hitfm            : 583
cat              : 532
ifconfig         : 414
ant              : 401
rm               : 386
lt               : 349
ll               : 341
tmp              : 340
svn              : 333
tlist            : 332
top              : 311
my               : 292
exit             : 278
run              : 277
unlcall          : 249
pkg_list         : 249
glib             : 242
locate           : 235
shutdown         : 226
bbs.sh           : 220
check            : 216
ping             : 215
pkill            : 198
mv               : 196
vpn              : 190
sock             : 186
Shell:~ >:

 

from http://code.google.com/p/mylibs/source/browse/trunk/tools/Python/count_history_cmd.py

No Comments 2008-10-15 22:21:44 by No.0023

PyConUK 2008

Tags: Python, dev

No Comments 2008-09-22 15:33:45 by No.0023

GAE SDK update

Tags: GAE, Google, dev

Notable new features in this SDK are:

  • Support for zipimport and a new module, zipserve, which serves static files from a zip archive. These allow you to work past the 1000-file app deployment limit.
  • The development console now includes a memcache viewer (you can use this by accessing http://localhost:8080/_ah/admin while your app is running on the SDK).
  • URLFetch now allows users to disable automatically following HTTP redirects.
  • We now allow composite indexes with repeated properties.

It also includes the following issue fixes:

  • It correctly escapes path separators in static_dir path on windows.
  • Sending email messages with unicode content now works.
  • Fixed db.run_in_transaction so that it doesn't allow inserting two (or more) new root entities in a single transaction.
  • The new SDK is available for download, and as always, we welcome your feedback on the group!

    No Comments 2008-09-19 20:29:12 by No.0023

    An enhanced interactive Python shell

    Tags: Python, dev

    Shell:~/tmp >: rpm -qi ipython
    Name        : ipython                      Relocations: (not relocatable)
    Version     : 0.8.2                             Vendor: Fedora Project
    Release     : 1.fc9                         Build Date: 2007年12月13日 星期四 09时21分06秒
    Install Date: 2008年09月19日 星期五 12时11分45秒      Build Host: ppc4.fedora.phx.redhat.com
    Group       : Development/Libraries         Source RPM: ipython-0.8.2-1.fc9.src.rpm
    Size        : 4124412                          License: BSD
    Signature   : DSA/SHA1, 2008年04月11日 星期五 04时10分26秒, Key ID b44269d04f2a6fd2
    Packager    : Fedora Project
    URL         : http://ipython.scipy.org/
    Summary     : An enhanced interactive Python shell
    Description :

    IPython provides a replacement for the interactive Python interpreter with
    extra functionality.

    Main features:
     * Comprehensive object introspection.
     * Input history, persistent across sessions.
     * Caching of output results during a session with automatically generated
       references.
     * Readline based name completion.
     * Extensible system of 'magic' commands for controlling the environment and
       performing many tasks related either to IPython or the operating system.
     * Configuration system with easy switching between different setups (simpler
       than changing $PYTHONSTARTUP environment variables every time).
     * Session logging and reloading.
     * Extensible syntax processing for special purpose situations.
     * Access to the system shell with user-extensible alias system.
     * Easily embeddable in other Python programs.
     * Integrated access to the pdb debugger and the Python profiler.

     

    一定要装上这个...

    No Comments 2008-09-19 12:38:02 by No.0023

    开源网络蜘蛛spider(转载)

    Tags: Python, dev, others

    spider是搜索引擎的必须模块.spider数据的结果直接影响到搜索引擎的评价指标.

    第一个spider程序由MIT的Matthew K Gray操刀该程序的目的是为了统计互联网中主机的数目

    spider定义(关于Spider的定义,有广义和狭义两种).

    • 狭义:利用标准的http协议根据超链和web文档检索的方法遍历万维网信息空间的软件程序.
    • 广义:所有能利用http协议检索web文档的软件都称之为spider.

    其中Protocol Gives Sites Way To Keep Out The 'Bots Jeremy Carl, Web Week, Volume 1, Issue 7, November 1995 是和spider息息相关的协议,可以参考robotstxt.org.

    Heritrix

    Heritrix is the Internet Archive's open-source, extensible, web-scale, archival-quality web crawler project.

    Heritrix (sometimes spelled heretrix, or misspelled or missaid as heratrix/heritix/ heretix/heratix) is an archaic word for heiress (woman who inherits). Since our crawler seeks to collect and preserve the digital artifacts of our culture for the benefit of future researchers and generations, this name seemed apt.

    语言:JAVA, (下载地址)

    WebLech URL Spider

    WebLech is a fully featured web site download/mirror tool in Java, which supports many features required to download websites and emulate standard web-browser behaviour as much as possible. WebLech is multithreaded and comes with a GUI console.

    语言:JAVA, (下载地址)

    JSpider

    A Java implementation of a flexible and extensible web spider engine. Optional modules allow functionality to be added (searching dead links, testing the performance and scalability of a site, creating a sitemap, etc ..

    语言:JAVA, (下载地址)

    WebSPHINX

    WebSPHINX is a web crawler (robot, spider) Java class library, originally developed by Robert Miller of Carnegie Mellon University. Multithreaded, tollerant HTML parsing, URL filtering and page classification, pattern matching, mirroring, and more.

    语言:JAVA, (下载地址)

    PySolitaire

    PySolitaire is a fork of PySol Solitaire that runs correctly on Windows and has a nice clean installer. PySolitaire (Python Solitaire) is a collection of more than 300 solitaire and Mahjongg games like Klondike and Spider.

    语言:Python , (下载地址)

    The Spider Web Network Xoops Mod Team     

    The Spider Web Network Xoops Module Team provides modules for the Xoops community written in the PHP coding language. We develop mods and or take existing php script and port it into the Xoops format. High quality mods is our goal.

    语言:php , (下载地址)

    Fetchgals

    A multi-threaded web spider that finds free porn thumbnail galleries by visiting a list of known TGPs (Thumbnail Gallery Posts). It optionally downloads the located pictures and movies. TGP list is included. Public domain perl script running on Linux.

    语言:perl , (下载地址)

    Where Spider


     

    The purpose of the Where Spider software is to provide a database system for storing URL addresses. The software is used for both ripping links and browsing them offline. The software uses a pure XML database which is easy to export and import.

    语言:XML , (下载地址)

    Sperowider

    Sperowider Website Archiving Suite is a set of Java applications, the primary purpose of which is to spider dynamic websites, and to create static distributable archives with a full text search index usable by an associated Java applet.

    语言:Java , (下载地址)

    SpiderPy

    SpiderPy is a web crawling spider program written in Python that allows users to collect files and search web sites through a configurable interface.

    语言:Python , (下载地址)

    Spidered Data Retrieval

    Spider is a complete standalone Java application designed to easily integrate varied datasources. * XML driven framework * Scheduled pulling * Highly extensible * Provides hooks for custom post-processing and configuration

    语言:Java , (下载地址)

    webloupe

    WebLoupe is a java-based tool for analysis, interactive visualization (sitemap), and exploration of the information architecture and specific properties of local or publicly accessible websites. Based on web spider (or web crawler) technology.

    语言:java , (下载地址)

    ASpider

    Robust featureful multi-threaded CLI web spider using apache commons httpclient v3.0 written in java. ASpider downloads any files matching your given mime-types from a website. Tries to reg.exp. match emails by default, logging all results using log4j.

    语言:java , (下载地址)

    larbin

    Larbin is an HTTP Web crawler with an easy interface that runs under Linux. It can fetch more than 5 million pages a day on a standard PC (with a good network).

    语言:C++, (下载地址)

     

    from http://www.wujianrong.com/archives/2008/09/spider.html

    No Comments 2008-09-10 08:44:01 by No.0023

    强烈推荐: <<梦断代码>>

    Tags: dev, Reader

    作者: (美)罗森伯格

    译者: 韩磊

    ISBN: 9787121066795

    页数: 336

    出版社: 电子工业出版社

    装帧: 平装

    出版年: 2008-6-1

     

    简介:...

    软件乃是人类自以为最有把握,实则最难掌控的技术。本书作者罗森伯格对OSAF主持的Chandler项目进行田野调查,跟踪经年,试图借由Chandler的开发过程揭示软件开发中的一些根本性大问题。.
    本书是讲一事,也是讲百千事;是写一软件,也是写百千软件;是写一群人,也是写百千万人。任何一个在软件领域稍有经验的技术人员看完本书,必掩卷长叹:做软件难。

     

     

    你住在一所还算舒适的房子里,发现冰箱可能有问题。冰块有时会融化,门也关不严实。修理工差不多个把月就得过来修一次。你注意到,这冰箱既笨重又费电,你 看上了希尔斯百货公司(Sears)里面陈列的那些新款冰箱。是时候了。你立即出发,先到几个州看地块,考虑建一所新房。你请到贝聿铭和另外几位大建筑 师,做了个初步设计。做这个花了点时间,所以你还得继续忍受那台旧冰箱,它发出烦人的噪音,在夜里叫人难以成眠。你看了几套方案,甚至建造了一、两个原 型。时间流逝,你终于选定了设计方案。开始建造前,举办了一场狂欢宴。开工。建屋。庆祝继续进行,每块砖都令人激动。然后你改变了注意。你其实是想要一所 铺着红木地板、有花园的日式房屋。你改造了已建好的部分。搬开一些砖块,铺上草皮。新房看起来真不错。某天晚上,你在新屋床上躺着,没听到冰箱发出的噪 音。出问题了。安静令你无法入眠。花了太多钱!你压根就不想搬家!孩子们也不喜欢住到新房里。你女儿还说:“我恨它。”你只好改弦更张,不搬了。15年过 去了,还花了几十亿美元,那老冰箱依然运转。大抵如此。

    --书中引用的一名工程师对IBM AAS项目的形容,该项目从1981年启动,在花费了几十亿美元后于1994年宣告终止,颗粒无收。

    2 Comments 2008-08-10 16:06:10 by No.0023

    smtpClient

    Tags: unix, dev

        mv sendmail smtpClient
        add Makefile for smtpClient

     

    detail: http://code.google.com/p/mylibs/source/browse/#svn/trunk/tools/smtpClient

    No Comments 2008-08-10 15:46:08 by No.0023

    GAE 升级了

    Tags: blog, GAE, Google, dev
    • More apps: Want to create more than 3 applications with your App Engine account? Now you can now create up to 10!
    • Time windows for Dashboard graphs: Zoom in on the data in your dashboard to get a more accurate picture of whats going on. You can zoom in to see graphs for the last 24, 12, and 6 hour periods.
    • Logs export: You can now use appcfg.py to download your application's logs in plaintext format. Use appcfg.py --help for more information on how to download your logs.
    • Send email as logged in user: If you're using the users API, you can now send email from the email address of the currently-logged-in user.

     

    看到没有?10个application了。

    No Comments 2008-07-26 23:26:27 by No.0023

    Add Gzip OutputFilter to Tomcat and Apache

    Tags: dev

    vi tomcat/server.xml

        <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443"
                   compression="on"
                   compressionMinSize="2048"
                   noCompressionUserAgents="gozilla, traviata"
                   compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
                   />

        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
                   compression="on"
                   compressionMinSize="2048"
                   noCompressionUserAgents="gozilla, traviata"
                   compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
                   />

     

    vi apache/conf/httpd.conf

    <VirtualHost *:80>
        DocumentRoot "/www/apache/htdocs"
        <Location "/">
            SetOutputFilter DEFLATE
            BrowserMatch ^Mozilla/4 gzip-only-text/html
            BrowserMatch ^Mozilla/4\.0[678] no-gzip
            BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
            SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
            Header append Vary User-Agent env=!dont-vary
        </Location>
    </VirtualHost>

     

    No Comments 2008-07-23 12:14:06 by No.0023

    My Vimrc

    Tags: unix, dev

    set dir=~/.vim/swp
    set backup
    set backupdir=~/.vim/backup/
    set backupext=.bak

    set autoindent        "always set autoindenting on
    set smartindent       "set smart indent
    set smarttab          "use tabs at the start of a line, spaces elsewhere
    set expandtab         "not use tab
    set tabstop=4 softtabstop=4 shiftwidth=4

    set smartcase
    set ignorecase        " easier to ignore case for searching
    set incsearch         " do incremental searching
    set hlsearch          " highlighting the last used search pattern. or :noh
    "set list             " show chars on end of line, whitespace, etc
    "set nowrap           " do not wrap lines

    set wildmenu          " command-line completion operates in an enhanced mode
    set history=50        " keep 50 lines of command line history
    set mouse=a           " set mouse functions

    "don't make noise
    set noerrorbells
    set novisualbell


    filetype on           " detect the type of file
    syntax on             " syntax highlighting on
    set fileformats=unix,dos
    set textwidth=80          
    set ruler             " show current positions along the bottom

    set foldenable        " turn on folding
    set foldmethod=indent " make folding indent sensitive
    set foldlevel=100     " don't autofold anything
    set foldopen-=search  " don't open folds when you search into them
    set foldopen-=undo    " don't open folds when you undo stuff

    "set encoding=prc
    "set fileencoding=prc
    "set fileencodings=prc

    set encoding=utf-8
    set fileencoding=utf-8
    set fileencodings=utf-8

    set guifont=Consolas\ 12
    "set gfn=Consolas:h12 gfw=Consolas:h12

    "auto change work dir
    set autochdir

    let Tlist_Ctags_Cmd = '/usr/bin/ctags'
    map <F5> :VTreeExplore<CR>
    map <F6> :TlistToggle<CR>
    map <C-T> :tabnew<CR>
    map <C-W> :tabclose<CR>
    map <S-Left> :tabprev<CR>
    map <S-Right> :tabnext<CR>
    map <Left> :bp<CR>
    map <Right> :bn<CR>
    map <F4> :bd<CR>
    map <C-Q> :bdelete<CR>
    map <C-C> "+y<CR>
    map <C-V> "+gP<CR>


    "A collection of C extension Vim syntax. $HOME/.vim/after/syntax
    let glib_enable_deprecated = 1
    let glib_deprecated_errors = 1


    au BufEnter * if &textwidth > 0 | exec 'match Todo /\%>' . &textwidth . 'v.\+/' | endif
    au BufRead,BufNewFile *.py,*.pyw,*.c,*.h set shiftwidth=4
    au BufRead,BufNewFile *.py,*.pyw,*.c,*.h set softtabstop=4
    au BufRead,BufNewFile *.py,*.pyw,*.c,*.h set tabstop=4
    au BufRead,BufNewFile *.py,*.pyw set expandtab                " not use tab
    au BufRead,BufNewFile *.c,*.h set noexpandtab                 " use tab
    au BufRead,BufNewFile Makefile* set noexpandtab
    highlight BadWhitespace ctermbg=red guibg=red
    au BufRead,BufNewFile *.py,*.pyw match BadWhitespace /^\t\+/
    au BufRead,BufNewFile *.py,*.pyw,*.c,*.h set textwidth=79
    au BufNewFile *.py,*.pyw,*.c,*.h set fileformat=unix


    autocmd bufnewfile *.py call setline(1,'#! /usr/bin/env python') |
        \ call setline(2,'# -*- coding: utf-8 -*-') |
        \ call setline(3,'') |
        \ call setline(4, strftime("# Create Date: %F %T")) |
        \ call setline(5,'# Author: N23 <No.0023@gmail.com>') |
        \ call setline(6,'# Blog: http://n23.appspot.com/blog') |
        \ call setline(7,'') |
        \ call setline(8,'') |
        \ exe "normal G"

    "Python iMaps
    au FileType python inoremap <buffer> $r return
    au FileType python inoremap <buffer> $s self
    au FileType python inoremap <buffer> $c ##<cr>#<space><cr>#<esc>kla
    au FileType python inoremap <buffer> $f from
    au FileType python inoremap <buffer> $i import
    au FileType python inoremap <buffer> $p print
    au FileType python inoremap <buffer> $d """<cr>"""<esc>O

    "Java iMaps
    autocmd FileType java inoremap <buffer> $pr private
    autocmd FileType java inoremap <buffer> $r return
    autocmd FileType java inoremap <buffer> $pu public
    autocmd FileType java inoremap <buffer> $i import
    autocmd FileType java inoremap <buffer> $b boolean
    autocmd FileType java inoremap <buffer> $v void
    autocmd FileType java inoremap <buffer> $s String
    autocmd FileType java inoremap <buffer> $e Exception

    augroup python_prog
      au!
      fun! Python_fold()
        execute 'syntax clear pythonStatement'
        execute 'syntax keyword pythonStatement break continue del'
        execute 'syntax keyword pythonStatement except exec finally'
        execute 'syntax keyword pythonStatement pass print raise'
        execute 'syntax keyword pythonStatement return try'
        execute 'syntax keyword pythonStatement global assert'
        execute 'syntax keyword pythonStatement lambda yield'
        execute 'syntax match pythonStatement /\<def\>/ nextgroup=pythonFunction skipwhite'
        execute 'syntax match pythonStatement /\<class\>/ nextgroup=pythonFunction skipwhite'
        execute 'syntax region pythonFold start="^\z(\s*\)\%(.*:\s*\%(#.*$\)\?\)" end="^\%(\n*\z1\s\)\@!" transparent fold'
        execute 'syntax sync minlines=2000 maxlines=4000'
        set autoindent
        set foldmethod=syntax
        " set foldopen=all foldclose=all
        set foldtext=substitute(getline(v:foldstart),'\\t','\ \ \ \ ','g').'\ \ ('.(v:foldend-v:foldstart+1).'\ lines)'
        set fillchars=vert:\|,fold:\
      endfun
      autocmd FileType python call Python_fold()
    augroup END

    "Make dir $HOME/.vim/after/syntax
    "untar this file to $HOME/.vim/after/syntax
    "If you don't have $HOME/.vim/after/syntax/c.vim,
    "then copy c.vim.example to $HOME/.vim/after/syntax/c.vim

    "see :h mysyntaxfile-add

    "set csprg=/usr/local/bin/cscope
    "set csto=1
    "set nocsverb
    "set cst
    "cs add ~/.cscope/cscope.out
    " ctrl + ]
    " ctrl + t / ctrl + o
    " cs find
    " help cscope

    "this script use to excute make in vim and open quickfix window
    "map <C-M> :call Do_make()<CR><CR><CR>
    "nmap B :call Do_make()<cr><cr><cr>
    "nmap C :cclose<cr>
    "function Do_make()
    "  let filename = bufname("%")
    "  let suffix_pos = stridx(filename, ".c")
    "  if suffix_pos == -1
    "      return
    "  else
    "      let target = strpart(filename,0,suffix_pos)
    "  endif
    "  let target = "make " . target
    "  execute target
    "  execute "copen"
    "endfunction

    "mkdir -p ~/.vim/templates
    "let g:template_load = 1
    "let g:template_tags_replacing = 1
    "let g:T_AUTHOR = "N23"
    "let g:T_AUTHOR_EMAIL = "No.0023@gmail.com"
    "let g:T_AUTHOR_WEBSITE = "http://blog.chinaunix.net/u1/42287/"
    "let g:T_DATE_FORMAT = "%F %T"

    "change work folder
    "cd ~/tmp

    "runtime! ftplugin/man.vim
    "use :Man

    "   vim *.c
    "   :argdo %s/oldvalue/newvalue/g
    "
    "   %
    "   =%
    "   gg, G
    "   [[, ]]
    "   :reg
    "     "a5yy
    "     "ap
    "     "A5yy
    "     his c
    "     his s
    "     :1,5 co 10
    "     q
    "     :scriptnames
    "     :digraphs
    "     ga              " hex
    "     :set noma       " non modifiable
    "     :set ro         " read only
    "     #session
    "       vim file1.c file2.c
    "       :mksession
    "       :q
    "       vim -S Session.vim
    "
    "       map : all
    "       nmap: normal map
    "       vmap: visual map
    "       imap: insert map
    "
    "       b:name        " buffer
    "       w:name        " window
    "       g:name        " global
    "       v:name        " vim
    "       a:name        " function param
    "
    "     :set all
    "     :list
    "     :augroup

    No Comments 2008-07-11 23:36:53 by No.0023

    Porting legacy databases to Google App Engine

    Tags: GAE, dev

    here

    No Comments 2008-07-11 09:53:47 by No.0023

    send mail command

    Tags: unix, dev

    /*
     * Copyright 2008 N23 <No.0023@gmail.com>
     * All rights reserved.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *     http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     *
     *
     * Author:
     *   N23 <No.0023@gmail.com>
     *   Blog: http://n23.appspot.com/blog/
     *
     * compile: cc -Wall -W $(pkg-config --cflags --libs glib-2.0) -o $HOME/bin/run
     *
     * vi $HOME/.LoginAccount.txt
     * [mail]
     * host = smtp.qq.com
     * port = 25
     * user = ***
     * pass = ***
     * fr = No.0023@qq.com
     * to = No.0023@gmail.com
     *
     *
     * $Id: mail.c 51 2008-07-16 15:03:37Z No.0023 $
     */

    #include <glib.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <time.h>

    #include <netdb.h>
    #include <netinet/in.h>
    #include <sys/types.h>
    #include <sys/socket.h>

    static const char *config_filename = ".LoginAccount.txt";
    static const char *config_label = "mail";
    static const char *end_flag = "\r\n";
    static const char *email_flag = "===== Baby, I love you. ^-^ =====";

    const char *log_time();
    int sendCmd(const int, const char*);
    int fetchCmd(const int, const char *);
    int conn(const char *, const int *);
    int login(const int, const char *, const char *, const char *);
    int sendmail_head (const int, const char *, const char *, const char *);
    void sendmail_file(const int, const char *);
    int sendmail_tail(const int);
    const char *get_sub_string(const char *, const gsize, const gsize);
    const void split_base64(const int, const char *, const gsize);
    void sendmail_data(const int, const char *);

    static void error_func(GOptionContext *context,
                           GOptionGroup *group,
                           gpointer data,
                           GError **error) {
        if (*error && (*error)->message) {
            gchar *progname = g_get_prgname();
            g_print("%s: %s\nTry '%s --help' for more information.\n",
                    progname,
                    (*error)->message,
                    progname);
            exit(1);
        }
    }

    int
    main (int argc, char *argv[])
    {
        GKeyFile *config;
        gchar *path = g_build_filename(g_get_home_dir(), config_filename, NULL);
        config = g_key_file_new();
        g_key_file_load_from_file(config, path, 0, NULL);
        gchar *host = g_key_file_get_string(config, config_label, "host", NULL);
        gint   port = g_key_file_get_integer(config, config_label, "port", NULL);
        gchar *user = g_key_file_get_string(config, config_label, "user", NULL);
        gchar *pass = g_key_file_get_string(config, config_label, "pass", NULL);
        gchar *fr = g_key_file_get_string(config, config_label, "fr", NULL);
        gchar *to = g_key_file_get_string(config, config_label, "to", NULL);

        gchar           *addr = NULL;
        gboolean        flag = FALSE;
        GOptionEntry    entries[] =
        {
            {"addr", 'e', 0, G_OPTION_ARG_FILENAME, &addr,
             "mail address", "ADDR"},
            { "atta", 'a', 0, G_OPTION_ARG_NONE, &flag,
              "attachment flag", NULL },
            {NULL}
        };
        GOptionContext *context;
        GError         *error = NULL;

        context = g_option_context_new("[args]");
        g_option_context_add_main_entries(context, entries, NULL);
        g_option_context_set_help_enabled(context, TRUE);
        g_option_group_set_error_hook(g_option_context_get_main_group(context),
                                      (GOptionErrorFunc)error_func);
        g_option_context_parse(context, &argc, &argv, &error);

        if (error) {
            perror(error->message);
            return error->code;
        }
        g_option_context_free(context);

        if (argc == 1) g_error("No file to Send");
        gint fd = conn(host, port);
        if (addr) g_stpcpy(to, addr);
        if ((login(fd, host, user, pass)) == -1) g_error("Login failed");
        for (argv++; *argv != NULL; argv++) {
            if (sendmail_head(fd, fr, to, *argv) == -1)
                g_error("Sendmail header failed");
            if (flag) sendmail_atta(fd, *argv);
            else sendmail_file(fd, *argv);
            if (sendmail_tail(fd) == -1)
                g_error("Sendmail header failed");
        }
        close(fd);
        return 0;
    }


    int
    sendCmd(const int fd, const char* s)
    {
        int             bytes;
        g_printf("%s%s%s%s%s",
                 "Send: [",
                 log_time(),
                 "] ",
                 "CMD=",
                 s);
        if ((bytes = send(fd, s, strlen(s), 0)) == -1) {
            perror("send error");
            return -1;
        }

        return bytes;
    }

    int
    fetchCmd(const int fd, const char *cmd)
    {
        char            buff[1024];
        int             bytes;
        char            *tmp;

        if ((bytes = recv(fd, buff, 1024, 0)) == -1) {
            perror("recv error");
            return(-1);
        }
        buff[bytes] = '\0';
        g_printf("%s%s%s%s%s",
                 "Recv: [",
                 log_time(),
                 "] ",
                 "Result=",
                 buff);
        tmp = g_strndup(buff, 3);
        if (strcmp(tmp, cmd) != 0)
            return -1;
        else
            return 0;
    }

    const char *log_time()
    {
        char           *ct;
        time_t          t;
        t = time(NULL);
        ct = ctime(&t);
        *(strchr(ct, '\n')) = '\0';
        return ct;
    }

    int
    conn(const char *host, const int *port)
    {
        int             sockfd;
        struct sockaddr_in server_addr;
        struct hostent *server_ip;
        while ((server_ip = gethostbyname(host)) == NULL) {
            herror("gethostbyname error");
            sleep(30);
        }

        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
            perror("socket error");
            return -1;
        }
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(port);
        server_addr.sin_addr = *((struct in_addr *) server_ip->h_addr);
        bzero(&(server_addr.sin_zero), 8);
        if (connect(sockfd, (struct sockaddr *)
            & server_addr, sizeof(struct sockaddr)) == -1) {
            perror("connect error");
            return -1;
        }
        if (fetchCmd(sockfd, "220") == -1)
            return -1;

        return sockfd;
    }

    int
    login(const int fd, const char *host, const char *user, const char *pass)
    {
        GString *s = g_string_new("");
        g_string_append(s, "EHLO ");
        g_string_append(s, host);
        g_string_append(s, end_flag);
        sendCmd(fd, s->str);
        if (fetchCmd(fd, "250") == -1)
            return -1;

        g_string_erase(s, 0, -1);
        g_string_append(s, "AUTH LOGIN");
        g_string_append(s, end_flag);
        sendCmd(fd, s->str);
        if (fetchCmd(fd, "334") == -1)
            return -1;

        g_string_erase(s, 0, -1);
        g_string_append(s,  g_base64_encode(user, strlen(user)));
        g_string_append(s, end_flag);
        sendCmd(fd, s->str);
        if (fetchCmd(fd, "334") == -1)
            return -1;

        g_string_erase(s, 0, -1);
        g_string_append(s,  g_base64_encode(pass, strlen(pass)));
        g_string_append(s, end_flag);
        sendCmd(fd, s->str);
        if (fetchCmd(fd, "235") == -1)
            return -1;

        g_string_free(s, TRUE);
        return 0;
    }

    int sendmail_head (const int fd,
                       const char *fr,
                       const char *to,
                       const char *subject)
    {
        GString *s = g_string_new("");
        g_string_append(s, "MAIL FROM:");
        g_string_append(s, "<");
        g_string_append(s, fr);
        g_string_append(s, ">");
        g_string_append(s, end_flag);
        sendCmd(fd, s->str);
        if (fetchCmd(fd, "250") == -1)
            return -1;

        g_string_erase(s, 0, -1);
        g_string_append(s, "RCPT TO:");
        g_string_append(s, "<");
        g_string_append(s, to);
        g_string_append(s, ">");
        g_string_append(s, end_flag);
        sendCmd(fd, s->str);
        if (fetchCmd(fd, "250") == -1)
            return -1;

        g_string_erase(s, 0, -1);
        g_string_append(s, "DATA");
        g_string_append(s, end_flag);
        sendCmd(fd, s->str);
        if (fetchCmd(fd, "354") == -1)
            return -1;

        g_string_erase(s, 0, -1);
        g_string_append(s, "From:");
        g_string_append(s, fr);
        g_string_append(s, end_flag);
        g_string_append(s, "To:");
        g_string_append(s, to);
        g_string_append(s, end_flag);

        g_string_append(s, "Subject:");
        g_string_append(s, subject);
        g_string_append(s, end_flag);
        g_string_append(s, "Mime-Version: 1.0");
        g_string_append(s, end_flag);
        sendCmd(fd, s->str);

        g_string_erase(s, 0, -1);
        g_string_append(s, "Content-Type: multipart/mixed;Boundary=\"");
        g_string_append(s, email_flag);
        g_string_append(s, "\"");
        g_string_append(s, end_flag);
        g_string_append(s, end_flag);
        sendCmd(fd, s->str);

        g_string_free(s, TRUE);
        return 0;
    }

    void
    sendmail_file(const int fd, const char *file)
    {
        GString *s = g_string_new("");
        g_string_append(s, "--");
        g_string_append(s, email_flag);
        g_string_append(s, end_flag);
        g_string_append(s, "Content-Type: text/plain; charset=\"utf-8\";");
        g_string_append(s, end_flag);
        g_string_append(s, "Content-Transfer-Encoding: base64");
        g_string_append(s, end_flag);
        g_string_append(s, end_flag);
        sendCmd(fd, s->str);
        g_string_free(s, TRUE);

        sendmail_data(fd, file);
    }

    void
    sendmail_atta(const int fd, const char *file)
    {
        GString *s = g_string_new("");
        g_string_append(s, "--");
        g_string_append(s, email_flag);
        g_string_append(s, end_flag);
        g_string_append(s, "Content-Type:application/octet-stream;name=\"");
        g_string_append(s, file);
        g_string_append(s, "\"");
        g_string_append(s, end_flag);
        g_string_append(s, "Content-Transfer-Encoding: base64");
        g_string_append(s, end_flag);
        g_string_append(s, "Content-Disposition:attachment;filename=\"");
        g_string_append(s, file);
        g_string_append(s, "\"");
        g_string_append(s, end_flag);
        g_string_append(s, end_flag);
        sendCmd(fd, s->str);
        g_string_free(s, TRUE);

        sendmail_data(fd, file);
    }

    int sendmail_tail(const int fd)
    {
        GString *s = g_string_new("");
        g_string_append(s, end_flag);
        g_string_append(s, end_flag);
        g_string_append(s, "--");
        g_string_append(s, email_flag);
        g_string_append(s, "--");
        g_string_append(s, end_flag);
        sendCmd(fd, s->str);

        g_string_erase(s, 0, -1);
        g_string_append(s, end_flag);
        g_string_append(s, ".");
        g_string_append(s, end_flag);
        sendCmd(fd, s->str);
        if (fetchCmd(fd, "250") == -1)
            return -1;

        g_string_free(s, TRUE);
        return 0;
    }

    const char           *
    get_sub_string(const char *str, const gsize start, const gsize end)
    {
        gsize        n = end - start;
        static char     stbuf[256];
        if (start >= strlen(str)) {
            return NULL;
        } else {
            strncpy(stbuf, str + start, n);
            stbuf[n] = '\0';
            return stbuf;
        }
    }

    const void
    split_base64(const int fd, const char *text, const gsize len)
    {
        gchar *code = g_base64_encode(text, len);
        GString *s = g_string_new("");
        gsize l = strlen(code);
        guint start = 0, end = 0;
        g_printf("split_base64 ...start\n");
        int             bytes;
        for(end = 78; start < l; start +=78, end += 78) {
            g_string_append(s, get_sub_string(code, start, end));
            g_string_append(s, "\n");
            if ((bytes = send(fd, s->str, s->len, 0)) == -1)
                g_error("send error in split_base64");
            g_string_erase(s, 0, -1);
        }
        g_printf("split_base64 ...done\n");
        g_free(code);
        g_string_free(s, TRUE);
    }

    void sendmail_data(const int fd, const char *file)
    {
        GString *s = g_string_new("");
        g_string_append(s, end_flag);
        g_string_append(s, end_flag);
        sendCmd(fd, s->str);

        gchar *text;
        GError *err = NULL;
        gsize len;
        if (g_file_get_contents(file, &text, &len, &err))
            split_base64(fd, text, len);

        g_string_erase(s, 0, -1);
        g_string_append(s, end_flag);
        g_string_append(s, end_flag);
        sendCmd(fd, s->str);

        g_free(text);
        g_string_free(s, TRUE);
    }

    No Comments 2008-07-11 02:09:13 by No.0023


    标签: dev 共有文章30篇 第(1/2)页 首页 上一页 1 ... 下一页 末页