December 29, 2007

Why Hot Songs Are Crap

Rolling Stone has an excellent article about why compressed songs sound bad. The practice of compressing music is also referred to as mixing "hot", because all of the sounds are boosted until they all measure close to the max decibel level which is usually displayed as red and white on a spectral analysis graph. This can also result in a form of clipping when a frequency is boosted such that its amplitude hits the ceiling for too long. Imagine a sine wave that has a peak of -0dB. To the left and right of the peak, the amplitude drops. But if the entire signal is boosted, the areas to the left and right of the peak will also be at -0dB.

This is one of the most annoying aspects of music produced today because really high end gear will expose these problems. But on the other hand, it does mean that for lots of music, you won't hear much difference if you listen on high end gear or mass market gear. In other words, if that's the sort of music that you listen to, you don't need to spend time or money on good speakers or electronics. Things may actually sound better to you if you don't, because a high-frequency roll off will make it less fatiguing to listen.

Well mastered audio on good gear will sound loads better though. I've remarked before about an album from Tosca, classical music, and other well mastered CDs that let you hear the instruments and performers. Wide dynamic range adds a lot of depth and captures the meanings behind a passage that is supposed to be done with fortissimo instead of pianissimo.

Posted by josuah at 12:44 AM UTC+00:00 | Comments (0) | TrackBack

December 12, 2007

2013: No North Pole

Recent modifications to arctic melting models by Professor Wieslaw Maslowski and his colleagues have shown a dire result: ice-free summers of the North arctic circle. They argue that previous models which predicted this to occur decades out fail to take into account some recent observations on the annual shrinkage of the arctic ice sheet and that effect on future years. The BBC article includes statements from other scientists who support Maslowski's team's new model.

This is pretty bad. A large amount of water will be getting dumped into the oceans on an annual basis, resulting in overall rises in sea level worldwide. The animals that rely upon ice to walk on will drown. There is no land mass at the North Pole, which means when the ice melts, the only thing left will be the ocean. It looks like the disappearance will be quite sudden. No more polar bears.

Posted by josuah at 7:35 PM UTC+00:00 | Comments (0) | TrackBack

November 18, 2007

Gattaca: Today

Gem DNA by Paul ThiessenI just came across a Wired article about 23andMe, who will decode your genetic sequence for a mere $1000. After submitting a sample of your saliva, your genotype data will be available for you to view on their web site. This isn't exactly the same as the early scene in Gattaca where upon being born, Jerome is given specific probabilities for certain diseases and health problems, but it's close. Based on the latest research into genetic influence on physical, mental, and health characteristics, you can see if there is some likelihood you might want to pay attention to certain things. You can also see how genetically similar you might be to other people in general.

deCODEme is another service that does the same thing, for about the same price. I'm not particularly sure if there is any difference in these services. Technically, they should be able to deduce and tell you the same thing, at which point it just comes down to price, but more than that privacy and the user experience. Privacy is going to be the most important, because as seen in Gattaca, it will all be about the protections in place and attitudes we adopt that determine what happens with this new capability.

Posted by josuah at 4:04 AM UTC+00:00 | Comments (0) | TrackBack

October 29, 2007

Java Server Faces are Weak

I'm very familiar with Struts and I like it a lot as a MVC framework for developing web applications. However, it's a little heavyweight, because it supports a lot and makes it possible to do many different things. Perhaps it would be easier to use something lighter for smaller web applications, like JSF in conjunction with the JSTL. As it turns out, JSF is pretty weak and doesn't even work with JSTL because there is no way for the tags to reference the information owned by the other.

JSF can be used to build HTML forms that are backed by beans. So you can use tags to create a form that will populate a bean, and likewise use a bean to populate a form. Beans can also be used to display data on the page, in general. You define the beans and their default values in a single configuration file that shared by all your pages. The navigational path between pages is also defined in a single configuration file, allowing for branching and looped paths. You can propagate beans between pages to carry information forward, and by putting logic into a bean's getters, some pure Java code as well. There is also support for some basic validators as well as custom validators, and display of errors that fail validation. Proponents of JSF argue its strengths as a MVC framework (see JSF for Nonbelievers).

However, there are some problems with JSF that I simply could not overcome. Perhaps the biggest of which is the inability to mix JSF tags with JSTL tags. JSF has a limited set of tags, not all of which provide the functionality I desire for more complex HTML generation. JSTL adds some of the tags I want (although it is not as full featured as the ones provided by Struts) but there was no way for me to reference the JSF beans directly from JSTL, to perform manipulations and iterate over values. I can shove JSF values into JSTL tag attributes, but I could not actually get a handle to the real bean object itself.

Another problem is how forms are programatically constructed using JSF tags. The form elements are given generated IDs which you have no visibility into. They tend to look like id0_id1, and are only generated at runtime. As a result, there is no way for me to reference those elements using client-side JavaScript.

Also, if you look at how the JSF MVC architecture is described by Richard Hightower, you'll notice there is not actually a clear separation between the model and controller. If there was, you would not need to reference the controller or its business logic from the model. Some might argue that's not so different from a controller that is referencing the model and its data, but the JSF approach is backwards because it prevents code reuse. In other MVC approaches, I can use the same model in many different controllers, where the data is the same but the business logic is different. In the same way I can use the same model in many different views, to change how I want to present the information.

All of the problems I've described do not exist in Struts. I am not familiar with the Spring Framework though, which is supposed to be a very good alternative to Struts. The documentation on Spring that I have looked at seemed to require thinking about things from a different perspective, but if you do so then you have a very powerful tool. There's also Stripes, which I have only taken a very brief look at. From the Quick Start Guide, it seems like Stripes specifically merges the model and controller into one class on purpose, to make things easier on the developer. But that creates the same reuse problem I described above with JSF.

Posted by josuah at 6:09 PM UTC+00:00 | Comments (0) | TrackBack

October 11, 2007

SqurirelMail versus IMP

I've been using IMP, part of the Horde Project, for a long time now as my primary webmail interface. I recently upgraded my server to the latest version release, and in doing so decided to go off RPMs for my webmail, instead of manual install as I had been doing before. But I noticed SquirrelMail in the list and recalled that SquirrelMail is the webmail system that ships with Mac OS X Server so maybe it's worth giving it a try, even though the screen shots didn't look all that appealing.

I gave it a try, but in the end I've decided to stick with IMP. SquirrelMail is functional, but it does not have all the interface conveniences that I've gotten used to using IMP. It's core install is very bare-bones, and additional features and interface customization must be done through plug-ins. There are a lot of plug-ins and it's an open architecture, so SquirrelMail is much more customizable than IMP, especially if you want to do something particular. But I don't have interest in doing that when all I want is a webmail system that is efficient to use and makes it easy to visually identify things and navigate my mail.

A few examples of shortcomings in SquirrelMail, with the plug-in set I found: the inability to mark messages as unread from the message viewing page itself; failure to identify the Cyrus mailbox hierarchy; and not being able to choose to go back to the message list window instead of the next message when finished viewing a message. I also found the built-in CSS themes lacking the contrast that makes IMP and Horde easy to read out of the box.

Posted by josuah at 5:08 AM UTC+00:00 | Comments (0) | TrackBack

October 5, 2007

Integrating Delicious Library

Ars has a preview of Delicious Library 2, which includes an HTML export feature that looks really good. (Except for squashing all images to squares.) Their screen shots show stuff that looks a lot better than what I've currently got for my music library. Of course, I'd want to integrate the look and feel into my web site anyway, but I'm sure there'll be enough to work with however this feature generates the HTML.

Delicious Library HTML ExportBut what got me thinking is the star ratings. You can rate any item in your library, which is good and cool. But the contents of your library are likely to be duplicated elsewhere, as far as ratings are concerned. Three quick and easy examples I can think of are for music, movies, and anything you've rated on Amazon.com, where Delicious Library pulls some of its data from. I wouldn't want to rate my movies on both Netflix and in Delicious Library. Or music in both iTunes and Delicious Library. Or on both Amazon and Delicious Library. Instead, it'd be super cool if Delicious Library could pull my ratings for items I've put into my collection from these different places. And cache them locally, of course, because it would really suck for those ratings to go away if I wasn't able to pull them anymore at a later time.

Posted by josuah at 5:54 PM UTC+00:00 | Comments (0) | TrackBack

September 28, 2007

IBM Italian Union Labor Strike (in SL)

This hasn't been covered by the MSM as far as I can tell, but apparently IBM is reducing the pay for some of its employees in Italy as labor union negotiations have failed. Many of the affected IBMers held a protest in SL declaring a general strike.

The strike is interesting not only because it took place in SL, which has its own meaning in terms of publicity for the cause and the ability for participants to get together, but because IBM has a huge stake in SL as a corporation. IBM has tried to embrace SL, I think believing that it has an opportunity for first-mover advantages by investing time, money, and other resources in the development of that virtual world and its economy and technology. But the strike is a reminder of how the lines between RL and VR are disappearing.

Posted by josuah at 6:26 PM UTC+00:00 | Comments (0) | TrackBack

September 1, 2007

Installing Ruby with MySQL Support on Mac OS X

Karen came to me today asking how she could get Ruby to connect to MySQL, because she was having a lot of trouble following some instructions she had found online for compiling and installing the MySQL library herself, for her research work at Stanford. I thought it would be easier to help her install the Ruby MySQL library on her Mac instead, and then connect to the Stanford database remotely. She is not working on a web application, and does not want all of the additional stuff associated with Rails, so I needed something that would be very simple for her to install herself, with instructions from me over IM.

I found the easiest combination was the following:

First Karen installed the three items included in the MySQL Mac OS X package: the server, preference pane, and startup support. She doesn't need to run the server, but installing it creates the /usr/local/mysql directory with all of the client-side drivers. The preference pane and startup support are just there to make things easier for her to work with.

Next, she installed the One-Click Installer. Mac OS X comes with Ruby already, but only the base interpreter. I couldn't find gem anywhere, and the One-Click Installer includes a bunch of stuff including RubyGems. So now Karen has a more up-to-date version of Ruby installed in /usr/local.

At this point, Ruby 1.8.6 is installed with RubyGems 0.9.4. Typing which ruby in Terminal showed that the /usr/local/bin/ruby executable was already being picked up instead of the one that came with Mac OS X. Now we needed to install the MySQL libraries so she could write scripts to interact with her database. This is done using RubyGems at /usr/local/bin/gem.

karen$ sudo /usr/local/bin/gem install mysql -- --with-mysql-dir=/usr/local/mysql

The first time, this returned an error about not being able to find the mysql gem. However, running the same command a second time it worked just fine and asked which version of the mysql gem to install.

Select which gem to install for your platform
1. mysql 2.7.3 (mswin32)
2. mysql 2.7.1 (mswin32)
3. mysql 2.7 (ruby)
4. mysql 2.6 (ruby)
5. Skip this gem
6. Cancel installation

Karen picked #4, and after a short while it reported success. However, all is not well yet because there is a bug in the mysql.bundle file that was created by the installation. It references the MySQL dynamic library as /usr/local/mysql/lib/mysql/libmysqlclient.15.dylib when the correct path is /usr/local/mysql/lib/libmysqlclient.15.dylib. Note the extra mysql in the incorrect path.

To fix this, you need to run the install_name_tool which can be used to change the name of dynamic libraries in a Mach-O binary. As it turns out, there will actually be two mysql.bundle files created as a result of the gem installation. I believe /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7/mysql.bundle may be a temporary one, and /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7/lib/mysql.bundle (inside the lib directory) may be the one used during execution. However, just to be safe, since the current working directory appears to be used when Ruby is looking for libraries, I had Karen change the reference in both files.

sudo install_name_tool -change /usr/local/mysql/lib/mysql/libmysqlclient.15.dylib /usr/local/mysql/lib/libmysqlclient.15.dylib /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7/mysql.bundle
sudo install_name_tool -change /usr/local/mysql/lib/mysql/libmysqlclient.15.dylib /usr/local/mysql/lib/libmysqlclient.15.dylib /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7/lib/mysql.bundle

Now everything is done and you can use the mysql library from within your Ruby scripts. However, you need to require RubyGems first, otherwise it won't find the mysql.bundle file.

#!/usr/local/bin/ruby

require "rubygems"
require "mysql"

Unfortunately, after doing all of this, Karen was unable to connect to her database because it does not accept remote connections. :(

Posted by josuah at 12:45 AM UTC+00:00 | Comments (0) | TrackBack

August 30, 2007

Using XFire (Apache CXF) All The Way

I thought I'd write a little bit about how to use XFire, which is now Apache CXF, "all the way". Because I think it's good to have this information in another place so people can find it easily by searching, even though a the existing framework documentation is very good. Some people may be just implementing web services by writing XML senders and receivers over HTTP. Which technically meets the definition of a web service, but does so in a way that requires everyone to do a lot of extra work.

If you really use a web services framework, like XFire or the stuff you get when you buy Rational Application Developer, to its full capabilities, then you don't even have to know that HTTP or XML is happening. In fact, you don't need a separate server or HTTP communication at all, since the underlying transmission protocol is hidden from you and might actually just be communication within the same JVM. Publication of the WSDL ensures everyone else can use your service even if they're not using the same framework you are. Of course, WSDLs don't contain meaning, so you still need documentation of your APIs. :)

Anway, for the real meat, you should check out the online documentation. But here's the skinny for making an XFire project in MyEclipse.

Server Setup

  1. Select your existing web project in the navigator and choose MyEclipse->Add Web Service Capabilities.... Alternatively, create your new project from scratch as a Web Service Project.

    Doing this adds the XFireServlet to the web.xml. This servlet is used to execute all of your defined web services. This should also add some XFire libraries to your project, and IIRC prompts you to choose which libraries you want to include. You need the core XFire libraries, of course, but you also need to pick a bean-binding library. I used JAXB because I found it did what I wanted. A configuration file services.xml will be created; I would suggest creating this file at src/META-INF/xfire/services.xml because that's where it will end up anyway (i.e. webapps/war/WEB-INF/classes/META-INF/xfire/services.xml).


  2. Create an interface. This interface will be the API that you implement on the server, and the API that clients call on the client. Here's a sample interface that I'm going to turn into a web service.

    public interface PersonService {
      public PersonMetaData getMetaData(int personId);
      public PersonMetaData[] getMetaData(int[] personId);
    }
    

  3. Create an implementation of the interface to go with the interface. The naming convention I've seen is to stick Impl on the end of the interface name.

    public class PersonServiceImpl implements PersonService {
      public PersonMetaData getMetaData(int personId) {
        return new PersonMetaData(personId);
      }
    
    

    public PersonMetaData[] getMetaData(int[] personId) {
    PersonMetaData[] metaData = new PersonMetaData[personId.length];
    for (int i = 0; i < personId.length; i++)
    metaData[i] = new PersonMetaData(personId[i]);
    return metaData;
    }
    }



  4. Now you need to define the web service and map the interface PersonService onto the implementation PersonServiceImpl. This is done by editing the services.xml that was created earlier. This is what my services.xml would look like for this PersonService web service.

    <beans xmlns="http://xfire.codehaus.org/config/1.0">
      <service>
        <name>PersonService</name>
        <serviceClass>com.netflix.PersonService</serviceClass>
        <implementationClass>com.netflix.PersonServiceImpl</implementationClass>
        <style>wrapped</style>
        <use>literal</use>
        <scope>application</scope>
      </service>
    </beans>
    

  5. At this point, you're good to go. Deploy your web project using MyEclipse and start up Tomcat. If everything's good, you should see a bunch of XFire-related initialization messages printed out on the console. Assuming no exceptions are thrown during startup, your web service is up and running and your server-side is done.

    To get to the WSDL which you can use for automatically generating the client-side code, access your web application via the URL http://hostname:port/war/services/. Your deployed web services will be listed, along with a WSDL link. Clicking that link will give you the WSDL that you can give to someone else or use yourself.


Client Setup

  1. Using MyEclipse, you can generate the client-side code from the WSDL. I recommend creating a new Java project that will act as your client project, as the automatic code generation will create and overwrite existing files if it thinks it needs to. Plus, it lets you see exactly how someone else would put together a client if all you gave them was the WSDL.

    To generate the code, use File->New->Other... and select MyEclipse->Web Services->Web Service Client. You'll have to either provide the URL (http:// only because MyEclipse's XFire plug-in does not support SSL) to the WSDL or the file on disk. All the client-side classes will be created in the client project in the same packages as on the server, and then you can use them.


  2. Assuming the client code generated is from the WSDL of the server interface described above, here's how you would use it.

    public static void main(String args[]) {
      PersonServiceClient client = PersonServiceClient();
      PersonServicePortType service = client.getPersonServiceHttpPort("http://remote:port/war/services/PersonService");
      PersonMetaData mmd = service.getMetaData(12345678);
      ArrayOfInt personIds = ObjectFactory.createArrayOfInt();
      personIds.getInt() = new int[] {12345678, 23456789, 34567890};
      ArrayOfPersonMetaData aommd = service.getMetaData(personIds);
    }
    

    Note that the parameters and return types might be JAXB objects like ArrayOfPersonMetaData or ArrayOfInt. So the API is not exactly the same as you might expect. However it might be the case that if you build the client code in the same project and source folder as the server code, your client code uses the original class definitions. I'm not entirely sure since I haven't tried that, but I believe it may work. Either that or it'll overwrite your existing class definitions. :p

    Also, I'm not entirely sure about how you'd go about assigning the personIds.getInt(). I'm just guessing from memory, but it should look something like that.


Posted by josuah at 10:03 PM UTC+00:00 | Comments (0) | TrackBack

August 28, 2007

SOAP or REST

Even though REST has been around for a while, I'd never looked into it before today. Essentially, REST is an alternative approach towards web services, with the other widely adopted idea SOAP. However, while SOAP is a standard and provides a WSDL that defines an interface by which clients can make use of the web service in an implementation-independent fashion, REST is tightly coupled to the HTTP 1.1 specification and provides no clearly defined interface. For that reason, while I think REST is useful in some cases, in general I would prefer SOAP if possible because it is more flexible, implementation-agnostic, and "strongly typed" so to speak, whereas REST is restricted to a few specific actions, tied to HTTP, and "loosely typed".

To go into further detail, it's important to understand the difference between how REST and SOAP/WSDL are implemented and used. REST identifies a single resource with a URI. I'll use the example of http://www/service/person?id=123 to identify the person of ID 123. The web service might then support the operations GET, PUT, POST, and DELETE which correspond to the four actions you can perform on a person. GET requests would return some XML like


<person>
<id>123</id>
<name>Wesley Miaw</name>
<sex>male</sex>
<age>27</age>
</person>

The PUT and POST methods would include in the request body identical XML that would be used to update or create a person object respectively. While a DELETE method would delete a person object.

With REST there is nothing to define exactly what is okay and what is not okay for the request body XML. I could put something completely different for the value of sex and there's nothing on the client side that says that value is illegal. There's also nothing that would prevent me from putting some random junk into the request body. The only way I can know if I sent the wrong kind of content from the client is to get an error response back from the server. That's why I consider REST to be similar to an interpreted, loosely typed, scripting language.

In contrast, the WSDL for a SOAP web service would specify exactly what types of values can be specified, and it would be a client side error to try and put a string type into a parameter that the WSDL defines as an integer. Any client side implementation that conforms to the WSDL would be able to enforce this restriction without requiring support for arbitrary errors in the server response. So now, the server only needs to return errors that have meaning at the application layer, rather than at the language layer. For example, will be errors for trying to update a non-existent person or if the client is not authorized to perform the transaction, but no errors for trying to shove an integer into a string.

There is something akin to WSDL which some people are using for REST, called WADL. WADL does enforce types, which is good, and it also defines the interface and supported HTTP methods. There are also WADL code generators.

With WADL, REST gets back type safety, but it still doesn't get back all of the flexibility of SOAP since you're still restricted to HTTP methods (unless you make the URI specify the method, which is not how REST is defined or how WADL describes the service) and you are still working with the idea of resources or objects instead of actions or commands. Plus, you are still closely tied to the actual communication protocol, HTTP. The REST versus RPC section on Wikipedia describes the restrictions of REST pretty well.

In comparison, with SOAP I might define a PersonService that has methods like void setAge(int) or Car getCar() to change a person's age or find out what kind of car he drives. A REST implementation would require a new URI specifically for a person's age and to access a person's car, for this level of granularity. The URI to a Car URI might be found in the returned Person object.

Of course, REST does have some significant advantages over SOAP.


  1. It's much easier to understand what is travelling over the wire, because a resource is a URI and the different HTTP methods are the actions.

  2. It sends less data over the wire than a SOAP message, because SOAP includes an envelope that wraps the actual data.

  3. Tighter coupling between web server infrastructure and the web service. You basically can get for free any of the things you take advantage of with regular web servers, like caching and access logs and simple web browser clients.

As a side, Apache CXF does support RESTful services, but does not support code generation from a WADL. The older XFire implementation does not support REST in any form.

Posted by josuah at 1:14 AM UTC+00:00 | Comments (0) | TrackBack

August 12, 2007

XHTML as HTML and True Image Overlays

I ran into two issues while trying to make sure my new web site is compatible in Safari, Firefox, and Opera. (Internet Explorer 6 makes up about 30% of my traffic, and Internet Explorer 7 about 20%, but I am not going to use non-trival hacks to deal with a non-compliant browser.) The first issue was a situation in Opera where the Gallery popup images would not display. The second was the different overlay behavior of the Gallery popups in Safari, Firefox, and Opera. You can view the behavior I tried to make identical in all three browsers by clicking on any image in my photo album; the page should be covered with the full-size image and some controls at the bottom, and clicking on the info icon in the lower-right should show image details in a popup frame that is visible above the full-size image.

The first problem was Opera would not display the full-size image popup at all. It complained about the return value of a document.getElementById() coming back as undefined. However the same call worked just fine in Safari and Firefox. I posted a question getElementById returns null for empty anchor on the Opera community forums, and got a relatively quick reply explaining how even though the doctype and markup is valid XHTML 1.0 Strict, the MIME-type in the HTTP response headers is text/html. And having self-closing tags like <span /> results in bad things happening when the DOM structure is modified with JavaScript.

This is explained in further detail in Understanding HTML, XML and XHTML and in my forum reply, but the short of it is that changing the Content-type to application/xhtml+xml made using self-closing tags work, but broke everything else. Safari was no longer loading images correctly because the URLs didn't get sent out correctly. Firefox complained about something bad in the DOM structure. JavaScript was not being processed or executed even when using the <![CDATA[ ... //]]> modification.

For all those reasons, plus having HTML 4.01 embedded in my older blog posts, I changed the Content-type back to text/html and am instead making sure to use a full closing tag on any XHTML elements that require closing tags in HTML 4.01, such as <a> and <div>. I'd actually noticed that Safari wasn't doing the right thing all the time when self-closing elements like div, but didn't know the reason why until now.

The second issue was a little easier to resolve, once I saw how Opera was rendering things. In Safari, everything was looking how I expected it to, and how things look now in all three browsers. Firefox was doing something a little different where the header and footer divs were still appearing above the full-size image div, but my previous investigation led me to believe that was due to a case of float elements always having a z-index below those of positioned elements. But once I saw the rendering in Opera, I knew it was something else. Opera was showing the full-size image div enclosed entirely within its parent div with overflow hidden. So the fix was simple: move the image div out of its parent div and make it a child of the body. I also had to make the image details div a child of the body, otherwise it would be constrained as well and could not appear above the full-size image div.

I ended using a little bit of JavaScript to move the two divs into the body, because of how my Smarty templates and PHP header and footer include files are being used. Here's some code that does what I described:


function relocate(id) {
app_body = document.getElementById(id);
while (app_body && app_body.tagName != 'BODY') app_body = app_body.parentNode;
var imageview = document.getElementById(id);
var parent = imageview.parentNode;
parent.removeChild(imageview);
app_body.appendChild(imageview);
}

Posted by josuah at 8:27 AM UTC+00:00 | Comments (0) | TrackBack

August 6, 2007

New Web Site

Today I released the new personal web site I've been working on, which you are looking at now. This version only uses CSS for presentation, completely decoupling the display from the XHTML markup. I also have different CSS for screen and print media, which lets me do some cool things. I am using PHP for everything, including the blog archives, so I can include some programmatic behavior in the content and display. Paul asked me why PHP instead of Ruby, but PHP is much more established and almost all decent web applications are in PHP, which means easy integration. My goal for this version of the site was to make it much more visually interesting and exciting to read, and more dynamic in nature.

I originally tried to use JavaScript to make all content load into divs on the existing page, partially because I liked the idea of implementing dynamic behavior like that, but discarded the idea after struggling to make it work right for way too long. The biggest problem was dealing with dynamically loaded JavaScript. I found the most reliable way of ensuring JavaScript would evaluate correctly and in the global scope was to include the JavaScript block in some part of the actual DOM document, rather than evaluating it.

The AJAX framework I decided to go with is script.aculo.us and Prototype. The latter is actually more interesting than script.aculo.us for building interesitng behavior and custom effects. script.aculo.us just provides some stock ones that are nice and useful. I looked at Dojo for a short while, but while it has much better documentation than Prototype, I think Dojo is a little too low-level and I can be more productive with Prototype.

As a side, Prototype evaluates JavaScript returned from an Ajax.Request using calls to eval() in a local scope. Which makes it not do the right thing a lot of the time. I had to modify Prototype's evaluation code so it just inserts returned JavaScript into the page. Prototype also has a bug where it inclues all form elements on submission, instead of only identifying the elements that would be sent if the form was submitted by the browser. As a result, I had to remove the Preview button from the blog comment form.

You might ask why use Prototype to submit and display the results of the blog comment form, but unfortunately MovableType has two pages which it cannot generate PHP for: the search results and comment preview. So for those two situations, I had to use the Ajax class to display the returned XHTML inside the existing page, to maintain the look-and-feel.

Switching to PHP for the blog archives means a lot of old URLs are no longer valid, since the blog archives used to be generated with .html extensions. Rather than return 404 to everyone that's linked to these pages, including my own pages, I put a RewriteRule into the archives directory that will map requests for .html onto .php.

I also decided to discard the MyPhotos photo gallery implementation I had been using. I'd written it a long time ago, before there were really any good photo gallery web applications available, but now it is out-dated and lacks much of the functionality you'd really want. So I've switched over to Gallery, which is probably the most popular of all photo gallery web applications. It's also written in PHP, and has a very active user and developer community, and support for lots of features. It's open source, so I can figure out exactly how it works (unfortunately the API documentation is pretty lean) and customize it. It also uses the Smarty template engine, so I ended up learning how that works. The only thing missing from the current version of Gallery is being able to override module templates from the theme. That's scheduled for release in the next version though.

Unfortunately, trying to do things in pure CSS has one major problem: Internet Explorer. Despite being the most used web browser, it's also the worst web browser. It never supports the web standards the rest of the browsers do, and the web standards it does support it does so in incomplete or incorrect ways. Its parsers are broken, and its rendering is wrong. Internet Explorer really is still the worst thing to happen to the web.

My first implementation does not work with any version of Internet Explorer. I fixed it a little so it would work with IE 7 by removing all uses of CSS @import, but IE 7 still won't work with the dynamic behavior I am using in my custom Gallery theme (based off the Hybrid theme). And if you try and view my site in IE 6, it looks completely broken. I suppose this is a little better than my previous site, which wouldn't even necessarily display in IE at all, because it was valid XHTML which wouldn't parse correctly.

One last thing I wanted to make sure of was that I wasn't going to lose all the work I'd put into the previous site. So before switching everything over, I installed Subversion and checked everything into a new repository. Now that I've switched over, a lot of the old documents are deleted or changed, but I still have them in the repository and can get them back whenever I might want in the future.

Posted by josuah at 2:45 AM UTC+00:00 | Comments (0) | TrackBack

August 3, 2007

6Mbps DSL Line Testing

Raw Bandwidth just announced availability of 3-6Mbps down, 512-768Kbps up residential DSL service. With increased use by Luna, my desire for a more visually rich personal web site, and expectations regarding video download in the near future, I decided it was worth the additional monthly cost. However, my existing Alcatel 1000 was not getting good enough sync, and the Westell modem Mike sent me was also having sync issues. So with Mike on the phone checking sync, I tried a bunch of stuff to try and get a better signal.

The first thing we tried was hooking the Westell directly into the line at the outside box. That connection had good sync readings. But plugging directly into the line upstairs did not. At that point I went around trying different telephone jacks and it turns out the upstairs jack (which is a pair of jacks) is somehow wired to the kitchen jack but I'm not sure how. The kitchen jack has a huge mess of wires behind it, none of which is clearly connecting to the upstairs jacks. The left-hand jack in the new extension of the house is on a different pair and had really good sync.

But since the downstairs jack would be inconvenient, being no where near our computers, on Mike's advice I disconnected the wire between the two jacks upstairs. So now that pair runs through the kitchen to one jack upstairs, instead of two jacks upstairs. This change made the signal good, and when I attached a 3-way adapter with a pair of filters for the computer modem and telephone, the signal got even better (for some strange reason). So that's the configuration we are using now.

Posted by josuah at 5:09 AM UTC+00:00 | Comments (0) | TrackBack

July 31, 2007

More RAM

Things have been running a little slow on our primary workstation, a Power Mac G5 system I bought in Fall of 2003. So it's about four years old, but it's not slow because it's old (although it is slow compared to the current offerings) but because both it and the Linux file server don't have enough RAM, particularly now that both Luna and I are always logged in. So I ordered 2GB of RAM for the Mac, bringing it up to 4GB total, and another 1GB of RAM for the Linux server, bringing it up to 3GB total.

With the additional RAM installed, things are a lot nicer. The Mac doesn't have to page out anymore, and maximum usage hits a little over 3GB, but there's still a lot of RAM left over for me to work with if I need to do something intensive like heavy graphic design work in Photoshop. The Linux server now has enough RAM to allocate at least 200MB of kernel buffer space, while still running all of the services I need, so the Mac never needs to wait for disk over the NFS mounts.

I suspect things will be good for a few more years, before I have to upgrade either the Linux server or the Mac workstation, again. It really was the case of Luna running applications on the Mac at the same time that pushed the Mac over the edge, while the Linux server has needed more RAM for its kernel buffers for a while, but it was never really bad until Luna started using it too.

Posted by josuah at 3:05 AM UTC+00:00 | Comments (0) | TrackBack

June 21, 2007

More on Diesel

I found another resource about the problems with diesel powered transportation from the Clear Air Task Force Diesel project. They have maps and estimates of health risks due to diesel exposure in various parts of the country. They also document how installation of diesel particulate filters and ultra-low sulfur gas can reduce emissions significantly. However, all current diesel cars don't meet the necessary EPA standards. This will change as manufacterers start releasing new diesel cars that do. Matching one of these new cars with biodiesel should be very environmentally friendly.

The only exception, as I mentioned earlier, is that biodiesel produces more NOx than fossil diesel fuel. It may be more than outweighed by the reduction in other emissions, but NOx still has serious environmental and health impact.

I did find a presentation from the Department of Energy titled DPF Performance with Biodiesel Blends though. This presentation states two things of interest: NOx emissions are not significantly greater and there is a decent decrease in particulate matter exhaust with a 20% biodiesel blend. So even if you're using a diesel car right now, it really does make sense to start using a biodiesel blend for all the health and environmental benefits.

I suppose we'll have to wait until sometime in 2008 before we should buy a newer diesel car to run on biodiesel we make from vegetable oil. That timeframe isn't too bad though, since Luna still needs to learn to drive and would need a couple of years of driving experience with an old car before we get a better car.

Posted by josuah at 5:41 PM UTC+00:00 | Comments (0) | TrackBack

June 19, 2007

Prius or Hummer and the Biodiesel Question

A coworker mentioned something yesterday that I found extremely hard to believe. Apparently, it all started with a sort of grassroots publication effort, one example of which is Prius Outdoes Hummer in Environmental Damage. From there, the claim spread like wildfire. But I just couldn't believe that claim. It goes against everything my brain says would make sense. So I did some digging, and there's a lot of stuff out there contradicting that claim.

Apparently, everything started with a Dust to Dust comparison of the total energy costs of various cars over their entire life-cycle. (Note that their 450+ page paper isn't really a study or research paper. It's more of the sort of presentation you might find in a sales pitch or marketing meeting. So take it as such.) Their conclusion, which is based on a lot of seemingly thorough number crunching but no actual scientific measurements, states that hybrid cars are actually relatively expensive in terms of energy cost per mile compared to some conventional combustion engine cars.

A quick Google search for the other side of the coin will find a fairly balanced exploration into those claims in Prius Versus HUMMER: Exploding the Myth. One of the biggest counter arguments is the CNW claim of a Hummer lasting 35 years and Prius only 10 years. The Pacific Institute takes another look at the CNW report in their Hummer versus Prius:
"Dust to Dust" Report Misleads the Media and Public with Bad Science
. Although they don't provide evidence to the contrary, the Pacific Institute does illustrate a lot of reasons why you cannot trust the Dust to Dust report in their reanalysis.

I also mentioned to my coworker my desire to run our next car on biodiesel, and to make our own gas. This would give me better mileage, save money, and have a better impact on the environment. Those are my operating assumptions, of course, based on what I've read. But he responded by stating even biodiesel's soot (i.e. carbon emissions) would be extremely high, and result in a bigger environmental impact than unleaded gasoline.

So I did some more digging and found A Comprehensive Analysis of Biodiesel Impacts on Exhaust Emissions published by the EPA back in 2002. The study only included heavy-duty engines, which I'm guessing are those of 18-wheelers and their ilk, but the basic conclusion is overall emissions are radically reduced in proportion to the percentage of biodiesel in the fuel, except for NOx which increased slightly in proportion. Overall CO2 emissions remain about the same, but CO emissions do decrease.

I do need to find some hard numbers for comparision against regular unleaded fuel emissions, but this information at least is very promising. Especially when you consider the advances in engine and exhaust technology that would still apply to diesel engines (sort of) that were more recently manufactured.

Posted by josuah at 6:18 PM UTC+00:00 | Comments (0) | TrackBack

June 11, 2007

Mac OS X: Leopard

The new features of Leopard were presented today at the WWDC up in San Francisco. The new features and changes are very exciting. A lot of applications have been revamped and improved, and there's even greater network and application integration that I'll find very useful. But the biggest improvements are those related to file management. I think those features will fundamentally change how some things are done on a day-to-day basis.

Some of the new stuff is just eye candy, like the dock reflections and additional transparency. But some of the eye candy is actually useful, like how the new document stacks are animated (probably using Core Animation). Document stacks are sort of like popup collections of files available in the dock. This is a little like keeping a folder shortcut in your dock's document section, but not as restrictive since there's no filesystem boundary required; the files can be from anywhere.

I really like Quick Look too. A lot of times I open things like TextEdit or Preview just to take a look at something quick, only to close the application again or leave it open. But with Quick Look, that's no longer necessary. Document rendering filters that are plugins for the Finder will allow you to read entire documents without having to open any additional applications. Of course, I expect there to be a computational and memory hit associated with the running Finder. But from a usability standpoint, Quick Look looks great.

I am also really looking forward to using Time Machine. Basically, this is a continuous incremental backup system, but with hooks for the Finder to actually get to the backed up documents quickly and make use of them. You need a second hard disk to serve as your backup repository, and probably the bigger the better. I suspect it'd be best to get an enclosure so you can continually replace the hard disk with something bigger. A feature like this also makes a Leopard server even more attractive. I've already been contemplating moving to a Mac OS X server to take advantage of its groupware support. BTW, this idea isn't new; I first read about it with the Elephant filesystem. Also, in comparison to Windows Vista's System Restore, Time Machine is much more comprehensive, easy to use on a regular basis instead of as a special case, and works on individual files and is integrated with search.

I think Spaces is an excellent addition, although one I won't use that much. I may use it more frequently at work, where I have more limited screen estate and will often keep different application sets and window sets open for multitasking.

There are also a bunch of important UNIX-layer improvements: official POSIX compliance; a new version of Terminal that claims to be more Unicode friendly which might be helpful for Luna since she deals with so many Japanese and Chinese files; Kerberos NFS authentication that has long been lacking. The new Directory Utility looks like there might finally be a GUI for managing network mounts.

A very promising developer addition is Xray, a profiler that lies on top of the DTrace framework that was ported from Solaris. This looks really cool.

Posted by josuah at 8:23 PM UTC+00:00 | Comments (0) | TrackBack

May 13, 2007

An Inconvenient Truth

I finally got around to watching An Inconvenient Truth, a documentary about global warming focusing on the personal crusade of former Vice-President Al Gore to educate people about this "climate crisis". A real quick presentation about the issue was given at the 2006 TED conference, which you might want to check out. I greatly respect Gore as one of the very few really educated and contemporarily-savvy politicians of our time. And the global warming problem is one that I have believed in for a long time now.

I think one of the primary reasons I really liked this documentary is because it feels less like an opinionated exposé or personal agenda and much more like the sort of presentation or lecture you might find in academia. Of course, due to the nature of the presentation, the actual research and science involved is glossed over, but it's important to note that the scientific results and their projected impact on our world are presented. Which is where things change from opinion and subjective points of view or conjecture into real scientific data, interpreted in a scientific manner, and presented for public consumption.

One thing of note about the DVD is there's a 30 minute extension in the extras that half rehashes the existing talking points of the presentation in the documentary, and half brings in new information about the topic that is related to those talking points that have come out of research since the movie was produced. It's probably of interest to some people, but if you've already accepted the situation then it's probably not worth the time. Might be better to find newer information on the web.

Posted by josuah at 8:36 AM UTC+00:00 | Comments (0) | TrackBack

May 3, 2007

Raidmax X-1 ATX Mid-Tower Case

side windowThe summer is back and the days are getting hotter. This past weekend the outside temperature hit 29°C. Which translates into really hot in the computer room. The PowerMac G5 started locking up again, due to heat, and eventually something went wrong with the hard disk. I tried erasing it but afterwards the controller would just lock up while trying to communicate. Happened when I switched the disk over to my Linux box as well. So we're going through some cooling upgrades. The first is a Raidmax X-1 case.

I ended up picking this case after reading about it in an AnandTech comparison. It wasn't the coolest of the bunch, temperature-wise, but it won me over with some of the features and the acceptable price point. I am not interested in a nicer looking case that costs another $50. I just need it to do its job from a technical perspective.

temperature read-outI think my blog would be more interesting with more pictures, so I'm including some pictures off the Raidmax product page of the features that I really like. The first is a front panel temperature read-out, attached to an internal thermometer. This will give me a real easy indication of how things are inside, and if things are too hot. The front panel also has nice animations for fan and hard disk activity. But I believe the fan image only keeps track of whatever one fan you choose to attach to its lead, which means you might not notice if one of the many fans you've got inside has crapped out.

screwless locksAnother great feature is screwless locks for the drive bays and card slots. It's about time I picked up a case with this sort of feature. Unfortunately, the screwless capabilities do not extend to the actual enclosure. You still need to use screws to keep the case shut and attach things like the power supply. Screws should just go away completely. Thumbscrews would have been an easy addition for the top and side panels, but Raidmax decided not to go that way.

It turns out that Luna's always wanted a computer case like this one, which is fancier than older models (although more commonplace today) and includes a window on the side. But her mom never let her get one before because she was afraid the side window being made of plastic would break too easily. So far, the fans are keeping the case fairly cool and the spacing and arrangement of the hard disks allows for good air flow over them. I do need to order another 120mm fan for the front panel right before the hard disks though, as the case does not come with one.

Posted by josuah at 8:40 AM UTC+00:00 | Comments (0) | TrackBack

October 31, 2006

https:// TrackBack Pings

So I checked the source for Movable Type and the MT::Util module's is_valid_url function seems to be okay with URLs that begin with https://. So I should be able to accept pings from sites that are running under SSL. If anyone pings me and it turns out this isn't the case, please let me know. I'm rarely pinged anyway.

Posted by josuah at 6:08 AM UTC+00:00 | Comments (0) | TrackBack

June 4, 2006

Mayor Bloomberg's JHU Address

New York City Mayor Michael R. Bloomberg gave a moving and insightful graduation address to the students of John Hopkins University. I'm pleased to hear of his opinions on certain topics, which happen to match my own opinions on those same topics, and to know he is making a stand for it, at a time when politicians tend to be more concerned with their position and belief in fallacies than with taking the time to understand and make intelligent decisions.

Posted by josuah at 8:56 PM UTC+00:00 | Comments (0) | TrackBack

May 16, 2006

Free SkypeOut

Skype (an eBay company) announced today free SkypeOut to landlines and mobile phones in the US and Canada until the end of 2006. What does this really mean? It means no single U.S. or Canadian person with an Internet connection, dial-up included, has to pay for long-distance phone calls. For the rest of the year. No matter what. Seems eBay's investment is paying off big-time for consumers, and the telcos are going to be hating this because one of their massive cash cows just disappeared.

Posted by josuah at 3:04 AM UTC+00:00 | Comments (0) | TrackBack

April 27, 2006

Canadian Music Creators Coalition

A number of Canadian musicians have formed the Canadian Music Creators Coalition. This group was created to stand against recent political and legal "abuses" that have been harming the reputation and consumers of the Canadian music industry. The three goals of this coalition are to make it clear that suing consumers is bad, DRM is a risky and more often than not negative proposition, and to promote local Canadian music. They also want to make it clear that the labels are not looking out for the best interests of musicians or consumers. The top three coalition members listed on the home page are: Barenaked Ladies, Avril Lavigne, and Sarah McLachlan.

Posted by josuah at 9:36 PM UTC+00:00 | Comments (0) | TrackBack

April 17, 2006

DMCA's Unintended Consequences

The EFF has published version 4 of their DMCA Unintended Consequences document, which lists ways in which the existence (and not necessary the litigation of) the DMCA has negatively impacted technological advancement and existing rights in the United States. The geographical distinction is important, as the rest of the world is not bound by the DMCA and may continue to operate without its burden, but in doing so can no longer engage in trade of technology or information with the United States, its citizens, or people who do interact with the United States.

Posted by josuah at 5:53 PM UTC+00:00 | Comments (0) | TrackBack

April 12, 2006

iPods for Senators

A while back, IPac started a donation campaign to send iPod's to every U.S. Senator after the Committee on Commerce, Science, and Transportation chairman revealed during a hearing that after getting an iPod he suddenly understood how the "Broadcast Flag" and "Audio Flag" would be detrimental to both consumers and technological advancement. The MPAA and RIAA representatives at that hearing were blind-sided by his questions. Donate today.

Posted by josuah at 2:38 AM UTC+00:00 | Comments (0) | TrackBack

April 10, 2006

Testing Darwin

Came across this article called Testing Darwin off Brad Fitzpatrick's LJ. It's an incredibly interesting read, as it discusses the experiments several researchers have done over a number of years now involving an artificial life program called Avida. In this simulation, software programs can mutate and are rewarded or punished (from a survival point of view) when they succeed at processing numbers (i.e. resources). The results of these experiments are extraordinary.

Posted by josuah at 6:17 PM UTC+00:00 | Comments (0) | TrackBack

March 1, 2006

Bio-Diesel Cars

Looks like bio-diesel is getting some coverage in the mainstream press, finally. Although it seems to be because kids built a soybean-fueld car, rather than because adults did it. However, the current leader in removing its dependence upon fossil fuels is Brazil. Whenever I might need to buy a new car, I'll be seriously considering bio-diesel.

Posted by josuah at 6:01 AM UTC+00:00 | Comments (0) | TrackBack

January 12, 2006

Email to Susie Suh

I wrote an email to Susie Suh's representatives regarding the large FBI anti-piracy emblem that appears directly on the face of the physical compact disc I received as a replacement from Sony BMG. The email content follows:

Hi,

I just received my replacement non-XCP damaged Susie Suh CD through the Sony BMG replacement service (it took quite a long time, I'm sorry to say) and I thought Susie might be interested in knowing that on the CD itself, the top has a large FBI Anti-Piracy emblem. It's so large, in fact, that looking at the CD makes one think this CD is an FBI Anti-Piracy CD, and not a Susie Suh CD.

If it were my CD, I'd be a bit annoyed at this fact, since that certainly isn't the first thing I'd like someone to think of or see when looking at my CD, or to have the thought "FBI Anti-Piracy" so closely associated when someone thinks of me or my music. Unfortunately, that's the first thing that hit me in the face when I got the replacement CD. It's not the greatest thought association to have in my head.

Sincerely,
--
Wesley Miaw
wesley@wesman.net

Posted by josuah at 4:03 AM UTC+00:00 | Comments (0) | TrackBack

January 10, 2006

Susie Suh Replacement CD

I received my replacement CD of Susie Suh yesterday, after several weeks of waiting since I sent the original back sometime in Novemeber. At least I got it back, although I was sort of starting to wonder since it was taking so long. The length of time is no doubt a source of annoyance for some people, but I did have a copy of the CD for my car and the tracks imported to my computer anyway.

The XCP reference is gone from both the CD and jewel case, replaced by a fairly large FBI anti-piracy warning label. On the CD itself, the label is larger than any indication of Susie Suh herself, so you might be inclined to believe the CD is an FBI anti-piracy CD. I wonder if Susie Suh is aware of this and if she has any opinions on that matter. Perhaps I should stop by her web site and ask.

Posted by josuah at 6:22 PM UTC+00:00 | Comments (0) | TrackBack

December 20, 2005

Intelligent Design Ruling

U.S. District Court Judge John E. Jones III has ruled against the Dover school board on both counts of the very important intelligent design court case. This is an important ruling because it establishes two facts. First, that the school board's motives were clearly to push religious ideology into the classroom, and second that intelligent design is unscientific and a religious concept. The latter is most important in that it sets legal precedent that would prevent other attempts at introducing ID into public schools. Yay for intelligent judges!

Posted by josuah at 6:07 PM UTC+00:00 | Comments (0) | TrackBack

December 10, 2005

Fantastic Voyage / Voyage to the Bottom of the Sea

Fantastic Voyage was a great film when it came out for its special effects and imaginative set construction of the inside of a human body. The story is interesting because it takes the audience through a tour of the human body, and explains a little bit of how things work and are connected without being overbearing. It's too bad Raquel Welch wasn't given more lines though; the few lines she did have were well done. Instead she was put on as eye candy.

On the other side of the disc was Voyage to the Bottom of the Sea. This movie, on the other hand, was not very good at all. It had a bunch of clichés and it seems like the writers decided to throw every predictable conflict into the movie. The only good part of the film was the tension that remained constant as you tried to determine if Admiral Nelson was insane or the only hope for survival. Joan Fontaine and Barbara Eden were given equal opportunity as well.

One thing I found interesting was that in both movies, there was a time at which religion is juxtaposed with scientific thinking. In both cases, the discussion is extremely short-lived and left without any opinion one way or the other. Seeing the intelligent design versus evolution debate pop up for a few seconds in Fantastic Voyage is rather amusing given the current climate on that subject.

Posted by josuah at 8:23 AM UTC+00:00 | Comments (0) | TrackBack

November 27, 2005

OpenSuSE 10.0

Ever since upgrading my server's hardware to an Athlon 64 architecture, I've been unable to boot directly off the hard disk. So with the long weekend I decided to try an upgrade to OpenSuSE, the free release of SuSe after being purchased by Novell. Thankfully, it seems that the original SuSE people are still the ones in charge, because the OpenSuSE documentation and packaging is just as great as it's always been.

Unfortunately, I ran into quite a few snags trying to upgrade my 32-bit SuSE Linux 9.1 Professional installation to the 64-bit OpenSuSE 10.0 release. And, the DVD I created from the CD images was lacking quite a few packages. I ended having to back up my root partition and do a completely fresh install that included formatting the boot and root partitions. That's probably a good thing anyway, as it means my system is pretty much cleaned up of junk. I spent about twelve hours migrating my old system configurations to the new installations. Probably about twice as long as if the upgrade process had worked successfully.

In case you're wondering what sorts of problems I ran into during the upgrade process, here are some of the things I ran into. Many packages were listed as no longer maintained as part of OpenSuSE, and as a result, a few dozen of my packages were slated for deletion by YaST2. Although I didn't know it at the time, this is likely to have been the result of missing packages on my DVD. A dependency check complained a whole bunch about requiring an x86_64 version of the glibc files. I couldn't get this to go away. I tried to do a clean install without formatting my partitions as well, but the installer failed when trying to write the /etc/fstab file, even if that file was already removed. And after completing package installation, the boot setup always failed while trying to make the initrd image. Basically, it just didn't work.

Unfortunately, I'm still getting a GRUB error if I try to boot off my hard disk. But at least the error message is more informative and says there's a geometry incompatibility or something, instead of just saying error. I've switched to LILO to see if that might work better, but haven't tested it yet.

I've been up for almost twenty-four hours now, so I'm going to go to sleep soon.

Posted by josuah at 12:22 AM UTC+00:00 | Comments (0) | TrackBack

November 18, 2005

Disappearing Colored Bubbles

There's this excellent article in Popular Science about the efforts of Tim Kehoe to create colored bubbles. As in the bubbles you blow out of soapy liquid, but these bubbles are a single bright color. It's like seeing something magical, or special effects from a movie. But in a few years time, I'm sure little kids will always think that colored bubbles are something normal. This is definitely very cool. Check out the video.

Posted by josuah at 5:44 AM UTC+00:00 | Comments (0) | TrackBack

November 17, 2005

The 1984 Apple Commercial

Owen Linzmayer has released a portion of his book, The Mac Bathroom Reader, for public consumption on Curt's Media web site. The excerpt is titled The 1984 Apple Commercial: The Making of a Legend. For those who are unfamiliar with this commercial, it is the most successful and most popular television advertisement of all time, and won dozens of awards.

Posted by josuah at 7:25 AM UTC+00:00 | Comments (0) | TrackBack

November 10, 2005

Infected by XCP

I discovered today that I may in fact have purchased a copy-protected Sony CD. A while back I purchased Susie Suh's debut album. Turns out this is on the list of copy-protected CDs. At least I don't use Windows, so my computer hasn't been compromised.

Posted by josuah at 6:57 PM UTC+00:00 | Comments (0) | TrackBack

November 1, 2005

Sony CD installs Windows Rootkit

Came across this blog entry by one of the SysInternals crew: Sony, Rootkits and Digital Rights Management Gone Too Far. Mark Russinovich recently purchased a CD published by Sony that comes with a data session and installs some DRM software on Windows machines. Turns out this DRM software is hides itself from the user by employing rootkit-style tactics. And this software is extremely bad for you to have on your computer, both for what it does, what it uses, and for being poorly implemented.

Posted by josuah at 2:19 AM UTC+00:00 | Comments (0) | TrackBack

October 29, 2005

iCal Support for PHP iCalendar

It has been an extremely long time since I did any work for PHP iCalendar. During that time, the web site had been cracked through a PHP exploit and was down for quite a while. Apple's iCal application also underwent a calendar repository redesign, causing an incompatibility between PHP iCalendar and the native repository. Anyway, long story short is I've got changes pending to support the new iCal repository structure, as well as a couple of bugs. I'll check them into CVS once they've been peer-reviewed.

Posted by josuah at 8:23 PM UTC+00:00 | Comments (0) | TrackBack

October 27, 2005

Does Visual Studio Rot the Mind?

I discovered a very interesting publication by Charles Petzold entitled Does Visual Studio Rot the Mind? Petzold is a Microsoft-oriented software developer, and this publication was a talk he delivered to the NYC .NET Developers Group on October 20. I think it is pretty insightful reading that all software developers should read. The only error is that I believe many of the features discussed by Petzold were first introduced by IDEs other than Visual Studio.

Posted by josuah at 4:27 PM UTC+00:00 | Comments (0) | TrackBack