Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Tree: 04b141795c
Fetching contributors…

Cannot retrieve contributors at this time

594 lines (432 sloc) 21.262 kB
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Ingy 2.ö: March 2008</title>
<script type="text/javascript">(function() { var a=window;function c(b){this.t={};this.tick=function(d,i,e){e=e?e:(new Date).getTime();this.t[d]=[e,i]};this.tick("start",null,b)}var f=new c;a.jstiming={Timer:c,load:f};try{var g=null;if(a.chrome&&a.chrome.csi)g=Math.floor(a.chrome.csi().pageT);if(g==null)if(a.gtbExternal)g=a.gtbExternal.pageT();if(g==null)if(a.external)g=a.external.pageT;if(g)a.jstiming.pt=g}catch(h){};a.tickAboveFold=function(b){b=b;var d=0;if(b.offsetParent){do d+=b.offsetTop;while(b=b.offsetParent)}b=d;b<=750&&a.jstiming.load.tick("aft")};var j=false;function k(){if(!j){j=true;a.jstiming.load.tick("firstScrollTime")}}a.addEventListener?a.addEventListener("scroll",k,false):a.attachEvent("onscroll",k);
})();</script><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="MSSmartTagsPreventParsing" content="true" />
<meta name="generator" content="Blogger" />
<link rel="icon" type="image/vnd.microsoft.icon" href="http://www.blogger.com/favicon.ico"/>
<link rel="alternate" type="application/atom+xml" title="Ingy 2.ö - Atom" href="http://blog.ingy.net/atom.xml" />
<link rel="alternate" type="application/rss+xml" title="Ingy 2.ö - RSS" href="http://blog.ingy.net/rss.xml" />
<link rel="service.post" type="application/atom+xml" title="Ingy 2.ö - Atom" href="http://www.blogger.com/feeds/3953131606703729200/posts/default" />
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://www.blogger.com/rsd.g?blogID=3953131606703729200" />
<link rel="stylesheet" type="text/css" href="http://www.blogger.com/static/v1/v-css/50269083-blog_controls.css"/> <link rel="stylesheet" type="text/css" href="http://www.blogger.com/dyn-css/authorization.css?targetBlogID=3953131606703729200&zx=a9cc041b-fa11-4abc-98e7-11e974d3d51d"/>
<style type="text/css">
/*
Blogger Template Style
Name: TicTac
Author: Dan Cederholm
URL: www.simplebits.com
Date: 1 March 2004
*/
/* ---( page defaults )--- */
body {
margin: 0;
padding: 0;
font-family: Verdana, sans-serif;
font-size: small;
text-align: center;
color: #333;
background: #e0e0e0;
}
blockquote {
margin: 0 0 0 30px;
padding: 10px 0 0 20px;
font-size: 88%;
line-height: 1.5em;
color: #666;
background: url(http://www.blogblog.com/tictac/quotes.gif) no-repeat top left;
}
blockquote p {
margin-top: 0;
}
abbr, acronym {
cursor: help;
font-style: normal;
border-bottom: 1px dotted;
}
code {
color: #f63;
}
hr {
display: none;
}
img {
border: none;
}
/* unordered list style */
ul {
list-style: none;
margin: 0 0 20px 30px;
padding: 0;
}
li {
list-style: none;
padding-left: 14px;
margin-bottom: 3px;
background: url(http://www.blogblog.com/tictac/tictac_orange.gif) no-repeat 0 6px;
}
/* links */
a:link {
color: #69c;
}
a:visited {
color: #666699;
}
a:hover {
color: #693;
}
a:active {
color: #cc3333;
text-decoration: none;
}
/* ---( layout structure )---*/
@media all {
#wrap {
width: 847px;
margin: 0 auto;
text-align: left;
background: url(http://www.blogblog.com/tictac/tile.gif) repeat-y;
}
#content {
margin-left: 62px; /* to avoid the BMH */
}
#main-content {
float: left;
width: 460px;
margin: 20px 0 0 0;
padding: 0;
line-height: 1.5em;
}
#sidebar {
margin: 0 41px 0 547px;
padding: 20px 0 0 0;
font-size: 85%;
line-height: 1.4em;
color: #999;
background: url(http://www.blogblog.com/tictac/sidebar_bg.gif) no-repeat 0 0;
}
}
@media handheld {
#wrap {
width: 90%;
background: none;
}
#content {
margin:0 2% 0 2%;
}
#main-content {
float: none;
width: 100%;
}
#sidebar {
margin: 0 2% 0 2%;
}
}
/* ---( header and site name )--- */
@media all {
#blog-header {
margin: 0;
padding: 0;
font-family: "Lucida Grande", "Trebuchet MS";
background: #e0e0e0 url(http://www.blogblog.com/tictac/top_div.gif) no-repeat top left;
}
#blog-header h1 {
margin: 0;
padding: 45px 60px 50px 160px;
font-size: 200%;
color: #fff;
text-shadow: #81A75B 2px 2px 2px;
background: url(http://www.blogblog.com/tictac/top_h1.gif) no-repeat bottom left;
}
}
@media handheld {
#blog-header {
background: #99cc66;
}
#blog-header h1 {
background: none;
}
}
#blog-header h1 a {
text-decoration: none;
color: #fff;
}
#blog-header h1 a:hover {
color: #eee;
}
/* ---( main column )--- */
h2.date-header {
margin-top: 0;
padding-left: 14px;
font-size: 90%;
color: #f93;
background: url(http://www.blogblog.com/tictac/date_icon.gif) no-repeat 0 50%;
}
h3.post-title {
margin-top: 0;
font-family: "Lucida Grande", "Trebuchet MS";
font-size: 130%;
letter-spacing: -1px;
color: #f63;
}
.post {
margin: 0 0 1.5em 0;
padding: 0 0 1.5em 14px;
border-bottom: 1px solid #ddd;
}
.post-footer {
margin: 0;
padding: 0 0 0 14px;
font-size: 88%;
color: #999;
background: url(http://www.blogblog.com/tictac/tictac_grey.gif) no-repeat 0 8px;
}
.post img {
padding: 6px;
border-top: 1px solid #ddd;
border-left: 1px solid #ddd;
border-bottom: 1px solid #c0c0c0;
border-right: 1px solid #c0c0c0;
}
/* comment styles */
#comments {
padding-top: 10px;
font-size: 85%;
line-height: 1.5em;
color: #666;
background: #eee url(http://www.blogblog.com/tictac/comments_curve.gif) no-repeat top left;
}
#comments h4 {
margin: 20px 0 15px 0;
padding: 8px 0 0 40px;
font-family: "Lucida Grande", "Trebuchet MS";
font-size: 130%;
color: #666;
background: url(http://www.blogblog.com/tictac/bubbles.gif) no-repeat 10px 0;
height: 29px !important; /* for most browsers */
height /**/:37px; /* for IE5/Win */
}
#comments ul {
margin-left: 0;
}
#comments li {
background: none;
padding-left: 0;
}
.comment-body {
padding: 0 10px 0 25px;
background: url(http://www.blogblog.com/tictac/tictac_orange.gif) no-repeat 10px 5px;
}
.comment-body p {
margin-bottom: 0;
}
.comment-data {
margin: 4px 0 0 0;
padding: 0 10px 1em 60px;
color: #999;
border-bottom: 1px solid #ddd;
background: url(http://www.blogblog.com/tictac/comment_arrow.gif) no-repeat 44px 2px;
}
.deleted-comment {
font-style:italic;
color:gray;
}
/* ---( sidebar )--- */
h2.sidebar-title {
margin: 0 0 0 0;
padding: 25px 0 0 50px;
font-family: "Lucida Grande", "Trebuchet MS";
font-size: 130%;
color: #666;
height: 32px;
background: url(http://www.blogblog.com/tictac/sidebar_icon.gif) no-repeat 20px 15px;
height: 32px !important; /* for most browsers */
height /**/:57px; /* for IE5/Win */
}
#sidebar ul, #sidebar p {
margin: 0;
padding: 5px 20px 1em 20px;
border-bottom: 1px solid #ddd;
}
#sidebar li {
background: url(http://www.blogblog.com/tictac/tictac_green.gif) no-repeat 0 5px;
}
/* profile block */
.profile-datablock {
margin: 0;
padding: 5px 20px 0 20px;
}
.profile-datablock dd {
margin: 0;
padding: 0;
}
.profile-img img {
float: left;
margin: 0 10px 0 0;
padding: 4px;
border-top: 1px solid #ddd;
border-left: 1px solid #ddd;
border-bottom: 1px solid #c0c0c0;
border-right: 1px solid #c0c0c0;
background: #fff;
}
#sidebar p.profile-link {
padding-left: 36px;
background: url(http://www.blogblog.com/tictac/profile.gif) no-repeat 20px 4px;
}
p#powered-by, #sidebar p.profile-textblock {
margin-top: 1em;
border: none;
}
/* ---( footer )--- */
.clear { /* to fix IE6 padding-top issue */
clear: both;
height: 0;
}
@media all {
#footer {
margin: 0;
padding: 0 0 9px 0;
font-size: 85%;
color: #ddd;
background: url(http://www.blogblog.com/tictac/bottom_sill.gif) no-repeat bottom left;
}
#footer p {
margin: 0;
padding: 20px 320px 20px 95px;
background: url(http://www.blogblog.com/tictac/bottom_sash.gif) no-repeat top left;
}
}
@media handheld {
#footer {
background: none;
}
#footer p {
background: none;
}
}
/* Feeds
----------------------------------------------- */
#blogfeeds {
}
#postfeeds {
}
</style>
<!-- --><style type="text/css">@import url(http://www.blogger.com/static/v1/v-css/navbar/697174003-classic.css);
div.b-mobile {display:none;}
</style>
</head>
<body><script type="text/javascript">
function setAttributeOnload(object, attribute, val) {
if(window.addEventListener) {
window.addEventListener("load",
function(){ object[attribute] = val; }, false);
} else {
window.attachEvent('onload', function(){ object[attribute] = val; });
}
}
</script>
<iframe src="http://www.blogger.com/navbar.g?targetBlogID=3953131606703729200&amp;blogName=Ingy+2.%C3%B6&amp;publishMode=PUBLISH_MODE_FTP&amp;navbarType=BLUE&amp;layoutType=CLASSIC&amp;searchRoot=http%3A%2F%2Fblogsearch.google.com%2F&amp;blogLocale=en_US&amp;homepageUrl=http%3A%2F%2Fblog.ingy.net%2F" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" height="30px" width="100%" id="navbar-iframe" allowtransparency="true" title="Blogger Navigation and Search"></iframe>
<div></div>
<div id="wrap"> <!-- #wrap - for centering -->
<!-- Blog Header -->
<div id="blog-header">
<h1>
Ingy 2.ö
</h1>
</div>
<div id="content"> <!-- #content wrapper -->
<!-- Begin #main-content -->
<div id="main-content">
<h2 class="date-header">Monday, March 10, 2008</h2>
<!-- Begin .post -->
<div class="post"><a name="8107584619021489827"></a>
<h3 class="post-title">
Comprehensive Programming Archive Network
</h3>
<div class="post-body">
<p><div style="clear:both;"></div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blog.ingy.net/uploaded_images/Photo-141-771421.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://blog.ingy.net/uploaded_images/Photo-141-771416.jpg" alt="" border="0" /></a><br />Tonight I uploaded <a href="http://jquery.com/">jQuery</a> to <a href="http://search.cpan.org/">CPAN</a>.<br /><br />True. The 'j' in that sentence stands for JavaScript, and the 'P' stands for Perl. So why put a top notch JavaScript library on the world renowned archive network traditionally used for Perl?<br /><br />To me it's all just about programming. I have been a major Perl module author since 2000AD. Last time I checked, less than 10 people have more Perl modules on CPAN. For the last 3 years I have been hacking more JavaScript than Perl. I do this mostly for work, but since <a href="http://www.socialtext.com/">my work</a> supports Open Source, I have released much of this code as JavaScript modules on <a href="http://openjsan.org/">JSAN</a>. I happen to be the only person in the world with a module that is both on JSAN and CPAN; the <a href="http://jemplate.net/"><span style="font-weight: bold;">Jemplate</span></a> module, because it is half Perl and half JavaScript. (It lets Perl's famous Template Toolkit be used in JavaScript).<br /><br />JSAN was a really good idea, and led to some key people porting important parts of the Perl packaging framework to JavaScript. Especially the test framework. The result is that there is a fairly standard way to package JavaScript modules, especially if you are a CPAN guy like me.<br /><br />The problem is that there are only a very small handful of folks paying any attention to the upkeep of JSAN. Truthfully JSAN will never be close to what CPAN is. Fortunately, I have found out it really doesn't need to be. :)<br /><br />I started toying with the idea of putting other languages on CPAN about 5 years ago, but decided against it after discussing it with some Perl mongers at <a href="http://en.oreilly.com/oscon2008/public/content/home">OSCON</a>. I also started FreePAN.org in 2003 with the goal of making a CPAN for all languages, but that project never really took off.<br /><br />A couple weeks ago I started rethinking the whole thing. Certainly most languages have their own strong communities and distribution systems in 2008. But JavaScript (as a language) really doesn't. And almost every project I work on these days involves both Perl and JavaScript. And JSAN made JavaScript modules look like Perl modules. So I decided to look into how hard it would be to leverage CPAN for JavaScript's benefit. It was surprisingly easy.<br /><br />It turns out that if you put any file in the <span style="font-family:courier new;">lib/</span> directory of a CPAN module it will get installed. So, for example, <span style="font-family:courier new;">lib/jQuery.js</span> would be installed when the user runs <span style="font-family:courier new;">make install</span>.<br /><br />However, I decided that it wouldn't be too cool to put the jQuery package on CPAN and let the user figure out that it was JavaScript and not Perl. Besides, there is already a Perl module called <a href="http://search.cpan.org/dist/JQuery/">jQuery</a>! I decided to put all these modules in the JS namespace. So jQuery becomes <a href="http://search.cpan.org/dist/JS-jQuery/"><span style="font-family:courier new;">JS-jQuery</span></a> on CPAN.<br /><br />But what use is it to get JavaScript modules installed on your machine if JavaScript can't find them? I wrote a companion module called <a href="http://search.cpan.org/dist/JS/"><span style="font-family:courier new;">JS.pm</span></a>. This module lets you run a command like:<br /><br /><span style="font-family:courier new;"> > js-cpan jQuery.js</span> <span style="font-family:courier new;"> /Library/Perl/5.8.8/JS/jQuery.js</span><br /><br />So you can get the path names of the JavaScript modules you have on your system. You can then copy or symlink these modules into your web app. With a *nix command like this for example:<br /><br /><span style="font-family:courier new;"> ln -s `js-cpan jQuery.js` jquery.js</span><br />Now you can distribute Perl web apps on CPAN that require certain JavaScript modules, and have them be included in the standard way as Perl module prerequisites.<br /><br />For the most part, I plan to just upload my own JavaScript code to CPAN. But lately, almost everything I write in JavaScript relies on jQuery. It's just <span style="font-weight: bold; font-style: italic;">that</span> good. If JavaScript 2.0 ever comes out, it should have the jQuery core included in the spec. :)<div style="clear:both; padding-bottom:0.25em"></div></p>
</div>
<p class="post-footer">posted by ingydotnet at
<a class="post-footer-link" href="http://blog.ingy.net/2008/03/comprehensive-programming-archive.html" title="permanent link"> 2:35 PM </a>
|
<a class="comment-link" href="https://www.blogger.com/comment.g?blogID=3953131606703729200&postID=8107584619021489827"location.href=https://www.blogger.com/comment.g?blogID=3953131606703729200&postID=8107584619021489827;><span style="text-transform:lowercase">3 Comments</span></a>
<span class="item-control blog-admin pid-64200673"><a style="border:none;" href="http://www.blogger.com/post-edit.g?blogID=3953131606703729200&postID=8107584619021489827" title="Edit Post"><img class="icon-action" alt="" src="http://www.blogger.com:80/img/icon18_edit_allbkg.gif" height="18" width="18"></a></span></p>
</div>
<!-- End .post -->
<!-- Begin #comments -->
<!-- End #comments -->
<hr />
</div><!-- End #main-content -->
</div><!-- End #content -->
<!-- Begin #sidebar -->
<div id="sidebar">
<h2 class="sidebar-title">About</h2>
<p>The life and crimes of Ingy döt Net...</p>
<!-- Begin #profile-container -->
<div id="profile-container"><h2 class="sidebar-title">About Me</h2>
<dl class="profile-datablock"><dt class="profile-img"><a href="http://www.blogger.com/profile/13816997957671633491"><img src="http://assets1.twitter.com/system/user/profile_image/761225/normal/MyPicture.jpg?1177493890" width="48" height="48" alt="My Photo"></a></dt>
<dd class="profile-data"><strong>Name:</strong> Ingy d&ouml;t Net </dd>
<dd class="profile-data"><strong>Location:</strong> Seattle, OK </dd></dl>
<p class="profile-link"><a href="http://www.blogger.com/profile/13816997957671633491">View my complete profile</a></p></div>
<!-- End #profile -->
<h2 class="sidebar-title">Links</h2>
<ul>
<li><a href="http://gugod.org/blog/">Gugod</a></li>
<li><a href="http://search.cpan.org/~ingy/">CPAN Stuff</a></li>
<li><a href="http://yaml.org/">YAML</a></li>
<li><a href="http://kwiki.org/">Kwiki</a></li>
</ul>
<h2 class="sidebar-title">Previous</h2>
<ul id="recently">
<li><a href="http://blog.ingy.net/2010/04/goodbye-cruel-blog.html">Goodbye Cruel Blog</a></li>
<li><a href="http://blog.ingy.net/2009/10/ooooh-champs-elysees.html">Ooooh Champs-&Eacute;lys&eacute;es</a></li>
<li><a href="http://blog.ingy.net/2009/09/macgyver-in-dallas.html">MacGyver in Dallas</a></li>
<li><a href="http://blog.ingy.net/2009/09/half-scenic.html">Half Scenic</a></li>
<li><a href="http://blog.ingy.net/2009/09/fresh-ink-delivery.html">Fresh Ink Delivery</a></li>
<li><a href="http://blog.ingy.net/2009/09/frontrunners-seven.html">FrontRunners Seven</a></li>
<li><a href="http://blog.ingy.net/2009/04/social-fork.html">Social Fork</a></li>
<li><a href="http://blog.ingy.net/2009/02/after-long-day-of-traveling-yuval-and-i.html">Bonsoir Chamonix</a></li>
<li><a href="http://blog.ingy.net/2009/02/euro-ingy.html">Eur&ouml; Ingy</a></li>
<li><a href="http://blog.ingy.net/2008/11/labret-comes-of-age.html">The Labret Comes of Age</a></li>
</ul>
<h2 class="sidebar-title">Archives</h2>
<ul class="archive-list">
<li><a href="http://blog.ingy.net/2007_04_01_archive.html">April 2007</a></li>
<li><a href="http://blog.ingy.net/2007_05_01_archive.html">May 2007</a></li>
<li><a href="http://blog.ingy.net/2007_06_01_archive.html">June 2007</a></li>
<li><a href="http://blog.ingy.net/2007_08_01_archive.html">August 2007</a></li>
<li><a href="http://blog.ingy.net/2007_09_01_archive.html">September 2007</a></li>
<li><a href="http://blog.ingy.net/2007_10_01_archive.html">October 2007</a></li>
<li><a href="http://blog.ingy.net/2007_11_01_archive.html">November 2007</a></li>
<li><a href="http://blog.ingy.net/2008_02_01_archive.html">February 2008</a></li>
<li><a href="http://blog.ingy.net/2008_03_01_archive.html">March 2008</a></li>
<li><a href="http://blog.ingy.net/2008_06_01_archive.html">June 2008</a></li>
<li><a href="http://blog.ingy.net/2008_09_01_archive.html">September 2008</a></li>
<li><a href="http://blog.ingy.net/2008_10_01_archive.html">October 2008</a></li>
<li><a href="http://blog.ingy.net/2008_11_01_archive.html">November 2008</a></li>
<li><a href="http://blog.ingy.net/2009_02_01_archive.html">February 2009</a></li>
<li><a href="http://blog.ingy.net/2009_04_01_archive.html">April 2009</a></li>
<li><a href="http://blog.ingy.net/2009_09_01_archive.html">September 2009</a></li>
<li><a href="http://blog.ingy.net/2009_10_01_archive.html">October 2009</a></li>
<li><a href="http://blog.ingy.net/2010_04_01_archive.html">April 2010</a></li>
<li><a href="http://blog.ingy.net/">Current Posts</a></li>
</ul>
<!--<h2 class="sidebar-title">New</h2>
<p>This is a paragraph of text in the sidebar.</p>
-->
<p id="powered-by"><a href="http://www.blogger.com"><img src="http://buttons.blogger.com/bloggerbutton1.gif" alt="Powered by Blogger" /></a></p>
<p id="blogfeeds">Subscribe to<br/>Posts [<a target="_blank" href="http://blog.ingy.net/atom.xml" type="application/atom+xml">Atom</a>]</p>
</div>
<!-- End #sidebar -->
<div class="clear">&nbsp;</div>
<div id="footer">
<p><!-- If you'd like, you could place footer information here. -->&nbsp;</p>
</div>
</div> <!-- end #wrap -->
<!-- c(~) -->
<script type="text/javascript" src="http://www.blogger.com/static/v1/common/js/382424953-csitail.js"></script>
<script type="text/javascript">BLOG_initCsi('ext_blogspot');</script></body>
</html>
Jump to Line
Something went wrong with that request. Please try again.