Wednesday, May 19, 2010

Modulo operators with respect to Ruby and Javascript

Recently, I was tasked with creating a calendar which transitioned from month to month such as December to January to February, etc.. Also, I needed to go backward on the transition.

A good way to do this is to use a modulo operator. This means that you can figure out which month is the next month number very easily.

So if the month is December, which is month number 12, to find out which month is next:

month = (month % 12) + 1 or (12 % 12 )+ 1, this will work for any month number from 1 to 12.

BUT to go backwards on the month numbers, here is the operation:

month = ((12+(month-2)) % 12) + 1 ... the funny thing is that this operation does not work in Ruby, but it does in Javascript.


In Ruby, here is the equivalent backward operation:

month = ((month-2) % 12) + 1


What is the difference? Why would there be a difference? I have no idea. It seems like Javascript would generate the right response to -1 % 12, which is -1 because 12 divided by -1 is 0 with -1 left over, but Ruby, Python, Perl, and the Google calculator figure that it should be 11 left over. This may be because a negative remainder would make no sense. So if the modulo is negative, then add it to the second operand to get the real modulo.

Thursday, April 22, 2010

I must speak out on the this one




Recently, while at work, I was discussing why Google maps do not include a scale. In fairness to Google, the maps may have this functionality, but I am ignorant as to how to enable this feature.

My hypothesis as to why there is no scale was a simple one. To accurately determine scale for a map, one would need to consider the topography of land the map covers. Maybe Google just does not want to go to the trouble.

Seems simple enough to me, but to my surprise, the other two parties in the conversation said that topography has nothing to do with scale on this map. Huh?!? I stipulated the point to avoid a nasty argument where more than one person might need to get schooled, Sesame Street style.

Well, I can't take it anymore; time for some schooling. The assertion I am attempting to buttress is that topography (whether there are mountains and valleys on the surface of the earth) matters when applying a scale marker on a map. Google could probably estimate this very accurately since topography overlays are available to them, but who wants to do calculus for such a small thing? Anyway, here is an image which details my explanation.

Monday, April 5, 2010

Installing Rails 3 on Debian Unstable (Sid)

Recently, I was installing Rails3 on my Debian unstable machine and I noticed an error that was really strange.

Here was the error:

ERROR NameError: uninitialized constant ActiveResource::Base

The problem ended up being that I was missing this deb file:

libopenssl-ruby1.8

I have seen posts from people proclaiming that uninstalling old versions of activeresource would do the trick, but I reinstalled activeresource-2.3.5 gem after Rails 3 starting working again without a failure. I hate cryptic errors like that.

Sunday, March 21, 2010

Mac OS X Leopard installing the ruby gem eventmachine

I was having some trouble installing eventmachine (a ruby gem that needs an extension library written in C++) recently in Mac OS X Leopard. I am currently running ruby 1.8.8dev. I think, perhaps, when I compiled ruby from source, the config left out the CXX flags setting. This makes mkmf not know what C++ compiler it needs to set in the Makefiles it creates. Since there are not too many gems that have extensions written in C++ (that I know of), I never really ran into this issue. Here is how to fix this.

Edit this file inside the directory of the gem, in my case;

$ vim /usr/local/lib/ruby/gem/1.8/gem/eventmachine-0.12.11/ext/extconf.rb

Right above the last line (the last line being a call to create_makefile), insert this line:

CONFIG['CXX'] = g++

then do the same thing for this extconf.rb in the fastfilereader dir (or anywhere else in the ext dir where there might be more nested extconf.rb files.

then run this:

cd /usr/local/lib/ruby/gem/1.8/gem/eventmachine-0.12.11; rake gem:install

this should solve the issue of getting errors like this:

make: I.: Command not found
make: dynamic: Command not found

Thursday, February 25, 2010

The Web needs a language

I am now convinced that the Web needs a language of its own. It is not good enough to try and build systems with general purpose computer languages such as Java, C#, Python, or Ruby. Tick, tock, request, response, the collage of technologies that it takes to put together a simple website and backend is a wonderful display of inefficiency. I have seen the future and it is not hacking Javascript or HTML! How many ways can the same Rails app be written doing almost the same thing? Wouldn't it be nice to develop a solution to a problem using one language to express business rules? It seems like the best way to solve this problem is with better tools. New languages are judged on their expressive power, both the computer and human type. Most of the people using the Ruby language, do so because it will be used to generate what is between a couple of html tags.

I hereby propose that a new language be created that inherently knows the semantics of the web leaves us problem solvers with the ability to apply business log simply and directly.

Wednesday, January 6, 2010

PHP -- much better than using switch statements

PHP's syntax is manic muddled mess. It is not object oriented programming, but there are a few things that make it easy to do things better than the average hacker.

Function pointers, if you are a C person, Funs, if you are an Erlang cat, Procs or lambdas for Ruby, delegates in C#, lambdas in my beloved Python is what I am talking about.

PHP too, supports this, but in a completely straight forward way.

take the following PHP code:

function iMRichBitch() { compute48thMersennePrime(); }


you can simply refer to pass around a reference (or pointer) to 'iMRichBitch' using a string by the same name. Of course, when the function is to be invoked, you simply can say:

$func = 'iMRichBitch';
$func();


So this begs the question, "if I have function pointers", then I ought to use those instead of case statements and maybe even nested conditionals, right?" The answer is a big 'YES'.


so instead of this:

switch($conditional) { case 1: do1(); break; case 2: do2(); break; default: break; }


you might think about doing this (with a little defensive code for garnishment):

$conditional();

Sunday, January 3, 2010

Lambda Calculus

Can anyone fully understand lambda calculus? If so, what would they do with that power?