Jul 3rd, 2009
by mzanussi.
I finally got fed up seeing __MyCompanyName__ in all my Xcode generated code:

However, there doesn’t seem to be an preference in Xcode for specifying the actual name of your company or whatever text you wish to use. So, you have to change it in a not-so-obvious way. There are two ways to accomplish this.
Option #1
Via terminal, specify
defaults write com.apple.Xcode PBXCustomTemplateMacroDefinitions '{"ORGANIZATIONNAME" = "michaelzanussi.com";}'

Option #2
Via the Property List Editor, in a less geeky manner I must admit, add the key-value pair to com.apple.Xcode.plist located in $HOME/Library/Preferences

Whichever option you choose, be sure to restart Xcode for the change to take effect.
Here’s what your newly generated code should now look like:

Posted in: Xcode.
Tagged: development · MyCompanyName · Xcode
Jul 3rd, 2009
by mzanussi.
It’s not spectacular, but everyone must start somewhere.

Black Bear Pass (Colorado) — Warn winch advertisement, ca. 1975
Posted in: iPhone.
Tagged: development · Interface Builder · iPhone · Mac · Objective-C · Xcode
Jun 19th, 2009
by mzanussi.
It’s not really obvious how to do it on a Garmin GPSmap 60CSx, but below is a series of screen capures showing you the steps.
Here’s the Map screen. Looks kinda busy.

Press the Menu button and a menu will popup.

From the menu, select Setup Map and press the Enter button. You’ll now be presented with the following screen and a series of 6 tabs:

Cursor over to the Information tab (the one with the ‘i’ in a circle) and press the Menu button again, popping up a new menu.

Now you can Hide or Show whatever maps you want, individually or all at once. Here’s my (now boring) display with the Colorado topo map hidden:

Posted in: geek.
Tagged: Garmin · GPS · map
Jun 19th, 2009
by mzanussi.
Having downloaded and installed Colorado and New Mexico topo maps onto my Garmin GPSmap 60CSx, I wanted to post a tutorial on how to de-clutter the GPS display by disabling unnecessary maps. It’s a bit difficult for the reader to follow along without some visuals from the GPS, so I found a clever way to capture the Garmin’s display. Here’s how to take screenshots on your Garmin.
1. Download and install the DNRGarmin GPS application.
2. Next, run the app, connect your GPS, and from the GPS menu, select Garmin Screen Shot:

3. From the GPS display window and File menu, choose Save Image to File:

4. The result is a nice BMP image of your Garmin display:

Posted in: geek.
Tagged: Garmin · GPS · image · map · screenshot
May 19th, 2009
by mzanussi.
Running pdflatex under Ubuntu 9.04 yet was producing the following error:
! LaTeX Error: File 'kvoptions.sty' not found.
The fix was easy enough, simply install texlive-latex-recommended and the error will disappear.
Posted in: Ubuntu.
Tagged: LaTeX · Ubuntu
May 19th, 2009
by mzanussi.
I love LaTeX, the markup language for typesetting documents, using it for everything from my CS classes, to specifications at work, even versions of my resume. Well, it looks like Microsoft Word 2010 will finally offer similar typesetting in the form of OpenType ligatures. It’ll be nice to see how that pans out, and if the academic community will embrace it.
Posted in: cs, geek.
Tagged: computer science · LaTeX · Microsoft · OpenType · resume · specifications · typesetting · Word
May 6th, 2009
by mzanussi.
I love retro game articles, like this one about Rogue, the Unix classic text-based dungeon crawler. I remember playing this a lot while at Tech back in the day.

It was re-imagined at some point in a MS-DOS version called Moria, which I found even cooler than Rogue, thanks to the ability to shop for items and choose your character class. Now, I hear there’s a modern roguelike version for the Wii called Final Fantasy Fables: Chocobo’s Dungeon. I will be checking that out, definitely.
Posted in: geek.
Tagged: games · good 'ole days · interactive fiction · Unix
Apr 28th, 2009
by mzanussi.
I’m back from Genesys G-Force 2009 and overall it was a good experience. The general conference and breakout sessions were particularly informative and entertaining, and as expected a lot of focus was on today’s economic reality and its role on the contact center, and as far as this year’s theme “Transform Customer Experience” is concerned, that meant more customer self-service and a greater reliance on proactive contact, both of which my company has been working on for quite some time. It’s good to know we’ve been on the right track.
Certainly conferences such as this one are about pushing new products, and the Cross Channel Communications (3C) meme and Genesys 8 was everywhere. I was impressed with v8 features like support for W3C standard CCXML and the new Genesys Composer IDE, built on Eclipse. iCFD (intelligent Customer Front Door) is an interesting concept whereby the customer experience is tailored to “who I am and what I’ve done before” (think personalized IVR menus and self-service options). We’ve been doing something similar for a while now, integrating our IVR applications with our CRM based on caller’s ANI and other info we know about or ask them, and then customizing the IVR on-the-fly. iCFD is a bit more slick and refined, to be sure, interfacing with various components and allowing the business to tweak the system as needed, something we can’t do quite so easily.
I was a bit surprised to hear from one of the presenters that around 23% of call centers utilize outbound campaigns to proactively contact customers. I didn’t realize that percentage would be so low, but with this economy that number is increasing very quickly as more and more companies begin to reach out to customers before they have issues and reduce overall costs of handling inbound calls. Obvious examples here might be homeowner’s who are nearing their payment grace period reminding them their mortgage is due or letting people know their will be a cable outage in their area next week. Outbound is a great way to reduce inbound calls, where the cost difference can be significant ($.50 per outbound call vs. $5.30 per inbound call.) So, start identifying those events that trigger inbound calls and develop outbound campaigns instead!
There is also the new reality that customers expect fulfillment in Internet time at any time. It’s an impatient generation, one that expects information and results instantaneously, and not tomorrow or even an hour from now. Many callers don’t want to talk to a CSR, they expect their needs to be handled in an automated fashion, and that means via the web or expanded self-service options in the IVR. Of course, the trick is figuring out how to provide all those automated services to our customers. That should keep us developers busy for a while.
G-Force was only two days, but I certainly came away more motivated to provide a better experience for our customers while reducing our costs at the same time. Pretty obvious goals, but more so important in this economy.
Posted in: Genesys, IVR, VoiceXML.
Tagged: Eclipse · economy · G-Force · Genesys · inbound · IVR · outbound · self-service
Apr 15th, 2009
by mzanussi.
How much energy does spamming consume? Approximately 33 billion kilowatt-hours per year, according to ICF. That’s a lot of energy, the amount some 2.4 million homes typically use in a year. However, with spam filtering in place, the energy savings approach 135 billion kilowatt-hours, or enough energy to power 9.8 million homes. (In terms of cars spewing greenhouse gasses, that’s the equivalent of taking 13 million cars off the road).
Of course, attacking the source of spam would make spam filtering unnecessary. (Good luck with that.)
Read more over at Richi Jenning’s blog.
Posted in: spam.
Tagged: energy · green · spam · spam filter
Apr 8th, 2009
by mzanussi.
The upgrade to Genesys 7.6 in December went off pretty much without a hitch, and with the upgrade came changes to T-Server and URS logs so I’ve been spending some time during the last quarter updating Genalyze. I’ve also found some spare time to continue with Leafpile development, both Java and Objective-C implementations.
Needless to say, finding time to work on these projects has been difficult, considering there is still work, home, and play to fit in. But I’m finding it, somehow, even with a new season of MythBusters arriving, kernel hacking, not to mention the start of the baseball season. Go Cubs, it’s finally next year.

G-Force in just 12 days, see you in Orlando.
Posted in: Genesys, Java, Objective-C, geek, projects.
Tagged: Cubs · G-Force · Genalyze · Genesys · Java · Leafpile · Linux kernel · Objective-C · open source · Ubuntu
Mar 23rd, 2009
by mzanussi.
Between submitting a paper to this year’s Genesys G-Force conference and some serious geeking out with respect to Linux kernel hacking, I haven’t bothered with a post in 6 weeks or so. Too busy, or too focused to bother, I guess. See, too serious:

My paper on Post-call Surveys and Outbound Contact didn’t make the cut this year, but I’ll still be attending the G-Force conference in Orlando the end of April, anyhow. With the way the economy has shaken out, it’ll be interesting to see the turnout, not to mention the speaker topics. I’d be surprised if the overall theme wasn’t related somehow to maximizing call center savings using Genesys as a primary tool in achieving such a goal. That was the idea behind my speaker submission, but alas, it fell a bit short. Maybe next year.
Needless to say, the uncertainty in this world economy and the growing number of unemployed has underscored the need for the technically-minded to sharpen their skills and keep them up-to-date, so that we may be competitive should the worst happen. In this vein, I thought it’d be kinda cool to look at the Linux kernel as a way to keep fresh my C programming skills, plus further develop my understanding of Linux. Now, to find a good book on developing Linux device drivers…
Posted in: Genesys, geek.
Tagged: C# · Genesys · Linux kernel · operating systems
Feb 5th, 2009
by mzanussi.
I had Mac’s LCD replaced this week to resolve the 1-pixel wide aberration that popped up a few months ago. Did you know Apple Part Number 661-4184, a 24″ LCD assembly with inverter board and gasket, runs around $928.13?
I didn’t.
Shocking as it was, it didn’t cost me a dime because I bought the AppleCare Protection Plan when I bought Mac back in 1997. As you can see, it turned out to be a good purchase, because this fix didn’t cost me a dime.
Now, I’m normally one to say that extended warranties are a rip-off, but years ago when I researched my first laptop purchase, the concensus was that you should get at least a 3-year warranty with one. Because of the expensiveness that comes with laptops, I suppose, the warranty is generally worth it. I figured I’d extend that same logic to Mac. I’m glad I did. (That’s not to say Macs break down more than any other computer; it’s that they’re damn expensive to repair.)
Posted in: Mac.
Tagged: LCD · Mac · service
Jan 28th, 2009
by mzanussi.
Or not. Who thought the Singleton pattern could be so unliked? My first inkling was it was too much like a global variable, something my early profs in CS warned me to avoid at all costs, but I could see its potential uses, so why not give it a try, at a minimum just to say I’ve tried it, given it a fair shake.
I have. And I like them, I’ll admit. But still, I wonder, is dependency injection the better alternative? Seems that a lot of people think so, and I tend to think it’s a much more elegant approach. I don’t know, the verdict is still out for me, I still have a lot more reading to do on the subject. As it turns out, Design Patterns is my current Bus Book, so I’m sure to be thinking a lot more about this in the days, weeks ahead.
Yes, I am a geek.
Posted in: OOP.
Tagged: bus book · dependency injection · design patterns · object-oriented
Jan 5th, 2009
by mzanussi.
The ThinkPad received an OS upgrade this weekend. Not to Windows Vista, but to a brand new installation of Ubuntu instead. XP, while quite nice and serviceable, was simply running too slow, even after a fresh install back in October, and I really didn’t feel like re-installing again or worse, upgrading to Vista.
It was a no-brainer then to dump Microsoft altogether and move to Ubuntu permanently, my distro of choice. Except for a small issue with sound not working, the Ubuntu installation was virtually painless. The ThinkPad will continue to be my Java development box, and while I still do Java dev work on Mac, I prefer to use it strictly for Objective C and Cocoa.
That’s not to say I’ve left MS for good. I still run XP on my Mac via Parallels, because I enjoy C# and Quicken runs best on Windows. But it’s looking like it’s only a matter of time before I move completely away from MS. Am I the only one? Hardly, and I’d be surprised if Microsoft weren’t concerned. They should be.
Posted in: Ubuntu, projects.
Tagged: C# · Cocoa · Java · Mac · Microsoft · Objective-C · Parallels · ThinkPad · Ubuntu
Dec 29th, 2008
by mzanussi.
Because it hasn’t crashed since I upgraded to Parallels 4.0 in November. Very nice.
However, I now have a green, 1-pixel wide, vertical line running up the right side of the LCD that appeared out of nowhere one day. That I can actually live with; the random reboots, I cannot.
Still, I have a 3-year warranty on Mac, and I’ll be taking it in the first of the year sometime to get this minor annoyance taken care of.
Posted in: Mac.
Tagged: LCD · Mac · Parallels · random reboot · service · video issues
Nov 29th, 2008
by mzanussi.
Coming back to work from the Thanksgiving holiday, we were greeted with some IVR strangeness. Seemingly random error events were being thrown in our IVRs every fourth or fifth call, causing callers to be transferred to an agent rather than allowing them to continue in a possibly unstable IVR.
After ruling out database and application server issues it was noticed quickly that one of our GVPs was generating an awful lot of logs, in particular, I was seeing a ton of VXML errors in the popgateway logs from two separate JSPs. Example:
VxmlUtil.cpp:3481 C=12:L=1:U=321 VXML Error: event(error), message(), element leaf_Document->vxml->[OfferVCB] form1->[VCBChoice] field1->prompt2
@http://orappr5.example.com:7777/VCB/pages/OfferVCB.jsp), current url (http://orappr5.example.com:7777/VCB/pages/OfferVCB.jsp)
NetMgt.log was also reporting problems:
TrapInterface.cpp:651 C=5:L=2:U=0 Trap [cnAsrOsrRzCreateError] filtered out!
TrapInterface.cpp:578 C=5:L=2:U=0 TRAP: cnAsrOsrRzCreateError
TrapInterface.cpp:579 C=5:L=2:U=0 OID: .1.3.6.1.4.1.3814.29.1002
TrapInterface.cpp:619 C=5:L=2:U=0 wdProcID: 3820
TrapInterface.cpp:619 C=5:L=2:U=0 wdProcName: popgateway1
TrapInterface.cpp:619 C=5:L=2:U=0 cnTrapSeverity: 3
TrapInterface.cpp:619 C=5:L=2:U=0 cnResellerName:
TrapInterface.cpp:619 C=5:L=2:U=0 cnCustName:
TrapInterface.cpp:619 C=5:L=2:U=0 cnApplName: GenesysCSA
TrapInterface.cpp:619 C=5:L=2:U=0 cnSessionId: {CD153988-3C08-4CFF-98D9-677244B501E4}
TrapInterface.cpp:619 C=5:L=2:U=0 cnTimeStamp: Mon Dec 01 12:20:45 2008
TrapInterface.cpp:619 C=5:L=2:U=0 cnTrapDesc: Error creating Server Session object. SWIrecResourceAllocate() failed.
TrapInterface.cpp:624 C=5:L=2:U=0 MESSAGE-STRING: TRAP=cnAsrOsrRzCreateError&OID=.1.3.6.1.4.1.3814.29.1002&wdProcID=3820&wdProcName=popgateway1&cnTrapSeverity=3&cnResellerName=&cnCustName=&cnApplName=GenesysCSA&cnSessionId={CD153988-3C08-4CFF-98D9-677244B501E4}&cnTimeStamp=Mon Dec 01 12:20:45 2008 &cnTrapDesc=Error creating Server Session object. SWIrecResourceAllocate() failed.&
It turns out that power had been lost in the server room that housed the GVPs over the weekend and while all seemed well after power was restored, the problem reared its head when call volume spiked Monday morning. While GVPs 1, 3 and 4 were operating normally, something became hosed on GVP 2 when the system unexpectedly went down.
A warm reboot of the box containing GVP 2 resolved things.
Since we’re due an upgrade to 7.6 in just a few days, I’m not sure what more root cause analysis can be performed. It’d be nice to know what really caused this issue, but we may never know.
Posted in: Genesys.
Tagged: Genesys · GVP · IVR · NetMgt · PopGateway · power · VoiceXML
Oct 18th, 2008
by mzanussi.
World of Warcraft Patch 3.0.2 a.k.a. “Echoes of Doom” was released this week. It’s a massive patch, 1.2GB to be exact, containing a lot of code for the forthcoming release of Wrath of the Lich King this November. Unfortunately, patches are not perfect and problems are sometimes introduced.
For those of us using the Mac client, and this seems particular to Mac OS X 10.5.5 users, there is now a very noticeable and quite annoying flicker during game play, especially when in towns and cities, within structures, or around trees. I have noticed this with previous patches, but it was the rare occurrence. However, with Echoes of Doom, it’s happening all the time. Drives one nuts, it does.
Fortunately, there is a fix.
Exit the Mac client and edit config.wtf, which is located in the WTF directory in the World of Warcraft installation directory. Add the following line to the end of the file:
SET fixedFunction “1″
Save, then restart the client. No more flickering.
Update 22 October 2008: Looks like the additional setting does not work. However, I’ve found another solution, and so far so good, I’ve played a few hours with zero flickering. Prior to the patch, I’d been running in full-screen mode. To stop the flickering I switched to Windowed Mode, which you can find in the Resolution settings under Video options.

Additionally, checking Maximized basically gives you the full-screen mode feeling.
I’m crossing my fingers hoping this finally gets rid of the annoying flickering and flashing once and for all.
Posted in: Mac, World of Warcraft.
Tagged: flickering · Leopard · patch · video issues · World of Warcraft
Oct 16th, 2008
by mzanussi.
It’s Parallels again.
I had just launched Visual C# when Mac froze for a moment, Parallels crashed, and the screen wiped gray with this lovely dialog box in the center:

Upon restart, Mac mocked me further:

As if I needed to be reminded.
Parallels is useful, but it sure blows sometimes.
Posted in: Mac.
Tagged: crash · gray power button · Mac · Parallels
Oct 8th, 2008
by mzanussi.
Today, I was updating one of our EJBs to support some existing functionality of an Oracle stored procedure of ours. It’s a very straightforward function that adds a contact note to a customer’s account record and returns a boolean indicating whether the insertion was successful or not. I thought it was going to be a no-brainer, but I kept getting java.sql.SQLException: Invalid column type exceptions thrown by CallableStatement.

We access dozens and dozens of stored procedures from our EJBs and have never had this issue before. The SP tested fine, it wasn’t that, so I decided to look at a few other SPs we execute and see what was so different about this one.
What I found was while we normally handle SPs that return a cursor or an integer, for example, this was the first time we were trying to implement a SP that returned a boolean value. I didn’t think that was a big deal, but with further research, it turns out it is.
Per Oracle here, BOOLEAN return values are not supported:
It is not feasible for Oracle JDBC drivers to support calling arguments or return values of the PL/SQL types TABLE (now known as indexed-by tables), RESULT SET, RECORD, or BOOLEAN. There are currently no plans to change this. Instead people are encouraged to use RefCursor, Oracle Collections and Structured Object Types.
As a workaround, you can create wrapper procedures that handle the data as types supported by JDBC.
I did not know that.
But now I do and with a wrapper function in place, my EJB is happy again.
Posted in: Java, Oracle.
Tagged: EJB · JDBC · Oracle · SQL
Oct 8th, 2008
by mzanussi.
In my last post, I wrote about OAS caching causing a problem after a server move. Since it affected production, it was a big deal.
Caching causes us other problems, though, typically in our development environment, where it may not be a huge deal but is annoying nonetheless.
<rant>
Take for example deploying applications. This snippet from our application server log shows what can happen:
javax.naming.NamingException: Error instantiating web-app
JNDI-context: No location specified and no suitable
instance of the type 'com.example.SomeRandomEJB' found
for the ejb-ref ejb/SomeRandomEJB
The exception has absolutely nothing to do with the bean I was actually working on, it’s just some goofy caching weirdness occurring during redeployment. It is easily resolved by bouncing the container. Which apparently refreshes Oracle’s caches. This happens maybe 1 out of 6 time, it’s a nuisance and a headache. I’ve learned to deal with it.
</rant>
Posted in: Oracle.
Tagged: application server · caching · Java · OC4J Wireless · Oracle
Sep 11th, 2008
by mzanussi.
I came into the office this morning to find a bunch of errors in our Oracle application server logs. It appeared that our post-call survey app was timing out on a section of code that retrieves application options from the CME, in particular the openConnection() method in CfgInfoDesktopConfiguration couldn’t make a connection to Genesys configuration manager.
A production server move had occurred the night before, so it seemed obvious the problem had to be related to that. There was an IP change with the move, but we didn’t have issues pinging the box by name or IP, so we knew the change had propagated across the network.
A test app running on a development app server proved that the server move didn’t affect that connection, so we knew it was only the production app servers having this issue.
The consensus from everyone seemed to be that the application server was somehow caching the old IP address or was still using an existing connection that was no longer valid. I’m no expert on the OAS, so who knows. Turns out that all we needed to do was bounce the OC4J_Wireless container on both middle-tiers, and problem solved.
When in doubt, sometimes it’s just best to start by bouncing the container. Our DBA is investigating…
Updated to add: From an application deployment standpoint, we bounce the containers all the time, it’s nothing new for us. On our development servers, sometimes apps work immediately after redeploying without a restart, sometimes they don’t. On production, it’s our policy to perform a bounce after redeployment, no matter what. I seem to recall running across Oracle documentation years ago that recommended a container restart in redeployment/deployment situations. Such is the nature of caching, I guess, and now we have another situation where container restarts are proving necessary.
Posted in: IVR, Oracle.
Tagged: application server · caching · Genesys · IVR · OC4J Wireless · Oracle · post-call survey
Sep 10th, 2008
by mzanussi.
I just finished reading Stephen Kochan’s Programming In Objective-C. Since I’ve been wanting to do some Mac and iPhone development, I figured this was a good place to start.
Overall, I thought it was a good effort, but certainly not the best. On the negative side, I found a surprisingly large number of grammatical and spelling errors. That always irks me when it comes to technical books, since for the price you are paying, you’d expect a much better effort at proofreading and editing. Also, while the book claims you don’t have to have prior programming knowledge, my guess is that certain OO concepts might be difficult to grasp at first unless you’ve encountered a language like Java or Smalltalk previously. However, if you have been doing any kind of object-oriented programming, you’ll get up to speed fast with Objective-C. And that’s another positive for this book, it’s a quick read. Kochan doesn’t waste time and gives you good examples right out of the gate. Don’t expect in-depth coverage, however; it is, after all, only an introductory text.
I’d definitely recommend the book if you have prior programming experience. If you don’t, I’m not sure this is the best book to start with (of course, I wouldn’t know what else to recommend in its place.) Also note that the current version DOES NOT cover the current version 2.0 of Objective-C. The good news, though, is Kochan’s update is set to release at the end of November, 2008. Wait until then.
Up next: Cocoa: Programming for Mac OS X.
Posted in: Mac, Objective-C.
Tagged: development · Mac · object-oriented · Objective-C · OS X
Aug 22nd, 2008
by mzanussi.
Mac has been running great since I had the hard drive replaced a few months ago. No more lengthy pinwheel spinning and not a single flashing question mark folder in all those days.
However, Mac did perform a random reboot tonight, which when it happens is a bit startling. Thinking back, I believe it’s done it one other time since I’ve owned the machine. In other words, quite rare. I can’t recall what triggered it last time, nor am I really sure what happened this time, but I’m leaning towards pointing the finger at Parallels, since I was poking around with Office 2007 and its PDF/XPS plug-in when the reboot occurred.
Parallels will blow every so often, courtesy of Windows I gather, so I shouldn’t be the least bit shocked. But I only ask Windows Parallels to contain its Windows blue screen of death to the virtual machine only, and not infect Mac.
Pretty please?
Posted in: Mac.
Tagged: BSOD · Mac · Parallels · pinwheel · question mark folder · random reboot
Aug 21st, 2008
by mzanussi.
A GoDaddy hosted website of mine had the annoying habit until recently of displaying a HTTP 500 Internal Server Error page whenever an invalid, nonexistent URL was specified, rather than the expected HTTP 404 Not Found error. Annoying because I had a custom 404 error page defined and setup for the site, but for whatever reason GoDaddy was ignoring and showing a 500 error instead.
I let the problem slide for a while, but revisited it tonight, for whatever reason. The culprit, it turns out, was an old WordPress installation, which ultimately led me to the .htaccess file living in the root directory. Being not that familiar with Apache, I pretty much ignored the file in the past. Curiosity got to me, however, and sure enough I found WordPress was the only application referenced in it. I went ahead and removed the .htaccess file, and now I no longer get the 500 error but rather my custom 404 page.
Problem solved.
Posted in: web.
Tagged: .htaccess · http 500 internal server error · web · weird · WordPress
Aug 17th, 2008
by mzanussi.
I ran across a Riven 5-CD disk set while I was cleaning out a desk today. Myst was such a cool and revolutionary game when it first came out, but I think Riven was even better. It’s hard to describe the genre Myst and Riven reside in, kind of a cross between adventure, fantasy, and interactive fiction (even though it’s all graphics).
It had been a good 10 years since I last played it, I really wanted to relive the experience. Although the requirements were for a Windows 95 box, it installed smoothly on XP and required only a bit of tweaking. Plus, I was able to get it to run strictly off HD; no CD swapping necessary.

Riven: The Sequel To Myst, in all its glory. Running on XP under Parallels.
If you’ve never played Myst or Riven, I’d highly recommend you get a copy somewhere and play it. Well worth your time.
Posted in: interactive fiction, retro.
Tagged: interactive fiction · Myst · retro · Riven