Wednesday, October 22, 2008

Android is now open source

Android is now available as open source. Check this site for more details.

It's worth nothing that, at the moment, Windows is not supported, while both Linux (Ubuntu) and Mac OS (running on Intel x86) are.

Monday, October 20, 2008

Red rose from my parents' garden


Sunday, October 12, 2008

youtube-leecher

Here we go! youtube-leecher has just landed on SourceForge and now it's available for download here.

But what's youtube-leecher actually? Well, youtube-leecher is a simple yet powerful Ruby program to download all YouTube videos found inside video containers.

So now what's a "video container"?
From youtube-leecher perspective, a video container can be basically a HTML page or a text file that contain references to YouTube videos.

Now, let's imagine you are surfing the Net and then you come up to a page that contains a lot of YouTube videos you are interested in. Let's say the page you are visiting is a video container. Now what if you need to download them all?

I know there are a lot of YouTube video downloaders all around, but in situations like those described above, well... downloading each video separately can be just time-consuming. So here started my work.

The idea was to have a tool that, given a list of video containers, could display the basic info about each video found and then proceed to download. Therefore, I developed youtube-leecher, devoting some hours of spare time to it. I worked on it mainly during the night, from 10pm to 2am, when a lot of silence boosts my focusing. After about a week, the first promising results came out.

It was an interesting experience for some reasons I'm going to tell you: first off, Ruby. Ruby is a concise and powerful language. It's funny to solve problems using it. It gives you... excitement.
Another reason that caught me was I discovered the way to download a YouTube video, given its ID. (If you don't know it, downloading a YouTube video is not just a matter of right-clicking on it and choosing the option "save as", like for an image).
Finally, I found the way to query YouTube using Data API to obtain basic info about a video. Now it's the time to share these info with you.

Let's start from downloading a YouTube video.

Just suppose you want to download a video whose ID is video_id. Firstly, you need to access to the web page that allows you to watch the video. This page corresponds to URL:
http://www.youtube.com/watch?v=video_id
Then you have to look inside the Javascript code of that page searching for the definition of object swfArgs (var swfArgs = ...). As you will see, this object has several members. The most important for our purposes are: l, sk, fmt_map, t. Take notice of the value assigned to each of them inside the Javascript object definition statement. (In the following, we will refer to them in boldface). To download the video, all you need to do is calling a URL composed this way:
http://www.youtube.com/get_video?video_id=video_id&l=l&sk=sk&fmt_map=fmt_map&t=t
If a parameter value is set to null, just don't express the corresponding pair parameter name=parameter value inside the URL: so, if for instance fmt_map is null, don't write the part fmt_map=fmt_map.

Note that the aforementioned URL allows you to get a video in flv (Flash) format. Sometimes the mp4 version of it is available too. Currently the program doesn't allow you to download videos in this format, but just for your information, to get a video as mp4 (when available) just append to URL the parameter fmt=18.

What about getting info on a specified YouTube video?

It’s very easy: given a video whose id is
video_id, just call the following URL:
http://gdata.youtube.com/feeds/api/videos?vq=video_id

As the reference documentation for Data API says, this URL will provide you with a RSS that contains all the info about videos that satisfy the query condition (in our case just a video: the one with with id = video_id)

Beware of videos whose ids start with the character – (dash). Calling the previous URL as stated before doesn’t work. To have info about these videos, you have to call the Data API URL without providing the first character (the dash).

Now... what's about the program?

Let's imagine you have downloaded it right now and you want to get all YouTube videos from http://www.xy.com. All you need to do is writing:
youtube-leecher http://www.xy.com
Of course, you can specify several options, such as the directory where to place downloaded videos, or the video naming, just to name a few.

... I don't want to bore you anymore. If you are interested in, you'll find all these info inside the full package.

Saturday, October 11, 2008

It is not enough for code to work

In my remaining spare time, I'm reading the book Clean Code by Robert C. Martin.

At the end of chapter 14, the
Conclusion states:

"
It is not enough for code to work. Code that works is often badly broken. Programmers who satisfy themselves with merely working code are behaving unprofessionally. They may fear that they don’t have time to improve the structure and design of their code, but I disagree. Nothing has a more profound and long-term degrading effect upon a development project than bad code. Bad schedules can be redone, bad requirements can be redesigned. Bad team dynamics can be repaired. But bad code rots and ferments, becoming an inexorable weight that drags the team down"

It happens that some programmers are motivated only by money and aren't really interested in doing a good job. As a result, these people are a kind of cancer for every project they work on: everytime they solve problems in quick and dirty ways, producing a lot crap and hiding themselves behind a lot of excuses. The truth is they are just
unprofessional.

Also, it happens that some project leaders are just ignoring these aspects and focusing mostly on evident short-term results, because only here and now count for them, as they are only interested to get a good appearance now: they don't solve problems really, they just paint a thin technological layer over problems and delude people with good-looking masquerades. As the time goes on, their projects become messes and they reveal themselves either
blind or unprepared at all, trying to carry on, day by day, without facing problems seriously.

Personal considerations aside... Clean Code is a must-read-book for all programmers and project leaders who want to invest in their professionality .

Javascript frameworks: Microsoft's and Nokia's choice

Ther's a lot of Javascript frameworks out there: Prototype, script.aculo.us, Dojo, YUI, Ext, Pi, MooTools, jQuery just to name a few.

I personally don't have any preference about them, but it's clearly an important signal the choice Microsoft and Nokia did recently: JQuery.

It's worth remembering that jQuery is not the only sponsored js framework: previously, IBM, Sun and Bea expressed their preference for Dojo, as you can see looking at the sponsor and partner mention in Dojo Foundation info page.

Xebia Web Framework Contest

What's the best Web Framework for developing RIA applications?

That's the question people at Xebia France tried to answer through their contest

Competitors were:
  • Flex 3
  • Silverlight beta 2
  • Google GWT
  • Echo 3
  • Java FX
The clear winner was Flex 3. It's worth noting that at the moment Java FX is still immature.

Tuesday, September 30, 2008

puts "Hello world"

Hello everybody from the magical world of Ruby: that's at least the meaning of the title...

Guess what? I'm learning Ruby in my spare time and I'm having a lot of fun. Well, I find this language concise, fascinating and powerful. So I strongly suggest every programmer that codes for fun (just like me) to give it a try. See the official website for more information.

For those of you who are guessing why I came to Ruby, I have two answers. The first is funny: after watching Giles Bowkett's fantastic presentation on his project Archeopterix, I was curious about the language he used for that project. The second is more serious: I'd like to experiment all the power of Ruby on Rails, a framework for developing web applications quicky. (As you probably know, I come from J2EE). So, before learning Rails, I need to understand Ruby.

Yesterday night I was trying to do a program in Ruby that given a URL or a file finds all the Youtube videos referenced inside it. After getting these information, I then added some logic to download them automatically. BTW I learned a lot of things about downloading a video from Youtube, given his ID. Also I used Youtube Data API in order to get some info about each video.

I will post it soon. Stay tuned!

Wednesday, November 29, 2006

Conversion from ANSI to OEM

Why do I need to address this issue? I will actually answer you with a question: do you never used SQL Server?

Yes, I mean Microsoft SQL Server: wonderful DBMS, isn't it? Well... joking apart (!), if you ever used SQL Server you noticed that while ISQL (the interactive SQL client) uses a Windows charset (i.e. ANSI), OSQL (the DOS counterpart) uses a DOS charset (i.e. OEM). This fact is not irrelevant in some circumstances.

Normally, developers test SQL statements interactively through ISQL, then, as statements are ok, they save their work in .sql files. As these SQL statements are released, it's common to execute them through a batch script, so using OSQL. The switch from ISQL to OSQL causes these statements to introduce in database values different than the expected ones.

I'm italian and in my language accents are important. So, obviously, "città" (i.e. town) is different form "citt..." (a nonsense in italian). Why am I saying this? Because if you saved in ISQL a script like the following: INSERT INTO TABLE_1 VALUES ("città") and then you executed it with OSQL, SQL Server will have recorded the value "citt..." instead of "città". ...Welcome to SQL Server's idiosyncrasies.

The fact is accents are coded differently between ANSI charset and OEM charset. Here comes the bad surprise.

Probably Microsoft didn't pay enough attention to this issue: after all we italians are a little minority in the computer realm and accents are not so common in SQL scripts. But for some of us italians (and for me in particular) this point is really important. Therefore, I took the decision to develop a little Java utility that converts text files from ANSI charset to OEM charset and vice versa.

Doing this task in Java is pretty easy. In fact, if you want to read a file using ANSI charset, you simply need to define an InputStreamReader object with code page 1252, while if you want to read a file with OEM charset the code page must be 850. Similarly, for writing a file using ANSI charset, an OutputStreamReader object with code page 1252 must be instantiated.

And so, after spending a pleasant evening with NetBeans, I came out with CharsetConverter! Now, let me introduce it.

CharsetConverter is an open-source command-line utility that accepts these parameters: <conversion type> <file>|<directory of files>

  • <conversion type> can be: ansi_to_oem or oem_to_ansi

  • <file> is the fully qualified pathname of a file to convert

  • <directory of files> can be either a directory name or a directory name followed by a file extension, thus meaning all the files with that extension inside the given directory.
For instance:
  • CharsetConverter ansi_to_oem c:\mssql\scripts\mydml.sql
    calls CharsetConverter for translating from ANSI to OEM the file called mydml.sql inside directory C:\mssql\scripts
  • CharsetConverter oem_to_ansi c:\mssql\scripts sql
    invokes CharsetConverter for translating from OEM to ANSI all files with extension sql inside directory C:\mssql\scripts.
Here you can download it.