Showing posts with label software. Show all posts
Showing posts with label software. Show all posts

Saturday, December 2, 2017

Creating A New MIME Type

I struggled a bit this afternoon creating a new MIME type and associating it with a particular application, so I'm going to archive the solution here for future reference. This was on a Linux Mint system, but I found the key information in a GNOME documentation page, so I suspect it works for Ubuntu and other systems using a GNOME-based desktop (and maybe even more generally?).

The application in question is FreeFileSync, an open-source program (that I definitely recommend) for syncing directories. I use FFS to sync mirror certain directories in my home partition to an external drive. For each such directory, I have a FFS configuration, created in the FFS GUI and stored in a separate XML file (with extension .ffs_gui).

Unlike applications installed from .deb files (where the installer handles the MIME-type stuff for you), FFS comes as an archive that you simply extract and park somewhere, so it does not create its own MIME-type or associate itself with an existing one. On my PC, Mint (with the MATE desktop environment) associated the extension .ffs_gui with XML files in general, so making FFS the default program for .ffs_gui files would have made it the default for all XML files, which is clearly undesirable. So I decided to create a MIME type for it. I also decided to store the necessary information in my home partition, rather than changing system files, so that a future system upgrade would not clobber the changes.

Google searches produced a variety of (rather complicated) solutions, one or two of which I tried but failed to get to work. Fortunately, the steps on the GNOME page mostly did work. First, I created ~/.local/share/mime/packages/application-x-freefilesync.xml as instructed, naming the new MIME type application/x-freefilesync and setting the glob pattern to *.ffs_gui. Second, I created a new desktop file (~/.local/share/applications/freefilesync.desktop) using the new MIME type and pointing to the FFS executable. Finally, I ran

update-mime-database ~/.local/share/mime

and

update-desktop-database ~/.local/share/applications

(as myself, not as root).

The GNOME page suggests using the gio program to verify the results, but I don't have that installed on my system. What did work was to open a terminal in the directory where the FFS configuration files were stored, pick one (say, foo.ffs_gui) and run

xdg-mime query filetype foo.ffs_gui

to query its MIME-type, confirming that the result was application/x-freefilesync.

After that, I right-clicked foo.ffs_gui in the file manager (Caja, on my system), chose Properties > Open With, added FFS and made it the default for all .ffs_gui files, and that was that.

Friday, November 3, 2017

CPLEX 12.8: Generic Callbacks

IBM is getting ready to release CPLEX 12.8, and I had the opportunity to attend a presentation about by Xavier Nodet at the 2017 INFORMS annual meeting. Here are links to two presentations by Xavier: CPLEX Optimization Studio 12.8 - What's New and CPLEX 12.8 - the Generic Callback. As with any new release, there are multiple tweaks, performance improvements and some new features. What I want to focus on in this post and the next post or two (depending on how wordy I get) is a major change to the way CPLEX implements callbacks.

I'm going to assume any reader continuing beyond this point knows what a callback is (and, for that matter, knows what CPLEX is). The callback system used through CPLEX version 12.7.1 is now being referred to as the "legacy" callback system. A new system, beginning in version 12.8, is called the "generic" callback approach. I'll outline what I think are the key take-aways here, but if you are a callback user, I strongly suggest you check out Xavier's slide show  linked above.

The first thing to know is that, for at least the near future, CPLEX will continue to support legacy callbacks. That's important for two reasons: it may take time to adjust to the new generic callbacks (and to port code to the new system); and not everything you could do with legacy callbacks is available with generic callbacks (more on that below). The second thing to know is that you cannot mix legacy and generic callbacks in the same program. You have to use one or the other exclusively (or neither).

The new generic callback approach involves trade-offs. The legacy system involves essentially two types of callbacks: "information" callbacks (asking CPLEX what's going on at various points in the solution process) and "control" callbacks (meddling with how CPLEX solves a problem). Changes between how CPLEX worked back when control callbacks were introduced and how it works now created some adventures for both IBM and users. For instance, certain control callbacks were incompatible with dynamic search, so the presence of such a callback (even if it contained no code and did nothing) would cause CPLEX to turn off dynamic search. There were some other side effects, but I'm neither qualified nor motivated to list them all. Suffice it to say that IBM decided a revamped callback system, designed from the ground up to work fully with the current version of CPLEX, was warranted.

So here come the trade-offs. In exchange for the ability to use callbacks without having to turn off dynamic search, limit CPLEX to a single thread, or whatever, you lose some functionality. Generic callbacks are currently not implemented for continuous problems. (Again, you can still use legacy callbacks on those.) Generic callbacks do not support user-controlled branching or node selection, nor user solution of node problems. A side effect of losing the branch callbacks is that users apparently can no longer attach node data to nodes and query it later (since, in the legacy system, the node data was attached in a branch callback). If you need any of those features, you have to stick to legacy callbacks for now (while you lobby IBM and/or your congressman to get your favorite features added to the generic callback system). Apparently, data IBM has accumulated on which features are or are not widely used suggested that omitting branch and solve callbacks would inconvenience a small portion of users.

Finally, here comes what I think is potentially the biggest issue: it is now the responsibility of the user to ensure that a generic callback is thread-safe. This is not always easy to do, and it requires a depth of programming knowledge that you don't typically get in a first or maybe even second course on programming. To put it another way, I've been writing code for well over 45 years (going back to FORTRAN on a mainframe), and my experiments with the beta version of 12.8 represent the first time I've ever had to handle thread safety. In my next post (or two, depending on how chatty my muse is), I'm going to look specifically at thread safety. Meanwhile, if you're not comfortable with it, my advice is to stick to legacy callbacks (but start learning about writing thread-safe code -- soon or later you'll need to know how).

Wednesday, June 1, 2016

Using CLP with Java

The COIN-OR project provides a home to a number of open source software projects useful in operations research, primarily optimization programs and libraries. Possibly the most "senior" of these projects is CLP, a single-threaded linear program solver. Quoting the project description:
CLP is a high quality open-source LP solver. Its main strengths are its Dual and Primal Simplex algorithms. It also has a barrier algorithm for Linear and Quadratic objectives. There are limited facilities for Nonlinear and Quadratic objectives using the Simplex algorithm. It is available as a library and as a standalone solver. It was written by John Forrest, jjforre at us.ibm.com.
Like most of the projects at COIN-OR, CLP is coded in C++, which can make it a bit of a pain to use from Java. So I was quite interested when Nils Löhndorf wrote to me that he had written a Java interface to CLP, clp-java, which he has released as open source. I have an academic license for CPLEX, so I'm not really motivated to switch to CLP, but in the past I've found myself working on open source projects in which I would like to have embedded an LP solver. Since the intent is that people be able to use the program at no cost, embedding a somewhat expensive commercial solver is clearly a non-starter.

So I downloaded clp-java and took it for a test drive. I coded a basic assignment model in Java, with randomly generated assignment costs and a user-selectable dimension. (By "dimension" I mean number of slots and number of assignees.) Each run solves a single assignment problem twice, once with CLP and once with CPLEX. Since CLP is limited to a single thread, I throttled CPLEX to a single thread as well.

My primary objective was not to see which was faster. Hans Mittelmann at Arizona State University maintains solver benchmarks in his Decision Tree for Optimization Software. You can see there that CLP sometimes beats CPLEX (rather handily) but frequently is slower. (The same can be said for CLP in comparison to Gurobi.) What I wanted to know was the following:
  • is clp-java easy to use (yes!) and well-documented (pretty well);
  • does it produce correct answers (yes, at least on my tests -- CLP and CPLEX obtained identical solutions on all tests);
  • is there any performance penalty for using the clp-java interface (not that I can see).
I started with a dimension of 5 and doubled it with each new run, up to 1280 for the final run. Here's a log-log plot of total end-to-end solution times:
plot of total solution times
CPLEX beat CLP consistently, but as problem dimension grew the ratio of times seemed fairly steady, and the difference (a bit over 25 seconds on my quad-core PC) doesn't strike me as horrible. IMPORTANT DISCLAIMER: We're looking at one replication at each problem size of one particular LP (assignment problem). Ascribe any significance to anything I say at your own peril. Also, I repeated a few replications, and the times varied significantly, even though the seed for the random number generator was held constant (meaning the repeated problems should have been identical to the original versions). So the teeny sample size is exacerbated by fairly high variance.

I broke the timing down into three parts: setting up the model; solving the model; and recovering the solution (getting the solver to cough up the values of the assignment variables). Here are log-log plots for each.

Setup

log-log plot of setup times
CPLEX seemed to be a bit faster creating a model object than CLP was, but the difference was pretty minimal (2.3 seconds with 1,280 assignees).

Solution

log-log plot of solution times
The bulk of the time for either program is spent solving the problem, so this plot resembles the plot of overall execution times.

Recovery

log-log plot of time to recover the solution
For the small models, both program returned the variables values so quickly that the recorded time (in milliseconds) was zero. Interestingly (at least to me), on the larger instances CLP returned solution values faster than did CPLEX.

Again, the takeaway from the experiments is not which solver is better; it's that Nils's interface works correctly and does not seem to introduce any glaring inefficiencies. Overall, I am quite impressed with Nils's creation. He provides an all-in-one jar file that contains not only his code but also CLP and some third-party libraries. You only have to import clp-java into your project and put the jar in the class path. When you run your program, the necessary libraries are unpacked into a temporary directory. Before the program exits, it cleans up after itself, deleting the temporary directory. (I confirmed that it left no digital artifacts behind.)

There is one bug yet to be worked out (as of this writing). At least on Ubuntu 14.04 and Linux Mint 17.2 (based on Ubuntu 14.04), "out of the box" you get linking errors at run time. Apparently, despite the fact that the COIN libraries CLP uses are sitting in the same temporary directory that CLP is sitting in, it looks for them elsewhere and can't find them. The workaround is to install the coinor-clp package (and a couple of dependencies) from the Canonical repositories, using apt or Synaptic. That fixed the linking problem for me and one other user. I have no idea if the same problem crops up in other operating systems.

So if you are programming in Java and looking for an open-source LP solver that you can build into a project, check out clp-java and CLP.

Monday, May 30, 2016

Java "Deep Learning" Library

If you are a Java (or Scala) (or maybe Clojure?) programmer interested in analytics, and in particular machine learning, you should take a look at Deeplearning4j (DL4J). Quoting their web site:
Deeplearning4j is the first commercial-grade, open-source, distributed deep-learning library written for Java and Scala. Integrated with Hadoop and Spark, DL4J is designed to be used in business environments on distributed GPUs and CPUs. Skymind is its commercial support arm.
In essence, DL4J is a library for building "deep" neural networks, where "deep" apparently means more than one hidden layer. The software is open source (Apache 2.0 license). There is some free support available (from the user community, and possibly the developers). Commercial users needing serious support apparently can buy a support contract from Skymind.

Now, I don't know much about neural networks, although I do have some interest. Right now, I don't have time to put DL4J through its paces. Someday, if I find the time, I'll probably post some observations here. Meanwhile, I did download and install DL4J, along with the examples they provide, and I ran several of the examples successfully (and none unsuccessfully).

Their web site is very well done, with more links to general resources, documentation and tutorials than I think I've seen for any open source project before. So if the notion of coding serious (not just toy) neural nets in a JVM language appeals to you, I think you'd be well served to check them out.

Saturday, April 9, 2016

SOLVED: Problem with Impressive

I've written before (here and here) about using the open-source Impressive program to display PDF presentations. It's been quite a while since I used it, or any other presentation software for that matter -- retired geezers don't do a lot of presenting -- but I'll be helping the INFORMS Student Chapter at the University of Louisville catch up on their sleep this coming week, so I thought it was time to install something on my laptop. A quick Google search revealed that not much has come down the pike in recent years to rival it, so I installed Impressive. The version in the Canonical repositories is a bit dated, so I got the current version from Liviu Andronic's PPA. (Thanks, Liviu, for maintaining this!)

Impressive (and various dependencies) installed just fine, but when I tried to open one of my slide shows, I got the following error:
Warning: The input file `<path to my file>' could not be analyzed.
The presentation doesn't have any pages, quitting.
So I tried opening a random PDF I had lying around my laptop's desktop screen, and lo and behold it opened! After banging on Google and finding mostly rather antiquated posts, the most plausible explanation I could find was something about graphics being produced in a "recent" (several years ago) version of PDF and the current (back then) version of the PDFtk toolkit (pdftk) having a bug, with the suggested fix being to revert to an older version of pdftk. I looked in the Synaptic package manager to see what version I had, and it turned out the answer was none!

I installed pdftk (and necessary dependencies) from the Canonical repositories, and that fixed the problem. Impressive now worked just fine with my presentation. This leaves me with a few observations:
  • Neither pdftk nor any of the dependencies that installed with it must be absolute dependencies of Impressive, since Impressive was able to display the second file I tried without having pdftk etc. installed.
  • The pdftk bug mentioned in the old posts has, I'm pretty sure, long since been fixed ... and, in any case, that wasn't the problem, since I did not have any version of pdftk, buggy or not, installed.
  • Either pdftk or one of its dependencies, while not strictly required to run Impressive, must be required to correctly parse something (all graphics? some graphics? something to do with the use of overlays?) in my presentation.
Bottom line: I don't fully understand what happened, but at least it works now.

Tuesday, March 24, 2015

Updated Java Utilities for CPLEX and CP Optimizer

I just finished adding a feature to a utility library I use in Java projects that employ either CPLEX or CP Optimizer. In addition, I moved the files to a new home. The library is free to use under the Eclipse Public License 1.0. The code is mentioned in previous posts, so I'll just quickly summarize the content here and refer interested parties to the earlier posts:
The latest source code is now available from the Michigan State University Gitlab server. You do not need to log in, and you do not need to be a Git user. You can just click the download button near the upper right to get a ZIP archive of the source code. If you run into any bugs, there is an issue tracker on the MSU site where you can report them (please!). If you just want a binary (.jar) file and the Javadoc documentation, you can download a .zip file from my MSU web space.

In the following description, please assume that cplex and cp are instances of IloCplex and IloCP respectively. The main reason I developed the library is that I like to experiment with different parameter settings for CPLEX and CP Optimizer. Rather than hard coding a parameter (e.g., cplex.setParameter(IloCplex.Param.Emphasis.MIP, 3)) and then having to edit and recompile the code to try a different value, I prefer to pass CPLEX and CP Optimizer parameters to the program through the command line (or, if my program has a graphical interface, through a user dialog). The equivalent code to the previous example might look like cplex.setParameter(pname, pval) where pname is a string with value "Emphasis.MIP" (the minimum portion of the full parameter name necessary to uniquely identify the parameter) and pval is a string with the value "3".

With that as background, here is a summary of the contents of the library:
  • CplexParameterSetter: Use an instance of this class to apply parameter settings (each specified by two strings, parameter name and new value) to an instance of IloCplex. Example code appears in the May 2014 post (look for the version 2.0 sample).
  • CPOptimizerParameterSetter: Use an instance of this class to apply parameter settings to an instance of IloCP. Again, sample code is in the May 2014 post.
  • CPDisplay: The static method CPDisplay.asString(cp) will produce a summary of the model in cp, suitable for printing or displaying. For whatever reason, IloCplex.toString() produces a human-readable version of a CPLEX model, but IloCP.toString() just prints the object's hash code. This class provides a workaround. For the output to really be readable, you need to be assiduous about assigning meaningful names to the variables and constraints in the model. I originally released this (in the March 2014 post) as an override to IloCP.toString(), but I decided a static method was easier to use (does not require extending IloCP).
  • Main program: The project comes with a main program. If you run it, you will get an alphabetized list of all parameters known to the versions of CPLEX and CP Optimizer that you are using. For instance, run against CPLEX Studio 12.6.1, the output I get looks like this:
    CPLEX:
               AbsGap double  IloCplex.Param.MIP.Pool.AbsGap
            AbsMIPGap double  IloCplex.Param.MIP.Tolerances.AbsMIPGap
            AbsMIPGap double  IloCplex.Param.MIP.PolishAfter.AbsMIPGap
              Advance int  IloCplex.Param.Advance
    [...]
           WriteLevel int  IloCplex.Param.Output.WriteLevel
          ZeroHalfCut int  IloCplex.Param.MIP.Cuts.ZeroHalfCut
    
    CPOptimizer:
                      AllDiffInferenceLevel int  IloCP.IntParam.AllDiffInferenceLevel
               AllMinDistanceInferenceLevel int  IloCP.IntParam.AllMinDistanceInferenceLevel
    [...]
                               WarningLevel int  IloCP.IntParam.WarningLevel
                                    Workers int  IloCP.IntParam.Workers
    
    At least for me, the main use of this is to figure out which parameter names are unambiguous and which are repeated. For instance, the CPLEX parameter IloCplex.Param.MIP.Pool.AbsGap can be abbreviated "AbsGap"; but the minimum amount necessary to specify the absolute MIP gap for convergence is "Tolerances.AbsMIPGap", since "AbsMIPGap" could also refer to IloCplex.Param.MIP.PolishAfter.AbsMIPGap.
If you have questions about the proper use of the code, please feel free to post them in as comments here. If you run into bugs (or missing features), please use the issue tracker. That will help me keep tabs on what needs to be done.

Thursday, April 3, 2014

The Definition of "Open"

Before I climb up on my soapbox, I probably should make a couple of disclaimers to put what follows in perspective.
  • I am a heavy user of open source software, and in particular of products from the Mozilla Project. My primary email client is Thunderbird. My first web browser was Netscape Navigator (which predates the Mozilla Project), which eventually morphed into Mozilla and, most recently, Firefox. I've used other browsers, depending on the platform, but Firefox remains my primary choice (although I may have to rethink that based on what follows). In fact, I'm typing this entry into Firefox.
  • I am in favor of the legalization of gay marriage. For that matter, I'm in favor of legalizing polygyny and polyandry. I'm not saying that I want to try any of them; I just don't see any reason that the government (at any level) has a compelling interest in forbidding any of them, and doing so clearly creates inequality in the treatment of citizens. (Actually, while I don't want to get into the subject in detail, my personal preference would be to take the government out of the marriage business entirely. Religions should be free to define "marriage" any way they want; the government should let any adults of legal age file paperwork somewhere designating individuals to fill the "marital" roles for which the government has a legitimate interest, such as parenting, advanced health care decisions, mingling and division of assets, etc.)
Wondering what brought all that up? I was sitting in a coffee shop this afternoon, catching up on some reading, when I came across a story that nearly caused me to do a spit take: Mozilla CEO Brendan Eich resigns amid controversy. Here's a short summary of the events it describes:
  1. The Mozilla Foundation, in need of a new CEO, hires Brendan Eich (their CTO).
  2. The fact that Eich donated $1,000 (presumably of his own money) in 2008 to support California's Proposition 8 (a bill to ban gay marriage) resurfaces.
  3. Mozilla's corner of the universe reacts (sample here), or possibly overreacts, to the hiring. As best I can tell from reading a few articles, the reaction is largely if not entirely negative.
  4. Three members of the Mozilla Foundation board resign, but allegedly due to a disagreement on hiring an internal candidate and not due to the donation. (This is reported to be half the board, raising the question of how Eich got hired if half the board was so opposed to him that they would resign in protest.)
  5. Eich resigns (possibly under pressure) and Mozilla issues a statement about it (which reads like a mea culpa for having hired him in the first place).
I have never met Mr. Eich, I have no idea whether he was a good pick for the CEO position, and I'm massively confused about how he would be selected with so much apparent board opposition. As noted above, I don't agree with Eich's position on Prop. 8. What caused me to choke on my coffee, though, is nicely illustrated by this line from the Mozilla blog post:
Mozilla believes both in equality and freedom of speech. Equality is necessary for meaningful speech. And you need free speech to fight for equality. Figuring out how to stand for both at the same time can be hard.

So I think they've figured the "hard" part out. You start out by appointing yourself the arbiter of "equality", and then you define "free speech" to mean "you're free to make speeches agreeing with us". Somewhere on the AfterLifeNet, Voltaire and Evelyn B. Hall are probably installing new browsers. I may need to join them (with the browsers, not the after life, just to be clear).

Postscript: For a list of some choice quotes from Voltaire (or at least attributed to him), you might like "Famous Quotations From Voltaire That Still Apply to the Modern World".

Wednesday, March 5, 2014

Twitter via RSS: More Problems, More Solutions

I previously wrote about how the Twitter 1.1 API dropped support for Atom and RSS, making it a PITA to get feeds for Twitter timelines in a feed reader. (As an aside, I switched feed readers - again - a while back. I'm now using InoReader. I can't recall if I've mentioned that since I made the change.) Since that post, two of the solutions I came up with have run into problems. The Twitter RSS service is apparently gone: surfing to twitter-rss.com yields a page saying the domain name expired on February 6 of this year. I was also pulling some feeds from twss.55uk.net, which now produces a "service unavailable" error.

After a bit of surfing, I found a solution posted by Amit Agarwal (@labnol), titled "A Simple Way to Create RSS Feeds for Twitter". Simple is in the eye of the beholder, but it works, and there's a learning curve effect (creating the second, third, ... feed gets progressively faster). It uses a Google Script run under your account, which makes me nervous for a couple of reasons. First, it creates another failure point if Google decides to discontinue support for user scripts. (Remember the late, lamented Google Reader?) Second, the script has to be configured so that anyone can run it, but it runs under your account. The script looks pretty benign to me, and it's unlikely anyone else would stumble over the correct URL to run it, but on general principles I get a bit nervous being this permissive.

Anyway, the instructions are in Mr. Agarwal's post, and they are quite clear, so I shall not repeat them here. I've replaced four feeds so far, and things seem to be working ... for the moment ...

Thursday, June 27, 2013

Updating JabRef

I rely on JabRef to created and edit bibliographic databases (for use with BibTeX in LaTeX documents). For whatever reason, the supported version in the Canonical repositories for Ubuntu (and Linux Mint) is lagging further behind than is usual for the repositories (which is saying something). The current stable version (as of this writing) is 2.9.2, while the current beta version is 2.10 beta 2. The "official" version in the repositories is 2.7 beta 1, which I estimate to be between 12 and 18 months old.

I looked around for more current Debian packages but ultimately decided the easiest way to update is manually. Most of the files from the official version do not need to be changed. Here are step-by-step instructions for installing a new version. They worked for me and should work for anyone else using a Linux distribution that employs the Debian packaging system. I assume here that you already have the "official" version of JabRef installed. Do not uninstall the old package, since we're going to retain a lot of its files.
  1. Download the latest version (stable or beta, your choice) from the SourceForge project page. Henceforth I will refer to the file (whose name should be JabRef-<version information>.jar) as <new jar>.
  2. Open a terminal in the download directory.
  3. Run the command
    sudo mv <new jar> /usr/share/jabref
    which will install the new version in parallel with the old one.
  4. Optional but recommended: run
    java -jar /usr/share/jabref/<new jar>
    just to make sure the downloaded version works. Once you're sure it works, exit JabRef.
  5. Still in the terminal, run the commands
    sudo rm /usr/share/java/jabref.jar
    sudo ln -s /usr/share/jabref/<new jar> /usr/share/java/jabref.jar
    This switches the version of JabRef being executed from the old one to the new one.
  6. Test JabRef by running it from the application menu and/or by double-clicking a .bib file.
  7. Optional: run
    sudo rm /usr/share/jabref/<old jar>
    to delete the old version. 
I'm not sure whether Synaptic will identify JabRef as a "broken" package as a result of this. We'll see.

Saturday, June 22, 2013

Accelerating Linux Hibernation

I'm about to commit what is probably analytics heresy: I'm going to give a subjective impression without collecting data (because I'm too lazy to do so).

I frequently hibernate my Linux Mint desktop rather than doing a full shutdown, just to save time both when I'm done for the day and when I'm resuming the next day. Both hibernation and wake-up seem to take progressively longer as the time between full boots increases. I notice this more if I've been using the NetBeans IDE for coding, to the point that I'll occasionally do a full restart just to make hibernation cycles go faster.

Looking for a way to speed things up, I found µswsusp (userspace software suspend -- I'm not sure why they want to start with a "mu", but for free software I'll forgive the occasional bit of fluff) and a very clear and helpful HOWTO. (Update: The HOWTO may have disappeared -- at least I can't get to it at the moment -- so here is an alternative source. Check the comment on Aug. 16, 2012.) I installed the small package from the Canonical repository, added the 00sleep_module file, and hibernated. Hibernation and reanimation both seem notably faster. Some of this may be the result of a percentage progress measure being displayed, but I think there is a real difference in both directions.

Sunday, June 16, 2013

No More Twitter RSS Feeds

I like to aggregate most of the social media content that I want to see (blog posts, forum posts, certain Twitter timelines) in one place. Before its announced (and impending) demise, that was Google Reader. Of late it has been Netvibes. The key is that, in both places, I obtain content via RSS feeds. I have a separate Twitter client, but prefer that a few "important" Twitter feeds be included in my RSS reader. The reason is that I regularly check the RSS reader for new content, but I check the Twitter client extremely sporadically. (If anyone needs proof that I'm not a teenager, the preceding sentence should suffice.)

Much of the world, myself included, subscribes to the mantra that "if it ain't broke, don't fix it". Unfortunately, software developers have a different mantra: "if it ain't broke, it needs more features". Throw in possibly some concerns over security and/or a desire to assert more control, and you arrive at Twitter's recent decision to do away with RSS feeds. They retired version 1.0 of their API and replaced it with version 1.1, which supports JSON only (no XML, no RSS, no anything else). Quoting their developer site:
Consequently, we've decided to discontinue support for XML, Atom, and RSS, which are infrequently used today.
If you're curious about the definition of "infrequently used", I suggest you monitor Twitter, tech forums and the blogosphere for the ensuing howls of outrage by those of us "infrequent users" whose feeds are now broken.

If you have a web site (for instance, a blog) on which you provide users an RSS feed to your Twitter account, you will need to replace that. If your site contains a widget displaying recent posts from your Twitter account, and if it used XML or RSS, it will be frozen in time (or broken) until you replace it with a newer widget. If, like me, you used RSS feeds to read other accounts, you will also need to find an alternative.

Netvibes recommends installing the updated version of their Twitter widget, but that's not an option I fancy. The Twitter widget is apparently a full-fledged Twitter client embedded in the Netvibes dashboard, and the last thing I need is another Twitter client to ignore (see first paragraph). Happily, there is at least one other option available: the aptly named Twitter RSS site. (Hat tip to Social Media Slant, which is where I found out about the site.) Twitter RSS, which is apparently not a site owned by Twitter, is a free service that is extremely simple to use. Type in the Twitter handle (minus the "@" symbol) for the account you want to follow, and they will supply you with a URL that provides an RSS feed for that account.

So I've replaced my original Twitter RSS links in Netvibes with links provided by Twitter RSS, and now I just need to sit down and catch up on my reading. (It took me a few days to get around to addressing the problem, and you know how fast stuff piles up on Twitter.) I have no idea who is behind Twitter RSS, how long they will be around, or how long it will take the "infrequent users" of RSS to overwhelm their servers, but for now we at least have an option.

Update: The Twitter RSS web site is gone -- the domain name lease seems to have expired. I've found another possible solution, described here.

Sunday, June 9, 2013

Arrowheads in TiKZ

For most publication graphics (including drawings used in blog posts), I favor the TiKZ package for LaTeX. Many of those drawings have included lines with arrowheads, and the arrowheads never posed any problems ... until recently. Consider the following small chunk of TiKZ code:

\begin{tikzpicture}
   \draw[->] (0,0) -- (1,1);
\end{tikzpicture}

and the similar chunk

\begin{tikzpicture}[>=latex]
   \draw[->] (0,0) -- (1,1);
\end{tikzpicture}

Both should draw a diagonal arrow, with the arrowheads differing only in terms of their style. (The optional argument in the first line of the second version specifies the use of LaTeX-style arrowheads.) Indeed, when compiling the document with latex (producing DVI output), ps2pdf (producing PDF output by way of an intermediate Postscript file) or XeTeX, I get the expected output:
output produced by ps2pdf: two line segments with arrowheads
On the other hand, when I compile the document with pdflatex (the program I normally use) or LuaTeX, the arrow head in the first version goes missing:

output produced by pdflatex: two line segments with an arrowhead only on the second
(As a sidebar, compiling with dvipdfm, which I never use, produces a PDF file with a single blank page.)

This occurs on a Linux Mint 14 (Nadia) system with the TeXLive 2012 LaTeX distribution. As I said, the problem is new to me. I've previously drawn arrows in TiKZ using TeXLive (perhaps the 2011 or 2010 version) without specifying LaTeX-style arrowheads and compiled successfully using pdflatex. The workaround is at least straightforward. I just have to remember to specify the arrowhead style.

On an unrelated note, if anyone is curious how I converted the PDF output to the PNG images above, I took a somewhat circular route. For whatever reason, the ImageMagick convert utility, which on a good day requires specification of various command line options to produce  decent looking PNG, insisted on producing empty image files from my PDF files. So I opened each PDF file in a viewer, took a screen capture by pressing Control-PrtScn, and pasted the image into IrfanView (running under WINE). In IrfanView, which has excellent image manipulation tools, I just cropped the image and saved it to a PNG file.

Thursday, May 23, 2013

SQLite Studio

A high proportion of my research projects end up with my writing code that solves a set of test problem and spews results that eventually need to be analyzed. Once upon a time this mean parsing log files, transcribing data to a spreadsheet or statistics program and proceeding from there. In recent years I've taken to adding a database interface to the program, so that it records results (both intermediate and final) to a database. Add records of problem characteristics (as seen by the program) and parameter values (as passed to the program) and the database becomes a one-stop-shop for any data I need when it comes time to write the associated paper.

SQLite has proven to be a great choice for the back end, because it does not require a server. It understands a reasonably complete dialect of SQL and is more than sufficiently efficient for my purposes. Drivers are readily available for it. (I program in Java, and I've been having very good luck with SQLite JDBC.) As with pretty much everything I use, it is open-source.

I typically create the database outside my program, and once my program has done its thing I need to access the results stored in the database. There are a variety of client programs for SQLite. The best one I've found so far is SQLite Studio (open-source, available for multiple platforms). It has a very complete feature set and is remarkably easy to use. I recently had to merge data from multiple tables of one database into the corresponding tables of another one. SQLite Studio allowed me to open both databases and then do the merge with simple SQL queries; it handled the mechanics of "attaching" one database to the other silently in the background.

So I thought I should give SQLite, SQLite JDBC and especially SQLite Studio a shout-out.

Tuesday, April 30, 2013

Workrave

I tend to spend too much time at the computer, particularly if I'm wrapped up in writing (or, more likely, debugging) a piece of code. My hardware setup is probably not going to win any ergonomic awards, although I do have an ergonomic keyboard and a trackball with a wrist rest, and I often wear a brace on my right (trackball-side) wrist. (I've had episodes of carpal tunnel syndrome in the past.) Frankly, though, it's not really repetitive strain injuries that worry me the most. It's a combination of computer vision syndrome (too much staring at the monitor) and lard-ass nerd syndrome (too much sitting).

So, much as I hate being nagged, I decided to look around for a break timer that (a) wasn't too intrusive or annoying, (b) would automatically reset itself (or could be easily reset) when I took an unscheduled break (such as getting myself a cup of coffee, or recycling a previously consumed cup of coffee) and (c) preferably came with some suggestions for good at-the-desk exercises. There are quite a few break timers out there (both standalone and browser plug-in), but after trying one or two that didn't thrill me, I stumbled upon Workrave.

Workrave is open-source, available for both Windows and Linux (both Gnome and KDE). I did not see a download option for Macs, and I don't know if the Linux edition will run on a Mac. For users of Ubuntu and related Linux distributions, Workrave is available via Synaptic from the Canonical repositories (subject to the usual problem of being one version behind the current one). There appear to be translations of Workrave for a number of languages.

Although I can't find any documentation for Workrave to speak of (they have a FAQ and a user mailing list), it is fairly intuitive to use. Once launched, it parks itself in the system tray, where a right-click brings up a menu allowing you to set preferences, change mode, suspend it (useful if I'm in the middle of some high-priority task where I cannot afford to be interrupted) and so forth. It provides three separately configurable timers. The shortest cycle timer periodically urges you to take a "micro break" (rest for just a few seconds). The medium cycle timer nags you to take an extended break (how extended is configurable), and optionally displays some exercises (with instructions and illustrations) that you can do at your desk, without causing coworkers to report you to the authorities. (In a small bit of irony, Workrave bugged me to take an exercise break just as I finished typing the previous sentence.) The longest cycle timer is for your work day: when that timer goes off, Workrave will tell you to pack it up and go home (or at least do some non-computer work for the rest of the day).

By default, Workrave monitors your keyboard (and mouse?) activity, so if you stop providing input for more than a few seconds Workrave will recognize that you're on a break and reset accordingly. There is a "reading" mode that you can select, which I assume runs the timers regardless of input. There's also a network configuration option, whose purpose eludes me. (I really don't want my network connection taking breaks.)

All told, Workrave is a very well done program with a very nice user interface. It strikes what I think is just the right balance between flexability and ease of use. If you have RSI issues, you definitely should take a look at it; but even if not, I recommend it to anyone who spends extended periods of time parked in front of a computer.

Friday, April 5, 2013

Impressions of Netvibes

A couple of weeks ago I wrote about my search for an alternative to Google Reader, which eventually led me to Netvibes. Having used it a fair bit, I think I'm ready to share my reactions.

Desktop


I'm very comfortable using Netvibes on my PC. My subscription is to the free service. There's a fee-based premium service that I think is targeted at commercial users, but the free version is fine for me. On the desktop, I use it in Firefox, but I tested it with Chrome and the interface unsurprisingly seems to be identical.

You can login the old fashioned way (email address and password) or via Facebook. I'd like to see a general OpenID login option, or at least buttons to log in through Google+ and/or Twitter, but that's a quibble. As with many browser-based applications, once logged in I stay logged in for extended periods, provided I load the page periodically. (I assume this is refreshing a cookie. Cookie-averse users may need to authenticate more regularly.) 

As I previously mentioned, import of my Google Reader feeds and folders was easy. I showed a couple of pictures of the interface in my previous post, so I won't repeat those. Here are some things I like about the desktop interface.
  • You can show all new posts, posts from uncategorized feeds, posts from all feeds in a particular category, or posts from just one feed.
  • You can show all posts (ones you've read using a "faded" font) or just new posts.
  • You can read the post (or at least the initial portion of it, depending on the feed) inside Netvibes with a single click, or open the source document in a new browser window/tab with a single click. (The former marks the post as read, but the latter does not.)
  • You can mark a single post or a subset of the displayed posts read by checking them off (one click per post) and then clicking a button (so n+1 clicks to mark n posts). You can also mark all displayed posts read with two clicks.
  • Similarly, you can mark one, some or all posts as unread, with the same number of clicks. This is not something I do often, but occasionally I do mark a forum post unread so that I will come back to it.

Tablet


I also use Netvibes on a 10" Android 4.0 (Ice Cream Sandwich) tablet. [Update: I've removed the previous link to information about Android 4.0, which was broken. If you're nostalgic for "Ice Cream Sandwich", you might want to have a look at this article from DailyWireless.] Netvibes currently does not have any native mobile applications, but for a tool designed to browse online posts, I'm quite happy to work within a web browser. On any mobile device, you point your browser at mobile.netvibes.com; the server detects your device type and apparently customizes the interface accordingly. The interface is almost the same as the desktop interface, so I'll just point out the differences.
  • In the "reader view" (which is what I use exclusively; I can't recall if the "widget view" is available on the tablet), a menu of categories appears on the left and posts for the category you have selected appear on the right. The right-hand pane has a border at the top identifying the category. On the mobile version, this sometimes does not update when you switch categories: you see the posts for the new category but the header for the previous one. This is not exactly a high priority bug.
  • As best I can tell, there is no option in the mobile interface to mark a post unread. This is problematic for me for two reasons. First, my hand-eye coordination being what it is, I sometimes tap the wrong subject line and read a post that I intended to leave for later. Second, when I'm screening posts from sources (weeding out what I consider to be the "chaff"), I may have to read a post to determine that it is in fact "wheat" (something I want to keep for later). Both the mobile and desktop versions provide a "Read later" category, and it is easy to add a post I've just read into that category. "Read later" is not the same as keeping the post unread in the original category, though. The original categorization is lost when the post goes into "Read later", and in any case "out of sight is out of mind".
  • The option to select a subset of the displayed posts and mark them read does not seem to exist in the mobile version (at least on Android). I can mark all displayed posts read (two taps total), or read them one at a time (two taps per post). Again, when I'm looking at a forum, there are entire threads that I want to skip. On the mobile platform, that's 2n taps to get rid of n posts.
  • There's a built-in menu to share a post. It has only three options: email, Facebook and Twitter. The desktop version has the same three options, but on the desktop I have no use for them, particularly as I never share anything to Facebook. On the desktop, it's one click to open the original source, then one click with the HootSuite hootlet to share to Twitter, one click of the Google+ bookmarklet to share to Google+, or two clicks to use the Firefox "email link" feature. Similarly, if I have Netvibes open in the default Android browser, it's one tap to load the original source document and then two taps to access the browser's sharing menu. That said, I have to give Netvibes a thumbs-up for the Twitter option on Android. Like other applications, if I select the Twitter option it gives me a choice of opening the tweet in any of the installed web browsers or in the HootSuite Android app (which I have installed). Unlike every other application I've used, where that last option silently fails, Netvibes really does open the tweet in HootSuite.

So, to summarize, I'm quite comfortable using Netvibes on the desktop and fairly comfortable using it on Android. I'd be quite happy on Android if they would add an unread option and a way to mark a selected subset of posts read.

Tuesday, March 26, 2013

Farewell to Google Reader

Google's announcement that it would be ending Google Reader service on July 1 caused considerable wailing and gnashing of teeth ... and that was just me. A lot of other folks are also inconvenienced, to put it mildly. I have no intention of slamming Google over the decision. They provided the service at no charge to me, and I'm grateful to have had the use of it. Now it's time to move on.

John D. Cook did a couple of blog posts about alternatives (see here and here), and there is no shortage of web pages devoted to the subject. I've spent more time than I care to think shopping for a solution. My requirements, in descending order of importance are as follows.
  1. The reader must be accessible from both a web browser (on Linux, although that's unlikely to be an issue) or Linux desktop client (browser preferred) and an Android client (or browser application, but native client preferred).
  2. The reader must synchronize between my Android tablet and my Linux PC.
  3. I must be able to import my Google Reader subscriptions (preferably including the folders into which they are organized).
  4. The reader should have straight-forward navigation, including the ability to flag articles as read. (I'm not worried about liking, +1-ing or other social features.)
  5. There should be easy (one click) linking from the reader summary of an article to the source (original web page) in a browser.
  6. I would rather not have a magazine-style interface. For me, it's just unnecessary clutter, and somewhat inappropriate. Some of my subscriptions are blogs, but I also use RSS to subscribe to forums and Twitter feeds, which just look dopey in a magazine layout.
It turns out that synchronization (my second priority) is an issue. Some alternatives currently sync very well, but they use Google's Reader back-end to do it. That leaves them scrambling to find alternatives by the end of June. Some do not sync at all, which is a deal-breaker for me. I'm busy enough that it's a bit of a struggle to keep up with the feeds to which I subscribe, and I really do not have time to spend flagging articles that I've already read on another device.

I thought that Dropbox might be an easy syncing solution. Brent Simmons, who I believe authored the NetNewsWire reader for Apple devices, argues in a blog post that syncing through a cloud file service like Dropbox is unlikely to work. So much for the easy way out.

Since Feedly grabbed far and away the lion's share of recommendations on several sites I checked, I tried that first. Importing my Google Reader subscriptions was trivial. The interface took a bit of getting used to, which is going to be an issue with any alternative to Google Reader. On the PC (in Firefox, using their extension), some articles were "featured" (displayed in larger boxes) than others. I found it easy to mark as read those that were not featured, but for the life of me I could not find an easy way to mark the featured ones read. It was either click on them and read them, or click on a different article to make it "featured" and then, with the original article no longer featured, mark it as read. That's a bit inefficient.

The Feedly Android client was actually a bit easier to navigate, once I learned that (a) swiping horizontally was the way to mark an article read or unread and (b) I needed to be very careful about not using too long a swipe. (A long swipe marks everything on screen read/unread.) Synchronization worked, although I found that I had to log out and log back in at least once on my desktop browser in order to catch changes from the Android client.

Unfortunately, one glitch in the Android application proved to be a deal-breaker. Tapping a link provided with each synopsis let me read the article in a browser, which was embedded in the Feedly client. In many cases, the article is a post on a forum, to which I want to respond. Finger-painting a response on an Android device is painful as it is. In at least a couple of cases, though, Feedly ate my response. After laboriously typing in the answer, I had to scroll up or down to access the button to submit the message. Feedly apparently interpreted the vertical swipe to mean "go back to the previous screen", losing my work in the process. I could not find a setting that would compel Feedly to send me to an external browser (either the default Android browser or Firefox) to read the full article, so that was the end of my Feedly trial.

I'm currently trying Netvibes. There is (as yet) no native Android application, so I access it via web browser on all devices. I can live with that. Synchronization seems to work (knock on virtual wood). Importing my Google Reader subscriptions (including folders), while not as easy as with Feedly, went fairly smoothly, although previous posts in some cases came in with very incorrect dates (as in, all posts from one source were dated seven minutes prior to import). I spent a bit of time marking things read, but that is a one-time phenomenon. The interface is quite clean. I find the "widgets view" more visually appealing but, for busy feeds, the "reader view" more functional.
Widgets View
Widgets View
Reader View
Reader View

Update: After a week plus of use, I've posted my impressions of Netvibes.

Update #2: According to eWeek, Feedly has grabbed some 3 million Google Reader users (and counting) and is adding/improving features.

Update #3: I've now switched to Inoreader, mainly because I'm a bit more comfortable with it on mobile devices. After about a month of use, I'm quite happy with it.

Sunday, January 13, 2013

Java Vulnerability

The U.S. Computer Emergency Readiness Team (US-CERT) recently issued an advisory bulletin regarding a serious security flaw in the Oracle Java Runtime Environment (JRE). I've read news articles about it in several places (here is one), and the comments sections universally show rampant confusion (and the inevitable flaming of the confused). A few key points:
  • JavaScript is not Java. In fact, they are essentially unrelated. There is no reason (or at least no reason related to the security bulletin) to disable JavaScript in your browser, and doing so will cause some web sites to become unusable.
  • It's a browser issue. The CERT bulletin recommends "... that Java be disabled temporarily in web browsers ..." (emphasis added) and provides a link to instructions from Oracle on how to do so. (Better instructions, IMHO, are here, courtesy of a link in the ZDNet article.) They are not recommending that Java be uninstalled. Uninstalling Java is liable to cause various programs (such as the OpenOffice and LibreOffice suites) to become inoperable. You just need to disable the Java browser plugin, either globally through the Java control panel or locally in each browser's plugin control page.
  • It may well be limited to Oracle Java. I have no idea whether the flaw exists in the OpenJDK runtime environment and the IcedTea plugin. My feeling is that very few websites require a Java browser plugin, so I'm inclined to disable IcedTea on my system just to be safe.
  • Help is coming. According to an article today on the PCWorld website, Oracle has a fix coming within a matter of days. So keep an eye out for notification of a Java update, and install it when it becomes available.

Thursday, December 20, 2012

A GEdit Headache

What should have been a simple task just ate an hour of my life (and, trust me, the marginal value of an hour of your life is an increasing function of age). I'm trying to compare two parts of a text file, and I wanted to use a split view in gedit. That's not a feature of gedit, so I sought out and found a plug-in, GeditSplitView, that should do the trick. I downloaded it and installed it to ~/.local/share/gedit/plugins (after creating ~/.local/share/gedit and the child plugins folder). That I had to create the folders was a bit surprising, as I was sure I'd previously created them for a different plug-in (now gone missing). I keep my home folder tree on a separate disk partition from everything else, so upgrades (such as my recent installation of Mint 14 Nadia over Mint 11 Katya) should not disturb anything in the home folder. Well, whatever.

After installing the plug-in, I restarted gedit - and discovered it was not seeing the plug-in. Hmm. As an experiment, I installed the gedit-plugins package (a set of optional plug-ins) from the Ubuntu repositories, using Synaptic. Gedit didn't see those, either, which sent me off on a fruitless expedition of web searching.

It turns out the problem is simple, if not intuitive. There was a change in plug-in formatting (and naming conventions) between gedit 2.x and gedit 3.x. The GeditSplitView plugin requires gedit 3.x. That brings me to the daffy (to me) part. Mint, as it installs itself, uses the Ubuntu 12.10 "Quantal Quetzal" repositories. (Mint is a fork of Ubuntu.) It lists version 3.6.0-0ubuntu1 as the current version of gedit-plugins (which is what I installed unsuccessfully) ... but it comes with gedit 2.30.4-ubuntu1 (and the corresponding version of the gedit-common package) preinstalled, and lists those as the current versions. So it's giving you incompatible versions of gedit and gedit-plugins as defaults (and lists no other options).

Once I sorted that out, a quick search turned up instructions on how to uninstall gedit 2.30 and install gedit 3.6.1 in its place. After that, I was able to install GeditSplitView easily, and gedit had no trouble finding it.

Tuesday, December 4, 2012

Cinnamon Spices

Yesterday I upgraded my home PC from Linux Mint 11 (Katya) to Mint 14 (Nadia), picking the Cinnamon version. (Well, I did most of the upgrading -- I'm still tweaking things, installing applications that were not from the main repositories, etc.) A few things about the upgrade are worth mentioning:
  1. Mint ships with LibreOffice 3.6.2 (I think); the current version, as of this writing, is 3.6.3. Either would be more recent than the version I had with Katya. I don't use most of LibreOffice, but I use Calc (the spreadsheet component) rather extensively. So I was dismayed to discover that it crashed more than half the time trying to open a particular spreadsheet file (the first one I needed to access). If I managed to get into the file, Calc crashed consistently when I tried to save it. It also crashed consistently if I tried to copy the contents (thinking that perhaps if I pasted it into a new file I might work around the problem). I tried opening and saving a few other spreadsheets, and they all were handled correctly. There's nothing special about the contents of the problematic one (a column of dates, a column of formulas, a column of numbers, some headings), nor is it a large file. A web search turned up one or two reports of crashes with Writer (the word processing component), typically on a different Mint variant (KDE desktops, I think). One person reported that the problem disappeared after an upgrade. So I downloaded and installed the latest LibreOffice, and so far the problem has not resurfaced.
  2. Cinnamon seems to be based on JavaScript and JSON. A few of the features I used with the GNOME desktop have been removed, have not yet been replicated or are left to the reader as an exercise. Fortunately, third-party substitutes are available in some cases. A number of possibly handy applets (that plug effortlessly into the panel) are available from the Mint Spices page. One I found particularly useful is My Launcher. It provides an easily configured quick-launch list for applications I use frequently. One click expands the list, a second click launches the application. With GNOME, I was able to add the Accessories menu directly to the panel; My Launcher accomplishes the same thing, but lets me add applications that are not on the Accessories menu and remove ones I do not use often.

Wednesday, November 28, 2012

Personal Finance Software for Linux

Upfront disclaimer #1: Anything that looks like a trademark probably is a trademark. That should spare me having to insert trademark symbols every line or so.

Upfront disclaimer #2: This post is about personal accounting software. If you find accounting terminally boring, feel free to stop reading now (and, trust me, I understand).

I keep tabs of my personal finances using a copy of Quicken 2004 running on Windows. At this point, it's pretty much the only reason I ever have to boot into Windows, and it's a bit of a PITA to have to exit Linux Mint and reboot into Windows to do bills, then reverse the process to get back to work (or play). Unfortunately, most versions of Quicken seem not to work very well under Wine: ratings are heavily silver (mostly works), bronze (some features work, some don't) or the self-explanatory "garbage" with a smaller number of platinum (problem-free) and gold instances. For what it's worth, Quicken 2004 Deluxe R3 is rated "bronze", but on my system the installer crashes.

So I've been tentatively planning for a while to migrate to a Linux personal finance package. Features and stability matter, but the #1 concern for me was the ability to migrate my Quicken data to the new application, and that's the focus of this post. The best (only?) way to get data out of Quicken is by exporting to a QIF (Quicken Interchange Format) file. QIF seems to be one of those industry "standards" that isn't quite standard, so you can't depend on an application that has a QIF import function to correctly import any old QIF file. I think my QIF file contained between 11,000 and 12,000 transactions. The number is probably not important, other than to explain why I had absolutely no desire to reenter data from scratch with a new application.

Without further ado, here are the Linux apps I tested and my results of trying them. I'll list them in alphabetic order to avoid offending anyone more than necessary.
  • GnuCash (open source, cross-platform): This is generally the most widely cited and best rated of the Linux personal accounting programs. It has a QIF import option. Unfortunately, when it imported my Quicken QIF file, several (most?) of the account balances were off. More critically, they were off in ways I could not repair. There were old and unreconciled "transactions" that were incorrect. (I put "transactions" in quotes because in at least one case there was a split in a transaction that was processed incorrectly.) GnuCash does not allow you to mark just any transaction as reconciled; you can only mark it by actually reconciling the account. There is seldom a good reason to retroactively mark a transaction as reconciled, but correct a software error is one of them. The only way I could see to mark the problem transactions as reconciled (after fixing them) was to reconcile as of the transaction's date; but that was a dismal failure, because GnuCash takes the balance as of the most recent reconciliation as the opening balance and will not let you specify a different opening balance. Since I couldn't find a way to fix the errors, I gave up on GnuCash.
  • Grisbi (open source, cross-platform): Grisbi also seems to be well regarded among reviewers. Sadly, it repeatedly hung up (with no error messages) trying to import my QIF file, and had to be killed from a terminal. (Killing it left an idle process that had to be tracked down and killed separately.) So Grisbi was a non-starter for me.
  • Homebank (open source, cross-platform): Homebank seems to be an attractive program, perhaps with fewer features (and an easier learning curve) than GnuCash has. When I imported my QIF file, however, quite a few of the account balances were off, in some cases way off. (Trust me: my credit union would not allow me to overdraw my draft account by more than half a million US dollars.)
  • jGnash (open source, Java-based): jGnash offers one feature not found in any of the other programs (that I'm aware of) - the ability to use multiple currencies. It's not a feature I need, but it certainly didn't turn me off. The (Swing-based?) interface is not the most aesthetically pleasing of the lot, but it is certainly good enough. Overall, I was quite impressed with jGnash, except for the all-important QIF import feature. When I imported my QIF file, some bank transactions were missed. Unlike GnuCash, you can retroactively add a missing transaction and mark it reconciled, so I seriously considered using jGnash and just adding the missing transactions ... until I discovered that none of my securities accounts had been imported. A major reason for my using Quicken was to track security purchases (including dividend reinvestments), since Uncle Sugar has funky rules for capital gains and such come tax time. So jGnash bit the dust.
  • Moneydance (commercial, Java-based): Moneydance may be the most Quicken-like of the programs I tested (give or take GnuCash). It has all the features I would want and one or two (such as grouping transactions using ad hoc "tags") that I didn't know I wanted. Most importantly, it imported my QIF file nearly correctly. All but one of my bank accounts had the correct balance. In the one account that was off, there were two or three phantom transactions scattered through its history, possibly the result of incorrectly read splits. They were easy to identify, as they were the only old transactions that were not reconciled, and deleting them fixed that account. All my securities accounts seem to have been imported correctly. Moneydance is a bit on the pricey side -- it actually costs more than the basic versions of Quicken, and you can probably find a "deluxe" version of Quicken at a lower price -- but it gets the job done.
  • Money Manager Ex (open source, cross-platform): Money Manager Ex looked like an attractive option, but the QIF import function seems to be limited to one account at a time (and the account must exist in MMEX before you import the QIF file). That's fine for grabbing data from a financial institution that offers QIF downloads, but I had no desire to do a separate QIF export of each account from Quicken, and I'm not sure what that would have done to transactions that moved money from one account to another. So after discovering that import of the all-in-one QIF file failed, I punted.
  • PocketMoney desktop (commercial, cross-platform): PocketMoney is actually a mobile application (Android and iWhatever), but Catamount Software does sell a desktop version. There is a QIF import function that, from what I read on the Web, works for the mobile versions but seems not to be implemented in the Linux desktop version. I did find a menu entry to import a QIF file. It popped up a file chooser, but the only file type it allowed was "myQIFType", and would not list my QIF file even if I changed the file extension to .myQIFType. So PocketMoney was a non-starter.
  • Skrooge (open source, cross-platform): Skrooge is based on KDE but runs well with Gnome. It has an attractive interface and likely would have been my first choice had it imported my QIF file properly. Sadly, it refused to import the QIF file at all. Unlike Grisbi, it did not hang: it immediately gave me an error message, and the GUI continued to work properly after the message. The message, however, gave me no idea as to what in the QIF file had offended it.
So I ended up purchasing Moneydance. As a postscript, to test whether the Quicken QIF file might contain something funky, I exported my accounts from Moneydance to a QIF file and tried importing that into the other programs. In all cases, the results were identical (Grisbi hung, Skrooge failed gracefully, jGnash skipped the securities, GnuCash and Homebank muffed a bunch of balances).