浏览器与服务器交互原理以及用java模拟浏览器操作
* 1,在HTTP的WEB应用中, 应用客户端和服务器之间的状态是通过Session来维持的, 而Session的本质就是Cookie, * 简单的讲,当浏览器向服务器发送Http请求的时候, HTTP服务器会产生一个SessionID,这个SessionID就唯一的标识了一个客户端到服务器的请求会话过程. * 就如同一次会议开始时,主办方给每位到场的嘉宾一个临时的编号胸牌一样, 可以通过这个编号记录每个嘉宾(客户端)的活动(请求状态). * 为了保持这个状态, 当服务端向客户端回应的时候,会附带Cookie信息,当然,Cookie里面就包含了SessionID * 客户端在执行一系列操作时向服务端发送请求时,也会带上这个SessionID, 一般来说,Session也是一个URL QueryParameter ,就是说,session可以以Key-Value的形式通过URL传递 * 比如,http://www.51etest.com/dede/login.php?PHPSESSIONID=7dg3dsf19SDf73wqc32fdsf * 一般而言,浏览器会自动把此Session信息放入Header报文体中进行传递. * 如果浏览器不支持Cookie,那么,浏览器会自动把SessionID附加到URL中去. * * 2,在这个例子中,以登陆这个功能点进行讲解. * 首先,我们登陆的页面是http://www.51etest.com/dede, 我们第一次访问这个页面后,可以从服务器过来的Http Response报文中的Header中找出服务器与浏览器向关联的数据 — Cookie, * 而且Session的值也在Cookie中. 于是,我们可以通过分析Set-Cookie这个Header中的参数的值,找到Seesion的Key-Value段. * 然后,我们再向服务器发送请求,请求URL为:post@@http://www.51etest.com/dede/login.php@@userid=admin&pwd=tidus2005&gotopage=/dede/&dopost=login * 服务器验证登陆成功了, 并且在此次会话变量中增加了我们登陆成功的标识. * * 3,增加一个广告定义 * 增加一个广告定义其实就是一个添加数据的过程,无非是我们把我们要添加的数据通过参数的形式告诉指定url页面,页面获取后添加到数据库去而已. * 此url地址为: * post@@http://www.51etest.com/dede/ad_add.php@@dopost=save&tagname=test&typeid=0&adname=test&starttime=2008-05-29 * 因为这个页面会先判断我是否登陆 * 而判断的依据,前面讲了,就是根据我请求时的SessionID找到指定的Session数据区中是否存在我的登陆信息, * […]
android 如何保存簡單的配置信息(SharedPreferences、File和Properties)
我們知道在android的開發中,保存項目私有數據的存儲方式我們可以使用:SharedPreferences,File,SQLite,Network.四種方式,而要用到應 用程序之間數據的共享要使用ContentProvider 。那今天我們只敘述一下僅僅保存一些我們登錄等的一些配置信息的數據,也就是說用到的數 據量都不是很大,那麼我們就可以選擇SharedPreferences和File的方式。這裡只針對性的結合File和Properties進行敘述。 一。SharedPreferences 1. 它可以保存上一次用戶所做的修改或者自定義參數的設定,當再次啟動程序後依然可以保持原有的設置。這裡只說明一下使用方式。比如下 面的代碼在OnCreate中使用: SharedPreferences mSharedPreferences = getSharedPreferences(“list”,MODE_PRIVATE); String mTempString = mSharedPreferences.getString(“config”,”default”); 其中”list”是SharedPreferences的文件的名字,SharedPreferences是以鍵值映射的關係存放數據。不過多解釋,你也可以這樣用: SharedPreferences mSharedPreferences = getPreferences(MODE_PRIVATE); 這樣默認的文件名是activity的名字。 2. 退出activity的時候保存數據,在OnPause中使用: SharedPreferences mSharedPreferences = getSharedPreferences(“list”, MODE_PRIVATE); mSharedPreferences.edit().putString(“config”,”data” ).commit(); 3. SharedPreferences 是以xml文件的方式自動保存的,在DDMS中的FileExplorer中展開/data/data/包名/shared-prefs下面就是SharedPreferences文件。 4. SharedPreferences文件只可以用來存放基本的數據類型。 二。結合File和Properties進行保存。 A Properties object is a Hashtable where the keys and values must be Strings. Each property can […]
开发 Eclipse 插件
简介: 在本文中,David Gallardo 向您展示了如何使用 Plug-in Development Environment 的代码生成向导来创建 Eclipse 插件。您将学到如何在运行时工作台中运行和调试插件,并且在 Eclipse 中安装完成的插件。David 还研究了与打包插件相关的问题 ― 包括维护版本信息、以插件片段的形式更新功能,以及组合插件来创建完整的功能部件。 基于插件的体系结构 Eclipse 平台是 IBM 向开发源码社区捐赠的开发框架,它之所以出名并不是因为 IBM 宣称投入开发的资金总数 ― 4 千万美元 ― 而是因为如此巨大的投入所带来的成果:一个成熟的、精心设计的以及可扩展的体系结构。Eclipse 的价值是它为创建可扩展的集成开发环境提供了一个开放源码平台。这个平台允许任何人构建与环境和其它工具无缝集成的工具。 工具与 Eclipse 无缝集成的关键是插件。除了小型的运行时内核之外,Eclipse 中的所有东西都是插件。从这个角度来讲,所有功能部件都是以同等的方式创建的。从这个角度来讲,所有功能部件都是以同等的方式创建的。 但是,某些插件比其它插件更重要些。Workbench 和 Workspace 是 Eclipse 平台的两个必备的插件 ― 它们提供了大多数插件使用的扩展点,如图 1 所示。插件需要扩展点才可以插入,这样它才能运行。 图 1. Eclipse Workbench 和 Workspace:必备的插件支持 Workbench 组件包含了一些扩展点,例如,允许您的插件扩展 Eclipse 用户界面,使这些用户界面带有菜单选择和工具栏按钮;请求不同类型事件的通知;以及创建新视图。Workspace 组件包含了可以让您与资源(包括项目和文件)交互的扩展点。 当然,其它插件可以扩展的 […]
让代码取代你的配置文件吧
最近, 在编写一个专门压测NameNode的工具(以下简称s4nn), 它有两个难点 : s4nn需要可以模拟上万个DataNode ; s4nn 需要灵活的支持对NameNode访问行为的定义. 后者导致了本文的思考. 命令行参数和配置文件是最常用来配置系统的方法, 前者用于配置项较少, 后者则适合配置复杂情况. 这两种方式都有共同令人痛苦的地方: 编写代码去载入->解析->转换, 通常如同处理协议般无聊(要是有个什么变更, KMN!!); 对于复杂的配置文件编写而言, 总是没有顺手的编辑器支持, 写起来既累又易错. 要是用代码取代配置文件呢? 呃… 这会很麻烦吧, 像java这样的改了代码那还不要重新编译啊? 嗯, 确实, 但并没有想象中那么麻烦, 一些技巧可以让它变得简单(至少java是这样), 如Btrace. 用代码取代独立的配置文件不是新鲜的做法, 像Guice, Gant 等已经以Internal DSL的代码代替了XML. 好处很明显: 良好的DSL风格, 简洁易懂 ; 免去对配置文件的解析转换 ; 最好的编辑器支持, 语法高亮, 一键格式化, 提示补全, 重构 ; 编译器帮助查错; 与代码无缝结合, 能够容易在变化中保持一致性. 简言之两个字, “高效”! 这倒是挺适合s4nn的, 不妨一试! 从需求的角度出发, 配置应该能够完成: 定义一组Client RPC调用行为, […]
用Drupal 创建的8种网站
Drupal没有像WordPress那样普及,或许是因为它稍有难度来学习。但是如果你创建大的网站,使用Drupal,高度灵活的开源CMS,可以得到你想要的更漂亮、更强大的各种类型的网站。 下面是8种类型的网站,使用Drupal来创建,希望帮你对Drupal有更深刻的认识。 1. 文件存储分享站点 使用Drupal创建文件分享,你可以使用 CCK 和 Views ,也包括一些模块,比如Media Mover, Filebrowser 或者Web File Manager。看看Box.net,你会非常感兴趣的^_^。 2. 社交网站 在社交网络能力方面,Drupal可能是最好的CMS。Drupal提供了强大的用户管理和权限管理系统。但是如果你想创建强大的社交网站,就需要一些模块,见http://drupal.org/node/206724。 你想看一些案例?Imbee 或者 GoingOn。 3. Twitter Clone 建议你不要尝试利用Drupal创建Twitter竞争产品,但是,如果你想整合Twitter功能到你的站点,Drupal的微博模块可以帮到你。 4. 新闻News portal 如果你想创建新闻站点或杂志站点,Drupal的完美的选择。使用CCK 和 Views ,你可以创建所有的发布内容类型,并且可灵活列表。这样的新闻站点非常之多,比如New York Observer。 5. 博客网络 用Drupal创建博客网站,很轻松,甚至无需额外模块。看看 Wisebread吧。 6. 视频分享站点 这类站点太耗带宽了,如果你决定创建,那么Drupal来帮你实现吧。FlashVideo 模块提供了创建Youtube克隆的强大能力,它整合了CCK,转换视频到FLV,并有分享代码。另外你也可以尝试Media Mover 和 SWF Tools。MTV UK 站点就是Drupal创建的。 7. 图片分享站点 Image module ,这个模块将派上用场,可让你创建类Flickr站点,很好很强大。MyFinePix 就是Drupal创建的照片分享站点。 8. 类Digg-like news site 感谢 Drigg module, 这个模块可帮助你快速建立Digg克隆站点。流行的设计社交新闻网Designbump在使用Drupal。 英文原文:http://www.designer-daily.com/8-types-of-sites-you-can-build-with-drupal-13924
支持配额的共享线程池
用了几个小时动手实现了一个简陋支持配额的共享线程池. 基本思路与放翁相同, 区别在于引入了两种线程分配策略: 悲观策略 简单的共享一个线程池, 最容易出现的问题就是不同类型任务(或事件)在随机争抢线程资源时, 可能出现”饿死”现象(即抢不到线程). 因此, 悲观策略的宗旨是绝对的保证每种任务都会被分配到预留的(reserve)配额, 这种做法本质上和多个线程池的做法一样. 如总共100个线程, A任务可用50个线程, B任务可用30个线程, C任务可用20个, 三者互不占用, 一旦任意谁的任务实例超过配额, 将被迫等待直至先前的任务实例结束释放了线程. 统一到一个共享的池中, 好处自然是归一化管理, 容易从全局上比较不同任务的优先级, 做出合理的资源分配; 坏处可能就是需要去实现这样一个支持配额的共享线程池. 当然, 若不觉得多个线程池有什么不好, 悲观策略其实意义不大:(. 乐观策略 无论是使用悲观策略的共享线程池, 还是精心规划多个线程池, 由于都是预定义, 难免在环境变化过程中出现线程资源不足或闲置的情况. 要是可以这样, 某个时段当A任务较少时, 它所闲置的线程能协调给负载较高的B任务, 那就完美了! 故, 共享线程池的乐观策略就是在保证每种任务预留最低资源的情况下, 允许任务依据一个弹性(elastic)配额去争抢线程资源, 达到线程利用率的最大化. 如有100个线程的池, A任务大部分的时候负载较高, 则给予50个的预留配额, 30个的弹性配额; 而B任务是偶尔某个时段复杂较高, 则给予20个线程的预留配额, 30个的弹性配额, 这样留了一个30个线程的资源空间, 让AB去合理竞争. 很多实现的细节, 还请参见源代码. 源代码 CentralExecutor.java CentralExecutorTest.java
逻辑划分线程池
现在很多系统中,特别是事件驱动的系统中,对于线程池的维护很多时候根据业务处理类型的不同做划分和管理,但分开维护会带来下面两个问题: 1. 到处线程池,每个线程池都有上限设置,但是所有线程池到达上限的时候也许系统已经无法承受了,所以局部设计和限制无法达到全局限制的目标。 2. 合理的利用线程池的资源,当线程池逻辑上真实隔离后,就无法将空闲的线程资源借调给繁忙的任务处理使用。 设计中关注的: 虚拟隔离线程池需要有模型可以保证对于一些处理的保护,对于一些处理的降级。 设计思路: 简单的两种配置模式:保留,限制。 举个例子: 默认线程池大小设置为100。 A类任务设置为保留10,B类任务设置为限制50。 假设有A,B,C三种任务进入。 A最大可以使用100个线程,其中10个是它独占的(通过配置可以选择优先使用公有的还是私有的) B最大可以使用50个线程,当公有线程(100-10=90)被消耗后剩余总数小于50,那么B消耗的数量就会小于50,假如公有90个线程都没有被消耗,此时B最多也只能消耗50个线程。总结来说,B消耗公有的线程资源,同时最多只能消耗他的设置(当然他设置如果超过公有线程,则以公有线程池最大作为上限) C最大可以使用90个线程,也就是所有的公有线程。 当任何一种请求没有线程资源可以被使用的时候,将会被放入队列,等待线程可用,队列不区分任务类型。 第一版简单的Java代码参看:http://www.rayfile.com/zh-cn/files/66a89e61-4357-11e0-9ad5-0015c55db73d/ 这里只是探讨一种简单的设计思路,以最小代价来全局化管理维护线程池或者资源池。
分布式文件系统Ceph调研1 – RADOS
Ceph是加州大学Santa Cruz分校的Sage Weil(DreamHost的联合创始人)专为博士论文设计的新一代自由软件分布式文件系统。自2007年毕业之后,Sage开始全职投入到Ceph开 发之中,使其能适用于生产环境。Ceph的主要目标是设计成基于POSIX的没有单点故障的分布式文件系统,使数据能容错和无缝的复制。2010年3 月,Linus Torvalds将Ceph client合并到内 核2.6.34中。 Ceph中有很多在分布式系统领域非常新颖的技术点,对解决分布式文件系统中一些常见的问题的研究非常有指导意义。所以值得研究。 RADOS简介 1 RADOS概述 RADOS (Reliable, Autonomic Distributed Object Store) 是Ceph的核心之一,作为Ceph分布式文件系统的一个子项目,特别为Ceph的需求设计,能够在动态变化和异质结构的存储设备机群之上提供一种稳定、可扩展、高性能的单一逻辑对象(Object)存储接口和能够实现节点的自适应和自管理的存储系统。事实上,RADOS也可以单独作为一种分布式数据存储系统,给适合相应需求的分布式文件系统提供数据存储服务。 2 RADOS架构简介 RADOS系统主要由两个部分组成(如图1所示): 1.由数目可变的大规模OSDs(Object Storage Devices)组成的机群,负责存储所有的Objects数据; 2.由少量Monitors组成的强耦合、小规模机群,负责管理Cluster Map,其中Cluster Map是整个RADOS系统的关键数据结构,管理机群中的所有成员、关系、属性等信息以及数据的分发。 图1 RADOS系统架构图示 对于RADOS系统,节点组织管理和数据分发策略均有内部的Monitors全权负责,所以,从Clients角度设计相对比较简单,它给应用提供的仅为简单的存储接口。 3 RADOS详细介绍 3.1 扩展机群 1.Cluster Map 存储机群的管理,唯一的途径是Cluster Map通过对Monitor Cluster操作完成。Cluster Map是整个RADOS系统的核心数据结构,其中指定了机群中的OSDs信息和所有数据的分布情况。所有涉及到RADOS系统的Storage节点和Clients都有最新epoch的Cluster Map副本。因为Cluster Map的特殊性,Client向上提供了非常简单的接口实现将整个存储机群抽象为单一的逻辑对象存储结构。 Cluster Map的更新由OSD的状态变化或者其他事件造成数据层的变化驱动,每一次Cluster Map更新都需要将map epoch增加,map epoch使Cluster Map在所有节点上的副本都保持同步,同时,map epoch可以使一些过期的Cluster Map能够通过通信对等节点及时更新。 在大规模的分布式系统中,OSDs的failures/recoveries是常见的,所以,Cluster Map的更新就比较频繁,如果将整个Cluster Map进行分发或广播显然会造成资源的浪费,RADOS采用分发incremental map的策略避免资源浪费,其中incremental […]
Linux 2.6.38 User-space interface for Crypto API
Linux内核里面自带非常多的加密模块,这是模块经过调优性能非常高, 而且现在又很多硬件本身支持加密功能,比如intel的CPU支持AES加密指令,那些内核的那帮人知道更好如何利用这些硬件更快的完成加密功能的, 他们写的这些硬件的驱动在drivers/crypto目录里. 所以如果我们能在用户空间的应用程序中用到这些加密库有二个好处: 1. 无须再造轮子. 2. 性能高. 幸运的是2.6.38的内核给我们带来了这些功能. 这些功能是通过socket方式暴露的,思路非常独特优雅,同时由于支持gather write, scatter read, 无须拷贝数据,性能应该非常高. 具体可以参考底下材料: User-space interface for Crypto API : 这里, 这里 在ubuntu10.10下安装新的内核2.6.38, 参考这里 安装完了系统,我们可以演示下如何使用新的API调用: $ uname -r 2.6.38-yufeng $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=10.10 DISTRIB_CODENAME=maverick DISTRIB_DESCRIPTION=”Ubuntu 10.10″ $ cat > example.c #include <stdio.h> #include <sys/socket.h> #include <linux/if_alg.h> #ifndef AF_ALG #define AF_ALG 38 #define SOL_ALG 279 #endif […]
To solve the problem between JAXB2.1 and JDK1.6/6.0
Scenario 1 1.8. Using JAX-WS 2.1 with JavaSE6 JavaSE6 ships with JAX-WS 2.0 API in rt.jar, which causes some trouble when you try to run applications that use JAX-WS 2.1 API. This document collects information about how to solve this issue. 1.8.1. Endorsed directory One way to fix this is to copy jaxws-api.jar and jaxb-api.jar […]