Getting Audiogalaxy running on Ubuntu 11.04

I recently started using Ubuntu as my main OS, and in fact I successfully chmodded something for the first time today, so I’m not exactly an expert. But this was painful so once again, hopefully I’ll save others some time by writing it up.

Audiogalaxy is a platform for streaming your music from a pc to any number of other web-enabled devices (web browsers, smartphones, tablets). It’s not supported for Linux yet, but I found this post encouraging me to try using WINE (WINE Is Not an Emulator, as if that clears anything up :D ). so I gave it a go.

It installed just fine with WINE, but then sat there doing nothing. It didn’t seem to notice any music files that it would be able to stream. I checked that WINE was set up, and indeed the fake Windows filesystem in ~/.wine/drive_c/users/MY_USERNAME/My Music was a symlink (I think!) correctly pointing to my actual music directory (~/Music).

As the post above alludes to, I had to “hack the sqlite”, but I had to take a guess at what that meant. It’s working for me, but use at your own risk. I don’t even know what the “download” column in the appropriate table is for, so if at some point it chooses to overwrite your files with new downloads… let’s just say backups are important. So, that said…

Update: have a screenshot, on the house:
Image Hosted by ImageShack.us
Uploaded with Shutter. Hosted by ImageShack.us. Click to make big.

  1. Close the Audiogalaxy helper, if it’s open.
  2. Open the file ~/.wine/drive_c/users/YOUR_USERNAME_HERE/Local Settings/Application Data/Audiogalaxy/ag.dat with your favourite SQLite browser thing (never having used one before, I picked Sqliteman from the Ubuntu Software Center, which worked just fine).
  3. Find the table called shares_v1, and add a row (the table was initially empty for me, which suggested I’d found the issue!) with the values “C:\users\YOUR_USERNAME_HERE\My Music” in both “path” and “downloads” columns. Commit the change to the database if you haven’t already.
  4. Start the Audiogalaxy helper again.
  5. Hopefully now if you go to Audiogalaxy.com and log in, you’ll see your collection is starting to fill up with music! Play something triumphant and bask in the glory of success. Well, that’s what I did, YMMV.
You can leave questions below, but I’m honestly not sure I’ll be able to help much, being rather a n00b myself. Perhaps your fellow visitors might offer assistance though. I’ll give it a go too :)

, , , , , ,

2 Comments

And introducing: “uninot.es” as “My Final Year Project”

Hurray, I successfully registered a Spanish domain name, which as it turns out is no mean feat. It used to be only Spanish people were allowed to at all, so I guess I should be grateful. But George, you don’t know any Spanish! Que pasa? Well, calm down and I’ll explain.

My new site is http://uninot.es. That’s “uni” as in university, “notes” as in things that you write down, and that last part, “.es”, is short for España, a.k.a. Spain, thus taking the place of the more run-of-the-mill “.co.uk” or “.com”. But that’s not important right now.

Uninot.es will be the web address for my new final year project, which forms a major part of my undergraduate degree programme. I plan to make a site that curates online collaboration sessions, probably taking advantage Google Docs’ existing capabilities, which will be based around university curricula. It will help you connect and share knowledge with your fellow academics, and will help you find the right channels using the places and people you know (read: geo-location and social network integration).

Anyway, check back for more as things progress. Mostly this post is a flag so that Google and co. will pick up the existence of the new site, and work out what it’s about. By the time I get some working stuff up there, search engines should have an idea already of my site and it’ll be easier to gain traction in search results. This is what us nerds like to call Search Engine Optimization. So now you know.

, , , ,

No Comments

Introducing – Settle GCSE Maths Revision

I’ve been working with McKenna Consultants this summer on an iPhone app, and it’s finally been approved by Apple and is available in the App Store now! The game was designed by students Megan Dawson & Sophie Thornton of Settle College, North Yorkshire in order to help their fellow students pass their GSCE Maths exams. I’ve worked on the internals and features of the app, working with an external graphical designer in turning their designs into reality. I hope to hear soon if the app meets our competition-winners’ expectations :)

We used PhoneGap as a way of writing an iOS app without having to know any Objective-C (I still don’t!) and a combination of HTML5 (particularly the new localStorage capability) and Javascript, including a couple of notable libraries (jQuery Mobile for the UI and jQuery original for offsetting some of the unpleasantries of working in Javascript!).

, ,

No Comments

Playing Sounds in Phonegap on iOS

I’ve worked out that iOS is pretty funny about sounds, especially as it turns out Safari makes it very difficult to play them automatically, thus saving on users’ precious data usage plans (never mind the fact that my sound effects are already downloaded onto the device and are smaller than your average jpeg anyway!). It’ll do it in response to a user action, but that’s such a woolly and undefined concept that I had to fiddle around for a while.

I didn’t have any luck using the usual Phonegap methods. Well I did but it only worked when headphones were plugged in, for some reason, and I eventually gave that up as a dead end. It appeared to play the sound, firing onSuccess callbacks and such, but I couldn’t hear anything, thus rather defeating the point of the exercise.

Anyway, here’s an example of what didn’t work for me, followed by one that did. Hope it’ll save you some silly bother.

Doesn’t work:

var myAudio = new Media('sounds/mySoundFile.wav');
myAudio.play();

Works:

<audio src='sounds/mySoundFile.wav' id='sound'>
<button id='myButton' onClick='document.getElementById("sound").play()'>

If like me you prefer jQuery to the monstrosity we like to call raw Javascript, it would appear that inside your click() function you’ll need to use $(‘#sound’)[0].play() rather than $(‘#sound’).play(). I think that’s because then you escape the jQuery-ness and call the DOM’s native play() method on the <audio> element itself, not some set of jQuery-enhanced elements.

So, that was nice and straightforward, thanks Apple!!! In case you can’t tell, I’m being sarcastic :P

 

, , , , ,

2 Comments

20 Things I Think I’ve Learned in 28 Years

It’s my birthday… 28 years ago today I was born. I’ve been through some pretty serious depression, and at times I honestly didn’t expect to outlive Jimi Hendrix or Jim Morrison, of course both of whom died aged 27. I can’t say that without the help of others – friends, family, mental health professionals – I might not have made it. On the other hand, it’s an inconvenient truth that just like everyone else, and probably more so, depressed people have to find ways to seize life and overcome obstacles using an inner strength and positivity where only negativity naturally brews. Some of us never emerge back into the sunshine, and I’m sorry for them, and ever so lucky to have graduated from Depression University. As with any other universities there are many lessons to be learned, and I’d like to share some with you today.

I generally try and keep this more of a professional blog, but with Google+, Twitter and other services continually blurring the line between public and private, and just having listened to the brutally honest unabridged audiobook of Steven Fry’s first autobiography Moab Is My Washpot, here seems as good a place as any to share the following. It’s a work in progress, but I’m trying to delineate some important rules and principles that help me to know what matters and how to handle things. This is unedited straight from my personal notebook. If you find it useful please say so, and if you don’t, please don’t :)

1 learn lessons the hard way. A lot of lessons aren’t worth the air they’re printed on. But don’t confuse that with never learning lessons at all.

2 life is short. That’s not just a figure of speech… It happens to be true. We’re here for a good time, not a long time.

3 we’re not here for any one purpose. There is no possible reason to do anything. Beware any goal whose effects won’t eventually be lost. I’ve yet to find one. an activity may be a good way to pass time, but ultimately all goals are futile, after enough time.

4 the one exception to 3 is love. Love defies reason, love is a reason. The only reason, given all goals are futile. Love is indistinguishable from magic in this regard.

5 we are animals, not computers. We’re imperfect, and prone to many thought processes and feelings we cant even understand ourselves. It’s interesting to try, but don’t expect any more than that.

6 existing is easy.living is a lot harder. Don’t underestimate death, think of it as rest after a long, rewarding but challenging struggle. If you’re lucky.

7 the world as a whole is a heartless, unjust cess pool. Do something about it.

8 harming a person deeply and frequently for a long period is worse than killing them. Seek to end suffering in the world before increasing life-spans. Start with the worst lives imaginable, and when they’re better, move up.

9 relax.

10 never stop learning. Expect to make mistakes in the process. Start with the things you’re awful at. you’ll make the fastest progress with those.

11 recognize the possible negative outcomes of a venture before you start – if something still seems worth doing, you won’t regret it later even if it goes badly.

12 the length of time you’ve put off something is no barometer as to its difficulty

13 just because something is worth starting doesn’t mean it’s worth finishing. Be free to abandon things, or be a senseless slave to them.

14 what makes one person happy might make you very unhappy. That’s why people give out what they think is good advice, but isn’t!

15 life is like Scrabble – you can only play the tiles you’re dealt. Or you can jack them all in and start with a new set, but that comes with its own costs. Keep some useful resources for when you might need them later … but don’t be afraid to use them if you have a good opportunity to make a big score

16 personal independence requires either adapting to everything around you, including possibly no food, shelter or transportation, or having power to change your environment. In this world, that usually means money.

17 “sometimes the past belongs where it is”. That lady off of Boardwalk Empire.

18 given 17, the only reason to regret something is to avoid doing it again, and the only reason to do that is because a) your present or likely future are negatively affected by the past AND b) you are likely to be in a position to repeat the possible mistake. If none of these are the case, then regret is wasteful sentiment, an anchor in a sad sea best left behind.

19 “keep stuff simple as possible, but no simpler!” attributed to Einstein. “K.I.S.S. : keep it simple, stupid!” unknown

20 do more good. Do less bad. Be happier.

, , ,

No Comments

Google+ testing

Testing my new G+ Plus 1 button. Click it to help me:

Cheeky? Moi?

PS: come add me on Google+, it’s like Facebook but not Facebook!

2 Comments

prevPage / nextPage in jQuery Mobile

Quick snippet in case this helps somone, because I’ve been stuck for an unreasonable amount of time on something that should have been straight-forward!

If you’re using the pageshow or pagehide event handling in jQuery mobile, you can find out which ‘pages’ the event is switching between. We can then inspect the object to find out the id of the page. First declare your function with two arguments as such:

function(event, ui) {...}

Now interrogate the passed “ui” variable as such (edit: updated to be much simpler):

$(ui.prevPage).each(function (){alert(this.id)})
ui.prevPage[0].id

I finally worked this out with a bit of reflection. To get more info about the ui.prevPage object, try passing it to this function:

function var_dump(object) {
    for (var member in object) {
        alert('Name: ' + member);
        alert('Value: ' + object[member]);
    }
}

An alternative, and actually what I’d now recommend,  would have been sticking a breakpoint inside the function and examining the “ui” object from your debugger (Firebug, WebKit Developer Tools, etc).

, , ,

No Comments

New GitHub profile

I’ve set up a new GitHub profile, and I’ve been adding to a couple of repositories this week while I’ve had some time off work. I decided to abandon the small project I started, but I did add a new function to a Ruby on Rails plugin I was using, so I’ve submitted a Pull Request to see if the originator would like to reuse my code. Maybe at least something may have come out of it in addition to learning a lot!

Come follow me, I’ll follow you… Social Coding and all that :)

, ,

No Comments

Summer work in Yorkshire wanted!

Update: I’ve now found a placement with Mckenna Consultants in Harrogate, and I start in late June. Couldn’t be more excited – they seem like a very talented bunch, and I think I’m going to learn a lot. I’ll be focusing on ASP.NET/C# and iOS development. Many thanks to Nick, Aaron and Mark for giving me this tremendous opportunity, and I’ll see you all again soon!

I’m currently looking for software/web development work in the Yorkshire, particularly Harrogate, this summer and with a possibility of returning after I graduate. Please see link at end for a copy of my cv. Please forward it to anyone you know who might be able to help! To save you a bit of time, I’ve copied and pasted it here too :)

PERSONAL PROFILE

A flexible and enthusiastic programmer, the top student in his year at Cardiff University in 2009/10, has since gained an additional year’s work experience in the software industry under the E-Skills programme (certificate pending). Works well in a team environment, approaches tasks with drive and a keen ability to learn and take on new challenges. Thrives under pressure and has a talent for self-motivation and working without supervision, whether asked to produce work to strict deadlines or to take on larger, complex problems and create methodical, elegant solutions.

KEY SKILLS

Programming I have experience with many languages and frameworks, including the combined technologies of VB.NET, ASP.NET & MSSQL, with which I have debugged and added to existing code in a business environment, and Java, using which I have created full-scale academic projects. 

I have taken on major projects at various times using web technologies (including PHP, HTML, CSS, JS, SOAP/web services), virtualization/remote working, source control & work item tracking (TFS), Microsoft Dynamics CRM setup and customization, and more.

Teamwork Ever-willing to learn, I am unafraid to ask questions when required, but can also rely upon my own wits to find out answers to my own queries.
A friendly, confident and professional person, I try to bring out the best in those around me, and to learn what “makes them tick”.
Enthusiasm 

& Flexibility

Team leaders have commented on my eagerness and flexibility to tackle new subjects with confidence and to work extra hours whenever needed.
Office skills Presentable and professional, I have excellent communication and office-based skills, and am proficient in Microsoft Office, inc. Outlook.

EMPLOYMENT HISTORY

Date and workplace Job title and duties
June 2010 – present 

Draig Technology Ltd, Bangor, Wales

My software-based roles at Draig have varied greatly, ranging from testing to developing, from user-document editing to technical support. Much of my work has involved MS Dynamics CRM, using it as a front-end for a complex billing system in the competitive energy market. 

I’ve contributed new features to, and fixed bugs in the product, and I’ve worked on live issues, including those with urgent need for resolution. Nominally work experience, the value of my efforts contribution has been rewarded by a raise in salary and an offer of future employment.

Developing my handling of client-facing responsibilities and interpersonal skills, my time at Draig has been inestimably valuable in broadening my horizons and aiding me to pick up a whole new skillset- one I suspect unattainable through academic work alone.

Technical Skills: VB.NET, ASP.NET, VB6, SQL Server, Reporting Services, Dynamics CRM, VirtualBox & VPC, Remote Desktop, web services & RPC
March 2009-May 2009 

Mister Mckees, Hull

Employed to create a website for this independent shoe-repair company in a remote context, I developed strong links with the owner and created a bespoke solution in PHP, HTML and CSS with product catalogue, baked-in “store news” RSS feed and PayPal payment system.
Technical skills: PHP, HTML, CSS, XML, requirements analysis, FTP
2006-2009 

Various, Harrogate, North Yorkshire

During this period I volunteered with local charities, gained work experience at a small computer repair shop, and worked as a store assistant. In my spare time, I continued to work on my own projects, including a database-driven films website created using PHP and MYSQL, which in addition to providing up-to-the-minute television listings also broadcast daily emails and RSS feeds to those with a shared passion for movies. Other projects included browser extensions, publishing my own technical blog to support my ventures (www.georgenixon.co.uk), and two different specialist social-networking sites, one in PHP and one in Ruby-on-Rails, which never reached a wide enough audience to become successful.
Technical skills: Javascript & the DOM, Jaxer, PHP, CSS, MYSQL, Ruby-on-Rails, WordPress

 

EDUCATION

Date and institution Qualifications Grade achieved
2009-2010, Cardiff University On-going (BSc) Direct entry into the second year, leading to the highest average grade in my year (76%). I return to the third year in September, and expect to graduate in May with First Class honours.
2002 – 2005, University  of East Anglia Higher Education Computer Science DipHE (Diploma of Higher Education) awarded for passing two years of a BSc degree course
1995 – 2002, Harrogate Grammar School A Levels Mathematics B, General Studies B, English Language C, Business Studies D
GCSEs 10 subjects grade C or above, including Mathematics A*, English Language A*, English Literature A*

 

REFERENCES

Draig Technology Ltd 

Name: Andrew Bradley

Email: andrew.bradley@draig.co.uk

Phone: 0845 4596152

Address: Draig Technology Ltd., Intec, Parc Menai,

Bangor, Gwynedd, Wales, LL57 4FG

Cardiff University 

Name: Christine Mumford

Email: C.L.Mumford@cs.cardiff.ac.uk

Phone: 02920 875305

Address: Computer Science & Informatics,

Cardiff University, Queen’s Buildings, The Parade, Roath, Cardiff CF24 3AA

Resume – George Nixon 09-04-2011.docx

, ,

No Comments

CRM 4.0: QueueID = {00000000-0000-0000-0000-000000000000}

Took me a few hours to work this one out yesterday, so I thought I’d post it here in case it helps anyone.

I was getting an “generic sql error” from CRM, and when I used the trace program to figure out what was going on, I discovered our software was trying to insert a new CRM activity to a queue that didn’t exist. The QueueID was {00000000-0000-0000-0000-000000000000}, and there was no queue in the database with that ID.

What happened was that the service had looked up its own details with a WhoAmIRequest, and then tried to insert an activity into its own private queue before moving it to a public queue so other users could see the task.

After some digging, I found our Windows service was logged in as the default “Local System” user in Services.msc. When we were running that service on other deployments, the service had its “Log On As” set to a domain user which was mapped in CRM. This was not the case in the current deployment, so as soon as I fixed that, the service started working as expected.

The best course of action here is to set up a generic domain user in Active Directory (called “CRM Service” or similar) and create a User entity in CRM with those domain credentials, and ensure it has the necessary role privileges to carry out the actions you want (or just set it to System Administrator if you’re confident it’s not going to do any damage!). Logging on as a particular user, such as yourself, might cause problems if your password changes, or heaven forbid, you leave the company you’re working for!

Note that the First Name and Last Name you give the service will, by default, show up as the owner of the new activity.

, ,

No Comments