Is High-End Hifi a hoax ….

In an youtube video John Darko (could have been this one) argued that a thing costing 25,000$ is reasonable well priced if it does provide the same as other things which cost around the same.

The problem in this, is that will you actually get something which is really that good (to the price) or are you being ripped off.

In another video (this one) John Darko argues that the Allo DigiOne Signature (priced around 500$) is as good as a similar streamer costing more than 3,000$ – now how does the first (later) comment connect to the first comment.

It does not…..

Yes the Hifi industry is driving by quality, but price does not have anything to do with it.

Remember your iPhone which cost your more than 1,000$ actually only cost around 250$ to produce, then you probably have to take another 25-50$ for the work on the design and so stuff. But when you then hear than Apple earns +10 billion $ a quarter… then it starts to show that someone is paying a lot more for something than what it is worth.

High-End Hifi is not a hoax, but but there is a lot of products which is not worth the money you pay for it – you can get something really good for a few buck, but you can also get a lot of crap for a lot of money.

Is a 2000$ amp actually so much better than a 500$ amp – yes it is, but is it 4 times better – no. At some point you can poor a lot of money into the amp, and not really get something much better, as the improvement is minute.

It is the combination, get the best amp, speakers and sources you can get for your budget, and you’ll probably be surprised how good it sounds.

It’s about listening to the music, not listing to the stereo….

EIZO Colornavigator – Data Access Error

The other day I changed the SSD in one of my Macbooks (retina …), and restored it from a TimeMachine backup.

Everything was working, except for Eizo Colornavigator 7, which gave me an error:

“Data Access Error – Failed to write data. The data my be corrupted. Uninstall ColorNavigator 7 once and reinstall it”

If for the life of it couldn’t figure out what was going on, even using AppCleaner (which normally does a proper cleanup) did not fix it. I removed everything else I could find which had to do with Eizo, and still problem was there.

I then contacted Eizo Support, which told me to reinstall … dooo…..

But I then just for the fun of it install the latest version again, and look at what it installed, and found “/Library/Application Support/EIZO/tools/ColorNavigator 7/” which have Uninstaller Full.app” and “ColorNavigator 7 Uninstaller.app”.

So the fix is:

# cd  “/Library/Application Support/EIZO/ColorNavigator 7/tools”
# open “ColorNavigator 7 Uninstaller Full.app”
Let it finish, then reinstall and presto it works again.
What hidden file it removes I do not know, maybe that is for another day.

Using Borg backup across SSH with sshkeys

Borgbackup is a fantastic piece of software. It’s a free deduplicating archiver with compression and encryption, which reduces the amount of storage one needs to have to be able to keep backup archive for a very long term.

One of the great small things it can do is that it can run across the wire using ssh, authenticating with sshkeys. Sadly the documentation is not 100% correct, and it lack one bit of information for one to be able to get it to run.

The steps to get it working are:

  1. Follow the documentation to install borg
  2. Create a user on the destination server which will be the one who owns the repo.
  3. On the destination create the repo: borg init <path/repo name>
  4. On the source create an sshkey without passphrase (it is possible to do this with a passphrase – I just couldn’t be bothered), and distribute the key to the destination server/user.
  5. Create a script which is use to setup a few environment variables which borg needs:
    1. BORG_PASSCOMMAND=”cat <file containing the password for the repo>”
    2. BORG_RSH=”ssh -i <path>/<private key>” <<== this was created in step 4).

     

Now it’s possible to run borg:

# borg create --stats --compression zlib,5  ${REPOSITORY}::`hostname`-`date +%Y-%m-%d` \
/home/myuser \
/root
/etc
....

Without BORG_RSH it is not possible to make it load the sshkey. The other option would be use ssh_agent, but that is cumbersome.

Dump Classes and Functions from a Jar

I on a regular basis find me in the situation were I need to find out which jar exactly exposes a class or function.

For years I’ve been using:

# for f in *.jar ; do
echo ===== $f
strings | grep "function"
done

Which kind of works, but it does actually not dump all the function names.

So after a bit of research I came up with:

for f in *.jar ; do 
    jar tf $f | while read fl ; do 
        cl=$(echo $fl | sed 's/\//./g'); 
        c=${cl%.*} ;
        javap -classpath $f $c; 
    done; 
done

This will produce output like;

 

....

Compiled from "ServerSessionPool.java"
public interface javax.jms.ServerSessionPool {
 public abstract javax.jms.ServerSession getServerSession() throws javax.jms.JMSException;
}
Compiled from "Session.java"
public interface javax.jms.Session extends java.lang.Runnable {
 public static final int AUTO_ACKNOWLEDGE;
 public static final int CLIENT_ACKNOWLEDGE;
 public static final int DUPS_OK_ACKNOWLEDGE;
 public static final int SESSION_TRANSACTED;
 public abstract javax.jms.BytesMessage createBytesMessage() throws javax.jms.JMSException;
 public abstract javax.jms.MapMessage createMapMessage() throws javax.jms.JMSException;
 public abstract javax.jms.Message createMessage() throws javax.jms.JMSException;
 public abstract javax.jms.ObjectMessage createObjectMessage() throws javax.jms.JMSException;
 public abstract javax.jms.ObjectMessage createObjectMessage(java.io.Serializable) throws javax.jms.JMSException;

....

See perfect way to find that elusive class/function.

 

Apple AirPort Express and Digital Jitter..

I’m doing something which I can’t really afford, but doing it anyway … I’m upgrading my Stereo … I like music, and  believe it should be played at the highest affordable quality.

So after getting a new Stereo Amp (Creek Evolution 50A), I got a new Phono Amp. and then started looking for a DAC … and after reading I do not know how many posts I decided to get an S.M.S.L M8 (from Amazon fro €249.99), not too expensive and according to what I can read very good.

So I got it hooked it up to my amp, connected my Notebook (Macbook Air 11″ / 2011) using USB … sounded nice, then my Macbook Pro Retina with digital (fiber) in some way better than USB, slightly more air and openness. Then decided to use my old Apple Airport Express (MB321LL/A – 802.11n version 1) using it’s digital output (I don’t like the build in DAC – it’s a bit too dark for me), and this is where I started having doubts about my buy.

There was drop out, all the time. Right I changed, to direct WIFI; same, I change to a newer model (the square one which I also have), same jitter, ever 1-2 seconds a drop out.

I asked on head-fi.org and someone after a few days suggested that I should try to reduce the jitter on the Airport Express … and after a a couple of hours I found this thread/post on the Apple Support forums, suggesting that it’s firmware problem, and that the solution is to downgrade to firmware 7.6.1.

See that could be a problem, as finding it as a download is not that easy, but I was in luck it’s possible to do it directly from the AirPort Utility (click on the version while holding down ‘option’), and select 7.6.1 … wait … reboot … and it works.

With the square Airport Express (802.11n version 2) it’s not possible to downgrade to 7.6.1 (I only see 7.6.2), there is a bit more information here:

But I have not been able to figure out what version the square is … if someone know please let me know.

So, jitter is a problem for all firmware’s after 7.6.1 …

 

Auto Staring btsync (Bit Torrent Sync) / SyncApp on CentOS

I used to use this software, and wanted to share the init script I’ve been using:

#!/bin/bash
#
# Super ultra basic startup script for btsync
#
# chkconfig: 345 55 25
# description: bittorrent sync
# processname: btsync
# pidfile: 
# config: 

# Source function library
. /etc/init.d/functions

# Get network config
. /etc/sysconfig/network

if [ -f /etc/sysconfig/btsync ]; then
 . /etc/sysconfig/btsync
fi

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 1

if [ ! -f $BIN ] ; then
 echo "missing binary: $BIN" 
 exit 1;
fi

if [ ! -f $CONF ] ; then
 echo "missing configuration: $CONF" 
 echo "run $BIN --dump-sample-config to create a default configuration"
 exit 6;
fi

if [ -z $USER ] ; then
 USER=root
fi

start() {
 DIR=$(dirname "${PID}")
 if [ ! -d "$DIR" ] ; then
 mkdir $DIR
 fi
 daemon --pidfile $PID --user $USER $BIN --config $CONF
 echo_success
}

stop() {
 killproc -p $PID $BIN
}

case "$1" in
 start)
 start
 ;;
 stop)
 stop
 ;;
 restart)
 stop
 start
 ;;
 status)
 status -p $PID $BIN
 ;;
 *)
 echo "usage: $0 {start|stop|restart|status}"
 ;;
esac
exit 0;

And then the /etc/sysconfig/btsync

# SyncApp Settings
# USER=syncapp
CONF=/etc/btsync.conf
BIN=/usr/sbin/btsync
PID=/var/run/btsync/btsync.pid

Auto staring PlexConnect on CentOS

With AppleTV 4 we are getting a native Plex client, but some people are still using PlexConnect as it works, and is very stable.

Some time ago I create a very simple init script to start, stop and update PlexConnect:

#!/bin/sh
#
### BEGIN INIT INFO
# Provides: PlexConnect
# Required-Start: $network $local_fs
# Required-Stop: $local_fs
# Default-Start: 3 5
# Default-Stop: 0 1 6
# Short-Description: starts PlexConnect
# Description: starts PlexConnect
### END INIT INFO

# Source function library.
. /etc/init.d/functions
. /lib/lsb/init-functions

if [ ! -f /etc/sysconfig/PlexConnect ] ; then
 echo "/etc/sysconfig/PlexConnect missing!"
 exit 0;
fi

. /etc/sysconfig/PlexConnect

## Variables
#USER=root
#PROG=PlexConnect
#LOCKFILE=/var/lock/subsys/$PROG
#HOMEDIR=/srv/$PROG
#PIDFILE=/var/run/$PROG.pid
#PYTHON=/usr/local/bin/python2.7

start() {
 # Check for already running
 if status $PROG > /dev/null ; then
 echo "$PROG (pid `pidofproc -p $PIDFILE $PROG`) is running..."
 exit 0;
 fi
 # Start daemon.
 echo -n "Starting $PROG: "
 cd $HOMEDIR
 screen -dmS $PROG $PYTHON $PROG.py $OPTIONS
 RETVAL=$?
 if [ $RETVAL -eq 0 ] ; then
 PID=`screen -ls | grep PlexConnect | awk -F'.' '{print $1}' | tr -d '\t'`
 echo $PID > $PIDFILE
 log_success_msg ""
 else
 log_failure_msg ""
 fi
 [ $RETVAL -eq 0 ] && touch $LOCKFILE
 return $RETVAL
}

stop() {
 echo -n $"Shutting down $PROG: "
 killproc -p $PIDFILE $PYTHON
 RETVAL=$?
 if [ $RETVAL -eq 0 ] ; then
 log_success_msg ""
 else
 log_failure_msg ""
 fi
 [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
 return $RETVAL
}

update() {
 echo "Updating $PROG"
 cd $HOMEDIR
 git pull 
}


# See how we were called.
case "$1" in
 start)
 start
 ;;
 stop)
 stop
 ;;
 status)
 status $PROG
 ;;
 restart|force-reload)
 stop
 start
 ;;
 try-restart|condrestart)
 if status $PROG > /dev/null; then
 stop
 start
 fi
 ;;
 update)
 RESTART="FALSE"
 if status $PROG > /dev/null; then
 stop
 RESTART="TRUE"
 fi
 update
 if [ "$RESTART" = "TRUE" ] ; then
 start
 fi
 ;;
 reload)
 exit 3
 ;;
 *)
 echo $"Usage: $0 {start|stop|status|restart|try-restart|force-reload|update}"
 exit 2
esac

It will require /etc/sysconfig/PlexConnect:

# PlexConnect Settings
USER=root
PROG=PlexConnect
LOCKFILE=/var/lock/subsys/$PROG
HOMEDIR=/srv/$PROG
PIDFILE=/var/run/$PROG.pid
PYTHON=/usr/local/bin/python2.7
OPTIONS=""

(PlexConnect like Python 2.7)

Could probably be made smarter, but it works for me.