Neato Vacuum and Li Ion Cells

Uncategorized No Comments »

The Neato finally acted as though I replaced with different cells.


  1. plug in a USB to a Mac
  2. screen /dev/tty.usbmodem1411
  3. GetVersion to see that we’re talking
    • …BatteryType,1,NIMH, (or similar)
  4. SetConfig BatteryType 3
    • BatteryType,3,LIION_4CELL,

I’ve been using a Neato-XV for a while, and after the first year, the battery wouldn’t hold a charge as well. Since I was replacing them, I decided to go with a Lithium-Ion stack.

Li-Ion on Amazon was very quick, and there was a vendor selling an exact drop-in. Arrived in good shape, half-charged as they should be, dropped them in, charged and ran like expected.

Now we’re a few years out, and either the Li-Ion has degraded, or has finally started acting like Li-Ion cells: the batteries’ Protection Circuit Module drops all connection when it’s fully charged. This is after it’s been charging all night as it usually does, but it seems the charge has gotten high enough to trigger the PCM cutting out.

This one change, mentioned in Neato XV 21 and Lithium battery converts the charging logic to expect a complete cut-out of power when charged rather than a slight drop — or at least accept the cut-out as a better sign.

Connecting to the Neato is described in the first page of the Neato Robotics Programmer’s Manual but not so much in terms of a Mac which has a serial connection client by default. I found that watching the difference before/after allowed be to see that the /dev/tty.usbmodem1411 device was being created on connection, so screen /dev/tty.usbmodem1411 is the way in. The first attempt failed, but starting up the Neato with a USB connected may have resolved that.

Single-Language Internationalization: Spellcheck Basis

Uncategorized No Comments »

Even if a project has only one language — ie has not yet been considered for internationalization — an internationalization message catalog can give benefits such as sanity-checking the text that is not subject to compiler cross-check. I’d like to look at the effort to do this in my own work.

I’m a big fan of things that can be automated, or that enable other capabilities without much effort. For example, I tend to recommend checking for a compatible standard rather than willy-nilly inventing a new one on the off-chance that accidental compatibility is reached (“hey, they use Dublin-Core, and we use Dublin-Core, we can use their text-manipulation tools with our outputs! We can work together without a code change!”)

By extracting the visible strings of text form an application, it’s possible to consider them en-masse even before translation. Messages can be more consistent (tense, tone, dialect). Additionally, it may be possible to spellcheck.


Spelling anyone?


Rsync Over FTP, on a Mac or BSD Client

howto, Uncategorized No Comments »

Recently I was discussing with someone the need to simplify the sync of a folder into an FTP server. The goal is that at set intervals, any change in a remote server is pulled to q local folder: changes changed, new files created, removed files removed. This is that kind of thing that should be easier, but it’s mixing an old technology (rsync) with a very, very old technology (FTP).

This is how to do it using mount_ftp and rsync.

Read the rest of this entry »

Java getOutputStream() surprises

Uncategorized No Comments »

As a not to my future self, apparently you need to open the connection before setting doOutput:

URLConnection connection = url.openConnection();

return connection.getOutputStream();

It’s a good thing that’s poorly documented and non-obvious, and that it fails in misleading ways.

Blog Engine Moved Again! Hello world!

Uncategorized No Comments »

The underlying blog engine for the blog stack was moved again… and since I used an import to sanitize the data, some things get restarted.  This isn’t as fatal as past moves, but we do get another “Hello World!” post đŸ™‚

10 PRINT 'Hello World!'
20 GOTO 10

Kernel: sandbox: xcscredd(141) deny file-read-metadata /Users

Uncategorized No Comments »

I keep getting this message on MacOSX 10.9.1 repeatedly:

10:42:47 Kernel: sandbox: xcscredd(141) deny file-read-metadata /Users
10:42:47 Kernel: sandbox: xcscredd(141) deny file-read-metadata /Users
10:42:47 Kernel: sandbox: xcscredd(141) deny file-read-metadata /Users
10:42:48 Kernel: sandbox: xcscredd(141) deny file-read-metadata /Users
10:42:48 Kernel: sandbox: xcscredd(141) deny file-read-metadata /Users

I found Leland Wallace‘s post on Apple’s self-help Support site, and tried the following:

*** /Applications/	2013-11-11 11:59:19.000000000 -0800
--- /Applications/	2014-02-11 11:03:50.000000000 -0800
*** 62,68 ****

  ;; suppress spurious failures due to keychain notifications from xcscredhandler
  (deny file-read*
!        (subpath "/Library/Server/Xcode/Credentials/Data")   ;; we have no buisness looking in here
         (with no-log)

--- 62,69 ----

  ;; suppress spurious failures due to keychain notifications from xcscredhandler
  (deny file-read*
!        (subpath "/Library/Server/Xcode/Credentials/Data")   ;; we have no business looking in here
!        (subpath "/Users")                                   ;;
         (with no-log)

Let’s see if that silences a bunch of unnecessary log-noise.

Jenkins on Synology xx09 -Series

Uncategorized No Comments »

In order to get a basic CI build box going, I decided ot leverage the Synology that seems underwhelmed in what I’ve currently thrown at it.

I’d love to see a Jenkins on but for now, it’s a hack.

I followed some basic online instructions to some success:

  1. Checking What kind of CPU does my NAS have, I clearly have a MPC8533 running 64bits and 512MB
  2. per,_bootstrap,_ipkg_etc I need the bootstrap, which I ran from a basic root login
  3. ipkg update, ipkg search jamvm pulled in libgmp-4.3.2-1, file-5.12-1, classpath-0.98-1, zlib-1.2.5-1, and jamvm-1.5.4-1
  4. jamvm -version
    java version "1.5.0"
    JamVM version 1.5.4
    Copyright (C) 2003-2010 Robert Lougher
    Execution Engine: inline-threaded interpreter with stack-caching
    Compiled with: gcc 3.4.3 20041021 (prerelease)
    Boot Library Path: /opt/lib/classpath
    Boot Class Path: /opt/share/jamvm/
  5. has a few typos (I hope I don’t add any!), but discusses how to hand-tool Jenkins into place:
    1. echo 'jenkins:x:145:145:Jenkins:/var/lib/jenkins:/bin/sh' >> /etc/passwd
    2. echo 'jenkins:*:10933:0:99999:7:::' >> /etc/shadow
    3. echo 'jenkins:x:145:jenkins' >> /etc/group
    4. mkdir -p /opt/jenkins/data
    5. ln -s /opt/jenkins /var/lib/jenkins
    6. check it so far: ls -al ~jenkins/data
    7. chown jenkins:jenkins /opt/jenkins/data
    8. wget -O /var/lib/jenkins/jenkins.war
    9. create the /var/lib/jenkins/ script below
    10. chmod 755 /var/lib/jenkins/
    11. run it: /var/lib/jenkins/
    12. check for errors in /var/lib/jenkins/data/console_log
    13. You now have a server online at your Synology server, port 8080
  6. Unfortunately, I’m stuck at:> JENKINS_HOME=/var/lib/jenkins/data /opt/bin/jamvm -XX:PermSize=512M -XX:MaxPermSize=2048M -Xmn128M -Xms1024M -Xmx2048M -jar /var/lib/jenkins/jenkins.war
    Unrecognised command line option: -Xmn128M
    ; removing that option, Segmentation fault (core dumped)
    … I think the next step is to swap in a full JVM in place of JamVM:

The start/stop script look like:

su -s /bin/sh jenkins -c "
cd /var/lib/jenkins
JENKINS_HOME=/var/lib/jenkins/data exec nohup /usr/java/bin/java -jar /var/lib/jenkins/jenkins.war $JENKINS_OPTS >/var/lib/jenkins/data/console_log 2>&1 &
echo $! >/var/lib/jenkins/data/"

That “JENKINS_…&” line is all one line from the “JENKINS_HOME=” to the “&” at the end. Also, if you’re cutting-and-pasting, watch out for “improved” quotation marks.

Brother MFC-J425W Scanner Buttons onto CentOS-6.4

Uncategorized No Comments »

I’m trying to get my scanner to send content to a CentOS-6.4 VM; I’m certain now it’s a case of using the buttons to trigger a request to pull content, which indeed fits the definition of what is actually happening in a modern day “push” of data (for example, MMS is really a short SMS to come and get a big payload; push-email is a notice to come and get stuff).

So. There I was. a MFC-J425W is really a brscan4 daemon, so I grabbed that:


Problem is, the install %post scriptlet of brscan4 called its own /opt/brother/scanner/brscan4/setupSaneScan4 which on line 13 went looking for /etc/sane.d/dll.conf which is part of sane. Unfortunately, the notion of “dependency” escapes those brscan* RPMs, so I’ll need to add that RPM as well. sane drags in most of the state of Georgia (well, maybe just sane-frontends which pulls in libexif, libgphoto2, libieee1284, libtool-ltdl, libv4l, lockdev, sane-backends, sane-backends-libs, and sane-backends-libs-gphoto2)

A re-install of the brscan twins (yum erase, yum localinstall) doesn’t experience the same error, so I’m onto a good start.

A quick “sudo /usr/bin/brsaneconfig4 -a name=Groucho model=MFC-J425W ip=” got me a registered printer under scanimage -L:

device `brother4:net1;dev0' is a Brother Groucho MFC-J425W

Success. I think ?

The next step would be a scanner-button-daemon such as scanbd; I want to use the provided Brother brscan-skey and I found that after scanimage -L found the scanner, brscan-skey can as well:

$ sudo brscan-skey -l

$ sudo brscan-skey -t
$ sudo brscan-skey
$ sudo brscan-skey -l

Groucho : brother4:net1;dev0 : Active

That’s a fair amount of progress for the day. These are mostly notes for myself, but I hope someone else can benefit. My next step would be a customization of the brscan-skey such as per

APC 9617 DHCP on MacOSX

Uncategorized No Comments »

The APC UPS controller AP9617 requires an additional DHCP Option 43 set to “APC” to indicate that the DHCP specifically knows it’s talking to an infrastructure device; it’ll refuse all DHCP not bearing this string. This avoids misconfigurations but can be a pain to realize and configure. MacOSX uses opensource code for its daemons but really prefers this XML-ish “plist” config (I’m not a fan of this nearly-XML because although it leverages the concise “yes, this is markup” and escaped content, it is positional (change the order of the sibling “key” and “value” and it’s all screwed up), and it cannot be addressed/read in XPath notation. Even locating the proper plist config file can be non-trivial.

The shortcut:

  1. insert “<key>dhcp_option_43</key><data>AQQxQVBD</data>” into /private/etc/bootpd.plist and
  2. sudo /bin/launchctl load -w /System/Library/LaunchDaemons/bootps.plist to activate

The detail:

In Standard ISC Bind config, (Keith Perry
# The following class identifier is used by the APC UPS: "APC"

class "APCUPS" {
match if substring (option vendor-class-identifier, 0, 3) = "APC";

# The following line populates the lease file with
# the Vendor Class Identifier that the client sends.

set vendor-string = option vendor-class-identifier;
# APC Network
subnet netmask {
pool {
deny dynamic bootp clients;
option routers;
option broadcast-address;
option subnet-mask;
filename "APC.bin";
option vendor-encapsulated-options "APC";
allow members of "APCUPS";
ping-check TRUE;

On MacOSX, /etc/bootpd.plist is the key component, read by a daemon started using sudo /bin/launchctl load -w /System/Library/LaunchDaemons/bootps.plist ( Tests can be made by making changes and “kill -HUP” (sighupping) the daemon, but it seems the underlying stack has already reserved a redirection for UDP/67 so running a bootpd or dhcpd outside of the launchctl won’t bind to the port (already in use).

The problem as well is that the <key>dhcp_option_43</key> we need to add to the config (to tell the APC that it’s OK, we know it’s an APC, you can accept this DHCP) isn’t one that MacOSX bootpd knows the format of, so it’ll complain (in the console log). Instead of a simple <key>…</key><value>…</value>, we need to use <key>…</key><data>…</data>, and the data needs to be Base64-encoded. I used, then checked it as follows:

$ echo -n 'AQQxQVBD'|base64 -D|od -tx1
0000000 01 04 31 41 50 43

This value is “code #1, length 4, #31, A, P, C”; AP9617 Documentation refers to this ‘1 A P C’ as “The APC cookie”. #31 might be the ASCII ‘1’ or an APC-specific “set option #31 to this value” marker.

The AP9617 then asks for an IP in a quicker mode when it’s just booting (cold-boot to Request is approx 18 seconds): > broadcasthost.bootps: [no cksum] BOOTP/DHCP, Request from 00:c0:b7:12:34:56 (oui Unknown), length 300, xid 0x317e, secs 32, Flags [none] (0x0000)
Client-Ethernet-Address 00:c0:b7:12:34:56 (oui Unknown)
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
Vendor-Class Option 60, length 3: "APC"
Client-ID Option 61, length 7: ether 00:c0:b7:12:34:56
CLASS Option 77, length 3: "MSP"

When it has no valid lease, it’ll eventually drop to a fuller Request or a Discover; as you can see, it has absorbed the IP that I had sent it without the proper Option-43 set, so it seems to be re-asking with the offered IP address of in a sort of “are you sure? (and please answer with option 43 set)”. Notice “Vendor-Option” is set in the Parameter Request line — I assume that’s specifically asking for Option-43.

14:54:25.674991 IP (tos 0x0, ttl 64, id 38, offset 0, flags [none], proto UDP (17), length 576) > broadcasthost.bootps: [no cksum] BOOTP/DHCP, Request from 00:c0:b7:12:34:56 (oui Unknown), length 548, xid 0x317e, secs 64, Flags [none] (0x0000)
Client-Ethernet-Address 00:c0:b7:12:34:56 (oui Unknown)
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Request
Requested-IP Option 50, length 4:
Parameter-Request Option 55, length 13:
Domain-Name-Server, Default-Gateway, Subnet-Mask, Domain-Name
TFTP, BF, BS, Vendor-Option
RN, RB, NTP, Time-Zone
Server-ID Option 54, length 4:
Vendor-Class Option 60, length 3: "APC"
Client-ID Option 61, length 7: ether 00:c0:b7:12:34:56
CLASS Option 77, length 3: "MSP"

With our DHCP server set up in /etc/bootpd.plist, we’re happy to oblige: > [udp sum ok] BOOTP/DHCP, Reply, length 300, xid 0x317e, Flags [none] (0x0000)
Client-Ethernet-Address 00:c0:b7:12:34:56 (oui Unknown)
sname "ACLARK-LT.local"
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: ACK
Server-ID Option 54, length 4:
Lease-Time Option 51, length 4: 85536
Domain-Name-Server Option 6, length 4:
Default-Gateway Option 3, length 4:
Subnet-Mask Option 1, length 4:
Vendor-Option Option 43, length 6:

Once it’s online, you can choose to accept DHCP offers lacking the APC Cookie for robustness; I did, but it opens me to rogue IPs. I think in my environment, there’s a higher risk of forgetting the random little bits that this device needs to appease its ego. Just take the IP and have a nice day đŸ™‚

The New Expanded Installer (or "XServe2,1 Mavericks") (still fails)

Uncategorized No Comments »

Based on the research in Macrumours thread #1404548 by dead.xx, The following is my altered walk-through for creation of an installer for XServe2,1 (Xserve 2008)

My source is /dev/disk2

  1. Enable hidden files:
    • defaults write AppleShowAllFiles -bool true && osascript -e 'quit app "Finder"'
    • (credit: Lauri Ranta
  2. Using the App Store, download — but do not run — Mavericks
    • success is a directory created, called “/Applications/Install OS X Mavericks/”
  3. Mount the InstallESD disk:
    • hdiutil attach -noautoopen -noverify /Applications/Install OS X
    • creates a /Volumes/OS X Install ESD
  4. Mount the Base System:
    • hdiutil attach -noautoopen -noverify /Volumes/OS X Install ESD/BaseSystem.dmg
    • creates a /Volumes/OS X Base System
  5. use Disk Utility to format your installation media as HFS+:
    • diskutil partitionDisk /dev/disk2 1 GPT HFS+ "Install OS X Mavericks" R
    • Note: the first partition as an EFI is assumed by GPT format
  6. Restore the Base System to your installation media:
      • asr restore --source /Volumes/OS X Install ESD/BaseSystem.dmg --target /dev/disk2s2 --erase --noprompt
      • might need “sudo”
      • mounts a second “OS X Base System” as “/Volumes/OS X Base System 1”
  7. copy mach_kernel from the root dir of OS X Install ESD to the root dir of your installation media (not needed, same kernel)
  8. copy Packages from the root dir of Mac OS X Install ESD to /System/Installation of your installation source:
    • rm -fr /Volumes/OS X Base System 1/System/Installation/Packages
    • cp -r /Volumes/OS X Install ESD/Packages /Volumes/OS X Base System 1/System/Installation/
    • In my case, /Volumes/OS X Base System 1/System/Installation/Packages links to a non-existent PackageLink directory; skipping
  9. edit /System/Installation/Packages/OSInstall.mpkg (skipped)
  10. copy boot.efi form the patch (skipped: 64-bit hardware)
  11. edit /System/Library/CoreServices/PlatformSupport.plist to add board ID and name of the mac:
    • vi /Volumes/OS X Base System 1/System/Library/CoreServices/PlatformSupport.plist
    • Add Mac-F42289C8 to the first list
    • Add Xserve2,1 to the second list
    • $ diff -c /Volumes/OS X Base System 1/System/Library/CoreServices/ /Volumes/OS X Base System 1/System/Library/CoreServices/PlatformSupport.plist

      $ diff -c /Volumes/OS X Base System 1/System/Library/CoreServices/ /Volumes/OS X Base System 1/System/Library/CoreServices/PlatformSupport.plist

      *** /Volumes/OS X Base System 1/System/Library/CoreServices/ 2013-08-24 18:40:19.000000000 -0700

      — /Volumes/OS X Base System 1/System/Library/CoreServices/PlatformSupport.plist 2014-02-11 22:03:45.000000000 -0800


      *** 71,76 ****

      — 71,77 —-




        + <string>Mac-F42289C8</string>





      *** 127,132 ****

      — 128,134 —-




        + <string>Xserve2,1</string>




  12. copy the modified PlatformSupport.plist to /System/Library/CoreServices/
    • cp /Volumes/OS X Base System 1/System/Library/CoreServices/PlatformSupport.plist /Volumes/OS X Base System 1/System/Library/CoreServices/
  13. boot the target using your installation media, and install; while installing:
  14. copy the modified PlatformSupport.plist to /System/Library/CoreServices/ while installing, before the reboot:
    • open a terminal on the target
    • cp PlatformSupport.plist /System/Library/CoreServices/PlatformSupport.plist (to be confirmed)

Unfortunately, during installation, the installer contacts Apple to get a list of valid hardware. That fails me.

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Log in