Language Aid 1.1.4 is out!

August 18th, 2008

Normal LAID window

The changes included in this round are the usual bug fixes for stability/performance and the like. There is also one major change involving the results window. The results windows are now normal Mac OS X windows with typical window behavior instead of the previous overlay window style. This allows you to put other windows in-front of the results windows instead of them always floating on top of everything. With that there is also the change that you can use command-W to close the results windows in addition to the other methods of dismissal.

Almost all of the feature or behavior additions/changes that have gone in to Language Aid updates have originated from user feedback. I am very grateful to my users for their suggestions and requests so that Language Aid can continue to grow and improve. Thanks and keep it coming!

Marketing!

July 1st, 2008

I havn’t really done very much marketing of my products. Mostly because I want to spend most of my time in actual product development. However, my thoughts sometimes turn to promotion and marketing and how to do it better. Lately I have observed that many products are advertised on what they DON’T have. A product is promoted as not having certain bad things rather than emphasizing that it has these other good things. Thus is the way of business, politics and many other areas of society as of late.

I have decided to think of a few catchy anti-features for Language Aid that are surely going to send sales through the roof. Here are just a few that I have come up with as I have been sitting here:

LAid Marketing

Who needs boring feature lists detailing what a product DOES have. When people see the substantial list of what Language Aid doesn’t have, I am sure they will think twice before passing up purchasing such a great program! Perhaps now I have found my true calling…

Introducing Deadlock

June 23rd, 2008

Deadlock logo

Deadlock is the name for my copy-protection/registration framework that I have been using in Language Aid since version 1.0. It has worked faithfully for me since then and I have have decided to share it with other developers who might be looking for such functionality or looking to bump up their protection a little.

I have long heard many developers argue that most of the time pirates wouldn’t purchase your software anyway and so you shouldn’t bother putting that much effort into fighting it except for the most basic and obvious of protections. In most cases it just isn’t economical. I generally agree with this but the reason that I put so much effort into Deadlock to protect a $20 program was more personal education and entertainment than anything else. I must admit that I had a lot of fun thinking of how to hack the program, come up with a countermeasure, then come up with a circumvention of that countermeasure and then engineer a protection against that back and forth over and over again. I mostly just thought of the kinds of reverse-engineering that I have performed on other software for entertainment and then researched methods to prevent such fun. In the end I thought I had a pretty good setup of minimally invasive mechanisms to prevent piracy for my software.

Deadlock has been refined over the course of Language Aid releases and as of Language Aid 1.1.1 it was built out as its own separate product. I have wanted to refine it and add more diverse functionality to it for a long time. To accomplish this Deadlock needs more clients, preferably applications outside of Aoren Software. In the future I also plan on productizing my payment processing engine (works hand in hand with Deadlock) that makes paying for and registering Language Aid easy, fast and instant (no serial numbers, no confirmation emails, just instant gratification). I wanted to end this post by citing one of the many insightful quips from Bruce Schneier in order to emphasize that security invasion is inevitable and that defenses are simply deterrents. Instead I give you this:

The user’s going to pick dancing pigs over security every time.

— Bruce Schneier

Hehe…dancing pigs…

Language Aid 1.1.3 is out!

June 14th, 2008

Google Translate

The latest update to Language Aid includes a plugin that really shows off its power and utility. Version 1.1.3 includes a plugin for Google Translate which performs general language translation in a multitude of tongues. One of the great features of Google Translate is that it can auto-detect the source language on its own in many cases. What this means is that the next time you are surfing the web and see text that is in a language you don’t understand, you can immediately see the translation of it in your native language. This addition greatly widens the potential user base for Language Aid by significantly expanding the language capability from just Japanese and Chinese dictionary lookups. “Your” language is now supported.

iPhone SDK, initial impressions

March 8th, 2008

I have spent quite a few hours with the iPhone SDK now and must say that I am quite impressed. The experience of bringing some of my code written for Mac OS X over to the iPhone with no changes and having it just work is quite a pleasant experience. I REALLY enjoy being able to use Objective-C 2.0 synthsized properties and fast enumerators in my code (garbage collection would have been nice but hey, this is a mobile device). I maintain Tiger support for Language Aid and develop purely for Leopard in Razor and it is kind of an interesting mix of both to code for the iPhone. I am really excited to to flesh out a game I have been thinking of for the iPhone that would take advantage of a lot of its unique features.

nativearch

So the posted requirements say that this beta version of the SDK requires an Intel Mac but so far I have not run in to much trouble developing with it on my G5 (the only Intel mac in the house right now is a Core Solo mini which is already pulling duty as a source server, build server, DVR and media center). Inspecting the simulator and the xcode plugins show that they are all universal binaries. The only gotcha that I ran into is that I had to make sure that in my build settings that the “Architectures” setting is set to “Native Architecture of Build Machine” so that the binaries produced are ppc so that the simulator (I have heard a surprising number of people errantly referring to it as an emulator) can load and run them. For some reason this reset itself to i386 one time and I had to track it down to that setting.

Other small quirks that may or may not be related to me running on ppc are that it seems like every 10th click event or so on the simulator window seems to fall through and hit the window behind it. Also, for some reason the simulator is also not responding to the “Rotate” commands whereas it would correctly respond on my Intel mini. Of the example code on the developer website there are a lot of projects that will not run in the simulator due to a pragma that intentionally errors itself out if built targeting the simulator:

#if TARGET_ASPEN_SIMULATOR
#error This application cannot be run in the Aspen Simulator. Please change Active SDK to “Device” and ensure a device is connected.
#endif

The common theme of which projects will and will not run seemed to be that they all used Open GL ES. I eventually stopped to read the description before downloading the example which explicitly states as much:
Simply build the sample using Xcode and run it on the device (OpenGL ES is not supported in the simulator).

It is inevitable that I will plunk down the $99 to be able to perform remote debugging/use Instruments/use Shark with a real iPhone. However, for now while I am busy bringing up the core game engine and getting used to the new platform, the simulator is doing just fine.

Of NSServices and lsregister

March 5th, 2008

Services

Launch Services is one of those things that does a lot of magic for Mac OS X but is not really visible on the surface and is somewhat vague and ethereal. Launch Services is responsible among other things, for associating file types with applications, associating icons, associating system services and many other wonderful things that make your experience just work. Fortunately there is a tool to poke at the Launch Services database buried in the system at:

/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister

Most notably the -dump command basically outputs the database so that you can see exactly why a certain file type wants to be opened by which app and why certain files get their icons and association hijacked by some other random new app. The -f command will let you update the database with any new changes you have made to an application or bundle.

Some of things managed by this database are the system services that show up in the “Services” option under the application menu (these are outlined in the NSServices array of a bundle’s Info.plist). Language Aid provides one of these as an alternative to the lookup trigger and contextual menu as a way to lookup text. Unfortunately, it appears that just tickling the database with the new information about which options you want available in the menu (dictated by which plugins you have selected), is not enough to rebuild the Services menu. A reboot seems to do the trick, but it would really be nice if I could figure out what causes that menu to rebuild.

Language Aid 1.1.2 is out!

March 1st, 2008

One of the things I hear most often while providing support for Langauge Aid is something along the lines of “I hovered my cursor over text in some program, hit the lookup trigger and it didn’t do anything/grabbed the wrong text.” This is sometimes because the application they want to grab text from does not support the Accessibility API or sometimes because what they were hovering over wasn’t really text. Thus I have added a feature in version 1.1.2 that should help alleviate confusion.

highlight

Now in Language Aid 1.1.2 if you hold down the lookup trigger for more than one second, a highlight bubble will appear containing the text that will be grabbed if you let up your lookup trigger. You can also move the cursor around while holding the lookup trigger to see the exact text that would be grabbed from any point that your mouse cursor can hover over. So now if you are unsure about what text will be sent to the plugin, simply hold down the lookup trigger and move the mouse cursor around until you find the text you want. The highlight bubble is also slightly translucent so you can see the text under it.

I have also slightly overhauled the main Language Aid website to focus more on the the three different ways that you can use Language Aid to grab text. I have added short videos that explain and demonstrate each way. Also, a quick side note on Quicktime video encoding…the “Prepare for Internet Streaming” setting is BAD. When run in my web browser I found that my videos would often play for a bit, then the video would freeze but the progress slider would keep moving. This would continue until the end of the video. If you scrubbed through the video it would seem to display fine. However, if you scrubbed to a section in the video and then pressed play, it would play for a bit and then freeze again. Strangely enough, when played through Quicktime Player this did not happen quite as much but still occasionally would occur. I found that when I turned off the internet streaming setting this behavior stopped. Also, setting my H.264 keyframes setting to “Automatic” from 24 seemed to cut my file sizes in half. I suppose the moral of the story is that it pays to deviate from the default video encoding settings.

My video editor of choice? Quicktime Player (Pro).

February 29th, 2008

I must say that over the years more than any other video editing program I have used Quicktime Player (editing functionality requires Quicktime Pro) to do quick, clean and simple edits of video when I have needed to. Despite having only limited editing functionality and its purpose isn’t primarily to edit video, I have found that it gets the jobs I want done without a lot of hassle and helps maintain my video file fidelity.

I havn’t had the time to learn Final Cut Pro and for most jobs that I want to accomplish it feels a little overqualified. iMovie tends to mush my video around in ways that I don’t like such as transcoding it into something else, messing with the video dimensions and framerate. There may be better alternatives closer to what I want but I am not aware of them and I havn’t hunted extensively.

What I like about Quicktime Player is that I can slice and dice, re-order things, make translucent overlays and muck with the soundtrack by simply adding in references (by copy/paste) to my source media and then play with them. This means that nothing has to re-render and everything stays quality (the big box editors of course do this too). Now there are some problems sometimes when you try to play things back. Often my edits would playback one frame off as it is trying to load the resource or something. Even when I save the movie as a self contained archive it seems to have this problem. However, I have found that when I am all done with my edits simply choosing to “Export->Movie to Quicktime Movie” seems to take care of that.

An example of using Quicktime Pro to add a translucent comment overlay onto a video:

qteditor

  •  First I make a translucent png the same size as my video.
  •  The I open it with Quicktime Player
  •  Edit->Select All
  •  Edit->Copy
  •  Then I open my video and select the time that I want that overlay to be visible
  •  Edit->Add to Selection & Scale
  •  Window->Show Movie Properties
  •  I then change the new video track’s “Transparency” to “Straight Alpha”.
  •  Lastly I make sure to export so that the little transition jitters are removed.

It seems to have filled my little niche fairly well. Perhaps one day my needs will grow but until then Quicktime Player will be my quick and clean tool of choice.

Refining Physics and Inspecting Objects

January 13th, 2008

After a long time tweaking and puttering with the physics engine I think I have finally gotten close to the kind of settings that are needed for the kind of simulation that I want (dContactApprox is the flag that finally fixed a lot of my problems). I have also introduced projectiles into the mix by adding the “Shell” class. The Shell class is actually just an Actor and is treated the same was as any other tank or other object in the game. It just so happens that tanks create shells and they initially have a great force exerted on them.

I have also put a lot more work into NSObjectInspector (probably to be renamed in the future) so as to be able to support more debugging of the plugins at runtime. I am getting the hankering to spin it off as a general debugging tool for developers because it is just so darn useful.

NSObjectInspector

The idea behind NSObjectInspector is that when you debug a program sometimes you want to just change a value in an object while you are debugging your program at runtime instead of recompiling or writing some sort of user interface to interact with an object’s value. Because the Objective-C runtime affords us a lot of information about what instance variables an object has or what methods it has implementations to, we can provide a general class that can inspect other objects and provide a user interface with which to poke at them with.

Currently it provides interfaces to object instance variables, accessors (method or method pairs in the form of -(void)setMethod:(type)a and -(type)method) and commands (methods in the form of -(void)method). It currently excludes anything in the class NSObject and well known methods that have substantial peripheral effects such as -(id)init, -(void)dealloc and -(void)finalize. Currently supported values are any sort of number type and ids of type NSString. Eventually I plan on creation of class specific exemption lists as well as control hookups.

ODE for the win

December 29th, 2007

ODE

After doing a lot more research I decided that I don’t really want to implement the physics engine in Razor myself. Thus I have decided to use the Open Dynamics Engine and I am already pleased with the results. It took me about a day to hook it in (had trouble for a while because my tanks were falling through the ground because of some weird collision setting). It might take a bit to figure out how to do movement and projectiles correctly but it might not be long before we actually have little tanks running around doing battle with each other.

And now I give you pile o’ tanks:

Pile of tanks