Recent Blog Posts

Smokin’ Some More

This isn’t going to turn into a food blog but, here is another post where I show a bunch of grilled meat. Since the last post was the first time I had smoked anything, it’s all still quite new to me. I know I’m going to screw it up eventually but, maybe if I keep track of what I’m doing, I’ll keep the screw ups down to a minimum.

Anyway, I’m hoping to start catching some sales on various meats so I can prepare them on the weekends in the smoker and have it for lunch throughout the week. On the smoker this weekend was a 4lb boneless pork loin and 10lbs of chicken leg quarters.

First I started with the chicken. I made up a brine with some Creole seasoning (1 gallon of water and 1/2 cup of the seasoning) and let the chicken soak in it for a total of three hours. For the loin, I decided to basically do it like I did the pork shoulder last weekend. First, I coated it with mustard and a pork rub and left it to sit while I prepped the smoker.

Once the smoker was up to around 225F, I tossed in some chunks of hickory and put the loin on the bottom rack. I kept the smoke rolling for a few hours until the loin reached 130F internally. At this point, the loin was starting to look a little dry on the ends so I wrapped it with heavy duty foil and placed it back on the bottom rack. This was also the time that I put all the chicken on. I also added more charcoal/hickory and tried to keep the smoker around 250F.

With the chicken being slightly layered, I had to go in and flip/rearrange the pieces a few times so that the smoke would cover all areas.

When the loin reached 170F, I pulled it out of the smoker to see how it looked. Quite a bit of the fat layer had melted and kept everything nice and moist. Seeing that it was done all the way through, I sliced it up for the smoked pork chops for dinner that night. They turned out damn good. Even my son (3yo, super picky eater, some days we can’t get him to eat much of anything…) ate quite a bit of it.

After a call from my mother in law earlier in the day, it was decided that we were going to take the chicken out the next day for dinner. So, knowing that it’d need to be reheated, I wanted to pull the chicken out a little early. When it reached 150F (chicken is done at 165F), I created a big pouch with foil and wrapped the chicken up and put it in the fridge. The next day, the chicken went in the oven for about an hour (at 350F) and it was ready. Having it in the brine prior to cooking really helped keep it moist and I think that I didn’t need to pull it out of the smoker early. Next time, I’ll cook it all the way without fear of it drying out.

All in all, was good eating. And on a side note, I gotta make sure to not mention to my mother in law that I’m smoking a bunch of meat so I can keep it all to myself. Next weekend, I’m already planning on having my parents up for a pork shoulder picnic roast that’s currently in the freezer.

Now I’m Smokin’

Something that I’ve always loved is grilling food. Fire up the grill, put on some tunes, grab a cold drink and after the cooking is done, enjoy some smokey great food. I can’t say that I’m a grill master or anything but, I rarely have complaints. So long as you don’t overcook whatever you’re cooking, the grill is quite forgiving. The added smoke flavor makes nearly anything taste better.

So why have I never gotten a smoker?


Good question. Recently, a buddy at work brought in a charcoal smoker for me, that hadn’t been used in many years. He now uses an electric smoker and this one was sitting in a shed, gathering dust. I gladly brought it home, cleaned it up and made plans to use it as soon as possible. My wife and I decided to make pulled pork for Mothers Day. w00t! I couldn’t wait for the weekend.

The day before the big smoke out, I figured that it’d be best to fire up the smoker to test it out. The water pan in it had a couple of small rust holes which would not be good for attempting to keep a fire going underneath. I decided earlier in the week, after doing a little research, that I was going to layer aluminum foil and sand in the bottom of the water pan. Seems that some people never fill the water pan with liquid and fill it with sand instead anyway. The thought there is that the sand helps regulate and maintain the heat. So, while I had the fire started, I went to work on the water pan and some heavy duty aluminum foil. A few layers of foil went in, then I filled it about a third of the way with sand and another layer of foil on top. This left plenty of room to fill the remainder of the pan with liquid. And, it all successfully stopped the pan from leaking.

By time I was done with the water pan “repair”, it was nearing time to cook dinner anyway. Momma and the kids wanted brats and I had gotten some fish fillets (Pollock to be exact) that I planned on grilling. So, the grill was fired up for the brats and I seasoned the fish and threw it on the smoker. An hour later, I was enjoying smoked fish. Mmm…

For the big Mothers Day meal, I got a 5 pound pork shoulder, some pork rub and a jug of apple juice. One tip I’ve both read and been told was to use mustard to apply the rub to the meat. The mustard helps the seasonings stick to the meat and will cook off without flavoring the meat. So, after I rolled out of bed an hour after I planned on and brewed some coffee, I applied the mustard and rub to the roast. Off to the smoker I went to build the fire, fill the water tray with the apple juice and once the smoker had warmed up, I tossed the shoulder on and hoped for the best. Ended up getting it on at 8:30AM, a full half hour after I wanted too but, still early enough. Hell, I hadn’t even finished my first cup of coffee before I had dinner cooking…

I tended to the fire quite often to keep it at near 225F. Here it is at the 3 1/2 hour mark:

And at the six hour mark:


After six hours, I was starting to get a little worried that it wasn’t going to be done in time so I wrapped it up in foil (which I planned on doing anyway about this point). I decided to increase the heat to around 300F for a little while. Since the fat was just melting off the meat by this point, I wasn’t too worried about it drying out with it all being contained in the foil. Although, I think I added a few too many chunks of lump charcoal because the temp increased way more than intended near the end. Still, all is well that ends well, and this did. This ended very well.

I pulled the pork apart with a couple of forks, mixed half of the meat in one of my favorite BBQ sauces (which my wife had warmed up on the stove) and we enjoyed some fantastic pulled pork.

On a final note, thanks for the smoker Nick! I’m positive I’ll be getting quite a bit of use out of it this summer.

BashScriptVille

I have had my matrix StatusNet instance up for quite some time. This instance consists of six accounts that mostly spit out random notices that are pulled via various bash scripts. I decided it was time to recreate some of this for pump.io.

After installing pump.io, there is a handful of cli tools in /pump.io/bin. With these scripts, you can register a user, post a note, follow another user, etc… Using the scripts, I’ve created a few (at the time of this writing, there are 10) accounts to post random posts of useful (or is it useless…) tidbits.

Off to the commandline…

The first step for me after deciding on what crap to pull, is to write a bash script to pull the said (sed?) crap. Using the good ol’ tools curl, cat, grep, sed, awk, etc… I’ll parse whatever page down to the actual message that will be sent.

For the rest of this, I am assuming that:

  • the /pump.io/bin directory is in my $PATH.
  • That registration is open for the target pump.

Also, since pump.io is currently being heavily developed, any of this may not work quite the same in the future.

First, your “app” (in this case, the commandline) will need to be registered with the site, to do so, use the pump-register-app script. If you open the script (or attempt to run it without any arguments) it’ll list what options that it requires. To register my commandline, I used this command:

pump-register-app -s pump.jpope.org -P 443 -t CLI

The next step is to create the user or, if the user has already been created, to authorize the user. To create a user:

pump-register-user -s pump.jpope.org -P 443 -u username -p password

or to authorize existing user:

pump-authorize -s pump.jpope.org -P 443 -u username

The pump-authorize script will return a URL that will need to be opened so that the verifier value can be copied and pasted to complete the authorization.

These scripts will create the directory ~/.pump.d which will contain all of the needed OAUTH tokens that will be required to post a note. Posting a note is now as simple as:

pump-post-note -s pump.jpope.org -P 443 -u username -n "Hello World!"

And with this, scripting a random note becomes quite easy. Here are a few of the scripts that power my current list of bots living in BashScriptVille:

  • Today in history Link
  • Astronomy Picture of the Day Link
  • Word of the day Link
  • Random Quote Link

Once the bash scripts are working the way I want, I’ll add entries to cron so that they will post at random intervals. One thing to note about the pump-post-note script is that currently, it’ll only post notes to your followers. Also, for ease of use outside of bash scripts if you only post to one pump, you could alias the pump-post-note script so that you don’t need to add the server/port

And that’s it, scripted pump.io bots.

Sidenote: Once identi.ca makes the switch to pump.io, I will likely be closing my matrix instance. I foresee more activity taking place within the pumpiverse as opposed to the few various StatusNet instances that will be left. Also, my webserver will gladly take any relief it can get from running fewer php/mysql based webapps.

The Meantime by The Centennial

Just a quick post, shamelessly promoting bands I know.

Fantastic song.

YouTube Link

The guy singing here, Patrick Meese, is a good friend of my brother. He also plays drums for my brother-from-another-mother Nate as well as with one (actually a few) of my brothers side projects.

This track is one off the new album, Nervous System. This album is one of my recent favorites as well.

Both Patrick and his brother, Nathan, joined my brother and Nate for a reunion of an old, fairly popular, Denver band, Born in the Flood.

YouTube Link

My (real) brother is playing bass and my (another mother) brother is singing/playing keys.

Rock on!

Pump

Seeing that I’ve had a whole string of StatusNet posts, I figure that it’s time to start some pump.io posts. I’ve had a pump running since mid January and it’s been much fun watching the early development happen. As of this writing, the current stable version (which Evan has his various pumps running) is v0.2.1. My pump is running git master because I like to live on the edge. Although, for the most part, it has been mostly painless. I have tried my damnedest to put any issues that I come across on the issue list. With this post, I will be going through my setup. I should note that my setup may not work for everyone, YMMV.

I am running my pump on my mostly recently unused EeePC 1000HE w/2GB RAM which is running good ol’ ArchLinux. Seeing that my tablet has become my goto mobile device (and even got a keyboard dock for it as well), my netbook just seems bulky and underpowered anymore. (bulky? what?) It was time to find something else for it to do. Enter the pump.

Before starting the rest, here are the versions of various things that I’m currently using as of this writing:

  • nodejs: v0.8.21
  • npm: v1.2.11
  • redis: v2.6.10
  • nginx: v1.3.14
  • pumpio: v0.3.0-alpha1

Also, I grabbed a free SSL cert from StartSSL as I do for all of my domains/subdomains.

Following the Local install directions, I installed nodejs and Redis and cloned pump out of git and installed the dependencies with npm. Along the way of running the pump, I’ve also installed a couple of other tools which have helped things out, forever and bunyan. Both of these I’ve installed globally as root with:

# npm install -g bunyan # npm install -g forever

For Redis, I’ve left it with the default settings. To setup the pump, I copied the pump.io.json.sample to /etc/pump.io.json and edited it similar to this:

{ "driver": "redis", "params": {"host":"localhost","port":6379}, "secret": "secretkeygoeshere", "noweb": false, "site": "pump.jpope.org", "owner": "jpope dot org", "ownerURL": "http://jpope.org/", "port": 443, "hostname": "pump.jpope.org", "address": "int.er.nal.ip", "nologger": false, "serverUser": "pumpio", "key": "/path/to/pump.key", "cert": "/path/to/pump.crt", "uploaddir": "/srv/http/pump.jpope.org/uploads", "debugClient": false, "firehose": "ofirehose.com", "noCDN":true, "requireEmail": false, "disableRegistration": false, "canUpload": true, "sockjs": true }

A few of these setting here I have added from finding them in the code here and there. After this was setup, I created the pumpio user that I wanted the pump to run as with:

# useradd -s /bin/bash -d /srv/http/pump.jpope.org

And then as root, started the pump with

# ./bin/pump

Since my main webserver runs nginx, I needed to setup a proxy so that requests would pass through to the EeePC. Here is an example of my nginx conf:

upstream pumpbackend { server eee.pc.ip.add:443 max_fails=3 fail_timeout=30s; server eee.pc.ip.add:443 max_fails=3 fail_timeout=60s; server eee.pc.ip.add:443 max_fails=3 fail_timeout=90s; } server { listen 80; server_name pump.jpope.org; rewrite ^ https://pump.jpope.org$request_uri?; } server { listen 443 ssl; server_name pump.jpope.org; access_log /var/log/nginx/pump.access.log; error_log /var/log/nginx/pump.error.log debug; ssl_stapling on; ssl_trusted_certificate /path/to/startssl.pem; ssl_certificate /path/to/pump.crt; ssl_certificate_key /path/to/pump.key; client_max_body_size 6m; keepalive_timeout 75 75; gzip_vary off; location / { proxy_http_version 1.1; proxy_set_header Host $host; proxy_buffers 16 32k; proxy_cache off; proxy_connect_timeout 60s; proxy_read_timeout 60s; proxy_pass https://pumpbackend; } }

And there we go. My pump is a-pumping away.

One thing I’d like to note. Pumpio is designed to run as it is, a stand alone webapp that doesn’t require a standard LAMP/LEMP setup. It isn’t meant to run behind a proxy. It uses websockets via socket.io so, (and this is just my braindump, it could be way off) it could be made work behind a websocket proxy. Which with nginx 1.3.14 it should be possible however, I haven’t been able to get it to work. None-the-less, if you are trying to run it behind a proxy and things don’t work right, it’s likely due to the proxy.

And those other items that I installed globally? It’s possible that they will be included in a standard pump install in the future. Forever will restart the pump in case it craps out. I wrote an init script to start the pump that includes it as well. (and yes, my Arch webserver(s) are still using init scripts and not that damn systemd)

#!/bin/bash . /etc/rc.conf . /etc/rc.d/functions daemon_name=pumpd logfile=/var/log/pumpio/pumpd.log case "$1" in start) stat_busy "Starting pump.io Daemon" forever /srv/http/pump.jpope.org/bin/pump &>$logfile & if [ $? -gt 0 ]; then stat_fail else add_daemon $daemon_name stat_done fi ;; stop) stat_busy "Stopping pump.io Daemon" pkill -f /srv/http/pump.jpope.org/bin/pump &> /dev/null if [ $? -gt 0 ]; then stat_fail else rm_daemon $daemon_name stat_done fi ;; restart) $0 stop sleep 5 $0 start ;; *) echo "usage: $0 {start|stop|restart}" esac exit 0

The above could be adapted for other distros as needed. Having Forever installed globally allows for the init script to access it.

And for Bunyan, the logging generated can be piped through it for readability. I find myself using

tail -f /var/log/pumpio/pumpd.log|bunyan

quite a bit when I’m watching the logs.

There we have it, the current pump.jpope.org setup.

Personal F-Droid Server

I have recently added a few Android devices to my household. The first one was a new phone for my daughter, which replaced the little pay-as-you-go phone that she did have. The second device was a Nabi tablet for the kids to share. (and as a bonus for me, the screen on my tablet stays much cleaner these days.) On my daughters phone, I don’t want to tie a google account to the phone. Actually, I’d like to root it and leave the google crap off the phone. And the Nabi tablet doesn’t have any google stuff on it at all. For the most part, this is all a great thing, except for a few specific apps that can only be gotten on the market. On both devices, I’ve installed the Amazon app store, the F-Droid client app and the Humble Bundle app. Between these three sources, I’ve installed plenty of games to keep them occupied. I’ve also side loaded a few apps/games off the market by downloading them onto my phone/tablet, backing them up and uploading the apks to my Owncloud. This has worked quite well but, it could be a little smoother.

Enter the fdroidserver project.

The Android F-Droid app allows for multiple repo’s to be added. And the fdroidserver can be setup and utilized in a few different ways. You can set up a basic repository where you drop your apks in for you to connect to. Or, you can pull in the source code for different projects and have the fdroidserver build the apks, which is how the main F-Droid server works. I’m just interested in the first option currently.

Following the manual, I set up the basic repo. You actually spend most of the time downloading the Android SDK, the other requirements are Linux and python2. The install process is layed out quite well in the manual so, I won’t go through it here.

After things were set up, I dropped a few apks in, ran the ‘fdroid’ script to generate the needed metadata files and added the repo url to the F-Droid app on the devices. I also plan on using this repo to create a backup of some of the market apps that I regularly use. There have been quite a few times, an update turned out to be shit and I didn’t have any way to revert back to the previous version. Now I do.

Now, I’m off to create an Owncloud account for my daughter so I can back up her contacts…

Absence

Seems that I need to blog more often. Even if it’s about nothing.

That is all.

GNU FM ClientCode table

Earlier I asked:

Jeremy Pope (jpope)’s status on Tuesday, 08-Jan-13 12:12:38 CST – micro.jpope.orgOn a !gnufm install, should the ClientCodes table be populated? Mine is empty and I imagine that is what is causing this: http://u.jpope.org/2w

via Jpope

 

Which resulted in the response:

Jonas (kabniel)’s status on Tuesday, 08-Jan-13 19:39:29 UTCWe’re discussing ways to populate it on install, or just add the data to source and scrap table, we’ve been inserting it manually up to now

via Identi.ca

Which resulted in me writing this little insert statement to populate the ClientCodes table using the stated wiki entry:

insert into ClientCodes (`code`,`name`,`url`,`free`) values ('amk','Amarok 1.4.x plugin','http://amarok.kde.org/','y'), ('amp','Aimp2','http://www.aimp.ru/','n'), ('amy','Anomaly (Chrome extension)','Chrome webstore entry','y'), ('ark','Amarok','http://amarok.kde.org/','y'), ('ass','Last.fm player','http://www.last.fm/download','y'), ('atu','aTunes','http://www.atunes.org/','y'), ('aud','Audacious','http://audacious-media-player.org/','y'), ('bil','billy','http://www.sheepfriends.com/?page=billy','n'), ('blu','Bluemindo','http://bluemindo.codingteam.net/','y'), ('bsh','Banshee','http://banshee-project.org/','y'), ('bwt','Bowtie','http://www.bowtieapp.com/','n'), ('cmu','cmus (!CmuScrobbler)','http://n.ethz.ch/%7edflatz/cmuscrobbler/','y'), ('cpl','cplay scrobbler','http://sebi.tla.ro/cplay_scrobbler',''), ('cub','Cuberok','http://code.google.com/p/cuberok/','y'), ('dbl','Decibel Audio Player','http://decibel.silent-blade.org/','y'), ('ddb','DeaDBeeF','http://deadbeef.sourceforge.net/','y'), ('dms','donky mpdscrob','http://github.com/mjhayes/donky/tree/master','y'), ('ems','EMMS','http://www.gnu.org/software/emms/','y'), ('exa','Exaile','http://www.exaile.org/','y'), ('foo','foobar2000','http://www.foobar2000.org/','n'), ('gmb','gmusicbrowser','http://gmusicbrowser.org/','y'), ('gmm','Goggles Music Manager','http://code.google.com/p/gogglesmm/','y'), ('gst','GimmeSome Tune','http://www.eternalstorms.at/gimmesometune/','n'), ('gua','Guayadeque','http://sourceforge.net/projects/guayadeque/','y'), ('isp','iSproggler','http://iSproggler.org/','y'), ('jaj','Jajuk','http://jajuk.info/','y'), ('ldr','Libre Droid (Android)','http://linux.mikeasoft.com/libredroid/','y'), ('lfm','Libre.fm','http://libre.fm','y'), ('lib','LibreTunes','http://libretunes.sourceforge.net/','y'), ('liv','Livewwwire','http://ciarang.com','y'), ('lpd','lastPod','http://www.lastpod.org','y'), ('lsd','lastfmsubmitd','http://www.red-bean.com/decklin/lastfmsubmitd/','y'), ('mae','maemoscrobbler','https://garage.maemo.org/projects/maemoscrobbler','y'), ('maf','last.fm scrobbler / mafw-lastfm (on maemo5)','https://garage.maemo.org/projects/mafw-lastfm','y'), ('mcl','MOCp-Scrobbler','http://github.com/fluxid/mocp-scrobbler',''), ('mcn','mpdcron (MPD)','http://mpd.wikia.com/wiki/Client:MPDCRON','y'), ('mdc','mpdscribble (MPD)','http://musicpd.org/','y'), ('mlr','mobbler','http://code.google.com/p/mobbler/','y'), ('mmo','MediaMonkey','http://www.mediamonkey.com/','n'), ('mms','Maemo Scrobbler','http://github.com/felipec/maemo-scrobbler','y'), ('moc','music on console (MOC)','http://moc.daper.net/','y'), ('mp5','mpdas (MPD)','http://50hz.ws/mpdas/','y'), ('mpc','Scrobby (MPD)','http://unkart.ovh.org/scrobby/','y'), ('osx','iTunes','http://www.apple.com/itunes/','n'), ('pyj','pyjama','https://launchpad.net/pyjama','y'), ('qcd','Quintessential Media Player','http://www.quinnware.com/','n'), ('qlb','Quod Libet','http://code.google.com/p/quodlibet/','y'), ('qmm','Qmmp','http://qmmp.ylsoftware.com/index_en.php','y'), ('qmn','QMPDClient','http://bitcheese.net/wiki/QMPDClient','y'), ('qts','QTScrobbler','http://qtscrob.sourceforge.net/','y'), ('rbx','Rhythmbox','http://projects.gnome.org/rhythmbox/','y'), ('sbd','Songbird','http://www.getsongbird.com/','y'), ('scb','Scrobbl','http://www.last.fm/group/scrobbl','y'), ('sfm','shell-fm','http://nex.scrapping.cc/shell-fm/','y'), ('sls','Simple Last.fm Scrobbler','http://code.google.com/p/a-simple-lastfm-scrobbler/','y'), ('sna','Sonata','http://sonata.berlios.de/','y'), ('srd','scrobd (MPD)','http://codingteam.net/project/scrobd','y'), ('spc','scmpc','http://ngls.zakx.de/scmpc/','y'), ('spm','Spotify Mobile','http://www.spotify.com/uk/mobile/overview/','n'), ('spy','Spotify','http://spotify.com/','n'), ('ss7','SqueezeScrobbler 7','http://www.slimdevices.com/pi_features.html','y'), ('sub','Subsonic','http://www.subsonic.org','y'), ('tmh','scrobble for iPhone','http://www.nodomain.org/scrobble/','y'), ('tng','Clementine Player','http://code.google.com/p/clementine-player/','y'), ('trt','Trout','http://skwire.dcmembers.com/wb/pages/software/trout.php','n'), ('tst','Ecoute','http://ecouteapp.com/','n'), ('vag','vagalume','http://vagalume.igalia.com/','y'), ('vlc','VLC','http://videolan.org','y'), ('wa2','WinAmp 2','http://www.winamp.com/','n'), ('wmp','Windows Media Player','http://www.microsoft.com/windows/WindowsMedia/','n'), ('xbm','XBMC Media Center','http://xbmc.org','y'), ('xm2','XMMS2','http://www.xmms2.org/','y'), ('xmp','xmp-scrobbler (XMPlay)','http://www.un4seen.com/forum/?topic=5398.0','y'), ('xsp','XMMS2 (xmms2-scrobbler-py)','http://code.google.com/p/xmms2-scrobbler-py/','y'), ('yan','Jerboa','http://git.fredemmott.co.uk/?ph1.yanihp;asummary','y'), ('you','Youamp','http://www.rojtberg.net/workspace/youamp/','y'), ('zom','ZOMG','http://zomg.alioth.debian.org/','y')

Before:

After:

Badabing! Quick and easy.

 

Simple Editing of the Simple Last.fm Scrobbler

I recently installed a GNU FM instance to scrobble my listened tracks to. Over the past four years, I’ve mostly used last.fm just for the data collection to see what my listening habits are like. And considering I like to control my own data, GNU FM is a perfect fit for me.

The only issue with running your own GNU FM server is that client support is really lacking. While you’ll find quite a lot of last.fm clients, a few libre.fm (which is powered by GNU FM) clients, there aren’t many that support a personal server. For the most part though, this isn’t an issue for me. I use MPD for the majority of the time and the client that I use (mpdscribble) allows for personal servers. The other times that I listen to music, I generally use VLC or the native Android music player (Apollo on Cyanogenmod). If you dig into the settings in VLC, you can easily point it where ever you need to.

However, with Android, I couldn’t find anything that would work for me. The only option that I found was to add an entry to my hosts file, pointing the libre.fm scrobble point to my IP address at home. Once that is in place, you can use any scrobbler that works with libre.fm, just using the credentials for your server. This works well however, seeing that I flash my devices with fresh roms often, the hosts file gets wiped out often. Bummer.

I found an even better solution. I’ve grabbed the source for the Simple Last.fm Scrobbler app and modified it to point to my server. Turns out it was quite easy to do, even though I’m not experienced with hacking on Android apps.

First, I pulled the source via git.
git clone git://github.com/tgwizard/sls.git

There is only one file that needs to be edited. I edited it from the command line but, could have used Eclipse just as well. The file needing the edit is

src/com/adam/aslfms/service/NetApp.java

Starting with line 28 there is the last.fm and libre.fm details and I just added a jpope.org section to the array.

public enum NetApp {
LASTFM(
0x01, "Last.fm", "http://post.audioscrobbler.com/?hs=true", "",
"https://www.last.fm/join", "http://www.last.fm/user/%1"), //
LIBREFM(
0x02, "Libre.fm", "http://turtle.libre.fm/?hs=true", "librefm",
"http://libre.fm/", "http://libre.fm/user/%1"),
JPOPEDOTORG(
0x03, "jpope.org", "http://post.scrobble.jpope.org/?hs=true", "librefm",
"http://scrobble.jpope.org/", "http://scrobble.jpope.org/user/%1");

And then I opened up Eclipse which I already had set up for Android development. I then started a new project pointing to the downloaded code. (File>New>Other>Android Project from Existing Code). Once opened, I opened the AndroidManifest.xml file and used the Export Wizard to export and sign the apk. I loaded this apk onto my devices and am now able to scrobble to three places at once. Of course, I don’t need to be scrobbling to all three at once but, I can if I wanted or needed to.

Hot damn, no hosts file editing will be needed any more. \o/

Now, go out and scrobble something.

Ending 2012 with Freedom

My 2012 new year resolution was this:


And while I haven’t completely killed off my google account, I have further reduced my dependence on google. A few things that I’ve done to help this along with some other items to help my web independence:
Killed off my G+ account Installed MediaGoblin for public sharing of photos (and videos when I haven’t broken that feature) (also killed off my DeviantArt account) Installed Zenphoto for private photo sharing Started using Fastmail for my email, along with a local Roundcube install to access it Installed SimpleID as my OpenID provider Set up a Seeks node Started actually using my Owncloud for my contacts and calendar syncing Setup an XMPP server for IM Installed Tiny Tiny RSS for my RSS feed aggregation Installed a Libravatar instance (replacing Gravatar) Installed GNU FM (may eventually replace last.fm)
Damn, that’s a hell of a lot of stuff! I was busy.
I do have my gmail around but, it isn’t being used so much for anything other than for my Android device syncing (apps that is…). I feel that I was quite successful in the degooglification of myself.
Now, my goal for 2013? To donate to some of these projects that have helped me gain some of the freedom that I now have. 
Happy New Year!

75 Fury – Sounds From Uranus Demo

Years and years ago, I used to be more musical than I have been as of late. One “album” that I did put together was an electronic album that I titled Sounds From Uranus. I mostly put this album together so I had something to chill out with while smoking funny smelling cigarettes. Fast forward quite a few years (OK, a decade to be exact) and I decided to start a follow up to that album, just for fun. Of course though, these days all my cigarettes are of the normal smelling type…

So, here are three tracks that I created back in early 2010 using LMMS for the bulk of the sound and Audacity for the final mix. I will say that these still need some work and plan on completing these tracks and creating more so that there is a full length album. So, here is the demo in ogg format:

75 Fury – Return To Uranus (Demo)

Track 1: Return To Uranus

Your browser does not support the audio element.
download

Track 2: The Traveler

Your browser does not support the audio element.
download

Track 3: Groove

Your browser does not support the audio element.
download

Download full archive.

This work by Jeremy Pope is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Once I complete this album, I have decided to release both of them at the same time under a less restrictive Creative Commons license.

One Year of being a Fed

A year ago today, I said the hell with it and started my own StatusNet instance. Since then, it’s been my main source of online engagement with other identicats and feds and even twits. During that time, I’ve posted 18,550 notices, with the first 10,000 happening quite quickly, subscribed to 272 people and have 158 people subscribed to me. My instance has captured 632789 notices from all around the StatusNet globe. I’ve certainly got quite a bit of use out of my mostly hasty decision to install it. I’ve broken it a few times, and fixed it enough that I haven’t missed posting something every day.

First notice, year one:

jpope

First.

on 2011-11-01 from mustard

First notice, year two:

jpope

And I start my # day with a # !vivalafederation

on 2012-11-01 from IdentiCurse

So, now that I have a year down, and things are running quite well (my instance even survived my recent migration to Nginx), I think I’ll kill it off. It’s just been too much damn work to keep it going. Hacking on StatusNet has just gotten too time consuming and I can free up quite a bit of time and energy if I’d just use some other instance.

Ha! That is a big bunch of lies. Where the hell else would I post all my morning !coffee posts? Plus, as the federation is thriving and keeps growing, I’m sure that there will be plenty more fun to be had.

And seeing that today is also the semi-official designated Federation Day due to the number of instances that popped up during this time last year, I’d like to pass on a Happy Federation Day to all the other Feds out there.

Now, on with year two of filling the interwebz with my nonsensical drivel!

!vivalafederation

Nginx Migration Mostly Complete

As I stated in my last post, I was to be moving my webserver to Nginx and have now mostly finished the migration. The “mostly” is due to things still needing tweaked and config files need cleaned up. Aside from deciding to go ahead and move my Gallery3 install to Piwigo and taking my radar archive offline, I have everything listed on my ‘About’ page working again. A few things (SemanticScuttle and SimpleID) don’t currently have the clean URLs that I did have so, I’ll be working on those things yet. Also, my decision to take the radar archive offline is mostly due to how large the archive has gotten. But anyway, I digress…

Moving to Nginx has been mostly painless and I had most everything back online the same night I started. And looking at my Munin stats, I see lower load average, system CPU usage, network traffic and disk IO. However, since I don’t have many things that are static files, most everything is running through php-fpm. For the most part, the links listed here were a great help in the migration. In particular, @joar’s post served as the initial basis for anything php based that I had. Friendica turned out to be a pain but, once I found this post, I got it up and running fairly smoothly. Although, at first as it was getting caught up, it was nearly unusable.

I did install Piwigo without issue and am now working to get it filled with all my family photos. Currently, the install is for private access only so, there’ll not be much for anyone to see there. I plan on continuing using my MediaGoblin install for publicly posted photos.

I did get some Nginx plugins running for Munin as well. Wish I would have set the Apache ones up previously so I had some comparison. Too late now… The following graphs shows quite a bit of activity, mostly due to all the updating I’ve been doing with Piwigo. Currently have 10,000 photos loaded in it and not close to being done…

Anyway, I’m so far extremely pleased with the move. There is plenty of documentation out there for the majority of the webapps that you may be interested in running on Nginx. The configuration list at wiki.nginx.org has a good many apps listed. In the future, after I’m happy with my setup and have cleaned up my config files, I’ll likely post them here for reference sake.

Now, I’m off to load more photos in the gallery…

The Next Migration for jpope dot org

Something that I have been planning for a bit for my webserver has been to migrate from Apache to Nginx. That time has come. On with the breakage…

I’ve been playing with Nginx off and on for a little bit and I’m really digging it. I hope that this transition goes somewhat smoothly so that I can document it a little bit. I have a feeling that it’s going to be a pain in the ass with all that I have going on this server. May as well get started before I add more stuff and my about page gets longer.

But anyway, I plan on getting my StausNet instance up and running first, then the blog here and then on down the list. At least with SN being up first, I can give a yell out to someone else in case of fire (or configuration issues, whichever comes first).

So, at some point this evening, after this post goes out, I will be tearing it all down. Hopefully on the building back up side, I won’t have resorted to going back to Apache.

Cheers!

StatusNet Subscription Hacking

Some time back, @sazius changed his StatusNet instance from ‘SSL always’ to ‘SSL sometimes’.

sazius (sazius)’s status on Friday, 30-Mar-12 18:53:19 UTC – status.saz.imMy hunch was right. I had problems subscribing to @jezra, switched from always SSL to sometimes. Worked fine. Hope doesn’t break smth else:)

via Saz

This change caused me to not receive any notices from him aside from direct @-replies. I tried to fix this a few different times without success. Until today. I should also note that I tried to resub (via the browser) to him however, every different way I tried, I would just get a “Could not set up the remote subscription” error message. I also tried running the “two-step” but, it would only return an error as well. Well, crap. Off to the command line then…

Before proceeding with this post though, I will mention that it’s a real brain dump in the realm of $ cat /home/jpope/brain > /home/jpope/blog and may not make much sense. I will also say that it’ll make more sense for those used to the internals of StatusNet. Anyway, on with the brain dump…

Jeremy Pope (jpope)’s status on Saturday, 13-Oct-12 14:12:47 CDT – micro.jpope.orgWow, I think this blog post I’m writing may be a confusing mess at the moment… #braindump

via Jpope

To start debugging this, I headed to my StatusNet logs and poked around for a little bit. I was seeing that my instance was PuSHing just fine to sazius’s instance aside from doing it twice. I wasn’t too worried about that at the moment but did notice that any @-replies from him was showing up in my logs, just not populating in my timeline.

So, off to the database, Batman. First, I started poking around some of the profile tables such as profile and ostatus_profile. For whatever reason, I found that there were two entries for his profile in the ostatus_profile table, one with http://status.saz.im/api/statuses/user_timeline/1.atom as the feeduri and one with https://status.saz.im/api/statuses/user_timeline/1.atom (note the http and https). I noted the profile_id for each of these entries and found the corresponding entry in the profile table. I also looked in the subscription table to see what profile id’s were subscribed to who. The subscription table has a subscriber and subscribed field. I found one of the profile id’s in the subscriber column (with my id in the subscribed) which represented his subscription to me. I couldn’t find an entry going the other way, which made since as I wasn’t currently subbed to him. I also looked in the feedsub table and found the entry there regarding his instance. The sub_state field was sitting at “subscribe” which meant that I attempted to sub but it didn’t complete the action. Again, makes sense with the subscribe fail from earlier. So, I forced it.

In the feedsub table, I changed the “subscribe” to “active”. And in the subscription table, I copied a record where I was subscribed to someone and modified it for the “good” sazius profile id. I determined that the profile id where he was subbed to me to be the “good” one, which was id number 62. The subscribed field was set to 62 and the uri field was set to:

tag:micro.jpope.org,2011-11-15:follow:1:62:2011-11-15T14:36:33-06:00

The section ‘follow:1:62:’ shows that profile 1 (me) is following profile 62 (sazius). And the last step I did here was to delete the “bad” profile id from the ostatus_profile table since I figured that it was going to affect anyone’s subscriptions.

Result? Still broke. At least at this point. These changes may have helped in the long run though so it wasn’t necessarily wasted time.

Since I felt that things in the db were looking ok, I headed to the ./plugins/OStatus/scripts directory and started playing with some of those scripts. Long story short, it seems that the update-profile-data.php and update-profile.php scripts did the trick. I have previously tried these scripts and they would fail to update properly or I would see some other errors. Possibly my db hacking above helped this time because both of these scripts ran successfully today.

php update-profile.php https://status.saz.im/user/1

php update-profile-data.php https://status.saz.im/user/1

And after a few moments of running this, my instance received it’s first notice from sazius in months (ok, it’s been seven months, I guess I wasn’t in too much of a hurry but, I was hoping that it would resolve itself as quite a few StatusNet issue seem to do). After spending the morning digging through logs and such, it seems that the solution for me was quite simple.

Can’t say that any of this will help any bad subscriptions you may have on your StatusNet instance but, it helped me today.

Wunderbot Update

This is a quick update to announce that my Wunderground bot plugin for StatusNet has gotten a couple of new features since it’s initial release.

The first one is that if a US zip code or Canadian postal code isn’t supplied in the notice to the bot, it’ll attempt to get the users location from the notice. This info is attached to the notice only if it has been allowed by the user (it may be turned on by default, I can’t quite remember). To turn it on, you have to check the “Share my current location when posting notices” checkbox in the settings (i.e. http://identi.ca/settings/profile) and put a valid location in the Location field. Another option is to have your browser or client (some clients such as Mustard have this option) attach the location information.  If the notice has the location information (which is in latitude/longitude format), the bot will pass the lat/long to the Wunderground API and it’ll return the current conditions appropriately. One thing to note is that the bot will use a provided postal code before it’ll use any location attached to the notice.

Niobe (niobe)’s status on Thursday, 20-Sep-12 13:58:19 CDT – matrix.jpope.orgI now support forecasts. Send me a notice with the term ‘forecast’ and your postal code (US/CAN) and I’ll give you today’s forecast.

via Jpope

Yep, as @niobe said, the second new feature is that the bot can now return forecast information. I currently have it set to do either the current or the next day forecasts separately and I am debating on adding a full three day forecast option. The reason to keep the days split is so that the forecast notices do get too long character wise. I have no limit set on matrix.jpope.org but, some folks on smaller character instances have issues seeing the full notice sometimes with the longer notices. To use the forecast option, send the bot a notice that contains the word ‘forecast’. Again, putting a postal code in as needed, the forecast option will also attempt to get the location from the notice as needed. You can also add the word ‘tomorrow’ to your notice to the bot and it’ll return tomorrows forecast otherwise, it’ll return today’s.

That’s all that I’ve currently added, you can check the code out at Gitorious. Beware, it needs some cleanup and is still quite the work in progress.

Niobe (niobe)’s status on Thursday, 20-Sep-12 13:48:03 CDT – matrix.jpope.org@jpope Thursday forecast for Jefferson City. Partly Cloudy High: 81 F (27 C) Low: 54 F (12 C)Precip Chance: 10% #partlycloudy.

via Jpope

Shifty Times

This morning as I’m (un)happily working away at work, my wife calls and says that her car will not shift into park. Well crap. No matter what she’d try, it just wouldn’t go. Also, with her car, you cannot remove the ignition key until it is in park. So I leave work, heading to rescue her from sitting in the car with no place to go (or park, or something…).

After arriving, I was able to tear into the console enough to see that the button on the shifter handle (it has to be pressed to go into certain gears) wasn’t moving the internal rods enough. At this point, I wasn’t sure if it was the shifter handle or something caught elsewhere not allowing the rods to move freely. But, I was able to wiggle a screwdriver around enough that the car would now go into park. OK, problem one solved, we could get the key out and were fairly certain that the car wouldn’t roll off. She heads into work and I head home to gather some tools and knowledge.

The first result from a Seeks search returned just enough info for me to suspect that it was the shifter handle itself. Back across town to her car so that I can start taking things apart. After a bit of cursing and whatnot, I had the handle off and determined that things worked perfectly with it off. Now to find a replacement as there was no good “hack” to fix this. A proper fix was to get another factory supplied handle, an improper fix would have been to get an after market handle and tell her to just push down on it to shift into park. Either would work but, a proper fix was certainly preferred. Of course though, I wasn’t about to go to the dealer to get a new one as the cost would be more than I wanted to spend. Also, none of the part stores would carry such an item.

Hey, time to head to the junk yard! Preferably one where I could go in and pull the parts myself. Luckily there is one 10 minutes outside of town so off I went. Before arriving, I had to get an in flight refill.

Once there, I found the area where all of the other Grand Am’s were and found one that had a decent shifter handle. And as a bonus, I grabbed the rear view mirror as the one in my wife’s car was a cheap replacement which was a pain in the ass to adjust as well as not staying where it was put. I also may have found an explanation as to why the car that I pulled these parts from was in the junk yard at all.

A pack of rolling paper sitting next to the depleted and cut out airbag, laying on the floor. Then again, maybe the previous driver just like rolling their own cigarettes.

Now that I got what I came for, it was time to do my favorite part of going to the junk yard. Taking a leisurely stroll through and see what all is there. There are many many project cars that could be started (and possibly finished) with what you may find in the junk yard. Of course, you have to look past the completely mangled cars that are completely unrecognizable as to what kind they are. I did find a pair of early ’70s Darts, much like my ’74 Dart. Potential parts cars.

Probably the coolest car there was a ’49 Studebaker with suicide doors. Potential rat rod material here.

Then, there was this school bus turned car hauler. As far as I could tell, someone used to haul their race car with it.

There was quite a bit more but, it was time for me to head on my way. I paid for the parts I gathered and off I went.

First things first, it was time for another in flight refill.

Once back at my wife’s car, I cleaned up the “new” parts, squirted some grease into the inner guts of the shifter handle and made quick work of the install.

Hey! Who’s that creepy looking dude in the mirror! Oh…

Thankfully, this repair was quite easy. w00t!

Hopefully, this’ll be the last of the car repair posts that I have for awhile. :/

WunderBot

To continue my recent work with the Wunderground api, I have now hacked together a new StatusNet bot plugin. With this plugin, you can ask the bot for the current weather conditions with just the word ‘weather’ and the five digit US zip code of your choice. So long as Wundergound recognizes the zip code, it should return some basic details. This plugin is currently active over on my Matrix instance, just ping @Niobe.

Niobe (niobe)’s status on Monday, 17-Sep-12 22:18:02 CDT – matrix.jpope.org@jpope It is currently Overcast and feels like 64.0 F (17.8 C) in Jefferson City. The humidity is 58% and the wind is From the NNE at 2.9 MPH Gusting to 5.8 MPH. #cloudy !http://icons-ak.wxug.com/i/c/k/nt_cloudy.gif! http://www.wunderground.com/US/MO/Jefferson_City.html

via Jpope

I have looked to do this before but, hadn’t had much success. Mostly, my lack of proper coding skills has usually been my holdup. Previously, I found a bot on identi.ca (source) that already did what I’ve done here, except the execution is quite different. That bot (which currently doesn’t work properly due to it repeating notices) requires a php script to be running in the background, using CuRL to listen for notices to it and using CuRL to pull and post the requested weather details. The php script is run from a separate server than the StatusNet instance. My implementation is that the bot is an actual StatusNet plugin. It’s installed and configured just as any other SN plugin.

When I started hacking this plugin together, I simply copied Evan’s 8ball plugin script and went to work. First I had to figure out how to pull a zip code out of a notice sent to the bot. And by using regex (using preg_match and preg_match_all) I was able to capture the zip code. There is also another regex in there to check if the term ‘weather’ is in the notice. Now that I was able to capture the zip code, it was actually quite easy to pull the data via the API, just needed to plug in the pieces.

http://api.wunderground.com/api/$apikey/conditions/q/$zipcode.json

Also, to make things super easy, Wunderground has code samples as well. I just grabbed the PHP code sample, made a few changes so I’d get the details that I wanted and was done. Ok, so it wasn’t just like that but, after playing with the script, I’m now mostly happy with it.

To set this up on your instance, you’ll need to clone the plugin to {statusnetbase}/plugins/WundergroundBot/ with:

git clone git://gitorious.org/wundergoundbotplugin/wundergoundbotplugin.git WundergroundBot

 

Then, add this to your config.php:

addPlugin('WundergroundBot'); $config['wundergroundbot']['nickname'] = 'botname'; $config['wundergroundbot']['apikey'] = 'wundergroundapikey';

 

You’ll need to edit in the username of the bot and your Wunderground API key. Run php scripts/checkschema.php just to make sure things take and restart the daemons. After that, you should be able to send your bot a notice that contains the term ‘weather’ and the five digit zip code and get a reply with the details.

Niobe (niobe)’s status on Monday, 17-Sep-12 20:18:07 CDT – matrix.jpope.org@pla1 It is currently Clear and feels like 73.6 F (23.1 C) in Moncks Corner. The humidity is 44% and the wind is Calm. #clear !http://icons-ak.wxug.com/i/c/k/nt_clear.gif!

via Jpope

In the future, I’d like to get this to work with more than just US zip codes. The Wunderground API has quite a few options on how to figure out a location, I just need to figure out how to utilize it properly. It’ll probably be easier than I currently imagine.

Now I’m off to go check the weather.

Niobe (niobe)’s status on Tuesday, 18-Sep-12 07:06:01 CDT – matrix.jpope.org@mike It is currently Light Thunderstorms and Rain and feels like 89 F (27.5 C) in Clearwater, FL. The humidity is 86% and the wind is Calm. #tstorms !http://icons-ak.wxug.com/i/c/k/tstorms.gif! http://www.wunderground.com/US/FL/Clearwater.html

via Jpope

Switching It Up

The headlight switch in my ol’ pickup decided to crap out, leaving me with headlights/taillights that wouldn’t stay on for my whole ~15 minute drive to work. #suboptimal Also, my high beam switch crapped out some time back so all I had were low beams. This wasn’t much of a big deal, the majority of my driving doesn’t even require headlights, making the high beams even less needed. Still, #suboptimal.

So, it was time to take care of this problem. For the dimmer switch, I wasn’t about to take the steering column apart. I don’t have the tools required to properly take and replace the steering wheel first off. Secondly, it’s a pain in the ass when you don’t have the proper tools. So, when rounding up the parts I needed for today’s repairs, I grabbed some automotive wire and a simple toggle switch. Seeing that I’ve replaced the headlight switch once before, I knew that part was going to be quite easy.

And now, I’ll let a few photos speak for the repair job.

Seems that one terminal on the switch was quite burnt. The brown block on the left of the next photo is the dome light/dash light brightness switch. On my previous repair, I had to tape it down to the mount so that it would stop falling back into the dash. Glad to see the tape was still holding well.

That’s a hell of a burn mark.

Now that everything was out, it was time to run some wire, splice some other wires and mock the setup up. First I did quite a bit of testing with the multimeter to see where I should put the toggle switch. My plan was to find a wire that was hot when the low beams were turned on and splice into it. In the end, I just spliced the actual low beam wire, ran the new wire into the cab of the truck and back out to the high beam wire.

I then plugged things in to test it all out.

Headlights (low and high) and taillights both worked perfectly. Now it was time to mount the toggle switch.

Taping up wires.

And installing.

Installed.

And I now see the light.

So, this was mostly a hack job but, when you’ve got a beater for a daily driver, just keeping it on the road sometimes takes a few hacks. Hopefully, this hack will last a little bit.

Coffee Options

As most who follow my StatusNet or Twitter feeds know, my drink of choice is coffee. It is usually the first thing that I mention in the morning.

I can’t say that I’ve really tried that many different blends or styles of coffee but, just any ol’ coffee just doesn’t cut it for me. When at home, my coffee of choice is a super dark roasted, fair trade certified, whole bean that I can get at my local grocer. I prefer to grind fresh before brewing, and I drink it black. Recently, my drip coffee maker died an early death and I replaced it with an inexpensive french press. I have had a press previously and loved it. The coffee made by the press is much smoother and more robust. My only complaint with it is that it seems that I use nearly twice as much coffee with it. Then again, as I don’t brew much coffee during the work week (work has decent coffee and is only 10 minutes away), using a little extra isn’t that bad. I did retain the thermal carafe from my deceased coffee maker so, I do utilize that after making coffee in the press.

My reason for writing this post, was due to a conversation on StatusNet, which started from my usual ‘top of the morning’ coffee dent. Bringing up the French press lately has brought up a couple of other non-drip coffee maker options that I haven’t experienced.

@navigium suggested the Moka Express a while back:

navigium’s status on Saturday, 01-Sep-12 13:55:48 UTCThat’s my preferred coffee making device: http://ur1.ca/a3224

via Identi.ca

@jk and @thelovebug also brought up the AeroPress as their preferred coffee maker.

Jon Kulp (jk)’s status on Saturday, 15-Sep-12 08:06:20 CDT – Bagatelles@jrobb @jpope @ladyj my favorite is called the AeroPress. Diff than French Press. Got one at home and work.

via JonkulpDave Lee (thelovebug)’s status on Saturday, 15-Sep-12 13:30:21 UTC – micro■@jk @jrobb @jpope @ladyj The AeroPress is the only thing that I make coffee with now. I’ve also got a french press and a Bialetti, but I only tend to use those if I’m making coffee for more than just me.

via Thelovebug

I am hoping to get both the Moka Express and the AeroPress in the somewhat near future. I am also planning on not getting another drip coffee maker. The convenience of the drip is nice, especially when making coffee for more than just myself. But, in all honesty, it’s a rare occasion when I am making coffee for more than one. The personal nature of these other coffee makers is​really​ appealing to me. Seeing that the price of coffee is slowly increasing, I figure that I should attempt to enjoy all aspects of it, from making it, drinking it and sharing it.

Expect some blog posts in the future once I have acquired one or both of these coffee makers. I’m leaning towards getting the Moka Express first but, posts like this may change my mind:

Dave Lee (thelovebug)’s status on Sunday, 16-Sep-12 15:01:05 UTC – micro■@jpope I did brew up the Bialetti yesterday, like I said… but I must admit that I was a little disappointed by it. Another victory for the AeroPress!

via Thelovebug

Decisions, decisions… Until then, here’s to great coffee! *raises cup*

Pages