segment 2009-09-03
gears 参考项目:Prj_gears_ibm:
dbquery.html很奇怪,需要放在webroot/tool/下面,才能监控C:\Documents and Settings\值班\Local Settings\Application Data\Google\Google Gears for Internet Explorer\http_8080下的数据库文件,比如我的数据库是mydb,只要输入mydb就可以访问了。
GearsSamplesAndTools下的dbquery.html可以随意新建数据库,数据库文件放在 C:\Documents and Settings\值班\Local Settings\Application Data\Google\Google Gears for Internet Explorer\_null_.localdomain下面。
奇怪。
测试项目:upload,
1.只打开终端:http://localhost:8080/tools/dbquery.html在firefox下面没有结果,在ie下有结果,测试数据库pamsqlite
2.编译后使用chrome打开程序,只有chrome运行上面链接才能显示打开后的数据;
3.使用firefox打开,同2
目前得出结论:
1.终端和ie6使用同一个位置存储数据,那就是C:\Documents and Settings\值班\Local Settings\Application Data\Google\Google Gears for Internet Explorer\localhost\http_8080
2.chrome使用单独位置存储,是C:\Documents and Settings\值班\Local Settings\Application Data\Google\Chrome\User Data\Default\Plugin Data\Google Gears\localhost\http_8080
3.firefox使用位置C:\Documents and Settings\值班\Local Settings\Application Data\Mozilla\Firefox\Profiles\bie4hmk1.default\Google Gears for Firefox\localhost\http_8080
segment 2009-05-06
remember the milk在构建gears应用上的经验:
1. Gears概述:
Gears包含三个重要的组成部分:LocaServer, Database, WorkerPool。很有必要把这三个部分看成低级的基础性的功能块,作用上与XMLHttpRequest对象相似,它不是一种完整快速的使应用程序离线化的解决方案。比如,Gears提供了数据同步的方式:通过提供一个持久性的数据存储数据库和javascript线程支持workerpool,但是它没有提供同步功能本身。记着这些,让我们来详细看看这三个组成部分以及rtm如何利用的。
LocalServer:它允许存储各种资源文件,ResourceStores ,ManagedResourceStores,应用程序可以关联到不同类型的多种stores中去。它也拦截了来自于浏览器的所有请求(post请求是个例外),并提供符合这些请求的资源文件。你可以将它视为一个在任何时刻都允许访问的容量巨大的缓存。ResourceStore 需要应用程序手动处理取得的资源文件,而ManagedResourceStore 允许开发者提供一个manifest文件描述离线应用程序需要的资源文件,ManagedResourceStore还能智能地控制manifest的版本变化。
rtm在它的离线实现中使用了一个ManagedResourceStore,这将在下文描述。
Database:Gears提供了一个持久性的,可存取的数据库,也就是sqlite3关系数据库管理系统。sqlite是一个功能强大的数据库,提供了绝大多数sql92功能,包括事务处理,主键,视图等,一个应用程序可以存取多个sqlite数据库。
rtm中离线功能只使用了一个数据库。
WorkerPool:它带来了javascript线程。它在它自己的解释器实例中执行代码,使用message作为通信方式。这种实现的一个重要特点是workerpool不共享任何状态,运行在一个线程中的代码也有一些局限,比如,它不能够参考任何DOM对象,目前也不能访问任何对象,例如xmlhttprequest.
RTM目前没有使用Workerpool,但是正在考虑使用。
2. 架构考虑
为应用程序添加离线功能主要考虑两点:哪些功能需要使用离线,有多少应用程序逻辑在客户端。比如,RTM从一开始就被设计为一个客户端应用程序,服务端代码主要用于数据存储,应用程序周期性的与服务器同步。所以,rtm很容易实现离线功能,因为我们之前在数据同步协议上也有一定经验。
有些功能不能在离线模式下使用,比如集成的google maps,这个功能让用户能够定位他们的任务,并能在地图上看到这些任务将在哪儿发生。因为这个功能需要访问google服务器,并下载地图数据,这些数据集相当庞大,而且很难缓存, 所以这个功能在离线模式下被禁用了。
undo功能同样在离线模式下不能使用,因为这涉及到复杂的服务端操作。作为代替,用户可以使用对话框来验证自己的行为。
在代码封装方面,离线功能实现只给代码库增加了很少的代码。rtm作为一个大型的JavaScript应用程序,在未包含离线功能之前有大约3w代码行,大约700行代码被用于代替需要服务端存取的功能,大约1300行代码用于同localserver和database交互,提供了检测网络状况,显示接口元素等功能。
3. 选择一个模式策略
模态:gogle reader,需要用户手动转换在线和离线状态,在转换的过程中,应用程序将同步数据。
非模态:rtm,应用程序总是和服务器端的数据同步,但是也可以选择在线或者离线工作。
4. 离线转换的5个步骤
4.1. 确保资源在离线是可用的。
为ManagedResourceStore 产生一个manifest文件来确保所有的资源文件在离线都是可用的。另外一个需要考虑的是manifest的版本问题,在rtm中manifest版本是由用户名,应用程序生成版本,语言三方面构成的。
4.2. 应用程序与网络的解耦。
下一步是确保应用程序可以在没有网络连接的状态下也可以运行。如果你的应用不是一个单网页应用程序,解耦是很困难的。在这种情况下,应用不得不使用ajax,否则服务端所有的页面都需要加到manifest上。rtm在事务管理层拦截了所有的网络调用,事务管理层负责分发和监测所有的xmlhttprequest,实现了一种rpc,它提供了方法名和参数。
4.3.在客户端持久化数据。
既然应用程序与网络解耦了,就可以使用数据库持久化数据了。在大多数情况下,当关系数据库用于服务端的时候,把服务端的schema以及数据同步到客户端的sqlite上很简单。gears数据库可以看成一个可以存取的缓存。rtm使用gears作为一个缓存,把所有的数据都存在浏览器
4.4.基于持久化的数据,重构应用程序状态
4.5.开发一种同步策略
5.经验和教训
在实现rtm中的离线功能的时候,下面的东西可能很有用。
segment 2009-05-05
架构:
离线驱动的web应用程序有很多种架构来实现,但是这些架构也有以下共同点:1.隔离数据层;2,连接策略,决定哪些需要离线实现;3.应用程序的模式;4,实现了数据同步;
1.ajax应用程序只有一个数据源:服务器;有数据层的架构,这里的数据层指的是一个中间对象,它的作用是在应用程序与服务器上的数据源或者本地数据源之间进行选择;没有数据层的架构,通过拦截应用程序的所有调用;
2.有些应用没有必要离线实现;
3. 模态应用程序的离线和在线模式是不一样的,需要用户手工转换这两种状态;这个在实现上简单一点;
非模态应用程序实现了这两种状态的无缝过渡;它首先同本地数据库进行存取,然后同步到服务器上去;
4.无论你使用的是哪一种模式策略,本地数据库中的数据最终将和服务器上的数据同步。
- 手动同步,
- 后台同步,
数据库安全:
为了避免sql注入,For example, write this:
db.execute('insert into MyTable values (?)', data);
instead of this:
db.execute('insert into MyTable values (' + data + ')');
segment 2009-05-05
developer conference:
v8 优化了大量的对象使用,函数调用和属性存取带来的浏览器负担。虚拟机,隐藏类,内联缓存,垃圾收集,快照,
segment 2009-05-05
manifest:清单,名单,表明;
tutorial:
1. 编辑manifest文件;
version;
entries;
2. 增加一些用户接口;
3. 上传文件到http服务器;
4. Test:本地获取文件;
5. Test:存取获取的文件;
6. 发布工程;
7. manifest文件的更新
segment 2009-05-06
gears学习:
1. LocalServer模块的作用是让web应用程序在离线的时候也能访问,
2. 存储用户的数据:
3. 性能,当同步大量数据的时候,浏览器的响应速度有可能降低,workerpool能减轻浏览器的负担,因为它把数据库操作转移到了后台上执行。
Best Practices最佳实践:
1. 开始使用Gears:
a,Speed Up Static Resources,首先使用LocalServer模块,LocalServer装载静态资源以后,可以显著提高程序的性能。wordpress的富编辑框就是例子,localserver存储了所有的富编辑框中的静态文件资源。这个模块和普通的http缓存是不同的。后者每次只能调用一个文件,前者却能调用一堆文件;另外一个不同是前者首先处理资源,然后验证整个包;后者是先验证然后处理。
b,Cache Data and Use Search Locally ,然后要使用全文搜索,它和数据库模块是连接在一起的,MySpace在它的mail功能上使用了这个。它使用WorkerPool把所有的用户信息下载到本地,然后在数据库中进行索引,极大地提高了查询速度。你也可以使用本地数据库缓存经常用到的用户数据,比如邮政编码查询表或者雇员联系信息。比如,MySpace提供了快速的客户端排序,可以按照 read/unread, date sent, sender等等这些进行快速排序,这个排序过程不会通过连接服务端的方式,仅在客户端进行。
c,going offline
2. offline架构:
把应用程序offline的首要任务是确定使用哪一种offline架构。RTM能够快速offline化是因为它几乎是一个厚客户端,Ajax应用程序,调用服务端暴露的代码,这里的厚客户端指的是应用程序所有的业务逻辑都在服务端。这以后的任务就是确定怎样同步了。当然还有处理online/offline检测的问题。最后就是编码了。
3.online/offline检测:
这里有两个不确定性,用户可以手动控制是否进入offline模式,或者程序自动检测网络状况,根据网络状况自动选择哪种模式。我们推荐选择第一种方法。
4. Gears编程:
WordPress使用了一个按钮turbo来提示用户是否使用gears。同时在程序中要避免调用 google.gears.factory.create这个API。在提示用户安装的时候可以自定义一下,使用google.gears.factory.hasPermission和google.gears.factory.getPermission;
5. 安装和检测:
在使用gears之前,应该检测 google.gears 对象是否存在和可用。
6. 在分布于不同主机的应用程序中使用LocalServer:
一些大型网站喜欢把静态页面单独放在一个域里面,比如:static.example.com,这区别于动态内容的站点:example.com。这种做法会让LocalServer工作起来很困难,因为它只能从相同的域里面下载资源文件。目前的解决方法是结合LocalServer和Cross-Origin Workers 一起使用。
首先在静态域中创建一个文件,cache-worker.js,当然还有一个manifest文件: manifest.js。通过设置以后,程序在静态域中有一个cross-origin worker,通过它我们可以下载静态资源文件到LocalServer中去,因为LocalServer运行在静态域的worker里面,所以它可以从那个域里面下载资源。现在当我们想从LocalServer中获取资源的时候,就可以从动态域向静态域中的worker发送信息了。
7. 数据库的性能和可靠性:
提高性能的几点:
a,如果要做的超出了读取数据库, 让所有的读取都来自于worker,而不是浏览器的UI线程,将极大地提高用户体验和浏览器的响应性能,比如,索引一个文档或者数据到数据库中最好是通过worker进行,而不是浏览器线程。
sample:
1,创建workerpool ,var pool = google.gears.factory.create('beta.workerpool');
2,创建worker,
3, 让worker工作在消耗时间的数据库操作上;
b,如果要一次做几项操作,可以把它们放在一个业务里面进行。如果不这样的话,每一次对数据库对象上调用execute都将引起一次明显地业务。
var db = google.gears.factory.create('beta.database');
db.open('my_database');
db.execute('BEGIN');//这一行很重要
try {
// do lots of db.executes() here
db.execute('COMMIT');
} catch(exp) {
db.execute('ROLLBACK');
} finally {
db.close();
}
c,多采用insert而不是update将提高速度。在网络不好的时候,如果先insert一条数据,然后不断地更新这条数据是不明智的,最好的方法是先在内存中缓存
这条数据,然后一次性的insert到数据库中。
提高可靠性:
a,确保每次都关闭了数据库连接和resultsets,做法就是在try-catch中添加finnally块。
b,如果程序有多个worker或者浏览器和worker同时处理相同的数据库,database locked异常就有可能产生。做法就是把所有的数据库代码集中在一个worker中,
在worker中使用一个switch语句,通过传递action的方式进行处理。
8.offline用户接口:
工作在offline下的应用程序将有下面几个要点:online/offline指示,同步按钮和反馈,offline设置,没有启用的功能;
9.可重复使用的workers
如何组织好各种worker?
10.为数据库和LocalServer选择名字
11.在用户机器上存储数据
12.桌面快捷方式
segment 2009-04-10
现在dojo有离线访问的功能,gears也有,在开发难度上实际上差不多,因为都要从头学习,要成长为一个精通至少java,python,javascript的程序员,成功开发基于gears的离线应用以及在可视化分析项目中做出google分析中的效果,最后能够开发iphone, android,bb应用。
检测网路状况,,,离线访问网页,,,离线存储数据,,,同步数据。
Google Gears是一个开源的可以提供给开发者开发离线运行的的网络运用的浏览器扩展。Google Gears有如下特点:
1.本地存储服务网络运用所需要的(HTML, JavaScript, images, etc.)不需要和服务器连接。
2.从浏览器内存储读取数据
3.通过worker thread pool与网络同步。
segment 2009-02-25
一个开源的浏览器扩展,允许web应用程序使用以下JavaScript API提供离线功能:
1. 在本地存储及操作应用程序的资源;
2.将数据存储在本地的完全可搜索的关系数据库里;
3.运行异步JavaScript以提高应用程序的响应速度;