Monday, 11 January 2010

rTorrent is here!

I've been playing around with my router for a long time, and it's been "upgraded" with a ton of cool new stuff already since I bought it. External antenna, open linux firmware, dedicated application storage and swap drive, external storage. With a USB hub plugged in I managed to even share an old printer across the network, and add a network-shared 1TB hard drive!

The next thing that I wanted to do was: torrents!

I have heard of people installing torrent apps on routers before, and with the storage attached directly to the router (and my laptop's HDD being completely filled up) I decided to give it a try.

I won't describe how I set it up, and configured it. There are tons of tutorials on how to do this on the net already, and I followed tips from the http://wl500g.info forums. The end solution that I have set up right now looks like this:

  • rTorrent installed and running off the router's dedicated external flash drive.
  • lighttpd + php set up and running, with the ruTorrent WebUI sitting on top.
  • The web UI is controlling rTorrent using XMLRPC.
  • Torrents are stored on a dedicated torrent ext3 partition on the external 1TB drive, and are shared on the network

I guess I spent about 5 hours setting it up (mainly because of my lack of knowledge in linux), but it was SO worth it!

Thursday, 07 January 2010

Extending LINQ selectors with custom expressions

While working with a particularly nasty linq query, I came up with a situation that I've been in a number of times already, since I started working with Linq 2 SQL, and I'm sure so have a lot of other people.

Basically, the query was using a filter that was based on multiple columns in a couple of different tables. This is of course easily done with linq, but what I wanted to do was to store this filter in a shared class, so that I can reuse it in multiple places. The problem is - if you try to use a method, an extension method or a custom property with this logic inside, linq will just throw an exception:

Method 'Boolean IsComplete(Linq.Product)' has no supported translation to SQL

I have tried to find workarounds on multiple occasions, and at some point I have found a solution that could be used in a filter: instead of using a method, or a property, I could use an Expression tree. It can be passed in a Where extension method, and it will be parsed by the Linq 2 SQL provider, and translated to SQL, if it's possible. E.g.:

public static Expression<Func<User, bool>> IsActive = u => u.IsActive && !u.IsDeleted;

This has worked fine until I needed something different: at some point I had to get this property in a selector, not a filter. Because the value had to be assigned to a property in a complex object, I couldn't just assign the expression to the Boolean field. Trying to .Compile() and .Invoke() the expression didn't help either, as I was greeted with more exceptions.

(Read More)

Monday, 28 December 2009

Coming soon: new engine

The main reason I've bought this domain was to build a website of my own, to be able to "promote" what I can do, and just have a good place to experiment, build, plan and learn.

Originally the idea was to have a simple site with a collection of various experiments, addons, code snippets, and have it backed up by this blog. After some pondering and looking around, I realised I wasn't satisfied with blogger at all. Also, I actually wanted to make something... bigger, I suppose

So my current plans are to build a simple (at first) CMS / blog system. It will replace this blog, once it's finished, and will provide me with a good foundation for whatever I'll have in mind. Also, I'll get a chance to build a project on my own terms, with me being able to make all the decisions as I see fit, not restricted by anyone else or any deadlines (except the ones I set for myself).

The plan so far is to use ASP.NET MVC, jQuery and MS SQL. I'm not sure about any time frames yet, as I don't want to rush it, but I know one thing for sure: I'm going to enjoy it :)

Tuesday, 15 December 2009

Updates

After a very long delay, I'm finally back here. Unfortunately I didn't have almost any free time on my hands, and this really did a thing on my schedule. With all the stuff happening IRL I completely forgot about this blog, or any updates that I wanted to write here.

So this time, I hope I'm back for real. I'm going to put more effort into it, and try to keep posting whenever I have something new to share.

I have finally purchased a domain, so the blog now has a shiny new url! I'll also try to get some kind of design for it as well, as I'm not that happy with the default one, but I don't promise anything outstanding. Sometimes I wish I were a designer, but I know I'm not going to switch for sure. Programming's just too good for me.

Tuesday, 25 August 2009

jQuery + TableSorter + QuickSearch = headache?

I know I haven't posted anything in a long while, but it's not because nothing happened or that I didn't have anything new to learn. It's just all in the lack of free time.

Anyway, lately I started using more and more jQuery in my development. And today the issue I stumbled upon is integrating the TableSorter and QuickSearch plugins in a page.

I found Bill Beckelman which explained how it should work, but when I tried to implement it locally, I realised that it's not actually working as expected. After a bit of debugging I realised that the quickSearch onAfter event is fired too early, and actually runs while the table is searched - not after that. Now that's a problem, because checking the number of results and striping wouldn't work well.

After a bit of online search, I didn't found any solution and ended up getting my hands dirty. Surprisingly, the fix wasn't hard at all (thanks to the small size of the js file!). To fix the issue all I had to do is find the qs() function, and move the options.onAfter(); call a couple of lines higher - inside the setTimeout call that actually does all the processing. Hey, that wasn't so hard!

The reason Bill Beckelman's demo works though, is that he uses an older version of the library, where the qs() method didn't use setTimeout.

 

Useful links:

Table Sorter library: http://tablesorter.com/docs/

Quick Search library: http://rikrikrik.com/jquery/quicksearch/

Monday, 01 June 2009

The adventures of system backup

As my parents' system was becoming more and more 'polluted' (read as filled up with junk, random data, more and more running processes and so on) it was running slower and slower, and at times it was a pain just doing something trivial.

Of course, they aren't really advanced in all the techy stuff (or, actually, really aren't advanced) it was up to me to dig up all the data, and throw out the rest..

As that's not my system, I can't be sure that there are no settings, files or any other small things that I can miss, I decided to make a full copy of the first partition, a separate 'actual data' backup, then reinstall the system and restore the data. If we find something missing, I'd restore the partition from the backup, grab the data, and copy it to the system.

I used Acronis True Image in the past, and I found it to be perfect for the task, but I didn't want to use it now for two reasons: 1) I didn't have a licence for it now and 2) for some strange reason I didn't want to use the trial, as it felt "dirty" leaving it on the system to "expire and die" :)

So I started looking for some free alternatives, and of course I have found a couple of solutions.

(Read More)

Monday, 05 May 2008

Validators in Custom Configuration Sections

Today I was extending/cleaning/rewriting my Exception Handling library to take advantage of the new .NET 3.5 features.. It proved to be quite fun, so I started making it more useful, and easy to use.

At some point I decided to change the way I stored all the settings in the configuration file. Before I had my own configuration section, that used the standard AppSettingsSection class. Simple and fast. But it didn't look clean. All the settings were mixed up together etc etc..

So I created a clean new sectionGroup with several sections, collections and so on. When I reached the notification e-mail field, I thought that having a validator would be... A lot better :)

Strangely enough, when I added the RegexStringValidator, the application crashed, telling me my e-mail was not valid againt the regular expression..

(Read More)

The beginning

I'm a C# Developer in London.

I don't consider myself great, and far from perfect, but I had my share of experience in my life, and I have a drive for testing, research, digging up problems and solutions.

That's one of my abilities I dearly like, and one that helped me more than once in my life (especially in programming)

I'd like to sometimes share with everyone some things that I think people would find useful.. And if one of my solutions will help someone, I'd be more than pleased!

So let's start yet another debugging session!

Pages: 1 2