Google breaks the best search engine in town | arfore dot com

In the old days of the Internet search engine business you had a vast multitude of places to visit. There was Excite, Yahoo!, WebCrawler, Lycos, and many others. You had the search engine aggregators, such as Dogpile and HotBot.

What you didn’t have was a single source to use to search the whole of the web. When Google came along they created a way to analyze the relationships between pages to produce more useful results. The search results were no longer just a mishmash based on how many times a word existed in a page, now the results had a certain relevancy.

Then Google added advertising into the mix, providing users with a way to find products or vendors that had some correlation with the keywords entered. This was a great tool for the layperson and researcher alike. Along the way Google has added shopping results, images, news, videos, and maps. However they seem to have forgotten their core product: a clean, easy-to-use, clutter-free search engine.

The latest improvements, if you can call them that, are the inclusion of web history and “real-time” results. In addition they have added the shopping, news, and related searches to the main content of the search results.

While I was initially disturbed by the addition of Google’s sponsored links, ad-words and ad-sense programs, I know that they are a for-profit company. They have a need to sell a product of some sort in order to continue to provide me with the search results that I know and love. Unfortunately they seem to have forgotten why most of us came to Google in the first place: pure, unadulterated search results. We wanted to find things, and Google became the best tool to help us accomplish this task.

Now some people may find it immensely satisfying to see a stream-of-consciousness included in the results. In the blogpost Relevance meets the real-time web, Amit Singhal, a Google Fellow (and according to the New York Times, the master Google’s ranking algorithm), introduced us to a new feature that “bring your search results to life with a dynamic stream of real-time content from across the web.” The post goes on to say that “Our real-time search enables you to discover breaking news the moment it’s happening, even if it’s not the popular news of the day, and even if you didn’t know about it beforehand.” There is are two embedded YouTube videos that give you an example or two of the end product as well as fanfare from the Search Event presentation from the Computer History Museum.

At the end of the post is the following statement

As we’ve written before, search is still an unsolved problem and we’re committed to making it faster and easier for people to access a greater diversity of information, delivered in real-time, from across the web. I’m tremendously excited about these significant new real-time search features.

The problem with the above statement is that with each successive “improvement” Google has moved further and further from the core product that brought most of us to their door step. Don’t misunderstand me, I love information and being connected. I have accounts on Google Voice, Google Wave, Twitter, Facebook, MySpace, and several other social networking and informational services. I have an iPhone that I constantly check. I watch CNN, read the New York Times and Wall Street Journal. I have several e-mail accounts and I check them all with regularity. I even work in the Information Technology Division at a Valdosta State Unviersity. I am not some luddite who is afraid that technology is going to be the utter ruination of our civilized society.

What I don’t like is that for some reason all of the new “features” have found their way into the clean, pristine waters that I used to love to drink from with each and every search. Now the results are polluted with a non-stop flow of Twitter and Facebook results, their clear surface marred with jarring image, news and shopping results content.

There is a reason that the links exist at the top of the Google page. If you want images, news or shopping, then click on those links. Why do I need to have predictive text attempt to steer me into popular areas of search terms when typing in the desired keywords to summon to me the knowledge that I seek? Is there a place for all of these features? Sure, but at least give us a way to turn them all off.

When I want to search for images, I click the images link. When I want shopping choices, I click the shopping link. When I want Twitter, I will check TweetDeck for the things that I follow. When I want news, I will surf CNN, the New York Times, the Wall Street Journal, or even possibly Fox News.

When I want clear, clean search results, I use Google’s search engine, and make no mistake, that is all I want from the search engine. Don’t force me to try and use other services that provide inferior results, just give me the option to turn all the extras off.

Please, I beg of you: give me back my search!

vnc | arfore dot com

Over Thanksgiving break I bought an Apple TV.  Like any good geek I wanted to expand the capability of the unit beyond the default setup.

After installing Firefox and getting USB keyboard and mouse support going, I realized that it would be tremendously cool if I could control it from my iPhone instead of using a wired keyboard.

To begin with I installed OSXvnc.  The only problem was that I needed to store a password.  After reading a the VNC post on the aTV Flash forum, I successfully conquered that.  However, I had the same problem that iMattUK had: you had to use an ssh connection to start it.

To conquer this I wrote a launchd plist to launch OSXvnc for me at system startup.  Read on for the process I used to get it all working.

Continue reading

ajax | arfore dot com

While working on a method to allow the VSU Communications Unit to add or change the stories in the rotation on the main VSU webpage, I ran into a problem that involved a known Safari issue involving file uploads.

I don’t regularly create forms that allow for an upload of a file, however I don’t like to store binary data in the MySQL database either. Allowing the files to be uploaded makes creating pages that use them a whole lot easier, since I don’t have to “create” the image from the binary data, just pass off a file location and let the browser do the rest.

The symptoms exhibited were that when submitting the form, Safari would hang about 30-40% of the time. No error messages or timeout messages were displayed. Zip, zilch, nada!
Continue reading

Network port troubleshooting with Perl | arfore dot com

Recently I had a need to test network communication between two different services over a specific port for a clustered application.  Since I didn’t want to have to initiate an application failover just to test the network communication, I decided to use a simple Perl script to listen for inbound communication on the cluster node being tested from the development environment.

What the code does is to open a specific port for listening.  I used the basic telnet client to send traffic from the source machine (client) to the destination machine (server).

Here are the code listings for the script for both Solaris 10 and AIX 6.1.

Solaris 10

#!/usr/bin/perl -w
 
use strict;
use warnings;
use IO::Socket;
 
# Local host bind address (hostname/ipaddr)
my $LOCALADDR = 10.0.0.1
# Local host bind port
my $PORT = 10240;
 
my $sock = new IO::Socket::INET ( LocalHost => $LOCALADDR, LocalPort => $PORT, Proto => 'tcp', Listen => 1, Reuse => 1,
);
 
die "Could not create socket: $!\n" unless $sock;
 
my $new_sock = $sock->accept();
while() { print $_;
}
 
close($sock);

AIX 6.1

#!/usr/bin/perl -w
 
use strict;
use warnings;
 
use IO::Socket;
use Net::hostent; # for OO version of gethostbyaddr
 
# Local host bind address (hostname/ipaddr)
my $LOCALADDR = 10.0.0.1
# Local host bind port
my $PORT = 10240;
 
my $server = IO::Socket::INET->new( Proto => 'tcp', LocalHost => $LOCALADDR, LocalPort => $PORT, Listen => 1, Reuse => 1 )
or die "can't setup server";
 
print "SERVER Waiting for client connection on port $PORT\n";
 
my $new_sock = $server->accept();
while() { print $_;
}
 
close($server);

smf | arfore dot com

One of the things that many system administrators encounter in the quest for maintaining up-to-date servers is the need to apply regular maintenance releases.  With some operating systems, Mac OS X for instance, the patches are released in two forms:

  • a delta update, which contains only the changes necessary to bring the system up-to-date from the current running release level
  • a combo (cumulative, full, etc.) update, which contains all changes for the current release branch

If you are lucky enough to be using an OS that gives you delta updates then you may not ever run into an issue where you don’t have enough internal drive space to update the OS.  However, if you are running an OS, like Solaris, that uses cumulative clusters then this becomes more interesting.

One situation I recently encountered was a need to patch a Solaris 10 Sparc system that did not have sufficient internal drive space to store the unzipped patch cluster for patching the system in single-user mode.  (You are patching in single-user mode right?)

The most obvious question would be: why not add another drive?  Another obvious question might be: why not patch from cd/dvd?  Well, adding a new drive to this system was not a viable solution since there were no available drives to install.  Installing from DVD would have been a possible solution, if the patches had been unzipped and burned to disc prior to the maintenance window.

The next available option was to install the patches over the network.  When patching a machine in single-user mode this becomes a little more problematic, since network resources and services are not generally available unless the server has been brought up in a multi-user mode.

After bringing the server up in single-user mode the next step was to start SSH and NFS so that the patch cluster could be installed over the NFS share.  Generally with Solaris 10 all you would need to do is execute the following command for both SSH and NFS client:

svcadm enable <service name>

Unfortunately with single-user mode this will fail to work, since the dependent services are not auto-started.  To accomplish this in single-user mode you need to add the -r flag which instructs svcadm to start the service and recursively start the dependent services.  If you want a little more checking, also add the -s flag which tells svcadm to wait for each service to enter an online or degraded state before returning.  Below are the commands for starting SSH and NFS along with the output of a service check to show the state after the command was executed.

SSH

# svcadm enable -rs svc:/network/ssh:default
Reading ZFS config: done.
# svcs -a | grep ssh
online 15:49:26 svc:/network/ssh:default

NFS

# svcadm enable -rs svc:/network/nfs/client:default
# svcs -a | grep nfs
disabled 15:11:34 svc:/network/nfs/cbd:default
disabled 15:11:34 svc:/network/nfs/mapid:default
disabled 15:11:35 svc:/network/nfs/server:default
online 15:50:35 svc:/network/nfs/status:default
online 15:50:35 svc:/network/nfs/nlockmgr:default
online 15:50:35 svc:/network/nfs/client:default
uninitialized 15:11:37 svc:/network/nfs/rquota:default

After this was done all that was left was to mount the exported file system and run the patch cluster installation script.  Since the cluster was not local to the system it took a little longer to install the cluster, but other than that everything went smoothly.

Migrating WordPress | arfore dot com

As some of you might have noticed, I have just recently moved my WordPress installation into a subdirectory of arfore.com.

There are several reasons for this, the main one being that I would like for my blog to become a component of my website rather than the blog being the entire site.

Moving the WordPress installation itself was quite simple, and there are many pages out there describing the process as well as the pitfalls of doing it incorrectly, so I won’t repeat them here.

What was less easy to find was the proper changes to put in the .htaccess file to ensure that any existing links would get redirected to the proper location in the moved WordPress setup.

I have my permalinks configured to create a URL like follows:

http://arfore.com/blog/2008/10/12/foo-bar-baz/

In order to add the subdirectory blog to the front of the URL I used the following rule in my .htaccess file:

RewriteRule ^([0-9](.*))$ http://arfore.com/blog/$1 [R=301,L]

Similarly, to redirect the categories I used the following:

RewriteRule ^category/(.*)$ http://arfore.com/blog/category/$1 [R=301,L]

Now this may not be the most correct method to accomplish the goal, so if it needs correcting by all means let me know.

computers | arfore dot com

Today while perusing the forums on the Plex website, I noticed someone inquiring as to how they would go about changing the file paths in Plex for one of the video sources without removing the source and adding it back from the new location.

The reason for wanting to do this is to ensure that your database entry tweaks, fanart settings, etc., are not lost, which is what would happen if you removed the source and it’s library entries.

One of the more interesting parts of the Plex project at the moment is the complete re-build of the database structure and how you work with it.  The existing database structure is fairly poor in it’s design.  There are a lot of cryptic field names, and it is easily corruptible.  The current library system is a hold-over from the old XBMC code base.
Continue reading

So several months ago I was in Atlanta visiting some friends (Hi, Justin!) and got hooked on his hackintosh Plex box.  Now, I wanted to run it on a Mac Mini, instead of a hackintosh, but the application was great.  Since then I have purchased the Mini and had a blast getting Plex working and tweaked to do what I want.

If any of you out there running Plex have noticed that there seems to be quite a few instances of Python running when you have Plex up, here’s why: each plugin that you have runs under it’s own instance of Python.  Here’s what the development docs have to say:

Each media server plug-in runs in its’ own process, in a separate Python instance. This ensures that plug-ins can’t interfere with each other, or with the operation of the server.

So there you have it.  Essentially, each plug-in is sandboxed from each other as well as PMS.

If you want to see this in action, just shell into (or open up Terminal) when running Plex and execute the following command:

ps -ef | grep Python | grep -v grep | grep "Plug-ins"

You should see one entry for each of the plug-ins that you have installed.

This weekend I spent a large chunk of time setting up Plex Media Center for OS X on my shiny new Mac Mini.  When I left for work this morning, after two weeks off, I expected to get to the office and fire up iTunes to listen to my music from home using Simplify Media like normal.

Everything was working fine, if a bit slower than I expected, for the first hour or so, then unexpectedly Simplify Media simply quit working.  Restarting the application didn’t help.  Restarting iTunes didn’t help.  Restarting the computer didn’t help.  No matter what I did Simplify Media decided to be stuck in the initializing mode.

After toying with somethings on my iMac at home after work, I realized what was different in the setup than before Christmas break.  The difference was that I am now running the Plex Media Server (PMS) component of Plex on the iMac to server the iTunes library up to the media center Mac Mini in the living room.  After stopping PMS and restarting Simplify Media everything worked fine.  With Simplify Media stopped and PMS restarted Plex was working fine.

After looking into the preferences of Simplify Media, I noticed the ability to turn off Simplify Media for the local network.  After checking that box and restarting both PMS and Simplify Media everything is green again in the Simplify Media land.

I am not quite sure why they are conflicting.  A comment in a post on elan’s Plex blog clued me into checking the Plex UPnP code to make sure it was disabled.  I looked into that and I definitely have it disabled.

Update (2010-1-6) – According to the Simplify Media blog page, they are having network problems in their data center.

In November 2009, my USB Logitech Optical MouseMan died a cruel death.  I had been using this particular trackball for a number of years.  In fact, I liked it so much that I bought two more, one for the desk at home and one for use on the road with the laptop.

As I contemplated going out to OfficeMax to buy yet another one, I realized that it might be time to upgrade, at least a little bit.  While I was very fond of the existing device, there were a few features that I was lacking that had been added to the newer models over the years:

  • cordless operation to make desk arrangement less cumbersome
  • scroll wheel
  • extra buttons for things like forward and back in a browser
  • third button for use in X11

After realizing that I needed an upgrade I decided to dig into some research on the possibilities.  Now I must confess that I am a completely unrepentant trackball user.  I had been using trackballs for my computers for at least the last 20 years.  I did occasionally use a mouse, because sometimes they are better tools, but for the most part I used trackballs exclusively.  One of my favorites over the years has been the original Kensington Turbo Mouse.  It had a great big trackball and four large, easy to hit, buttons.  One of the great things about this particular trackball was the fact that you could swap out the trackball with a standard billiard ball and it would fit perfectly.

After some research I decided to go with the cordless version of the same trackball that I was replacing.  I purchased the Logitech Cordless Optical Trackman at Fry’s in Atlanta.

Initial Impressions

One of the first things that I noticed about the new trackball was that it was tremendously stiff.  I didn’t remember this being the case with my older models.  The cursor movement was also very jerky.  Over the first day of use, however, the movement and tracking of the ball improved.  My guess is that part of the stiffness was caused by some sort of film that was on the ball from the manufacturing process.  One user in a forum posted that his was vastly improved by cleaning the entire ball with rubbing alcohol.  Not having any of this on hand, I hoped that the film would gradually be removed with use.  Thankfully this was the case.

Usage

I did notice a “learning curve” when it came to getting used to the style of the design and placement of the trackball.  The ball is placed off-center on the right-hand side of the casing.  I was used to having my hand completely flat in orientation with respect to the wrist rest and the trackball from the older models.  After some use I found the new orientation to feel more natural.

As with many users, I have found that you will need to spend some time tweaking the Logitech multiplier and tracking speeds in the Logitech control panel as well as the OS X mouse preference pane.  It took me sometime to get the settings just so.  This was not really the case with the USB model, however with the older model you didn’t have a multiplier available in the Logitech software package.  After quite a bit of back and forth with the settings, I finally got it to a useable setting.

Software

The Logitech software gives you the expected settings for the various buttons, scrolling speed as well as the multiplier to apply to the tracking and cursor movement.  Interestingly enough, the software installer can’t figure out that you don’t have a Logitech keyboard installed, just pick one and move on.  Due to the three kexts (kernel extensions) that are installed, the software requires you to restart, even though you can dynamically load a kext without rebooting.

In my particular installation, the registration application that starts after installation never completely loaded.

I did find some interesting points while tweaking the software settings:

  1. The scroll speed in the Logitech panel doesn’t appear to actually have an effect on the speed of the scroll wheel.  This will need to be controlled in the standard OS mouse preference pane.
  2. The tracking multiplier can have a huge effect on the jerkiness of the cursor.  My best results were achieved when leaving the multiplier set on 1 and controlling the tracking speed with the standard OS mouse pane.
  3. The battery life indicator in the Logitech panel is nice, however it would be great if there was a menubar indicator or a LED indicator on the device itself.

Overall, I am quite pleased with the new trackball.  In fact, I have become so used to having the extra buttons and the scroll wheel that I find myself trying to use them when I am at home with my older, USB model.  Looks like I need to add another item to my shopping list.

One of the standard methods of configuring Mac OS X in the enterprise has become known as the magic triangle or golden triangle. This is generally described as a setup involving Active Directory (AD) for authentication of the clients and services and Open Directory (OD) for managing the client preferences.  The triangle comes from the fact that you have the Mac clients talking to AD, the clients also talking to OD, and the Mac server talking to AD. (Apple officially calls this the magic triangle setup in the Snow Leopard Server Open Directory Administration documentation.)

One of the issues I ran into was granting a non-admin in AD the ability to perform administrative functions on the clients bound to AD.  The way this is handled with the Windows clients is for the particular AD user to be a member of a group that grants local administrator privileges.

Unfortunately there is no simple equivalent on the OD side of the equation to allow this for the technicians working on the Mac OS X clients.  If you add an AD user to the system level group Open Directory Administrators using Workgroup Manager (WGM) this has no effect on whether a user is granted local administrator privileges to a connected client machine.

The solution to this involves:

  1. creating a group in OD to hold the members of AD that should have local administrative privileges,
  2. adding this OD group to the requisite local workstation groups to mimic the standard administrative privileges, and
  3. adding the OD group to the sudoers file

Continue reading

iPhone Ringtones on HTC Thunderbolt | arfore dot com

As a recent switcher from the Apple iPhone to an HTC Thunderbolt, there have been a few things that I have been sorting out with the usage of my new phone. I will be detailing some more of my adventures later, however one of the important things to me was how to retain the custom ringtones that I had created using GarageBand.

On the Mac custom ringtones are stored by default in the Ringtones directory within your iTunes Music directory.

The m4r files are really just AAC files with a custom extension that tells iTunes and iOS that it is a ringtone.  They are not DRM formatted files or special Apple files, just ordinary AAC files.  All you need to do to make them playable on Android is to change the file extension to either m4a or aac.

This is a real bonus since Android 2.2.1 will play AAC files with no problem (see http://developer.android.com/guide/appendix/media-formats.html)

Once I found this piece of information out, the only hurdle was to get the ringtones into a location that was used on my phone.  Ideally I would be able to save them to the SD Card to save on the internal storage space and to eliminate the chance of a new software update (or a custom ROM installation) to wipe them out.

It turns out that in Android there is a whole host of pre-defined locations for various data types.  As defined on the Android Developer Network:

Music/ – Media scanner classifies all media found here as user music.

Podcasts/ – Media scanner classifies all media found here as a podcast.

Ringtones/ – Media scanner classifies all media found here as a ringtone.

Alarms/ – Media scanner classifies all media found here as an alarm sound.

Notifications/ – Media scanner classifies all media found here as a notification sound.

Pictures/ – All photos (excluding those taken with the camera).

Movies/ – All movies (excluding those taken with the camcorder).

Download/ – Miscellaneous downloads.

With regards to the storage internal to the system, then, this would make the location for the ringtones be as follows:

/system/media/audio/ringtones/

The external storage location for ringtones would be:

/mnt/sdcard/media/audio/ringtones/

Once I had the filetype and location it was simple enough to mount the SD Card of my Thunderbolt and create the appropriate directory structure then copy the re-named file over.

Then open the ringtones settings pane on the Thunderbolt and voila the new ringtones are available.

She liked the ring | arfore dot com

For those of you who know me outside of my blog (or those that have been following me on Facebook) it will not be a huge surprise that I am engaged.

On June 10, 2011, I asked my girlfriend, Lisa Nicole Vickers neé Shaw, to marry me.  We are now officially engaged!

VNC on the AppleTV | arfore dot com

Over Thanksgiving break I bought an Apple TV.  Like any good geek I wanted to expand the capability of the unit beyond the default setup.

After installing Firefox and getting USB keyboard and mouse support going, I realized that it would be tremendously cool if I could control it from my iPhone instead of using a wired keyboard.

To begin with I installed OSXvnc.  The only problem was that I needed to store a password.  After reading a the VNC post on the aTV Flash forum, I successfully conquered that.  However, I had the same problem that iMattUK had: you had to use an ssh connection to start it.

To conquer this I wrote a launchd plist to launch OSXvnc for me at system startup.  Read on for the process I used to get it all working.

Install OSXvnc

  1. Download Vine Server (OSXvnc).
  2. SFTP/FTP/SCP Vine Server.app to the Documents directory in /Users/frontrow/ on the Apple TV.
  3. SSH to the Apple TV and run the following commands:
    1. cd Documents
    2. cd Vine\ Server.app
    3. ./storepasswd YOURPASSWORD /Users/frontrow/vncpasswd
    4. cp Contents/Resources/OSXvnc-server /Users/frontrow/Applications

Setup Autostart

This next part is a little complicated if you haven’t done it before.  On OS X 10.4 Apple did away with the traditional Unix methods of starting daemons at system start.  The new method they implemented is called launchd.

What you need to do is to create a launchd plist to start the VNC server.  Since vi is not included on the Apple TV you will need to create this file on your computer and upload it.

Here’s the meaty content of my launchd plist:

Label com.arfore.VNC OnDemand RunAtLoad ProgramArguments /Users/frontrow/Applications/OSXvnc-server -protocol 3.3 -rendezvous Y -rfbauth /Users/frontrow/vncpasswd