maborakreader-news Mailing List for AJax Framework / Maborak RSS Reader
Status: Beta
Brought to you by:
maborak
You can subscribe to this list here.
2008 |
Jan
|
Feb
|
Mar
(3) |
Apr
|
May
(10) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
---|
From: Maborak r. <ma...@ma...> - 2008-05-06 18:36:50
|
<table style='font:normal 8pt sans-serif;border-collapse:collapse;width:100%;'> <tr> <td background='http://js.maborak.com/maborak/core/images/grid.title.gray.gif' style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;' colspan='2'>phpaddiction</td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;font-weight:bold;padding-left:15px;background-color:#E7E7E7;' colspan='2'>PHP Weekly Reader - April 27th 2008</td> </tr> <tr> <td style='border:1px solid #AAA;padding:15px;background-color:#FAFAFA;' colspan='2'>Performance Everybody is expecting lots of traffic. Thats the trend of last weeks posts anyway, there were at least 7 articles on the subject. It is one of my favorite topics, unfortunately I never have enough traffic to see any of them actually solve a problem for me. .htaccess - gzip and cache your [...]</td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Link:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a style='color:#A62C2C;text-decoration:none;font-weight:bold;' href='http://feeds.feedburner.com/~r/Phpaddiction/~3/280572837/'>http://feeds.feedburner.com/~r/Phpaddiction/~3/280572837/</a></td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Rss reader:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a href='http://rss.maborak.com'>http://rss.maborak.com</a></td> </tr> </table> |
From: Maborak r. <ma...@ma...> - 2008-05-06 18:35:44
|
<table style='font:normal 8pt sans-serif;border-collapse:collapse;width:100%;'> <tr> <td background='http://js.maborak.com/maborak/core/images/grid.title.gray.gif' style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;' colspan='2'>Coding Horror</td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;font-weight:bold;padding-left:15px;background-color:#E7E7E7;' colspan='2'>Should All Developers Have Manycore CPUs?</td> </tr> <tr> <td style='border:1px solid #AAA;padding:15px;background-color:#FAFAFA;' colspan='2'><p> Dual core CPUs are effectively standard today, and for good reason -- there are substantial, demonstrable performance improvements to be gained from having a second CPU on standby to fulfill requests that the first CPU is too busy to handle. If nothing else, <b>dual-core CPUs protect you from badly written software</b>; if a crashed program consumes all possible CPU time, all it can get is 50% of your CPU. There's still another CPU available to ensure that the operating system can let you kill CrashyApp 5.80 SP1 Enterprise Edition in a reasonable fashion. It's the <a href="http://en.wikipedia.org/wiki/Buddy_system">buddy system</a> in silicon form. <p> My <a href="http://www.codinghorror.com/blog/archives/001102.html">previous post on upgrading the CPU in your PC</a> was more controversial than I intended. Here's what I wrote: <p> <blockquote> In my opinion, quad-core CPUs are still a <a href="http://www.codinghorror.com/blog/archives/000942.html">waste of electricity</a> unless you're putting them in a server. Four cores on the desktop is great for bragging rights and mathematical superiority (yep, 4 > 2), but those four cores <a href="http://www.codinghorror.com/blog/archives/000655.html">provide almost no benchmarkable improvement</a> in the type of applications most people use. Including software development tools. </blockquote> <p> It's unfortunate, because this statement overshadowed the rest of the post. All I wanted to do here is <b>encourage people to make an <i>informed</i> decision in selecting a CPU</b>. Really, pick any CPU you want; the important part of that post is being unafraid to upgrade your PC. Insofar as the above paragraph distracted readers from that goal, I apologize. <p> However, I do have strong feelings on this topic. All too often I see users seduced by Intel's marketing department, blindly assuming that if two CPU cores is faster than one CPU core, then, well.. four, eight, or sixteen must be <i>insanely</i> fast! And out comes their wallet. I fear that many users fall prey to marketing weasels and end up paying a premium for performance that, for them, will never materialize. It's like the bad old days of the Pentium 4 again, except for absurd megahertz clock speeds, substitute an absurd number of CPU cores. <p> I want people to understand that <b>there are only a handful of applications that can truly benefit from more than 2 CPU cores</b>, and they tend to cluster tightly around certain specialized areas. To me, it's all about the <a href="http://www.codinghorror.com/blog/archives/000942.html">benchmark</a> <a href="http://www.codinghorror.com/blog/archives/000655.html">data</a>, and the benchmarks just don't show any compelling reason to go quad-core unless you regularly do one of the following: <p> <ul> <li>"rip" or encode video <li>render 3D scenes professionally <li>run scientific simulations </ul> <p> If you frequently do any of the above, there's <i>no question</i> that a quad-core (or octa-core) is the right choice. But this is merely my recommendation based on the benchmark data, not iron-clad fact. It's your money. Spend it how you like. All I'm proposing is that you spend it knowledgably. <p> Ah, but then there's the <b>multitasking argument</b>. I implored commenters who felt strongly about the benefits of quad-core to point me to multitasking benchmarks that showed a profound difference in performance between 2 and more-than-2 CPU cores. It's curious. The web is awash in zillions of hardware review websites, yet you can barely find any multitasking benchmarks on any of them. I think it's because <b>the amount of multitasking required to seriously load more than two CPU cores borders on the absurd</b>, as <a href="http://www.anandtech.com/printarticle.aspx?i=2879">Anand points out</a>: <p> <blockquote> When we were trying to think up new multitasking benchmarks to truly stress Kentsfield and Quad FX [quad-core] platforms we kept running into these interesting but fairly out-there scenarios that did a great job of stressing our test beds, but a terrible job and making a case for how you could use quad-core today. </blockquote> <p> What you will find, however, is this benchmarking refrain repeated again and <a href="http://techreport.com/articles.x/14424/7">again</a>: <p> <blockquote> Like most of the desktop applications out there today, including its component apps, WorldBench doesn't gain much from more than two CPU cores. </blockquote> <p> That said, I think I made a mistake in my original statement. <b>Software developers aren't typical users</b>. Indeed, you can make a reasonable case that software developers are almost by definition edge conditions and thus they should <i>seek out </i> many-core CPUs, as <a href="http://brokencoder.com/">Kevin</a> said in the comments: <p> <blockquote> How would you suggest developers write applications (this is what we are, and what we do, right?) that can actually leverage 4, 8, etc... CPU cores if we are running solo or dual core systems? I put this right up there with having multiple monitors. Developers need them, and not just to improve productivity, but because they won't under stand just how badly their application runs across multiple monitors unless they actually use it. The same is true with multi-core CPUs. </blockquote> <p> I have two answers to this. One of them you probably won't like. <p> Let's start with the first one. <b>I absolutely agree that it is important for software developers to consider multi-core software development</b>, and owning one on their desktop is a prerequisite. I originally wrote about this way, way back in 2004 in <a href="http://www.codinghorror.com/blog/archives/000169.html">Threading, Concurrency, and the Most Powerful Psychokinetic Explosive in the Universe</a>. In fact, two of the people I quoted in that old article -- true leaders in the field of concurrent programming -- both posted direct responses to my article yesterday, and they deserve a response. <p> Rick Brewster, of the <a href="http://www.codinghorror.com/blog/archives/000993.html">seriously amazing Paint.NET project</a>, had this to say in a comment: <p> <blockquote> Huh? Paint.NET, for one, shows large gains on quad-core versus dual-core systems. There's even <a href="http://paintdotnet.forumer.com/viewtopic.php?f=16&t=21669">a benchmark</a>. I'd say that qualifies as "applications most people use." </blockquote> <p> He's absolutely right. A quad-core Q6700 @ 2.66 GHz trounces my dual-core E8500 @ 4.0 GHz on this benchmark, to the tune of 26 seconds vs. 31 seconds. But with all due respect to Rick -- and seriously, I absolutely adore <a href="http://www.codinghorror.com/blog/archives/000993.html">Paint.NET</a> and his multithreading code is <a href="http://blog.getpaint.net/2008/03/23/paintnet-just-can%E2%80%99t-satisfy-an-8-core-opteron/">incredible</a> -- I feel this benchmark tests specialized (and highly parallelizable) filters more than core functionality. There's a long history of <a href="http://www.barefeats.com/quad11.html">Photoshop benchmarking</a> along the same lines; it's the 3D rendering case minus one dimension. If you spend a significant part of your day in Photoshop, you should absolutely pick the platform that runs it fastest. <p> But we're developers, not designers. We spend all our time talking to compilers and interpreters and editors of various sorts. <a href="http://en.wikipedia.org/wiki/Herb_Sutter">Herb Sutter</a> posted an entire blog entry clarifying that, indeed, <a href="http://herbsutter.wordpress.com/2008/04/18/quad-core-a-waste-of-electricity/">software development tools do take advantage of quad-core CPUs</a>: <p> <blockquote> You must not be using the right tools. :-) For example, here are three I'm familiar with: <ol> <li>Visual C++ 2008's <a href="http://msdn2.microsoft.com/en-us/library/bb385193.aspx">/MP flag</a> tells the compiler to compile files in the same project in parallel. <li>Since Visual Studio 2005 we've supported <a href="http://msdn2.microsoft.com/en-us/library/9h3z1a69.aspx">parallel project builds</a> in Batch Build mode <li>Excel 2007 does <a href="http://msdn2.microsoft.com/en-us/library/bb687899.aspx">parallel recalculation</a>. Assuming the spreadsheet is large and doesn't just contain sequential dependencies between cells, it usually scales linearly up to at least 8 cores. </ol> </blockquote> <p> Herb is an industry expert on concurrent programming and general C++ guru, and of course he's right on all three counts. I had completely forgotten about C++ compilation, or maybe it's more fair to say <i>I blocked it out</i>. What do you expect from a guy with a BASIC lineage? Compilation time is a huge productivity drain for C++ developers working on large projects. Compilation time using <code>gcc</code> and <code>time make -j<# of cores + 1></code> is the granddaddy of all multi-core programmer benchmarks. Here's a representative result for <a href="http://www.phoronix.com/scan.php?page=article&item=585&num=4">compiling the LAME 3.97 source</a>: <p> <table width=400 cellpadding=4 cellspacing=4> <tr><td>1</td><td>Xeon E5150 (2.66 GHz Dual-Core)</td><td align="right">12.06 sec</td></tr> <tr><td>1</td><td>Xeon E5320 (1.86 GHz Quad-Core)</td><td align="right">11.08 sec</td></tr> <tr><td>2x</td><td>Xeon E5150</td><td align="right">8.26 sec</td></tr> <tr><td>2x</td><td>Xeon E5320</td><td align="right">8.45 sec</td></tr> </table> <p> The absolute numbers seem kind of small, but the percentages are incredibly compelling, particularly as you add up the number of times you compile every day. <b>If you're a C++ developer, you <i>need</i> a quad-core CPU yesterday.</b> Demand it. <p> But what about us managed code developers, with our lack of pointers and explicit memory allocations? Herb mentioned the parallel project builds setting in Visual Studio 2008; it's under Tools, Options, Projects and Solutions, Build and Run. <p> <img alt="Visual Studio 2008 parallel project build settings" src="http://www.codinghorror.com/blog/images/visual-studio-parallel-project-build-settings.png" width="424" height="100" border="0" /> <p> As promised, it's defaulting to the number of cores I have in my PC -- two. I downloaded the very largest .NET project I could think of off the top of my head, <a href="http://www.icsharpcode.net/OpenSource/SD/Download/">SharpDevelop</a>. The solution is satisfyingly huge; it contains 60 projects. I compiled it a few times in Visual Studio 2008, but task manager wasn't showing much use of even my measly little two cores: <p> <img alt="Visual Studio 2008 Compilation, Task Manager CPU time" src="http://www.codinghorror.com/blog/images/visual-studio-2008-compilation-task-manager.png" width="464" height="166" border="0" /> <p> I did see a few peaks above 50%, but it's an awfully tepid result compared to the <code>make -j4</code> one. I see nothing here that indicates any kind of possible managed code compilation time performance improvement from moving to more than 2 cores. I'm sort of curious if Java compilers (or other .NET-like language compilers) do a better job of this. <p> Getting back to Kevin's question: yes, if you are a software developer writing a desktop application that has something remotely parallelizable in it, <b>you should have whatever number of CPU cores on the desktop you need to test and debug your code</b>. I suggest starting with a goal of scaling well to two cores, as that appears to be the most challenging part of the journey. Beyond that, good luck and godspeed, because everything I've ever read on the topic of writing scalable, concurrent software goes out of its way to explain in excruciating detail how hellishly difficult this kind of code is to write. <p> Here's the second part of the answer I promised you earlier. The one you might not like. <b>Most developers <i>aren't</i> writing desktop applications today. They're writing web applications.</b> Many of them may be writing in scripting languages that aren't compiled, but interpreted, like Ruby or Python or PHP. Heck, they're probably not even threaded. And yet this code somehow achieves massive levels of concurrency, scales to huge workloads, and drives some of the largest websites on the internet. All that, without thinking one iota about concurrency, threading, or reentrancy. It's sort of magical, if you think about it. <p> So in the sense that mainstream developers are modelling server workloads on their desktops, I agree, they <i>do</i> probably need as many cores as they can get. <p> <table><tr><td class="sidead"> [advertisement] <a href="http://www.datadynamics.com/Products/ProductOverview.aspx?Product=DDRPT&r=codinghorrorbp" rel="nofollow">Data Dynamics Reports</a>: An easy-to-use reporting platform for .NET developers. Master Reports, Data Visualizers, <a href="http://www.datadynamics.com/Products/ProductFeatures.aspx?Product=DDRPT&Topic=Dashboard%20for%20Data%20Dynamics%20Reports&r=codinghorrorbp" rel="nofollow">Dashboard controls</a> and more! </td></tr> </table> <p></td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Link:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a style='color:#A62C2C;text-decoration:none;font-weight:bold;' href='http://www.codinghorror.com/blog/archives/001103.html'>http://www.codinghorror.com/blog/archives/001103.html</a></td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Rss reader:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a href='http://rss.maborak.com'>http://rss.maborak.com</a></td> </tr> </table> |
From: Maborak r. <ma...@ma...> - 2008-05-06 18:31:28
|
<table style='font:normal 8pt sans-serif;border-collapse:collapse;width:100%;'> <tr> <td background='http://js.maborak.com/maborak/core/images/grid.title.gray.gif' style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;' colspan='2'>Coding Horror</td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;font-weight:bold;padding-left:15px;background-color:#E7E7E7;' colspan='2'>Behold WordPress, Destroyer of CPUs</td> </tr> <tr> <td style='border:1px solid #AAA;padding:15px;background-color:#FAFAFA;' colspan='2'><p> Lately I've been delving into the <a href="http://wordpress.org/">WordPress</a> ecosystem, as it seems to be the most popular blogging platform around at the moment. I've set up two blogs with it so far. In the process, I've gotten quite comfortable with the setup, interface, and overall operation of WordPress. <p> <ol> <li><a href="http://blog.stackoverflow.com/">blog.stackoverflow.com</a> <li><a href="http://www.fakeplasticrock.com/">www.fakeplasticrock.com</a> </ol> <p> I've been thoroughly impressed with the community around WordPress, and the software itself is remarkably polished. That's not to say that I haven't run into a few egregious bugs in the 2.5 release, but on the whole, the experience has been good bordering on pleasant. <p> Or at least it <i>was</i>, until I noticed how much CPU time the PHP FastCGI process was using for modest little old blog.stackoverflow.com. <p> <img alt="WordPress CPU Usage, Before" src="http://www.codinghorror.com/blog/images/wordpress-cpu-usage-before.png" width="515" height="136" border="0" /> <p> For context, this is running on a Windows Web Server 2008 virtual machine with a single core of a 2.13 GHz Xeon 3210 entirely dedicated to it. <p> This is an <i>incredibly</i> scary result; blog.stackoverflow.com is getting, at best, a <b>moderate trickle of incoming traffic</b>. It's barely linked anywhere! With that kind of CPU load level, this site would fall over instantaneously if it got remotely popular, or God forbid, anywhere <i>near</i> the front page of a social bookmarking website. <p> For a bare-bones blog which is doing approximately nothing, this is a completely unacceptable result. It's appalling. <p> As evidence of what a systemic problem this is, there's an entire cottage industry built around shoehorning better caching behavior into WordPress. Take your pick: <a href="http://mnm.uib.es/gallir/wp-cache-2/">WP-Cache</a>, <a href="http://ocaoimh.ie/wp-super-cache/">WP-Super-Cache</a>, or <a href="http://error.wordpress.com/2006/07/04/bad-behavior-2/">Bad Behavior</a>. The caching add-ins <a href="http://www.allaboutduncan.com/index.php/2008/wp-cache-on-iis-finally/">don't work very well under IIS</a> because they assume they're running on a *NIX platform, but they can be coerced into working. <p> Does it work? Does it ever. Here's what CPU usage looks like with basic WP-Cache type functionality enabled: <p> <img alt="WordPress CPU usage with WP-Cache" src="http://www.codinghorror.com/blog/images/wordpress-cpu-usage-after.png" width="515" height="136" border="0" /> <p> I'm not alone; just do a web search on <a href="http://www.google.com/search?q=wordpress+'cpu+usage'">WordPress CPU usage</a> or <a href="http://www.google.com/search?q=wordpress+'digg+effect'">WordPress Digg Effect</a> and you'll find page after page of horror stories, most (all?) of which are solved by the swift and judicious application of the WP-Cache plugins. <p> It's not like this a new issue. Personally, I think it's absolutely irresponsible that <b>WP-Cache like functionality isn't already built into WordPress.</b> I would not even consider deploying WordPress anywhere without it. And yet, according to a <a href="http://wp-community.org/2008/04/06/episode-39/">recent podcast</a>, Matt Mullenweg dismisses it out of hand and hand-wavingly alludes to vague TechCrunch server reconfigurations. <p> A default WordPress install will query the database twenty times every time you refresh the page, even if not <i>one single element</i> on that page has changed. Doesn't that strike you as a bad idea? Maybe even, dare I say it, <i>sloppy programming?</i> <p> I understand that users may have umpteen thousand <a href="http://wordpress.org/extend/plugins/">WordPress plugins</a> installed, all of which demand to change on every page load. Yes, the easiest path, the path of least resistance, is to mindlessly query the database every time you're building a page. But I <i>cannot</i> accept that a default, bare-bones WordPress install hasn't the first clue how to cache and avoid expensive, redundant trips to the database. <p> It's frustrating, because caching is a completely solved problem in other programming communities. For example, the .NET framework has had <a href="http://msdn2.microsoft.com/en-us/library/aa478965.aspx">page output caching</a> and <a href="http://msdn2.microsoft.com/en-us/library/h30h475z(VS.71).aspx">page fragment output caching</a> baked into ASP.NET for years. <p> I sure am glad I started this blog in <a href="http://www.movabletype.org/">Movable Type</a> way back in 2004. Their classic <a href="http://www.sixapart.com/blog/2005/05/how-to-speed-up-publishing-in.html">static rendering</a> blog engine approach may be derided today, but I shudder to think of the number of times the Coding Horror webserver would have been completely incapacitated over the years by the naive -- no, that's too tame -- brainlessly stupid dynamic rendering approach WordPress uses. <p> What I just don't understand is why, after all these years, and all these documented problems, WordPress hasn't <b>folded WP-Cache into the core</b>. If you're ever planning to have traffic of any size on a WordPress blog, consider yourselves warned. <p> <font color="red">Update</font>: Matt Mullenweg kindly responded to this post and offered <a href="http://www.codinghorror.com/blog/files/matt-mullenweg-wordpress-mysql-recommendations.txt">his recommended MySQL configuration optimizations</a>. I definitely agree that the Query Cache is extremely important to performance, and for some reason it defaulted to off (zero size) on my installation. You may also want to look into <a href="http://www.xaprb.com/blog/2006/07/02/innotop-mysql-innodb-monitor/">innotop</a> and <a href="http://hackmysql.com/mysqlreport">mysqlreport</a> to ensure that all your MySQL caches are functioning at appropriate levels. Also, thanks to a few commenters for letting me know that one of this year's Google Summer of Code projects is <a href="http://code.google.com/soc/2008/wordpress/appinfo.html?csaid=7E1A38664ABC103C">integrating caching into the core WordPress code</a>. It is badly needed. <p> <table><tr><td class="sidead"> [advertisement] <a href="http://www.datadynamics.com/Products/ProductFeatures.aspx?Product=DDRPT&Topic=Dashboard%20for%20Data%20Dynamics%20Reports&r=codinghorrorbp" rel="nofollow">Dashboard</a> for <a href="http://www.datadynamics.com/Products/ProductOverview.aspx?Product=DDRPT&r=codinghorrorbp" rel="nofollow">Data Dynamics Reports</a> introduces new controls designed to create dashboards that inform without wasting space or confusing users. </td></tr> </table> <p></td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Link:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a style='color:#A62C2C;text-decoration:none;font-weight:bold;' href='http://www.codinghorror.com/blog/archives/001105.html'>http://www.codinghorror.com/blog/archives/001105.html</a></td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Rss reader:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a href='http://rss.maborak.com'>http://rss.maborak.com</a></td> </tr> </table> |
From: Maborak r. <ma...@ma...> - 2008-05-06 18:31:24
|
<table style='font:normal 8pt sans-serif;border-collapse:collapse;width:100%;'> <tr> <td background='http://js.maborak.com/maborak/core/images/grid.title.gray.gif' style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;' colspan='2'>Coding Horror</td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;font-weight:bold;padding-left:15px;background-color:#E7E7E7;' colspan='2'>Everything I Needed to Know About Programming I Learned from BASIC</td> </tr> <tr> <td style='border:1px solid #AAA;padding:15px;background-color:#FAFAFA;' colspan='2'><p> <a href="http://en.wikipedia.org/wiki/Edsger_Dijkstra">Edsger Dijkstra </a> had <a href="http://www.cs.virginia.edu/~evans/cs655-S00/readings/ewd498.html">this</a> to say about Beginner's All Purpose Symbolic Instruction Code: <p> <blockquote> It is practically impossible to teach good programming style to students that have had prior exposure to BASIC; as potential programmers they are mentally mutilated beyond hope of regeneration. </blockquote> <p> I'm sure he was exaggerating here for effect; as much as I admire his <a href="http://www.codinghorror.com/blog/archives/000051.html">1972 "The Humble Programmer" paper</a>, it's hard to square that humility with the idea that choosing the wrong programming language will damage the programmer's mind. Although <a href="http://www.codinghorror.com/blog/archives/000686.html">computer languages continue to evolve</a>, the largest hurdle I see isn't any particular choice of language, but the fact that <a href="http://www.codinghorror.com/blog/archives/000272.html">programmers can write FORTRAN in any language</a>. To quote Pogo, we have met the enemy, and <a href="http://upload.wikimedia.org/wikipedia/en/4/49/Pogo_-_Earth_Day_1971_poster.jpg">he is us</a>. <p> Dismissing BASIC does seem rather elitist. Like many programmers of a certain age, <b>I grew up with BASIC</b>. <p> I mentioned in <a href="http://www.codinghorror.com/blog/archives/001096.html">an earlier post</a> the curious collision of early console gaming and programming that was the <a href="http://www.atariage.com/software_page.html?SoftwareLabelID=15">Atari 2600 BASIC Programming cartridge</a>. I had to see this for myself, so I bought a copy on eBay. <p> <img alt="Atari 2600 basic programming cartridge" src="http://www.codinghorror.com/blog/images/atari-2600-basic-programming-cartridge.JPG" width="490" height="367" border="0" /> <p> I also bought a set of the Atari 2600 <a href="http://www.atariage.com/controller_page.html?SystemID=2600&ControllerID=4">keypad controllers</a>. The overlays come with the cartridge, and the controllers mate together to make a primitive sort of keyboard. (Also, if you were wondering what kinds of things I do with my ad revenue, buying crap like this is a big part of it, sadly.) <p> <img alt="Atari 2600 BASIC programming keypads" src="http://www.codinghorror.com/blog/images/atari-2600-basic-programming-keypads.jpg" width="600" height="498" border="0" /> <p> Surprisingly, the manual isn't available anywhere online, so <a href="http://www.flickr.com/photos/25885309@N02/sets/72157604661612578/">I scanned it in myself</a>. Take a look. It's <i>hilarious</i>. There is a <a href="http://www.atariage.com/manual_html_page.html?SoftwareLabelID=15">transcribed HTML version of the manual</a>, but it's much less fun to read without the pictures and diagrams. <p> I booted up a copy of the <a href="http://www.atariage.com/2600/roms/BasicProgramming.zip">Basic Programming ROM</a> in the <a href="http://stella.sourceforge.net/">Stella Atari 2600 emulator</a>, then followed along with the manual and wrote a little BASIC program. <p> <img alt="Atari 2600 BASIC Programming Screenshot" src="http://www.codinghorror.com/blog/images/atari-2600-basic-programming-screenshot.png" width="640" height="420" border="0" /> <p> You'll notice that all the other screenshots of Atari 2600 Basic Programming on the web are essentially blank. That's probably because <b>I'm the only person crazy enough to actually try <i>programming</i> in this thing</b>. It may look painful, but you have no idea until you've tried to work with this funky "IDE". It's hilariously bad. I could barely stop laughing while punching away at my virtual keypads. But I have to confess, after writing my first "program", I got that same visceral little thrill of bending the machine to my will that I've always gotten. <p> The package I got from eBay included a few hand-written programming notes that I assume are from the 1980s. <p> <img alt="Atari 2600 sample code" src="http://www.codinghorror.com/blog/images/atari-2600-sample-code.jpg" width="641" height="324" border="0" /> <p> Isn't that what BASIC -- even this horribly crippled, elephant man Atari 2600 version of BASIC -- is all about? Discovering fundamental programming concepts? <p> Of course, if you were at all interested in computers, you wouldn't bother programming on a dinky Atari 2600. There were much better options for gaming <i>and</i> programming in the form of home computers. And for the longest time, <b>every home computer you could buy had BASIC burned into the ROM.</b> Whether it was the Apple //, Commodore 64, or the Atari 800, you'd boot up to be greeted by a BASIC prompt. It became the native language of the hobbyist programmer. <p> <img alt="basic on the Apple // series" src="http://www.codinghorror.com/blog/images/basic-apple.png" width="562" height="127" border="0" /> <p> <img alt="basic on the Atari 8-bit series" src="http://www.codinghorror.com/blog/images/basic-atari.png" width="640" height="105" border="0" /> <p> <img alt="basic on the Commodore 64" src="http://www.codinghorror.com/blog/images/basic-commodore.png" width="640" height="80" border="0" /> <p> Even the IBM PC had <a href="http://en.wikipedia.org/wiki/BASICA">BASICA</a>, <a href="http://en.wikipedia.org/wiki/Microsoft_GW-BASIC_interpreter">GW-BASIC</a> and finally <a href="http://en.wikipedia.org/wiki/QBasic">QBasic</a>, which was phased out with Windows 2000. <p> It's true that if you wanted to do anything remotely cutting-edge with those old 8-bit Apple, Commodore and Atari home computers, you had to pretty much learn assembly language. I don't recall any compiled languages on the scene until the IBM PC and DOS era, primarily <a href="http://en.wikipedia.org/wiki/Turbo_Pascal">Turbo Pascal</a>. Compiled languages were esoteric and expensive until the great democratization of Turbo Pascal at its low, low price point of $49.99.* <p> Even if you lacked the programming skills to become the next <a href="http://en.wikipedia.org/wiki/David_Crane_(programmer)">David Crane</a> or <a href="http://en.wikipedia.org/wiki/Will_Wright_(game_designer)">Will Wright</a>, there were still a lot of interesting games and programs you could still write in good old BASIC. Certainly more than enough to figure out if you enjoyed programming, and if you had any talent. The <a href="http://www.codinghorror.com/blog/archives/000414.html">Creative Computing compilations</a> were like programming bibles to us. <p> <a href="http://www.atariarchives.org/basicgames/"><img alt="BASIC Computer Games" src="http://www.codinghorror.com/blog/images/basic-computer-games.png" width="364" height="483" border="0" /></a> <a href="http://www.atariarchives.org/morebasicgames/"><img alt="More BASIC Computer Games" src="http://www.codinghorror.com/blog/images/more-basic-computer-games.png" width="359" height="485" border="0" /></a> <p> For a long, long time, <b>if you were interested in computers at all, you programmed in BASIC.</b> It was as unavoidable and inevitable as the air you breathed. Every time you booted up, there was that command prompt blinking away at you. Why <i>not </i> type in some BASIC commands and see what happens? And then the sense of wonder, of possibility, of being able to unlock the infinitely malleable universe inside your computer. Thus the careers of millions of programmers were launched. <p> BASIC didn't mutilate the mind, as Dijkstra claimed. If anything, BASIC opened the minds of millions of young programmers. It was perhaps the earliest test to determine whether you were <a href="http://www.codinghorror.com/blog/archives/000635.html">a programming sheep or a non-programming goat</a>. Not all will be good, of course, but some inevitably <a href="http://jamesshore.com/Articles/Quality-With-a-Name.html">will go on to be great</a>. <p> Whether we're still programming in it or not, <b>the spirit of BASIC lives on in all of us.</b> <p> * as an aside, you may notice that <a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg">Anders Hejlsberg</a> was the primary author of Turbo Pascal and later Delphi; he's now a <a href="http://www.microsoft.com/presspass/exec/techfellow/Hejlsberg/default.mspx">Technical Fellow at Microsoft</a> and the chief designer of the C# language. That's a big reason why so many longtime geeks, such as myself, are so gung-ho about .NET. <p> <table><tr><td class="sidead"> [advertisement] <a href="http://www.datadynamics.com/Products/ProductFeatures.aspx?Product=DDRPT&Topic=Enhancements%20from%20RDL&r=codinghorrorbp" rel="nofollow">Don't denormalize your data</a> just to write reports! <a href="http://www.datadynamics.com/Products/ProductOverview.aspx?Product=DDRPT&r=codinghorrorbp" rel="nofollow">Data Dynamics Reports</a> can use your existing data relationships when creating reports. </td></tr> </table> <p></td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Link:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a style='color:#A62C2C;text-decoration:none;font-weight:bold;' href='http://www.codinghorror.com/blog/archives/001104.html'>http://www.codinghorror.com/blog/archives/001104.html</a></td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Rss reader:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a href='http://rss.maborak.com'>http://rss.maborak.com</a></td> </tr> </table> |
From: Maborak r. <ma...@ma...> - 2008-05-06 18:31:10
|
<table style='font:normal 8pt sans-serif;border-collapse:collapse;width:100%;'> <tr> <td background='http://js.maborak.com/maborak/core/images/grid.title.gray.gif' style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;' colspan='2'>Coding Horror</td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;font-weight:bold;padding-left:15px;background-color:#E7E7E7;' colspan='2'>The Problem with Software Registration</td> </tr> <tr> <td style='border:1px solid #AAA;padding:15px;background-color:#FAFAFA;' colspan='2'><p> As a person who has spent a significant part of his professional life getting paid to write software, I believe it's <b>important for me to regularly pay for software</b>, too. Our programmer salaries don't come from magical money trees. They come from customers laying down cold, hard cash for the software we've built. That's why every month I try to put into action what I described in <a href="http://www.codinghorror.com/blog/archives/000735.html">Support Your Favorite Small Software Vendor Day</a>: <p> <blockquote> Check your hard drive, and I'm sure you, too, will find some bit of software written by a small software development shop, maybe even a single developer. Something you find incredibly useful. Something you rely on every day. Something you recommend without reservation to friends and peers. Something that makes using the computer that much more enjoyable. Or at least less painful. <p> <b>Stop reading this post right now and buy that software.</b> If it's not commercial software, don't let that stop you. Share the love by sending money to the person/shop/organization that created it. </blockquote> <p> As I encounter apps that I find helpful and use regularly, I go out of my way to support them by either <a href="http://www.codinghorror.com/blog/archives/000993.html">donating</a>, or registering and buying a license. It's just plain good karma. There's nothing more effective than voting with your wallet. As I see it, if you don't vote, you aren't entitled to have an opinion. <p> But here's what I find deeply troubling: often, <b>registering software leaves me with a worse experience than not registering</b>. Allow me to illustrate with an example. <p> I've been transferring our podcast files back and forth to <a href="http://blog.stackoverflow.com/">blog.stackoverflow.com</a> via FTP, so I reinstalled <a href="http://www.smartftp.com/">SmartFTP</a>. Now, I've used SmartFTP quite a bit over the years, but never bothered to pay for it. They've done a great job of regularly improving and enhancing it every time I use it again. That's exactly the kind of useful, living software project I want to support. <p> Until I register, I'm presented with this little nag screen every time I start SmartFTP. It's mildly annoying, but tolerable -- and it prominently features a convenient "buy me" button. Hey! That's what I want to do! <p> <img alt="SmartFTP license reminder" src="http://www.codinghorror.com/blog/images/smartftp-license-reminder.png" width="467" height="385" border="0" /> <p> I click that button and get whisked away to a website where I'm now confronted with a choice: home or professional? <p> <img alt="SmartFTP product editions" src="http://www.codinghorror.com/blog/images/smartftp-product-editions.png" width="662" height="198" border="0" /> <p> Gee, I don't know. I'm conflicted. Now I have to think about what <i>features</i> I want, and how much I'm willing to pay for said features. <p> This is already starting to be kind of a drag. <p> I now feel like I'm being gamed. There's a name for this game, and unfortunately it's not something fun and cool like Grand Theft Auto IV -- this particular game is called <a href="http://www.joelonsoftware.com/articles/CamelsandRubberDuckies.html">capturing consumer surplus</a>. <p> <blockquote> Let's do this. Instead of charging $220, let's ask each of our customers if they are rich or if they are poor. If they say they're rich, we'll charge them $349. If they say they're poor, we'll charge them $220. <p> Now how much do we make? <p> Notice the quantities: we're still selling the same 233 copies, but the richest 42 customers, who were all willing to spend $349 or more, are being asked to spend $349. And our profits just went up! from $43K to about $48K! NICE! </blockquote> <p> Any resemblance between this and <a href="http://www.penny-arcade.com/comic/2007/02/02/">Windows Vista Kenny Loggins edition</a> is, I'm sure, purely coincidence. I finally decide I'm a "home" FTP user, whatever the heck that means. I suspect it's a sneaky marketing weasel synonym for "cheap bastard". <p> As a reward, now I get to play <i>another</i> game called <b>fill out the giant order form</b>. You've played this one before. Note that in this particular game, you can score bonus points for trying to route this form through your complex corporate payment system. <p> <img alt="SmartFTP order form" src="http://www.codinghorror.com/blog/images/smartftp-order-form.png" width="424" height="479" border="0" style="border:1px gray solid;" /> <p> After all that, I manage to pay. It's a sort of unavoidable flat tax on effort for any form of online commerce. Eventually, I receive this in my email inbox: <p> <img alt="SmartFTP license email" src="http://www.codinghorror.com/blog/images/smartftp-license-email.png" style="border:1px gray solid;" width="554" height="294" border="0" /> <p> Now I have <i>three</i> choices. None of which make a whole lot of sense on my initial reading. It looks like there's some kind of key file I'm going to need? I'll try the middle link to download it. I don't really want another executable of unknown provenance on my system. After downloading the license file, I use the help menu to install it: <p> <img alt="SmartFTP license installation" src="http://www.codinghorror.com/blog/images/smartftp-license-installation.png" width="388" height="201" border="0" /> <p> Et Voilà! In only <i>sixteen fun and easy steps</i>, I have registered this software and voted with my wallet! <p> But that registration is only the beginning of my problems: <p> <ul> <li>I now need to keep track of a license file. <li>The license is probably tied to a particular computer, so if I reinstall the OS, or upgrade the hardware, that license might break. <li>If I lose my license, I need to remember my login credentials on the vendor's website to retrieve them. <li>My license is only valid for one year. When that year is up, I need to go through these motions and re-license the software yet again. </ul> <p> Now-- and here's the kicker-- <b>multiply all this licensing pain by the number of applications and people in your organization.</b> <p> Even for a solo user like me, it's bad. I have apps I've registered and paid for that I somehow never got license keys for, such as WinRAR. I have apps that I simply don't use because I'm too lazy to re-register them on my new install, such as EditPad Pro. I've long since lost track of what versions of which apps I have valid registrations for. You can imagine the kind of fun that awaits me at the end of any new system build, a virtual jamboree of re-registrations. <p> Now let's compare that with the process of <b>"registering" the open source FTP tool FileZilla</b>: <p> <ol> <li><a href="http://filezilla-project.org/download.php?type=client">Download FileZilla</a> <li><a href="http://filezilla-project.org/donate.php">Donate</a> $36.95 to the project </ol> <p> Oh, and step three? <i>There is no step three!</i> I never have to think about registration, licensing, or any of that other crap again. Ever! <p> There's no doubt that SmartFTP is the superior FTP client. I'm more than happy to register and reward them for their years of development work. But in the future, I think I'll be voting with my wallet for <b>the registration process that makes my life easier, not harder.</b> <p> <table><tr><td class="sidead"> [advertisement] <a href="http://www.datadynamics.com/Products/ProductOverview.aspx?Product=DDRPT&r=codinghorrorbp" rel="nofollow">Data Dynamics Reports</a>: An easy-to-use reporting platform for .NET developers. Master Reports, Data Visualizers, <a href="http://www.datadynamics.com/Products/ProductFeatures.aspx?Product=DDRPT&Topic=Dashboard%20for%20Data%20Dynamics%20Reports&r=codinghorrorbp" rel="nofollow">Dashboard controls</a> and more! </td></tr> </table> <p></td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Link:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a style='color:#A62C2C;text-decoration:none;font-weight:bold;' href='http://www.codinghorror.com/blog/archives/001106.html'>http://www.codinghorror.com/blog/archives/001106.html</a></td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Rss reader:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a href='http://rss.maborak.com'>http://rss.maborak.com</a></td> </tr> </table> |
From: Maborak r. <ma...@ma...> - 2008-05-06 18:31:02
|
<table style='font:normal 8pt sans-serif;border-collapse:collapse;width:100%;'> <tr> <td background='http://js.maborak.com/maborak/core/images/grid.title.gray.gif' style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;' colspan='2'>Coding Horror</td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;font-weight:bold;padding-left:15px;background-color:#E7E7E7;' colspan='2'>Building Your Own Home Theater PC</td> </tr> <tr> <td style='border:1px solid #AAA;padding:15px;background-color:#FAFAFA;' colspan='2'><p>I've kept a PC in my living room for the past three years as <a href= "http://www.codinghorror.com/blog/archives/000784.html">my primary home theater interface</a>, and I heartily recommend it. It's shocking <b>how cheap and easy it is to build a home theater PC these days</b>.</p> <p>I've been pondering an upgrade to <a href="http://www.codinghorror.com/blog/archives/000221.html">my creaky old home theater PC</a>, and rave reviews of the new integrated AMD platform at <a href= "http://techreport.com/articles.x/14261/1">Tech Report</a>, <a href= "http://www.silentpcreview.com/article807-page1.html">Silent PC Review</a>, and <a href="http://www.tomshardware.com/reviews/amd-780g-chipset,1785.html">Tom's Hardware</a> finally pushed me over the edge.</p> <table cellpadding="4" cellspacing="4" width="500"> <tr> <td>CPU</td> <td><a href= "http://www.jdoqocy.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16819103257%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Processors-_-AMD-_-19103257&cjsku=N82E16819103257"> AMD Athlon X2 4050e 2.1 GHz</a> (45w)</td> <td>$70</td> </tr> <tr> <td>Mobo</td> <td><a href= "http://www.jdoqocy.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16813128090%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Motherboards%2B-%2BAMD-_-GIGABYTE-_-13128090&cjsku=N82E16813128090"> Gigabyte GA-MA78GM-S2H Micro ATX</a></td> <td>$100</td> </tr> <tr> <td>RAM</td> <td><a href= "http://www.tkqlhce.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16820134635%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Memory%2B%28Desktop%2BMemory%29-_-Kingston%2BTechnology-_-20134635&cjsku=N82E16820134635"> Kingston 2GB DDR2 800</a></td> <td>$39</td> </tr> <tr> <td>PSU</td> <td><a href= "http://www.kqzyfj.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16817151058%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Power%2BSupplies-_-SeaSonic%2BUSA-_-17151058&cjsku=N82E16817151058"> Seasonic ECO 300W</a></td> <td>$55</td> </tr> <tr> <td>DVD</td> <td><a href= "http://www.kqzyfj.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16827106057%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-CD%2FDVD%2BBurners%2B%28RW%2BDrives%29-_-Lite-On-_-27106057&cjsku=N82E16827106057"> Lite-On 20X DVD±R SATA</a></td> <td>$29</td> </tr> </table> <p>I didn't buy the PSU because I already have that particular model, but I bought everything else on this list for a grand total of <b>less than 250 bucks.</b> (You can save a bit on the power supply, but I don't recommend it, particularly if you plan to leave your HTPC running 24/7. <a href="http://www.codinghorror.com/blog/archives/000871.html">Efficient power supplies</a> not only save you money on electricity in the long run, but also tend to be of generally higher quality, and quieter to boot.)</p> <p>The new <a href="http://www.amd.com/us-en/0,,3715_15532,00.html?redir=780g1">AMD 780G</a> platform is striking in its simplicity. Just pop in the RAM and the low-power Athlon X2 CPU and you have an (almost) complete ultra low-power home theater PC. Just check out the awesome array of rear panel connections:</p> <p><img src="http://www.codinghorror.com/blog/images/new-htpc-mobo.jpg" width="730" height="394" border="0"></p> <p>We have the expected stuff (4x USB, gigabit ethernet), but the exciting part is <b>DVI, VGA, and HDMI video out!</b> Not to mention optical digital out for beautiful, pristine digital audio direct to your receiver. Those are the key connections for a home theater PC. We even have an eSATA port and firewire thrown in, which is always nice.</p> <p> I simply dropped the new motherboard and DVD in my existing transparent acrylic Micro-ATX PC case, replacing the old stuff. (If you're thinking of going this route, I can recommend the <a href="http://www.tkqlhce.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16811129039%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Cases%2B%28Computer%2BCases%2B-%2BATX%2BForm%29-_-Antec-_-11129039&cjsku=N82E16811129039">Antec Minuet Micro-ATX case</a> for $100, which conveniently comes with an efficient power supply, too -- but be aware of the half-height expansion slots.) </p> <p><img alt="new-htpc-mobo-installed.jpg" src="http://www.codinghorror.com/blog/images/new-htpc-mobo-installed.jpg" width="730" height="588" border="0"></p> <p>I kept my existing hard drives (a small 2.5" boot drive for low noise / power consumption, and giant capacity 3.5" drives for long-term storage and recording), and my <a href= "http://www.dpbolvw.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16815116632%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Video%2BDevices%2B%2B%2BTV%2BTuners-_-Hauppauge-_-15116632&cjsku=N82E16815116632"> Hauppauge PVR-150 dual analog PCI tuner card</a>, which I love to death.</p> <p>For the longest time, <i>integrated</i> graphics was synonymous with <i>craptacular</i> graphics. That's not the case for this new AMD 780g chipset. The integrated graphics are fully DirectX 10 compliant, comparable to the latest entry-level discrete video cards. Gaming isn't our goal, though this would be perfectly adequate for many games. More importantly for a HTPC build, the integrated graphics support <a href="http://www.techreport.com/articles.x/14261/9">the full suite of H.264 and WMV video playback acceleration</a>.</p> <p><img alt="new-htpc-windows-experience.png" src= "http://www.codinghorror.com/blog/images/new-htpc-windows-experience.png" width="552" height="219" border="0"></p> <p>I know a WEI graphics score of 3.5 doesn't sound like much, but brother, let me tell you -- this is light years ahead of anything else on the market at this power consumption point.</p> <p>My old Pentium-M single core <a href="http://www.codinghorror.com/blog/archives/000746.html">struggled to play back 1080p videos</a>. The Athlon X2 4050e CPU I chose is one of AMD's low power dual core models, far from top of the line. The testers at SilentPCReview found <b>any modern dual core chip</b> is <a href= "http://www.silentpcreview.com/article807-page8.html">more than enough</a> for the most strenuous of video playback tasks:</p> <blockquote>Gradually underclocking the CPU, we found that the Blu Ray disc began to stutter at about 1.1Ghz, while audio glitches were detected in the WVC1 clip at 1.4Ghz. 1.5Ghz was the lowest clock speed that would smoothly play back all our clips. This was a fantastic result as the lowest clocked X2 on the market is 2.0 Ghz.</blockquote> <p>AMD is a better choice for a home theater PC because their idle voltage and multiplier throttling -- the marketing term is "Cool n' Quiet" -- is outstanding. (I'm also glad to have the opportunity to support AMD because I'm desperately afraid of a world where Intel is the only CPU vendor. And you should be too.) This variant of the Athlon 64 X2 chip is so new that <a href="http://www.cpuid.com/cpuz.php">CPU-Z</a> doesn't quite recognize it by name. But as you can see, at idle, it clocks down to a miserly 1 GHz and reduces its power consumption to barely over one volt.</p> <p><img alt="new-htpc-cpuz.png" src="http://www.codinghorror.com/blog/images/new-htpc-cpuz.png" width="384" height= "410" border="0"></p> <p>My old highly optimized HTPC build consumed <font color="red">just under 80 watts at idle</font>, up from around 65 before I began upgrading it to make it more Vista friendly. Guess how much this new HTPC platform build, which is <b>more than twice as powerful</b>, consumes at idle? Let's whip out <a href= "http://www.codinghorror.com/blog/archives/001099.html">our handy dandy kill-a-watt</a> and find out:</p> <p><img alt="new-htpc-watt-reading.jpg" src="http://www.codinghorror.com/blog/images/new-htpc-watt-reading.jpg" width= "500" height="382" border="0"></p> <p><font color="red">FORTY. SIX. WATTS.</font></p> <p>That is flippin' <i>amazing</i>. We're talking about a powerful modern PC here, with quite a bit of additional hardware you wouldn't find in most PCs, including a <a href= "http://www.dpbolvw.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16815116632%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Video%2BDevices%2B%2B%2BTV%2BTuners-_-Hauppauge-_-15116632&cjsku=N82E16815116632"> dual TV tuner PCI card</a> and three hard drives. Granted two of those drives are in sleep mode most of the time, but still. 46 watts -- twice the power at almost half the energy consumption! Incredible! Silence and efficiency were nowhere <i>near</i> this easy three or four years ago.</p> <p>Needless to say, I'm pretty excited about this particular $250 upgrade, and I can sell my old parts to underwrite it.</p> <p>On the software front, as I mentioned at the top, I've been a fan of Windows Media Center <a href= "http://www.codinghorror.com/blog/archives/000100.html">since the first version</a>; it's one of the best products to come out of Redmond in years, and <a href="http://www.codinghorror.com/blog/archives/000784.html">the version of Media Center bundled with Vista</a> (well, Ultimate and Home Premium, anyway) is the best yet. With a hardware setup this compelling, I'm sure you'll have no problem at all mating it with your favorite HTPC software.</p> <p>If you do end up running Windows and connecting your HTPC to a DVI or HDMI capable television, beware. Getting an exact, pixel-for-pixel connection between your HTPC and your TV isn't easy. For example, I had trouble getting the ATI Catalyst graphics driver to accept <b>852x480, the standard resolution of our old plasma EDTV</b>. Sure 800x600 worked fine, but the aspect ratio was totally off. That's where <a href= "http://www.entechtaiwan.com/util/ps.shtm">PowerStrip</a> comes in.</p> <p><img alt="PowerStrip advanced timing options" src= "http://www.codinghorror.com/blog/images/powerstrip-advanced-timing-options.png" width="628" height="426" border= "0"></p> <p>PowerStrip will let you achieve that ideal pixel-for-pixel perfect connection between your graphics card and your television. I selected the built in EDTV preset as a custom resolution, and all was well. PowerStrip is <i>the</i> go-to utility for tweaking home theater display output.</p> <p><b>We use our home theater PC every day.</b> It's silent, draws very little power, and it's small enough to tuck away cleanly in our living room decor. It plays <i>anything</i> through a slick 10-foot UI, and offers unrestricted access to the web at any time. Putting a great one together today is almost ridiculously easy. If you haven't considered building your own home theater PC -- why not?</p> <p> <font color="red">UPDATE</font>: since people asked, here's a complete from-scratch build list for a home theater PC. </p> <table cellpadding="4" cellspacing="4" width="500"> <tr> <td>CPU</td> <td><a href= "http://www.jdoqocy.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16819103257%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Processors-_-AMD-_-19103257&cjsku=N82E16819103257"> AMD Athlon X2 4050e 2.1 GHz</a> (45w)</td> <td>$70</td> </tr> <tr> <td>Mobo</td> <td><a href= "http://www.jdoqocy.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16813128090%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Motherboards%2B-%2BAMD-_-GIGABYTE-_-13128090&cjsku=N82E16813128090"> Gigabyte GA-MA78GM-S2H Micro ATX</a></td> <td>$100</td> </tr> <tr> <td>RAM</td> <td><a href= "http://www.tkqlhce.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16820134635%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Memory%2B%28Desktop%2BMemory%29-_-Kingston%2BTechnology-_-20134635&cjsku=N82E16820134635"> Kingston 2GB DDR2 800</a></td> <td>$40</td> </tr> <tr> <td>DVD</td> <td><a href= "http://www.kqzyfj.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16827106057%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-CD%2FDVD%2BBurners%2B%28RW%2BDrives%29-_-Lite-On-_-27106057&cjsku=N82E16827106057"> Lite-On 20X DVD±R SATA</a></td> <td>$30</td> </tr> <tr> <td>Case/PSU</td> <td><a href="http://www.tkqlhce.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16811129039%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Cases%2B%28Computer%2BCases%2B-%2BATX%2BForm%29-_-Antec-_-11129039&cjsku=N82E16811129039">Antec Minuet</a> w/80plus certified PSU</td> <td>$100</td> </tr> <tr> <td>HDD</td> <td><a href="http://www.kqzyfj.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16822136149%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Hard%2BDrives-_-Western%2BDigital-_-22136149&cjsku=N82E16822136149">Western Digital quiet 500 GB</a> </td> <td> $90 </td> </tr> <tr> <td> Tuner </td> <td> <a href="http://www.kqzyfj.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16815116629%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Video%2BDevices%2B%2B%2BTV%2BTuners-_-Hauppauge-_-15116629&cjsku=N82E16815116629">Hauppauge low profile analog cable/TV</a> </td> <td> $76 </td> </tr> <tr> <td> Remote </td> <td> <a href="http://www.tkqlhce.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16880121001%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Digital%2BMedia%2BRemote-_-Anyware-_-80121001&cjsku=N82E16880121001">Standard Media Center IR</a> </td> <td> $17 </td> </tr> <tr> <td></td> <td></td> <td><b>$523</b></td> </tr> </table> <p>If you plan to use Vista Media Center, add a <a href="http://www.dpbolvw.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16832116485%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Software%2B-%2BOperating%2BSystems-_-Microsoft-_-32116485&cjsku=N82E16832116485">Vista Home Premium SP1 license for $110</a>. I also saw that Blu-Ray internal drives (read only) are down to $130 as of the time I'm writing this.</p> <table> <tr> <td class="sidead">[advertisement] <a href= "http://www.datadynamics.com/Products/ProductFeatures.aspx?Product=DDRPT&Topic=Enhancements%20from%20RDL&r=codinghorrorbp" rel="nofollow">Don't denormalize your data</a> just to write reports! <a href= "http://www.datadynamics.com/Products/ProductOverview.aspx?Product=DDRPT&r=codinghorrorbp" rel="nofollow">Data Dynamics Reports</a> can use your existing data relationships when creating reports.</td> </tr> </table> <p></td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Link:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a style='color:#A62C2C;text-decoration:none;font-weight:bold;' href='http://www.codinghorror.com/blog/archives/001107.html'>http://www.codinghorror.com/blog/archives/001107.html</a></td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Rss reader:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a href='http://rss.maborak.com'>http://rss.maborak.com</a></td> </tr> </table> |
From: Maborak r. <ma...@ma...> - 2008-05-06 18:27:54
|
<table style='font:normal 8pt sans-serif;border-collapse:collapse;width:100%;'> <tr> <td background='http://js.maborak.com/maborak/core/images/grid.title.gray.gif' style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;' colspan='2'>Coding Horror</td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;font-weight:bold;padding-left:15px;background-color:#E7E7E7;' colspan='2'>Programmers Don't Read Books -- But You Should</td> </tr> <tr> <td style='border:1px solid #AAA;padding:15px;background-color:#FAFAFA;' colspan='2'><p> One of the central themes of stackoverflow.com is that software developers no longer learn programming from books, as <a href="http://www.joelonsoftware.com/items/2008/04/16.html">Joel mentioned</a>: <p> <blockquote> Programmers seem to have stopped reading books. The market for books on programming topics is miniscule compared to the number of working programmers. </blockquote> <p> Joel expressed similar sentiments in 2004's <a href="http://archive.salon.com/tech/feature/2004/12/09/spolsky/print.html">The Shlemiel Way of Software</a>: <p> <blockquote> But the majority of people still don't read. Or write. The majority of developers don't read books about software development, they don't read Web sites about software development, they don't even read Slashdot. </blockquote> <p> If programmers don't learn from books today, how do they learn to program? They do it the old-fashioned way: by rolling up their sleeves and <i>writing code</i> -- while harnessing the collective wisdom of the internet in a second window. The internet has rendered programming books obsolete. It's faster, more efficient, and just plain <i>smarter</i> to get your programming information online. I believe Doug McCune's experience, which he aptly describes as <a href="http://dougmccune.com/blog/2007/03/23/why-i-dont-read-books/">Why I Don't Read Books</a>, is fairly typical. <p> I lay part of the blame squarely at the feet of the technical book publishing industry: <p> <ol> <li><b>Most programming books suck.</b> The barrier to being a book author, as near as I can tell, is virtually nonexistent. The signal to noise of book publishing is arguably not a heck of a lot better than what you'll find on the wilds of the internet. Of the hundreds of programming books released every year, perhaps two are three are truly worth the time investment. <p></p> <li><b>Programming books sold by weight, not by volume</b>. There seems to be an inverse relationship between the size of a programming book and its quality. The bigger the book, somehow, the less useful information it will contain. What is the point of these giant wanna-be reference tomes? How do you <i>find</i> anything in it, much less lift the damn things? <p></p> <li><b>Quick-fix programming books oriented towards novices</b>. I have nothing against novices entering the programming field. But I continue to believe the "Learn [Insert Language Here] in 24 hours!" variety of books are <a href="http://www.codinghorror.com/blog/archives/000560.html">doing our profession a disservice</a>. The monomaniacal focus on <i>right now</i> and the fastest, easiest possible way to do things leads beginners down the wrong path -- or as I like to call it, "PHP". I kid! I kid! <p></p> <li><b>Programming book pornography</b>. The idea that having a pile of thick, important-looking programming books sitting on your shelf, largely unread, will somehow make you a better programmer. As <a href="http://sarkies.blogspot.com/">David Poole</a> once related to me in email, "I'd never get to do that in real life" seems to be the theme of the programming book porn pile. This is why I considered, and rejected, buying Knuth's <a href="http://www-cs-staff.stanford.edu/~knuth/taocp.html">Art of Computer Programming</a>. Try to purchase practical books you'll actually read, and more importantly, put into action. </ol> <p> As an author, I'm guilty, too. I co-wrote a programming book, and <a href="http://www.codinghorror.com/blog/archives/000971.html">I <i>still</i> don't think you should buy it</a>. I don't mean that in an ironic-trucker-hat, reverse-psychology way. I mean it quite literally. It's not a bad book by any means. I have the utmost respect for my <a href="http://haacked.com">esteemed</a> <a href="http://odetocode.com/blogs/scott/default.aspx">co</a>-<a href="http://weblogs.asp.net/jgalloway/">authors</a>. But the same information would be far more accessible on the web. Trapping it inside a dead tree book is ultimately a waste of effort. <p> The internet has certainly accelerated the demise of programming books, but there is some evidence that, even pre-internet, programmers didn't read all that many programming books. I was quite surprised to encounter the following passage in <a href="http://www.amazon.com/exec/obidos/ASIN/0735619670/codinghorror-20">Code Complete</a>: <p> <blockquote> Pat yourself on the back for reading this book. You're already learning more than most people in the software industry because <b>one book is more than most programmers read each year</b> (DeMarco and Lister 1999). A little reading goes a long way toward professional advancement. If you read even one good programming book every two months, roughly 35 pages a week, you'll soon have a firm grasp on the industry and distinguish yourself from nearly everyone around you. </blockquote> <p> I believe the same text is present in the original 1993 edition of Code Complete, but I no longer have a copy to verify that. A little searching uncovered the passage Steve McConnell is referencing in DeMarco and Lister's <a href="http://www.amazon.com/exec/obidos/ASIN/0932633439/codinghorror-20">Peopleware</a>: <p> <blockquote> The statistics about reading are particularly discouraging: <b>The average software developer, for example, doesn't own a single book on the subject of his or her work, and hasn't ever read one</b>. That fact is horrifying for anyone concerned about the quality of work in the field; for folks like us who write books, it is positively tragic. </blockquote> <p> It pains me greatly to <a href="http://reddit.com/info/6g2u2/comments/">read the reddit comments</a> and learn that people are interpreting the stackoverflow.com mission statement as a repudiation of programming books. As ambivalent as I am about the current programming book market, <b>I love programming books!</b> This very blog was founded on the concept of my <a href="http://www.codinghorror.com/blog/archives/000020.html">recommended developer reading list</a>. Many of my blog posts are my <a href="http://graysmatter.codivation.com/ThePragmaticProgrammerTheBestWayToPadYourBlogContentFor30Dollars.aspx">feeble attempts to explain key concepts</a> outlined long ago in classic programming books. <p> How to reconcile this seemingly contradictory statement, the <a href="http://www.codinghorror.com/blog/archives/000602.html">love and hate dynamic</a>? You see, there are programming books, and there are <i>programming books</i>. <p> The best programming books are timeless. They transcend choice of language, IDE, or platform. They do not explain how, but <i>why</i>. If you feel compelled to clean house on your bookshelf every five years, trust me on this, <b>you're buying the wrong programming books</b>. <p> I wouldn't trade my programming bookshelf for anything. I refer to it all the time. In fact, I referred to it <i>twice</i> while composing this very post. <p> <a href="/blog/images/my-programming-bookshelf-large.jpg" src="http://www.codinghorror.com/blog/images/my-programming-bookshelf-large.jpg" /><img alt="my-programming-bookshelf-small.jpg" src="http://www.codinghorror.com/blog/images/my-programming-bookshelf-small.jpg" width="650" height="535" border="0" /></a> <p> I won't belabor my <a href="http://www.codinghorror.com/blog/archives/000020.html">recommended reading list</a>, as I've kept it proudly the same for years. <p> But I do have this call to arms: <b>my top five programming books every working programmer should own -- and <i>read</i></b>. These seminal books are richly practical reads, year after year, no matter what kind of programming I'm doing. They reward repeated readings, offering deeper and more penetrating insights into software engineering every time I return to them, armed with a few more years of experience under my belt. If you haven't read these books, what are you waiting for? <p> <table cellpadding=4 cellspacing=4 width=650> <tr> <td valign="bottom" align="center"><a href="http://www.amazon.com/exec/obidos/ASIN/0735619670/codinghorror-20">Code Complete 2</a></td> <td valign="bottom" align="center"><a href="http://www.amazon.com/exec/obidos/ASIN/0321344758/codinghorror-20">Don't Make Me Think</a></td> <td valign="bottom" align="center"><a href="http://www.amazon.com/exec/obidos/ASIN/0932633439/codinghorror-20">Peopleware</a></td> <td valign="bottom" align="center"><a href="http://www.amazon.com/exec/obidos/ASIN/020161622X/codinghorror-20">Pragmatic Programmer</a></td> <td valign="bottom" align="center"><a href="http://www.amazon.com/exec/obidos/ASIN/0321117425/codinghorror-20">Facts and Fallacies</td> </tr> <tr> <td align="center"> <a href="http://www.amazon.com/exec/obidos/ASIN/0735619670/codinghorror-20"><img src="http://www.codinghorror.com/images/0735619670.01._PE32_PI_SCMZZZZZZZ_.jpg" height=140 border=0 /></a> </td> <td align="center"> <a href="http://www.amazon.com/exec/obidos/ASIN/0321344758/codinghorror-20"><img src="http://www.codinghorror.com/images/0789723107.01.MZZZZZZZ.jpg" height=140 border=0 /></a> </td> <td align="center"> <a href="http://www.amazon.com/exec/obidos/ASIN/0932633439/codinghorror-20"><img src="http://www.codinghorror.com/images/0932633439.01.MZZZZZZZ.gif" height=140 border=0 /></a> </td> <td align="center"> <a href="http://www.amazon.com/exec/obidos/ASIN/020161622X/codinghorror-20"><img src="http://www.codinghorror.com/images/020161622X.01.SCTZZZZZZZ.jpg" height=140 border=0 /></a> </td> <td> <a href="http://www.amazon.com/exec/obidos/ASIN/0321117425/codinghorror-20"><img src="http://www.codinghorror.com/blog/images/facts-and-fallacies-of-software-engineering.jpg" height=140 border=0 /></a> </td> </tr> </table> <p> It is my greatest intention to make <a href="http://www.stackoverflow.com">stackoverflow.com</a> highly <i>complementary</i> to these sorts of timeless, classic programming books. It is in no way, shape, or form meant as a replacement for them. <p> On the other hand, if you're the unfortunate author of <a href="http://perl.plover.com/reviews/p54d.html">Perl for Dummies</a>, then watch your back, because we're definitely gunning for you. <p> <table><tr><td class="sidead"> [advertisement] <a href="http://www.datadynamics.com/Products/ProductFeatures.aspx?Product=DDRPT&Topic=Dashboard%20for%20Data%20Dynamics%20Reports&r=codinghorrorbp" rel="nofollow">Dashboard</a> for <a href="http://www.datadynamics.com/Products/ProductOverview.aspx?Product=DDRPT&r=codinghorrorbp" rel="nofollow">Data Dynamics Reports</a> introduces new controls designed to create dashboards that inform without wasting space or confusing users. </td></tr> </table> <p></td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Link:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a style='color:#A62C2C;text-decoration:none;font-weight:bold;' href='http://www.codinghorror.com/blog/archives/001108.html'>http://www.codinghorror.com/blog/archives/001108.html</a></td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Rss reader:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a href='http://rss.maborak.com'>http://rss.maborak.com</a></td> </tr> </table> |
From: Maborak r. <ma...@ma...> - 2008-05-06 18:19:24
|
<table style='font:normal 8pt sans-serif;border-collapse:collapse;width:100%;'> <tr> <td background='http://js.maborak.com/maborak/core/images/grid.title.gray.gif' style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;' colspan='2'>Coding Horror</td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;font-weight:bold;padding-left:15px;background-color:#E7E7E7;' colspan='2'>Re-Encoding Your DVDs</td> </tr> <tr> <td style='border:1px solid #AAA;padding:15px;background-color:#FAFAFA;' colspan='2'><p> Like Donald Knuth, I think <a href="http://www.informit.com/articles/article.aspx?p=1193856">much of the current multicore hype is overrated</a>. <p> <blockquote> The machine I use today has dual processors. I get to use them both only when I'm running two independent jobs at the same time; that's nice, but it happens only a few minutes every week. If I had four processors, or eight, or more, I still wouldn't be any better off, considering the kind of work I do -- even though I'm using my computer almost every day during most of the day. So why should I be so happy about the future that hardware vendors promise? They think a magic bullet will come along to make multicores speed up my kind of work; I think it's a pipe dream. (No -- that's the wrong metaphor! "Pipelines" actually work for me, but threads don't. Maybe the word I want is "bubble.") </blockquote> <p> Despite that, I've acknowledged all along there are <a href="http://www.codinghorror.com/blog/archives/000942.html">certain narrow tasks</a> that the proliferation of CPU cores will make <i>dramatically</i> faster. And one of my very favorite tasks in that niche is <b>encoding your DVD collection</b>. <p> I bought my first DVD about 10 years ago. At the time, they were <a href="http://en.wikipedia.org/wiki/DVD#Technology">a technical marvel</a>: <p> <ul> <li>8.5 Gigabytes per side <li>720 x 480 MPEG-2 video at 30 frames per second <li>Dolby Digital (AC-3) or Digital Theater System (DTS) digital multichannel sound </ul> <p> Today, those specs are <a href="http://www.codinghorror.com/blog/archives/000747.html">rapidly becoming pedestrian</a> in the face of high definition cable, broadcast, and Blu-Ray discs. A few of the <a href="http://en.wikipedia.org/wiki/List_of_video_sharing_websites">video sharing websites</a> offer something perilously close to DVD quality already. <p> I say <b>the DVD is the new MP3</b>. We're going to start tossing these things around like candy. <p> Unlike audio CDs, DVDs are already compressed digital data. You could extract the files from the DVD as-is, and play them back to your heart's content. No re-encoding required. But like <a href="http://en.wikipedia.org/wiki/The_Six_Million_Dollar_Man">The Six Million Dollar Man</a>, we can rebuild them better than they were before. Video codecs have advanced tremendously since the heady days of MPEG-2. These new codecs <a href="http://www.codinghorror.com/blog/archives/000746.html">take a lot more playback horsepower than MPEG-2</a>, but offer comparable quality in about one-fourth the size. We can <b>turn our digital DVDs into <i>better</i> digital DVDs</b> through superior computer science. <p> But if you thought the <i>playback</i> performance demands of these new codecs were severe, wait until you see the <i>encoding</i> performance demands. It's <b>only in the last year or two that typical CPUs could encode new-fangled MPEG-4 or VC1 at anything even approaching real time</b>. But now, with extremely fast dual cores trickling all the way down to the mainstream, and quad-core CPUs carving out a decent share for themselves-- the average user could potentially rip and encode a typical DVD in less than 30 minutes. Per <a href="http://www.techarp.com/showarticle.aspx?artno=520">a recent H.264 benchmark dataset analysis</a>, you can statistically expect to <i>halve</i> your encode time when going from 2 to 4 cores.. and almost do it again when you go from 4 to 8! <p> <a href="http://www.techarp.com/showarticle.aspx?artno=520"><img alt="HD encoding benchmark results by CPU family" src="http://www.codinghorror.com/blog/images/cpu-hd-encoding-results.png" width="377" height="253" border="0" /></a> <p> It helps, too, that there's great free software like <a href="http://handbrake.fr/">Handbrake</a> which makes it easy to harness that embarassment of desktop CPU power to encode your DVDs. <p> <img alt="handbrake screenshot" src="http://www.codinghorror.com/blog/images/handbrake-screenshot.png" width="680" height="595" border="0" /> <p> Yes, there are an intimidating number of knobs and dials to potentially tweak here, but what I like about handbrake is that I largely don't have to. There are some logical presets on the right (clipped out of the screenshot for size, unfortunately) which will get you headed in the right direction: AppleTV, iPod, Film, Xbox 360, and so forth. I do set a handful of variables, like the overall bitrate -- I prefer something between 900 and 1200 -- and whether I need to deinterlace the source. But I mostly let Handbrake use its "auto" defaults, and get excellent results. If you're curious about the details, there's a <a href="http://www.modmini.com/theatre/howto/dvdjukebox/conversion.php">well-written description</a> of many of the Handbrake settings. <p> I had the most luck with the H.264 codec, which is aggressively multithreaded. I achieved 30-40 fps on my modest new <a href="http://www.codinghorror.com/blog/archives/001107.html">power efficient dual-core HTPC processor</a>, and upwards of 100 fps on my <a href="http://www.codinghorror.com/blog/archives/001102.html">overclocked 4 GHz dual-core</a>. Fortunately, Handbrake supports a batch encode mode, so you can queue up a bunch of jobs to run overnight. <p> I was <i>particularly</i> excited to find that I can pass the digital audio directly through <a href="http://trac.handbrake.fr/wiki/SurroundSoundGuide">using the "AC3" setting</a> for the audio encoder. That means, when playing these files back on a home theater PC, <b>the digital audio arrives at your receiver in exactly the same way it would from a DVD</b>, with a <a href="http://is.gd/9vc">few minor adjustments in ffdshow</a>. There is no audio degradation or conversion whatsoever! As something of an audiophile, I suffered mightily through many a re-encoded DVD that was downmixed to plain vanilla stereo over the years, so this is a huge step forward in my book. <p> So, in summary -- <b>nearly the same digital video quality, exactly the same digital audio quality, all wrapped up in a single file less than a quarter of the original size of the DVD.</b> Seriously, I get chills. It's geek nirvana. What's not to love about encoding your DVD collection? It's also a perfect use of those four CPU cores, which would otherwise lay idle 99% of the time. <p> Take, for example, one of my favorite movies, <a href="http://www.imdb.com/title/tt0387808/">Idiocracy</a>. I used Handbrake to convert this DVD from a set of files totalling 4.15 GB to a single 995 MB file, at almost no quality loss. See for yourself. <p> Still image captured from original DVD: <p> <img alt="idiocracy-tv dvd" src="http://www.codinghorror.com/blog/images/idiocracy-tv-dvd.jpg" width="784" height="439" border="0" /> <p> Still image captured from H.264 encoded video of DVD: <p> <img alt="idiocracy-tv h264" src="http://www.codinghorror.com/blog/images/idiocracy-tv-h264.jpg" width="781" height="425" border="0" /> <p> <p> The above still was used in an earlier post, <a href="http://www.codinghorror.com/blog/archives/000772.html">A World of Endless Advertising</a>. I love being able to grab a movie file over the network and quickly get the exact still I need for a blog post. Yes, there is a tiny loss of fidelity -- particularly in the chair shadows on the bottom left, and the grain of the wall texture at the upper left. But I'm willing to live with that compromise if it means I don't have to pull ginormous 8 GB ISO images files over the network. <p> Why re-encode DVDs you already own? For convenience, mostly -- so you can watch them on your mobile devices, on your PCs, laptops, and anything else that vaguely resembles a computer in your home. Might as well put all those CPU horses to proper use. <b>A re-encoded DVD is <i>so</i> much more flexible</b> than those physical hunks of round, reflective plastic. <p> <table> <tr> <td class="sidead">[advertisement] <a href= "http://www.datadynamics.com/Products/ProductFeatures.aspx?Product=DDRPT&Topic=Enhancements%20from%20RDL&r=codinghorrorbp" rel="nofollow">Don't denormalize your data</a> just to write reports! <a href= "http://www.datadynamics.com/Products/ProductOverview.aspx?Product=DDRPT&r=codinghorrorbp" rel="nofollow">Data Dynamics Reports</a> can use your existing data relationships when creating reports.</td> </tr> </table> <p></td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Link:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a style='color:#A62C2C;text-decoration:none;font-weight:bold;' href='http://www.codinghorror.com/blog/archives/001110.html'>http://www.codinghorror.com/blog/archives/001110.html</a></td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Rss reader:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a href='http://rss.maborak.com'>http://rss.maborak.com</a></td> </tr> </table> |
From: maborak <ma...@gm...> - 2008-05-06 18:12:58
|
*1.2.3* -- -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 ma...@gm... Ajax Crossbrowser Framework/Toolkit http://code.google.com/p/maborak/ http://www.maborak.com # Non-members may check out a read-only working copy anonymously over HTTP. svn checkout http://maborak.googlecode.com/svn/trunk/ maborak Laboratorio R.I.A. (Rich Internet Applications) ========================================================================== wi...@co... Colosa Inc. Calle Lisimaco Gutiérrez Nº 518 Sopocachi La Paz, Bolivia Te./Fax: (591-2) 241-0707 Movil: 762-25198 http://www.colosa.com http://www.processmaker.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.5 (GNU/Linux) Comment: http://firegpg.tuxfamily.org iD8DBQFG8Sv4UDywCJE87IQRAgeIAKDAsdXubzBtz9YmSbHyaO+mApQf6gCgmlSO KnKGdoEndJ1h3j5bpVsbMH8= =QDRN -----END PGP SIGNATURE----- |
From: Maborak r. <ma...@ma...> - 2008-05-06 16:30:16
|
<table style='font:normal 8pt sans-serif;border-collapse:collapse;width:100%;'> <tr> <td background='http://js.maborak.com/maborak/core/images/grid.title.gray.gif' style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;' colspan='2'>Coding Horror</td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;font-weight:bold;padding-left:15px;background-color:#E7E7E7;' colspan='2'>Understanding Model-View-Controller</td> </tr> <tr> <td style='border:1px solid #AAA;padding:15px;background-color:#FAFAFA;' colspan='2'><p> Like everything else in software engineering, it seems, the concept of <a href="http://en.wikipedia.org/wiki/Model-view-controller">Model-View-Controller</a> was originally invented by <a href="http://en.wikipedia.org/wiki/Smalltalk">Smalltalk</a> programmers. <p> More specifically, it was invented by one Smalltalk programmer, Trygve Reenskaug. Trygve maintains a page that <a href="http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html">explains the history of MVC</a> in his own words. He arrives at these definitions in a paper he published on December 10th, 1979: <p> <ol> <li><b>Models</b> <p> Models represent knowledge. A model could be a single object (rather uninteresting), or it could be some structure of objects. <p> There should be a one-to-one correspondence between the model and its parts on the one hand, and the represented world as perceived by the owner of the model on the other hand. <li><b>Views</b> <p> A view is a (visual) representation of its model. It would ordinarily highlight certain attributes of the model and suppress others. It is thus acting as a <i>presentation filter</i>. <p> A view is attached to its model (or model part) and gets the data necessary for the presentation from the model by asking questions. It may also update the model by sending appropriate messages. All these questions and messages have to be in the terminology of the model, the view will therefore have to know the semantics of the attributes of the model it represents. <li><b>Controllers</b> <p> A controller is the link between a user and the system. It provides the user with input by arranging for relevant views to present themselves in appropriate places on the screen. It provides means for user output by presenting the user with menus or other means of giving commands and data. The controller receives such user output, translates it into the appropriate messages and pass these messages on to one or more of the views. </ol> <p> It may seem like we're <a href="http://www.codinghorror.com/blog/archives/000165.html">deep in Architecture Astronaut territory</a> now, but bear with me. The MVC concepts are a little abstract, it's true, but it's an incredibly common pattern. It is literally all around you. In fact, let me bring it back down to Earth this way: you're looking at MVC <i>right now</i>. <p> <table cellpadding=4 cellspacing=4> <tr> <td><b>Model</b> = HTML</td> <td><b>View</b> = CSS</td> <td><b>Controller</b> = Browser</td> </tr> <tr> <td><a href="http://www.codinghorror.com/blog/archives/000474.html"><img alt="MVC: HTML = Model" src="http://www.codinghorror.com/blog/images/mvc-html.png" width="226" height="276" border="0" /></a></td> <td><a href="http://www.codinghorror.com/blog/archives/000474.html"><img alt="MVC: CSS = View" src="http://www.codinghorror.com/blog/images/mvc-css.png" width="226" height="276" border="0" /></a> </td> <td><a href="http://www.codinghorror.com/blog/archives/000474.html"><img alt="MVC: Browser = Controller" src="http://www.codinghorror.com/blog/images/mvc-browser.png" width="226" height="276" border="0" /></a> </td> </tr> </table> <p> This ubiquitous trifecta represents MVC almost perfectly. <p> <ol> <li>Model <p> The HTML is the "skeleton" of bedrock content. Text that communicates information to the reader. <li>View <p> The CSS adds visual style to the content. It is the "skin" that we use to flesh out our skeleton and give it a particular look. We can swap in different skins via CSS without altering the original content in any way. They are relatively, but not completely, independent. <p> <li>Controller <p> The browser is responsible for combining and rendering the CSS and HTML into a set of final, manipulatible pixels on the screen. It gathers input from the user and marshals it to any JavaScript code necessary for the page to function. But here, too, we have flexibility: we can plug in a different brower and get comparable results. Some browsers might render it faster, or with more fidelity, or with more bells and whistles. </ol> <p> So if you believe the web has been at all successful -- most signs I've seen point to <i>yes</i> -- then you also have to acknowledge <b>the incredible power of Model-View-Controller.</b> <p> It's no coincidence that many of the most popular web programming frameworks also <a href="http://en.wikipedia.org/wiki/Model-view-controller#Implementations_of_MVC_as_web-based_frameworks">encapsulate MVC principles</a>: Django, Ruby on Rails, CakePHP, Struts, and so forth. It's also officially creeping into ASP.NET under the fledgling <a href="http://www.asp.net/mvc/">ASP.NET MVC project</a>. <p> Just take a gander at the project layout in a <b>sample ASP.NET MVC project</b>: <p> <img alt="ASP.NET MVC project organization" src="http://www.codinghorror.com/blog/images/mvc-aspnet.png" width="226" height="433" border="0" /> <p> It's <i>almost</i> self-explanatory, if you've ever built an application of any kind: <p> <ol> <li>Model <p> The classes which are used to store and manipulate state, typically in a database of some kind. <li>View <p> The user interface bits (in this case, HTML) necessary to render the model to the user. <li>Controller <p> The brains of the application. The controller decides what the user's input was, how the model needs to change as a result of that input, and which resulting view should be used. </ol> <p> It's beautiful in its simplicity, <a href="http://www.artima.com/lejava/articles/stringtemplate.html">as Terence Parr notes</a>: <p> <blockquote> For the "MVC" of a web app, I make a direct analogy with the Smalltalk notion of MVC. The model is any of the logic or the database or any of the data itself. The view is simply how you lay the data out, how it is displayed. If you want a subset of some data, for example, my opinion is that is a responsibility of the model. The model knows how to make a subset. You should not be asking your graphics designer to filter a list according to age or some other criteria. <p> The controller in a web app is a bit more complicated, because it has two parts. The first part is the web server (such as a servlet container) that maps incoming HTTP URL requests to a particular handler for that request. The second part is those handlers themselves, which are in fact often called "controllers." So the C in a web app MVC includes both the web server "overlord" that routes requests to handlers and the logic of those handlers themselves, which pull the data from the database and push it into the template. This controller also receives HTTP POST requests and processes these, sometimes updating the database. <p> I look at a website as nothing but a graph with edges with POSTs and GETs that routes pages. </blockquote> <p> Here's one quick way to test if your application has properly segregated itself between the Model, View, and Controller roles: <b>is your app skinnable?</b> <p> <blockquote> My experience is that designers don't understand loops or any kind of state. They do understand templates with holes in them. Everybody understands mail merge. And if you say, "Apply the bold template to this hole," they kind of get that, too. So separating model and view addresses this very important practical problem of how to have designers work with coders. <p> The other problem is there is no way to do multiple site skins properly if you don't have proper separation of concerns. If you are doing code generation or sites with different skins on them, there is no way to properly make a new skin by simply copying and pasting the old skin and changing it. If you have the view and the logic together, when you make a copy of the view you copy the logic as well. That breaks one of our primary rules as developers: have only one place to change anything. </blockquote> <p> <b>Skinnability cuts to the very heart of the MVC pattern.</b> If your app <i>isn't</i> "skinnable", that means you've probably gotten your model's chocolate in your view's peanut butter, quite by accident. You should refactor your code so that only the controller is responsible for poking the model data through the relatively static templates represented by the view. <p> The power and simplicity of properly implemented MVC is undeniable. But the first step to harnessing MVC is to understand <i>why</i> it works, both on the web, and also within your own applications. <p> <table><tr><td class="sidead"> [advertisement] <a href="http://www.datadynamics.com/Products/ProductOverview.aspx?Product=DDRPT&r=codinghorrorbp" rel="nofollow">Data Dynamics Reports</a>: An easy-to-use reporting platform for .NET developers. Master Reports, Data Visualizers, <a href="http://www.datadynamics.com/Products/ProductFeatures.aspx?Product=DDRPT&Topic=Dashboard%20for%20Data%20Dynamics%20Reports&r=codinghorrorbp" rel="nofollow">Dashboard controls</a> and more! </td></tr> </table> <p></td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Link:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a style='color:#A62C2C;text-decoration:none;font-weight:bold;' href='http://www.codinghorror.com/blog/archives/001112.html'>http://www.codinghorror.com/blog/archives/001112.html</a></td> </tr> <tr> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;'width:30%;>Rss reader:</td> <td style='border:1px solid #AAA;background-image:url(http://js.maborak.com/maborak/core/images/grid.title.gray.gif);background-repeat:repeat-x;background-position:0 0;padding:2px;background-position:0 -10;text-align:right;padding-right:15px;width:70%;text-align:left'><a href='http://rss.maborak.com'>http://rss.maborak.com</a></td> </tr> </table> |
From: maborak.com <ma...@gm...> - 2008-03-20 16:26:23
|
Release 0.2 Application: Maborak reader Framework Maborak |
From: maborak <ma...@gm...> - 2008-03-12 02:39:13
|
From: maborak <ma...@gm...> - 2008-03-11 19:21:22
|
-- -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 ma...@gm... Ajax Crossbrowser Framework/Toolkit http://code.google.com/p/maborak/ http://www.maborak.com # Non-members may check out a read-only working copy anonymously over HTTP. svn checkout http://maborak.googlecode.com/svn/trunk/ maborak Laboratorio R.I.A. (Rich Internet Applications) ========================================================================== wi...@co... Colosa Inc. Calle Lisimaco Gutiérrez Nº 518 Sopocachi La Paz, Bolivia Te./Fax: (591-2) 241-0707 Movil: 762-25198 http://www.colosa.com http://www.processmaker.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.5 (GNU/Linux) Comment: http://firegpg.tuxfamily.org iD8DBQFG8Sv4UDywCJE87IQRAgeIAKDAsdXubzBtz9YmSbHyaO+mApQf6gCgmlSO KnKGdoEndJ1h3j5bpVsbMH8= =QDRN -----END PGP SIGNATURE----- |