PastePage - Instantly create a web page, no login required

Have you ever wanted to just put something out there on the web, but you didn't want to go through the trouble of setting up a Blogger account, or similar service?

If so, you should check out my new project: PastePage.  Inspired by pastebin.com (an excellent developer resource), PastePage lets you instantly create a web page with no registration or login required.

Just go to pastepage.net, make your basic page, and hit Save.  It will create a new page with a short, random URL, for easy posting to Facebook, twitter, emails, etc.

If you do decide to register, you can edit your old posts (even ones you've saved while not logged in, thanks to a cookie system).

Check it out!

Backblaze - Online Backups on the Cheap

My online backup system of choice, Backblaze, has saved my caboose a few times, so I thought it was time I pay it forward and tell others about this really cool service.

Full disclosure: I am not being paid by Backblaze, and I am receiving no commission for linking to them.

You've probably heard about other online backup services, like Carbonite.  If you haven't, here's the quick version:  files and directories you specify on your computer get backed up, through the Internet, to a remote server while your computer isn't being used.

They are only backed up when they change, so, for example, if you are a programmer, only the files you have altered will get re-sent to the cloud, minimizing the amount of network traffic going out each day.

It's essential that if you need important backups, they be offsite.  That way a fire, flood, lightening strike, theft, etc, won't cripple you; you can always log in and retrieve your data through the web.

Anyway, like Carbonite, Backblaze is $5/month.  Unlike Carbonite, though, it will back up any file by default, just about any size, and I personally just find it easier to use.  $5 a month is the cheapest insurance you can buy for your data.

Another great feature is you can restore files up to a month old.  I had to use this today:  I accidentally did something that ruined a git repository for a project I am working on.  Rather than try to piece it back together again, I logged into Backblaze and downloaded a snapshop of the entire directory as of 11pm last night.  Within minutes I was downloading a zip file of that directory.  So nice.

In case you were wondering Backblaze (and probably Carbonite as well) give you unlimited storage and bandwidth, so feel free to tell it to back up your 2TB hard drive, though realistically I only back up certain directories on my computer.  No need to back up C:\Windows or Program Files.

I also back up my websites by having my site's files and db downloaded every night to my hard drive, which Backblaze then backs up automatically.

So check it out!

 

Android Games with Gamepad Support

If you happen to own an Android-based phone or tablet, and you also happen to enjoy playing games with a real gamepad instead of on-screen controls, then you are in luck.

I recently started a new site, specifically for the purpose of keeping up with games that have these options.  It's called simply Android Gamepad Games (androidgamepadgames.com).

The list can be sorted, and entries includes a screenshot taken from the Google Play store.  The list is hand-currated by yours truly, but updates can easily be submitted if you notice a problem.

The goal is to eventually also have an Android app which syncs with this lists' data.

Enjoy!

 

LibGDX Keycodes to Strings

If anyone out there is using the wonderful libGDX library for their mobile games, and are using the wonderful Controllers library that goes along with it, perhaps you've run into a problem which I found:  I wanted a way to let the player see the names of they keys they had mapped on the keyboard to different controls.

Well, in order to do that, I needed to know what the English names were associated with they keycodes delivered, for example, to the keyDown method.

So, I made a HashMap for my own uses, and thought I'd put it here.  It isn't complete, but it has most of the keys.  Enjoy!

public static HashMap<Integer, String> keycodeNames 
                          = new HashMap<Integer, String>();
 
  static {
    keycodeNames.put(7, "NUM_0");
    keycodeNames.put(8, "NUM_1");
    keycodeNames.put(9, "NUM_2");
    keycodeNames.put(10, "NUM_3");
    keycodeNames.put(11, "NUM_4");
    keycodeNames.put(12, "NUM_5");
    keycodeNames.put(13, "NUM_6");
    keycodeNames.put(14, "NUM_7");
    keycodeNames.put(15, "NUM_8");
    keycodeNames.put(16, "NUM_9");
    keycodeNames.put(29, "A");
    keycodeNames.put(57, "ALT_LEFT");
    keycodeNames.put(58, "ALT_RIGHT");
    keycodeNames.put(75, "APOSTROPHE");
    keycodeNames.put(77, "@");
    keycodeNames.put(30, "B");
    keycodeNames.put(4, "BACK");
    keycodeNames.put(73, "\\");
    keycodeNames.put(31, "C");
    keycodeNames.put(5, "CALL");
    keycodeNames.put(27, "CAMERA");
    keycodeNames.put(28, "CLEAR");
    keycodeNames.put(55, ",");
    keycodeNames.put(32, "D");
    keycodeNames.put(67, "BACKSPACE");
    keycodeNames.put(112, "FORWARD_DEL");
    keycodeNames.put(23, "CENTER");
    keycodeNames.put(20, "DOWN");
    keycodeNames.put(21, "LEFT");
    keycodeNames.put(22, "RIGHT");
    keycodeNames.put(19, "UP");
    keycodeNames.put(33, "E");
    keycodeNames.put(6, "ENDCALL");
    keycodeNames.put(66, "ENTER");
    keycodeNames.put(65, "ENVELOPE");
    keycodeNames.put(70, "=");
    keycodeNames.put(64, "EXPLORER");
    keycodeNames.put(34, "F");
    keycodeNames.put(80, "FOCUS");
    keycodeNames.put(35, "G");
    keycodeNames.put(68, "GRAVE");
    keycodeNames.put(36, "H");
    keycodeNames.put(79, "HEADSETHOOK");
    keycodeNames.put(3, "HOME");
    keycodeNames.put(37, "I");
    keycodeNames.put(38, "J");
    keycodeNames.put(39, "K");
    keycodeNames.put(40, "L");
    keycodeNames.put(71, "[");
    keycodeNames.put(41, "M");
    keycodeNames.put(90, "FAST_FORWARD");
    keycodeNames.put(87, "NEXT");
    keycodeNames.put(85, "PLAY_PAUSE");
    keycodeNames.put(88, "PREVIOUS");
    keycodeNames.put(89, "REWIND");
    keycodeNames.put(86, "STOP");
    keycodeNames.put(82, "MENU");
    keycodeNames.put(69, "MINUS");
    keycodeNames.put(91, "MUTE");
    keycodeNames.put(42, "N");
    keycodeNames.put(83, "NOTIFICATION");
    keycodeNames.put(78, "NUM");
    keycodeNames.put(43, "O");
    keycodeNames.put(44, "P");
    keycodeNames.put(56, ".");
    keycodeNames.put(81, "+");
    keycodeNames.put(18, "#");
    keycodeNames.put(26, "POWER");
    keycodeNames.put(45, "Q");
    keycodeNames.put(46, "R");
    keycodeNames.put(72, "]");
    keycodeNames.put(47, "S");
    keycodeNames.put(84, "SEARCH");
    keycodeNames.put(74, ";");
    keycodeNames.put(59, "SHIFT_LEFT");
    keycodeNames.put(60, "SHIFT_RIGHT");
    keycodeNames.put(76, "/");
    keycodeNames.put(1, "SOFT_LEFT");
    keycodeNames.put(2, "SOFT_RIGHT");
    keycodeNames.put(62, "SPACE");
    keycodeNames.put(17, "STAR");
    keycodeNames.put(63, "SYM");
    keycodeNames.put(48, "T");
    keycodeNames.put(61, "TAB");
    keycodeNames.put(49, "U");
    keycodeNames.put(0, "UNKNOWN");
    keycodeNames.put(50, "V");
    keycodeNames.put(25, "VOLUME_DOWN");
    keycodeNames.put(24, "VOLUME_UP");
    keycodeNames.put(51, "W");
    keycodeNames.put(52, "X");
    keycodeNames.put(53, "Y");
    keycodeNames.put(54, "Z");
    keycodeNames.put(129, "CONTROL_LEFT");
    keycodeNames.put(130, "CONTROL_RIGHT");
    keycodeNames.put(131, "ESCAPE");
    keycodeNames.put(132, "END");
    keycodeNames.put(133, "INSERT");
    keycodeNames.put(92, "PAGE_UP");
    keycodeNames.put(93, "PAGE_DOWN");
    keycodeNames.put(94, "PICTSYMBOLS");
    keycodeNames.put(95, "SWITCH_CHARSET");
    keycodeNames.put(255, "BUTTON_CIRCLE");
    keycodeNames.put(96, "BUTTON_A");
    keycodeNames.put(97, "BUTTON_B");
    keycodeNames.put(98, "BUTTON_C");
    keycodeNames.put(99, "BUTTON_X");
    keycodeNames.put(100, "BUTTON_Y");
    keycodeNames.put(101, "BUTTON_Z");
    keycodeNames.put(102, "BUTTON_L1");
    keycodeNames.put(103, "BUTTON_R1");
    keycodeNames.put(104, "BUTTON_L2");
    keycodeNames.put(105, "BUTTON_R2");
    keycodeNames.put(106, "BUTTON_THUMBL");
    keycodeNames.put(107, "BUTTON_THUMBR");
    keycodeNames.put(108, "BUTTON_START");
    keycodeNames.put(109, "BUTTON_SELECT");
    keycodeNames.put(110, "BUTTON_MODE");
    keycodeNames.put(144, "NUMPAD_0");
    keycodeNames.put(145, "NUMPAD_1");
    keycodeNames.put(146, "NUMPAD_2");
    keycodeNames.put(147, "NUMPAD_3");
    keycodeNames.put(148, "NUMPAD_4");
    keycodeNames.put(149, "NUMPAD_5");
    keycodeNames.put(150, "NUMPAD_6");
    keycodeNames.put(151, "NUMPAD_7");
    keycodeNames.put(152, "NUMPAD_8");
    keycodeNames.put(153, "NUMPAD_9");
  }

 


Software License Fine Print

This code is considered "open source," and is released under the GNU Public License version 3 or any later version (http://www.gnu.org/copyleft/gpl.html). In a nut shell, you can change this code however you want, and redistribute it, but ONLY if it is ALSO under the GNU Public License version 3 or later.  This code/software is given "as-is", with no warranty or guarantee.

If you use this code/software, I would appreciate credit and a link back to this site (richardpeacock.com), though this is not required.

Alex the Alien

Who doesn't like new games?  No one, that's who.  And you're not no one, then you may enjoy my latest game: Alex the Alien and the Mummy's Pyramid.

I just released it for the new Android-powered OUYA system, though I'm planning to also release it for the Google Play and Amazon App Store android marketplaces too.

You play as Alex, a little alien who has become trapped in a mummy's pyramid, and now much solve the puzzle of each level to make it to the exit.

But you can read more about it on my other site, offworldsoftware.com.

You can also see the complete write-up on the site OUYAlytics.com.

Sample screenshot:

Dropbox and Eclipse IDE

Even though I have already written about the usefulness of Dropbox for programmers, I'd like to share another tip specifically for the Eclipse IDE, and any IDE based on Eclipse.

You may not have realized it, but Eclipse (and derivatives-- Aptana, Titanium, etc) can be run as a "portable" application.  Meaning, you can just copy the entire Eclipse directory to another computer or, say, a USB drive, and it will run exactly the same, with all of your settings in tact.

This means it is a perfect friend for Dropbox.  I place my Eclipse IDEs in folders under Dropbox, and make sure my Workspace is pointed to a folder within Dropbox, and presto-- my projects, settings, etc, are on all of my computers and ready to go.

And any changes I made to my source code, preferences, layout, etc, are automatically spread to my other computers.

Now, this does require that your Dropbox folder is at the same path location on all of your computers.  But, luckily, Dropbox lets us specify exactly what path to use.  So, for example, you could just make sure that your Dropbox folder is always at C:\dropbox.

 

MySQL Temporary Tables

If you have ever needed a routine which rebuilt a large database table every night, you've probably run into the following situation:  while the table is being rebuilt, whatever scripts which read from it will be broken, and you risk users of your system (or site) seeing the data when its still only half-populated.

For those MySQL gurus out there, you're probably screaming "use transactions, jerk!"  But, if you are using a MyISAM table instead of InnoDB, that isn't an option.

So what to do?

Temporary tables to the rescue!

If you didn't know what this type of table is, it is a table created in memory, which MySQL will automatically kill when your connection ends.  For web sites, that means as soon as your script is finished running.

Kindle Paperwhite - A Review

I normally don't do product reviews on this site, but after buying the Kindle Paperwhite, I loved it so much, I decided to write about it here, and try to explain why its such a great product.

Ebooks vs. paper books

Let's get this out of the way up front-- I love ebooks.  I know some people out there are die-hard fans of traditional paper books.  They like the feel of them, the smell of them, and the satisfaction of collecting them on book shelves like trophies once finished reading.

Believe me, I used to be right there with you.  But after moving twice in the past year, and having to carry around hundreds of pounds of books I will likely never read again, I decided to give ebooks a try.

And I'm glad I did.  I can't get enough of them.  Until recently, I used either my iPad or my Nexus 7 to read on (with the Kindle app).  I love that I could have hundreds of books "in the cloud" that could effortlessly move from device to device.  I love that I can search for keywords or passages in the book just like CTRL-F on a webpage.  And I think most of all I love that I can long-press on a word, and a dictionary definition comes up.  I can't say how often I use this, especially when reading Game of Thrones.  There are so many archaic words that I don't recognize.

But I think the number one feature that made me switch from paper to electrons had to be the fact that I can download a preview of the books for free.  If there's a book I am curious about online, I can just get the first few chapters to see if I like it.  Generally, I know within the first 20 pages if I am "hooked" or not.  And doing that in a book store just isn't practical.

 

iOS 6 Autorotate Solution

When Apple moved from iOS 5 to iOS 6, they changed the way developers must handle autorotation in their apps. 

Basically, it isn't too bad, as it should just work automatically.  But, I ended up struggling for hours without success, until I came upon this helpful website with a small, almost throw-away piece of advice:

In your AppDelegate class, in the application: didFinishLaunchingWithOptions method, you might have a line like this:

[window addSubview:viewController.view];

This is especially likely if you are updating an app from iOS 5 or below.

This line will actually prevent autorotation from working in iOS 6!  Change it to this:

window.rootViewController = tabBarController;
// (or set to whatever navController you might be using)

So, to reiterate, I spent hours and hours pulling my hair out, when it turns out I needed to change one line of code, in an area of the app which seems to have nothing to do with autorotation at all.  Thanks Apple!

FlightPath - Academic advising and degree audit software

The university where I work just officially open-sourced a piece of software which I helped create and currently maintain.  It's called FlightPath-- it's an electronic advising and degree audit system for universities, community colleges, technical colleges, etc.

 fpscreen1-edit_300.jpgAs I said, it's been released as open source, under the GNU GLP license (the same license as many other open source projects).  Programmed in PHP/MySQL, it is designed to let students and advisors track a student's progress through their degree.  The system even lets them try out other majors, to see how their credits would fit in.

If you are interested, there is a live demo of FlightPath available.

So please, give it a try!

Location:  http://getflightpath.com

 

Syndicate content