Getting Native Client (NaCl) running with Pepper 18

After reading about Google’s Native Client (NaCl) for a while, I wanted to see how difficult it would be to share compiled code on the web, so I decided to dive into the docs and check it out.

I’ll start with the conclusion in case you aren’t really interested in the technical details (and since they are mostly just notes that will be outdated when NaCl updates anyway).

The problem I ran into is any code I would want to share is dependent on a set of libraries that I can only find in a .lib file (they are the libraries from CS106B), and  I can’t seem to find a way to successfully link this library and use the functions from it.

I have a few different options like trying to set up the g++ compiler with Visual Studio (this has improved since writing, see update below) or rewriting the parts of the program with a standard set of libraries that I have access to (this would take a lot more time).  Neither of those seem very appealing especially considering that I don’t have any major plans for using NaCl.

While I definitely find NaCl to be an interesting concept, I’ll be much more interested in playing around with it when it has an IDE (or plays nicer with existing ones) and up to date documentation.

Update

In the time since I drafted this post, two things have happened.  First, NaCl is playing nicer with Visual Studio.  Second, I’ve begun CS107.  My plan is to return to this after I have some more interesting C code from CS107 and try out the VS integration.

The following are my notes from this project.  Again, these will likely be outdated soon, but I ran into enough problems to share them so others might have an easier time.

Notes

Before I started developing, I had to enable NaCl in Chrome.  You can do this by going to chrome://flags/, clicking enable Native Client, and restarting the browser.

Next,  I went to the quick start guide which was straightforward: https://developers.google.com/native-client/quick-start

The main links are here to download and here to get started (though you may want to read on here before going through those).

After updating, Pepper 18 installed.  There are two problems with this.  First, the documentation is set by default to Pepper 16.  Second, even the Pepper 18 documentation is outdated (more on this later).

On the download page, the last step tells you to set an environment variable.  The instructions aren’t precise, but I’ve messed with environment variables before so this wasn’t too much trouble.  However, I’m fairly certain with Pepper 18 this isn’t necessary, but see the next paragraph for how to do this if you were a little confused.

In Windows 7:

  • type path into the start menu, go to edit system environment variables
  • click on the Environment Variables button
  • click ‘New’ under System variables
  • set the name to %NACL_SDK_ROOT% and set the path to C:/nacl_sdk  (or wherever you installed)

Why do I think this isn’t necessary?  As of Pepper 18, NaCl uses make files instead of SCons (though there are still references to SCons and not make files in the docs).  In the make file, they have a fail-safe if you don’t have the variable set.

I’m not sure if I missed a step somewhere or this is an artifact of the docs being outdated, but I was getting errors trying to run the examples on a local host in the tutorial, so I had to go to the console and execute ‘pepper18examplesmake.bat’.  Now they seem to run fine.

Also a problem with the docs being outdated:  for Step 5 of the tutorial, Pepper 18 no longer includes init_project.py.  You should simply use the files from an example for your template.

These were the primary problems I ran into with the documentation.

I used the hello_world_interactive example as my template and started editing the ‘helper_functions.cc’ file.  To get things to show up, simply edit the code, save, run make.bat in the directory, then rehost (I was using the simple Python local host recommended in the docs).  Simple enough and I had a live NaCl app running.

 

CS106B and aiclass

For the latter part of 2011, I decided to focus more on writing code and learning than writing about code.  I did this by taking two courses online, Programming Abstractions (CS106B) and Intro to AI, both from Stanford, online and free.

I started CS106B because while I had some familiarity with the concepts in the course, I didn’t have much experience implementing them.  The course covers a range of topics including: recursion, complexity analysis, search/sort, use and implementation of many standard containers (vector, queue, stack, map, etc.), pointers, linked lists… and more!  While the previous course (CS106A) is a great introduction to coding and software engineering, this course digs much deeper into more complicated abstractions for data structures and algorithms.

Although most of my code at work hasn’t required much of what I gained from this class, more coding is good and coding out of my comfort zone (which these topics definitely were) is better.

More importantly, the final assignment of CS106B ended up teaching me a valuable lesson about planning.  The first part of the assignment was to implement Dijkstra’s algorithm (which finds the shortest path through a series of connected points).  While this wasn’t trivial, the planning wasn’t very difficult and the debugging was standard.

The second part of the assignment was to implement Kruskal’s algorithm (create a minimal spanning tree from a graph. That is, create the minimum number of connections to connect all points on a graph).  I ran into some serious trouble here.

Part of the problem may have been the artificial deadline I set for myself.  In any case, when it came time to put this together, I read the assignment several times and just wasn’t getting it.  Instead of taking a break and getting a solid plan in place, I decided I had some ideas about parts of the algorithm, and I could eventually hack those pieces together and figure out the rest.  I’ve made a huge mistake.

Without understanding how to attack the problem, I started using the same data structures I had used for Dijkstra’s algorithm with some awful workarounds. After too many hours debugging this hack, I finally had the insight that I needed to make a simple change to the data structure I was previously using.  If I would have decided to take some time to do this before diving into the code, I would have saved myself a lot of frustration.  

There is a significant difference between debugging and reimplementing on the fly. It is not possible to successfully debug an incomplete solution.

Following CS106B I began taking Intro to AI, which taught me that AI requires a great deal of probability theory. And that probability theory is hard.  To be clear, the calculations aren’t very difficult per se.  In fact, most of the implementation only required arithmetic (some of the derivations required calculus).  However, knowing how to implement them was quite difficult.  I have saved the programming assignments from the lecture version of the course and began work on the first one, but haven’t decided if I am going to dive into those. haven’t done them a few months after finishing the course.

In fact, I’m in the middle of deciding what to do next.  The trouble with the AI assignments is that they are going to be quite time consuming, and while I don’t necessarily have a problem with doing difficult coding work just for the experience (see above), I am debating if maybe I should spend time on something I’m a bit more likely to use in the near future, or is at least a bit more universal in its application.

I was considering taking Stanford’s Algorithms course, (set to begin in January but only started recently),  Building a Search Engine, or Programming Paradigms (CS107, a followup to CS106B). After some serious soul searching and few coin flips, I’ve decided I want to finish the Stanford Engineering Everywhere Computer Science offerings and take CS107. I plan to start early next month.

I’m also hoping to post my completed graph assignment described above using Google Chrome’s Native Client.

Google Analytics with WordPress

After several WordPress updates and some lost Analytics data, I have come to a conclusion: Get a plugin for Google Analytics to use with WordPress.   Before realizing that there was a simple plugin, I was placing the Analytics code on my site manually.  On at least two occasions, I upgraded WordPress and forgot to reinsert the code losing a week or so of Analytics data each time.  Now this isn’t vital for me, but the simplicity of the plugin is great.

I use Analytics with WordPress.  Some may prefer another option, but I haven’t had any trouble with this one through a few upgrades, so I feel comfortable recommending it.

The Difference between Sleep(), Wait(), and Pause()

I haven’t written in a while about the Stanford CS106B course I’ve been working through because I wanted to have some measurable progress behind me before discussing it again.  Recently, I completed the fourth asssignment, making a single player version of Boggle with a computer opponent.

Although the previous assignment also focused on recursion, this is the first assignment that requires creating recursive algorithms that piece together to form a useful program (read: not just data entry from the user to prove you have an algorithm).  After attacking the more difficult portion of the assignment (the recursive human turn), I decided to attack the easier task of highlighting and unhighlighting  the blocks of a word that is found.  I used the supplied HighlightCube function to, but I ran into trouble when I tried to remove the highlight.  The blocks would simply never highlight.  I tried using both the Windows Sleep() function and the following wait function from here:


void wait ( int seconds )
{
     clock_t endwait;
     endwait = clock () + seconds * CLOCKS_PER_SEC ;
     while (clock() < endwait) {}
}

When both of those produced the same problem, I began looking for a different solution and found someone who had already completed the project.  I tracked down the relevant code section and found the use of the function Pause().  This worked, but I wasn’t satisfied without knowing why it worked where the others didn’t.

The best place I could think of to ask was on Stack Overflow.  I got an answer, and even a bit of rep for asking.  It turns out the graphics buffer writing is a low priority message and the sleep/wait function pushes both the writing and clearing of the graphics to after the wait/sleep.  The difference between the sleep and the wait is that the sleep function halts a thread for a given time whereas the wait function checks the clock repeatedly until the time has elapsed (costing CPU cycles and power). So Stack Overflow taught me why the wait and sleep functions didn’t work, but I still wanted to know what the Pause function was doing to clear the highlights correctly (and so did a few of the commenters on SO).  After some searching through the CS106B supplied libraries, I found that the Pause function was simply a function to pause the graphics buffer (not the entire program).

In this instance, I found two functions that gave me obvious problems.  This made it easy for me to realize I needed another solution.  However, I found some more subtle bugs in my code that were a result of the same flaw I have in my coding style:  I tend to prefer to write code to perform a task without first considering what potential problems the function needs to avoid.

While debugging a separate issue, I noticed that the word SAGS was place vertically, in reverse, along the left hand side of the board, but my program would not recognize it as a valid word.  After tracing through my recursive algorithm (and realizing that it was correct), I found that the program was failing because it was only testing the first letter of the word the first time it found it.  Soon after solving this, I realized that my algorithm did not account for users entering words with a block used more than once.  Instantiating a second grid of bools to check if a letter was already used was easy enough, but seeing these three errors really drove home the need for a better approach to algorithm design.

Warning:  coding buzzwords

I’d like to think I’m using ‘best’ practices when it comes to coding, but I tend to err on the side of being a bit too Agile.  What I mean by this is that instead of writing specifications for a method/function/algorithm/etc., I tend to consider some aspects of it and get right into coding and compiling.  I love to see the result and have something to work with rather than planning for too long for the perfect function (that will likely need debugged anyway).  However, in cases such as those described above, not considering the possible weaknesses with an algorithm led me to overlook some fundamental problems that I may not have noticed if not for seeing the errors pop up by chance on the board.

This project has given me a practical example demonstrating why Test Driven Development is a widely used process.  It is much easier to ask hard questions of a function that doesn’t exist than one that is ‘working’.

Backup/Restore and Why You Need an SSD

If you value your time and access your hard drive more than once per day (if you follow this blog, I can almost guarantee that you do), you should get a Solid State Drive (SSD).  For convincing arguments see here and here and here.  For more in depth analysis of SSDs see anandtach.com’s SSD Anthology and Relapse.  In my scientific tests (not scientific at all), I have found that everything from starting a game to starting Unity to starting Windows is about twice as fast with an SSD.  My laptop is also significantly quieter and uses less power thanks to the lack of moving parts in the SSD versus a traditional hard drive.

On top of the time and power saving, I’ve noticed  that Windows 7 has no problems hibernating and waking anymore.  Previously, hibernating could take up to a few minutes (which I don’t always have when leaving the office to catch the bus).  More frustrating are times when I thought the laptop had shut down or hibernated properly only to find out upon restarting/waking that it had crashed while doing so.  With the improved times for the SSD, I haven’t experienced these problems yet.

Now that you’ve bought the drive, you presumably want to put your current backup onto it right?  You do have a backup don’t you?  Even though I had a backup, I found that restoring that backup was a lot more work than I anticipated (in fact, I gave up and went with a new install).  After doing some reading on the problems I was having, it looks like the problem comes from the size of the old HDD being larger than the SDD (see here).  I can’t say for sure if the solutions offered there work as my HDD has an additional wrinkle:  It has 15GB of unallocated space at the front of the drive.  I tried every way I could think of to get the drive to fit onto my new SSD (120GB), but I couldn’t.

This got me thinking ‘What if I wasn’t moving to a SSD, but my HDD failed and I needed to get back up and running?’  I realized there are two problems that need to be addressed in that situation:

1.  Do I have  a back up that I can quickly and easily restore?

2.  If not, what about that data that I just can’t afford to lose?

For question 1, I am now working on getting all of the important programs that I need installed so that I can make a reasonably sized back up with the programs I absolutely need to get back up and running.  For question 2, my solution is Dropbox, which I’ve written about before.  I’m not saying that using Dropbox is necessary, but you should seriously consider what happens to that data in the worst circumstances.  If you are simply using an external hard drive, what happens if both get destroyed (fire, theft, etc.)?  There are plenty of other cloud based file systems to choose from, and I recommend using one of them for your most important files.

In my previous post, I recounted the frustrating experience of having to redo some of my own work due to a lack of foresight in my file management.  Luckily, in all but world ending scenarios, my data should be recoverable from at least one location so that even if my backup doesn’t restore and my hard drive fails, I will lose, at most, a few hours from reinstalling Windows and some programs.

My recommendations for the day:

1.  If you access your hard drive frequently (if you use a laptop, edit images, open files in Visual Studio or another IDE, etc.), you should get a SSD.  They have been going on sale recently and the new updates due out early this year should lower prices as they are based on a more efficient process.

2.  Make sure you have not only a backup, but one that can be easily restored.  Check your Hard Drive for any unallocated space on the drive (you can do this with Linux System Rescue).

3.  In case something does go wrong with your backup or restoration, ensure that your most important files are backed up some other way, preferably with an automated system like Dropbox.

Unity and Dropbox and popuplist and Dialogue, Oh my.

Over the past few weeks, when I’ve been able to work in Unity, I’ve found myself using (and modifying) some open source code.  I’d like to share what I’ve done here so others can use the (limited) functionality I’ve added.

Using a Dropdown in Unity

PopupList is a bit of code that easily allows a user to make a drop-down in a Unity GUI.  One thing I don’t like about this code is that it requires the user to click and hold down the mouse button, move to the menu item you want selected, then release.  I much prefer the user to be able to click (down, then up) see the choices, then click again.  I’ve added this functionality by putting in a simple counter that only works when the user clicks within the space of the drop-down menu.

You can use the link above to see the source code.  I used Popup.cs, not the updated version.

[...] indicates verbose sections I removed that I did not edit.

using UnityEngine;

public class Popup
{
    static int popupListHash = "PopupList".GetHashCode();
    static int count = 0;

[...]

        switch (Event.current.GetTypeForControl(controlID))
        {
            case EventType.mouseDown:
                if (position.Contains(Event.current.mousePosition))
                {
                    showList = true;        
                }      
                break;
            case EventType.mouseUp:
                if (count == 1)
                {
                    if (showList)
                    {
                        if (position.Contains(Event.current.mousePosition))
                        {
                            GUIUtility.hotControl = controlID;
                        }
                        done = true;
                    }
                    count = 0;
                    break;
                }
                if (position.Contains(Event.current.mousePosition))
                {
                    count = 1;
                }
                break;
        }

        [...]

    }
}

Sidebar: I should mention that I am documenting this because I recently had to redo this work when I broke my project. I made the mistake of having the project in my auto-updating Dropbox with no recent backups and it updated before I could revert back within Unity . The irony is that this happened because I really wanted to test something from home, and I opened the project in an old version of Unity.

Free Dialogue!

A fellow blogger and Unity user over at kimmonsdesign has created an open source dialogue editor for use in the Unity Inspector/Editor.  The implementation is great, but I wanted a way to have the dialogue open and close when I click on specific characters in my game.  If you want to see the discussion we had about how to implement it, you can do so in the comments of the previous link.  I also wanted to post the wrapper code I’ve created here.  There may be a better way to do it, and I’ll be sure to update later if I make changes, but here it is:


var clickTarget: String;

function Start () {
var d : DialogueInstance = gameObject.GetComponent(DialogueInstance);
if (d) d.enabled = false;
}


function OnMouseOver () {
    if (Input.GetButtonDown ("Fire1")) {
		var npc = GameObject.Find(clickTarget);
		var dialogueScript = npc.GetComponent(DialogueInstance);
//		var dialogueScript = GameObject.Find("Sphere").GetComponent("DialogueInstance");
		dialogueScript.enabled = !dialogueScript.enabled;	
    }
}

Yep, that code was back when I was getting used to Unity and still using Javascript.

First time posting code!

How to post code in WordPress:  I searched and found this link suggesting different ways to place code in WordPress.  I chose SyntaxHighlighter Plus which you can see in this post. Caveat: make sure to be in HTML mode not visual or it will destroy formatting by getting rid of tabs.

http://kimmonsdesign.com/node/21has

Evernote 2.0

In my previous post on Evernote, I discussed it’s value for simple note taking.

Since that post, Evernote has released a comprehensive update of their mobile application which is significantly improved.  The new interface changes it from a simple note taking app to a mobile version of the full app.  Admittedly, I am not a power user of this software, but I haven’t found anything that I can’t do on the mobile version that I do on the desktop. For taking, searching, and viewing your notes, the mobile app is now just as good for me as the full version.  In fact, for note taking at the Unite conference , I took notes on my phone for almost every session simply so I didn’t have to fire up my laptop each time.

One of the best functions of the mobile app is the ability to snap pictures with a smart phone and keeping it as a note (whole or part).  I like to write notes when I’m listening to a talk, but some slides just have too much code that I’d rather just see as a whole later.  Evernote’s mobile version has a button explicitly for this purpose.  I can take the picture, place it right in line with  the notes, and get right back to taking notes.

In addition to note taking, I have begun using Evernote for lists as well.  The two that I reference the most often are a list of games I want to play (AKA my backlog), as well as a list of links I want to read on various subjects.  The latter is incredibly helpful to me.  Without it, I tend to end up with a ridiculous number of tabs open and end up not reading some of the more in depth articles.  Now, I have a go to list of articles to read if I’m waiting around somewhere or if I actually make it through the open tabs on my computer at the time.

Additionally, I’ve been using Evernote to keep my notes on CS106B (update coming soon) all in one place.  I like this far more than a physical notebook as I just need to click through the notes, and I am able to add more notes (for example, the code on the website for that lecture) and reorganize after I’ve written them.

Finally, I plan to start using it to track my major electronics purchases so I don’t need to worry about where i placed receipts. I can simply take a picture of the receipt and search for it later.

If you haven’t started using it yet, you can find the desktop client here.

Any ways you’re using Evernote that I’m not?

Unite 2010

In the Spring of this year, I was using Torque Game Builder for my game development.  I began to realize that the documentation and community weren’t as helpful as they could be and began looking for alternatives.  After some consideration, I settled on Unity3d because it seemed to have an active community and solid documentation.  After attending the company’s annual conference I can say it seems as though the community is only getting bigger and more involved and the platform is only going to improve.

Unite 2010 took place in Montreal, Quebec, Canada.  The following are some notes about the conference.

Venue and Logistics

The conference was held at the Marche Bonsecours, which was a great location.  The only problems with it (and the logistics of the conference) were with seating, both at lunch and during some of the advanced sessions.  In both instances, I found myself at least once sitting on the floor.   Hopefully, this was a result of the 2010 conference being more than twice the size of the 2009 version and will be fixed for next year wherever the conference is held.

Both breakfast and lunch were provided at the venue during the conference which made networking a bit easier.  Without the option to stick around the venue for meals, it is easy to end up with a small group to eat with and not meet as many people during breaks.  I met several people as a result of hanging around the Marche Bonsecours at lunch and breakfast.  In addition to these times, there was a short break between the afternoon sessions.  Before arriving, I thought these might be boring as I would be sitting around waiting for the next talk to start (checking Twitter or doing something else just as productive…).  However, I found that these times offered me a chance to relax, prepare for the next talk, and discuss either the previous or upcoming talk with fellow developers.

Sessions and Hands-on

I won’t talk about the individual sessions (they should be available at Unity3d.com soon), but overall, the talks were quite informative and at an appropriate level for me.  Some of the more experienced developers at the conference indicated they would have liked more depth in the advanced talks, but for me, the advanced talks gave me some ideas about how to tackle current problems and shed some light on topics I hadn’t considered before the conference.

One of the other main attractions of the Unite conference is the hands on time attendees are able to get with the creators and developers of the Unity software.  For me, this alone was worth the registration cost of the conference.  What made this truly worthwhile was the enthusiasm the developers had while helping me.  Despite my inexperience (I’ve only been working with Unity for about 6 months, 3 of those part time), I never felt like a question was too simple or easy to solve for those helping out.  When we ran out of time fixing a particular problem on day one, the developers made sure to book me some additional time on the second day to finish finding a solution.

Unity in the future

In addition to the growth of the Unite conference year over year, the attitudes of the Unity employees I met and heard speak at the conference gives me confidence that Unity will continue to improve rapidly.  It was evident through several of the sessions that despite the recent improvements to the engine, those at Unity realize that there are a great number of additional features and fixes that can make Unity even better.  Critically, the company seems to be taking input from the community of users seriously in considering which of these should be tackled first.

After this experience, I’m already looking forward to Unite 2011.

Google Listening to Podcasts

I listen to roughly 1 hour of podcasts on a given day.   I do the majority of my listening on the move, so I need a player that I can carry with me.  For about the last year, the device I preferred was my iPod mini modified to hold a 32GB compact flash drive.  Recently, I realized my phone could serve this function, so I decided to look into apps that would allow me to keep podcasts up to date with the same amount (or less) work than I was doing with my iPod.  That is, anything more than plugging and unplugging my phone into my PC (after setting up the RSS feeds, of course) would be too much work.  I came up with Google Listen, doubleTwist, and winamp as possible contenders.

Google Listen

Listen has a great looking interface.  From the main menu, I can look at recently listened to podcasts, see popular searches (neither of which I use), view  all of my subscriptions and each episode from them whether I have downloaded them or not.  Finally, I can also view ‘My Listen Items’ which shows a queue that I can set up and ‘Fresh Items’.  I like fresh items because it shows each of the newest episodes from my subscriptions.  However, it only holds the latest item, so if a new episode of a given podcast pops up before you listened to the previous one, you are left with only the newest one in your fresh items list.  It also only holds the newest items from the last 7 days, so podcasts you don’t get around to disappear.  I don’t so much have a problem with these two features as I do with the fact that they aren’t customizable options.  Ideally, I would like to customize them per podcast so that for some podcasts, multiple episodes stick around and for more than 7 days because I don’t want to miss an episode.

As a player, Listen does a reasonably good job, but some minor bugs keep it from being great.  First, I have problems with the fast forward and jump to a specific time functions.  This seems to happen only if I try this on a file that wasn’t fully downloaded when I began listening to it.  Even though the podcast shows as fully downloaded, if I use either function, it will jump back to the beginning of the file rendering those functions useless.  Another minor annoyance in time keeping is trying to listen to several podcasts without finishing them.  Listen seems to only be able to keep track of where I am in one podcast at a time.  Sometimes, it fails to even do that.  I have opened Listen expecting it to be in the middle of a podcast that I was just listening to, only to find that it is at the beginning of another podcast I have not yet begun listening to*.  Maybe it’s trying to tell me something?

When it comes to setting up your Listen subscriptions, I highly recommend simply doing it from your Google Reader account.  Searching from within the app on my phone to find subscriptions is awful.  I couldn’t find 4 out of the first 5 podcasts I searched for.  The easiest way to go about it is finding one podcast on the app (to get it to automatically set up the listen folder in Google Reader), then going to google reader on a PC and searching/adding the subscriptions to the ‘Listen Subscriptions’ folder.  If you are moving over from iTunes, you can right click the icon for a given podcast and copy its URL to Google Reader for easy transfer.  I actually was forced to do this for the ESPN Soccernet podcast as I couldn’t get its regular RSS feed to work.  A note on getting RSS feeds from websites:  make sure you check the RSS feed you add for audio embedded in the posts.  If it doesn’t have it, it isn’t the feed you want.

Listen allows for adequate customization when it comes to how and when the user downloads podcasts.  Two major concerns for phone users (depending on your phone and carrier) are battery life and data usage.  To address these, Listen has settings to only download on wifi and only download while charging.  If you have either of these set (or both), but you want to quickly download an episode on the go, Listen provides a pop up warning that allows you to go ahead and download over the air.

I’ve noticed another problem when trying to download over 3G and listening immediately (in addition to the time keeping issues mentioned above).  First, when a podcast encounters an error in downloading, it notifies me.  Great. But if I want to listen to that podcast I go through the following steps:

1.  Click listen

2.  Let it buffer, get error

3.  Click listen again, have it load

This happens nearly every time I try to download and listen to a podcast.  Clearly, there needs to be something in the code checking for enough of a buffer before the file starts playing.

Finally, the biggest problem I’ve had with Listen is podcasts randomly pausing and unpausing for <1 sec.  These sound like a CD skipping, but it doesn’t skip the time for which it is paused.  That is, if it ‘skips’ in the middle of someone saying ‘annoying’ I will hear annoy *pause* -ing.  This is incredibly frustrating when it occurs repeatedly, which it does.  So far, I have noticed it only seems to do this when I am walking around.  The pausing as opposed to an actual skip leads me to believe it is a problem with the software and not my headphones or some other hardware issue.  I have seen the pause problem occurs for other users as well.

Note:  After researching this, I have stopped carrying my phone in my pocket while listening and it seems to have alleviated the problem.

doubleTwist

doubleTwist is an iTunes clone for Android devices.  It has both an Android and PC client similar to the Mac/PC and iPod setup for iTunes.  Simply put, it is a great idea without enough functionality to warrant a recommendation.  Some of the issues I encountered in the short time I used it:

Has problems with devices that have internal storage as well as an SD card (i.e. my Droid Incredible).  The user has to ‘trick’ it into recognizing one over the other.

No ability to rearrange podcasts in alphabetical or any other sort order; they are ordered by when the subscription was added.

I had no problems syncing just the playlists I wanted (Podcasts + songs).  However, it does not show me how much memory those playlists will take up, only how much is currently free.  I had to go to iTunes and look up how much space each list took up and approximate.

Slllooooooooowwww loading up when I restart the PC client.  If you use doubleTwist, be sure to turn off ‘scan iTunes on startup’ to save some time (still slow sometimes with this off).

Finally, I had a problem playing a particular podcast for no reason I could discern.

Winamp (5.59 Beta)

Similar to doubleTwist, this has some great features, but isn’t ready for use.  To be fair, this is a beta, and performs as such.

When you fire up the Android client for the first time, make sure to hit continue.  If you hit ‘home’ (like I did for the first several times I opened it) it will ‘whip the llamas ass’ every time you start up.  I encountered the following problems in trying to use it:

I can’t seem to send playlists to the phone or create playlists from the phone app.  I have to us the PC app ti send files to the phone then create playlists on my phone from the PC app.

I can’t figure out how to use phone storage as opposed to sd card.

After playing around with this program, there are just too many problems right now.  If they can integrate the features people are asking for, this could be what I want.

Conclusion

Currently, I am using Google Listen on my phone and iTunes on my PC when I listen at home.  My dream app would be itunes/ipod functionality for Android with wireless syncing at home.  Hopefully, Google, doubleTwist, Winamp, or someone else can come up with a competent software package to do this soon.

Have any of you found any other podcast programs with great features on Android?

*See comment below for ‘solution’

TEDxPSU

Where Good Ideas Come From by Steven Johnson.  This video is in the style of RSA Animate videos, though it doesn’t seem to be from them.  I encourage you to check out the RSA Animate videos as well.  The ones I’ve seen have all been well done and thought provoking.

This video discusses the reason I attended TEDxPSU:  to hear interesting ideas that might provide some inspiration.  Although I didn’t anticipate hearing any ideas directly relating to my work (though I did), simply hearing unique ideas expands the way we think about problems in general.  No matter what your field, this is beneficial.

It would be a disservice to the speakers for me to simply summarize their talks.  The TEDxPSU link above will send you to the home page of the event which has all of the live talks in a playlist.

I’d like to briefly praise the organizers at Penn State.  At the event, it was announced that another major university took three times as long and significantly more money to put on a similar event.  The individuals that put on an event of this caliber in only 6 months deserve more praise than I can offer here.

The people in charge of the original TED conference allow the use of the TED name for TEDx events like this one with one requirement: the organizers must present videos of previous TED and TEDx presenters.  Luckily for me, I had only seen 2 of the shorter videos presented.  However, I imagine if I would have previously seen the longer videos (of which there were 4 totaling over an hour), I would have been significantly less positive about the event as a whole.  That being said, I must again point out the excellent work done by the organizers to balance the presentations of all types.  There were a few presentations that were less intense (whether musical performances or just less dense talks), and they were well placed to break up the brain power required for some of the more dense talks.

If you have the opportunity to attend an event like this, you owe it to yourself to do so.  Even if the talks don’t apply directly to your work or interests, the range of topics is sure to get you thinking about problems in new ways.