<?xml version="1.0" encoding="UTF-8"?>
<!--Generated by Squarespace Site Server v5.0.0 (http://www.squarespace.com/) on Wed, 20 Aug 2008 15:31:37 GMT--><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>Journal</title><link>http://techblog.helpstream.biz/journal/</link><description></description><copyright></copyright><language>en-US</language><generator>Squarespace Site Server v5.0.0 (http://www.squarespace.com/)</generator><item><title>Helpstream sends updates to Twitter (and anything else)</title><category>Business Rules Engine</category><dc:creator>Dan Hardy</dc:creator><pubDate>Wed, 02 Jul 2008 01:58:49 +0000</pubDate><link>http://techblog.helpstream.biz/journal/2008/7/2/helpstream-sends-updates-to-twitter-and-anything-else.html</link><guid isPermaLink="false">162853:1533291:1960782</guid><description><![CDATA[<p>I just added a new business rules action which lets Helpstream push real-time updates to external systems.&nbsp; One example of this is to push real-time updates from Helpstream to Twitter - for example, whenever a new post is made in the Community, or a new Case is open or resolved.&nbsp; Of course, Helpstream has its own &quot;subscribe&quot; features, but if you want people to be able to &quot;follow&quot; your Helpstream workspace on Twitter, with whatever events please you, this is now possible!<br /></p><p>It's simple really - for the new 'Http or Https request' action, enter expressions for the URL, method, content-type, body, and optionally user name and password (for HTTP Basic Auth).&nbsp; To integrate with Twitter, for example, posting an update with a case summary, you would enter</p><p>url - 'https://twitter.com/statuses/update.xml?status=New+case:++' + urlEncode($summary)</p><p>method - 'POST'</p><p>user - 'myusername@company.com'</p><p>password - 'twitterpassword'</p><p>This&nbsp; will post a &quot;New case:&nbsp; [case summary]' message to Twitter, as real-time as possible.&nbsp; If real-time is not possible due to current load, the update should happen within a minute or so.</p><p>Twitter has a simple REST api, with HTTP basic authentication, so it can all happen in one request.&nbsp; For other systems, at worst you'd have to host a web page (PHP, Java servlet, etc.), and have that act as a proxy that converted the request into whatever was needed.</p><p>&nbsp;</p><p>&nbsp;</p>]]></description><wfw:commentRss>http://techblog.helpstream.biz/journal/rss-comments-entry-1960782.xml</wfw:commentRss></item><item><title>What I like about Office 2007</title><category>Programming Techniques</category><dc:creator>Dan Hardy</dc:creator><pubDate>Fri, 20 Jun 2008 16:34:50 +0000</pubDate><link>http://techblog.helpstream.biz/journal/2008/6/20/what-i-like-about-office-2007.html</link><guid isPermaLink="false">162853:1533291:1934867</guid><description><![CDATA[<p>I've been using Office 2007 for a while.&nbsp; Honestly, my initial reaction was:<br /><br />1) things seemed harder to find - for example, how to you get to the Visual Basic macro editor in Excel 2007?&nbsp; <br />2) why would you use the new formats - docx, xlsx, and pptx?&nbsp; I figured for years you would have to save them back to 97-2003 format if you wanted anybody else to read them.<br /><br />I finally found out why #2 is an immediate benefit to me.&nbsp; Not to me as an end user, but as a software vendor. The sooner the 97-2003 format is gone, the better.&nbsp; (Yes, I'm sure the answer to that is &quot;never&quot;, but one can hope).<br /></p><p><br />Helpstream fully indexes binary documents that are in the knowledge base, are attached to cases or case history, or are attached to community discussion.&nbsp; Given our 100% Java/Linux architecture, the proprietary Office 97-2003 format documents present an annoying technical challenge.&nbsp; In past products, I've done as <a href="http://www.joelonsoftware.com/" target="_blank">Joel Spolsky</a> suggests <a href="http://www.joelonsoftware.com/items/2008/02/19.html" target="_blank">here</a> (see &quot;Let Office do the heavy work for you&quot;).&nbsp; I've written C++/ATL code to automate the Office applications, extracting the text to feed into Lucene.&nbsp; This requires either running your app on Windows and using JNI from your Java app, or throwing a Windows box in the data center and making an RPC/Web Service network request.&nbsp; I went the JNI route in the past, and it worked well.<br /><br />For Helpstream however, I wanted to keep a 100% Linux architecture, and still generate and index Office documents.&nbsp; Generation is pretty easy - for Word you can use open source packages to generate RTF.&nbsp; Extracting the text form the proprietary format is still a challenge.&nbsp; For Office 97-2003 docs, after some Google searching, I found an obscure 100% pure Java library from a commercial vendor named Davisor which allowed me to convert the documents to XML, and therefore extract the text. <br /><br />With Office 2007 files, there is a new opportunity.&nbsp; Indexing those documents in Java becomes trivial!&nbsp; The .docx, .pptx, .and xlsx files are zip files that contain a bunch of files, among them some xml files.&nbsp; The following code will give you good input to Lucene for any Office 2007 document from pure Java:<br /><br /><br />public void indexOffice2007Document(InputStream inputStream, Writer writer) throws Exception {<br />&nbsp;&nbsp; &nbsp;ZipInputStream zis = new ZipInputStream(inputStream);<br />&nbsp;&nbsp; &nbsp;ZipEntry zi = null;<br />&nbsp;&nbsp; &nbsp;while ((zi = zis.getNextEntry()) != null) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String file = zi.getName();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (file != null &amp;&amp; file.toLowerCase().endsWith(&quot;.xml&quot;)) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File tempFile = File.createTempFile(&quot;tmp&quot;, &quot;.xml&quot;);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte [] chunk = new byte[8096];<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int bytesRead = 0;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream fs = new FileOutputStream(tempFile);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((bytesRead = zis.read(chunk)) != -1) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fs.write(chunk, 0, bytesRead);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fs.close();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // index it<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(tempFile);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;NodeIterator iter = XPathAPI.selectNodeIterator(doc.getDocumentElement(), &quot;//text()&quot;);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Node node = null;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;while ((node = iter.nextNode()) != null) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String val = ((Text)node).getTextContent();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (val != null &amp;&amp; val.length() &gt; 0) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;writer.write(val);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;writer.write(&quot; &quot;);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable t) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// ignore XML parse errors -- log if you want to<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;tempFile.delete();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br />}<br /><br /><br />Now, things are easy!&nbsp; No 3rd party licensing issues or support/upgrades to deal with, and no need to deploy a Windows box at all.&nbsp; And no need to dig up your C++/ATL skills that you had hoped you were done with for good when you last used them years ago.&nbsp; And I'm certain it scales better than automating Office COM object (which are probably running out-of-process).</p><p>&nbsp;</p>]]></description><wfw:commentRss>http://techblog.helpstream.biz/journal/rss-comments-entry-1934867.xml</wfw:commentRss></item><item><title>Cloud Computing with Persistent Storage</title><dc:creator>Dan Hardy</dc:creator><pubDate>Tue, 15 Apr 2008 17:52:34 +0000</pubDate><link>http://techblog.helpstream.biz/journal/2008/4/15/cloud-computing-with-persistent-storage.html</link><guid isPermaLink="false">162853:1533291:1763780</guid><description><![CDATA[<p>&nbsp;<br />This post from Amazon Web Services caught my attention:&nbsp;</p><p>http://aws.typepad.com/aws/2008/04/block-to-the-fu.html</p><p>With the ability to dynamically create S3 storage and mount it as a file system on your EC2 instances, virtualization and pay-for-usage is likely to become a great option for hosting of SaaS applications.<br /> </p><p>Looking at the pricing, it seems like a couple of application servers, a database server, and a ton of persistent storage can be had for right around $1000/month.&nbsp; That really changes the economics of deploying an app, particularly for early stage companies.&nbsp; Even if you disregard the capital investment for hardware that is avoided (which could be tens of thousands), that's a very competitive monthly operations fee.<br /></p><p>It will be really interesting to try this out when it is available later this year.<br /></p>]]></description><wfw:commentRss>http://techblog.helpstream.biz/journal/rss-comments-entry-1763780.xml</wfw:commentRss></item><item><title>Advanced Features - Business Rules (Part 2)</title><category>Business Rules Engine</category><dc:creator>Dan Hardy</dc:creator><pubDate>Mon, 26 Nov 2007 19:01:46 +0000</pubDate><link>http://techblog.helpstream.biz/journal/2007/11/26/advanced-features-business-rules-part-2.html</link><guid isPermaLink="false">162853:1533291:1391523</guid><description><![CDATA[<p>Last time I introduced one of our more advanced features - the Business Rules Engine - and gave some examples of its uses.&nbsp;&nbsp; Here I'll discuss the design and implementation of the engine itself.<br />   </p>     <p>The core technical bit of the business rules engine is the expression evaluator.&nbsp; When defining business rules, you need to be able to describe what <em>condition</em> triggers the rule, <em>when</em> it should execute, and <em>what</em> it should do.&nbsp; Each of these is defined by providing an expression.</p>     <p>The expression syntax is really a programming language of sorts.&nbsp; In fact, when designing this part of the product, that's exactly how I approached it.&nbsp; I needed to invent a grammar, or language, that supported many of the standard constructs in any other language, but also had special syntax for working with Helpstreams' data (business objects and their properties, useful functions, etc.).</p>     <p>I started by coming up with some use cases I knew we would need to support, and then writing what I thought each expression should look like.&nbsp; This let me take a &quot;top down&quot; approach, and choose whatever syntax I thought was most capable and usable.&nbsp; For example, to test whether a status has changed to &quot;Resolved&quot; in an update, I though you would write something like this:</p>     <p>$old.status != $status and $status = &quot;Resolved&quot;</p>     <p>The first part tests whether the status property is different from what is in the database (the &quot;old&quot; value).&nbsp; The second part tests whether the new value of the status property is Resolved.&nbsp; This seemed pretty straightforward.&nbsp; I tried to make the syntax pretty easy for developers familar with almost any language, and was targeting &quot;someone who can write an Excel spreadsheet formula&quot; as about the expected skillset of the audience. <br />   </p>     <p>Of course, you don't want to reinvent the wheel, so things like operator precedence (and/or, grouping with parentheses, +- vs */) should work like other languages such as Java.</p>     <p>To define the grammar and write the evaluator, I turned to the <a href="http://www.antlr.org/" target="_new">ANTLR</a> open source package.&nbsp; </p>     <p>ANTLR is an excellent example of how the best-of-breed open source packages provide a huge benefit to software developers today.&nbsp; Take a look at the number of grammars that have been defined using it!</p>     <p>The entire Helpstream grammar is defined in a relatively short file (~300 lines), and ANTLR generates the lexer and parser classes.&nbsp; These classes are over 18,000 lines of Java code!&nbsp; I sure wouldn't want to write that by hand.&nbsp; During evaluation, the parser calls into several evaluator classes I wrote to handle things like object property references, functions, etc.</p>     <p>In the end, you can write extremely sophisticated expressions, and it isn't any harder than a spreadsheet formula.&nbsp; For example, to trigger a rule if it is between 9 and 5, California time, AND the priority is High OR the summary contains the word &quot;Emergency&quot;, AND the Account associated with the requester has a valid support contract (a custom field we'll assume is defined on Account):</p>     <p>(hour(date()+tzOffset(date(), &quot;PST&quot;)) &gt;= 9 AND&nbsp; hour(date()+tzOffset(date(), &quot;PST&quot;)) &lt; 17) AND</p>     <p>($priority = 'High' OR fullTextSearch($summary, &quot;Emergency~&quot;)) AND</p>     <p>$requester.accountCustom.supportValid = 'Yes'</p>     <p>This uses a few functions - hour, date, tzOffset, and fullTextSearch (which uses the excellent <a href="http://lucene.apache.org/" target="_new">Lucene</a> open source package) - and demonstrates referencing object properties, including related objects and custom fields.<br />   </p>     <p>To take an action such as assigning this ticket automatically, you might add <em>AND $assignee = null</em> to the condition, and set field 'assignee' to the expression:</p>     <p>query(&quot;Person&quot;, &quot;record.emailAddress = 'bob.backline@mycompany.com'&quot;)</p>     <p>The &quot;query&quot; function in this case will find the appropriate Person to assign to the 'assignee' field based on their email address.</p>     <p>By combining all of the customization features available in Helpstream (custom fields, custom notifications, business rules, reporting, branding), you can really tailor the solution to fit your specific needs - easily, without complex programming, and without installing any software.</p>     <p>~Dan</p>     <p>&nbsp;</p>]]></description><wfw:commentRss>http://techblog.helpstream.biz/journal/rss-comments-entry-1391523.xml</wfw:commentRss></item><item><title>Advanced Features - Business Rules (Part 1)</title><category>Business Rules Engine</category><dc:creator>Dan Hardy</dc:creator><pubDate>Fri, 09 Nov 2007 19:19:27 +0000</pubDate><link>http://techblog.helpstream.biz/journal/2007/11/9/advanced-features-business-rules-part-1.html</link><guid isPermaLink="false">162853:1533291:1361117</guid><description><![CDATA[<p>We try hard to make Helpstream as easy to use as possible, so you can get up and running in minutes, without any training at all.</p><p>Under the hood, however, there are rich capabilities that are probably not obvious when you first sign up.&nbsp; In this entry, I'll give a brief introduction to our Business Rules engine - one of of our most powerful, and most technical, components.&nbsp; In future entries, I'll drill down into more technical details.<br /></p><p>The Business Rules engine is designed to configure your Helpstream support desk according to your own workflow and rules.&nbsp; Do you want tickets automatically assigned (based on problem type, priority, requester's account support level, geography, day of week, etc.)?&nbsp; Business rules does that.&nbsp; Do you want to be notified if a particular type of case is open for more than X hours?&nbsp; Business rules does that too.&nbsp; </p><p>Business rules are also completely integrated with the Custom Field engine, so your rules can be based on your custom attributes on Account, Case, or Person.<br /></p><p>Each Business Rule boils down to three things:</p><p>1) Condition.&nbsp; What causes this rule to run?&nbsp; The condition is evaluated on every create/update transaction for a business object type.</p><p>2) Date.&nbsp; Do the actions run immediately and transactionally, or are they scheduled for a future date?</p><p>3) Actions.&nbsp; What should happen?&nbsp; This can consist of updates to fields (such as assignment, automatic prioritization), email notifications (using customizable email templates), and data validation (presenting error messages and preventing a transaction).</p><p>I'll get into more technical details in the next entry, but for now here's an example.&nbsp; This action assigns all networking tickets to Norm Network if they are created without an assignee.</p><p>Condition: $old.id = null and $assignee = null and $problemType = 'Networking'</p><p>Date: empty (now)</p><p>Action: Assignment.&nbsp; Field: 'assignee'.&nbsp; Value: query('Person', &quot;record.emailAddress = 'norm.network@mycompany.com'&quot;)</p><p>Here's another example.&nbsp; Let's automatically set the priority to High if the summary or description contains the word &quot;urgent&quot;, &quot;emergency&quot;, or &quot;important&quot;, or something similar such as &quot;urgently&quot;.<br /></p><p>Condition: $old.id = null and fullTextSearch($summary + ' ' + $description, &quot;urgent~ important~ emergency~&quot;)</p><p>Date: empty (now)</p><p>Action: Assignment.&nbsp; Field: 'priority'.&nbsp; Value : 'High'</p><p>More on what each field and expression means next time.</p><p>Dan&nbsp;</p><p>&nbsp;</p>]]></description><wfw:commentRss>http://techblog.helpstream.biz/journal/rss-comments-entry-1361117.xml</wfw:commentRss></item><item><title>Helpstream on-demand upgraded</title><dc:creator>Dan Hardy</dc:creator><pubDate>Mon, 22 Oct 2007 19:05:30 +0000</pubDate><link>http://techblog.helpstream.biz/journal/2007/10/22/helpstream-on-demand-upgraded.html</link><guid isPermaLink="false">162853:1533291:1326727</guid><description><![CDATA[<p>As scheduled, Helpstream was upgraded early Saturday morning.&nbsp; A number of exciting new features are available&nbsp;- for more details go <a href="https://www.pathworksondemand.com/www.pathworkssoftware.com/3.2/whats_new.html">here</a>!]]></description><wfw:commentRss>http://techblog.helpstream.biz/journal/rss-comments-entry-1326727.xml</wfw:commentRss></item><item><title>A busy couple of weeks!</title><dc:creator>Dan Hardy</dc:creator><pubDate>Fri, 05 Oct 2007 03:00:27 +0000</pubDate><link>http://techblog.helpstream.biz/journal/2007/10/5/a-busy-couple-of-weeks.html</link><guid isPermaLink="false">162853:1533291:1295036</guid><description><![CDATA[<p>The last couple of weeks have been quite busy and exciting.</p><p>We have a new release of Helpstream coming out in mid-October, with a few great features:</p><ul><li>Improved and simplified self-service portal user interface.&nbsp; I'll post a screenshot of this soon - it looks beautiful.</li><li>Branding support.&nbsp; Customize the color theme and upload your own logo!</li><li>Accounts - link your customer contacts together into accounts, with custom field support for tracking account attributes such as support level.</li><li>More collaboration features, including threaded discussions on knowledge base articles!</li><li>A few more goodies...</li></ul><p>While working on that exciting release, Helpstream also successfully migrated a significant customer off of another SaaS vendor's support solution in only 2 weeks.&nbsp; Although you can get up and running in seconds with Helpstream, there is of course some work involved in migrating 4 GB of historical data, including agents, portal users, tickets, and ticket history, with dozens of custom fields and custom routing and escalation rules.&nbsp; We were able to get this customer migrated and live with Helpstream in under 2 weeks, with all of their historical data imported into their workspace.&nbsp; Exciting stuff!</p><p>Dan</p><p>&nbsp;</p>]]></description><wfw:commentRss>http://techblog.helpstream.biz/journal/rss-comments-entry-1295036.xml</wfw:commentRss></item><item><title>Welcome to the Tech Zone</title><dc:creator>Dan Hardy</dc:creator><pubDate>Wed, 12 Sep 2007 04:59:38 +0000</pubDate><link>http://techblog.helpstream.biz/journal/2007/9/12/welcome-to-the-tech-zone.html</link><guid isPermaLink="false">162853:1533291:1253695</guid><description><![CDATA[<font size="2"><p>&nbsp;<span class="full-image-float-right"><font><img alt="Dan%20Hard.jpg" src="http://techblog.helpstream.biz/storage/Dan%20Hard.jpg?__SQUARESPACE_CACHEVERSION=1189809108616" /></font></span></p><p>Welcome to the Helpstream Tech Zone!</p><p>I'll start this off with my first post: <strong>Why Helpstream</strong><strong>?</strong></p><p>Have you ever noticed that innovation in business applications for the department and enterprise have not kept pace with innovation on the consumer web? Not just in terms of technology, but innovation in terms of <strong>ease-of-use</strong>, <strong>time-to-value</strong>, and <strong>total cost of ownership</strong>.</p><p>By consumer web innovation, I would take as an example GMail or Yahoo Mail. Here you get an enormously valuable product that takes seconds to &quot;install&quot;, comes with unlimited storage, a rich full text search engine, high performance, and high availability. For free. This is the kind of time-to-value and ease-of-use you have come to expect as a modern web consumer.</p><p>Now take &quot;support desk&quot; applications, whether internal IT help desk or customer support. Here are solutions that in today's world would include case management, knowledge base and self service, rich searching and reporting functionality, custom fields, configurable business rules, complete e-mail integration, branding, etc. Typical solutions here (other than those with basic subsistence functionality) can be very expensive, take hours or days to install (on hardware you must purchase), require ongoing system support and maintenance, and may take months to configure. Why?!? If the consumer web can deliver enterprise-class mail, maps with satellite imagery, and estimates of real estate values, for free - why can't the business software community deliver similar results? A basic offering should be highly functional, free, take 10 seconds to sign up for, and have high performance and availability. </p><p>Enter Helpstream. With only an e-mail address and a browser, you are up and running in seconds - with rich functionality, high availability, fast performance, and unsurpassed ease-of-use. Add e-mail integration and custom fields within hours to tailor your solution.</p><p>What makes this possible? A number of converging trends.</p><p>First, of course, extremely rich web applications became possible several years ago with the wave of AJAX and DHTML adoption. Helpstream leverages these techniques to deliver best-in-class ease of use, requiring nothing more than a standard web browser such as Internet Explorer, Firefox, or Safari.</p><p>Second, the cost of developing and delivering rich, scalable, high performance applications has dropped dramatically in recent years. Best-of-breed Open Source software packages for very specific needs have come into their own. Whether your application requires full text search, PDF generation, web user interface components, web and application server software, or relational databases - Open Source may be excellent for these needs and more. The art lies in effective and efficient integration.</p><p>Third, lessons learned from earlier generations of web software give us shoulders to stand on when optimizing for the modern web. Reducing &quot;chatter&quot; and degradation with high latency, optimizing and compressing data over the network, aggressive use of browser caching - these are techniques that dramatically improve performance and scalability, and therefore cost of delivery as well.</p><p>Scalability, performance, and rich functionality can all be delivered much more effectively now than ever before. Above all, the goal is to deliver maximum time-to-value and ease-of-use to users of business software. </p><p><strong>Up and running in seconds?</strong> Check. </p><p><strong>Easy to use, no training required?</strong> Check. </p><p><strong>High performance?</strong> Check. </p><p><strong>Worldwide, high availability?</strong> Check. </p><p><strong>Full e-mail integration?</strong> Check. </p><p><strong>Customizable fields and business rules?</strong> Check. </p><p><strong>International support?</strong> Check.</p><p>I hope we meet these goals for you. I would love to hear from you.</p><p>Check back here for more comments and insight into Helpstream - and thoughts on our always changing industry.</p><p>- Dan</p><p>&nbsp;</p></font>]]></description><wfw:commentRss>http://techblog.helpstream.biz/journal/rss-comments-entry-1253695.xml</wfw:commentRss></item></channel></rss>