CRM quest: Redtail is a fail

In my eternal quest to solve what by rights should be an extremely settled problem by now, I entertained the 30 day demo of Redtail this week. I must report it to be quite a fail. In particular, a few substantial usability issues came up almost immediately:

As a Microsoft technologies backed product, it silently fails to work in Opera. It’s possible to login, but its synthetic drop down combo lists do not work in advanced searches, causing the product to return a server error message. Not a complete surprise.

Second, there is no way of importing existing contacts into the system. That has to be done by Redtail, although that is at least understandable.

Finally, the developers of Redtail seem to be using some bizarre pattern where, upon selecting from a combo list, it immediately spawns a new IE window, full screens it, then closes the original window. Such behavior is quite senseless. I rarely use Web products developed with Microsoft technologies, so this kind of behavior may seem entirely appropriate to Microsoft shops. Further, to actually get a PDF or XLS download out of the advanced search results, it is necessary to remember to hold down the CTRL key when selecting a report option. What kind of madness is that? Usability, anyone?

I politely told the Redtail agent that called regarding my trial account that the product seems to be a cute toy, but is entirely inadequate for my needs. Honestly, the behaviorisms I experience are rather an embarrassment and give Web based SaaS a terrible name.

I’d recommend CRM users look elsewhere solely based upon developer competence issues. The user experience should be beautiful. Redtail is not.

Finally moved to Gmail

Eventually, managing one’s own mail server ceases to entertain. A plethora of technologies need be managed to produce a useful mail server: Proper DNS records, relay configurations, encryption and authentication, Bayesian filters, DNS blacklists, storage, filesystem permissions, and so on. Further, that only gets one basic email. Distributed contact lists and easy, centralized filtering is its own software development project for which no decent solution exists. Enough already, truly.

Today I bid farewell to ever having to deal with the machinations of email systems.

SSH key distribution with Ruby and Net::SSH::Multi

When faced with deploying a ssh key to a ton of servers using password authentication, there is but one solution. Ruby, naturally. Below is a script that will iterate through a list of hosts either via STDIN or IO redirection, query for a password once on the command line, then proceed to distribute a specified key to each host.

#!/usr/bin/ruby1.8
 
#
# Jason Boxman <jasonb@edseek.com>
# 20110624
#
# Sanely deploy ssh public key to multiple hosts.
# Will prompt for ssh password using highline.
#
 
require 'optparse'
require 'fcntl'
require 'rubygems'
require 'net/ssh'
require 'net/ssh/multi'
require 'net/ssh/askpass'
require 'highline/import'
 
OptionParser.new do |o|
	o.on('-f', '--keyfile FILENAME',
		'You must specify a public key to distribute') do |filename|
		$keyfile = filename
		$keydata = IO.read($keyfile).gsub(/\n/, '') if File.exists?($keyfile)
		raise 'No keydata' if $keydata.nil?
	end
	o.on('-h') {puts o; exit}
	o.parse!
end
 
# Based upon this thread or $stdin gets messed up:
# http://stackoverflow.com/questions/1992323/reading-stdin-multiple-times-in-bash
old = $stdin.dup
new = File::open('/dev/tty')
$stdin.reopen(new)
passwd = ask("Password?") {|q| q.echo = false}
$stdin.reopen(old)
new.close
 
options = {
	:concurrent_connections => 5,
	:on_error => :ignore,
	:default_user => 'root'
}
sess_options = {
	:password => passwd,
	:auth_methods => ['password'],
	:verbose => :warn
}
 
def get_hosts
	(STDIN.fcntl(Fcntl::F_GETFL, 0) == 0) ?	ARGF.collect {|f| f} : nil
end
 
# Iterate over a group of servers and deploy an SSH key
Net::SSH::Multi.start(options) do |session|
	session.use(sess_options) { get_hosts }
	session.exec <<-EOT
	test -e ~/.ssh || mkdir ~/.ssh
	test -e ~/.ssh/authorized_keys || touch ~/.ssh/authorized_keys
	if ! grep -q "#{$keydata}" ~/.ssh/authorized_keys ; then
		chmod go-w ~ ~/.ssh ~/.ssh/authorized_keys ; \
		echo "#{$keydata}" >> ~/.ssh/authorized_keys
	fi
	EOT
end

ca Makefile missing in action

As this Makefile from the now dead sial.org/howto/openssl/ca/Makefile is much linked to, but nearly impossible to find elsewhere, he’s a copy I eventually pulled from Google:

Update, 19 July: The Makefile wasn’t really very useful as that version didn’t work. Instead, I suggest this excellent guide geared towards Puppet, but applicable in general. The openvpn package includes a working set of examples, too.

Chef and dbconfig-common: A world of hurt

In constructing a Chef cookbook for managing dspam, I happened upon dbconfig-common, a framework that allows a package to manage database backends somewhat transparently. However, it has no affinity for preseeding. Another approach is necessary for the libdspam7-drv-mysql package.

In the relevant section of the recipe below, the file created to cache relevant database values is seeding with the correct values, plus the MySQL administration password. (Eventually, support for PostgreSQL will be added to the cookbook, but it took a while to work out how to seed dbconfig-common.)

# The usage of dbconfig-common complicates things because it won't overwrite
# the shipped mysql.conf without prompting and that apparently cannot easily be
# forced.  It also cannot be preseeded, so libdspam7-drv-mysql.conf must be
# seeded and cleaned up after.
 
directory '/etc/dbconfig-common' do
	owner 'root'
	group 'root'
	mode 0755
end
 
template '/etc/dbconfig-common/libdspam7-drv-mysql.conf' do
	source 'libdspam7-drv-mysql.conf.erb'
	owner 'root'
	group 'root'
	mode 0600
	backup false
	not_if 'test -f /etc/dbconfig-common/libdspam7-drv-mysql.conf'
end
 
script 'rename config' do
	action :nothing
	interpreter 'bash'
	code <<-EOT
		mv -f /etc/dspam/dspam.d/#{drv_name}.conf.ucf-dist \
			/etc/dspam/dspam.d/#{drv_name}.conf
		chown dspam:dspam /etc/dspam/dspam.d/#{drv_name}.conf
		chmod g+r /etc/dspam/dspam.d/#{drv_name}.conf
		mv -f /etc/dbconfig-common/libdspam7-drv-mysql.conf.ucf-dist \
			/etc/dbconfig-common/libdspam7-drv-mysql.conf
		rm -f /etc/dbconfig-common/libdspam7-drv-mysql.conf.ucf-old
	EOT
	only_if "test -f /etc/dspam/dspam.d/#{drv_name}.conf.ucf-dist"
	notifies :restart, resources(:service => 'dspam')
end
 
package drv_package do
	action :install
	notifies :run, resources(:script => 'rename config'), :immediately
	# dbconfig-common uses ucf, which does not have anything to do with dpkg force-confnew sadly.
	#options '-o Dpkg::Options::="--force-confnew"'
end

Naturally, there’s a template file, referenced above, with the values to feed to dbconfig-common.

dbc_install='true'
dbc_upgrade='true'
dbc_remove=''
dbc_dbtype='mysql'
dbc_dbuser='dspam'
dbc_dbpass='<%= node[:dspam][:server][:db_password] =%>'
dbc_dbserver=''
dbc_dbport=''
dbc_dbname='dspam'
dbc_dbadmin='root'
dbc_dbadmpass='<%= node[:mysql][:server_root_password] =%>'
dbc_basepath=''

At some point, the full cookbook will be available on github. I need to work out how to cleanly extract it, probably using the awesome git-subtree project.

Safely unplugging Western Digital My Passport USB drive

Having recently acquired a 1TB WD My Passport SE USB 3.0, I would hate to destroy it. I noticed it shuts down when removed from a Windows system safely, but simply unmounting under Kubuntu via the Device Notifier applet does not have the same effect. Naturally, I become worried about destroying my device.

Fortunately, there is a solution to this. Yan Li devised a script that will correctly power down a USB drive so it can be safely removed. It works great with my WD Passport. Should work for any USB drive though.

It’s necessary to install the sdparm package for it to work, but otherwise works out of the box under Kubuntu 10.10.

Thanks Yan!

Enabling AirLink 101 Golden N AWLL6075 on Ubuntu 10.10

I just grabbed one of these adapters for $10. Naturally it doesn’t work out of the box. Fortunately someone found a solution before I had to fuss with it too much.

usbcore: registered new interface driver rtl819xU
rtl819xU:FirmwareRequest92S(): failed with TCR-Status: a
rtl819xU:ERR!!! _rtl8192_up(): initialization is failed!

The solution is easy, though.

$ wget http://launchpadlibrarian.net/37387612/rtl8192sfw.bin.gz
$ gunzip rtl8192sfw.bin.gz
$ sudo su -
# rmmod r8192s_usb
# mkdir -p /lib/firmware/RTL8192SU/
# mv rtl8192sfw.bin /lib/firmware/RTL8192SU/
# modprobe r8192s_usb

After that it seems to work fine.

And yes, the range on one of these is almost worse than useless. The AP needs to be quite close.

Hosed by CenturyLink

We’re looking to move our business address and CenturyLink can’t let us keep our existing number. Naturally, we’re still in the service area, so we can get a new number. If we’d rather port our number to another service — can’t image why we’d want to keep the number we’ve had for years that all the clients know — we’re stuck paying about a $300 termination fee. Yeah, on the landline. Contracts are heretofore unknown to vanilla telephone providers, but apparently it’s the new thing.

It’s disgusting.

So was the original way we ended up in a contract. Someone called and offered to give a lower cost bundle. Yeah, ended up in a service agreement. Never told a two year service agreement was the consequence of having the changes made, or I would have hung up instead.

We’re going to terminate service with CenturyLink. I can’t abide by such unethical practices. By switching to a metered VoIP provider, we can get all our rollover lines and save a fortune, easily recouping the outrageous termination charge in just six months or less. What’s more, it’s easier than ever. We’re going to pick up an OBi device. It’s like magic.

Don’t look now, but your vehicle just left without you

Seriously, what a silly diary.

And now back to the point of this rant: this is why I quit caring about Dkos. All the fucking emo “OMG he’s not doing it the why I want.” Well get yourself and 199 other progressive congresscritters elected and we can talk about that. Until then Obama is the vehicle we have to drive our agenda.

Don’t look now, but he’s driving away with “our” agenda. I’m pretty much done with the morally bankrupt tools in the Democratic Party. While Maimonides is happy to be a party person for the duration, I have better things to do with my time than support such lunacy. The establishment isn’t going anywhere as long as you lend it your support. I prefer having a clean conscious, in any event.

NWN Cleric in OC ridiculously overpowered

Playing through the OC again with a cleric build. Tweaked it some as the OC maxes around level 16 or level 17. Decided on 14 STR, 10 DEX, 12 CON, 14 INT, 16 WIZ, 10 CHAR. Naturally a cleric build customized for casting is heavy on the WIZ. The purpose of 14 INT is the expertise feat, which provides +5 AC by way of a -5 penalty to attack. In instances where it’s necessary to enable expertise in combat, I’d take survivability over hits any day. It also obviates the need for the combat casting feat, a rather useless feat for a cleric and even a wizard.

Thus far I haven’t encountered too many fights of any difficulty. The queen dire spider in beggar’s nest was somewhat of a pain due to the lower strength after poisoning, even with expertise enabled, but otherwise not too awful. Upon hitting 5th level, nothing has really challenged my build.

Naturally the cleric ability to self buff really shines. Once sufficient 3rd level spell slots open up, I cast extended strength and endurance. Extended darkflame makes an appearance at 4th level. Moreover, extended divine favor is especially nasty and ultimately fills all my 2nd level slots. By 11th character level that’s nearly enough to last the entire duration of darkflame and bull’s strength.

The build’s biggest problem seems to be there are more awesome buffs to cast than the need to cast them. With the chosen domains of strength and trickery, I have divine power as a 3rd level spell, but rarely need to cast it and haven’t moved it up to 4th level as an extended spell yet, even as an 11th level cleric.

One of the toughest fights in NWN OC is Brother Toras, a liche and second chapter optional fight. Having fought with a bunch of builds, taking him with a solo 9th level cleric has probably been the easiest. (Previously used a rogue, wizard, and ranger, listed in order of challenge.) A little speed and a lot of bashing before tentacles comes out and we’re off to the races.

Naturally harm pops up at 11th level. No dragon in chapter three will be safe. Certainly not very sporting, but then playing as a cleric never is.

Oh, and being able to cast continual flame on equipment before selling it is quite a cheat. I should just stop, no really. Almost doubles the sale price for items under 10k gp.

Assorted ramblings from way too much play.

I will be forever eternally grateful so few games run under GNU/Linux.

Update. I ended up just bashing all the dragons instead. Didn’t even need harm. Casting gate and watching a Balor blowup Margrim by casting implosion was priceless.