Google Analytics

Friday, May 15, 2009

Fixing the infamous Amavis + SpamAssassin cron messages

I'm using Amavis and SpamAssassin together on an Ubuntu server. For some reason, a cron email was being generated every 3 hours that looked like this:

bayes: synced databases from journal in 0 seconds: 811 unique entries (1420 total entries)

There is a bug report filed about it here but the solution didn't help me.

The file responsible for generating this message is /usr/sbin/amavisd-new-cronjob. I was able to stop the annoying messages by changing line 26 from:
exec ${CMD}
to
exec ${CMD} >/dev/null 2>&1
While this may clobber useful error messages as well, my care factor is low after being spammed so much.

Tuesday, May 12, 2009

Hiding windows with Ruby and appscript on OS X

At the moment I'm writing a Ruby script that interacts with iTunes on OS X. Fortunately this is fairly easy to do using the AppleScript bridge rb-appscript.

My problem was that I needed to hide the iTunes window (the same as using the ⌘H shortcut) so that the Ruby application didn't lose focus. Unfortunately it took me a long time to find out how to do it.

I didn't need to deal with OSAX. Here's a snippet of code that demonstrates the necessary incantation:
require 'rubygems'
require 'appscript'

itunes = Appscript.app('iTunes')
itunes.activate()
itunes.stop
# Hide the iTunes window
Appscript.app('System Events').processes['iTunes'].visible.set(false)
Here is what the actual AppleScript (which I was able to find easily) looks like:
tell application "System Events"
    set visible of process "iTunes" to false
end tell
You can see how the 'Rubyised' version maps to it, although it took a lot of Googling to translate!

Friday, May 08, 2009

Cryptic MySQL Error Message

I came across an interesting but cryptic MySQL error message today that took me a while to figure out.

After creating a bunch of InnoDB tables on this particular server, I tried to create some indexes and insert some data. Both types of operations failed with an error message that looked like this:

ERROR 1025 (HY000): Error on rename of './dbname/tablname' to './dbname/#sql2-12bb-9474d' (errno: -1)

After some looking around I came across this amusing bug report, which explained that this message could be due to the innodb_force_recovery setting being set to a non-zero value.

Sure enough, running SHOW VARIABLES LIKE 'innodb_force_recovery'; revealed that it was set to '4' instead of '0'. I now have a sys-admin to kill.

Thursday, February 05, 2009

406 Not Acceptable error using jQuery AJAX

I was scratching my head over a problem today where a jQuery ajax request was failing on one particular web server with a '406 Not Acceptable' error. It had been tested on many other servers without any trouble, but this seemingly normal Apache server wasn't having a bar of it.

It turned out the problem was that I was submitting the ajax request using the POST method but not actually sending any post data. For example:

$.ajax({
   type: "POST",
   url: "index.php?action=foo",
   success: function(msg){
     // ...
   }
 });

Changing it to a GET sorted out the problem.

Monday, August 18, 2008

Linux featured in DOA: Dead or Alive movie

Because it's such a classic, I like to re-watch DOA: Dead or Alive every now and again. Based on the video game DOA 3 on Xbox, it vaguely follows the story line of the game. With a rich universe, impassioned drama and superb acting I have no idea why it only got 4.9/10 on IMDB ;)

On the weekend I was enjoying my third or fourth viewing of this theatrical masterpiece when I decided to pause during one of those 'computer code flows down the screen' scenes. To my surprise, this is what I found:

Alpha source code from the Linux kernel scrolling down the screen


For those playing at home, you can find this code in arch/alpha/kernel/err_impl.h from a 2.6 series Linux kernel.

There are some slight differences with the original code though. Random words and tokens are missing. For example, the copyright message has been mostly stripped, random words are missing from the description comment and tabs are displaying as boxes.

Having Alpha source scrolling down the screen didn't really make sense in the context of the scene, but I guess if they're going to just put 'whatever' up there, it's a nice Easter Egg for the nerds to unearth.

Thursday, August 07, 2008

Getting UTF-8 working in Irssi through Screen over SSH

I keep getting asked about this, so I will put it here for reference.

You can usually do it in 4 easy steps:
  1. Terminal emulator environment

    Ensure your terminal emulator is using UTF-8 encoding. If you're using iTerm on OS X, you can find this in Bookmarks -> Manage Profiles -> Terminal Profiles -> Default.

  2. Shell environment

    Configure your shell to use the UTF-8 version of your locale. For example, edit your ~/.bashrc file and change or add this line:

    export LANG="en_AU.UTF-8"

  3. Screen configuration

    In your ~/.screenrc, file, add this line:

    encoding UTF-8

  4. Irssi configuration

    In your ~/.irssi/config file in the settings -> "fe-common/core" section, add the option:

    term_charset = "utf-8";

You will need to quit irssi, exit the screen session and log out of the shell completely, then load it all back up again.

Now you too can impress your friends by using stylish words and phrases such as touché,

בְּרֵאשִׁית, בָּרָא אֱלֹהִים, אֵת הַשָּׁמַיִם, וְאֵת הָאָרֶץ

and



 





Thursday, May 01, 2008

Random words on command

Today I needed to generate SQL queries to populate a database table with some test data. I was making a Facebook-style search & narrow thing where, as you type, the list of options narrow based on your search string. I wanted to test the efficiency of my implementation, so I figured it would make testing easier if I used real words for the list items.

It seems a lot of people have needed to do this, so it wasn't long before I found a fairly good solution for my purposes. Here's the magic line:

perl -nle '$word = $_ if rand($.) < 1; END { print $word }' /usr/share/dict/words

I really have no idea why this works as I'm no Perl Monger. I also found that I didn't have any words at /usr/share/dict/words, since I was on an Ubuntu server install. I needed to sudo aptitude install wbritish. Incidentally, it worked on my OS X 10.5 machine too. Unix is handy.

I only needed 500 records and calling this 500 times didn't take too long. Much more and you'd probably have to modify your approach though.