Freehand Drawing Library on iPad

This is my last post before MAX.  Thought I would end the Freehand Drawing Library set of posts with some screenshots of it running on my iPad-2.  I’m running the debug version of the MobileFreehand test and I’m rather satisfied with the performance from Air 2.7.

Sorry for the poor picture quality from my phone camera.  The browser version is running in a window at the upper, left-hand side of the picture.  You can see the iPad-2 leaning against the MBP screen.

I find that I draw better using a stylus on the iPad-2 vs. a mouse with the browser version.  And, yes, it does work just fine with the screen rotated.

The best aspect of this entire project is one central code library (Flex library project) from which a number of targeted (browser, desktop, mobile) applications may be developed.

See you at MAX in a couple days!

Freehand Drawing Library New Features

The top two requests from prior beta users of this library were stroke transforms and the ability to serialize strokes to SVG or FXG format.  The intent is to use the library to create a handrawn stroke as part of a logo, for example, then use a stroke editor for fine tuning.  The stroke is then converted to a String representation (FXG or SVG format), then sent to a server or written to a file in an AIR application.

Here are some screen shots of the serialization demo.  A single stroke is drawn into the Freehand drawing area, as shown below.

After conversion to FXG or SVG, the resulting String is displayed below the Freehand drawing area.  If FXG format is selected, a crude (and I do mean crude) FXG viewer uses the serialized stroke to echo it as a filled Path.

I tested the SVG output by copying and pasting it into an online SVG viewer.

There is one beta slot left, so if you are interested in a license, please contact me at theAlgorithmist [at] gmail [dot] com (serious inquiries only).  Beta users get free upgrades for life.

Freehand Drawing Library Beta 0.9

A new beta version of the Freehand drawing library (version 0.9) is being released this morning.  As always, it’s a free upgrade to beta customers.  It’s also the first beta release that leaves the drawing algorithm intact and greatly expands the capability of the library as a whole.

Following is a brief summary of the new features.  I’ll do an additional set of blog posts covering the details of each feature.

1 – Freehand is now packaged under net.algorithmist.freehand and is supplied as a Flex library project.  This serves as the central code library from which a variety of projects may be developed.

2 – New Value Objects for line data, individual stroke data, and stroke collections.  This stems from user requests to expand the number of controllable parameters and provide a simple means to store individual and collective stroke data offline.  The new VOs may be used as data providers to set individual stroke data or even draw an entire collection of strokes from a single VO (using the new draw method in the core Freehand class).

3 – Stroke Transforms.  The collection of raw input points from which a stroke is mathematically derived can be both accessed and now transformed.  Stroke transformations are implemented externally to the Freehand class via a new utility class (GeomUtils).  Keeping stroke transformations external to Freehand allows a wide variety of stock or custom transforms to be created without modifying or increasing the weight of the Freehand class.

4 – Stroke serialization to FXG or SVG.  Strokes may be serialized to either FXG or SVG format for transfer to a server or immediate storage to disk in an AIR application.

5 – Interactive control.  Freehand drawing instances may have interactivity turned on or off at runtime.

6 – Mobile Freehand.  A new MobileFreehand class supports applications targeted primarily towards tablets.  This has been tested with Flex 4.5.1/Air 2.7 on an iPad-2 with nice performance, even from the debug version of the app.  The actual class is platform agnostic.  Any Flex 4.5 user may target the mobile platform of their choosing.

A screenshot of the basic demo is show above (please forgive my pathetic mouse skills).  The beta distribution comes with a number of new demo programs, each of which illustrates various features of the new library.

There are still a couple beta slots open for interested parties.  The beta license fees are very low AND beta customers get free upgrades for life.  That’s a deal with appeal, so please contact me at theAlgorithmist [at] gmail [dot] com if you are interested in purchasing a license.

Thank you.

I’m Not A Bank

Continuing my series of posts on business topics, one of the things you find as a solo freelancer is that everyone has a story.  Everyone.  Sometimes stories are straight from the heart and other times they are complete facades.  Reality is most often somewhere in the middle.  Part of the challenge in any initial set of discussions is discerning what is fact and what is spin.  The goal is to both properly sell your services and mitigate risk.

I’m a developer and mathematician so the first thing I look for in a conversation is whether or not the prospect talks to me like a mathematician or developer.  It’s always good for a people to be enthusiastic and optimistic about their business, but I’ve found code words like ‘this is going to be big’ or ‘this will revolutionize’ or similar phrases to be warning signs.  Charlie Van Loan at Cornell once told me at a supercomputing conference that “there’s really nothing new under the sun.”  I’ve come to understand the wisdom of those words over the years.  There are so few truly ‘big’ and ‘revolutionary’ ideas that on the basis of probability alone, the likelihood of the prospect’s claim is small at best.

And, what difference does it make to a developer?  Big does not describe the programming or math problem to be solved.  If my rate is $X per hour, then it’s still $X per hour whether the prospect’s idea is ‘big’ or ‘small’ or somewhere in between.  Big may sound like there is lots of money to be spent, but in reality ‘big’ is likely a setup to entice you into compromise now in exchange for possible future gains.

Trust me when I tell you emphatically that if you compromise today, you will compromise tomorrow and forever more.  There are no big gains in the future, except for the client that consistently takes advantage of your good will.  That sounds crass, but it comes from personal experience and the experiences of hundreds of other freelancers via private communication.

Big or revolutionary is not a story told to a developer.  It’s a story told to a bank, VC, or Angel as part of a request for funding.  I’m not a bank.  I’m not a VC.  I’m not an Angel.  I’m not a savior of any organization from its past mistakes or experiences arising from bad luck.  Don’t  tell me that the development budget is exhausted because of some unexpected complications or that the pitfalls of outsourcing have only just been understood or that a partner just withdrew from the organization.  That’s what you tell a financial organization or investor as part of a solicitation for a cash infusion.  Don’t make your very first question to me, “what is your rate?”  Why should you care if you have yet to determine if I’m the best person for the job?  Don’t tell me that you have such a hard time collecting payments from your clients.  That’s just fodder for a later excuse that my invoice will be paid after you receive payment from your clients, which is nothing more than a form of implicit financing via floating payables.  Financing is provided by banks, VC’s, Angels and other financial sources.

I’m not a bank.  I’m a developer.

If someone understands that you are an artist, copywriter, developer, or other service provider and they talk to you like a bank, beware.  That conversation is simply designed to provide an initial cover that is later used as an excuse to dilute the value of your time through free or heavily discounted services, or by implicit financing via arbitrary float of their payables.

Now, having said that, I do often help local business that have experienced some bad luck, but I do it with the attitude that it’s one step away from pro bono work.  Like the admonition to not gamble with money in Vegas you can’t afford to lose, I don’t help anyone with time I’m not willing to write off.

So, in conclusion, pay close attention to how people address you.  Do they talk to you like a service provider or a bank?  If it’s the former, then keep talking.  If it’s the latter, then be careful.  I don’t know about you, but I’m not a bank.

Good luck with your business!

Dynamic Bezier Spline Scroller With Source

Paul Taylor and I collaborated on a TinyTLF demo for 360|Flex last fall that used a quadratic Beizer spline to form left and right vertical constraints for dynamic text layout.  After the demo, a few people said it would be really cool to see the text scroll.  The idea scroller, however, should be organic to match the text boundaries, just as a vertical scroller matches a straight-line text boundary.  Since the spline boundary is dynamic, this means the scroller track and thumb should be dynamically drawn.

Since I had some time, I took on the task to create another demo for Adobe MAX 2010 and it was completed during the conference.  I envisioned a possible TechNote on the scroller’s construction, but time constraints have since rendered that idea impractical.  Since a TechNote implies open-sourcing the code, the next best solution is to just open-source the code.  If there is sufficient interest, I might do a deconstruction over the course of several blog posts.

Now, the track is the easy part since we already have the constraint and the quad. Bezier spline is one that I released in Degrafa.  It’s a simple construction with G-1 continuity and a tension parameter.  Additional artificial tangent control is provided by augmenting the spline with degenerate quad. segments at the beginning and end.  The spline is non-interpolative.

Most of the details are in the thumb construction and update.  This demo uses a relatively simple arc-length parameterization based on adaptive interpolation, and the interpolator may be injected.  Two interpolators are provided with the demo, but I’ve only tested one.

The scroller uses a linear model to map thumb position to [0,1] for the thumb value.  I don’t like the linear model since it has some issues, so I sketched out a quadratic model, but did not have bandwidth to test the implementation.  I also did not have time to test every conceivable path through the code, so there may be a bug or two yet to be uncovered.  So, check it out and see if you can come up with some interesting ideas for using this in an application.

Yes, that’s a pretty ugly-looking demo 🙂  Your job is to turn it into something visually impressive.  Good luck!

View (Flex 3) Demo

View Source

The companion demo illustrates how to use two of the Bezier splines to bound the width of an element.

View (Flex 3) Demo

View Source

Losers Breed Losses

I’m going to switch gears for a while.  Don’t worry, I’m still working on open-source stuff and you’ll see some new posts shortly.  I’ve received several inquiries about the general process of doing business as a solo freelancer.  I can’t claim to have a lock on the perfect strategy for success, but I’ve been doing this since 1997 and will be happy to share my experience.  It also provides an opportunity for others to share their expertise.

So, in that spirit, here is my first tip.  I’m eternally grateful for a past opportunity to work with Paul Jones, considered by many to be one of the greatest commodity traders of all time.  Despite the numerous trading monitors, charts, and advice generated by his support team, Paul’s greatest asset is a small handwritten piece of paper in his office.  The hand scratch reads, “Losers breed losses.”

The point is that losing positions tend to not turn into winning positions.  Losers don’t breed winners.  They tend to breed more losses.  Paul approaches a trading day with the attitude that every single open position in his portfolio is a loser.  It must *prove* itself to be a winner.  We tend to take the opposite attitude with our business positions.  We presume that decisions we make are destined to be winners. We think that bad times will turn around and a losing posture will turn to a winning one.  Sometimes, it happens, but at a substantial opportunity cost.

My business began as a 3D animator and plug-in developer.   I had character design and animation experience not matched by other programmers and C++/math skills not possessed by other animators.  It was a really nice niche and I had a lot of money and time invested in that niche.  Not just money, but emotional currency as well.

Yet, every morning, I told myself it was a losing position.  It had to consistently prove itself to be worthy of continuance.  Early after the new millennium, several factors came to the forefront that proved to be the writing on the wall for my so-called niche.  The business strategy failed to prove itself a winner, so 2003 was the year I gave up 3D and re-branded myself as a full-time programmer.

Interestingly, the niche that proved to be successful for the last nine years was something I never would have predicted coming from a C/C++/scientific programming background.

Something called Flash.

Nine years is a nice ride and I’ll never be successful attempting to predict the next nine years (nor will you or any of the silly technology pundits).  I’ve never been a <insert_the_fab_language_of_the_day> developer and never will.  Every day, I wake up with the presumption that Flex/Actionscript is a losing strategy.  It must consistently prove itself to be a winner.

Because, losers don’t breed winners.  Losers breed losses.  Try considering your business decisions in the same light and best of luck to you!