IRB for Javascript

November 21, 2009 ziggurism Leave a comment

When doing some heavy exploration in Javascript, I was doing most of my trials in Firebug. This is tedious for because the cycle of making code changes in a text editor, then reloading Firefox, then finally stepping through to my new code is too long if you’re doing small changes repeatedly and rapidly.

Ruby comes with an interactive command line console that lets you play with code interactively without any of the overhead of writing code. There’s no text editor, no saving files, no loading programs. You can execute and inspect each line of code as soon as you can type it. It’s a wonderful way to explore.

Other prominent interpreted languages Python and PHP both also have interactive modes, so I checked to see if there is one for Javascript. And indeed there is! It turns out that you can just install Spidermonkey, which is the Javascript engine of the Mozilla project, ie Firefox. That’s pretty much the canonical version of Javascript, as far as I’m concerned. I mean, Netscape invented Javascript, and this code is presumably a descendant of Netscape’s. The Ubuntu repositories include the Spidermonkey engine as a standalone command line tool, without the web browser as a dependency. It’s exactly what I was looking for. Nice.

I wonder whether I can find a binary to install on my Mac too. Or whether webkit has something similar.

Exploring constructors in Javascript

November 20, 2009 ziggurism 1 comment

I came upon this Javascript tutorial by jQuery inventor John Resig (nod to John Gruber). It covered several advanced Javascript topics with the goal of explaining to the reader the meaning of a particularly esoteric bind method from prototype.js. It was fun, and I followed most of it pretty well, although I got a little lost by the end in the section about Enforcing Function Context.

The tutorial included a lesson on pages 3538 about Javascript constructors which interested me.

First a recap of basic Javascript OOP. In Javascript, objects are defined via functions. To construct an instance of this function, you use the new operator, like so:
function foo(x,y) {this.x = x; this.y = y; }
var instanceOfFoo = new foo(1,2);

Whereas if you want to use a function as a function, you simply call it, like so:

function bar(x,y) {return x + y; }
var valueOfBar = bar(1,2); //this is the standard function call
valueOfBar = bar.call(this,1,2); //this is a more reflective call
valueOfBar = bar.apply(this,[1,2]); //this is even more reflective

So new functionName() to construct an instance of functionName, the OOP object constructor usage of a Javascript function. And just functionName() to to call the function and gets its return value, the functional usage of a Javascript function. Note that if a function is to be used in the functional manner, it must include a return statement; otherwise the value of the function all will be undefined.

The two uses of a Javascript function have different syntax and different semantics. And if you use one where you’re supposed to use the other, your code can fail in unexpected ways. In particular, if you accidentally leave of the keyword new, you won’t get an object, instead you’ll get the return value of the function, or else undefined if there is no return statement.

In addition to the standard Javascript function call, I listed two additional ways to execute a function call which could be said to be more reflective, ie instead of requiring you to write the identifier for the function statically in the source code, it may be determined dynamically at runtime. The first of the two reflective function calls is the Function.call method, which requires you to list the parameters explicitly. The second is the Function.apply method. The second is the more reflective of the two, because it takes an array containing all the arguments, which can be constructed at runtime, rather than requiring they be listed explicitly in the time.

Of note for this blog post is that there isn’t a builtin method like Function.apply which works when using the function as an object constructor. There’s some syntactical incompatibility between the function call and the object constructor which precludes from saying something like new foo.apply(array).

End elementary Javascript recap.

So in the Javascript tutorial, Resig demonstrates some code which ensures that even if you accidentally leave off the new keyword when constructing an object:

function User(first, last){

if ( !(this instanceof User) )
return new User(first, last);

this.name = first + " " + last;
}

The addition of the two lines of code in red give us the functionality to preclude calling this function as a function instead of an object constructor. So if the context in the function is an instance of the calling function itself, then the function was called correctly as constructing an instance of the object. Otherwise, it re-calls the function correctly with the new keyword. Pretty straightforward.

But this code is too static. First we have to reference the particular function we’re in. Then we reference it again, as well as the argument list. If you wanted to rely on this functionality, you’d have to include these two lines in every object constructor in your code, and you’d have to modify the lines for the particular function name and argument list. A massive violation of the principle of DRY.

So then Resig changes the first of the two lines to remove the reference to the function:

if ( !(this instanceof arguments.callee) )
return new User(first, last);

arguments is an array-like object available within the scope of every function. (To make an honest array out of arguments, use Array.prototype.slice.call(arguments)). It contains a list of all the arguments passed to the function (arguments[i] is the ith argument passed to the function), as well as a reference to the function that was called (arguments.callee). We compare the function to the context of the function. The context is available in the function via the this object. If you call the function as an object constructor, then this stores the object instance being constructed, and that object is an instance of function which was called. This this instanceof arguments.callee is true. On the other hand, if you call the function as a standard function call, then this is the global context, usually the browser window where the code is executing, which is, needless to say, not an instance of the function called. So this instanceof arguments.callee is false.

So in the first of the two lines of code, we've successfully removed the reference to the particular function by replacing it with arguments.callee. But it's still present in the second line. We haven't really solved the problem at all. This is where Resig leaves the issue, but I wondered if we could do better. It turns out that we can also replace the reference to the function in the second line:

if ( !(this instanceof arguments.callee) )
return new arguments.callee(first, last);

This is a little better, we've removed all explicit references to the function. However, we still don't have complete generality, because in line two, we still have to list explicitly the arguments to the function, so the code can't be reused without modification. But since we have at our disposal an array containing all the arguments, I thought we should be able to accomplish it. Just like Function.apply allows you to make a function call with arguments taken from the contents of an array, we need something analogous for object instantiation. Something like new foo.apply(this,arguments).

Unfortunately, the obvious guess doesn't work, and after fucking around with different options for a while, I couldn't come up with anything that did. So I turned to The Google, which as always, had the answer. Someone poses the exact problem I'm investigating on stackoverflow, and Matthew Crumley posts a solution:

function construct(constructor, args) {
function F() {
return constructor.apply(this, args);
}
F.prototype = constructor.prototype;
return new F();
}

function User(first, last)
{
if ( !(this instanceof arguments.callee) )
return new construct(arguments.callee,Array.prototype.slice.call(arguments));
this.name = first + " " + last;
}

I've tested this out and it does the job. I imagine perhaps adding it to the Function prototype, so that every function can optionally call it to ensure that it's only used as an object constructor. I do have to say though, I haven't been able to completely understand how the construct function works. It seems to rely on knowing how Javascript internally turns a function into an object, or some other magic that is eluding me.

It's mostly a moot discussion for me. I don't think I would make use of this function. Although I feel like Javascript ought to have an apply method for constructors, or better yet the constructor syntax should be more natural, somehow so that the two uses of the Javascript function are not distinct. But whatever, this is the way Javascript works, and I feel like we should learn it, rather than forcing it to change, rather than correcting it. So I don't see using this method. But it is instructive as a purely academic exercise to learn how it works and think about how it can be extended.

Ubuntu 9.10 again

November 8, 2009 ziggurism 1 comment

I recently posted about a very bad experience testing out Ubuntu 9.10 Karmic Koala. What happened, as it turns out, is that I had installed Ubuntu 9.04 Jaunty Jackalope. I went to ubuntu.com on release day, and I saw 9.10 available for download, but I followed the link for the official torrent instead. I guess I didn’t notice that the link was still for the previous release. I guess they hadn’t uploaded the torrent file for the new release on release day.

So I downloaded the new version. Everything worked swimmingly. The weirdness in the installer was gone; it correctly showed my unallocated space next to my Windows partition and changed the color when I selected the option to install on free space side-by-side. It of course didn’t prompt me to upgrade the OS. Network services were discovered via bonjour and printing to my MacOSX shared printer worked out of the box. The WiFi indicator light doesn’t blink neurotically. And the complete meltdown problem wherein it randomly re-mounted my root partition readonly has not showed up. It’s been stable and all around a pleasure to use. The graphics effects are smooth. I’m very impressed.

Obviously the 6 month old Ubuntu 9.04 Jaunty Jackalope had some incompatibilities with the hardware in my 9 month old HP Elitebook 6930p. The newer kernel and other software included with the latest offering from Canonical seems to support my hardware completely. This is usual with Linux, that there is some lag between new hardware platforms and their support in Linux. So I apologize for maligning the usability of today’s desktop Linux distro. It’s top notch, and it was only due to my own errors that I thought otherwise.

Tethering hack on the iphone breaks Visual Voicemail

November 3, 2009 ziggurism Leave a comment

When I first enabled the tethering hack on my iPhone running 3.0 via BenM’s help page, Visual Voicemail stopped working. I did not notice this, partly because I don’t get many phonecalls, but mostly because I just wasn’t paying attention. After a while I started getting annoyed that people were calling me and not leaving messages.

During my update to iPhone OS 3.1, after I restored from a modified version of the fresh Apple IPSW image, my phone declared that I had some 20 voicemails or so. Turns out people actually had been leaving me messages, and I just hadn’t been seeing them, since my VVM wasn’t working. Apparently there’s something incompatible in BenM’s carrier settings profile that breaks VVM when tethering is on.

A few days ago, I updated to 3.1.2 and reenabled tethering via a new, more intrusive and in depth hack. Today it occurred to me to test the Visual Voicemail, see if it’s still broken with the new tethering hack on the 3.1.2 jailbreak. Of course it is.

A quick turn on the internet reveals this gem. The instructions on that page led me to check my profile in Settings -> General -> Profile, where I saw that my original BenM profile was still loaded. I loaded the new profile from that page, and all works. Tethering is there, and VVM is there. I’m very pleased. Much thanks to redmondpie and w1kedZ of PeacefulInsanity.com. I note that BenM’s help page does say he’s working on a hack for 3.1.2, but for now, I’m all set.

Hacking your pot in Apple’s Texas Holdem for iPhone

October 30, 2009 ziggurism 4 comments

In Apple’s Texas Holdem app, there are several venues where you can play, with different buy-in amounts. I’m not very good, so it takes me a long time to build up enough money to play the later venues. Since my iPhone is jailbroken, I can just manually adjust the amount of money in my Texas Holdem pot. Here’s how I do this.

User installed apps on the iPhone live at /User/Applications/sandbox_dir/appname.app, where appname is the name of the app in question, and sandbox_dir is a random string of 37 hex digits and hyphens. This string is an example of salt, and it is how Apple implements a per-app sandbox. For one app to interact with another’s data, it would have to guess the name of its sandbox directory, which is a statistical impossibility.

To discover which sandbox directory Holdem lives in, I run ls -d /User/Applications/*/* | grep -i holdem, which on my device yields /User/Applications/6FFC1F30-3ECB-45F2-9A26-6473B554A360/HoldEm.app/. The file /User/Applications/6FFC1F30-3ECB-45F2-9A26-6473B554A360/Documents/data is where all your game data are stored. How many games played, how many games won, how much money, etc. I had hoped for an Apple .plist, but it seems to be a straight-up binary file. With a little trial and error, one finds that the amount of winnings is stored in bytes 51 through 53 of this file. Note that they’re in reverse order. So if you want 0×123456 dollars, byte 51 should be 56, byte 52 should be 34, and byte 53 should be 12.

In summary, with a jailbroken iPhone named iphone_name, with OpenSSH installed:

  1. From a computer on the same LAN as the iPhone, copy the data file to the local computer: scp root@iphone_name.local:/User/Applications/'`ls -d /User/Applications/*/* | grep -i holdem | cut -f 4 -d \/`'/Documents/data .
  2. Edit the data file on your computer with a hex edit program, adding your desire money to bytes 51 through 53. FF FF FF to max out your money.
  3. Copy the file back to your iPhone with: scp data root@iphone_name.local:/User/Applications/'`ls -d /User/Applications/*/* | grep -i holdem | cut -f 4 -d \/`'/Documents/data

And that’s it. That’s my killer app justification for all the hassle of jailbreaking; cheating at poker. You get $16,777,215 dollars. Plenty of money to lose at Dubai 160 times.

Upgrading to iPhone 3.1.2, jailbreak and tethering

October 30, 2009 ziggurism 1 comment

Not too long after iPhone OS 3.1 came out, a minor update to 3.1.2. I didn’t bother with the update, since it had been such a hassle to upgrade to 3.1 and maintain my jailbreak. And I had lost my tethering hack.

geohot is the 17 year old kid from NJ who developed the very first iPhone jailbreak, which apparently involved soldering.
I had read how much easier to use purplera1n had been than the iPhone Dev Team’s PwnageTool and redsn0w. With the current generation of devices and OSes, geohot has just released blackra1n. For a while it looked like it was going to be Windows only, but he eventually did release it for the Mac too. It boasts the ability to jailbreak all iPhone OS devices released to date, running any firmware, thus simplifying greatly the menagerie of iPhone jailbreaking and unlocking tools. And since geohot had found a vulnerability in the new baseband firmware (05.11.07), I don’t need to hold on to old firmware, as I did with PwnageTool in jailbreaking 3.1. Although I understand the newest PwnageTool 3.1.4 now allows current baseband firmware too.

And holy shit, was it easy. Just launch the app, press a button, and you’re done. Much much easier and simpler and fun than PwnageTool. No building custom IPSWs, no hour long restores of your iphone, no giving it your admin password for reasons unknown. All in all, a very pleasant experience. It makes me not want to go back to PwnageTool.

The other news is about iPhone tethering hacks. I’ve been periodically checking the iPhone Dev Team’s blog and iClarified.com for news about this, with no results. Also just generally googling around the web turned up nothing. But today I decided to see if anyone was saying anything on twitter and I hit pay dirt. Here and, via this hit, here. I used the last one.

So you do a mysterious binary patch to /System/Library/PrivateFrameworks/CoreTelephony.framework/Support/CommCenter, reboot, and voilà! Tethering should work. Well, pretty much. When I opened Settings -> General -> Network and clicked on “Internet Tethering”, I got a popup that said something like “To enable tethering, please contact AT&T”. For a moment I thought it wasn’t going to work. But on a second try, I got the Internet Tethering control panel open, turned it on, and all worked beautifully. And apparently this hack will even be included in the next version of PwnageTool. That’s one thing that might tempt me to go back.

I’m very happy to have my tethering back. Kudos to the iPhone Dev Team!

Trying Ubuntu 9.10

October 30, 2009 ziggurism 1 comment

While I’ve been using Linux on my servers forever and am happy with it, I haven’t tried Linux on my desktop in several years, since grad school. So it’s been about 5 years since I saw the state of the art of the Linux desktop. At the time, my distro of choice was Gentoo. Compiling the entire OS from source on a 700 MHz laptop took obscenely long. Once it’s installed, keeping your software working is a constant struggle; you never know which software update is going to break X. And the UI was always borderline unusable.

Since then, my desktop computers have all been Macintoshes running Mac OS X. I gladly forsook Linux on my desktop for an operating system that Just Worked. I did like all the tinkering, and I missed that, but it’s paramount to be able to count on using your computer to get some work done.

Grad school was mostly before the meteoric rise of Ubuntu as the final solution to the user-friendly Linux distro question. Over the years I’d heard nothing but good things about the usability of Ubuntu. Finally Linux on the desktop is a reality. Too good to be true? Well today Ubuntu 9.10 Karmic Koala was released. And I happen to have an extra PC laptop I’m doing nothing with, so I decided to take it for a spin and find out. It wasn’t pretty. Actually, Ubuntu 9.10 Karmic Koala worked wonderfully. It was my error; I mistakenly installed an old version.

My first complaint was during the install. On the disk partitioning step, I was presented with several options: side by side install, use all free space, and advanced. I had wiped the drive a week before to install Win7 and had left a large partition in anticipation of this install. So the second option was for me. The UI gave no feedback about what partitions it would create, how large they would be, whether anything would be erased. It simply showed a single bar which indicated that the windows partition would be resized to take the entire disk. WTF?? I had to go back and play with it several times because it was so unclear whether it was going to do what it was supposed to. Bad.

It was a minor nit. And once the install is done, you never have to deal with it again. Once it was up and running, it seemed to be OK. I started poking around to see how much of my hardware was not recognized. The WiFi indicator light was blinking on and off, though the OS seemed to think the connection was good. A little weird, but OK. I started composing this blog post in the Ubuntu text editor.

The update manager launched, telling me that Ubuntu 9.10 had just been released, and that I should upgrade my system. A little weird, that’s what I’d just installed, but who knows, the final image may not have been entirely up-to-date, right? And who doesn’t want an up-to-date system? So I let it do its thing.

Then I left my computer for an hour, and when I came back, without any indication, the root partition had been remounted as read-only, and several of the windows had stopped refreshing. I had not saved my blog post, so I was unwilling to just reboot. It took me a while to figure a way to get the file off the system, what with the windows not working and the disk being mounted readonly. Finally I saved it to a Samba share on my Mac. With relief, I rebooted. Of course it hanged during the reboot, forcing a hard restart.

I’m about ready to wipe the partition, but I’ll give it one more try. Maybe I should’ve gone with Kubuntu anyway. I always liked KDE…

Keeping your bash history

October 8, 2009 ziggurism Leave a comment

One thing I want to remember to do every time I set up a new Unix account or machine is setup bash so that it remembers all my commands.  This may be accomplished by adding


export HISTCONTROL=erasedups
export HISTSIZE=100000
shopt -s histappend

to my shell init. The first one eliminates duplicates from shell history. The second raises the history length from 500 to 100,000 (I wonder if the limit can be removed altogether?). And the third one makes it so that history is appended. That way separate shell sessions don’t clobber each other.

This raises the question, exactly which file is the shell init?  Is it /etc/profile, /etc/bashrc, /etc/bash.bashrc, ~/.bash_profile, ~/.bash_login, ~/.profile, or ~/.bashrc? I am perpetually confused about this. I’m pretty sure you’re supposed to set your PATH in one of these files, not the others.  The profile files (/etc/profile, ~/.bash_profile, ~/.bash_login, and ~/.profile) are for login shells only (/etc/profile for all users of the system and ~/.bash_profile, ~/.bash_login, and ~/.profile for just the single user account), but if you’re setting environment variables and use the export command, then those variables are inherited by all shells (assuming that all shells are descended from a login shell.  Is that true?).  So it’s fine that my PATH is set in my ~/.profile.  All subshells will inherit.  This will also work for HISTCONTROL and HISTSIZE.  But what about the shopt built-in?  If I set that in ~/.profile, subshells will not inherit the histappend option.  I believe (but am not positive) that I do want all history saved, even subshells (for example, this means if I write a bash script and execute it, all the commands in the script will be saved to my history.  That doesn’t seem too desirable, but it’s always better to err on the side of saving data, rather than losing data, right?).  But if I put it in ~/.bashrc, then login shells won’t have it.  Why isn’t there a shell setup for _all_ shells?  Should I put it in my ~/.profile, and then source that in my ~/.bashrc?  But this would destroy the ability to distinguish the two use modes.  I guess I will just add the command to both ~/.profile and ~/.bashrc.

A shell without these flags turned on has broken history. It’s a must-do. I had turned these on in my MacBook Pro, but a while back the HDD failed, and it got re-imaged by the Apple Genius. I never turned it back, so now I’m missing some history that I need access to. Mental note: always do this.

Via the macromats blog.

Categories: Uncategorized Tags:

iPhone 3.1 now jailbroken

October 7, 2009 ziggurism 2 comments

Two nights ago, the iPhone dev team announced that the jailbreak for iPhoneOS  3.1 on the 3GS is now available albeit only to users with an already jailbroken iPhoneOS 3.0.  I am such a user, and I’d been champing at the bit waiting to the upgrade but not wanting to lose my jailbreak, so I was eager to get started.  I basically followed the excellent instructions on iClarified.com.

I’ve understood that one of the challenges is that the new iPhone 3G S has some hardware change (so these remarks do not apply to the iPhone 3G or original model) whereby iTunes requires to authenticate with Apple’s server any firmware image before it will install it.  One consequence is that it’s no longer possible to downgrade.  So if you upgrade to 3.1, you cannot downgrade back to 3.0, as Apple is no longer authenticating the 3.0 ipsw image.  And of course you cannot load non-Apple ipsw.  I’m not sure how they got around this for the new jailbreak.

  1. Update all applications in iTunes
  2. Update all applications on iPhone
  3. Transfer purchases from iPhone to iTunes
  4. Sync
  5. Backup iPhone
  6. Restore from backup.  This forces iTunes to tag the backup with a timestamp, and it will be kept even after subsequent backups, rather than overwritten as is normally done.
  7. Download PwnageTool 3.1.3
  8. Have iTunes download only, not install, the iPhoneOS update.  Copy update file.  $ cp ~/Library/iTunes/iPhone\ Software\ Updates/iPhone2,1_3.1_7C144_Restore.ipsw ~/pwn
  9. Copy PwnageTool to disk and run in expert mode, opening Apple’s vanilla ipsw, and saving the new custom ipsw.
  10. Put iPhone into recovery mode.
    • Note 1: Recovery mode (instructions here) is different from DFU mode (instructions here).  I tried this several times in DFU mode (with a black screen) thinking I was in recovery mode.  Every time iTunes failed to update with the custom ipsw.  Luckily I did finally guess that there was a difference between the two, and that I was in the wrong one.  But then I couldn’t figure out how to exit DFU mode, so I thought I had no choice but to restore to Apple vanilla 3.1 ipsw since the 3.0 ipsw are no longer authenticated by Apple’s server.  I almost panicked and did the vanilla 3.1 restore, which would have killed my chances at a jailbreak for now, and possibly forever.  Finally I did get out of DFU mode through some combination of home and power button.
    • Note 2:  iClarified’s instructions for getting into recovery mode (hold home and sleep/wake until screen goes black, continue holding home and release sleep/wake) did not work for me.  I used these instructions (turn off, hold home button while plugging in to iTunes) at ihackintosh instead.
  11. Once the iPhone is in recovery mode, plug in to iTunes, it will prompt you that your are in recovery mode.  Do not hit the restore button!  I did this the first time I jailbroke, resulting in a complete wipe of my iPhone (not too big a problem if you backed up).  My buddy did this last night.  Instead you must option-click, to open a file browser dialogue.  Navigate to your custom ipsw.
  12. As all photos, apps, and music are gone, we must now sync.
  13. Backup again.  If you skipped step 6, this backup will overwrite your pre-upgrade backup.

It was a lot of steps, and it took a long time.  I was at it pretty much all night.  But it’s done.  I now have a jailbroken iPhone 3G S running iPhone OS 3.1.  I do note that my baseband firmware (Settings -> General -> About: Modem Firmware) is still stuck at 04.26.08, whereas new iPhone 3GSes and legitimate 3.1 upgraders have 05.11.07.  So the cost of keeping the jailbreak is that I can no longer run up-to-date iPhone baseband firmware.  Could that affect call quality or reception?  Don’t know.

I’m not sure how much longer I’ll be willing to go through all that pain in order to have a jailbroken phone.  I like having OpenSSH on my iPhone, so I can copy files to and from its filesystem, including preference files for applications I use on my phone.  But it’s not something I rely heavily on.  I’ve installed QuickReply, a modification to the stock SMS program which allows you to reply to an SMS without leaving the application you’re in.  It’s a handy feature, but the UI is so terrible (it simply overlays SMS on top of whatever application you’re in) that it leaves me with a gross feeling.

I had enabled tethering on my iPhone 3G S using the carrier settings download at BenM’s iPhone Help Center.  Tethering was a must-have feature for me, one that had kept me from getting an iPhone before, though I did finally take the iPhone plunge.  With iPhone 3.0, tethering was supported by the OS, but not switched on by AT&T.  BenM made it possible to toggle that setting on.  Better yet, you didn’t have to pay service charges for it.

My previous phone before the iPhone, and my first smartphone, had been an AT&T Tilt (the AT&T branding for the HTC Kaiser) running Windows Mobile 6.  The same thing had been possible with that phone; there’s some hidden application in the Windows System directory which turns on tethering.  BenM made that possible with iPhone 3.0.

Unfortunately, it seems that iPhone 3.1 has removed the tethering preference.  I’m hoping that my jailbreak status will restore it for me.  I suppose it won’t be much longer before AT&T rolls out official support.  I don’t much fancy paying another $15 or $30 per month for something that I only use once in a while.

Choosing a platform for my blog

October 1, 2009 ziggurism Leave a comment

For personal coding projects, I decided to abandon PHP as my web platform of choice, a decision which deserves its own post.  After a lot of reading and shopping and experimenting, I tentatively decided to go with Ruby on Rails as my new web platform of choice.  Other options I liked were python frameworks Django and TurboGears, the Smalltalk framework seaside (which is built on the interesting idea that continuations are natural for a web app that doesn’t want to be stateless), and LISP.

Following in the footsteps of Jacques Distler, I decided that if I was going to switch platforms away from PHP for personal code projects, then it makes sense to also favor a move from PHP for tools (blogs, wikis, etc) I employ.  Basically, if you’re using some open source software, and there’s a chance you’ll want to modify the code, then you need that software to be on a platform you want to work on.

So after I decided to ditch the PHP blogging app WordPress, I wouldn’t even look at Movable Type, also PHP.  I instead started looking for a rails blogging software.  There seemed to be only one of any popularity, viz., Mephisto.  With the decision in hand, I’m ready to install.