Development Temporarily On Hold

Unfortunately I’m a busy college student, and I have many things to worry about, such as projects, exams, and studying. I prioritize this more than my open source development and work on new projects. Because of my heavy workload lately, I’ve put all of my hobbyist (read: unpaid and time consuming) development on hold. However, I did release the full source code of LibreScribe, and it’s released under the GPL so all of my work is not lost. Anyone can pick it up, fork it, and start working on it. I hope to work on this project again someday, perhaps over Thanksgiving break, but until then, I have to focus primarily on my studies and my financial and academic obligations. Also, I apologize for not updating this blog for quite some time. I assure you, I am fine, I’ve just been very busy, with a job over the summer, and being at college now, I have a lot on my plate to take care of. Thank you for your understanding.

Fixing Autokey (GTK) on Ubuntu 12.04

Autokey is a wonderful scripting tool for Linux. Unfortunately, it doesn’t work out of the box in Ubuntu 12.04. The reason why is because Autokey isn’t on the Unity panel’s system tray whitelist. I submitted a bug report on Launchpad, but for now, if you want to get Autokey working without breaking the Unity panel for any other applications, it’s as simple as running the following command in the terminal:

if grep -q 'Autokey' <(echo `gsettings get com.canonical.Unity.Panel systray-whitelist`); then echo "'Autokey' exists in Unity panel whitelist. Nothing to do here."; else echo "Adding 'Autokey' to Unity panel whitelist." && gsettings set com.canonical.Unity.Panel systray-whitelist "`echo \`gsettings get com.canonical.Unity.Panel systray-whitelist | tr -d ]\`,\'Autokey\']`"; fi

This will check your current whitelist to see if Autokey is present, and if it isn’t intelligently append it to the whitelist without messing up your current whitelist entries. If it’s already there, it won’t add a duplicate entry. This one-liner can be easily modified to add any value you want to Unity’s system tray whitelist, in order to fix the same problems with other applications. Note that you may have to log out and log back in before the changes take effect. Enjoy! :)

Ordered a Raspberry Pi

If you haven’t heard of it, Raspberry Pi is a very interesting project to create an incredibly cheap but powerful computer. It was released on February 29th, and on that same day, I purchased a Model B ($35) through element14′s site. Due to overwhelming demand, I probably won’t actually get it for a while, but when I do, I’ll post an update on my blog about it. Because of the unbelievable value of the device, and not-too-shabby specifications, there are many potential applications for it. I plan on playing with it and potentially coding some really neat stuff in my free time. I’ll post further updates about the Raspberry Pi on my blog.

How to fix crash on a rooted Android device

I noticed that my rooted Android phone, a Samsung Epic 4G was crashing when I opened my Camera application, saying that was force closing. It took me about half an hour, but I figured out how to fix the problem using adb. The problem is that it was having trouble writing to and reading from the media database. Deleting the media databases solves the problem without doing a complete factory reset. To do this, run adb shell, and then type su to gain root access. Now type in “rm /data/data/*” and hit enter. This will fix the problem.

A List of Words Containing “Rent”

So Barnes & Noble College is currently doing a word game called “Words With RENT” where you can submit a word with “rent” in it in order to have a chance at winning $100. Here’s a list of all of them (generated using cat /usr/share/dict/words | grep -i “rent” in Linux):
abhorrent, adherent, adherent’s, adherents, apparent, apparently, apprentice, apprentice’s, apprenticed, apprentices, apprenticeship, apprenticeship’s, apprenticeships, apprenticing, belligerent, belligerently, belligerents, coherent, coherently, concurrent, concurrently, current, currently, currents, deferential, deferentially, deterrent, deterrent’s, deterrents, different, differential, differentials, differentiate, differentiated, differentiates, differentiating, differentiation, differentiation’s, differently, godparent, godparent’s, godparents, grandparent, grandparent’s, grandparents, incoherent, incoherently, indifferent, indifferently, inferential, inherent, inherently, irreverent, irreverently, overenthusiastic, parent, parent’s, parentage, parentage’s, parental, parented, parentheses, parenthesis, parenthesis’s, parenthesize, parenthesized, parenthesizes, parenthesizing, parenthetic, parenthetical, parenthetically, parenthood, parenthood’s, parenting, parents, preferential, preferentially, recurrent, referent, referent’s, referential, referential’s, rent, rent’s, rental, rental’s, rentals, rented, renter, renter’s, renters, renting, rents, reverent, reverential, reverently, stepparent, stepparent’s, stepparents, torrent, torrent’s, torrential, torrents, transparent, transparently, undercurrent, undercurrent’s, undercurrents

Help Fight Internet Censorship!



If you didn’t notice yet, I modified the theme of my site, in particular header.php, in order to show a black censorship bar over my site’s heading. Why? There is a law being passed that aims to completely censor the internet in the name of stopping copyright infringement. The impact of such a bill is much more far-reaching than just copyright infringement. This could completely change the way that we use and experience the internet. I encourage everyone reading this to visit and show their support. Let’s stand up together to fight for a free internet where information isn’t restricted! Just look at what it’s like in China, the level of censorship on the internet through the “great firewall of China” is astounding!

Sorry For The Lack of Updates

I’ve been fairly busy lately (more than usual), and I realize I haven’t updated my site in quite some time now. There have been several significant changes with LibreScribe. The full details are available in the commit log on github, but most importantly, LibreScribe now functions to the point where pages can actually be pulled from the device, rendered, and displayed in the native image viewer on the system. I’ll try to post some more updates soon and get more work done on LibreScribe in the near future.

Significant LibreScribe Progress Made

As you may have noticed, I took a break from working on LibreScribe for a while, and the project looked as though it was abandoned. Well, it isn’t, and I’ve got tons of good news! Since the last time I wrote an update about LibreScribe, in late May, I made several incredibly significant changes. Some of these may not seem that exciting, but they are absolutely crucial in order to further develop the program. Some of these new features (such as retrieving and changing the name of the device) didn’t exist in libSmartpen at all, so implementing them required me to capture packets sent over USB and do a bit of reverse engineering. At first, I used the trial version of USBTrace, but I quickly realized that it wasn’t the tool for the job when I got notifications that I used more than my 256K data limit just by opening LiveScribe Desktop. To make it even less appealing, it costs $195 USD for a single license! That’s ridiculous! So of course, I did a bit of searching, and I found busdog, which does the same job (although using unsigned filter drivers that require modifying windows settings and rebooting several times) for free! Although getting it setup was significantly more frustrating than getting USBTrace working, it was well worth not paying $195, and it does everything I need it to, albeit without as nice of an interface. Anyways, here’s a list of significant changes I made:

  • LibreScribe no longer crashes when retrieving the list of applications installed on the device. This was incredibly frustrating when I was trying to develop it. It also filters out the LiveScribe Connect and System files, so that they are not listed if they are present on the device.
  • Instead of displaying a hard-coded list of notebooks, LibreScribe now retrieves the names of all of the notebooks actually in use on the device.
  • When a device is not present on the system, or LibreScribe can’t find it, the page tree now shows a “No Smartpen Detected” item, along with an brand new icon that indicates that no device is connected instead of the regular pen icon.
  • I added context menu event handlers to the page tree, so now when you right click or press the menu button, LibreScribe can display a menu of options relevant to the item you clicked. More work on this still needs to be done, but if you click the root element (the smartpen itself, or the placeholder when one isn’t connected), you will now see a new menu allowing you to rename the device, refresh the connection, or display information about the device.
  • When the device is unplugged or plugged in, the page tree and the applications/audio lists will now automatically refresh themselves.
  • LibreScribe now retrieves the name of the smartpen from the device, rather than defaulting to “My LiveScribe Smartpen”. It can also set the name of the pen, but this feature is still a little bit buggy (it won’t brick your device, so it’s safe to test). Interesting discovery: In the LiveScribe desktop software, you can set the name of the pen to anything up to 50 characters. This does not mean that the device doesn’t allow more than that, it’s just a ‘soft’ limit in the LiveScribe desktop software. There probably is an actual limit, but I was able to set the device name to almost a paragraph of text, including every symbol you can type on a standard US keyboard, and retrieving it from the pen worked perfectly. The pen stored the entire thing, and returned it when I checked the name, although it did not display the entire string when I turned the device on, just the first part of it. The string of text I tested was “~`!@#$%^&*()-_+={}[]:;”‘<>?/,.\ Testing the maximum name length for a LiveScribe Smartpen… I wonder if I could fit a paragraph in here…? You have got to be kidding me… I typed this much and it STILL works? That’s incredible. There’s virtually no limit to how long the smartpen’s name is. I can’t believe I can set and receive values this long! I’m speechless…“. Needless to say, you can store almost anything in the name of the Smartpen. I wonder how the LiveScribe desktop software would react if it tried to retrieve this string.
  • I added a dialog box to rename the device, as well as another dialog box to confirm the new name.
  • LiveScribe no longer crashes when removing or connecting a smartpen while the program is running.
  • I merged in the inline functions written by Luis Pedro Coelho on his fork of LibreScribe, which are a better implementation of device type checking than I had
  • Tons of new debugging output was added. You can see this output on the console. This makes figuring out what went wrong in a crash so much easier.

Remember, LibreScribe is still alpha quality and should not be used in a production environment. If you have any issues or suggestions, feel free to file a bug report. Or, if you’re skilled enough, I’d appreciate it if you fixed the bug yourself, and submitted a patch. Ah, the benefits of open source coding! This is only just the beginning. Expect tons of new enhancements and bug fixes over the next several months.

Justice Department Files Lawsuit to Block Takeover of T-Mobile

In case you didn’t hear, AT&T is in the process of attempting to acquire T-Mobile for $39 billion. Not only would this make AT&T the nation’s largest wireless carrier (controlling 43.3% of the wireless market), but it would also mean that more than 75% of the nation’s wireless customers would be on AT&T and Verizon Wireless. What this means is that the third largest carrier, Sprint, which I’m a customer of, would have less than a fourth of the nation’s wireless customers. This deal is extremely anti-competitive, and anti-consumer. With less carriers, and less choice, this would allow cellular providers to increase prices, decrease choices in phones, and reduce innovation. Just yesterday, the Justice Department filed a lawsuit to block the proposed deal. I strongly believe that there would be no benefits to consumers from this acquisition. All AT&T is doing is eliminating a major competitor. If you’re on T-Mobile, you probably realize that you have access to some of the cheapest prices available in the wireless industry, as well as decent coverage. If AT&T acquires T-Mobile, it’s fairly obvious that they will change the pricing scheme to match that of their own, allowing them to force consumers into paying a lot more for their wireless service. Service charges are already high as it is, with more carriers charging more money for lesser or equal amounts of features and unlimited data service disappearing in favor of a tiered pricing model, we simply can’t afford to lose a huge competitor to the major cellular carriers. I believe that everyone who owns a cellular phone in America will be, in some way, hurt by this deal. As consumers, we simply cannot allow AT&T to acquire T-Mobile. The only possible outcome is less competition, less choice in wireless devices, higher prices, and less jobs in the wireless industry.

via No Takeover Project

How To: Invite ALL of Your Facebook Friends to Google Plus At Once

Image representing Google as depicted in Crunc...

Image via CrunchBase

Using a neat little trick, I managed to send everyone on my Facebook friend list a Google+ invite. In this post, I’ll show you how to do that. It’s actually quite simple. If you don’t have a GMail account, this will still work for small amounts of contacts, but you need to use a GMail account to process and invite all of your contacts at once.  First, if you don’t already have a Yahoo account, sign up for one. Otherwise, sign in and go to Yahoo Mail. The reason this works is because Yahoo and Facebook have some kind of partnership. Once logged in, go to the “Contacts” tab. Click “Import Contacts”, and choose the “Facebook” option. Allow Yahoo access to your Facebook contacts. On my account, it only imported 100 contacts the first time. After the second try, I had all 257 of my Facebook contacts imported. Now that you have your contacts imported, go back to the “Contacts” tab. Click “Actions”, and choose “Export All…”. When asked, export as a “Yahoo! CSV” file, and remember where you saved that. You will need it later. Now go to Google Contacts. Create a new group called “Facebook”. Once you have a “Facebook” group, click the “Import” link on the upper right of the page. Select the Yahoo .csv file, and make sure to choose to import it into the newly created “Facebook” group. Now that you have all of your contacts imported, if you don’t have GMail, select all of your contacts and choose “Email”, otherwise go to GMail and login to that. In GMail, click “Contacts” and then click the “Facebook” group. Click the checkbox above the list of contacts to select them all at once. Now click the “Email” button. You will now see all of your contacts in the “To” field of GMail or your email client. Copy the entire list, and paste it into the Google+ invite form. Click invite. Congratulations, you just invited all of your Facebook friends to join Google+.