tag:blogger.com,1999:blog-175484572024-03-13T09:55:09.870-07:00Technitalabout software and technologyUnknownnoreply@blogger.comBlogger15125tag:blogger.com,1999:blog-17548457.post-38241013283646573552009-02-17T00:08:00.000-08:002009-08-14T00:14:59.880-07:00My TODO list in SMSUpdate: Twe2 is <a href="http://blog.twe2.com/2009/05/15/the-end-of-an-era/">shutting down</a> :-( so this will no longer work.<br /><br />Great news,<br />There's a new website called <a href="http://twe2.com/">Twe2</a> that lets you get <a href="http://www.twitter.com/">Twitter</a> notifications by SMS outside the US (their business model is to add a short ad message to the end of each SMS).<br /><br />I've been using <a href="http://www.rememberthemilk.com/">remember the milk</a> for quite some time now but a lot of tasks were overdue, either because I'm too lazy or because the notifications by mail or even by the <a href="http://www.rememberthemilk.com/services/gmail/">gadget</a> I added to my Gmail account were not prominent enough.<br /><br />So to try and eliminate at least one of the reasons for my tasks not getting done, I set up remember the milk to send my task notifications to twitter and then with the help of Twe2 I get reminded by SMS.<br /><br />Still have to work on eliminating the other problem though :-)Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-17548457.post-41755379873534905592009-01-10T11:03:00.000-08:002009-05-15T01:58:02.668-07:00Cool applications I will probably never have time to writeHere is a list of ideas of web services that would be helpful but I would probably have no time to write. Maybe someone else would...<br />I'll add future ideas to this page. If you have some of your own, I'd be happy to add them. Even better if you know of a service like this that already exists let me know.<br /><br />4. <span style="font-weight: bold;">Software libraries release tracker </span>(2009-01-10).<span style="font-weight: bold;"><br /></span>A web based tool where I can list all the third party libraries I use for my projects and can be notified (email / RSS) when a library I'm using released a new version. It would also be nice if I could upload a CSV file with my libraries and the current versions I'm using and get a report of what I need to upgrade.<br />Advanced feature: test libraries transitive dependencies and warn me about possible collisions. For instance, Hibernate is dependent on Log4J version x.y.1 and Spring is dependent on Log4J version x.y.2 - Since I use both Hibernate and Spring I want to be warned about possible incompatibilities I may encounter.<br />(note to implementer: maven has support for something like this so maybe use it as the core for this)<br /><br />3. <span style="font-weight: bold;">Contact name ring tone </span>(2008-12-20).<span style="font-weight: bold;"><br /></span>When your friends call you they don't introduce themselves because they assume you have caller ID. Now, what if you use a bluetooth earphone? Your phone is sometimes tucked away in your bag (for instance when you drive)<span style="font-weight: bold;">.</span> When people call and immediately start talking - it sometimes takes a while before you figure out who it is.<br />The solution is to have your phone figure out you're using an earphone and play the name of the caller instead of the regular ring tone. I guess it would do that by doing text-to-speech on the name in the phonebook entry. <span style="font-weight: bold;"><br /><br /></span>2. <span style="font-weight: bold;">An online log collector</span> (2008-12-13).<br />The logs of your application are sent to this website (by HTTP, JMS, whatever) - You have a simple UI where you can view and query these logs.<br /><span style="font-weight: bold;">What is it good for?</span><br />When you have a lot of servers you start finding all kind of <a href="http://technital.blogspot.com/2008/06/twitter-as-notifications-hub.html">weird ways</a> or <a href="http://www.facebook.com/note.php?note_id=32008268919">heavy weight</a> solutions for collecting your logs - I'm looking for something simple.<br /><span style="font-weight: bold; font-style: italic;">Update</span>: we created something like this for <a href="http://www.hivesight.com">HiveSight</a>: <a href="http://code.google.com/p/appenginelogger/">http://code.google.com/p/appenginelogger/</a><br /><br /><span style="font-weight: bold;"><br /></span>1. <span style="font-weight: bold;">An online job scheduler</span> (2008-12-13).<br />You have a form where you enter your job's schedule - it could be a simple input field where you enter a <a href="http://en.wikipedia.org/wiki/Cron">cron</a> expression or if you want something more advanced look at the recurring meeting dialog of MS Outlook.<br />Then let me select from a dropdown list an action to execute (do an HTTP request, call a webservice, run a <a href="http://pipes.yahoo.com/pipes/">yahoo pipe</a>, run a simple shell script, etc.).<br />These jobs will be run according to you schedule schedule.<br /><span style="font-weight: bold;">What is it good for?</span><br />For various repetitive automation tasks, monitoring of web servers, anything you can do with crontab, you get the idea.<br /><span style="font-weight: bold;"><br /></span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-17548457.post-89982988631454784862008-12-10T23:09:00.001-08:002008-12-10T23:43:26.749-08:00No such thing: "no vendor lock-in"<div style="text-align: left;">Every self-respecting framework or service always claim there is "no vendor lock-in" if you use their technology. I think there's no such thing.<br /><br />What is a vendor lock-in? Can you measure that?<br />I think the best way to measure vendor lock-in is to estimate the amount of work it would take to switch from one vendor to its competitor or alternative.<br />For instance, switching from <a href="http://tomcat.apache.org/">Tomcat</a> to <a href="http://www.mortbay.org/jetty/">Jetty</a> involves changing a few deployment descriptors. So vendor lock-in is not that big. What about the tweaking and tuning you did for your Tomcat, can you immediately do that for Jetty? I guess not. It will take some time before you fluently "speak" the Jetty language, so vendor lock-in is bigger. What about QA? your software was tested and working perfectly on Tomcat, how much time do you need to spend to make sure everything works on Jetty? So vendor lock-in is even bigger.<br /><br />Another good example is the <a href="http://www.springframework.org/">Spring framework</a> or <a href="http://www.hibernate.org/">Hibernate</a>. They both claim that your code is not dependent on their frameworks - it's true, you can write a Spring backed application with very little dependency on Spring in your code (unless you use annotations of course) but can you pull out Spring and replace it with something else? Can you replace Hibernate with another ORM solution that easily? No way - you're very strongly locked into Spring and Hibernate. In Spring they call it "dependency injection" - you can read it as "You don't have to write any code and we inject the dependency on the Spring framework automatically" :-)<br /><br />No metter what frameworks you choose you're locked into it. So the only course of action is to make sure you choose the right ones that will not disappear any time soon.<br /><br /><br /><br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-17548457.post-64823279805422302662008-12-04T13:00:00.000-08:002008-12-04T14:01:15.997-08:00R&D Lab - You pay for your mistakesI made a big mistake a few months ago. I bought a few servers for us to use in our office - you know, it's important to have a few machines at your disposal so you can run intensive tasks on them or run all kind of different tests you couldn't otherwise do on your single development machine.<br /><br />Makes sense right? Well, not in term of ROI and here is why:<br /><br />I bought a fairly good machine with 4GB of RAM and an AMD 6400+ X2 CPU - that cost me about $1000. Let's assume the machine is utilized for about 8 hours a day (in reality I guess most lab machines are used much less). Assuming 250 work days a year that's 2000 CPU hours a year. Let's say the life expectancy of this machine is 3 years so for 6000 hours I paid $1000. That's about $0.16 a machine hour.<br /><br />Now let's compare this to a machine I can rent from Amazon EC2 (<a href="http://aws.amazon.com/ec2/instance-types/">prices</a>). Assuming <a href="http://en.wikipedia.org/wiki/Moore%27s_law">Moore's law</a> will hold true for the next three years (<a href="http://en.wikipedia.org/wiki/Moore%27s_law#Ultimate_limits_of_the_law">limits of Moore's law</a>) today's EC2 large instance (m1.large) will be equivalent to two of the machines I bought for my office (I'm assuming that Amazon are nice enough to lower prices for a given hardware configuration as it becomes older). Add to my in-house investment the electricity / cooling / management (as in personnel) and it will make my (already) bad investment even worse. Oh, and for my in-house machine I had to put the money upfront and not "pay as I go".<br /><br />Now what happens If I need more machines at one time (for isntance, to do some tests before a release) and none at another time (like every night). Having these machines hosted on EC2 gives me the flexibility to use as many machines as I need and then don't pay for the time they sit idle.<br /><br />The bottom line - If you're a small startup - don't buy lab machine. If you're a big company you could probably save thousands of dollars every month by hosting your lab on EC2.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-17548457.post-68658850051928224922008-06-16T05:11:00.000-07:002008-12-04T14:32:23.243-08:00Twitter as a notifications hubIn HiveSight we're trying to keep eyes on our production environment as well as the status of services we need for development such as our continuous integration server and various other long running automation scripts we run on Amazon AWS.<br /><br />We were looking for a way to easily see all the notifications as a single stream of data - so here is what we did:<br /><br />First, we created a <a href="http://www.twitter.com/">Twitter</a> account where all the messages will go.<br />Then we made sure all notifications will be sent to the HiveSight Twitter account.<br />Now we can become followers of that account to receive updates.<br /><br />Here are a few examples of what we used it for:<br /><br />For continuous integration we're using <a href="https://hudson.dev.java.net/">Hudson</a> - build results are sent to the twitter account using a <a href="http://hudson.gotdns.com/wiki/display/HUDSON/Twitter+Plugin">plugin</a> that was written by the Hudson community.<br /><br />For production servers monitoring we're using <a href="http://www.nagios.org/">nagios</a>. Nagois is very easy to extend so we're using the twitter JSON API to update our account using the Linux curl command:<br /><pre class="wiki">curl --basic --user "<our twitter="" username="">username:password<and the="" password="">" --data-ascii "status=Nagios: $NOTIFICATIONTYPE$ $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$" http://twitter.com/statuses/update.json</and></our></pre>We use the same method to send notifications from various EC2 automation scripts.<br /><br />We also wrote a <a href="http://code.google.com/p/twitter-log4j/">twitter-log4j</a> extension that allows us to log errors from our applications directly to twitter. We open-sourced it so you can find it <a href="http://code.google.com/p/twitter-log4j/">here</a><br /><br />Now that we have all the messages in Twitter, we developed a very simple Ruby script that is executed every few minutes, checks if there are new messages that require immediate attention and sends and SMS if there are.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-17548457.post-71946296732484618752007-12-09T00:25:00.000-08:002007-12-08T14:27:55.547-08:00Maven repository on S3<a href="http://www.springframework.org/">Spring </a>are hosting their development sub-projects Maven repositories on <a href="http://www.blogger.com/aws.amazon.com/s3">S3</a>.<br />This is a great idea if you are hosting a project that's likely to have downloads here and there and don't want to pay for what you don't use - which is what you'd be doing if you hosted it on a regular hosting plan.<br />(On a side note - if you're working on an open source project you may just as well host it on <a href="http://sourceforge.net/">SourceForge</a> or <a href="http://code.google.com/">Google Code</a> for free - even if your working on a commercial closed-source project there are free solutions - more on that in a future post)<br /><br />The nice thing is that Maven has its own support for S3. Maven has a subproject that's responsible for the transport of artifacts called "<a href="http://maven.apache.org/wagon/">Wagon</a>". It allows maven to transparently work with repositories that reside on File, HTTP, FTP and other locations.<br />Wagon also has an extension that allows it to work with repositories on S3 - so it makes Spring's choice even better.<br /><br />Browse Spring's Java Config project on S3:<br /><a href="http://s3browse.com/explore/maven.springframework.org/snapshot/org/springframework/javaconfig/spring-javaconfig/">http://s3browse.com/explore/maven.springframework.org/snapshot/org/springframework/javaconfig/spring-javaconfig/</a><br /><br />Wagon-S3 artifact for Maven:<br /><a href="http://mvnrepository.com/artifact/org.apache.maven.wagon/wagon-s3">http://mvnrepository.com/artifact/org.apache.maven.wagon/wagon-s3</a>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-17548457.post-85315953319810691282007-12-02T21:09:00.000-08:002007-12-02T22:02:33.269-08:00Computer Randomly Plays Classical MusicLook at this: <a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;261186">http://support.microsoft.com/default.aspx?scid=kb;en-us;261186</a><br />This is the funniest error (feature) I've ever seen. The programmer who did this is a genius :-)<br /><br />(got this from <a href="http://philobuster.wordpress.com/">Elad</a>)Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-17548457.post-43401193429286433162007-11-21T10:45:00.000-08:002007-11-21T13:45:12.163-08:00C# 3 / .NET 3.5 / VS 2008Microsoft released Visual Studio 2008 together with the .NET 3.5 framework and C# 3.<br />There are some new exciting features included in this release.<br />Here are some of them:<br /><br />1. <span style="font-weight: bold;">"var"</span> - You can assign any object to a var (for instance: var i = 1). This is not the same as using "object" because the compiler (and VS) will figure out the actual type and make sure you don't make mistakes.<br />You can see how VS figures out that "j" is of type string and autocompletes the correct methods:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8t6WZ4SKjGk/R0STiySGTFI/AAAAAAAABm0/JnXM5sNFGOg/s1600-h/var.gif"><img style="cursor: pointer;" src="http://4.bp.blogspot.com/_8t6WZ4SKjGk/R0STiySGTFI/AAAAAAAABm0/JnXM5sNFGOg/s400/var.gif" alt="" id="BLOGGER_PHOTO_ID_5135391700931726418" border="0" /></a><br /><br /><br /><br />2. <span style="font-weight: bold;">Simplified properties</span> - Instead of having to write getters and setters blocks for class properties, you simply have to declare a "get; set;" block. For example the class User:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8t6WZ4SKjGk/R0STXySGTEI/AAAAAAAABms/R8Ih069rANY/s1600-h/properties.gif"><img style="cursor: pointer;" src="http://4.bp.blogspot.com/_8t6WZ4SKjGk/R0STXySGTEI/AAAAAAAABms/R8Ih069rANY/s400/properties.gif" alt="" id="BLOGGER_PHOTO_ID_5135391511953165378" border="0" /></a><br /><br />The compiler will automatically create the needed class fields.<br /><br />3. <span style="font-weight: bold;">Class and collection initializers</span> - after you defined your class properties you can easily create a new class and initialize it with default properties.<br />So the class User can be instantiated like this:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8t6WZ4SKjGk/R0SUSySGTKI/AAAAAAAABnc/pcc4aJ9R-DU/s1600-h/initializers.gif"><img style="cursor: pointer;" src="http://4.bp.blogspot.com/_8t6WZ4SKjGk/R0SUSySGTKI/AAAAAAAABnc/pcc4aJ9R-DU/s400/initializers.gif" alt="" id="BLOGGER_PHOTO_ID_5135392525565447330" border="0" /></a><br /><br />4. <span style="font-weight: bold;">Extension methods</span> (<a href="http://en.wikipedia.org/wiki/Duck_typing">duck typing</a> in other languages) - You can add methods to an already existing class. You define a new extension method and the compiler will attach your method to any type that matches the definition - of course once you define the extension method, VS will become aware of it and will autocomplete it for you.<br /><br />In the example below I define an extension method for the type "string". I want to add the "encrypt" method to string, so first I define the extension method - this is a simple method that encrypts a string but notice the encrypt method signature:<br /><br /><span style="font-family:trebuchet ms;"> public </span><span style="font-weight: bold; color: rgb(51, 51, 255);font-family:trebuchet ms;" >static</span><span style="color: rgb(51, 51, 255);font-family:trebuchet ms;" > </span><span style="font-family:trebuchet ms;">string encrypt(</span><span style="font-weight: bold; color: rgb(51, 51, 255);font-family:trebuchet ms;" >this</span><span style="font-family:trebuchet ms;"> string plaintext, string password)<br /><br /></span>It must be static and have the keyword "this" before the first argument. The "this" keyword will instruct the compiler to attach the encrypt method to the "string" class (string is the parameter type of the first argument).<br />Notice that the class is defined within the "Technital" namespace so only strings that are used inside this namespace will be affected (like strings in the User class defined before).<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8t6WZ4SKjGk/R0SUSiSGTHI/AAAAAAAABnE/Y5xMuruDP6U/s1600-h/encrypt1.gif"><img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8t6WZ4SKjGk/R0SUSiSGTHI/AAAAAAAABnE/Y5xMuruDP6U/s400/encrypt1.gif" alt="" id="BLOGGER_PHOTO_ID_5135392521270479986" border="0" /></a><br /><br />Here I use the extension method on the Password property from the User class (a string). You can see VS picked up the extension method and now offers it in the autocomplete box.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8t6WZ4SKjGk/R0SYDySGTNI/AAAAAAAABn0/8eVedJcrCaE/s1600-h/encrypt2.gif"><img style="cursor: pointer;" src="http://4.bp.blogspot.com/_8t6WZ4SKjGk/R0SYDySGTNI/AAAAAAAABn0/8eVedJcrCaE/s400/encrypt2.gif" alt="" id="BLOGGER_PHOTO_ID_5135396665913920722" border="0" /></a><br /><br />So here is the final result:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8t6WZ4SKjGk/R0SYECSGTOI/AAAAAAAABn8/brs0yzv-SlQ/s1600-h/encrypt3.gif"><img style="cursor: pointer;" src="http://1.bp.blogspot.com/_8t6WZ4SKjGk/R0SYECSGTOI/AAAAAAAABn8/brs0yzv-SlQ/s400/encrypt3.gif" alt="" id="BLOGGER_PHOTO_ID_5135396670208888034" border="0" /></a><br /><br /><br />5. <span style="font-weight: bold;">Anonymous types</span> - You can declare anonymous types. They are treated as "object" and the compiler will internally assign them with a name. This is a feature which is used quite a lot with <a href="http://technital.blogspot.com/2007/03/linq.html#links">LINQ</a><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8t6WZ4SKjGk/R0ST7CSGTGI/AAAAAAAABm8/aGSqhnY9qak/s1600-h/anonymous.gif"><img style="cursor: pointer;" src="http://1.bp.blogspot.com/_8t6WZ4SKjGk/R0ST7CSGTGI/AAAAAAAABm8/aGSqhnY9qak/s400/anonymous.gif" alt="" id="BLOGGER_PHOTO_ID_5135392117543554146" border="0" /></a><br /><br />6. <span style="font-weight: bold;">Lambda expressions</span> - C# allows using lambda expressions (which are just another way to define anonymous functions). They are defined like this:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8t6WZ4SKjGk/R0SUTCSGTLI/AAAAAAAABnk/Orhg9BhVxJI/s1600-h/lambda.gif"><img style="cursor: pointer;" src="http://1.bp.blogspot.com/_8t6WZ4SKjGk/R0SUTCSGTLI/AAAAAAAABnk/Orhg9BhVxJI/s400/lambda.gif" alt="" id="BLOGGER_PHOTO_ID_5135392529860414642" border="0" /></a><br /><br />And are especially useful when used together with LINQ (which I guess is the real reason why this feature was introduced):<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8t6WZ4SKjGk/R0SU0CSGTMI/AAAAAAAABns/7_znFRhqkic/s1600-h/lambda2.gif"><img style="cursor: pointer;" src="http://1.bp.blogspot.com/_8t6WZ4SKjGk/R0SU0CSGTMI/AAAAAAAABns/7_znFRhqkic/s400/lambda2.gif" alt="" id="BLOGGER_PHOTO_ID_5135393096796097730" border="0" /></a><br /><br />Now comes the obvious comparison to Java...<br /><br />When comparing these features (and considering how young C# is) you can't help but wonder how long will Java be able to hold its head above the water? I mean java stakeholders are still debating if stuff like delegates and properties should be included in JDK 7 (you can find all kinds of missing features <a href="http://blogs.sun.com/abuckley/entry/language_proposals">here</a>)<br />Not to mention killer features like extension methods or LINQ. We can only dream of having these in Java.<br /><br />It seems like Microsoft are aware of the popularity of dynamic languages like Ruby - you can see they borrow a lot of the new features from such languages. They have developers in mind.<br /><br />Sun on the other hand, are thinking of Mathematicians - not developers. They are so careful of making sure that every aspect of the Java language is mathematically valid that they forget that they are dealing with innovative software developers that want their favorite development language to be innovative as well.<br /><br />The innovative developer that I am (or at least want to be) - I guess my favorite language can't be Java anymore.<br /><a href="http://blogs.sun.com/abuckley/entry/language_proposals"></a><br /><br /><span style="font-weight: bold;">Come on Sun, wake up and smell the Java.<br /><br /><br /></span>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-17548457.post-91532381905081913062007-11-17T06:36:00.000-08:002007-11-17T08:36:46.820-08:00Concurrency on multiple core CPUsAs you are well aware, CPU manufacturers are in a race to create multi core CPUs, since they found that increasing clock speed has it limits. So now Intel aims on releasing 32 core CPUs two years from now.<br /><br />So, how does this affect popular platforms such as Java and .NET? Well, they both use a shared memory model to support multithreading. Every time you want to acquire a lock you need to stop all threads. This is an extremely bad thing to do on multi core machines - you're waisting a lot of resources.<br />I guess if you're writing desktop applications this may not be so bad since you will probably be able to rely on the OS to do its magic and run each process (yours being one of them) on a different core. But what if you're developing a website or an enterprise application that will probably have it's own dedicated server? In such a case it becomes your responsibility. So what can you do?<br /><br />Languages such as <a href="http://www.erlang.org/">Erlang</a> and <a href="http://www.erlang.org/">Haskel</a> are functional languages that use message passing instead of shared memory (sometimes called "<a href="http://en.wikipedia.org/wiki/Shared_nothing_architecture">shared nothing</a>") - with message passing you don't have a shared memory - so no locks are needed and you're free to scale to as many processors as you'd like.<br /><br /><br />Now, in my opinion, you have three options:<br />1. Start learning Erlang or Haskell, which are fundamentally different from what you're used to if you're a Java/C# programmer.<br />2. Hope Sun and Microsoft rewrite their VM's to support message passing effectively (I highly doubt this would ever happen). You could do message passing even today but since the VM is not designed for that - you will get horrible performance.<br />3. You can be lazy and wait but there's a chance you will write really shitty software 3 years from now.<br /><br /><br />There's a good talk with Joe Armstrong, inventor of the Erlang programming language, where he explains the fundamental difference between message passing and shared memory:<br /><a href="http://channel9.msdn.com/ShowPost.aspx?PostID=351659">http://channel9.msdn.com/ShowPost.aspx?PostID=351659</a>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-17548457.post-4728538683347134022007-11-13T11:46:00.000-08:002007-11-14T01:24:51.014-08:00Distributed Version Control and Agile DevelopmentTraditional VCS are always about a centralized (slow?) server where every one in the team has to sync their work. For a number of reasons, this does not fit well with the dynamic, feature based nature of the agile development processes.<br />In an agile process you want small teams to be able to develop their features independently without breaking other teams work. Unfortunately, we all know how someone makes a change that breaks the build for everyone else (personally I try to sync as little as I can so I won't be affected by other people - not to say its a good solution).<br /><br />It seems that distributed version control (DVCS) is better suited for the needs of agile teams.<br />A DVCS does not require a centralized server (but you will most likely have one - to hold the ultimate truth about your project). Instead, in a DVCS environment, each developer has their own private branch on their local machine.<br /><br />When I'm part of a feature team I can push my changes to my buddies and can pull their changes. This way we collaborate in a peer-to-peer fashion without affecting other teams. I also argue that in such a way we're more aware of what other people are doing because we're actually aware of the changes other people do and we can review them.<br /><br />When we're ready we can check in our finished feature to the centralized (possibly legacy, SVN, Perforce, Starteam, ...) repository.<br /><br />Such systems already exist but don't expect a rich UI - for instance <a href="http://www.selenic.com/mercurial/wiki/">Mercurial</a> is popular in the open source community<br /><br />For a (not so long) introduction to DVCS read this: <a href="http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/">http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/</a><br /><br />And a (longer) google talk: <a href="http://video.google.com/videoplay?docid=-7724296011317502612">http://video.google.com/videoplay?docid=-7724296011317502612</a>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-17548457.post-82395050642181323192007-11-12T22:49:00.000-08:002007-11-13T03:16:33.109-08:00Mozilla PrismHere is another thing that's going to blur the borders between the desktop and the web.<br />Mozilla is working on <a href="http://labs.mozilla.com/2007/10/prism/">Prism</a> which is a platform for development of web enabled desktop applications.<br />This is a trend - you can find similar platforms for doing this, for example: <a href="http://labs.adobe.com/technologies/air/">Adobe AIR</a>.<br /><br />There is of course the other direction - bringing the desktop to the web (<a href="http://g.ho.st/">g.ho.st</a> is a nice example). <br />My personal opinion is that although this is definitely cool - it is not something people will actually use in the near future. Especially stupid is the browser inside a browser these virtual desktops have.Unknownnoreply@blogger.comtag:blogger.com,1999:blog-17548457.post-74777214813275875072007-11-12T22:39:00.000-08:002007-11-12T23:39:17.256-08:00Amazon EC2 and S3Amazon is hosting so interesting virtualization services called EC2 (Elastic Cloud 2) and S3 (Simple Storage Service).<br /><a href="aws.amazon.com/ec2">EC2</a> is a hardware virtualization service - you basically create a virtual machine and run your software on top of it. You can create as many instances as you want and you only pay for what you use.<br /><a href="aws.amazon.com/s3">S3</a> gives you a storage API - here too you pay for the space you occupy.<br /><br />There are some very interesting things which are being deployed on EC2/S3 for example:<br /><br /><br /><a href="http://open.blogs.nytimes.com/2007/11/01/self-service-prorated-super-computing-fun/">NY Times Converting TIFF to PDF</a><br /><br /><a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1044">Facebook applications</a><br /><br /><a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=873">Hadoop</a>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-17548457.post-53495074896753134352007-11-12T22:09:00.000-08:002007-11-13T08:24:52.425-08:00The Android platformGoogle released their mobile phone platform.<br /><a href="http://code.google.com/android/">http://code.google.com/android/</a><br /><br />If you have a really good idea for an application - you might get some of that 10 mil. dollars they're offering for developers.<br /><br />BTW, although it looks as if Android is running Java, it doesn't - it's running on Dalvik VM - the Java source code is not compiled to Bytecode!!! The main reason for this is the licensing of the J2ME.<br /><br />To see some more details read this:<br /><a href="http://blogoscoped.com/archive/2007-11-13-n83.html">http://blogoscoped.com/archive/2007-11-13-n83.html</a>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-17548457.post-63403276020406938772007-03-05T12:50:00.000-08:002007-03-05T12:58:08.185-08:00Eclipse on the Server SideA proposal for using Eclipse on the server side <a href="http://www.eclipse.org/equinox/server/proposal.php">here</a><br /><br />There is an additional discussion and an example here: <a href="http://www.infonoia.com/en/server_side_eclipse.jsp">http://www.infonoia.com/en/server_side_eclipse.jsp</a>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-17548457.post-31775675025843916152007-03-05T11:24:00.000-08:002007-03-05T13:03:02.388-08:00LINQLINQ is an interesting project from Microsoft - it provides a single API for accessing different kind of data sources like databases, XML and even simple string arrays.<br />Here is a simple example taken from <a href="http://msdn2.microsoft.com/en-us/library/aa479865.aspx">http://msdn2.microsoft.com/en-us/library/aa479865.aspx</a><br /><pre class="code" id="ctl00_LibFrame_ctl02" space="preserve"><br />using System;<br />using System.Query;<br />using System.Collections.Generic;<br /><br />class app {<br /> static void Main() {<br /> string[] names = { "Burke", "Connor", "Frank",<br /> "Everett", "Albert", <br /> "George", "Harris", <br /> "David" };<br /><br /> IEnumerable<string> expr = from s in names<br /> where s.Length == 5<br /> orderby s<br /> select s.ToUpper();<br /><br /> foreach (string item in expr)<br /> Console.WriteLine(item);<br /> }<br />}<br /></string></pre><br />Many more examples are available here: <a href="http://msdn2.microsoft.com/en-us/vcsharp/aa336746.aspx">http://msdn2.microsoft.com/en-us/vcsharp/aa336746.aspx</a>Unknownnoreply@blogger.com0