MindTouch TCS Release: May 10, 2012
This week’s new release is chock full of bug fixes, and improvements to our already outstanding DekiScript language. Not to mention, we also have an optional new feature allowing you to create custom dropdown menus for tags within IDF guides! Keep reading for further details, and we’ll see you again this week. Happy documenting!
Bug Fixes
- Addressed a styling issue when expanding topics within User Guides.
- Addressed an uncommon issue affecting custom PDF styles.
- Addressed an issue to ensure the Active Directory group ”Domain Users” can be created within MindTouch TCS.
- Addressed an issue when utilizing external authentication to allow rights inheritance by nested groups.
- Addressed an issue to allow users to update options within “My Preferences” when a password is not set for their user.
- Corrected an issue to ensure images are successfully attached to pages when using drag-and-drop within Safari 5.1.
- Addressed verbiage for dialog buttons to ensure consistency across all applications.
- Corrected an issue to ensures images resolve within PDFs when connecting over SSL.
- Corrected an issue within the “Move” / “Copy” dialog box to allow a list of users to be shown by clicking the users icon.
- Addressed an issue to ensure Chinese characters are fully rendered within a generated PDF.
- Updated user feedback when saving “Basic Configuration” settings within the “System Settings” section of the Control Panel.
Performance Enhancement
- The “Overview” sections of our IDF templates are now pre-computed for faster rendering times!
- Also addressed an issue to allow an import to continue processing if a single page should fail to import.
New Feature
Custom Tag Dropdown
We’re extremely excited to announce that MindTouch TCS users now have the ability to add custom dropdowns for tags within their skin. In the image below, you can see an example of a custom a tag dropdown under the “Test type” section:

Here, these tags work just like any other tag in MindTouch which can be selected by choosing from the dropdown menu. With this new feature, MindTouch TCS users can now define a set of custom tags which can be surfaced globally within our Intelligent Documentation Framework (IDF).
For further details on how to enable this exciting new feature for your site, please contact our Sales team at sales@mindtouch.com today!
DekiScript
- User.displayname will return the Display Name of the user. If no Display Name is set, this will then simply return the user name.
- DekiScript syntax errors are now handled like run-time errors, providing the user with a location of a syntax error. This is extremely helpful to those users who may utilize DekiScript references within several layers of templates.
MindTouch TCS Release: May 3, 2012

As we enter the first week of May, we’ve been hard at work on some truly awesome new features that we can’t wait to share with you, as well as some bug fixes and other feature enhancements!
New Features
Print Book
Within MindTouch TCS, you can choose to save a single MindTouch TCS page as a PDF for offline usage. Today, we’re thrilled to announce the expansion of this functionality in Print Book. With Print Book, you can now select multiple pages throughout your site and add them to a collection of pages you would like to save as a larger PDF.
To start using this new functionality, simply navigate to the “More“–>”Save as PDF” option:
Within the existing dialog box you’ll now be presented with a new option–”Click here to create a book containing this page“:
This adds your current page selection to a Print Book. From there you’ll be presented with our Book Editor which lets you expand your Print Book by adding pages from other sections of the hierarchy:
Need to include a table of contents for this Print Book? No problem–we’ve got you covered. Simply choose the “Include table of contents” checkbox.
In addition, the Book Editor provides you with a URL to share with other users for both the current compiled Print Book as well as the Book Editor itself.
What if you need to make additional changes to your current Print Book? Simply expand the hierarchy as needed, and choose “Add Page“. From there, you’ll see more pages added to your Print Book:
If you should need to remove a page at any time, simply click the “X” next to the undesired page to remove.
Finally, you can click “View Book” to review your full Print Book in PDF format.
With Print Book, users now have a much more versatile experience for collating and organizing MindTouch pages for offline sharing with other users!
Single Sign On (SSO) Login Page Redirect
Our second new feature expands upon one of the best features of MindTouch TCS–the ability to integrate with an external authentication provider and configure Single Sign On (SSO) functionality. Using an external authentication provider, SSO allows organizations to seamlessly and automatically log users into various sites including MindTouch TCS.
Previously within an SSO integrated MindTouch TCS site, clicking the “Sign In/Create an Account” link would take the user to the default MindTouch TCS login screen. With this week’s release, customers can now request to have this link redirect to an external authentication provider’s login source. This provides a more fluid experience for ensuring new or existing users are directed to the appropriate login source for those customers who leverage SSO within MindTouch TCS.
If you’re currently integrating MindTouch TCS with SSO and would like your site customized to utilize this new redirect functionality please contact MindTouch Support today!
Bug Fixes
- Addressed a JavaScript warning for IDF pages shown in some browsers
- Corrected API call for POST:pages/{pageid}/revert to ensure a 400 error is returned if user tries to revert to a page revision which does not exist.
Feature Enhancements
- Improved wiki.tree() call to include class types of “first” and “last” for the first and last elements of the returned ordered list.
MindTouch TCS Release: April 26, 2012
This week, we were busy doing some Spring cleaning to enhance our advanced user editing experience. Specifically, we corrected some formatting issues surrounding pre-blocks and DekiScript. Also along the way we were able to roll out a new feature which allows admin users to further customize their MindTouch TCS experience by setting the reply-to email address for page notifications. See below for more details on this new feature for our last release for April and we’ll see you again in May!
Bug Fixes
- Addressed an issue to ensure comments are displayed within the “Recent Comments” section of user pages.
- Addressed a formatting issue within pre-blocks affecting links to pages.
- Addressed a formatting issue within pre-blocks that caused nested DekiScript expressions to be incorrectly expanded when edited.
- Addressed an issue where copying pages imported from an .mtarc file may cause image references to break on the newly copied page.
New Feature
When users subscribe to pages via our page notifications functionality (shown below) they will receive email updates whenever the page is updated by other users. If a user then wishes to send the site administrator a reply regarding the notification, the email address which is targeted for reply is referred to as the “reply-to” email address.

We now have a great new feature which allows admin users to customize the “reply-to” email address for page notification emails. Customizing the email address to which users can reply will ensure your site administrators receive appropriate feedback regarding changes to pages.
Keep in mind that depending on your use case you may want to set the reply-to email address to an email distribution group for review by a group of content moderators.
This new setting can be configured through the Control Panel within the Configuration section. Simply input the email address you wish to have notifications sent from, and save the configuration for this change to take effect.
With this new feature, MindTouch TCS users are now one step closer to improving communication across content creators to ensure documentation is always fresh and relevant.
MindTouch TCS Release: April 19, 2012
For this week’s release, we’ve continued to focus on hardening our MindTouch TCS documentation, while providing performance enhancements and some bug fixes.
One of the best features of MindTouch TCS is the granularity at which you can restrict content. We provide the optional ability to lock down certain areas for editing to specific users or groups while allowing all users the ability to view content. In addition, MindTouch TCS provides the ability to hide specific sections of the hierarchy from being searched while still allowing these types of pages to be directly linked to.
This week, we’ve also provided a document which sheds light on using unsafe content. When creating documentation, often times users like to add elements such as scripts and iframes. While these elements can be quite useful within documentation, they may introduce an element of vulnerability based on the source the element may be referencing. For your protection, our editor looks for these types of elements upon save and strips them if the last user to edit the page is not an admin. This provides an admin user the opportunity to then approve any unsafe content before rendering within the page.
We invite you to take a look below for full details on this week’s release!
Featured Documentation
- Site and Page Permission Breakdown
- Unsafe Content in the MindTouch Editor
- Adding a Favicon to Your MindTouch Site
Bug Fixes
- Corrected an issue to ensure user’s timezone is correctly shown within user profile pages.
- Corrected an uncommon issue where the index was not updated after deleting a page.
Performance Improvement
- Improved load times of some templates within MindTouch TCS.
- Improved algorithm for RSS feeds to allow for faster load times.
MindTouch is looking for professional web developer.
* UX/CSS/JS/GIT skills
* 4 year degree in Computer Science/Electrical Engineering
* 2-6 years work experience
* Team player
* Lifelong learner
If you're interested drop me an email a cesarn [at] mindtouch dot com
MindTouch TCS Release: April 13, 2012
We are thrilled to announce that MindTouch TCS users can now make customizations to the header and footer of their skin! With this new functionality, customizations can be made within a MindTouch template which will be targeted within the header and footer of our Deuce skin.
Specifically, users can make dynamic customizations which are contextually relevant by including DekiScript calls to these areas. Combining this new feature with the current ability to apply custom CSS overrides on a per-role basis, MindTouch TCS users now have greater branding control when making enhancements to their site. If you would like to learn more about enabling this option for your MindTouch TCS site please contact MindTouch Sales.
Also this week, we added a new feature and addressed some issues for some of our DekiScript functions. Take a further look at this week’s release below.
New Feature
- DekiScript: Added new parameters for list.indexof() and list.lastindexof() – “ignorecase” and “start”.
Bug Fixes
- DekiScript
- Corrected an issue where an exception may be thrown if list is empty when using list.lastindexof ().
- Addressed an issue to ensure list.min(), list.average(), and list.max() will return ‘nil’ for empty lists.
Featured Documentation
MindTouch TCS Release: April 6, 2012
At MindTouch, we focus on making it easy to create and manage documentation that is constantly evolving. Ensuring content is relevant is not only important to us, but also to our customers. On that note, we are constantly evolving our own documentation, so keep an eye on help.mindtouch.us as we keep adding new articles to get the most out of MindTouch TCS. For instance, take a look at some of our newly featured documentation, as well as some bug fixes in this week’s release!
Featured Documentation
Are you new to MindTouch TCS though have previous experience with MindTouch Platform? If so, we’ve created a document to help with the transition, discussing some of the key differences between these two versions. Take a look below for this document as well as some other featured documentation this week!
- Migrating from Platform to MindTouch TCS
- Reusing Content within MindTouch
- Social Sharing
- Social Network Login
New Features
- Added support for indexing XSLX documents.
- Optimized execution speed for DekiScript runtime.
Addressed Issues
- Addressed incorrectly encoded characters for extension descriptions inside the editor.
- Addressed an uncommon case where references to Semi-Private pages could be surfaced through DekiScript.
- Addressed a rendering issue with execution errors in the global variables template.
- Addressed a style issue within links in MindTouch Reports.
- Addressed a style issue for Topics within MindTouch IDF.
- Addressed styling for group management in Control Panel.
MindTouch TCS Release: March 22, 2012

While our engineering team was able to increase the performance speed of our search service this week, our documentation team was hard at work creating engaging help docs that continues to put the power to customize a MindTouch TCS site into the hands of our users. Please be sure to take a look at our help documentation to make sure you’re getting the most out of your MindTouch TCS experience, and take a look at this week’s update below!
Featured Documentation
- Social Networking Integration
- MindTouch TCS Reports
- Custom PDF Styling
- Setting Up a Media Repository for CSS Images
- Sample CSS Overrides
Performance Enhancement
- Improved performance of search indexing
Bug Fix
- Addressed an issue where page notifications did not notify subscribers in the event that a page is deleted
MindTouch TCS Release: March 16, 2012
This week, we addressed a bug and added a new feature while continuing our ongoing efforts to provide our users with cohesive documentation. We want you to get the most out of your MindTouch TCS site, and hope this week’s contributions to our help documentation can help you get one step closer. Here’s a quick update for what we’ve been working on below!
Featured Documentation
We’ll be updating and adding to our documentation with each release, and we hope you enjoy this week’s newly updated articles:
- Permissions and Security Breakdown
- Integrating with Google Analytics
- Customizing the MindTouch Look and Feel
- Customize PDF Output Using Styles
Kinetic Data
Zuora
Bug Fix
- Corrected an issue where the page redirect notification was not being surfaced within redirected pages
New Feature
- Added the role of “Viewer” for seated users
Partial Network Connectivity Issue
Early this morning, Amazon reported a partial network outage which lasted about 20 minutes. It is important to note that not all users were affected; whether or not users were affected was dependent upon their geographical location and/or Internet provider. In addition, this issue only affected network connectivity for certain users and was not related to any application failures within MindTouch. Please see below for Amazon’s official statements from their status page regarding this interruption:
Amazon Elastic Compute Cloud (N. Virginia):

Here at MindTouch, we have confirmed that these network issues have been resolved at this time and did not last longer than the reported 20 minute timeframe. If you should have any questions or concerns, or experience any issues directly please feel free to contact our Support department for further assistance.
Ducks Unlimited
Most complaints levied against static type systems come down to verbosity and complexity required to express intent, all of which are usually the fault of the language not of type system. Type inference, parametric types, etc. are all refinements to make type systems more fluid and, err, dynamic.
One language capability that reduces a lof of ceremony is statically verifiable duck-typing. While interfaces are the usual approach to letting independent implementations serve the same role, it always bugs me that interfaces put the contract at the wrong end of the dependency, i.e. I have to implement your interface in order for you to recognize that I can quack!
I had hoped that C# 4.0's dynamic keyword would fix this, but this is the best you can do:
public class AVerySpecialDuck {
public void Quack() {
Console.Writeline("quack");
}
}
public class DuckFancier {
public void GimmeADuck(dynamic duck) {
duck.Quack();
}
}
new DuckFancier().GimmeADuck(new AVerySpecialDuck());
Sure, I can now call .Quack() without having to require a concrete type or even an interface, but I also could have provided a rabbit to GimmeADuck without compilation errors. And as the user of GimmeADuck there is no machine discoverable way to determine what it expects.
I solved half of this problem with Duckpond:
public interface IQuacker {
void Quack();
}
public class DuckFancier {
public void GimmeADuck(IQuacker duck) {
duck.Quack();
}
}
new DuckFancier().GimmeADuck(new AVerySpecialDuck().AsImplementationOf<IQuacker>());
Yes, this is back to interfaces to give us discoverability, but with AsImplementationOf<T>, any class with Quack() could be turned into that interface without ever knowing about it. However, whether I satisfy that contract is still a runtime check.
Duck, Duck, go
What I really want is what go does:
type Quacker interface {
Quick();
}
func GimmeADuck(Quacker duck) {
duck.Quack();
}
I.e. true duck-typing. If the type provided satisfies the contract, it can get passed in and the compiler makes sure. Unfortunately, other than this feature go doesn't entice me all that much.
By trait or structure
A language that's a bit more after my own heart than go and has even greater flexibility in regards to duck-typing is scala. It actually provides two different approaches to this problem.
The first is a structural type, which uses function literals to define the contract for an expected argument type:
class AVerySpecialDuck {
def quack() = println("Quack!")
}
object DuckFancier {
type Quacker = { def quack() }
def GimmeADuck(Quacker duck) = duck.quack()
}
DuckFancier.GimmeADuck(new AVerySpecialDuck())
A structural type is simply a contract of what methods a type should have in order to satisfy the constraints. In this case the singleton DuckFancier defines the structural type Quacker as any object with a quack method.
The second way we could have achieved this is with a trait bound to an instance:
class AVerySpecialDuck {
def quack() = println("Quack!")
}
trait Quacker {
def quack : Unit
}
object DuckFancier {
def GimmeADuck(Quacker duck) = duck.quack()
}
val duck = new AVerySpecialDuck extends Quacker
DuckFancier.GimmeADuck(duck);
A trait is basically an Interface with an optional implementation (think Interface plus extension methods), but in this case I'm treating it purely as an interface to take advantage of scala's ability to attach a trait to an instance. This lets me add the contract on when used rather than at class definition.
Duck-typing in statically typed languages allows for syntax that can be concise and still statically verifiable and discoverable, avoiding the usual ceremony and coupling that inheritance models impose. It's a feature I hope more languages adopt and along with type inference is invalidating a lot of the usual gripes levied at static typing.
MindTouch TCS Release: March 6, 2012
Our development team has been focused on hardening MindTouch TCS behind the scenes this week, and we’ve taken this time to create new documentation for our customers. Check out what we’ve been working on below!
New Documentation
We created MindTouch TCS with the intent of putting the power to create exceptional and engaging help documentation into the hands of our users. Likewise, we constantly strive to make sure we’re providing you with the best documentation around MindTouch TCS. This week we’ve got four new articles over at help.mindtouch.us:
- Adding an SSL to MindTouch
- MindTouch Reliability and Security
- Terminology
- Adding Inline Styles to the MindTouch Editor
Bug Fix
- Addressed styling for banned users within Control Panel
10.1.3 is Here!
10.1.3 is here! This minor release includes various bug fixes and a few new features. Please see the list below for some notable fixes:
- Improved editor load time
- Corrected an issue when trying to navigate cursor within search field
- Corrected an issue causing page view count to incorrectly increment (his addresses future increments, though is not retroactive).
- Corrected an issue causing links to fail when referencing multiple tags that have define pages.
- Addressed a rare issue where performing an advanced search would redirect the user to the home page.
- Resolved a cosmetic issue where a user's configuration within the Control Panel was not displaying group membership.
New Features
In addition, 10.1.3 adds the following new features!
- Support for HTML5 content elements
- Pagination for @api/deki/pages
To upgrade* your installation, please visit our upgrade documentation for further details. In addition, you can download the following packages:
- prepackaged Debian VM
- Windows Server 2003 MSI
- Windows Server 2008 MSI
*IMPORTANT:
Within Linux environments, upgrading to MindTouch 10.1+ from any previous version will require a Mono upgrade to Mono 2.10.2. Failure to do so will result in the API crashing; this latest version of MindTouch does require Mono 2.10.2. Please refer to the upgrade documentation referenced above for further details on upgrading your Mono installation within Linux environments.
LinkedIn Privacy settings
I haven’t blogged in a bit but thought I’d do a quick post on changing how your profile will appear to other users on LinkedIn.
When you view a user’s LinkedIn profile, it captures this and displays it in a report to the user. If you’d like more anonymity when navigating through the site, do the following:
- Login to LinkedIn
- Click on your name in the top right corner and select “Settings”
- Click on the Profile tab towards the bottom of the screen
- Click on “Select what others see when you’ve viewed their profile”
- From here you can have your name and company displayed to other users, just the Company, or be completely Anonymous
This was an unknown setting to me until I started digging into LinkedIn more and wanted to share it with everyone.
Rolling your own coroutines
This post marks the conclusion of the async programming series I originally started as lead in for my monospace 2011 talk. The remaining subject, as promised in my last article, is the creation of tradtional coroutines using .NET iterators. The example code and Monospace slides talking about it can be found on github. I had hoped to time it with a definite date for async/await arriving in .NET but WinRT has kind of derailed future releases, it would seem.
But before I get into, let's roll up the posts that got us here:
- Tasked To Get Results – Introducing our asynchronous completion handles, DReAM's Result and the Task Parallel Library's Task
- What's Asynchrony Good For? — When should we use these constructs
- Exit … Screen Right — CPS (Continuation Passing Style) asynchronous chaining using Result and Task
- Asynchrony and Sequential Workflows — Using DReAM coroutines and TPL's async/await to bring back sequential flow in asynchronous operations
The canonical example of coroutines are producer/consumer pipelines, in which each stage of the pipeline does some amount of work and yields execution to the next stage once it cannot continue. The benefits of this type of processing pipeline is avoidance of locks and maximum utilization of the processing power given to it, in addition to the loose coupling of the pipeline that easily let you add or remove steps in the chain.
For this processing to work the coroutines must all have the same "shape", e.g. signature. For the Iterator based coroutines I will cover first, I chose the following shape:
The coroutine accepts the Coordinator and yields once it cannot continue with any more work. The Coordinator contains the shared state T that all coroutines have access to. Since only one coroutine is ever executed at a time, the state can be mutated without locks.
The example we'll use is a producer of a 3x4 matrix and a consumer that outputs that matrix transpoed to 6x2. To show the ability to add random stages to this chain, we will have another coroutine that will take every value and square it.
We create a Coordinator<int[]>, i.e. our state is a block of ints, requiring a coroutine signature of IEnumerator Coroutine<T>(Coordinator<T> coordinator), but since the Coordinator accepts the coroutines as an array of Funcs, we can curry signatures of different shapes into the required shape. In our example we capture a source and destination for the Producer and Consumer coroutines, respectively, while the Exponetiator already has the required shape.
Let's look at the Producer:
The Producer takes the input matrix and writes it one row at a time into the state object. After each row, the producer yields execution to the next coroutine. We yield null, since the iterator is just used for its side-effect of letting us suspend a method mid-execution and continue later. And that's the magic of it. Yes, it looks like a regular method, but it really does exit and re-enter multiple times. Every time yield is called, the state of the method is suspended while another coroutine gets to run, and once resumed, the method continues on with all its local state from the point right after the yield. We are stopping in the middle of a loop, letting someone else go and then continue on from that exact same place in the loop, all without blocking a thread.
The Consumer is provided the output matrix and starts a loop that will continue until its output matrix is filled, reading the block of integers from the state, writing it to the new matrix and yielding its execution to the coordinator, so that the a fresh set of integers can be provided.
The last coroutine is the Exponentiator which just continues to square every value in the state integer block each time it is resumed and then yields execution until provided a fresh set of integers to square.
Finally, Coordinator<T> allows the construction of these arbitrary co-operative processing chains. It is simply an inversion of a regular iterator. Instead of receiving a new value, one at a time from an enumerator, we have one enumerator per coroutine that we can command to run to its next yield point with MoveNext(). MoveNext() will return false if it was a yield break, signaling that the coroutine is done or true if it was a yield return, signaling that the coroutine is willing to continue in which case we put the enumerator into our queue, pick the next coroutine from the queue and compel it resume.
In the github project I also implemented the same coroutines using async/await. The one benefit that implementation has over Iterator based coroutines is that once inside an async method, you can await any other async method. Allowing these types of coroutines to suspend the execution chain to let some other async task (such as a web request) execute.
While interesting and useful in a limited set of circumstances the coroutines introduced in this article are not likely going to find themselves into your next project. Far more useful and applicable in any application liable to block on I/O are the asynchronous workflows introduced in Asynchrony and Sequential Workflows since these types of coroutines allow us to use traditional sequential coding styles while never blocking on asynchronous operations.
Implicits instead of Extension Methods?
After the latest round of scala is teh complex, I started thinking a bit more about the similar roles implicit conversions in scala play to extension methods in C#. I can't objectively comment on whether Extension Methods are simpler (they are still a discoverability issue), but I can comment that the idea of implicit conversion to attach new functionality to existing code really intrigued me. It does seem less obvious but also a lot more powerful.
Then i thought, wait, C# has implicit.. Did they just invent extension methods without needing to? I've never used implicit conversion in C# for anything but automatic casting, but maybe I was just not imaginative enough. So here goes nothing:
public class RichInt {
public readonly int Value;
public static implicit operator RichInt(int i) {
return new RichInt(i);
}
public static implicit operator int(RichInt i) {
return i.Value;
}
private RichInt(int i) {
Value = i;
}
public IEnumerable<int> To(int upper) {
for(int i = Value;i<=upper;i++) {
yield return i;
}
}
}
Given the above I was hoping I could mimic scala's RichInt to() method and write code like this:
foreach(var i in 10.To(20)) {
Console.WriteLine(i);
}
Alas that won't compile. Implicit conversion only works on assignment, so i had to write
foreach(var i in ((RichInt)10).To(20)) {
Console.WriteLine(i);
}
So I do have to use an extension method to create To() in C#.
And, yes, i'm grossly simplifying what scala's implicts can accomplish. Also, I wish I could have block scope using statements to import extension methods for just a block the way scala's import allows you to handle local scope implicits.
Node 0.6.x & AWS EC2 Micro troubles
Tried to upgrade node from 0.4.5 to 0.6.x and my my micro kept falling over dead. I know it's an edge case, but it's an annoying set of symptoms that I figured I should post in case someone else runs into the same issue.
tl;dr => It's not a node problem its an AWS kernel issue with old AWS AMIs and Micro instances
So I have a micro that's about a year old, i.e. beta AWS-AMI, but i gather the same problem happens with pretty much every AMI prior to 2011.09. I was running node 0.4.5, but had started using 0.6.4 on my dev and some modules were now dependent on it. Since micro instances go into throttle mode when building anything substantial, i hope to use the build from my dev server. The dev machine is centos, so i crossed my fingers, copied the build over and ran make install. No problem. Then i tried npm install -g supervisor and it locked up. Load shot up, the process wouldn't let itself be killed and i got a syslogd barf all over my console:
Message from syslogd@ at Wed Dec 28 00:58:19 2011 ... ip-**-**-**-** klogd: [ 440.293407] ------------[ cut here ]------------ ip-**-**-**-** klogd: [ 440.293418] invalid opcode: 0000 [#1] SMP ip-**-**-**-** klogd: [ 440.293424] last sysfs file: /sys/kernel/uevent_seqnum ip-**-**-**-** klogd: [ 440.293501] Process node (pid: 1352, ti=e599c000 task=e60371a0 task.ti=e599c000) ip-**-**-**-** klogd: [ 440.293508] Stack: ip-**-**-**-** klogd: [ 440.293545] Call Trace: ip-**-**-**-** klogd: [ 440.293589] Code: ff ff 8b 45 f0 89 .... ip-**-**-**-** klogd: [ 440.293644] EIP: [] exit_mmap+0xd5/0xe1 SS:ESP 0069:e599cf08
So i killed the instance. Figuring it was config diffs between centos and the AMI, i cloned my live server and fired it up as a small to get decent build perf. Tested 0.6.4, all worked, brought it back up as a micro and, blamo, same death spiral. Back to small instance, tried 0.6.6 and and once again as a small instance it worked, but back as a micro it still had the same problem.
Next up was a brand new AMI, build node 0.6.6 and run as micro. Everything was happy. So it must be something that's gotten fixed along the way. Back to the clone and yum upgrade. Build node, try to run, death spiral. Argh! So finally i thought i'd file a ticket with node.js, but first looked through existing issues and found this:
Node v0.6.3 crashes EC2 instance
which pointed me at the relevant Amazon release notes which had this bit in it:
After using
yumto upgrade to Amazon Linux AMI 2011.09, t1.micro 32-bit instances fail to reboot.
There is a bug in PV-Grub that affects the handling of memory pages from Xen on 32bit t1.micro instances. A new release of PV-Grub has been released to fix this problem. Some manual steps need to be performed to have your instance launch with the new PV-Grub.
As of 2011-11-01, the latest version of the PV-Grub Amazon Kernel Images (AKIs) is 1.02. Find the PV-Grub AKI's for your given region by running:
ec2-describe-images -o amazon --filter "manifest-location=*pv-grub-hd0_1.02-i386*" --region REGION.Currently running instances need to be stopped before replacing the AKI. The following commands point an instance to the new AKI:
ec2-stop-instance --region us-east-1 i-#####
ec2-modify-instance-attribute --kernel aki-805ea7e9 --region us-east-1 i-#####
ec2-start-instance --region us-east-1 i-#####.If launching a custom AMI, add a
--kernelparameter to theec2-run-instancescommand or choose the AKI in the kernel drop-down of the console launch widget.
Following these instructions finally did the trick and 0.6.6 is happily running on my old micro instance. Hope this helps someone else get this resolved more smoothly.
Three months with the TouchPad
I first started writing this post on 2 September 2011. It was going to be called "three days with the TouchPad". I'd like to say that my opinion has changed substantially over the three months since then, but for that to have happened, I would have had to spend serious time with the device.
I haven't.
Last time anyone in our house tried to use the TouchPad it got thrown on the couch in disgust1 On the contrary, our iPad is happily used every day. Is this just a case of "you get what you pay for"?
The story so far
I fought my way through the broken websites to purchase an £89 HP TouchPad when they cleared their stock at the end of August. I couldn't be sure that Carphone Warehouse had stock for all their orders, so I was overjoyed when mine turned "dispatched" later in the week. Then, it never arrived. I wasted hours on the phone with CPW and Yodel (cheap courier of choice for "free delivery" everywhere), who claimed it had been delivered, when no knock had ever graced my door. The driver only spoke Bulgarian, and intimated (through a translator and wild hand gesturing) that he had given it to someone who had come up from the stairs below us - an empty flat.
I had all but given up on the delivery when, after the weekend, our neighbour came over and said their housekeeper had collected it on Friday and had it the whole time.
Argh.
Eventually, thanks to people like me, the TouchPad ended up getting 17% of the market!
Of everything that wasn't the iPad.
And remember, I very nearly wasn't a member of that club, as it seemed very unlikely that Carphone Warehouse would have been in a position to give me another one, had the first one not surfaced.
The TouchPad was an impulse buy, as we already owned an iPad. I had opted for middle of the range - the 32GB with 3G.2 At clearance price, my iPad cost 7 times more than the TouchPad, but remember that the original retail pricing for a comparable device was £399 for HP vs £429 for Apple.
With all that in mind, here's a collection of thoughts about the TouchPad today. It is not a review: if you are interested in a review, albeit one from before the fire-sale, go read what Shawn Blanc wrote. The experience has hardly changed.
The good
I came into TouchPad ownership with a very open mind, based in part on my ex-colleague Sergei owning a Palm Pré and not hating it. Also, everything I read about webOS online made it seem that it was designed, where Android was mostly congealed. (My apologies to Douglas Adams.) Further, I wanted webOS to be a success, because I like to use systems that feel like they are consistently designed throughout, and I didn't think it would be good for the world if iOS was to be the only relevant platform for which that was true. We are in the odd position today that Microsoft has replaced Palm as the loveable underdog: Windows Phone (and possible Windows 8 for tablets) has taken the mantle of "mobile operating environment which actually has some moden design principles applied, rather than just copying iOS", which surely must provoke some cognitive dissonance for all the people still bitter about how Microsoft stole everything from the Mac.
I only made one note from three days after unboxing: "It is really handy to have the number keys on the keyboard all the time". It still is. I suppose there are other nice things, depending on your point of comparison. Notifications are good, in general, though I really don't care that each web site I visit exposes a search endpoint, so I don't appreciate that the TouchPad displays me a notification for each and tries to add them to the search.
Grasping at straws, I still like the card metaphor, though not as much for multiple tabs as for multiple applications. And the things that were good about webOS on the phone, such as the integrated contacts, are still good here, though not as useful. The only other thing I noticed in a quick look through the menus is that it has Beats Audio, which I like to think makes me one step closer to Dr Dre than most. I don't think I've ever actually tried to make the thing play audio in order that I might notice a difference.
The goblin
How long after the horse died is it acceptable to still be flogging it?
The TouchPad is slow, out of the box. Nerds like me can make it faster with - wait for it - syslogd and kernel patches, and even overclock it if they feel the need. (I didn't.) The iPad 1 still runs rings around it in everything - even though the iPad has half the CPU cores at a much lower clock speed, and one quarter the RAM of the TouchPad.
It has a handful of apps, but not enough to retroactively justify the purchase to me, even at £89. If I go to my Applications list, I have a beta Kindle reader, which I had to side-load as it is US only: the best Twitter experience is something called "Spaz HD Beta Preview 2", which is both award-winning and open source, though apparently named by the people who came up with "The GIMP". In fairness, it's not bad, it's just not up to the experience which is available on any one of the great Twitter clients for other platforms. And with the on-again off-again abandonment by HP, surely most of those who came into the TouchPad did it eyes-open, knowing the chances of it ever developing a good app ecosystem were not high.
Most of what I do on a tablet is web browsing, and so even if it had no apps but did web browsing brilliantly, it might be redeemed. It doesn't. It has Flash, which really just serves to make YouTube worse. Maps are horrible, scrolling is slow and sluggish, and clicking doesn't normally hit the link you want it to.
Physically, it feels cheap, due to the plastic back. It is a good weight however.
The purchase
In my mind, there were three groups of people who wanted to buy a TouchPad at fire sale prices:
- People who wanted a "tablet" (iPad), but couldn't afford or justify one at market (iPad) prices
- People who wanted an "Android tablet" and figured that a port couldn't be far away
- People who liked webOS and actually wanted a TouchPad to use webOS on it
I was in the third group, but I also suspect that was about 1.8% of the people who actually got the device.
If you were to compare the experience on a £89 TouchPad vs. whatever else you could legitimately purchase for £89 - how long were the queues for the Binatone HomeSurf 7? - it seems like a no-brainer. If there was no chance that the tablet were ever able to run Android, I don't think it would have sold nearly as quickly. At the time of writing there is an alpha-quality CyanogenMod release of Android for the TouchPad, for developers, rather than end users. With the recent release of Android 4.0, it's likely there will be a reasonably good upgrade path for the application story, and on this kind of hardware Android should be about as good as it is on any other kind of hardware.
I bemoaned this fact when I came to buy it:
Three months later, has my attitude changed? Somewhat. I simply don't want to own an Android tablet. (Neither do many other people, as we established before.) Would it be better on this hardware than webOS? Probably. Ask me again when 4.0 is released for the TouchPad - I don't think the attempts to shoehorn Android 2.x onto tablets have done hackers any better than Samsung.
I don't think there can be any argument that the fire sale was a dumb idea, and HP's CEO eventually paid the price. Would I have paid £200 for this? No, but they would still have sold out at that price.
The summary
First world problems much? Our two tablet household isn't as good as it would be if we had an iPad each. Sure. I knowingly bought an £89 gadget to have a play with, and I suspect I could easily get that back if I wanted to sell it. Alternatively, if either of my brothers read my blog, I might be convinced to post it to them for Christmas. Over time, I think I might find a use for it - if I could pick up the Touchstone dock-slash-stand, I think it could make a great digital photo frame. Even if all it ever did was be an LCD Kindle, it was still a bargain.
But the crux is that neither of us ever want to use it. It almost got put in the cupboard today. Attempts to use it provoke disgust, throwing it back onto the couch, and getting up to find the iPad. There is really nothing redeeming about it.
- Fern later clarified: "It wasn't thrown on the couch, it was thrown at the couch.
- If I were to look back on that purchase, I would say the money spent on the 3G was mostly wasted - tablet usage is mostly at home. The iPad spent over a year without a 3G SIM card, though it has one now thanks to Arunabh, who pointed out that T-Mobile have a remarkable 12 months free on an iPhone 4 PAYG SIM, and the iPad takes the SIM quite happily.
Thanksgiving
This has been a pretty crazy year on many levels but as I get towards the end of the year I reflect on a lot of things I’m thankful for. Here is my top 6 list:
- Top of the list is my wife, she is amazingly supportive and everyday I thank God she is in my life.
- Family has been very supportive this year. Both my family and my wife’s.
- Lucy my Golden Retriever, she’s sooo awesome!
- MindTouch, a great company to work for along with a great product to be associated with
- Essentials – I’m thankful for having the basic necessities that we take for granted like shelter and food
- Anyone reading this – Thank you for taking time to read my blog
I know I haven’t been writing often, but that is kinda how I roll. If you want more frequent updates definitely follow me on twitter: @coreygans
I hope you have a wonderful holiday!
Quality of Service and Customer support
One of the biggest components to making life easy for a Customer Support agent is having a good product. But let’s be honest, every product has its flaw and because of this the customer support/service agent’s role is critical for filling in the gap when the product fails.
I had a recent interaction with a customer support agent that left a very bad taste in my mouth as the agent didn’t understand the gravity of the situation.
Background:
Every year I run the annual RECSS awards which recognize outstanding customer support and service across multiple industries. This year was the 3rd year for this award. The process leading up to the winners only lasts about 2-3 months and is an intense time of marketing through word of mouth along with usual mediums like email and social media. This year I sent out my email through Vertical Response ,as I have done in previous years, letting them know that voting is open. I luckily received an email from one of my subscribers letting me know that the links in my email were leading off to a phishing site. Now as a disclosure my email list isn’t that large, but every person on the list is important and they are able to help spread awareness of the awards program after receiving the email. I checked the links I had setup in my email and confirmed there wasn’t a typo and then went to the email and clicked on the links and sure enough they were leading off to a random spam site.
I contacted Vertical Response about this and first asked how this happened. They replied and said it was an internal error and that their team was working on it and they apologized for the inconvenience. This was very frustrating as this was more than just an inconvenience, which I would consider a delay in sending an email campaign, but instead a major mess up. I replied and asked for a refund of the amount of money I’ve spent with them which didn’t exceed $50. I was going to take my refund, move onto a different vendor and chalk it up to a horrible issue. I didn’t get a response for a while and so I sent another email asking for them to confirm the refund of my payment and they replied that they provided credits in my account and gave me some more credits for use on my next campaign.
Now I had no intention of using the service again after that issue. All I wanted was my money back so I could move on. I asked them again if I could just get my money back and they said they couldn’t refund credits that have already been used. I can understand this from a business standpoint but at the same time this was a major error on their part and all I got was more credits.
In the end what I really wanted was someone to reach out to me on a personal level to understand why I was so frustrated so at least I was heard. If someone would have at least done that, then I would have still moved on, but I wouldn’t have this left over feeling of being taken advantage of.
Oh well, I’m using MailChimp now and loving their interface along with the ease of extending it. It is a little bit more than VerticalResponse, but well worth it in my opinion.


















