JS Ext

Thursday, May 30, 2013

Can't Bring Myself to Purchase Amazon Prime

Lately, I have been purchasing a lot of stuff on Amazon.  Baby's require a lot of stuff.  There is also a list of things I have been meaning to buy.  These are small things that tend to be cheap on Amazon but more expensive in a store.  I use this backlog of nice-to-have items or eventually-need items to get me over the $25 Super-Saver shipping.  My wife brought up the idea of paying for Amazon Prime.  I thought about it, and I can't bring myself to purchase it.

Although it is true that Amazon Prime might pay for itself given the rate we are buying stuff, this rate isn't sustainable.  We are buying a lot of stuff for the baby right now.  It is stuff we knew we needed, but we didn't know which to get until the baby was here.  This rate will eventually die down.  The other big reason to get Amazon Prime is for Amazon Instant Video.  In all honesty, this is the bigger reason to get Amazon Prime.  I have been trying to shift my household to use online video over traditional cable.  What better step than to get Amazon Instant Video, right?

The problem with Amazon Instant Video is it isn't available on my TV!  Although I do have a Roku, I don't use it.  I have an MK802.  It is an Android TV.  I can watch Netflix, Youtube and Hulu Plus on it.  I can watch these services (two of which I pay a fee for) because those companies released an Android app.  Amazon doesn't have an Android app.  They have a Google TV app, but I have an Android TV, not a Google TV.  This means I can't watch Amazon Instant Video on my TV.  Until Amazon Instant Video is available on the MK802, I don't know if I would pay for it.

Wednesday, May 29, 2013

Ubuntu update broke Lightdm

Every once in a while, I see the Software Update icon show up in the Unity Dock.  I try to stay on top of keeping the system up to date.  This time around, it asked to reboot my laptop.  I let it reboot, since reboots are pretty quick.  To my surprise, X didn't start up after the reboot!  This is the type of thing that got me fed up with Gentoo as a desktop/laptop distro.  Ubuntu isn't supposed to run into these types of problems.  I got on my desktop and started googling.  I read about various reports of the "Lightdm" app not working.  I decided to switch to VT1 and check on what is going on.  Eventually, I discovered that killing 'X' would force Lightdm to load.

root      1157  1113  3 13:47 tty7     00:00:00 /usr/bin/X :0 -core -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch

For a long term fix, most people just suggested switching to GDM.  GDM is what I used in Gentoo, so I decided to switch to it.  Most instructions told me to uninstall Lightdm first.  When I ran

apt-get remove lightdm

I got a message telling me that it would uninstall 'ubuntu-desktop' as well.  That isn't what I wanted.  I decided to install GDM without uninstalling lightdm.  When I ran

apt-get install gdm

I got an Ncurses interface that let me select with display manager would be used.  After selecting GDM and rebooting, my laptop was usable again.

Tuesday, May 28, 2013

Xen, AMD VGA Passthrough, OpenCL and Bitcoin Mining

Previously, I reported that I couldn't get Bitcoin GPU mining to work inside of my gaming VM that had an AMD Radeon 7870 VGA Passthroughed to it.  I decided to research more into Bitcoin mining when I realized that my GPU could hash at around 400 Mhash/s.  The first thing I did was download Geeks3D's GPU Caps Viewer.  When I ran this program, it told me that I didn't have any OpenCL devices available.  I started googling, and I realized that the video card has a different driver for OpenCL.  This driver comes with the full install of the AMD Catalyst Command Center!

The problem with AMD CCC is that historically, it didn't work inside of a VM.  It would get stuck on the "Detecting Graphics Hardware" phase.  To get around this problem, you do a partial install of CCC, then point Device Manager to the "staging location" in C:\AMD.  The raw drivers were down that folder.  I had to do this as late as the 13.1 version of CCC.  This means, historically at least, I couldn't get the OpenCL driver.

Emboldened by the fact that I can revert to a previous snapshot, I decided to do a full install of AMD CCC 13.4 (the latest version at the time of this post).  I was surprised to find that the "Detecting Graphics Hardware" bug in the installer is gone!  The entire CCC installed correctly.  After a reboot (of Dom-0 as well), I had OpenCL support.  The volume was at 100% as well.  That scared the crap out of me.



I then tried to enable Miner-scr so that I can mine when I'm not using the VM.  The miner still didn't work, but this time gave a different error:

FATAL kernel error: Failed to apply BFI_INT patch to kernel! Is BFI_INT supported on this hardware?

I looked at the "Issues" tab of Miner-scr's website and multiple people reported this problem.  After further research, it turns out that newer AMD cards have an instruction called BFI_INT that can increase the performance of mining by 5%-20%.  Sounds like a good feature, but not call cards support it.  My AMD card isn't new enough to support it.  All Nvidia cards do not support it.  After looking at the source code for Miner-scr, it looks like the developer hardcoded the enabling of BFI_INT.  This means Miner-scr only supports the latest AMD cards.  It does not support Nvidia or older AMDs.

I decided to install vanilla Phoenix 2.0 to do some trial runs.  I fired it up and it started to mine at around 250 Mhashs/s.  That is far more than I could ever get with my other CPUs/GPUs.  The default config file that comes with Phoenix uses an "aggression" of 3.  I decided to bump it up to 10 (Miner-scr defaults to 25) and my video card started beeping.  GPU Caps Viewer told me the GPU was over 170F.  I dropped it down to 5 and instead of jumping to over 170F, it grew slowly to 170F.  I tried 3 and it grew even slower, but eventually started beeping at me.  Now that I had CCC installed, I tried bumping the fan to stay at 90% but that only slowed it down.  It still ran too hot in the long term.  Eventually, I dropped it down to 2.  At 2, the GPU stayed just barely below 170F.  At 2, I was generating 185 Mhashs/s.  It is not the 400 I was hoping for, but it is far more than I was doing before.




The heat issues I am facing are not directly related to the fact that I am using virtualization.  Indirectly, I do have 2 video cards as well as a bunch of hard disks in the computer.  It is a mid-tower case.  It doesn't have any fancy extra cooling in it.  I'm sure that if the GPU was in a more spacious case, it would easily get to the 400 Mhashs/s mark.

Also, I have not been able to configure the computer to only mine when the screensaver is on.  Once I move the mouse, I want to be able to play my games at full performance.  I will continue to work on this.  For now, I am taking a break from my gaming, so I can leave the miner running.

Friday, May 24, 2013

Dropbox as a Social Media Platform

A few months ago, I visited some family to scan a bunch of pictures that my grandmother had collected.  I scanned over 1200 pictures.  To share this with my family, I put all the pictures into my Dropbox and shared that folder with my family.  This experiment turned out to be an amazing success.

Fast forward a few months and now I have a new source of pictures.  I am taking a bunch of pictures of my newborn son.  I'm not the only one, though.  My brother and the son's grandparents are taking lots of pictures as well.  I turned back to Dropbox as a way for the family to share pictures.  I created a folder in my Dropbox.  I loaded it with all the pictures that I took.  I shared that folder with all of my family with a message telling them to upload any pictures they took.  Most of my family is tech savy enough to handle Dropbox.  Everyone jumped on board.  People started uploading photos and to my surprise....video!  Every has access to the full quality original photos.  Best of all, it is all private and secure.

Most people tend to use Facebook to share photos like this.  There is a problem with that.  It is my opinion that when you upload a photo to Facebook, even with the strictest of privacy settings, that photo is completely open to the entire world.  I do not trust Facebook with the private of my son.  Couple this with the fact that a lot of my family does NOT have Facebook, it made perfect sense to use Dropbox as the media sharing platform.  Dropbox allows my family to share full quality photos with a high level of privacy.  In the end, that is all we wanted out of the platform.  It has turned out well.  So well, that I am now considering paying for Dropbox.  Imagine that.  A company provides a good free service so some people want to pay for an upgraded version of that free service.

Thursday, May 23, 2013

Public wifi

More and more places are offering public wifi.  This seems like it is a great trend, but it is causing problems with my electronic devices.  That may sound counter-intuitive, but I assure you if there was a single way humans could mess up this technology, we have found it!  Most public wifi is free as in beer, not free as in speech.  This means I can use the wifi without paying, but I can't do whatever I want on the wifi.  This has a negative impact in two ways.

The first problem that occurs is the acknowledgement of the terms of service.  To protect themselves, the public wifi provider gives you a screen to accept the terms of service.  Violating the TOS is a federal offense that will get you 35 years in federal pound you in the ___ prison.  The problem is all traffic will fail until you accept the TOS.  This sounds fine on the surface, until all your widgets are failing.  The widgets are using a background service that auto-update on a periodic basis.  Once you connect to wifi, the widgets use the wifi....regardless if you accepted the TOS.  At work, my company put up an employee off-duty wifi in the eating and public areas.  This wifi network could be accessed by our personal devices.  It has TOS-protection, though.  This TOS-protection kicks in every time I go to the lunch area (probably since I only eat lunch once a day).  This means, every day, I walk to the lunch area and all my widgets stop working.

The second problem is the firewall.  Many public wifi services only allow certain traffic.  Ports 80 and 443 are always allowed.  Sometimes you will be lucky and ports 22 and 3389 will be open.  Citrix Reciever is not usually allowed.  Also, since home ISPs traditionally block incoming ports 80 and 443, I can't access my home server.  Widgets may not function correctly as well.  The Facebook app seems to use 80/443 so it didn't have a problem, but some other widgets failed to work.

I am all for public wifi.  I also don't want to complain about the quality of something that I get for free.  What annoys me is that the public wifi tends to be crippled.  For many situations, like the one at my job, I end up not even using the wifi.  It is just not worth it.

Wednesday, May 22, 2013

Still no Google Hangout on MK802

At Google I/O 2013, a new version of the Google Talk Android app was release.  The new version was renamed to Hangout.  After I noticed the app got updated on my MK802, I tried to invite my wife to a Google Hangout.  I was still disappointed.  The app still didn't recognize my camera.  I could chat with my wife, but we could not do a video chat.  It looks like if I want to support multi-person video chats on the MK802, the only option is still to pay for Skype.

Tuesday, May 21, 2013

Excel doesnt like slashes

I noticed something weird when I was recently using Excel.  I was typing in data into a spreadsheet.  One of the columns contained Unix paths.  I have two monitors: one with Excel and one with Putty.  I was looking at the Putty window while typing into the Excel window.  After typing a block of data in, I took a look at Excel and it was all messed up.  There were 4 sub-windows that all showed the same spreadsheet.  Apparently, the front slash is a special key.  Most of the time, you can select a cell and just start typing away.  I learned a valuable lesson: that feature (typing into the cell and not the value input) is highly dependent on your data.  All my rows were empty!  Doh!

Monday, May 20, 2013

Missing Posts

I have tried to publish a new post every day for a few months, now.  I have surprised myself about how long I have kept up with this publishing schedule.  Last week, something happened that caused me to miss a few days.  I won't get into too many details, but lets just say, I might be reviewing more baby-centric devices in the coming months.  Since this blog has now been downgraded in priority by one, I may miss posts from time to time, but I will strive to continue.

Tuesday, May 14, 2013

iView 1010NB and Netflix

I was going over my search analytics and noticed a few people searching for Netflix support on the iView 1010NB.  It never occurred to me to try it out because we didn't get the netbook to watch Netflix.  Because people have been searching for it, I decided to try it out.  At this point, my wife has given up on using the 1010NB.  The app installed and started just fine.  Them, I noticed something weird when I tried to log in.  The mouse click on the member sign in button didn't work.  I tried clicking some of the other buttons and they didn't work either.  There must be some compatibility issue between the Netflix app and the 1010NB.  It is not a dead zone, because other clicks in that are worked.  Because I couldn't log in, I couldn't verify if the CPU/GPU is even fast enough to stream video.  I will try other apps to see what kind of performance I can get.  If the performance of the other apps is decent, then updates to the Netflix app might enable it to work.

Monday, May 13, 2013

Subscription Photoshop

The Adobe Creative suite of software will be moving to a subscription-based model soon.  I have mixed feelings about this.  Any time software changes from a purchase to a subscription, the cost grows tremendously.  On the other side, as a software developer, support costs often outweigh the initial software development costs.  This is why most "professional" software is subscription-based.

When it comes down to it, Photoshop is for professionals.  Photoshop is an extremely powerful program.  So powerful in fact, that there is a very small number of people that actually need to use Photoshop.  Most people that currently use Photoshop probably only use features that have existed in Photoshop for over 5 years.

This is actually where the problem lies.  When a new version of Photoshop comes out, and you don't need any of the new features, are you going to spend the $1000 to upgrade?  For most people, no, you aren't going to upgrade.  You may skip that version.  But, if you were paying a subscription cost, and upgrades were "free", then you are going to upgrade.  This lowers the maintenance cost for Adobe, since they don't need to support older versions, and it gives them a stable source of income to add new features.

The lesson in all of this is there are two types of people in the world: those who need to use Photoshop, and those who don't.  If you don't actually need to use it, there are plenty of other programs out there than can remove red-eye just as good as Photoshop does.

Friday, May 10, 2013

Night Owl: Streaming Video over RDP

I recently installed a Night Owl camera system.  There is no Linux administration software; only Windows software exists.  A few years ago, this would have been a major issue for me.  Now, I have a Windows VM specifically for this type of program.

The Windows VM that I installed the software onto is not the VM that has the VGA card in it.  This VM is only accessible via VNC and RDP.  I tend to access this VM over RDP using my laptop with an N adapter.  I assumed the video playback wouldn't work, but I decided to give it a shot anyways.  I was surprised to find that I could easily stream both live video and playback of previously recorded video.  The quality wasn't great, but that is more of a function of the camera than the streaming.

Thursday, May 9, 2013

Tomcat 6 vs Tomcat 7: Missing Valves

Prior to Tomcat 7, Tomcat had a system of "Valves" that were used to add code to the request processing pipeline.  The most common valve was the RequestDumperValve.  This valve logs all http requests/responses that go through this valve.  This can help diagnose problems that you are having.  These valves were Tomcat-specific, however.  The Tomcat developers wanted to get rid of duplicate code, so they decided to get rid of the proprietary "Valve" system and replace it with the J2EE-standard "Filter" system.

Although this is a noble goal, the "Filter" system doesn't handle everything the "Valve" system was able to handle.  For example, when an http request is sent to a war's context root without the trailing slash, Tomcat sends a redirect with the trailing slash added on.  This has been known to cause issues with load balancers that perform the SSL termination.  To debug this type of issue on Tomcat 6, you add the RequestDumperValve.  In Tomcat 7, you add the RequestDumperFilter.....which doesn't work.  The problem is the redirect is not sent from inside of a war file.  Since the redirect is not being sent from a war file, no servlet filters are processed.  This means the RequestDumperFilter doesn't actually dump the http request/response.

Another example of this issue is trying to dump the request of an invalid http request.  We recently had an issue with a reverse proxy in front of a Tomcat server.  One http request was coming into the reverse proxy, but Tomcat was seeing two requests.  The first request get the HTTP GET line and some of the headers.  The second request started with one of the http headers.  The first request was getting a 200 response but was invalid because some of the request headers never got processed (the cookie header).  The second response returned an http status code 505 because the first line of the request was not a valid HTTP request; it was an http header.  In this scenario, the request dumper worked with the first request, but did not work with the second request.  In the Tomcat 6 world, both requests would have had the communication dumped to a log file.

I admire the Tomcat's team for trying to get rid of proprietary extensions when the J2EE servlet filter system seemed to handle what the valves could do.  This change has left a gap in functionality that would be good to have back.

Wednesday, May 8, 2013

Couldn't mine bitcoins in the VM

I finally got around to trying to mine bitcoins using the Radeon HD 7870 GHz Edition that is VGA-Passthroughed to a Windows 7 VM.  I couldn't get Miner-src to use the GPU.  It did offer to use the CPU, but I didn't bother trying to get that to work.  I should try it out and see what the Xen CPU mining overhead is, but I haven't.  It would be nice to get the 7870 to GPU mine, but its not that important to me.

Tuesday, May 7, 2013

iVIEW Android Netbook

I was browsing for some IP cameras and saw something interesting on the "You Might Also Like" section of the page.  There was a link to an Android Netbook.  I showed it to my wife as a possible replacement for her broken netbook.  She only uses her netbook for browsing the internet.  I was surprised that she actually showed some interest.  I decided to start doing some research on Android netbooks (that site didn't seem trustworthy).  I settled on the iVIEW Android Netbook 1010NB.  I looked up the details on the vendor's website.

My first impression was pretty positive.  I was super excited that the netbook uses a Mini-USB port to charge.  It came with a 2 amp Mini-USB charger.  It was easy to set up and was relatively responsive.  The first odd thing was the track pad.  From certain angles, it is actually hard to see the borders of the track pad.  You can see the lowered section of the track pad.  The entire portion is one solid piece of plastic.

The next weird thing was the battery indicator.  While plugged in, the battery percentage was higher than the real percentage.  The battery indicator reached 100% before the battery was fully charged.  When I unplugged the netbook, the percentage dropped pretty rapidly until it was at 85%.  After charging more, we were able to get the battery to a true 100% charge.

After installing some software, I closed the lid for a while.  My wife opened the lid to start using it.  Unfortunately, the battery was almost dead!  We charged it again and I started to look into the problem. That is when I realized that there is a "Zzzz" button.  This button puts the netbook to sleep!  Closing the lid doesn't actually force the netbook to sleep!

After learning that, I waited for feedback from my wife.  I wanted to know if it could replace her netbook.  Her biggest complaint was about the web browsers.  The mobile web browsers don't have a scroll bar.  This means she can't use a single click to scroll; she has to use a drag motion.  Also, my wife has a bad habit of double-clicking links on websites.  A double-click on a mobile browser will zoom, not navigate to the link.  Overall, she was not happy with the mobile browsers on the netbook.

She did like playing some of her Android games on the netbook over the 7" tablet.  So, she still uses her broken netbook to browse.  She uses her Nexus 7 for some games and her Android netbook for other games.

Overall, this netbook wasn't very good.  I am not too upset about this, given the cheap price for it.  The biggest problem seemed to be the usability of the mobile browsers on a netbook and the "Zzzz" button. The Android netbook concept does have some potential, though.

Monday, May 6, 2013

Backing up Gmail with Fetchmail

I have had Gmail since 2004.  I didn't really start using it until 2006, however.  I always told myself that I should back up my emails before a disaster occurred.  Well, a disaster didn't occur.  I finally got around to it.

The Fetchmail program seemed like the best choice for this task.  There are plenty of Googleable articles that describe how to get Fetchmail to work with Gmail.  By default, Fetchmail uses the Mbox mailbox format.

I have experience as an email administrator.  I have used Sendmail and Postfix SMTP servers.  I have also used UW-IMAP and Cyrus IMAP servers.  I have seen how different mailbox formats perform under various conditions.  This lead me to shy away from the Mbox mailbox format.  The Mbox format stores your entire mailbox in a single text file.  Back in the older days of the internet, storing all 512kb of email in a single file was not that big of a deal.  That format doesn't scale to the Gmail mailbox size, however.

I previously used the Maildir fomat before.  Although not as efficent as the built in Cyrus IMAP mailbox, it is good enough.  Below is my configuration for backing up Gmail onto my local server.

.fetchmailrc
poll pop.gmail.com
protocol pop3
username "myemail@gmail.com" password "mysecret"
keep ssl
mda "/usr/bin/procmail"

/etc/procmailrc
# Use maildir-style mailbox in user's home directory
#DEFAULT=$HOME/.maildir/
DEFAULT=/var/mail/maildir

/etc/crontab
0    2  * * *   jeff    fetchmail -d0 -k pop.gmail.com 2>/dev/null >/dev/null


With this configuration, fetchmail will download a fixed number of emails every day.  As time goes on, eventually your entire inbox will get backed up.  Also, new messages (that don't get deleted) will be backed up every night.

Friday, May 3, 2013

MK802 IV: First Thoughts

The MK802 IV is the 4th generation Android USB stick by Rikomagic.  The MK802 brand has received a lot of praise over the last year.  The 4th generation definitely improves upon the 3rd generation, but it doesn't have many new features that I would use in the Android TV space.  The 4th generation doubles the CPU (quad core vs dual core, and the core is slightly faster) and doubles the RAM.  There doesn't seem to be an upgrade with regards to the GPU.

I use the MK802 for a very specific purpose.  I use it as an Android TV.  For this purpose, the 3rd generation is really good at it.  I never had any performance issues that would require a quad core.  I can currently stream HD video just fine.  I read one article about the 4th generation that described the 2nd generation as a proof of concept, the 3rd generation as leading edge, and this upcoming 4th generation as the mainstream.  I think hardware of the 4th generation has perfected the Android TV.  Some apps that I use (Hulu Plus and Netflix) do have occasional UI slowdowns.  These should be eliminated with the 4th generation.

That being said, the MK802 is NOT only an Android TV.  It is a generic device.  I have read how some people use it as a travel computer.  I've read about more people that are interested in it as a gaming platform.  This is where the 4th generation really shines.  The specs on this new generation rival the new Ouya device.  The 3rd generation already supported USB controllers.  With Bluetooth support, this device can actually turn into an awesome gaming platform.

With the 3rd generation, I bought 2 devices as soon as they were available to replace the 2 2nd generations that I had.  Because of the lack of new features in the TV space, I probably won't buy the 4th generation as soon as its available.  I will probably wait for it to get cheaper.  Also, I probably won't buy 2 at the same time.  I will probably buy 1, then wait for the 5th generation to come out.

Thursday, May 2, 2013

Upgrading the Samsung Galaxy S II

My wife and I both have Samsung Galaxy S IIs.  Hers is the Captivate Glide model that has the slide out QWERTY keyboard.  My model is the Skyrocket LTE edition.  I got a text about a week ago that an upgrade was available for my phone.  Her phone got multiple text messages over time because she never wanted her phone upgraded.  I finally convinced her to upgrade from Gingerbread.

One thing I hate about Samsung phones is the need for Samsung Kies to upgrade the phones.  I can't stand the software.  Part of it is because I don't normally run Windows and part of it is that Kies seems to want to install a bunch of crapware.  It installs drivers and other things for multimedia.  This is a shame, because the software can pre-download firmware for your phone.

Because I don't want to keep Kies installed, I actually install it into my Windows VM.  I make sure to take a Qemu disk snapshot prior to installing the software.  After I finish upgrading my phones, I revert the disk to the prior snapshot.

First, I tried upgrading my phone.  I had some USB connectivity issues, but this has happened before.  I almost never reboot my phone, so I know I just have to reboot the phone.  After rebooting, I was able to connect.  The first attempt at upgrading got stuck in the "Preparing firmware upgrade components" phase.  I unplugged the cable, but the upgrade window didn't go away.  I had to open up Task Manager and started killing Kies processes.  I tried again and the phone upgraded.  Now I'm using 4.1.2.

Next, I tried upgrading my wife's phone.  It also had some USB connectivity issues that were solved by rebooting.  She also never reboots her phone.  During the first attempt, it got stuck for 30 minutes in the "Downloading firmware updates to phone" phase.  When I realized that Android was still running (it was not in Odin mode), I unplugged the phone and tried again.  This time it took 5 minutes to download all 100%.  After a few more minutes, the phone rebooted and she was running 4.0.4.  I shut down the VM, reverted to the last snapshot, and rebooted.  Windows came up without a trace of Kies.

Overall, I love Samsung phones, but they still leave a lot to be desired: especially when it comes to upgrades.  The whole process ended up taking about 2 hours to upgrade both phones.  The Kies software seems bloated.  The phone connectivity was spotty.  I would still buy another Galaxy S phone in the future.

Wednesday, May 1, 2013

Citrix Receiver on Ubuntu

I have been using Gentoo for about 9 years now.  Although I still prefer its flexibility, I wanted to have a more stable desktop environment.  That is why I decided to install Ubuntu on my new laptop and desktop.  I still use Gentoo on my servers.  I always assumed that Ubuntu had better stability and had a better install procedure than Gentoo.  I have found that this is true for 99% of programs.  When you run into that one program you need, then the frustration begins.

I job uses Citrix Receiver to allow us to connect remotely.  It is not an obscure program.  I had been using the version in the portage tree for years.  There is even an Android version that I used once on my Nexus 7.  I was disturbed to find out that it wasn't available on Gentoo.  I started googling around and everywhere talked about how complicated it was to install it on a 64-bit Ubuntu install.

It turns out the problem is Citrix Receiver depends on an old 32-bit-only version of Motif.  This means there is no 64-bit version of the product.  Gentoo seems to handle installing 32-bit apps on a 64-bit system (at least in this case).  I tried using various online instructions to install the app on my laptop.  After messing around for a period of time, I have up.  As sad as it sounds, I decided to use Windows.  I don't actually dual-boot Windows on my laptop.  I have a VM server that has multiple Windows installs.  I used remote desktop to connect to one of the Windows VMs and connected to work from there.  It is a hack.  It is really ugly.  It works.