<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-330230180594402556</id><updated>2012-01-17T16:01:15.356-08:00</updated><category term='tetris'/><category term='scheme'/><category term='openid'/><category term='emacs'/><category term='ecmascript'/><category term='funny'/><category term='java'/><category term='clojure'/><category term='hunchentoot'/><category term='english'/><category term='livejournal'/><category term='junit'/><category term='advertising'/><category term='lisp'/><category term='intellij'/><category term='flex'/><category term='slime'/><category term='oracle'/><category term='vodka'/><category term='ABCL'/><category term='ecl'/><category term='play'/><category term='tv'/><category term='football'/><category term='russian'/><category term='c++'/><category term='work'/><category term='wishforge'/><category term='open-source'/><title type='text'>blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-1575572080717170758</id><published>2012-01-17T14:31:00.000-08:00</published><updated>2012-01-17T16:01:15.366-08:00</updated><title type='text'>maybeComma</title><content type='html'>&lt;pre&gt;
I once did small invention: the simplest way to join values in 
a collection using comma as a separator:

    result = '';
    maybeComma = '';
    for (val : collection) {
      result += maybeComma + val;
      maybeComma = ',';
    }

If collection = [1, 2, 3], then result = '1,2,3'.

I invented this almost 10 year ago, and it was useful many times. There are 
environments, like shell scripts, where there is no Arrays.toString method. 
And even C++, at the times when I programmed on this language, didn't have any
such "join" function in the standard library (that's why I needed to invent it; 
BTW, it's interesting, does C++ have join today... quick googling makes 
impression it doesn't...).

I never saw more simple implementation. All the implementations I saw have 
an IF inside the loop:
  
    result = '';
    for (i = 0; i &lt; collection.length; i++) {
      if (i &gt; 0) {
         result += ',';
      }
      result += collection[i];
    }

Here we also needed to change the "for each" construct to a "for by variable i", 
to determine if we are at the first iteration or not.

The maybeComma solution does not depend on the iteration construct at all.
Therefore it is easier to adopt. For example joining two collections.
In the maybeComma approach we just copy/paste the loop without rethinking
the logic, it always works the same:

    result = '';
    maybeComma = '';
    for (val : collectionA) {
      result += maybeComma + val;
      maybeComma = ',';
    }
    for (val : collectionB) {
      result += maybeComma + val;
      maybeComma = ',';
    }

In the IF approach we again need to change the control constructs by 
introducing a boolean flag:

    result = '';
    oneDone = false;
    for (i = 0; i &lt; collectionA.length; i++) {
      if (oneDone) {
         result += ',';
      }
      result += collectionA[i];
      oneDone = true;
    }
    for (i = 0; i &lt; collectionB.length; i++) {
      if (oneDone) {
         result += ',';
      }
      result += collectionB[i];
      oneDone = true;
    }

As far as I remember this understanding of how to avoid logic by switching to 
different data values came to me from ThinkingForth - the idea of how to use
the maybeComma variable to avoid the IF in the solution was a result of conscious 
attempt to apply what is taught in this book. 
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-1575572080717170758?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/1575572080717170758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=1575572080717170758' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/1575572080717170758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/1575572080717170758'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2012/01/maybecomma.html' title='maybeComma'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-7884403561505549103</id><published>2011-09-27T20:56:00.000-07:00</published><updated>2011-09-28T17:48:55.333-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='ecmascript'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Private Members in Javascript</title><content type='html'>&lt;p&gt;It is usually advised to use closures to emulate private class members in javascript. Like this:&lt;/p&gt;

&lt;pre class="code"&gt;
function MyClass(param) {

   var privateVar = 1;

   function privateMethod(a) {
      return a + 2;
   }

   this.publicVar = param;

   this.publicMethod = function(x) {
     return x + this.publicVar - privateVar;
   }
}

var my = new MyClass();
my.publicMethod(1);
&lt;/pre&gt;

&lt;p&gt;I find this approach inconvenient for various reasons. Right away I can remember at least 4:
&lt;ul&gt;
&lt;li&gt;Private members are not visible in debugger (FireBug)&lt;/li&gt;
&lt;li&gt;You can't access private members programmatically (during development I often need to experiment and access private members)&lt;/li&gt;
&lt;li&gt;Public methods which need access to private data should be defined inside of the closure, we can't add them to the class prototype.&lt;/li&gt;
&lt;li&gt;In the code private and public members are referred differently: without &lt;code style="white-space: nowrap"&gt;this&lt;/code&gt; for private and with &lt;code style="white-space: nowrap"&gt;this&lt;/code&gt; for public. 
  If I want to make some previously private method public, I need to find all the references and change &lt;code style="white-space: nowrap"&gt;method()&lt;/code&gt; to &lt;code style="white-space: nowrap"&gt;this.method()&lt;/code&gt;.
  And often the correct &lt;code style="white-space: nowrap"&gt;this&lt;/code&gt; is not available, because we are in some deeper function/closure, where  &lt;code style="white-space: nowrap"&gt;this&lt;/code&gt;
  refers different object (for example we are in a callback of AJAX call). So, making a method public can not always be done mechanically.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;We may try to workaround the last issue by defining even public methods as closure-local functions and then publishing them 
explicitly:&lt;/p&gt;
&lt;pre class="code"&gt;
function MyClass(param) {

   // ...

   function publicMethod(x) {
     return x + publicVar - privateVar;
   }

   function publicMethod2(x, y) {
     return publicMethod(x) + y;
   }

  this.publicMethod = publicMethod;
  this.publicMethod2 = publicMethod2;
}
&lt;/pre&gt;

&lt;p&gt;But that way descendant classes can't override the public methods. In short, the closure approach is unsatisfying.&lt;/p&gt;

&lt;p&gt;I have an idea which looks for me better than using closures to emulate private members.&lt;/p&gt;

&lt;p&gt;The class implementation may have everything accessible via &lt;code style="white-space: nowrap"&gt;this&lt;/code&gt; (i.e. public):&lt;/p&gt;

&lt;pre class="code"&gt;
function MyClass(param) {
   this.privateVar = param;
}

MyClass.prototype.privateMethod = function (a) {
      return a + 2;
}

MyClass.prototype.publicMethod = function(x) {
     return x - this.privateVar;
}

var my = new MyClass();
my.privateMethod(2);
my.publicMethod(1);
&lt;/pre&gt;

Then, if I want to restrict class clients from using the private implementation details (and feel that code comments are not enough for that) I can provide them only public interface:

&lt;pre class="code"&gt;
var my = {
   impl: new MyClass(1),
   publicMethod: function (x) {return this.imp.publicMethod(x);}
}

// This is how clients normally use it:
my.publicMethod(1);

// But it is also possible to check the private implementation for debugging and development purposes:
my.impl.privateMethod(2);
&lt;/pre&gt;

&lt;p&gt;This separation of encapsulation from classes resembles Common Lisp.&lt;/p&gt;

&lt;p&gt;And the difference between &lt;code style="white-space: nowrap"&gt;obj.method()&lt;/code&gt; and &lt;code style="white-space: nowrap"&gt;obj.impl.method()&lt;/code&gt; is similar to Common Lisp: &lt;code style="white-space: nowrap"&gt;package-name:func-name&lt;/code&gt; for exported symbols and &lt;code style="white-space: nowrap"&gt;package-name::func-name&lt;/code&gt; for not-exported symbols. Client can access private implementation if he wants, but the syntax difference ensures he knows what he is doing.&lt;/p&gt;

&lt;p&gt;Depending on the situation, we may create such interface objects manually, or create a little function which wraps any object into an interface:&lt;/p&gt;

&lt;pre class="code"&gt;

// Whole the code below is tested, you can run it e.g. in FireBug console.

function as(impl, interface) {
  var wrapper = {impl: impl}; 
  for (prop in interface) {
    wrapper[prop] = makeImplCaller(prop);
  }
  return wrapper;
}

function makeImplCaller(functionName) {
    return function() {
        return this.impl[functionName].apply(this.impl, arguments);
    }
}

// This is the public interface
var Interface = {
  funcA: null, // (a)
  funcB: null, // (a, b)
}

// The implementation of the interface
function Impl (x, y) {
    this.privX = x;
    this.privY = y;
}

Impl.prototype.funcA = function (a) {
    return this.privX + a;
}

Impl.prototype.funcB = function (a, b) {
    return this.privX - a + this.privY - b;
}

// How to provide the inteface to client
var impl = new Impl(5, 10);
var i = as(impl, Interface);

// And client uses it:
i.funcA(1);
i.funcB(7,5);
// inspecting private details
i.impl.privX;
i.impl.privY;
&lt;/pre&gt;

&lt;p&gt;Beware, in some cases the fact that implementation is wrapped into a wrapper might affect the program. If we compare &lt;code style="white-space: nowrap"&gt;o1 === o2&lt;/code&gt;, it might happen that &lt;code style="white-space: nowrap"&gt;o1&lt;/code&gt; is impl, and &lt;code style="white-space: nowrap"&gt;02&lt;/code&gt; is a wrapper, and we get &lt;code style="white-space: nowrap"&gt;false&lt;/code&gt; when &lt;code style="white-space: nowrap"&gt;true&lt;/code&gt; is expected. This is the kind of problem many Java programmers face sometimes (in Java ecosystem various decorators, AOP, proxies, etc. are often used).&lt;/p&gt;

&lt;p&gt;I had no time to think further about this approach. For example, in the above code making &lt;code style="white-space: nowrap"&gt;i instanceof Interface&lt;/code&gt; returning &lt;code style="white-space: nowrap"&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But in general I like the idea.&lt;/p&gt;


&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-7884403561505549103?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/7884403561505549103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=7884403561505549103' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/7884403561505549103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/7884403561505549103'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2011/09/private-members-in-javascript.html' title='Private Members in Javascript'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-3287057103798629779</id><published>2011-06-02T14:54:00.000-07:00</published><updated>2011-09-27T19:09:38.719-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openid'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Unlucky day for OpenID</title><content type='html'>Tried today some small changes in cl-openid and faced various problems (in 3rd parties! verified it by unchanged cl-openid and also by testing with other online services).&lt;br /&gt;
&lt;br /&gt;
Blogger OpenID provider is just broken (&lt;a href="http://www.google.com/support/forum/p/blogger/thread?tid=120fff3e2b1a061d&amp;hl=en"&gt;http://www.google.com/support/forum/p/blogger/thread?tid=120fff3e2b1a061d&amp;hl=en&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
Livejournal OpenID provider started to violate the spec (as I read it) by returning error response with HTTP status code 200 OK. (See 5.1.2.2. Error Responses in the end of this section: &lt;a href="http://openid.net/specs/openid-authentication-2_0.html#direct_comm"&gt;http://openid.net/specs/openid-authentication-2_0.html#direct_comm&lt;/a&gt; and 8.2.4. Unsuccessful Response Parameters in the end of this section: &lt;a href="http://openid.net/specs/openid-authentication-2_0.html#anchor20"&gt;http://openid.net/specs/openid-authentication-2_0.html#anchor20&lt;/a&gt;). When I tested Livejournal with cl-openid last time, it worked OK.&lt;br/&gt;
&lt;br/&gt;
&lt;b&gt;Update:&lt;/b&gt; Livejournal problem is solved by workaround in cl-openid. Blogger remains broken (including work with any other OpenID relying parties, not only cl-openid).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-3287057103798629779?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/3287057103798629779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=3287057103798629779' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/3287057103798629779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/3287057103798629779'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2011/06/unlicky-day-for-openid.html' title='Unlucky day for OpenID'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-5882267002474189796</id><published>2011-01-24T14:03:00.000-08:00</published><updated>2011-06-02T15:15:18.216-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><title type='text'>В C++ вводят лямбда функции и замыкания.</title><content type='html'>Я практически не пользуюсь С++ уже несколько лет, и не мог предположить, что благодать нисходит на него так интенсивно. Изменения языка довольно существенные. Сборщик мусора правда не вводят. Конечно, существующие коллекторы [2] никто не отменял, но в стандарт не включают. &lt;br /&gt;
1 -&lt;a href="https://secure.wikimedia.org/wikipedia/ru/wiki/C%2B%2B0x"&gt; https://secure.wikimedia.org/wikipedia/ru/wiki/C%2B%2B0x&lt;/a&gt; &lt;br /&gt;
2 - &lt;a href="https://secure.wikimedia.org/wikipedia/en/wiki/Boehm_garbage_collector"&gt;https://secure.wikimedia.org/wikipedia/en/wiki/Boehm_garbage_collector&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-5882267002474189796?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/5882267002474189796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=5882267002474189796' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/5882267002474189796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/5882267002474189796'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2011/01/c.html' title='В C++ вводят лямбда функции и замыкания.'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-4769575381104506805</id><published>2010-06-02T16:18:00.000-07:00</published><updated>2010-06-02T18:22:35.590-07:00</updated><title type='text'>Указ 60 .net</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JR5vKKjrHBQ/TAbn2I44rCI/AAAAAAAAAE8/uL2ERGfAEaw/s1600/ukaz60_logo.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 212px; height: 100px;" src="http://1.bp.blogspot.com/_JR5vKKjrHBQ/TAbn2I44rCI/AAAAAAAAAE8/uL2ERGfAEaw/s320/ukaz60_logo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5478320914027818018" /&gt;
&lt;/a&gt;
&lt;p&gt;Актуально для белорусов: &lt;a href="http://ukaz60.net"&gt;http://ukaz60.net&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Статистика за время с первой подписи 28 мая 10:49 по текущий момент 2 часа ночи 3 апреля. Число голосов в опросе 3301. Число "подписей" к письму в виде комментариев - 1806.
&lt;/p&gt;

&lt;p&gt;Возможно есть и другие подобные сайты, этот я нашел поиском в гугле. Нужно будет подумать, что еще можно сделать против этого вредного указа.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-4769575381104506805?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/4769575381104506805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=4769575381104506805' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/4769575381104506805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/4769575381104506805'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2010/06/60-net.html' title='Указ 60 .net'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_JR5vKKjrHBQ/TAbn2I44rCI/AAAAAAAAAE8/uL2ERGfAEaw/s72-c/ukaz60_logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-2150630792260809625</id><published>2010-05-03T13:47:00.000-07:00</published><updated>2010-05-03T13:49:22.072-07:00</updated><title type='text'></title><content type='html'>Прочитал на тут бае:

&lt;p&gt;Апостол Павел считается небесным покровителем органов финансовых расследований Республики Беларусь.

&lt;p&gt;&lt;a href="http://news.tut.by/society/168946.html"&gt;http://news.tut.by/society/168946.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-2150630792260809625?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/2150630792260809625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=2150630792260809625' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/2150630792260809625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/2150630792260809625'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2010/05/blog-post.html' title=''/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-9151994039937270430</id><published>2010-01-25T15:53:00.000-08:00</published><updated>2010-01-25T16:31:46.217-08:00</updated><title type='text'></title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://i.imgur.com/pG3q7.jpg"&gt;&lt;img style="display:block; width:100%; border: 1px solid #c0c0c0; text-align:center;cursor:pointer; margin:10px; cursor:hand;" src="http://i.imgur.com/pG3q7.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-9151994039937270430?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/9151994039937270430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=9151994039937270430' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/9151994039937270430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/9151994039937270430'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2010/01/blog-post.html' title=''/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-8060122395261653728</id><published>2009-10-16T08:13:00.000-07:00</published><updated>2009-10-16T08:26:20.386-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intellij'/><title type='text'>IntelliJ IDEA goes open source</title><content type='html'>&lt;p&gt;Under the Apache 2.0 license.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.jetbrains.org"&gt;http://www.jetbrains.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comparision of the free and the commercial editions: &lt;a href="http://www.jetbrains.org/display/IJOS/Ultimate+Edition+vs.+Community+Edition"&gt;link&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-8060122395261653728?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/8060122395261653728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=8060122395261653728' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/8060122395261653728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/8060122395261653728'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2009/10/intellij-idea-goes-open-source.html' title='IntelliJ IDEA goes open source'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-641317505773862615</id><published>2009-08-22T18:34:00.000-07:00</published><updated>2009-08-26T13:28:53.427-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='intellij'/><category scheme='http://www.blogger.com/atom/ns#' term='ABCL'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Extending IntelliJ IDEA using Common Lisp</title><content type='html'>If you have nothing to do, you may embed &lt;a href="http://common-lisp.net/project/armedbear/"&gt;ABCL &lt;/a&gt;into IntelliJ IDEA and extend and control IDEA interactively from SLIME.&lt;br /&gt;
&lt;br /&gt;
I created a little plugin that starts ABCL inside of IDEA:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;b style="color: #00adef;"&gt;Note:&lt;/b&gt; this video in better resolution may be watched &lt;a href="http://vimeo.com/6227251"&gt;at Vimeo&lt;/a&gt;&lt;br /&gt;
&lt;object height="300" width="400"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6227251&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=6227251&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
How it works: "ABCL Start" command creates ABCL compiler and attaches it's REPL to a special "ABCL Console" tool window. Also it executes &lt;span style="font-style: italic;"&gt;start.lisp&lt;/span&gt; file, which is supposed to be edited by user. User may do whatever he needs: start SLIME server or load another lisp files.&lt;br /&gt;
&lt;br /&gt;
SLIME fuzzy-completion works for Java classes/methods because I use &lt;a href="http://jfli.sourceforge.net/"&gt;jfli&lt;/a&gt; (I found an ABCL port by Andras Simon). I wish fuzzy-completion work faster with ABCL (the latency may be up to half a second). But I believe ABCL will be improved in this area in the near future.&lt;br /&gt;
&lt;br /&gt;
Hello Word -like examples in the video above are contained in the &lt;span style="font-style: italic;"&gt;fun.lisp&lt;/span&gt; file from the plugin distribution.&lt;br /&gt;
&lt;br /&gt;
Another example I prepared is implementation of Emacs-like "yanking" in IDEA (Ctrl-Y pastes an item from clipboard, and Alt-Y replaces just inserted item by next clipboard item). The code is contained in the &lt;span style="font-style: italic;"&gt;yanking.lisp&lt;/span&gt;. Here it is in action:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;object height="300" width="400"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6220976&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=6220976&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt; &lt;/div&gt;&lt;br /&gt;
To summarize, it is possible, and with some practice quite convenient, to use ABCL for IDEA extension.&lt;br /&gt;
&lt;br /&gt;
If you have in mind some useful extension that may be implemented in Lisp, you can use my code as a boilerplate.&lt;br /&gt;
&lt;br /&gt;
The sources: &lt;a href="http://github.com/avodonosov/abcl-idea/"&gt;http://github.com/avodonosov/abcl-idea/&lt;/a&gt;&lt;br /&gt;
Binary distro: &lt;a href="http://github.com/avodonosov/abcl-idea/downloads"&gt;http://github.com/avodonosov/abcl-idea/downloads&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Some details are provided in the &lt;span style="font-style: italic;"&gt;README&lt;/span&gt; file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-641317505773862615?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/641317505773862615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=641317505773862615' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/641317505773862615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/641317505773862615'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2009/08/extending-intellij-idea-using-common.html' title='Extending IntelliJ IDEA using Common Lisp'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>Минск, Belarus'</georss:featurename><georss:point>53.85036217298875 27.47029423713684</georss:point><georss:box>53.84996667298875 27.46938223713684 53.850757672988756 27.47120623713684</georss:box></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-9041629231752911458</id><published>2008-12-13T09:08:00.000-08:00</published><updated>2009-08-23T01:46:02.802-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='russian'/><title type='text'>Винни-Пых</title><content type='html'>Читал сейчас в википедии &lt;a href="http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BD%D0%BD%D0%B8-%D0%9F%D1%83%D1%85"&gt;статью про Винни-Пуха&lt;/a&gt;. В частности, там рассказывается про звучание имени на разных языках. Например, в английском языке «h» в имени Pooh не произносится, это имя рифмуется постоянно с who или do. 
&lt;p&gt;
В белорусском переводе некоего Виталя Воронова — &lt;i&gt;Віня-Пых&lt;/i&gt;. Вторая часть имени переведена как «Пых», якобы потому, что это созвучно с белорусскими словами &lt;i&gt;пыха&lt;/i&gt; (высокомерие и гордость) и &lt;i&gt;запыхацца&lt;/i&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-9041629231752911458?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/9041629231752911458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=9041629231752911458' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/9041629231752911458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/9041629231752911458'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/12/blog-post.html' title='Винни-Пых'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-7813059765930428908</id><published>2008-12-07T09:03:00.000-08:00</published><updated>2009-08-23T01:47:36.881-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='advertising'/><category scheme='http://www.blogger.com/atom/ns#' term='russian'/><title type='text'>Как скрыть рекламу в Live Journal</title><content type='html'>Я читаю несклько блогов в Live Journal и мне мешает громадный рекламный баннер на пол экрана, который Live Journal вставляет в блоги бесплатных аккаунтов.

&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/10"&gt;AdBlock&lt;/a&gt; плагин к Firefox в данном случае не помог, он скрывает картинку, но тогда остается большое белое пространство, что не намного лучше картнинки.

&lt;p&gt;В Google быстро нашлось решение. 

&lt;h4&gt;Для Firefox&lt;/h4&gt;

&lt;p&gt;Создаем файл &lt;i&gt;userContent.css&lt;/i&gt;:
&lt;pre class="code"&gt;

/* Removes LJ Ads from pages. */
/* Code From ambience8 */

@-moz-document domain("livejournal.com") {

div.adv {display: none !important; visibility: hidden !important;}
div.ljad {display: none !important; visibility: hidden !important;}
div.ljadleaderboard-bottom {display: none !important; visibility: hidden !important;}
div.ljadleaderboard {display: none !important; visibility: hidden !important;}
div.ljadwrapper-journal-after-post-c {display: none !important; visibility: hidden !important;}
div.ljadwrapper-app-home {display: none !important; visibility: hidden !important;}
div.ljadmedrect {display: none !important; visibility: hidden !important;}

}
&lt;/pre&gt; 

Этот файл нужно положить в директорию &lt;span class="filename"&gt;chrome&lt;/span&gt; вашего &lt;a href="http://support.mozilla.com/ru/kb/Profile#__2"&gt;профиля&lt;/a&gt;. На Widows XP это будет &lt;span class="filename"&gt;C:\Documents and Settings\&amp;lt;Имя Пользователя&amp;gt;\Application Data\Mozilla\Firefox\Profiles\xxxxxxxx.default\chrome\userContent.css&lt;/span&gt;. В Windows Vista: &lt;span class="filename"&gt;C:\Users\&amp;lt;Имя Пользователя&amp;gt;\AppData\Roaming\Mozilla\Firefox\Profiles\xxxxxxxx.default\chrome\userContent.css&lt;/span&gt;

&lt;p&gt;Теперь перезапускаем Firefox. В результате реклама в блогах Live Journal должна исчезнуть.

&lt;h4&gt;Для Internet Explorer&lt;/h4&gt;

&lt;p&gt;Создаем файл &lt;i&gt;userContent.css&lt;/i&gt;:
&lt;pre class="code"&gt;
/* Removes LJ Ads from pages. */
/* Code From ambience8 */

div.adv {display: none !important; visibility: hidden !important;}
div.ljad {display: none !important; visibility: hidden !important;}
div.ljadleaderboard-bottom {display: none !important; visibility: hidden !important;}
div.ljadleaderboard {display: none !important; visibility: hidden !important;}
div.ljadwrapper-journal-after-post-c {display: none !important; visibility: hidden !important;}
div.ljadwrapper-app-home {display: none !important; visibility: hidden !important;}
div.ljadmedrect {display: none !important; visibility: hidden !important;}
&lt;/pre&gt;

&lt;p&gt;В меню Internet Explorer выбираем Tools -&gt; Internet Options -&gt; General -&gt; Accessibility -&gt; User style sheet. Здесь указываем путь к созданному файлу.

&lt;p&gt;Как можно заметить из кода, решение для Internet Explorer будет скрывать элемены &lt;code&gt;div&lt;/code&gt; с классом &lt;code&gt;adv&lt;/code&gt; на любых страницах, а не только в livejournal.com, так что... это не страшно :)

&lt;p&gt;Источник: &lt;a href="http://wiki.noljads.com/Hiding_LiveJournal_ads_with_user_stylesheets"&gt;http://wiki.noljads.com/Hiding_LiveJournal_ads_with_user_stylesheets&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-7813059765930428908?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/7813059765930428908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=7813059765930428908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/7813059765930428908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/7813059765930428908'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/12/live-journal.html' title='Как скрыть рекламу в Live Journal'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-1249908300229494475</id><published>2008-12-05T17:33:00.000-08:00</published><updated>2009-08-23T01:50:49.376-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='ecl'/><category scheme='http://www.blogger.com/atom/ns#' term='hunchentoot'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Hunchentoot on ECL</title><content type='html'>It was &lt;a href="http://common-lisp.net/pipermail/tbnl-devel/2008-November/004474.html"&gt;reported&lt;/a&gt; that all &lt;a href="http://weitz.de/hunchentoot"&gt;Hunchentoot&lt;/a&gt; dependencies are already ported to &lt;a href="http://ecls.sourceforge.net/"&gt;ECL&lt;/a&gt; and a patch exists for Hunchentoot itself to make it running on ECL.

&lt;p&gt;I am glad to hear this, because ECL is the only free Common Lisp on Windows with multithreading support (at the same time an active work on multithreading for CLISP is in progress, Clozure CL has beta port for Windows, and a lot of work was also done for threading in SBCL Windows port, although the work is not finished).

&lt;p&gt;I tried Hunchentoot on ECL and for those who are interested too, I reproduce here the steps I took. My environment: Windows XP + Microsoft Visual Studio.
&lt;ol&gt;
&lt;li&gt;You need the latest versions of Hunchentoot and all the dependencies. If you are lazy, you may get all them at once from &lt;a href="http://avodonosov.googlepages.com/hunch-and-deps.zip"&gt;this archive&lt;/a&gt; I prepared.
&lt;/li&gt;
&lt;li&gt; Apply the patch from this &lt;a href="http://common-lisp.net/pipermail/tbnl-devel/2008-November/004474.html"&gt;post&lt;/a&gt; (already done in my archive): save the &lt;a href="http://common-lisp.net/pipermail/tbnl-devel/attachments/20081125/20d9b19b/attachment.obj"&gt;&lt;i&gt;port-ecl.lisp&lt;/i&gt;&lt;/a&gt; to the hunchentoot directory and add &lt;code style="white-space: nowrap"&gt;#+:ecl (:file "port-ecl")&lt;/code&gt; to &lt;i&gt;hunchentoot.asd&lt;/i&gt; as &lt;a href="http://common-lisp.net/pipermail/tbnl-devel/attachments/20081125/20d9b19b/attachment-0001.obj"&gt;here&lt;/a&gt;.
&lt;/li&gt;
&lt;li&gt; Checkout fresh ECL from CVS:
&lt;pre class="code"&gt;
  cvs -z3 -d:pserver:anonymous@ecls.cvs.sourceforge.net:/cvsroot/ecls checkout ecl
&lt;/pre&gt;
I recommend fresh checkout because I had problems building ECL from sources already existing on my computer after update with &lt;code&gt;cvs update -dAP&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt; Configure ECL. Open &lt;i&gt;ecl\msvc\Makefile&lt;/i&gt; and set 
&lt;pre class="code"&gt;
ECL_THREADS  = 1
ECL_UNICODE  = 1
ECL_ASDF     = 1
ECL_SOCKETS  = 1
&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt; Build ECL. Run Visual Studio command prompt: menu &lt;i&gt;Start-&gt;All Programs -&gt; Microsoft Visual Studio 2005 -&gt; Visual Studio Tools -&gt; Visual Studio 2005 Command Prompt&lt;/i&gt;. This script sets up environment variables so that C compiler cl.exe, nmake.exe and other things are in your PATH, all includes and libraries are available, etc.

In this console window type:
&lt;pre class="code"&gt;
 &amp;gt; cd &amp;lt;DIR_WITH_ECL_SOURCES&amp;gt;\ecl\msvc
 &amp;gt; nmake
&lt;/pre&gt;
After the build completes, copy resulting binaries somewhere:
&lt;pre class="code"&gt;  &amp;gt; nmake install prefix=c:\somewhere\ecl&lt;/pre&gt;
Now you have working ECL, lets test it:
&lt;pre class="code"&gt;&amp;gt; c:\somewhere\ecl\ecl.exe
ECL (Embeddable Common-Lisp) 0.9l (CVS 2008-07-12 18:54)
Copyright (C) 1984 Taiichi Yuasa and Masami Hagiya
Copyright (C) 1993 Giuseppe Attardi
Copyright (C) 2000 Juan J. Garcia-Ripoll
ECL is free software, and you are welcome to redistribute it
under certain conditions; see file 'Copyright' for details.
Type :h for Help.  Top level.
&gt; (+ 2 2)
4
&gt; (quit)
&lt;/pre&gt;
Works. 
&lt;p&gt;Do not close the Visual Studio command prompt, we will need it soon.
&lt;/li&gt;
&lt;li&gt; As Hunchentoot uses &lt;a href="http://common-lisp.net/project/asdf/"&gt;ASDF&lt;/a&gt;, we need Hunchentoot with all its dependencies to be registered in &lt;code&gt;ASDF:*CENTRAL-REGISTY*&lt;/code&gt;. For this I have a special lisp file, &lt;i&gt;setup-asdf-registry.lisp&lt;/i&gt; (already included in the archive from the step 1):

&lt;pre class="code"&gt;
;; this file must be stored in the same directory
;; where all the lisp libraries are stored 
;; (but libraries, of course, have their own subdirectories)

(require 'asdf)

(flet
    ((reg (relative-lib-dir)
       (let ((lib-dir
              (directory-namestring 
               (merge-pathnames relative-lib-dir
                                (load-time-value
                                 (or #.*compile-file-pathname* 
                                     *load-pathname*))))))
         (pushnew lib-dir
                  asdf:*central-registry*
                  :test #'equalp))))
  (reg "alexandria\\")
  (reg "asdf-binary-locations\\")
  (reg "babel_0.2.0\\")
  (reg "cffi-080926\\")
  (reg "chunga-0.4.3\\")
  (reg "cl-base64-3.3.2\\")
  (reg "cl-fad-0.6.2\\") 
  (reg "cl-ppcre-2.0.1\\")
  (reg "cl-who-0.11.0\\")
  (reg "cl+ssl\\")
  (reg "flexi-streams-1.0.7\\")
  (reg "hunchentoot-0.15.7\\")
  (reg "md5-1.8.5\\")
  (reg "rfc2388\\")
  (reg "trivial-features_0.1\\")
  (reg "trivial-gray-streams\\")
  (reg "url-rewrite-0.1.1\\"))

(asdf:operate 'asdf:load-op :asdf-binary-locations) &lt;/pre&gt; &lt;/li&gt;
&lt;li&gt;Compile and load Hunchentoot. For this go back to the Visual Studio command prompt.
&lt;pre class="code"&gt;
&amp;gt; c:\somewhere\ecl\ecl.exe  
&gt; (load "c:/archive-from-the-step-1/setup-asdf-registry.lisp") 
&gt; (pushnew :hunchentoot-no-ssl *features*)
&gt; (asdf:operate 'asdf:load-op :hunchentoot-test)
&lt;/pre&gt;
ECL must be started from Visual Studio command prompt because it uses C compiler when compiling Lisp.
&lt;code style="white-space: nowrap"&gt;(pushnew :hunchentoot-no-ssl *features*)&lt;/code&gt; is only necessary if you do not have OpenSSL installed (&lt;a href="http://www.slproweb.com/products/Win32OpenSSL.html "&gt;get it here for Win32&lt;/a&gt;). 
&lt;/li&gt;
&lt;li&gt; Start Hunchentoot:
&lt;pre class="code"&gt;
&amp;gt; (hunchentoot:start-server :port 4242) 
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now you may open &lt;a href="http://localhost:4242/hunchentoot/test"&gt;http://localhost:4242/hunchentoot/test&lt;/a&gt; and see Hunchentoot test site.

&lt;p&gt;At the moment of  this post writing, almost all examples from the test site work,
except for two: "UTF-8 demo (writing UTF-8 characters directly to the stream)"
and "UTF-8 demo (returning a string)". The reason is already found and I am sure it will be fixed very soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-1249908300229494475?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/1249908300229494475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=1249908300229494475' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/1249908300229494475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/1249908300229494475'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/12/hunchentoot-on-ecl.html' title='Hunchentoot on ECL'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-3588057775046520011</id><published>2008-12-03T14:12:00.000-08:00</published><updated>2009-08-23T01:50:49.376-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slime'/><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Simpler Clojure/SLIME Embedding</title><content type='html'>Thanks to Craig McDaniel's &lt;a href="http://groups.google.com/group/clojure/browse_thread/thread/d73efa2943179a36/797b06369c5076db#797b06369c5076db"&gt;hint&lt;/a&gt;, I know a simpler way to embed Clojure/SLIME than I used &lt;a href="http://avodonosov.blogspot.com/2008/11/clojure-at-work.html"&gt;before&lt;/a&gt;. Since Clojure svn revision 1127, macro &lt;code&gt;clojure.main/with-bindings&lt;/code&gt; makes the embedding as trivial as &lt;a href="http://paste.lisp.org/display/71541"&gt;this jsp page&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-3588057775046520011?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/3588057775046520011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=3588057775046520011' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/3588057775046520011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/3588057775046520011'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/12/simpler-clojureslime-embedding.html' title='Simpler Clojure/SLIME Embedding'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-214990263608774871</id><published>2008-11-28T02:53:00.000-08:00</published><updated>2009-08-23T01:50:49.377-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slime'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Clojure at Work: Interactively Control Running Java System</title><content type='html'>&lt;p&gt;We are developing a system on Java. It must call another system and at some point the other system calls our system back via web service. Therefore I can not test this interaction in a stand-alone test, our code must be executed in an HTTP container (we use Tomcat).

&lt;p&gt;In case if the code does not work as desired, I need to stop Tomcat, fix and rebuild Java sources and try again. And what is worse, before the code I am working on can be tested, it performs initialization that takes about a minute. These stumbles are little bit annoying for those who are used to fully dynamic development environments as Lisp.

&lt;p&gt;I decided to embed &lt;a href="http://clojure.org"&gt;Clojure&lt;/a&gt; into the system during development and connect to it with &lt;a href="http://common-lisp.net/project/slime/"&gt;SLIME&lt;/a&gt; to create interactive testing/development environment.

&lt;p&gt;First, I followed Bill Clementson's &lt;a href="http://bc.tech.coop/blog/081023.html"&gt;instructions&lt;/a&gt; for usual (not embedded) Clojure/SLIME setup.

&lt;p&gt;After it worked, I started to look for a way to embed Clojure/swank into existing Java system, but didn't find any conventional way to do this. Therefore I torn out a piece of code from the clojure.lang.Repl class and instead of standard input, feed it with commands to start swank (which I found in the *inferior-lisp* buffer when Clojure/SLIME is started "normally", from Emacs).

&lt;p&gt;All this is packed into simple &lt;a href="http://paste.lisp.org/display/71209"&gt;clojure.jsp&lt;/a&gt; page in my web application directory. And &lt;i&gt;clojure.jar&lt;/i&gt; is placed into &lt;i&gt;WEB-INF/lib&lt;/i&gt;. 

&lt;p&gt;When the JSP is opened in browser it displays: "swank has been stared".

&lt;p&gt;After that, I use &lt;tt&gt;M-X slime-connect&lt;/tt&gt; from Emacs. The port number, as you can see from the code, is 7777. 

&lt;p&gt;What is the result?

&lt;p&gt;I can inspect and control the running system, for example invoke functions I need to test or change object states. 

&lt;p&gt;But I must admit that the level of flexibility is lower than I hoped for. The point is that I can not interactively &lt;span style="font-style:italic;"&gt;change&lt;/span&gt; Java code (which constitutes all the system). To be more flexible, the system must be written on Lisp entirely.

&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Links&lt;/span&gt;
&lt;ul&gt;
&lt;li&gt;Bill Clementson's instructions for Clojure/SLIME setup: &lt;a href="http://bc.tech.coop/blog/081023.html"&gt;http://bc.tech.coop/blog/081023.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;My JSP page to start Clojure/swank: &lt;a href="http://paste.lisp.org/display/71209"&gt;http://paste.lisp.org/display/71209&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-214990263608774871?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/214990263608774871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=214990263608774871' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/214990263608774871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/214990263608774871'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/11/clojure-at-work.html' title='Clojure at Work: Interactively Control Running Java System'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-4163548923966399930</id><published>2008-10-23T16:32:00.000-07:00</published><updated>2009-08-23T01:50:49.377-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slime'/><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='hunchentoot'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>slime-over-http update</title><content type='html'>I've just updated my &lt;a href="http://avodonosov.blogspot.com/2008/01/it-is-problematic-at-first-sight-to-use.html"&gt;slime-over-http&lt;/a&gt; code to work with the current SLIME.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-4163548923966399930?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/4163548923966399930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=4163548923966399930' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/4163548923966399930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/4163548923966399930'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/10/slime-over-http-update.html' title='slime-over-http update'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-885963510720936117</id><published>2008-08-29T05:01:00.000-07:00</published><updated>2009-08-23T01:51:43.695-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='russian'/><title type='text'>Poor Man's Anti-Virus или Doctor Web на халяву</title><content type='html'>Что делать, если нужно проветить файл на наличие вирусов, а покупать лицензионный атнивирус душит жаба; пользоваться крэкнутым не позволяет совесть или то, что при обновлении баз он перестает работать?
&lt;p&gt;
Мысль развивалась так:
&lt;p&gt;
А что, если купить один лицензионный и поставить в локалке на всю организацию или в инете сервак такой завести: сабмитишь файл и тебе говорят, есть там вирусы или нет.
&lt;p&gt;
Потом дошло, такое уже есть, причем совершенно бесплатно. Большинство бесплатных почтовых служб, например gmail и yandex, проверяют всю полученную почту на вирусы. 
&lt;p&gt;
Т.е. чтобы проверить файл на вирусы, отправляешь его себе по почте. Если вирусы есть - в пришедшем письме будет предупреждающее сообщение.
&lt;p&gt;
Gmail в этом смысле неудобен (во всяк. случае для отправки). Потому, что отправить письмо с файлом .exe не разрешает, и даже не разрешает отправлять архивы содержащие .exe внутри.
&lt;p&gt;
А yandex позволяет отправлять .exe. Когда письмо придет, там даже есть такая удобная кнопочка "Проверить на вирусы", чтобы явно увидеть ответ: "Проверено антивирусом Doctor Web. Вирусов не обнаружено!".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-885963510720936117?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/885963510720936117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=885963510720936117' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/885963510720936117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/885963510720936117'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/08/poor-mans-anti-virus-doctor-web.html' title='Poor Man&apos;s Anti-Virus или Doctor Web на халяву'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-4485463789549830913</id><published>2008-08-14T17:09:00.000-07:00</published><updated>2009-08-23T01:51:43.696-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='russian'/><title type='text'>Классно почитал Тура Хейердала</title><content type='html'>Блуждая в википедии увидел Тура Хейердала и узнал, что он писал книги о своих путешествиях. Открыл для любопытства здесь: &lt;a href="http://www.lib.ru/ALPINISM/HEJRDAL/heierdal_kontiki.txt"&gt;http://www.lib.ru/ALPINISM/HEJRDAL/heierdal_kontiki.txt&lt;/a&gt;, начал со случайного места. И прочитал целиком (не за один день; кажется, дня три подряд читал: на выходных и помню будний день тоже был: прихожу с работы и сажусь читать).
&lt;p&gt;

Давно не читал художественную литературу, что-то неинтересно, не получаю удовольствия. Эта, правда, не художественная (в том смысле, что описывает реальные события). Может потому и понравилась.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-4485463789549830913?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/4485463789549830913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=4485463789549830913' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/4485463789549830913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/4485463789549830913'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/08/blog-post.html' title='Классно почитал Тура Хейердала'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-4092624330195681829</id><published>2008-08-09T11:51:00.000-07:00</published><updated>2009-08-23T01:51:43.696-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='russian'/><title type='text'>О чем думали люди 4-5 тысяч лет назад</title><content type='html'>Эпос о Гильгамеше: &lt;a href="http://www.russianplanet.ru/filolog/epos/gilgamesh/text.htm"&gt;http://www.russianplanet.ru/filolog/epos/gilgamesh/text.htm&lt;/a&gt;.
&lt;br/&gt;Пересказ сюжета и историю можно найти на этом же сайте или в википедии.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-4092624330195681829?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/4092624330195681829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=4092624330195681829' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/4092624330195681829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/4092624330195681829'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/08/4-5.html' title='О чем думали люди 4-5 тысяч лет назад'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-7407802142831039212</id><published>2008-07-15T20:50:00.000-07:00</published><updated>2009-08-23T01:51:43.696-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='russian'/><title type='text'>GUI для SMS банкинга</title><content type='html'>&lt;a href="http://smsbanking.googlepages.com/"&gt;http://smsbanking.googlepages.com/&lt;/a&gt; - удобная программа для пользователей карточек Беларусбанка.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-7407802142831039212?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/7407802142831039212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=7407802142831039212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/7407802142831039212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/7407802142831039212'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/07/gui-sms.html' title='GUI для SMS банкинга'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-3885251176875302870</id><published>2008-07-15T10:21:00.000-07:00</published><updated>2009-08-23T01:49:30.544-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='livejournal'/><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><category scheme='http://www.blogger.com/atom/ns#' term='russian'/><title type='text'>Репозитарий подверсий</title><content type='html'>&lt;a href="http://www.livejournal.com/code/"&gt;http://www.livejournal.com/code/&lt;/a&gt;. Если язык интерфейса русский, то на этой странице&lt;br/&gt;
можно прочитать: "Вы можете получить код сервера 
Живого Журнала из репозитария подверсий."
&lt;p&gt;
В английском варианте - "the Subversion repository".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-3885251176875302870?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/3885251176875302870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=3885251176875302870' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/3885251176875302870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/3885251176875302870'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/07/blog-post.html' title='Репозитарий подверсий'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-3112891196360554836</id><published>2008-07-07T00:56:00.000-07:00</published><updated>2009-08-23T01:50:49.378-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='play'/><category scheme='http://www.blogger.com/atom/ns#' term='tetris'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Good News</title><content type='html'>Tetris in emacs is customizable, so I can play starting right at the interesting speed :)
&lt;p&gt;
Here is my value for the &lt;code&gt;tetris-update-speed-function&lt;/code&gt;:&lt;br/&gt; 
&lt;code&gt;(lambda (shapes rows) (/ 20.0 (+ 180.0 rows))&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-3112891196360554836?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/3112891196360554836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=3112891196360554836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/3112891196360554836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/3112891196360554836'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/07/good-news.html' title='Good News'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-6693899656820324597</id><published>2008-06-30T10:07:00.000-07:00</published><updated>2011-05-17T02:35:54.521-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='football'/><category scheme='http://www.blogger.com/atom/ns#' term='advertising'/><category scheme='http://www.blogger.com/atom/ns#' term='vodka'/><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><category scheme='http://www.blogger.com/atom/ns#' term='tv'/><category scheme='http://www.blogger.com/atom/ns#' term='russian'/><title type='text'>Если любишь ты футбол - 50 за каждый гол!</title><content type='html'>Самый забавный из 5-6 рекламных роликов водки, которые показывали в перерыве между таймами футбольного полуфинала. 
&lt;p&gt;
Совсем офигели, бухло рекламировать. Уже почти что в рот тебе его наливают. "50 за маму, 50 за папу, 50 за дедушку, 50 за бабушку..."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-6693899656820324597?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/6693899656820324597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=6693899656820324597' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/6693899656820324597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/6693899656820324597'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/06/50.html' title='Если любишь ты футбол - 50 за каждый гол!'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-2870235463141179235</id><published>2008-06-26T08:24:00.000-07:00</published><updated>2009-08-23T01:50:49.378-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Fix Oracle Output</title><content type='html'>Customers recently sent us for analysis results of several queries from their Oracle database. The output produced by SQL*Plus or TOAD with the default value of the LINESIZE &lt;a href="http://download-east.oracle.com/docs/html/A88826_01/ch828.htm"&gt;system variable&lt;/a&gt; is quite nasty. Similar to the following:
 &lt;pre class="code" style="height: 14em;"&gt;&lt;code&gt;
SQL&amp;gt; select * from users;

        ID
----------
NAME                                                                            
--------------------------------------------------------------------------------
SURNAME                                                                         
--------------------------------------------------------------------------------
LOGIN                                                                           
--------------------------------------------------------------------------------
PASSWORD                                                                        
--------------------------------------------------------------------------------
REGISTRATION_TIME            
-----------------------------
         1
ivan                                                                            
ivanov                                                                          
vanya                                                                           
123                                                                             
26.06.08 21:16:12,000000     
                                                                                
         2
petr                                                                            
petrov                                                                          
petya                                                                           

        ID
----------
NAME                                                                            
--------------------------------------------------------------------------------
SURNAME                                                                         
--------------------------------------------------------------------------------
LOGIN                                                                           
--------------------------------------------------------------------------------
PASSWORD                                                                        
--------------------------------------------------------------------------------
REGISTRATION_TIME            
-----------------------------
qwerty                                                                          
26.06.08 21:16:12,000000     
                                                                                
         3
sidor                                                                           
sidorov                                                                         
sid                                                                             
password                                                                        
26.06.08 21:16:12,000000     
                                                                                


3 rows selected.

SQL&amp;gt; spool off;

&lt;/code&gt; &lt;/pre&gt;

I created a little tool to convert such an output to a pretty thing like this:
&lt;pre class="code" style="height: 8em;"&gt;&lt;code&gt;ID         NAME                                                                             SURNAME                                                                          LOGIN                                                                            PASSWORD                                                                         REGISTRATION_TIME             
---------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ----------------------------- 
         1 ivan                                                                             ivanov                                                                           vanya                                                                            123                                                                              26.06.08 21:16:12,000000      
         2 petr                                                                             petrov                                                                           petya                                                                            qwerty                                                                           26.06.08 21:16:12,000000      
         3 sidor                                                                            sidorov                                                                          sid                                                                              password                                                                         26.06.08 21:16:12,000000      

&lt;/code&gt;&lt;/pre&gt;
Lisp source is &lt;a href="http://avodonosov.googlepages.com/fix-ora-output.lisp"&gt;here&lt;/a&gt;. Usage instructions are at the top of the file.

&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-2870235463141179235?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/2870235463141179235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=2870235463141179235' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/2870235463141179235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/2870235463141179235'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/06/fix-oracle-output.html' title='Fix Oracle Output'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-400100365561775574</id><published>2008-04-28T02:23:00.000-07:00</published><updated>2009-08-23T01:50:49.378-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='ecmascript'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Learning Flex</title><content type='html'>I'm learning Adobe Flex now. Surprisingly, I have much better impression than I expected about it (my expectations are derived from one or two evening experience with Flash).
&lt;p&gt;
I dislike ajax/comet etc, because IMHO web browsers are not suitable for desktop-like UI and it is high time for a new cross-platform client technology.
&lt;/p&gt;&lt;p&gt;
Flex Builder resembles old good Borland Delphi or MS VisualStudio. Flex libraries and tools have "open design" (my intuitive definition for this: if there have not been a standard TreeView class, we could write it ourselves because all base classes/interactions are understandable defined and the sources are available).
&lt;/p&gt;&lt;p&gt;
BTW, interesting facts about the language. Adobe claims that ActionScript is based on ECMAScript Edition 4. The ECMAScript 4 language is in some sense progressive, has interesting (in particular lisp-like) features: &lt;a href="http://www.ecmascript.org/es4/spec/overview.pdf"&gt;http://www.ecmascript.org/es4/spec/overview.pdf&lt;/a&gt;.
Also funny is that the &lt;a href="http://www.ecmascript.org/download.php"&gt;reference implementation&lt;/a&gt; of ECMAScript is created on &lt;a href="http://en.wikipedia.org/wiki/Standard_ML"&gt;Standard ML&lt;/a&gt;.&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-400100365561775574?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/400100365561775574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=400100365561775574' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/400100365561775574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/400100365561775574'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/04/learning-flex.html' title='Learning Flex'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-3657801628571545365</id><published>2008-03-06T13:40:00.000-08:00</published><updated>2009-08-23T01:50:49.379-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='junit'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'></title><content type='html'>Junit 4.4 &lt;a href="http://junit.sourceforge.net/doc/ReleaseNotes4.4.html"&gt;new assertion mechanism&lt;/a&gt; is a very clear demonstration of java limitation comparing to lisp.
&lt;p&gt;
It is obvious that ASSERT A &amp;gt; 2 OR B &amp;lt; 3 when failed should print a message "assertion failed: a &amp;gt; 2 or b &amp;lt; 3. This is trivial to implement with lisp macros, but when the language does not provide programmatic access to the program source code, our ASSERT receives only result of expression calculation - a boolean.
&lt;p&gt;
Therefore people must create new expression specification language and duplicate expression evaluation that is already present in java compiler.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-3657801628571545365?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/3657801628571545365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=3657801628571545365' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/3657801628571545365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/3657801628571545365'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/03/junit-4.html' title=''/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-1734726347539951727</id><published>2008-02-07T14:38:00.001-08:00</published><updated>2011-08-05T02:37:52.206-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='open-source'/><category scheme='http://www.blogger.com/atom/ns#' term='wishforge'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>Interesting lisp (or scheme) project</title><content type='html'>There was a &lt;a href="http://lispjobs.wordpress.com/2007/12/01/web-developer-telecommute/"&gt;post&lt;/a&gt; in the lispjobs blog - a part time job for a freelance lisp programmer (I even applied). &lt;p&gt;The project in question is quite interesting - a website where open source software may be funded collectively by the software users. &lt;p&gt;Also interesting is that the project is going to be open source and to be created on lisp (they already started and use PLT Scheme). &lt;p&gt;The guy running this project - Christopher Rasch - wrote quite detailed &lt;a href="http://firstmonday.org/htbin/cgiwrap/bin/ojs/index.php/fm/article/view/865/774"&gt;article&lt;/a&gt; almost seven years ago about how such a system may work.                                     &lt;p&gt;In two words it is approximately following. &lt;p&gt;Some people wish some soft to be created and are ready to pay some money for it. These people may be called "donors". Other people may do the work required. They may be called "performers". The goal is to allow donors to collect in common sufficient money for performer(s) to do the work.  After that performer(s) do the work and get the money. &lt;p&gt;The mechanism suggested to achieve this goal is similar to equity market. Central object is obligation to do the required work - it is called "software completion bond". The bond is "backed" by money of donors - this means that bond owner may exchange the bond to the money when the job completion criteria are met (as determined by the judge indicated in the work specification). &lt;p&gt;Bond owner is the performer - he acquires the bonds by some small price before starting work. He may even do only part of the work and sell the bonds to someone else. It is supposed that in this case the bond price will be higher than the initial because less work is left to do to receive the money escrowed for this job. &lt;p&gt;Christopher Rasch describes his project as a "wish trading market". Read the article for more details. &lt;p&gt;Although implementation  may vary, there are people  that want something in this fashion. See at least &lt;a href="http://sourceforge.net/mailarchive/forum.php?thread_name=ea9965540801181352uf724d12mfd7840a6a33eafec%40mail.gmail.com&amp;amp;forum_name=sbcl-devel"&gt;this thread&lt;/a&gt; in the sbcl-devel mailing list. &lt;p&gt;As for me, I think it is a very interesting idea. There are several projects that I would fund by few dollars, especially taking into account that the money are protected until the job is done. And  in particular the "wish trading market"- I hope a kind of bootstrapping may be applied here: after some initial version, this project development may be funded via the described mechanism too. &lt;p&gt;How comprehensive this initial version should be? Maybe most of things may be done manually at the beginning. &lt;p&gt;I hope the project will succeed. Unfortunately there is not so much progress last time (AFAICS there were no changes at all in the &lt;a href="http://svn.wishforge.org/wishforge/"&gt;project svn repository&lt;/a&gt; for at least several last weeks). &lt;p&gt;&lt;span style="font-weight: bold;"&gt;Links&lt;/span&gt; &lt;ul&gt;&lt;li&gt;Lispjobs post: &lt;a href="http://lispjobs.wordpress.com/2007/12/01/web-developer-telecommute/"&gt;http://lispjobs.wordpress.com/2007/12/01/web-developer-telecommute/&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Christopher Rasch's article: &lt;a href="http://www.firstmonday.org/issues/issue6_6/rasch/index.html"&gt;http://www.firstmonday.org/issues/issue6_6/rasch/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Project svn repository: &lt;a href="http://svn.wishforge.org/wishforge/"&gt;http://svn.wishforge.org/wishforge/&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-1734726347539951727?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/1734726347539951727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=1734726347539951727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/1734726347539951727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/1734726347539951727'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/02/interesting-lisp-or-scheme-project.html' title='Interesting lisp (or scheme) project'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-2086193867773241543</id><published>2008-01-01T22:12:00.001-08:00</published><updated>2009-08-23T01:50:49.379-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slime'/><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='hunchentoot'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Web development in single threaded lisp with slime and hunchentoot</title><content type='html'>It is problematic at first sight to use SLIME for web development in a single threaded lisp with &lt;code&gt;swank:*communication-style* = nil&lt;/code&gt; (as it happens with CLISP and SBCL on Windows). The problem is the impossibility to modify application while it is running.
&lt;p&gt;
In very informal pseudo code this configuration of swank may be simplified represented as:
&lt;pre&gt;(loop
   (read-slime-request)
   (exec-slime-request))
&lt;/pre&gt;When our next SLIME request starts hunchentoot, hunchentoot enters its own request handling loop (for HTTP requests):
&lt;pre&gt;(loop
   (read-slime-request)
   (exec-slime-request :
      (loop
         (read-http-request)
         (handle-http-request)))
&lt;/pre&gt;This means &lt;code&gt;exec-slime-request&lt;/code&gt; will not exit and subsequent slime requests will not be handled until the web server is stopped. SLIME isn't functioning.
&lt;p&gt;
The solution is to use web server to invoke SLIME. When in the emacs we are going to  talk to swank, send special HTTP request and its handler will enforce swank to handle emacs request.
&lt;pre&gt;(loop
   (read-slime-request)
   (exec-slime-request :
      (loop
         (read-http-request)
         (handle-http-request :
            (read-slime-request)
            (exec-slime-request))))
&lt;/pre&gt;
It requires only few lines of code in emacs lisp and in common lisp. The code is &lt;a href="http://avodonosov.googlepages.com/slime-over-http.zip"&gt;here&lt;/a&gt;, it's simple, see it for more details.
&lt;p&gt;
One note is needed to help fully understand the code. When emacs side sends a request to swank, swank is not always blocked by hunchentoot. As far as I understand it, one slime request may lead to a sequence of communications between swank and emacs.
&lt;pre&gt;01: (loop
02:   (read-slime-request)
03:   (exec-slime-request :
04:      (loop
05:         (read-http-request)
06:         (handle-http-request :
07:            (read-slime-request)
08:            (exec-slime-request :
09:               ...
10:               (read-slime-request)
11:               ...))))
&lt;/pre&gt;
In the emacs we should not make an HTTP request before sending the slime request that is to be read on the line 10.
&lt;p&gt;
To distinguish this situation on the emacs side I check whether the socket of HTTP request read by swank on the line 05 is still connected. In this case new HTTP request isn't performed.
&lt;p&gt;
This solution isn't 100% correct (the socket may be still not closed, but swank isn't going to read anything). But it works almost good. Sometimes a glitch appears - when you execute an expression, you get result of previous expression instead of the just executed. If you execute expressions &lt;i&gt;en&lt;/i&gt;, &lt;i&gt;en+1&lt;/i&gt;, &lt;i&gt;en+2&lt;/i&gt;, you get results of executing expressions &lt;i&gt;en-1&lt;/i&gt;, &lt;i&gt;en&lt;/i&gt;, &lt;i&gt;en+1&lt;/i&gt;. This "phase displacement" is most likely caused by the fact that we not performed HTTP request when it was necessary and the slime request remained not read by swank. When next time we do HTTP request for the next slime request, the previous unread request is read and executed by swank.
&lt;p&gt;
In principle, I know how to fix this problem (we may annotate HTTP requests and slime requests with some IDs and do synchronization - ignore unnecessary HTTP requests - on the common lisp side; socket checking on the emacs side will became unnecessary). But I do not want to spend time on it, it is easier to enforce reading enqueued expressions by the "special HTTP request" directly from browser: fetch &lt;a href="http://localhost:4343/slime-http-send-handler"&gt;http://localhost:4343/slime-http-send-handler&lt;/a&gt; needed count of times.
&lt;p&gt;
&lt;span style="font-weight: bold;"&gt;How to use it.&lt;/span&gt;
&lt;p&gt;
Very easy.
&lt;p&gt;
Add the following line into your .emacs file:
&lt;pre&gt;(load "c:/some/path/slime-over-http.el")
&lt;/pre&gt;The line should follow the normal slime setup.
&lt;p&gt;
Here is an example of common lisp web site:
&lt;pre&gt;
;; this line may vary in you case; just make
;; sure that asdf is loaded and all the needed
;; libraries are available
(load "c:/usr/unpacked/lisp-libs/setup-asdf-registry.lisp")

(asdf:operate 'asdf:load-op :hunchentoot)
(use-package :hunchentoot)

(defun want-slime-over-http-p ()
  "This predicate indicates whether we
are in the development environment and have no
threading"
  #+:win32 t)

(when (want-slime-over-http-p)
  (load "C:/usr/projects/slime-over-http/slime-over-http.lisp")
  (defun hunchentoot::keep-alive-p ()))

(setq *dispatch-table*
      `(dispatch-easy-handlers
        ,@(when (want-slime-over-http-p)
                (list (create-prefix-dispatcher
                           "/slime-http-send-handler"
                           (find-symbol "SLIME-HTTP-SEND-HANDLER"
                                        "SLIME-HTTP"))))
        default-dispatcher))

(define-easy-handler (hello :uri "/hello")
    ()
  "Hello, change me!")
&lt;/pre&gt;
After executing the above code run &lt;strong&gt;emacs&lt;/strong&gt; command &lt;code&gt;slime-start-hunchentoot&lt;/code&gt;. Now you may open &lt;a href="http://localhost:4343/hello"&gt;http://localhost:4343/hello&lt;/a&gt; in the browser and see the phrase "Hello, change me!".
&lt;p&gt;
You may change it because you have fully functioning slime with repl, debugger, etc.
&lt;p&gt;
To stop the server execute common lisp function &lt;code&gt;(slime-http::stop-instance)&lt;/code&gt;.
&lt;p&gt;
Note how we redefined &lt;code&gt;hunchentoot::keep-alive-p&lt;/code&gt; to return &lt;code&gt;nil&lt;/code&gt;. Single threaded server can't provide keep-alive, because while it is handling alive connection it can't accept any other connections (in particular from slime; also, IE is often unable to fully open a page with several images or frames in this case; looks like it opens several connections and schedules downloading different parts of the page to different connections; connections other than "kept alive" are not handled by hunchentoot).
&lt;p&gt;
In addition to redefining &lt;code&gt;keep-alive-p&lt;/code&gt; I also use reverse proxying apache for sure.
&lt;p&gt;
&lt;span style="font-weight: bold;"&gt;Resume&lt;/span&gt;
&lt;p&gt;
So we see quite simple way (despite the long explanation) to do web development with hunchentoot in free lisps available on windows.
&lt;p&gt;
It isn't the only way to develop web applications with common lisp if you are on windows. For example you may install linux virtual machine. Edi Weitz - the hunchentoot author - &lt;a href="http://weitz.de/win/#vmware"&gt;uses this approach&lt;/a&gt;.
&lt;p&gt;
&lt;span style="font-weight: bold;"&gt;PS&lt;/span&gt;
&lt;p&gt;
My code is called "slime-over-http" because initially I delivered slime requests over the TCP connection used by the HTTP request and only some time later I realized that it is unnecessary. I'd like another name (preferably short), but can't contrive it.
&lt;p&gt;
If you have any questions about this configuration - ask, I'll be glad to help.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-2086193867773241543?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/2086193867773241543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=2086193867773241543' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/2086193867773241543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/2086193867773241543'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2008/01/it-is-problematic-at-first-sight-to-use.html' title='Web development in single threaded lisp with slime and hunchentoot'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-330230180594402556.post-2105678230850802006</id><published>2007-12-12T09:48:00.000-08:00</published><updated>2009-08-23T01:50:49.379-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='ecl'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>ECL - multi threaded, free lisp, supporting Windows</title><content type='html'>Until yesterday I thought that there are no free multithreaded Common Lisp implementations for Windows.
&lt;p&gt;
But it turned out that &lt;a href="http://ecls.sourceforge.net/"&gt;ECL&lt;/a&gt; supports multithreading.
&lt;p&gt;
Yesterday I downloaded, build it and tried simple test: 
(mp:process-run-function 'zu (lambda () (loop (format t "zu~%") (sleep 3))))
&lt;p&gt;
Seems working.
&lt;p&gt;
Also ECL may be build with Unicode support. Although it doesn't support external formats in streams, strings and characters are represented as 24-bit values. It should be sufficient to have support for various external formats in IO using &lt;a href="http://weitz.de/flexi-streams/"&gt;flexi-streams&lt;/a&gt;.
&lt;p&gt;
Good news for me. I pin great hopes on ECL.
&lt;p&gt;
P.S.
&lt;p&gt;
I discovered ECL via &lt;a href="http://common-lisp.net/%7Edlw/LispSurvey.html"&gt;Common Lisp Survey&lt;/a&gt; linked from the &lt;a href="http://xach.livejournal.com/147621.html"&gt;xach's post&lt;/a&gt;. Thanks ... all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/330230180594402556-2105678230850802006?l=avodonosov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://avodonosov.blogspot.com/feeds/2105678230850802006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=330230180594402556&amp;postID=2105678230850802006' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/2105678230850802006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/330230180594402556/posts/default/2105678230850802006'/><link rel='alternate' type='text/html' href='http://avodonosov.blogspot.com/2007/12/ecl-multi-threaded-free-lisp-supporting.html' title='ECL - multi threaded, free lisp, supporting Windows'/><author><name>Anton Vodonosov</name><uri>https://profiles.google.com/106422194437151013578</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
