1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
|
<?xml version="1.0" encoding="utf-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
<title>Zimbra - Blog</title>
<link rel="alternate" type="text/html" href="http://www.zimbra.com/blog/" />
<modified>2006-11-15T04:46:36Z</modified>
<tagline>All things Zimbra</tagline>
<id>tag:www.zimbra.com,2006:/blog//1</id>
<generator url="http://www.movabletype.org/" version="3.2">Movable Type</generator>
<copyright>Copyright (c) 2006, Kevin</copyright>
<entry>
<title>What's new in ZCS 4.5 Beta 1</title>
<link rel="alternate" type="text/html" href="http://www.zimbra.com/blog/archives/2006/11/whats_new_in_zc.html" />
<modified>2006-11-15T04:46:36Z</modified>
<issued>2006-11-15T04:12:42Z</issued>
<id>tag:www.zimbra.com,2006:/blog//1.129</id>
<created>2006-11-15T04:12:42Z</created>
<summary type="text/plain">We posted the first beta of Zimbra 4.5 this past Friday. Major new features of 4.5 include complex password enforcement, identities, personal distro lists's, server performance improvements, backup/restore in the admin console, a search builder in the admin console, user-set...</summary>
<author>
<name>Kevin</name>
<url>www.zimbra.com</url><email>kevinh@zimbra.com</email></author>
<dc:subject>Kevin Henrikson</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.zimbra.com/blog/">
<![CDATA[<p>We <a href="http://www.zimbra.com/forums/showthread.php?t=5380">posted</a> the first beta of Zimbra 4.5 this past Friday.</p>
<p>Major new features of 4.5 include complex password enforcement, identities, personal distro lists's, server performance improvements, backup/restore in the admin console, a search builder in the admin console, user-set default fonts for HTML compose, an upgrade to use MySQL 5.0, and a Lotus Domino migration wizard. More details can be found in the <a href="http://www.zimbra.com/pdf/Zimbra%20OS%204.5%20Beta%201%20Release%20Notes.pdf">beta release notes</a>.</p>]]>
</content>
</entry>
<entry>
<title>How much data does Zimbra Mobile use?</title>
<link rel="alternate" type="text/html" href="http://www.zimbra.com/blog/archives/2006/11/how_much_data_does_zimbra_mobile_use.html" />
<modified>2006-11-15T04:11:35Z</modified>
<issued>2006-11-15T03:49:42Z</issued>
<id>tag:www.zimbra.com,2006:/blog//1.128</id>
<created>2006-11-15T03:49:42Z</created>
<summary type="text/plain">Lots of people have asked how much data Zimbra Mobile uses over the wire. Just got my Cingular bill so thought I'd post a screen shot to help explain. ...</summary>
<author>
<name>Kevin</name>
<url>www.zimbra.com</url><email>kevinh@zimbra.com</email></author>
<dc:subject>Kevin Henrikson</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.zimbra.com/blog/">
<![CDATA[<p>Lots of people have asked how much data <a href="http://www.zimbra.com/products/zimbra_mobile.html">Zimbra Mobile</a> uses over the wire. Just got my Cingular bill so thought I'd post a screen shot to help explain. </p>]]>
<![CDATA[<p>This is just a snapshot of one day Nov 7th and the total is for the previous 30days. My Nokia E61 is configured to sync every 15min from 8am -> 8pm 7days a week and then every 4hrs overnight (8pm->8am) On avg each check for mail, calendar, and contacts consumes ~20KB which turns out to be about 1.3MB per day or ~40MB per month. Cingular has a $19.99 Media Max plan that gives you unlimited data and 200 txt msgs so it works out pretty well.</p>
<p><img alt="Zimbra Mobile Data Usage" src="http://www.zimbra.com/blog/archives/images/Picture%209.png" width="671" height="796" /><br />
</p>]]>
</content>
</entry>
<entry>
<title>Taking Zimbra Offline</title>
<link rel="alternate" type="text/html" href="http://www.zimbra.com/blog/archives/2006/11/taking_zimbra_offline.html" />
<modified>2006-11-09T19:43:13Z</modified>
<issued>2006-11-09T17:32:10Z</issued>
<id>tag:www.zimbra.com,2006:/blog//1.127</id>
<created>2006-11-09T17:32:10Z</created>
<summary type="text/plain">Zimbra users have been asking for how they can take the Zimbra AJAX UI offline. Today at Web 2.0 we demo'd this for the first time. ...</summary>
<author>
<name>Kevin</name>
<url>www.zimbra.com</url><email>kevinh@zimbra.com</email></author>
<dc:subject>Kevin Henrikson</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.zimbra.com/blog/">
<![CDATA[<p>Zimbra users have been asking for how they can take the Zimbra AJAX UI offline. Today at Web 2.0 we demo'd this for the first time. </p>]]>
<![CDATA[<p> The design goal is to have the same user experience with Zimbra both online and offline. Technically the Zimbra Offline client is the same AJAX client UI but now connecting to a local sync'd cache of the data and more importantly the ability to search, tag, organize, etc without network access. The two way sync of mail, calendar, contacts, and documents will allow Zimbra user's to take their collaboration data together with the Zimbra AJAX experience with them on the road or in places without a network connection and when they come back online - all of the changes made while offline (like composing, deleting, moving, creating messages, contacts, events or folders) are sync'd back to the cloud. Just like traditional offline mail clients - messages pending to be sent are stored in an Outbox where you can edit and view them until re-connected. You'll notice in the screenshots that both POP accounts and RSS feed folders are sync'd when in offline mode just as when online. RSS folders have been part of Zimbra for a while. POP aggregation will be part of our next major release and IMAP will be added shortly after that. Mail identities allows you to respond with the FROM and REPLY-TO addresses that the mail come with - responding to mail POP'd from gmail; Zimbra will automatically set the FROM address to your @gmail.com account. This feature is also useful for people who would like to respond as support@company.com when responding on behalf of a support team mail list for example. Mail identities will also be part of Zimbra's next major release. Watch this space for more on the architecture of the offline sync cache - meanwhile below are some screenshots. The beta version of the offline client for email and contacts will be available in Q4. </p>
<p><img alt="Zimbra Outbox" src="http://www.zimbra.com/blog/archives/images/Picture%201.png" width="356" height="244" /><br/></p>
<p><img alt="Zimbra Offline Compose" src="http://www.zimbra.com/blog/archives/images/Picture%202.png" width="713" height="450" /><br/></p>
<p><img alt="Zimbra Offline POP accounts" src="http://www.zimbra.com/blog/archives/images/Picture%203.png" width="511" height="462" /><br/></p>
<p><img alt="Zimbra Offline Sync" src="http://www.zimbra.com/blog/archives/images/Picture%204.png" width="427" height="252" /><br/></p>
<p><img alt="Zimbra Mail Identities" src="http://www.zimbra.com/blog/archives/images/Picture%205.png" width="666" height="482" /></p>
<p></p>
<p></p>]]>
</content>
</entry>
<entry>
<title>Busy week @ Zimbra</title>
<link rel="alternate" type="text/html" href="http://www.zimbra.com/blog/archives/2006/11/busy_week_zimbra.html" />
<modified>2006-11-07T00:08:50Z</modified>
<issued>2006-11-06T23:53:34Z</issued>
<id>tag:www.zimbra.com,2006:/blog//1.126</id>
<created>2006-11-06T23:53:34Z</created>
<summary type="text/plain">Several events going on this week. Satish, John and Greg will be at VMWorld where Satish will take part in tomorrow's keynote. Later this week at ISPCon I'll be on a panel - What the Web 2.0?. Last but not...</summary>
<author>
<name>Kevin</name>
<url>www.zimbra.com</url><email>kevinh@zimbra.com</email></author>
<dc:subject>Kevin Henrikson</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.zimbra.com/blog/">
<![CDATA[<p>Several events going on this week. Satish, John and Greg will be at <a href="http://www.vmware.com/vmworld/">VMWorld</a> where Satish will take part in <a href="https://www.vmware.com/vmworld/agenda_keynotes.html">tomorrow's keynote</a>. Later this week at <a href="http://www.ispcon.com/">ISPCon</a> I'll be on a panel - <a href="http://www.ispcon.com/conference/sessionsbyday.php#E6">What the Web 2.0?</a>. Last but not least <a href="http://www.web2con.com/cs/web2006/view/e_spkr/2441">Satish</a> will be back on the main stage at <a href="http://www.web2con.com/">Web 2.0</a>. For those who missed it last year; <a href="http://blogsearch.google.com/blogsearch?hl=en&q=zimbra+web+2.0&ie=UTF-8&as_maxm=11&as_miny=2005&as_maxy=2005&as_minm=10&as_mind=1&as_maxd=1&as_drrb=b&ctz=480&c1cr=10%2F1%2F2005&c2cr=11%2F1%2F2005&btnD=Go">Zimbra launched at Web 2.0</a>.</p>]]>
</content>
</entry>
<entry>
<title>The Ajax Experience, Oct 23-25, Boston, MA</title>
<link rel="alternate" type="text/html" href="http://www.zimbra.com/blog/archives/2006/10/the_ajax_experi.html" />
<modified>2006-11-02T20:10:26Z</modified>
<issued>2006-10-29T19:08:04Z</issued>
<id>tag:www.zimbra.com,2006:/blog//1.125</id>
<created>2006-10-29T19:08:04Z</created>
<summary type="text/plain">Below are random thoughts on three days in Boston at The Ajax Experience. I gave a talk titled Ajax in the Enterprise....</summary>
<author>
<name>Conrad</name>
<email>cdamon@zimbra.com</email></author>
<dc:subject>Conrad Damon</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.zimbra.com/blog/">
<![CDATA[<p>Below are random thoughts on three days in Boston at <br />
<a href="http://www.theajaxexperience.com">The Ajax Experience</a>. I gave a talk titled <a href="http://www.theajaxexperience.com/s/show/59/slides/Conrad_Damon/Ajax_in_the_Enterprise.pdf">Ajax in the Enterprise</a>.</p>]]>
<![CDATA[<p>... AOL was giving away T-shirts by the hundreds, in solid, bright colors with <br />
words like "Geek" or "2.0" on them. Some conferencegoers walked away with <br />
several, which wasn't discouraged - there seemed to be an endless supply. Every <br />
time I walked by the booth I wanted ("want" isn't the right word, it's more the <br />
primal lust for free stuff) to grab a shirt or two, when the last thing in the <br />
world I need is more T-shirts. Eight years ago when I moved I gave 99 shirts, <br />
most of them unworn, to the Salvation Army. These were garish and ugly, and <br />
trying in AOL's typically disingenuous way to plug into geek culture. Plus, <br />
there's the associated guilt of all those unopened CDs taking up landfill space. <br />
Hence the little cartoon angel on my right shoulder. Of course, the little <br />
cartoon devil on my left shoulder made himself heard: "Dude, it's FREE! Don't be <br />
such a Herb! If you don't take one, someone else will get it. You've earned it. <br />
And dude: it's FREE!" So it went, and every walk past the AOL booth became an <br />
exercise in self-denial of something I didn't actually want at all, and the <br />
thimbleful of pride I felt on passing by empty-handed made me feel like some sort of <br />
lame modern-day ascetic.</p>
<p>... speaking of AOL (I don't mean to pick on AOL, even the newly warm and fuzzy <br />
AOL, but they make it really easy), one of their minions gave a keynote during <br />
which he screened a movie where they went up to people on the street or in the <br />
grocery store and asked them what they thought "Ajax" was. And OH MY GAWD (the <br />
voice here should be Dr Cox from Scrubs), they thought it was a cleanser! What a <br />
bunch of losers!</p>
<p>Crikey.</p>
<p>... really regret my get-out-of-Dodge trip planning, which made me miss Brendan <br />
Eich's closing keynote on Javascript 2.</p>
<p>... "stack" is the new "solution".</p>
<p>... <a href="http://www.openqa.org/selenium/">Selenium</a>, a product for doing functional client <br />
testing in an Ajax environment, got a lot of buzz. Our QA team is looking into it. They've had to <br />
pound on Mercury's QTP pretty hard to get it to work with our client, and I'm hoping <br />
Selenium will be way more straightforward.</p>
<p>... the booths from some of the sponsors such as Google, Sun, and Ask were more<br />
focused on recruiting than on demos, always a sign of a technology on its way up.</p>
<p>... after the experts' panel on Monday night, I headed to the hotel bar and met <br />
up with the Netflix crew. As a longtime Netflix member, I couldn't resist rattling on <br />
about what I liked and disliked about their site and service. Not only did they <br />
listen - brave souls - they bought me beer. The more beer I had in me, the more <br />
clever and insightful I became, and I think they caught on to that.</p>
<p>The Netflix UI makes for a great case study in how going from HTML to Ajax <br />
can improve the user experience.</p>
<p>... there is a bewildering array of Ajax toolkits out there, and at least two of <br />
the presentations were overviews of frameworks. The space has exploded, and <br />
sooner rather than later, it will contract. Documentation, often overlooked, <br />
will be key to adoption. It's hard to bet against <br />
<a href="http://www.dojotoolkit.org/">Dojo</a>, with its breadth, careful design, and technical impressiveness. <br />
I heard good things about <a href="http://jquery.com/">jQuery</a>, and <a href="http://developer.yahoo.com/yui/">YUI</a> looks clean. For all-Java shops there's <br />
<a href="http://code.google.com/webtoolkit/">GWT</a>, and possibly <a ref="http://getahead.ltd.uk/dwr">DWR</a>.</p>
<p>... My ad hoc plan of attack, and reviews, in order of attendance:</p>
<p>Leveraging Ajax for Enterprise Application Development - mostly good <br />
content, somewhat awkwardly delivered. Best part was practical tips for shops <br />
coming up to speed on Ajax.</p>
<p>Javascript Exposed: There's a Real Programming Language in There (Pt 1), by <br />
Glenn Vanderburg - had intended to go to Mahemoff's talk on design patterns, but <br />
he didn't make it to the conference. Glenn's an engaging presenter, which eased <br />
the fact that it was mostly a tutorial of what you'd find in the O'Reilly book. <br />
Glenn did a good job of focusing on important bits of the language that are <br />
often glossed, and I really liked his lists of what he believes the language <br />
designers got right and wrong.</p>
<p>Ruining the User Experience, by Aaron Gustafson - the scope of this presentation <br />
was smaller than I had hoped. From the summary, I thought it would cover UI <br />
idioms that have been made possible by Ajax but which don't improve the user <br />
experience, but it was almost all about what to do when Javascript is<br />
disabled.</p>
<p>Frameworks Guide, by Nathaniel Schutta - came to this one as a refugee from a <br />
TIBCO-centric talk on building desktop-like apps in Ajax. It was good to get an <br />
overview, delivered capably and neutrally, since having developed our own <br />
toolkit I'm not familiar with others.</p>
<p>Intro to Dojo / Dojo in Depth, by Alex Russell - Dojo looks pretty awesome, and <br />
Alex is super-smart. Dojo obviously goes beyond Ajax, and even within Ajax it <br />
offers much more than widgets and neat effects. Their event system, the new <br />
SVG/VML support, and XhrIframeRequest were highlights. I'll be looking soon into <br />
using its package system to leverage deferred loading of ZCS components.</p>
<p>IE7: From Ajax to RSS and More: How to Take Full Advantage, by Chris Wilson - <br />
acutally: quite: interesting. IE7 will make app developers very happy, and app <br />
maintainers very unhappy. It's really frightening to think of the untold numbers <br />
of websites out there that rely on the many ways in which IE6 is broken (insert <br />
truism about reaping what you sow). As much grief as they deservedly get, MS <br />
appears to be committing to standards as far as its browser goes (thank you, <br />
market forces). Best news for me is that they fixed the garbage collector, so <br />
memory no longer leaks at the drop of a hat. They also fixed the SELECT <br />
element's behavior with regard to z-index, the gzip caching problem, and untold <br />
CSS bugs.</p>
<p>JSON: The X in Ajax, by Douglas Crockford - the case for JSON is a strong one, <br />
as XML is often overkill for shuttling data around. I love its simplicity and <br />
compactness. Of particular interest: JSONRequest and a proposed MODULE tag to <br />
address cross-domain security issues. Near the end there was an odd moment when <br />
John Resig (jQuery) posed a reasonable-sounding question about whether JSON <br />
performance scales well across large datasets when compared with XML, and the <br />
immediate response was "Next question." Not sure what to conclude from that.</p>
<p>Designing for Ajax, by Bill Scott - bailed on a performance talk that turned out <br />
to be Gomez-centric and came here. Great presentation. Bill used Yahoo as well <br />
as other sites to point out good and bad Ajax-enabled interaction patterns. <br />
Makes me want to check out the Yahoo design patterns library.</p>
<p>Case Study: Building Great UI, the Netflix Way, by Sean Kane - everyone loves <br />
Hypnotoad, I mean Netflix. What was interesting here (aside from the obvious <br />
fascination with the service) was how extensively they test in UI labs with <br />
regular folks before rolling out changes, often trying out several possible <br />
versions of a UI feature. It would be nice if we could eventually get real-world <br />
data like that.</p>]]>
</content>
</entry>
<entry>
<title>Firefox 2 vs IE 7</title>
<link rel="alternate" type="text/html" href="http://www.zimbra.com/blog/archives/2006/10/firefox_2_vs_ie_1.html" />
<modified>2006-10-25T23:56:26Z</modified>
<issued>2006-10-25T21:33:29Z</issued>
<id>tag:www.zimbra.com,2006:/blog//1.124</id>
<created>2006-10-25T21:33:29Z</created>
<summary type="text/plain">Last week I posted an entry comparing IE 7 with Firefox 1.5 and the venerable IE 6. Lot's of folks have since asked for Firefox 2 to be added to the mix. The reason we didn't initially include Firefox 2...</summary>
<author>
<name>Ross</name>
<email>ross@zimbra.com</email></author>
<dc:subject>Ross Dargahi</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.zimbra.com/blog/">
<![CDATA[<p>Last week I posted an <a href='http://www.zimbra.com/blog/archives/2006/10/ie_7_a_better_b.html'>entry</a> comparing IE 7 with Firefox 1.5 and the venerable IE 6. Lot's of folks have since asked for Firefox 2 to be added to the mix. The reason we didn't initially include Firefox 2 is because it was not at the time officially released and so we felt it unfair for it to be included. </p>]]>
<![CDATA[<p>The graph below shows the cumulative time it took for IE 7 and Firefox 2 to execute the Zimbra Web Client (ZWC) peformance tests at various dates leading up to the final release of each browser. As can be seen, both IE and Firefox showed improvement in their final release, and so we think leaving Firefox 2 out of last week's tests was indeed the fair thing to do. </p>
<p><a target='_new' href="http://www.zimbra.com/blog/archives/images/trend.jpg"><br />
<img alt="trend.jpg" src="http://www.zimbra.com/blog/archives/images/trend.jpg" width="344" height="169" /></a></p>
<p>So now that Firefox 2 has been officially released, how does if fare against IE 7? </p>
<p>We ran each browser over a common set of Zimbra Web Client (ZWC) operations such as logging in, viewing messages, navigating around various folders, changing options, viewing contacts, and performing various calendar operations. As the graph below shows, Firefox 2 beat out IE 7 in just about every operation - sometimes by significant margins. </p>
<p><a target="_new" href="http://www.zimbra.com/blog/archives/images/FF2vsIE7.jpg"><br />
<img alt="FF2vsIE7.jpg" src="http://www.zimbra.com/blog/archives/images/FF2vsIE7.jpg" width="638" height="144" /></a></p>
<p>We also tested Firefox 2 vs Firefox 1.5. As seen below, Firefox 2 has not made substantial performance improvements over Firefox 1.5, and has certainly not shown the same order of gain as IE 7 has over IE6.</p>
<p><a target="_new" href="http://www.zimbra.com/blog/archives/images/FF2vsFF15.jpg" ><br />
<img alt="FF2vsFF15.jpg" src="http://www.zimbra.com/blog/archives/images/FF2vsFF15.jpg" width="603" height="157" /></a></p>
<p>I think the net result is that for highly JavaScript intensive AJAX applications such as the ZWC, Firefox is still the winner by quite a wide margin. Of course your mileage will vary depending on the type and footprint of your client.</p>
<p>I would like to end by saying that we are able to present this data thanks to lots of hard work by Raja Rao of the Zimbra QA department who has spent many long hours building our AJAX client testing framework, and executing the performance tests against the various browsers.</p>]]>
</content>
</entry>
<entry>
<title>IE 7 vs IE 6</title>
<link rel="alternate" type="text/html" href="http://www.zimbra.com/blog/archives/2006/10/ie_7_a_better_b.html" />
<modified>2006-10-19T18:12:50Z</modified>
<issued>2006-10-19T18:13:00Z</issued>
<id>tag:www.zimbra.com,2006:/blog//1.123</id>
<created>2006-10-19T18:13:00Z</created>
<summary type="text/plain">Back in April I wrote an entry complaining about IE's performance as a Web 2.0 platform: "From a Web 2.0 application developers perspective (developers who use a lot of JavaScript and DOM manipulation), IE 6 is plagued by a number...</summary>
<author>
<name>Ross</name>
<email>ross@zimbra.com</email></author>
<dc:subject>Ross Dargahi</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.zimbra.com/blog/">
<![CDATA[<p>Back in April I wrote an <a href="http://www.zimbra.com/blog/archives/2006/04/post.html">entry</a> complaining about IE's performance as a Web 2.0 platform:</p>
<p><i>"From a Web 2.0 application developers perspective (developers who use a lot of JavaScript and DOM manipulation), IE 6 is plagued by a number of well known problems such as its ability to readily leak memory. Regrettably, Microsoft's next release of Internet Explorer, IE 7, does little to resolve these issues."</i></p>
<p>I am happy to say that I was wrong. </p>]]>
<![CDATA[<p>Microsoft's IE team has clearly been hard at work on improving their browser's memory management and JavaScript performance. IE 7 has made some significant leaps forward based on some initial in house testing here at Zimbra. We are in general observing about a 2x performance improvement with IE 7 vs IE 6 when using the Zimbra Web Client (ZWC).</p>
<p>As is well documented, IE 6 is notoriously bad at leaking memory, particularly due to circular references that include COM objects. The good news is that our tests indicate that this problem has been solved in IE 7. While in our test profile, it appears to consume more memory than Firefox, IE 7 seems to have solved the horrendous memory leaks exhibited in IE 6.</p>
<p>We also looked at the performance of Firefox, IE 6, and IE 7 over a set of common ZWC operations such as logging in, viewing messages, navigating around various folders, viewing contacts, and performing various calendar operations. The graph below shows the relative performance of each browser against the other:</p>
<p><a href="http://www.zimbra.com/blog/archives/images/browserperf.jpg" target="_new"><img alt="browserperf.jpg" src="http://www.zimbra.com/blog/archives/images/browserperf.jpg" width="499" height="130" /></a></p>
<p>Again we see that across just about every operation, IE 7 performs better than IE 6; however, for the most part Firefox still beats out IE 7. When we looked at the sum total time it takes for all operations to be performed (admittedly a coarse grained metric), we noticed that IE 7 was about twice as fast as IE 6; however, Firefox was more than twice as fast as IE 7 and about four times faster than IE 6.</p>
<p>In conclusion, IE 7 has made some quite significant improvements over IE 6, both in terms of performance and memory management; however, there is still room to improve - particularly against Firefox, a challenge I hope the IE team will be taking up.</p>]]>
</content>
</entry>
<entry>
<title>Zimbra Collaboration Suite 4.0.3 Released</title>
<link rel="alternate" type="text/html" href="http://www.zimbra.com/blog/archives/2006/10/zimbra_403_released.html" />
<modified>2006-10-17T23:09:27Z</modified>
<issued>2006-10-17T23:09:23Z</issued>
<id>tag:www.zimbra.com,2006:/blog//1.122</id>
<created>2006-10-17T23:09:23Z</created>
<summary type="text/plain">ZCS 4.0.3 includes fixes for 55 bugs and enhancements. It has significant improvements in calendar behavior and fixes a bug in Trash folder viewing that was troubling many folks. It also includes upgrade speed improvements. This allows the upgrade to...</summary>
<author>
<name>Kevin</name>
<url>www.zimbra.com</url><email>kevinh@zimbra.com</email></author>
<dc:subject>Kevin Henrikson</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.zimbra.com/blog/">
<![CDATA[<p>ZCS 4.0.3 includes fixes for 55 bugs and enhancements. It has significant improvements in calendar behavior and fixes a bug in Trash folder viewing that was troubling many folks. It also includes upgrade speed improvements. This allows the upgrade to take much better advantage of installs that have multiple disks available to MySQL.</p>
<p><a title="Zimbra - Forums - Zimbra Collaboration Suite 4.0.3 Released" href="http://www.zimbra.com/forums/showthread.php?p=27503">Zimbra - Forums - Zimbra Collaboration Suite 4.0.3 Released</a></p>
<p></p>]]>
</content>
</entry>
<entry>
<title>Thoughts on Office 2.0 (Reprise)</title>
<link rel="alternate" type="text/html" href="http://www.zimbra.com/blog/archives/2006/10/preliminary_tho.html" />
<modified>2006-10-21T20:01:05Z</modified>
<issued>2006-10-17T11:43:14Z</issued>
<id>tag:www.zimbra.com,2006:/blog//1.121</id>
<created>2006-10-17T11:43:14Z</created>
<summary type="text/plain">(FYI: I've made some enhancements/corrections based on Zimbra's participation at the Office 2.0 Conference; pointer below. May or may not be worth a quick reread.) Yes, the "2.0" hype is getting out of hand. However, just as with Web 2.0,...</summary>
<author>
<name>Scott</name>
<url>www.zimbra.com</url><email>scott.dietzen@zimbra.com</email></author>
<dc:subject>Scott Dietzen</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.zimbra.com/blog/">
<![CDATA[<p>(FYI: I've made some enhancements/corrections based on Zimbra's participation at the Office 2.0 Conference; pointer below. May or may not be worth a quick reread.)</p>
<p>Yes, the "2.0" hype is getting out of hand. However, just as with <a href="http://www.zimbra.com/blog/archives/2006/06/defining_web_20.html">Web 2.0</a>, the technology evolution we are participating in is sufficent to at least justify the discussion. So while I am still dubious about the Office 2.0 moniker, there is no doubt that the Web authoring, sharing, and collaboration technologies under the Web 2.0 umbrella are allowing us to do many of the things we used to do within proprietary Office 1.0 desktop applications, and to do so from any browser on the net. So before you dismiss Office 2.0 as yet another buzz word <em>du jour</em>, please consider some (modest) over-generalizations: </p>]]>
<![CDATA[<p><strong>Office 1.0 Users: </strong>Power users (information workers/professionals) <br />
<strong>Office 2.0 Users: </strong>"All hands" (most everyone who browses) </p>
<p><strong>1.0 Model:</strong> Client-centric (desktop applications) <br />
<strong>2.0 Model:</strong> Network-centric (web applications)</p>
<p><strong>1.0 Sharing (in the small):</strong> Pass by value <em>(Email)</em>, pass by reference <em>(Public folders)</em><br />
<strong>2.0 Sharing (in the large):</strong> Adds the ability to use the Internet to pass by value <em>(Email, VoIP, IM, ...) </em> and (effectively) by reference <em>(XHTML pages/hyperlinks, Wiki, Blogs, iCalendar/CalDAV, iTasks, WebDAV, ...)</em>, all with access control</p>
<p><strong>1.0 Navigation (sans meta-data):</strong> <em>Folders </em><br />
<strong>2.0 Navigation (with meta-data):</strong> <em>Hyperlinks, indexing & search, tagging, mash-ups …</em></p>
<p><strong>1.0 Editing:</strong> <em>Via proprietary desktop applications; WYSIWYG with change tracking</em><br />
<strong>2.0 Editing:</strong> <em>From any browser; WYSIWYG (via Ajax authoring) with versioning and history</em></p>
<p><strong>1.0 Data types:</strong> Proprietary<br />
<strong>2.0 Data types:</strong> Open <em>(XHMTL, ODF, microformats, XML such as via Service-Oriented Architecture/SOA, REST, SOAP, etc.)</em></p>
<p><strong>1.0 Content:</strong> Relatively static, with intra-desktop dynamic components<br />
<strong>2.0 Content:</strong> More dynamic <em>(including web application-generated content, SOA mash-ups, …)</em></p>
<p><strong>1.0 Multi-document:</strong> <em>Object Linking & Embedding (OLE), Bonobo, …</em> <br />
<strong>2.0 Multi-document:</strong> <em>Hyperlinks, <a href="http://www.zimbra.com/blog/archives/2006/04/zimbra_ale-ajax_linking_and_embedding.html">Ajax Linking & Embedding (ALE)</a>, mash-ups, ...</em></p>
<p>(No doubt the above takes a rather expansive view of Office 2.0, but then again Office 1.0 arguably covered most all computer-assisted authoring of content. Please also note: The above content would have proved substantially more compelling in an HTML table authored, say, with a WYSIWYG Ajax editor, like that included within the Zimbra Documents applications.)</p>
<p>All this is not to say that Office 2.0 can or should supercede Office 1.0---Zimbra spreadsheets, for example, will not support pivot tables any time soon. I believe our goal should <strong>not</strong> be to reproduce Office 1.0 functionality on a Web 2.0 platform, but rather to realize an easier to use (<em>a.k.a.</em> less complex) collaborative authoring and sharing model that scales with the Internet. Office 2.0 users should be able to (1) author content from anywhere; (2) appropriately reuse and adapt (mash up) content (both static and dynamic) already published on the Internet; and (3) securely collaborate with others in whatever <em>ad hoc</em> fashion best meets their needs. The fun with "Office 2.0" is that thanks to the maturing of the underlying <a href="http://www.zimbra.com/blog/archives/2006/06/defining_web_20.html">Web 2.0 technologies</a> and near universal success of the Internet, this vision is close to realization.</p>
<p>One thing I'm not yet happy with is that the above description does not draw a very compelling line between Web 2.0 and Office 2.0. Some technologies are more obvious: for example, Ajax, RSS, and SOA/XML fit under Web 2.0, while Ajax authoring and ALE arguably fit more naturally under Office 2.0. Given the emphesis on collaboration and authoring inherent in the Web 2.0 definition, I think these two potential categories are going to be tough to keep separate. After all, both Office 1.0 and Web 2.0 are about authoring rich content---the difference is that the former is focused on the desktop and "sharing in the small", while the latter is targeting the network and "sharing in the large". Office 2.0 then may merely mean leveraging Web 2.0 technologies to do many/most (?) of the things we used to do in Office 1.0. </p>
<p>(Some of this thinking came out our <a href="http://www.eu.socialtext.net/office20/index.cgi?apis_and_feeds_for_office_2_0">our panel session</a> at the <a href="http://www.office20con.com/conference.html">Office 2.0 Conference</a> in San Francisco, and our <a href="http://wanderingstan.com/2006-08-21/web_2_0_kongress_in_germany">Web 2.0 Kongress</a> session in Germany the day before. Just doing our bit to keep the airlines in the black :-).)</p>]]>
</content>
</entry>
<entry>
<title>Zimbra Collaboration Suite 4.0 Webinar</title>
<link rel="alternate" type="text/html" href="http://www.zimbra.com/blog/archives/2006/10/zimbra_40_webinar.html" />
<modified>2006-10-05T02:35:45Z</modified>
<issued>2006-10-01T23:07:51Z</issued>
<id>tag:www.zimbra.com,2006:/blog//1.120</id>
<created>2006-10-01T23:07:51Z</created>
<summary type="text/plain">Zimbra Collaboration Suite 4.0 Webinar When: Thurs, October 5th at 10am PST. Length: 60 minutes. Subject: Modern Collaboration with Zimbra Collaboration Suite (ZCS) 4.0 Overview: Fueled by demand for better productivity, the web is exploding as the primary communication medium...</summary>
<author>
<name>Kevin</name>
<url>www.zimbra.com</url><email>kevinh@zimbra.com</email></author>
<dc:subject>Kevin Henrikson</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.zimbra.com/blog/">
<![CDATA[<p><a href="http://www.zimbra.com/about/webinars.html">Zimbra Collaboration Suite 4.0 Webinar</a><br />
When:</p>
<p>Thurs, October 5th at 10am PST. Length: 60 minutes.</p>
<p>Subject: Modern Collaboration with Zimbra Collaboration Suite (ZCS) 4.0</p>
<p>Overview:<br />
Fueled by demand for better productivity, the web is exploding as the primary communication medium for the modern organization.</p>
<p>ZCS leads the way, providing powerful next-generation messaging and collaboration.</p>
<p>Join our CTO Scott Dietzen for this free live webinar to see:</p>
<p> * How ZCS 4.0 is the right solution for today's collaboration demands<br />
* Discuss and demo features such as Zimbra Documents, Admin UI, Zimlets, Mobile device sync, Active Directory integration and more…<br />
* Why ZCS 4.0 enables organizations to realize the true benefits of an innovative and cost-effective collaboration solution.<br />
* Plus live Q & A</p>
<p>Sign up:</p>
<p>Please <a href="http://breeze58226024.breezecentral.com/e78552532/event/registration.html">register</a>; space is limited!</p>]]>
</content>
</entry>
<entry>
<title>Zimbra 4.0.2 released, Ubuntu preview release</title>
<link rel="alternate" type="text/html" href="http://www.zimbra.com/blog/archives/2006/09/zimbra_ubuntu_preview_release.html" />
<modified>2006-09-26T06:11:30Z</modified>
<issued>2006-09-26T05:48:24Z</issued>
<id>tag:www.zimbra.com,2006:/blog//1.119</id>
<created>2006-09-26T05:48:24Z</created>
<summary type="text/plain">We released Zimbra 4.0.2 today and there were a few extras that came along for the ride. First off the Fedora Core 5 build is now GA. We also added a new developer/preview release on Ubuntu. This has been a...</summary>
<author>
<name>Kevin</name>
<url>www.zimbra.com</url><email>kevinh@zimbra.com</email></author>
<dc:subject>Kevin Henrikson</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.zimbra.com/blog/">
<![CDATA[<p>We released Zimbra 4.0.2 today and there were a few extras that came along for the ride. First off the Fedora Core 5 build is now GA. We also added a new <a href="http://www.zimbra.com/community/downloads.html">developer/preview release</a> on <a href="http://www.ubuntu.com/">Ubuntu</a>. This has been a popular <a href="http://www.zimbra.com/forums/showthread.php?t=1644">hack</a> in our forums for sometime.</p>
<p>Here's a sample of some of the other changes/fixes in 4.0.2:</p>
<p>- perf improvements for IMAP (new MySQL indexes)<br />
- > 2GB support in the Zimbra Outlook Connector<br />
- i18n and some l10n for the Zimbra Outlook Connector<br />
- disabling AS/AV causes mail deferral<br />
- cursor fails to appear in Firefox<br />
- mailbox quota page does not contain any entries<br />
- several all day event and timezone bugs fixed</p>]]>
</content>
</entry>
<entry>
<title>Look Ma, No Mouse: Keyboard Navigation and Shortcuts in the Zimbra Collaboration Suite and The Kabuki Ajax Toolkit</title>
<link rel="alternate" type="text/html" href="http://www.zimbra.com/blog/archives/2006/09/look_ma_no_mous.html" />
<modified>2006-09-13T07:28:26Z</modified>
<issued>2006-09-13T07:25:00Z</issued>
<id>tag:www.zimbra.com,2006:/blog//1.118</id>
<created>2006-09-13T07:25:00Z</created>
<summary type="text/plain">Keyboard shortcuts and navigation are indispensable time savers for an application's frequent and power users. Who among us has not quickly learned the keyboard shortcuts for performing common tasks within an application that we use regularly? Unfortunately, one of the...</summary>
<author>
<name>Ross</name>
<email>ross@zimbra.com</email></author>
<dc:subject>Ross Dargahi</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.zimbra.com/blog/">
<![CDATA[<p>Keyboard shortcuts and navigation are indispensable time savers for an application's frequent and power users. Who among us has not quickly learned the keyboard shortcuts for performing common tasks within an application that we use regularly? </p>
<p>Unfortunately, one of the more common complaints against web-based applications is that they are, in many instances, lacking when it comes to supporting keyboard shortcuts and navigation. Frankly, the lack of keyboard support (both shortcuts and navigation) is something that has annoyed me about the Zimbra Collaboration Suite (ZCS), and it is something that I have been wanting to add to both Kabuki (the Zimbra Ajax Toolkit) and the ZCS; however, I didn't want to just stuff in some basic keyboard shortcuts and call it a day. Instead, I wanted to have a go at implementing the same level of keyboard support that most traditional UI toolkits and desktop applications support. This actually turned out to involve quite a bit of work - for example, since only input elements may have focus (in most browsers) we needed to simulate and track focus for toolkit components which frequently have no native input element associated with them - but at the end of the day, I think it was worth the effort.</p>]]>
<![CDATA[<p>So the good news is that Kabuki now provides a pretty rich keyboard model that in many ways approximates the level of support found in more traditional UI toolkits. Specifically, this includes support for a canonical focus model, customizable key bindings in UI widgets (not all of them just yet), as well as full support for tab group hierarchies for navigating native and toolkit visual components in an orderly fashion via the tab and arrow keys. Conrad (one of Zimbra's lead Ajax architects), took this work to the next level by implementing keyboard navigation and shortcuts throughout the ZCS and by improving the framework itself. As a result the ZCS now has significant keyboard support in version 4.0, about 80% coverage at the moment, and we are working towards making that even higher. Future work also includes normalized mappings among browsers (very high on our list), I18N support, and supporting custom user-defined bindings.</p>
<p>The bottom line is that the ZCS now supports some pretty spiffy keyboard actions (over 100 of them) including:<br />
<ul><li>Navigating among the various ZCS apps<br />
<li>Navigation and selection within a list of items<br />
<li>Composing and sending an email message<br />
<li>Creating calendar appointments<br />
<li>Switching among calendar views<br />
<li>Creating new tags, folders, calendars, etc<br />
<li>Popping up the Zimbra Assistant<br />
<li>Changing views<br />
<li>Popping up, interacting with, and dismissing context menus<br />
</ul></p>
<p>You can find a more complete list of supported keyboard events on the <a href="http://wiki.zimbra.com/index.php?title=Zimbra_Web_Client_Keyboard_Shortcuts ">Zimbra Wiki</a></p>
<p>Now onto some of the more technical details on Zimbra's keyboard support. </p>
<p>The keyboard management infrastructure is implemented in the DHTML Widget Toolkit (DWT), which is the Kabuki Ajax toolkit's UI framework. DWT consists of a component model, numerous widgets, an event model, drag and drop infrastructure, and now a keyboard shortcut and navigation model. DWT is loosely modeled after SWT. There are several elements that compose DWT's keyboard management framework:</p>
<h4>Key Maps</h4><p>
A key map is a set of key bindings. A key binding maps a key sequence to an action. For example, I may decide that "Ctrl+U" marks an email message as unread, or I may decide that a multi-key sequence such as "Ctrl+N" followed by the letter "M" will create a new mail message (Note that by default, there is a 750ms timeout between keys for a multiple-key sequence, though this is configurable via the DwtKeyboardMgr class described later).
<p>DwtKeyMap is the base class for key maps and provides bindings for DWT widgets. Below is a snippet from DwtKeyMap's constructor showing the key bindings for some of the widgets. Note how key sequences bind to the symbolic constants representing keyboard actions:</p>
<pre>
function DwtKeyMap() {
[snip...]
this._map["DwtDialog"] = {
"Enter": DwtKeyMap.ENTER,
"Esc": DwtKeyMap.CANCEL
};
this._map["DwtButton"] = {
"Enter": DwtKeyMap.SELECT_CURRENT,
"ArrowDown": DwtKeyMap.SELECT_SUBMENU
};
this._map["DwtListView"] = {
"Space": DwtKeyMap.SELECT_CURRENT,
"Ctrl+Space": DwtKeyMap.ADD_SELECT_CURRENT,
"Ctrl+`": DwtKeyMap.ADD_SELECT_CURRENT, // Mac FF
"ArrowDown": DwtKeyMap.SELECT_NEXT,
"Shift+ArrowDown": DwtKeyMap.ADD_SELECT_NEXT,
"Ctrl+ArrowDown": DwtKeyMap.NEXT,
"ArrowUp": DwtKeyMap.SELECT_PREV,
"Shift+ArrowUp": DwtKeyMap.ADD_SELECT_PREV,
"Ctrl+ArrowUp": DwtKeyMap.PREV,
"Ctrl+A": DwtKeyMap.SELECT_ALL,
"Home": DwtKeyMap.SELECT_FIRST,
"End": DwtKeyMap.SELECT_LAST,
"Enter": DwtKeyMap.DBLCLICK,
"Comma": DwtKeyMap.ACTION,
"Shift+Comma": DwtKeyMap.ACTION,
"Ctrl+Enter": DwtKeyMap.ACTION,
"Ctrl+M": DwtKeyMap.ACTION // Mac FF
};
this._map["DwtMenu"] = {
"Esc": DwtKeyMap.CANCEL,
"Enter": DwtKeyMap.SELECT_CURRENT,
"ArrowDown": DwtKeyMap.SELECT_NEXT,
"ArrowUp": DwtKeyMap.SELECT_PREV,
"ArrowLeft": DwtKeyMap.SELECT_PARENTMENU,
"ArrowRight": DwtKeyMap.SELECT_SUBMENU
};
[snip...]
};
</pre>
<p>Applications may inherit from the above class and add their own maps or override existing ones (for example when subclassing widgets). Note that component and application authors don't need to worry about key sequences, rather they just need to implement the actions that their components support. The keyboard management framework takes care of handling the mapping from key sequences to actions. Once a key sequence has been mapped to an action, the action is passed to the handleKeyAction() method defined by the component (See the sections of DwtKeyboardMgr and DwtControl below for more details). </p>
<p>Decoupling key bindings and actions makes it easy to change the key binding for a given action, or to allow multiple key bindings for that action. Key maps may inherit (including multiply) from other key maps. This allows for extensions as well as application-wide (or default) key maps.</p>
<p>The sample code below shows a portion of the ZCS's key map. Notice how the ZmMailListController inherits from the Global key map.</p>
<pre>
function ZmKeyMap() {
this._map["Global"] = {
"`": ZmKeyMap.ASSISTANT,
"Shift+`": ZmKeyMap.ASSISTANT,
[snip...]
}
this._map["ZmMailListController"] = {
"INHERIT": "Global",
"R": ZmKeyMap.REPLY,
"A": ZmKeyMap.REPLY_ALL,
"R,S": ZmKeyMap.REPLY,
"R,A": ZmKeyMap.REPLY_ALL,
[snip...]
}
[snip...]
}
</pre>
<p>Key map entries may consist of:</p>
<ul><li>Single keys e.g. "Enter" or "M"
<li>Single keys plus one or more modifiers e.g. "Ctrl+M" or "Ctrl+Shift+M"
<li>Multiple key sequences e.g "M,U" or "M,U,A"
<li>Multiple key sequences plus modifiers e.g. "Shift+M, U" or "Shift+M, Shift+U, A"
</ul>
<p>We are currently working on a serialization/deserialization interface so that key maps may be serialized to and deserialized from a textual representation. This will help in with localizations and custom/user defined keymaps, and will do away with the need for the hash tables shown above.</p>
<h4>Tab Groups</h4><p>
<p>Tab groups permit the definition of a hierarchical keyboard navigation model. A tab group is a tree structure where the intermediate nodes in the tree are other tab groups and the leaf nodes are focusable components i.e. DWT widgets and/or focusable native HTML elements such as input fields. Tab groups represent the order in which components that the user sees on the screen are traversed via the keyboard. The tab group hierarchy (or tree) is traversed "in order" by the user pressing the tab key, or in reverse order when the user typically presses the shift key plus the tab key.</p>
<p>There is a special tab group called the root tab group. A root tab group has no parent and represents the keyboard navigation order for the components in a given application view. There can be multiple root tab groups within an application, e.g. an email message list view tag group, a calendar new appointment tab group, or a dialog tab group; however, only one root tab group may be active at any given time.</p>
<p>As will be described in the section on DwtKeyboardMgr, tab groups may be "pushed to" and "popped from" the tab group stack. For example, when a dialog is popped up, its corresponding tab group is pushed onto the tab group stack and becomes the active tab group while that dialog is activated. When the dialog is popped down, its tab group is also popped off the tab group stack bringing the underlying tab group (i.e. the one for the active view) back into play, so that the component that had focus prior to the dialog being activated will once again have focus.</p>
<p>Tab groups are implemented by the DwtTabGroup class. That class provides the API for manipulating tab groups. Here are some of the member methods:</p>
<ul><li>addMember(index) - Adds a member to the tab group at index position, or at end if index is omitted
<li>addMemberBefore(member) - Adds a member to the tab group positioned before another member
<li>addMemberAfter(member) - Adds a member to the tab group positioned after another member
<li>blockDefaultHandling(block) - Blocks the default handler from being invoked for this tab group
<li>contains(member) - Checks to see if an item is a member of this tab group
<li>removeMember(member) - Removes a member
<li>replaceMember(old, new) - Replaces a member with another one
<li>newParent(newParent) - Sets a new parent for this tab group
<li>getFocusMember() - Gets the current focus member
<li>setFocusMember(member) - Sets the current focus member
<li>getNextFocusMember() - Gets the next focus member
<li>getPrevFocusMember() - Gets the previous focus member
<li>resetFocusMember() - Resets the focus member to the first available member
</ul>
<h4>DwtKeyboardMgr</h4><p>
<p>DwtKeyboardMgr is the engine that drives the keyboard management framework. It is responsible for intercepting key events generated by the browser, mapping them to actions (via the registered keymaps), and then dispatching the action to the correct component. In addition, DwtKeyboardMgr is responsible for enforcing the tab order specified by the currently active tab group. Finally, this class also has the machinery that handles multi-key keymap entires by utilizing a timeout mechanism for resolving such sequences.</p>
<p>When dispatching actions, DwtKeyboardMgr will first try and resolve a key sequence with the component that has focus (be it a DWT widget or a native component such as an HTML input element). If the component does not have an action binding for a key sequence (an entry in its key map for the current key sequence), then DwtKeyboardMgr checks to see if a default handler has been pushed on its default handler stack (via the pushDefaultHandler method). If one has been pushed, then DwtKeyboardMgr will query it for the name of the keymap that should be used to resolve the key sequence to an action code. If an action code exists in the key map for the key sequence, then DwtKeyboardMgr will dispatch it to the default handler.</p>
<p>A default handler is analogous to the root tab group. It provides a context for key bindings that are not tied to a specific widget. In a way, the default handler can be thought of as providing a global context. For example, if a button has focus when the character Esc is typed, DwtKeyboardMgr will first give the button a chance to handle the event. If the button does not handle Esc (which is the case), then DwtKeyboardMgr hands the event to the current default handler. So far, there are only two default handlers used within ZCS: an application-level default handler and a dialog-level default handler.</p>
<p>A default handler must implement the following interface:</p>
<ul><li>getKeymapNameToUse() - This method is called by DwtKeyboardMgr to get the name of the key map that should be used for resolving a key sequence. Of course this is application-specific and may change as the user navigates an application. For example, in the case of the ZCS, a different key map may in play for the calendar application as opposed to the email application.
<li>handleKeyAction(action) - Where the action formal parameter is the action constant bound to the key sequence in the key map. This method is where the real work gets done. Its implementation will perform the work necessary to complete the action. It will return true if it handled the action, or false if it did not.
</ul>
<p>As previously mentioned, DwtKeyboardMgr is also responsible for enforcing the component tab ordering specified by the currently active root tab group - i.e. the one that is on top of the tab group stack. The way this works is that upon intercepting the tab key, DwtKeyboardMgr will call the DwtTabGroup's getNextFocusMember() method. This method returns the next focusable component in the tab group hierarchy (be it a DWT widget or a native HTML input field). DwtKeyboardMgr will then call the blur() method on the previously focused component, followed by calling the focus() method on the component returned by getNextFocusMember(). Note that I intentionally paralleled the native HTML input element focus() and blur() methods within DWT so there is a canonical way of managing the focus state of any UI component (native or DWT). The combination of DwtKeyboardMgr and DwtTabGroup handles all corner cases such as skipping over components that are not enabled (i.e. grayed out), as well as dealing with scenarios such as the currently focused component becoming disabled.</p>
<p>The following lists some of the more commonly used methods provided by DwtKeyboardMgr:</p>
<ul><li>enable(enable) - Enables or disables keyboard event handling
<li>isEnabled() - Returns true if keyboard event handling is enabled, else returns false
<li>grabFocus(element) - Causes element to grab focus - where element is a DWT widget or an HTML input element
<li>pushDefaultHandler(hdlr) - Pushes a default handler onto the handler stack
<li>popDefaultHandler()- Pops the default handler off the top of the handler stack
<li>pushTabGroup(tabGroup) - Pushes a tab group onto the tab group stack and makes it the active tab group
<li>popTabGroup() - Pops the tab group that is on top of the tab group stack
<li>registerKeyMap(keyMap) - Registers a key map
<li>setKeyTimeout(timeout) - Sets the maximum time to allow between key presses for a multi-key key sequence
<li>setTabGroup(tabGroup) - Replaces the current tab group with the one provided
</ul>
<h4>DwtControl</h4><p>
<p>DwtControl is the base DWT class from which all widgets ultimately inherit behaviour. DwtControl has a number of responsibilities including hooking into the drag and drop system, basic mouse event handling, and integration with the keyboard shortcut and navigation model.</p>
<p>DwtControl exports public focus() and blur() methods that parallel the native HTML input elements so that there is a canonical set of methods for setting and blurring focus across native and DWT elements. DwtControl also declares four methods that widget authors must implement in order to support keyboard management:</p>
<ul><li>_focus() - This method is called when a control receives focus. Its implementation should provide visual feedback that the control has gained focus (e.g. by drawing a border around the component)
<li>_blur() - This method is called when a control loses focus. Its implementation should provide the visual feedback that the control has lost focus (e.g. by hiding the border around a control)
<li>handleKeyAction(actionCode) - This method is responsible for implementing supported actions. The keyboard framework passes in the actionCode associated with a key sequence in the control's keymap. This method returns true if the control handled the actionCode, else it returns false
</ul>
<h4>Using The Keyboard Framework in an Application</h4><p>
<p>An application programmer wanting to use the keyboard management frameworks typically needs to perform the following steps:</p>
<ol><li>Create a key map class for the application that inherits from DwtKeyMap. Define any application and/or custom widget key maps in this class.
<li>Implement one or more default handlers for the application should they be required. Recall that the default handler is called when a visual component does not have a action code binding for a key sequence. Depending on the complexity of the application, multiple handlers may be pushed and popped as the user interacts with the application.
<li>Create any tab group(s) that may be required. Note that tab groups may be created and manipulated during the application lifecycle.
<li>Instantiate DwtKeyboardMgr.
<li>Register the application's key map with DwtKeyboardMgr via the registerKeyMap() method.
<li>Push the currently applicable default handler via DwtKeyboardMgr's pushDefaultHdlr() method.
<li>Push or set the current tab group via the pushTabGroup() or setTabGroup() method.
</ol>]]>
</content>
</entry>
<entry>
<title>Securing Ajax</title>
<link rel="alternate" type="text/html" href="http://www.zimbra.com/blog/archives/2006/09/securing_ajax.html" />
<modified>2006-09-11T15:22:42Z</modified>
<issued>2006-09-09T18:45:46Z</issued>
<id>tag:www.zimbra.com,2006:/blog//1.117</id>
<created>2006-09-09T18:45:46Z</created>
<summary type="text/plain">To continue the Zimbra blog series on Ajax (recent entries include Ajax innovation is about the server, Ajax optimization techniques (presented at OSCON), OpenAjax update, and Ajax's impact on scaling), we wanted to offer some general thoughts on securing Ajax...</summary>
<author>
<name>Scott</name>
<url>www.zimbra.com</url><email>scott.dietzen@zimbra.com</email></author>
<dc:subject>Scott Dietzen</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.zimbra.com/blog/">
<![CDATA[<p>To continue the Zimbra blog series on Ajax (recent entries include <a href="http://www.zimbra.com/blog/archives/2006/08/ajax_innovation.html">Ajax innovation is about the server</a>, <a href="http://www.zimbra.com/blog/archives/2006/07/oscon_ajax_slid.html">Ajax optimization techniques (presented at OSCON)</a>, <a href="http://www.zimbra.com/blog/archives/2006/05/openajax_update.html">OpenAjax update</a>, and <a href="http://www.zimbra.com/blog/archives/2006/04/ajax_impact_on.html">Ajax's impact on scaling</a>), we wanted to offer some general thoughts on securing Ajax applications gleaned, of course, from our Zimbra experience. </p>]]>
<![CDATA[<p><strong>Ajax security advantages. </strong> Less often discussed than Ajax security <em>concerns</em> are inherent security <em>advantages</em> of Ajax clients:<br />
• Dynamic Ajax client download – Ajax client code is downloaded on demand from the trusted server after a particular user logs-in, automatically ensuring client and server versions are in-sync (for public computers, a shift re-load is better in that it overwrites any Ajax code from that website leftover in the browser cache). <br />
• No persistent client caching – An exposure with traditional web clients is that they cache HTML pages that can include user/application data on the client disk during normal operation. This can be a security vulnerability for access from public kiosks or other shared computers. Ajax applications like the Zimbra client cache no user data on disk. <br />
• Server-side control of intranet and Internet mash-ups – Zimlets and other Ajax mash-ups are precluded from accessing arbitrary services on the Internet (unless they open a new iFrame, which can be determined at server deployment time), and must instead (like Java applets) make all invocations back to the originating server (in our case, the Zimbra server). This means the Ajax server can act as a secure, proxy gateway for accessing intranet applications, and can govern which external web services (if any) are accessible for mash-up within the Ajax client. </p>
<p><strong>Ajax security considerations. </strong> Subject to the additional precautions enumerated below, Ajax applications can be made as highly-secure as the web technologies upon which the Ajax model is based. </p>
<p>The most obvious security issue for Ajax applications is that the associated source code is inherently downloaded to the browser for interpretation. This is a concern for any application logic that contains intellectual property that the author does not want to share with the world: while obviscation and minimization (white space removal, shortening identifier) can certainly render JavaScript much harder to read (and debug), developers should consider Ajax applications to be like HTML in that others will be able to examine the fruits of your labor. The only real alternative is to either (1) limit log-in to the application to trusted users/partners (in this way only licensed/authorized users get to download the Ajax application logic); or else (2) keep closely-held algorithms on the server-side, and simply invoke them via web services from the Ajax client. All this is not an issue for the Zimbra Ajax Client, since it is, after all, open source. </p>
<p>Zimbra provides the following additional guarantees to further secure Zimbra deployments over even public networks, techniques that we beileve are broadly relevant for securing Ajax applications:<br />
• Use SSL/TLS (i.e., HTTPS) – In addition to protecting the privacy/integrity XML/JSON HTTP communications to/from the Ajax client, SSL/TLS encryption limits access to the Ajax source code itself to only those that have legitimate log-ins (as per above), since no-one snooping on the network can see the app. logic. Moreover, SSL/TLS protects the Ajax application (JavaScript, CSS, etc.) from potential security attacks while it is in route to the user's browser. <br />
• No server-side interpretation of JavaScript or other client-submitted code – Zimbra receives vanilla XML requests from the browser client that are validated and then processed by Zimbra server-side Java code. No JavaScript flows from client to server, and there is no server-side interpretation of any application data (e.g., message bodies). In fact, there is no JavaScript execution on the server period. This ensures that there is no way for even a hostile Ajax client with an authentication credentials to inject malicious code for execution on the server-side. <br />
• Limited or no client-side interpretation of JavaScript within user data – The Zimbra Ajax client is, of course, an Email application that runs within the confines of the web browser. There is an additional risk, then, to displaying the contents of rich HTML messages that themselves contain JavaScript, in that JavaScript within the message might somehow be able to make malicious calls to the Zimbra server (it is generally precluded from making invocations to other sites). Zimbra blocks any “risky” HTML, first on the server and then again (for extra protection) on the client. When a rich HTML message contains any suspect JavaScript, simply better to err on the side of caution. For most Ajax applications, simply maintaining a strict separation of code from data (and never interpretting JavaScript that is included within user data) protects against such attacks.<br />
• Benign URLs – All Zimbra’s GET-based REST and URL-based APIs are read-only and do not modify data. This ensures that a user (with pre-validated security credentials) cannot be fooled into clicking on a malicious link (that someone sends he or she in an email or posts on his/her external website) that would have harmful side-effects on that user's data. Again, this is broadly relevant for Ajax applications that potentially display clickable URLs in application data. <br />
• Mash-ups/Zimlet validation – Zimbra's mash-up architecture does provide the opportunity to introduce server-side Java code (most Zimlets run only on the client side), but the introduction of Zimlets requires server administration privileges. Zimbra recommends only deploying Zimlets that have been certified by Zimbra or else which have been vetted by your security architects internally. The key is to ensure that only trustworthy mash-ups can be deployed with your Ajax application, mash-ups that do not expose additional attack points for malicious users. </p>
<p>The end result is that while an attacker with appropriate security credentials (such as a user's password) could certainly damage that user's server-side data, there is no way for them to compromise other user's data or the server in general. (And, of course, that user could have any damged mailbox state restored to the point before the attack by a Zimbra administrator.) </p>
<p>Stronger network security can be afforded by additional technologies (such as VPNs, Smartcards, etc.), but that's our recipe in general for leveraging the benefits of Ajax without giving up the security your customers, partners, and business depend on. More detail on the Zimbra-specific approach can be found in the newly updated Zimbra Architecture Overivew (linked within our <a href="http://www.zimbra.com/community/documentation.html">Community</a> and <a href="http://www.zimbra.com/products/documentation.html">Product</a> Documentation). </p>
<p>As always, thanks for listening (particularly to my verbose posts).</p>]]>
</content>
</entry>
<entry>
<title>Some thoughts on Mobility and Web 2.0</title>
<link rel="alternate" type="text/html" href="http://www.zimbra.com/blog/archives/2006/08/some_thoughts_o.html" />
<modified>2006-08-29T22:45:39Z</modified>
<issued>2006-08-29T19:50:57Z</issued>
<id>tag:www.zimbra.com,2006:/blog//1.116</id>
<created>2006-08-29T19:50:57Z</created>
<summary type="text/plain">I had the pleasure of joining Motorola, SugarCRM, and Funambol on a panel at LinuxWorld regarding the future of mobility. The depressing bit was that we panelists admitted that we could have made almost identical points three years ago: (1)...</summary>
<author>
<name>Scott</name>
<url>www.zimbra.com</url><email>scott.dietzen@zimbra.com</email></author>
<dc:subject>Scott Dietzen</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.zimbra.com/blog/">
<![CDATA[<p>I had the pleasure of joining Motorola, SugarCRM, and <a href="http://www.funambol.com/blog/capo/">Funambol</a> on a panel at LinuxWorld regarding the future of mobility. The depressing bit was that we panelists admitted that we could have made almost identical points three years ago: (1) the Web (1.0 more than 2.0) is coming soon to mobile devices, but the experience isn't entirely there yet; and (2) the challenge to extending applications for mobile devices continues to be exacerbated by innovation in device profiles (more on that below). However, the good news is (1) that a "smart phone" profile is converging---a profile that is likely the right target for non-consumer mobile applications; and (2) that "over the air" sync to the native Personal Information Management (PIM) software on mobile devices has gotten dramatically easier/cheaper, and provides exciting new opportunities for mobile application extension.</p>]]>
<![CDATA[<p>As an old Web hand, I'm no doubt biased, but I think the Web is a generally the right model for business application extension to mobile devices, simply because the Web does not require any <em>a priori</em> installation of client-side software. After all, if the Web is already the dominant model for B2C and B2B applications on PCs, then it is arguably an even better architectural fit for lower horsepower (CPU, memory) mobile devices. <a href="http://www.zimbra.com/blog/archives/2006/06/defining_web_20.html">Web 2.0/Ajax clients</a> seem like a natural fit too---Ajax is a zero client install and its client/server interaction model is actually a better fit for higher latency networks like those of the wireless carriers. The challenge is that rich Ajax applications (ones with mouse-overs, drag 'n drop, etc.) consume enough laptop CPU that they are still out of the computational reach of most smart phones/PDAs, let alone basic telephones. </p>
<p>The alternative application model to the Web (I include WML/HTTP under the Web architecture) is of course more traditional fat client applications---such as those programmed for J2ME, Windows Mobile, Symbian, Palm, or mobile Linux. Fat client app's are ideal for PIM (email, SMS, calendaring, contacts, tasks), games, and other code that handset manufactures or the carriers are willing to preinstall, but a tougher sell for non-expert business and consumer end-user installation. </p>
<p>However, there is yet another approach that we proposed. It is particularly relevant for applications that can be surfaced via PIM software, such as your customer contacts from your CRM system, your travel itinerary from your procurement application, an urgent notification (via SMS), or even an email request to visit a particular URL. Such items can be submitted to a server like the Zimbra Collaboration Suite (ZCS), and then delivered to the mobile device via "over the air" sync. <a href="http://www.zimbra.com/products/zimbra_mobile.html">Zimbra Mobile</a>, for example, can sync contacts, appointments, and messages to Nokia, Motorola, Samsung, Treo, and Blackberry smart phones, and both intranet and Internet applications can securely export to Zimbra over open/standard protocols. Putting the two together allows Web-enabled applications to deliver PIM-oriented data all the way to the mobile device. </p>
<p>So for applications that can be naturally surfaced via the native mobile PIM, there are now easier/cheaper options for mobile extension. For those business applications that have no such easy fit with PIM, I'm afraid you must still weigh the classic Web versus fat client architectural trade-off. In either case, I think that choosing the smart phone/PDA as the target profile makes more sense because of their relative consistency (screen size, scroll-to-click, J2ME vs. Windows Mobile platform), at least when compared with targeting the continuing stream of ever more compact, ever more personalized mobile phones. </p>]]>
</content>
</entry>
<entry>
<title>Open source and IP ownership</title>
<link rel="alternate" type="text/html" href="http://www.zimbra.com/blog/archives/2006/08/open_source_and_2.html" />
<modified>2006-08-16T15:29:47Z</modified>
<issued>2006-08-15T16:58:03Z</issued>
<id>tag:www.zimbra.com,2006:/blog//1.114</id>
<created>2006-08-15T16:58:03Z</created>
<summary type="text/plain">I got myself in a small bit of trouble recently talking about open source IP ownership when I should have been talking about the cool new collaboration and mobile features in the 4.0 release of the Zimbra Collaboration Suite. (Nothing...</summary>
<author>
<name>Scott</name>
<url>www.zimbra.com</url><email>scott.dietzen@zimbra.com</email></author>
<dc:subject>Scott Dietzen</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.zimbra.com/blog/">
<![CDATA[<p>I got myself in a small bit of trouble recently talking about open source IP ownership when I should have been talking about the cool new collaboration and mobile features in the <a href="http://www.zimbra.com/products/countdown.html">4.0 release of the Zimbra Collaboration Suite</a>. (Nothing like a developer coming by your cube and saying "You said what?") While I didn't do such a good job at the time, the underlying point is an important one, so I'm going to give it another shot ...</p>]]>
<![CDATA[<p>It is increasingly common practice in open source communities to insist upon a single organization owning the IP rights for a particular project. For example, the Apache and Free Software Foundations do this as well as private firms like Zimbra. The primary goal of IP ownership is to better guarantee "squeaky clean" IP (that is, that all contributed code is unencumbered by any hidden IP rights) for the benefit of the community as well as for customers. This also ensures that open source licensing upgrade decisions can be made for future releases of the open source license itself---without an organizational owner, projects can effectively get locked to a particular version of a license because there is no easy way to get all of the IP owners together to make a decision about upgrading. </p>
<p>The grief came in particular from my drawing parallels between Zimbra---a for-profit company---with more altruistic non-profit organizations like Apache and FSF regarding IP ownership. No doubt there are clear differences between for-profits and non-profits that the prospective community members have every right to consider, but I think in terms of IP ownership there is more in common than different. </p>
<p>For a potential community member, the most important thing is the long-term guarantee of their freedoms: (1) Open source rights (granted under the open source software license) to use the product in perpetuity for free, to produce and redistribute any derivative works thereof for free, and so on; and (2) rights to do whatever they may see fit in perpetuity for any of their own contributions that they made in good faith to the project. (The good contribution agreements grant contributors back all of their rights <strong>except </strong> those that could interfere with the community, such as the right to withdraw their contribution in the future, the right to charge the community patent royalties down the road, etc. For example, Zimbra's Contributor Agreement can be found <a href="http://www.zimbra.com/community/contribute.html">here</a>. For another take, check out <a href="http://dojotoolkit.org/foundation/">Dojo</a>, one of our <a href="http://www.zimbra.com/partners/open_ajax_partners.html">Open Ajax Alliance</a> partners. ) This practice seems to me to strike the right balance between preserving individual freedoms without sacrificing the freedoms of the community as a whole. </p>
<p>Both non-profit and for-profit open source organizations equally guarantee these freedoms to their communities, the difference being that the for-profit ones (like Zimbra) also strive to sell <strong>optional </strong>value-added services on the side, much of the proceeds of which then funds the further development of the open source software. </p>]]>
</content>
</entry>
</feed>
|