cetcd: Clojure wrapper for etcd

I’ve just released cetcd a Clojure wrapper for etcd. etcd is  a distributed key-value store similar to Zookeeper.

The cool thing about cetcd is that it gets callbacks for free by using the http-kit client library to talk to etcd. They work very well with etcd’s built-in key watching via long-polling.

The repo’s readme has a good overview of how things work. Check it out on GitHub.

How to use swank-js with Coffeescript

If you haven’t heard of swank-js or don’t think that it’s very interesting, go watch this Emacs Rocks! episode.

Setting up emacs to use swank-js was a bit tricky, so I’ll go over what worked for me. Emacs 24 and marmalade-repo are required.

First, I followed all of the instructions on the swank-js Github page. I also installed slime, slime-js, and slime-repl from elpa. Then I added Magnar’s setup-slime-js to my load path and added the following to my init.el file:

(add-hook 'after-init-hook
  #'(lambda ()
    (when (locate-library "slime-js")
      (require 'setup-slime-js))))

(global-set-key [f5] 'slime-js-reload)
(add-hook 'js2-mode-hook
  (lambda ()
    (slime-js-minor-mode 1)))

(require 'coffee-mode)

(add-hook 'coffee-mode-hook
  (lambda ()
    (local-set-key (kbd "C-c C-d") 'slime-js-coffee-eval-current)
    (local-set-key (kbd "C-c C-b") 'slime-js-coffee-eval-buffer)
    (slime-js-minor-mode 1)))

Use my version of Magnar’s setup-slime-js.el file to get coffeescript support. It requires some coffee-mode functions to compile the coffeescript to javascript, so make sure you have coffee-mode in your load path.

My two main contributions are:

(defun slime-js-coffee-eval-current ()
  (interactive)
  (coffee-compile-region (point) (mark))
  (switch-to-buffer coffee-compiled-buffer-name) 
  (slime-js-eval-buffer)
  (kill-buffer coffee-compiled-buffer-name))

(defun slime-js-coffee-eval-buffer ()
  (interactive)
  (coffee-compile-buffer)
  (switch-to-buffer coffee-compiled-buffer-name) 
  (slime-js-eval-buffer)
  (kill-buffer coffee-compiled-buffer-name))

The functions basically automate the process of executing coffee-compile-*, sending the code to the browser through swank-js, and deleting the compilation buffer.

The next thing to add is sass compilation. The file on Github will be updated as soon as I add it, so stay tuned.

How to do Basic Authentication in App Engine

Basic access authentication is a method for a web browser or other client program to provide a user name and password when making a request1.

This is how I implemented it in Google App Engine using Python:

import base64

url = 'https://www.example.com'
my_auth = 'Basic %s' % base64.b64encode('username:password')
response = urlfetch.fetch(url, headers = {'Authorization': my_auth})

I haven’t tested this extensively, but it works with fastspring‘s API.

I thought I’d mention it because if you use the wrong base64 encoder, you may end up with an extra newline character or something that breaks the code.

Four Methods of Embedding Images in Emails – One of Them is Really Cool

I just launched Img to CSS, a new tool that converts images to pure html/css. In the process of posting my new tool to Hacker News and Reddit, I discovered two new ways to embed images into emails. In this post, I’ll be outlining the advantages and disadvantages of four different methods.

The first three methods use regular old “img” tags, but they use different attributes.

The most familiar should be the “src=url”. You give it a link and it pulls the image off of the internet. This method makes you dependent on external resources, which has its own advantages and disadvantages. On one hand, you can change the content if you’d like. On the other hand, if the external resource goes down or the image moves, your users won’t see anything.

The next two methods use static content that is bundled with the email. They may not work in all browsers and email clients, however.

The first is content id, or cid. Like the previous method, it uses the “src” attribute. The difference is that it references an email attachment instead of an external resource. This is nice because it keeps the email self-contained. In twenty years, the user will still be able to see the images in his email.

I wasn’t able to find any single authoritative source on how to use cid, but the syntax seems to be something like <img src=”cid:image_attachment_id” />.

The third method uses the data URI scheme. An entire image is embedded in a string of characters. For example, this red dot: Red dot is created by the following:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />

You can convert your own image to a data URI with this tool. Here is an example of a twitter button, , which illustrates one disadvantage of data URI’s — length.

<img src=”data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAqhJREFUOBEFwbuLXGUYwOHf+37fnLnt7Oy6u16IVjYSt4iYRktJsYL4P4iNYq1YGAx2WlkYbEVBtLG3lUiIKCgENirimGBg4+zuXPbM+c75Lq/PI0fvf/zha++8e2O1rtmkRCxGMVCBvlMEMAAMDAwYeMfO9oTvv/j8U/nkeNWdtbH3aBPJGFd2BxxOK+5vErfnARUQAMAADLIZ+wPPwWSEDyn25k2ks8IrT4x449kpDXANuDRyfPvPBZUKBoCBgALzENnqJ7RNmYQBcO2pEfMCDzrjfoKX94cMvZDMKBhNNrpiFDMy0OWEz1YAcApehIsMywxtMZ4eKDcO9ygAZvxdR76araiTIUAuhp+tak46Y+g9xYwINAbR4Lg1Rs5hQGtwZd/TU+H6byeElGlzh8/Aooucd5FYChcZziJ4gUfREAwDosF5Ui5veZZdxyZlDoYe71WonMMAEaHJsExGX4ypEwAAKoHnBnDvtKMzoe89zileVXGqIIIihFxYx0K/J7w6VQAAAO6cNnx0PKfvHYLhVPEqgnOKIKjAJhvrZAwFQgEVAMCM7Z7yWN9zkQzFcCp4VcWJkYFohhiso5GLcfNhBAAgGxztVVy/vM9bv5wgZqgoqiI4FTLC7dOWl6aOZMZJW5iFzCxkZiHzV5P5cZG4NPRMKoeooCJ4J4KqMnbCN//WvLA74L1nKm4tM+tkqIAZIHC057lzFthk8KqoCr7yju1KWEWjM/jg3oLXnxxxdadiNFYAMCgYt/5r+PJBjVdh4pSBd8ib3/3w8+7h1RfndaAFnCoJpXKOnlMQMDNyKbSp4KzQF+NgPOTsj7u/u8fr+U+Dnb3nh8r2VrPsxs0qTMMqTMIybDXLsNUsw3hzHkb1Ikw2yzDaLNreZtXUf9799eHXn739PxaJZJHkea9sAAAAAElFTkSuQmCC” width=”16″ height=”16″>

An image as small as the twitter button creates a very long string, imagine the length of a full size image.

The main disadvantage of the previous three methods is that many email clients indiscriminately block the img tag. This makes perfect sense in the first case since the act of downloading the external image also acts as a tracking device. The second and third methods can’t send any information back to the sender, but they were still blocked in my testing. The reason that they are blocked may be that the email provider can’t parse the images for spammy content. The last method doesn’t suffer this problem.

The last method is the cool method I promised in the title. It is my favorite, mostly because I created the best tool for making them. I’ll call these “css images”, even though they are really html and css. In general, css images are colored html elements that are shrunk down to the pixel level. My tool uses a list with lots of pixel-high items and paragraphs, but you could use lots of other elements, like tables or divs.

This method has some huge disadvantages, but it has one advantage that more than makes up for it in the right circumstances.

The biggest disadvantage is size. That twitter icon from earlier, represented here as a css image,

  •  

     

  •  

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  •  

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  •  

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  •  

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  •  

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  •  

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  •  

     

     

     

     

     

     

     

     

     

     

     

     

     

  •  

     

     

     

     

     

     

     

     

     

     

     

     

  •  

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  •  

     

     

     

     

     

     

     

     

     

     

     

     

     

  •  

     

     

     

     

     

     

     

     

     

     

     

     

     

  •  

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  •  

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  •  

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  •  

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

, has a much bigger file size:

<div style=”display:block;width:16px;height:16px”><ul style=”float:left;margin-left:0px;display:block;margin:0;padding:0;border:0;width:16px;height:16px”><li style=”display:block;float:left;margin-bottom:0;max-height:1px;height:1px;width:16px;margin:0;padding:0;border:0;background:transparent;clear:both;overflow:hidden;”><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#487889;margin:0;padding:0;overflow:hidden;opacity:0.50;filter:alpha(opacity=49)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#94e3fe;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#86d6f3;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#7cd2ef;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#77d0ee;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#75cfee;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#77d0ee;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#7ed3f0;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#7fd3f0;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#7ed3f0;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#7ed3ef;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#7ed2ef;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#7dd2ef;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#85d6f2;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#95e4ff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#4e8496;margin:0;padding:0;overflow:hidden;opacity:0.56;filter:alpha(opacity=56)”></p><li style=”display:block;float:left;margin-bottom:0;max-height:1px;height:1px;width:16px;margin:0;padding:0;border:0;background:transparent;clear:both;overflow:hidden;”><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#8ad7f2;margin:0;padding:0;overflow:hidden;opacity:0.98;filter:alpha(opacity=98)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#78d0ed;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#62c6e8;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#5fc6e7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#8fd7ef;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#bbe6f5;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#9ddcf1;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#64c8e9;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#66c9e9;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:2px;height:1px;max-height:1px;background-color:#67c9e9;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#66c9e9;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#66c8e9;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#63c7e8;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#77cfec;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#8cdcf6;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><li style=”display:block;float:left;margin-bottom:0;max-height:1px;height:1px;width:16px;margin:0;padding:0;border:0;background:transparent;clear:both;overflow:hidden;”><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#82d3ed;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#64c7e8;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#5cc5e6;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#9edcf0;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#ffffff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#f6ffff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#ffffff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#b8e6f4;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#61c7e8;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#67c9e9;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#66c9e9;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:2px;height:1px;max-height:1px;background-color:#66c9e8;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#65c8e8;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#63c7e7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#83d6f2;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><li style=”display:block;float:left;margin-bottom:0;max-height:1px;height:1px;width:16px;margin:0;padding:0;border:0;background:transparent;clear:both;overflow:hidden;”><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#7bcfea;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#60c7e7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#5cc5e6;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#e2f5fa;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#ebfdff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#d9f9fe;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#e1fbff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#f2fafd;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#6acbe9;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#63c8e8;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#64c9e8;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#5dc6e7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#60c7e7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#63c7e7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#60c7e7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#7dd3ee;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><li style=”display:block;float:left;margin-bottom:0;max-height:1px;height:1px;width:16px;margin:0;padding:0;border:0;background:transparent;clear:both;overflow:hidden;”><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#78cee8;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#60c7e7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#5fc7e6;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#e6f6fb;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#dffaff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#caf6fe;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#d2f7fe;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#fdffff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#eaf7fc;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#e8f7fc;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#e8f6fb;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#c7ebf6;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#6acbe8;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#5fc7e7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#60c7e7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#7ad1ed;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><li style=”display:block;float:left;margin-bottom:0;max-height:1px;height:1px;width:16px;margin:0;padding:0;border:0;background:transparent;clear:both;overflow:hidden;”><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#58c0dd;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#41badc;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#4abee0;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#e4f5fa;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#dafaff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#c1f5fe;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#c5f5fe;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#d4f8fe;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#defaff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#ddfaff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#d6f9ff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#f7ffff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#ccedf7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#49bee0;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#41badd;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#59c4e1;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><li style=”display:block;float:left;margin-bottom:0;max-height:1px;height:1px;width:16px;margin:0;padding:0;border:0;background:transparent;clear:both;overflow:hidden;”><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#55c0dd;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#31b4d7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#30b4d7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#dff3f8;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#cef7ff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#aff0fe;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#b3f1fe;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#aff0fd;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#b0f0fd;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#aff0fd;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#aaeffd;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#c5f5ff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#eff9fb;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#3ab8da;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#30b4d7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#56c3e1;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><li style=”display:block;float:left;margin-bottom:0;max-height:1px;height:1px;width:16px;margin:0;padding:0;border:0;background:transparent;clear:both;overflow:hidden;”><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#59c2de;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#37b7da;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#36b7da;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#e0f4f9;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#c5f4ff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#a0ecfd;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#a7edfc;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:3px;height:1px;max-height:1px;background-color:#b6f0fd;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#b5f0fd;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#edfdff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#c7eaf5;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#34b7db;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#37b8db;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#59c6e3;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><li style=”display:block;float:left;margin-bottom:0;max-height:1px;height:1px;width:16px;margin:0;padding:0;border:0;background:transparent;clear:both;overflow:hidden;”><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#5bc4e0;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#3ab9dc;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#3abadd;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#e2f4fa;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#bdf1fd;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#93e7fb;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#a7ecfc;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:4px;height:1px;max-height:1px;background-color:#ffffff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#c8ecf6;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#49c1e1;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#3bbbde;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#3cbbdd;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#5cc8e5;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><li style=”display:block;float:left;margin-bottom:0;max-height:1px;height:1px;width:16px;margin:0;padding:0;border:0;background:transparent;clear:both;overflow:hidden;”><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#5dc5e1;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#3dbcde;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#3ebcdf;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#e4f5fa;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#b3eefc;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#86e3fa;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#9ce8fb;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#f7fdff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:2px;height:1px;max-height:1px;background-color:#f9feff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#f9fdfe;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#d6f1f8;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#5bc8e5;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#3dbde0;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#3fbddf;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#5fcae6;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><li style=”display:block;float:left;margin-bottom:0;max-height:1px;height:1px;width:16px;margin:0;padding:0;border:0;background:transparent;clear:both;overflow:hidden;”><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#5fc7e3;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#40bde0;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#3dbde0;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#dff4f9;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#b4edfc;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#79def9;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#83e1f9;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:3px;height:1px;max-height:1px;background-color:#8ce3fa;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#89e2fa;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#d1f5fe;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#d8f2f9;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#40bfe2;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#41bee1;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#61cbe8;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><li style=”display:block;float:left;margin-bottom:0;max-height:1px;height:1px;width:16px;margin:0;padding:0;border:0;background:transparent;clear:both;overflow:hidden;”><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#61c8e4;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#43bfe1;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#3abde1;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#a6e1f2;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#edfcff;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#75ddf8;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#6cdaf7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:3px;height:1px;max-height:1px;background-color:#6cdbf7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#66d9f7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#96e5fa;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#f3fbfd;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#4dc5e5;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#42c0e2;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#63cce9;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><li style=”display:block;float:left;margin-bottom:0;max-height:1px;height:1px;width:16px;margin:0;padding:0;border:0;background:transparent;clear:both;overflow:hidden;”><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#64c9e5;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#45c1e3;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#45c2e4;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#4ec6e7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#d7f2fa;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#ebfafe;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#afebfb;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#a2e7fa;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#a4e8fa;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#a3e7fa;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#a3e8fa;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#ebfbfe;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#bce9f6;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#43c2e5;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#46c2e4;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#65ceea;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><li style=”display:block;float:left;margin-bottom:0;max-height:1px;height:1px;width:16px;margin:0;padding:0;border:0;background:transparent;clear:both;overflow:hidden;”><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#6acde8;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#53c7e6;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#45c2e5;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#48c5e7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#53caea;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#a1e2f4;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#d5f2fa;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:2px;height:1px;max-height:1px;background-color:#dff6fc;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#dff5fc;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#ddf5fb;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#afe6f5;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#51c9ea;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#47c4e6;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#54c7e7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#6dd2ed;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><li style=”display:block;float:left;margin-bottom:0;max-height:1px;height:1px;width:16px;margin:0;padding:0;border:0;background:transparent;clear:both;overflow:hidden;”><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#63aec2;margin:0;padding:0;overflow:hidden;opacity:0.80;filter:alpha(opacity=80)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#74daf6;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#60cfee;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#59cfee;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#5cd1f0;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#58d1f2;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#5ed4f5;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#63d7f7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#63d8f7;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#62d7f6;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#5fd5f4;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#58d1f2;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#5bd0f0;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#62d1ef;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#77dcf8;margin:0;padding:0;overflow:hidden;opacity:1.00;filter:alpha(opacity=100)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#65b6cc;margin:0;padding:0;overflow:hidden;opacity:0.85;filter:alpha(opacity=84)”></p><li style=”display:block;float:left;margin-bottom:0;max-height:1px;height:1px;width:16px;margin:0;padding:0;border:0;background:transparent;clear:both;overflow:hidden;”><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#474c4d;margin:0;padding:0;overflow:hidden;opacity:0.19;filter:alpha(opacity=18)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#65a3b4;margin:0;padding:0;overflow:hidden;opacity:0.76;filter:alpha(opacity=76)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#6bbbd1;margin:0;padding:0;overflow:hidden;opacity:0.93;filter:alpha(opacity=93)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#6ebcd0;margin:0;padding:0;overflow:hidden;opacity:0.94;filter:alpha(opacity=94)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#70bdd2;margin:0;padding:0;overflow:hidden;opacity:0.94;filter:alpha(opacity=93)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#73bfd4;margin:0;padding:0;overflow:hidden;opacity:0.94;filter:alpha(opacity=93)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#75c1d5;margin:0;padding:0;overflow:hidden;opacity:0.94;filter:alpha(opacity=93)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#78c3d7;margin:0;padding:0;overflow:hidden;opacity:0.94;filter:alpha(opacity=93)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#79c4d8;margin:0;padding:0;overflow:hidden;opacity:0.94;filter:alpha(opacity=93)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#78c3d6;margin:0;padding:0;overflow:hidden;opacity:0.94;filter:alpha(opacity=93)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#75c1d5;margin:0;padding:0;overflow:hidden;opacity:0.94;filter:alpha(opacity=93)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#73bfd4;margin:0;padding:0;overflow:hidden;opacity:0.94;filter:alpha(opacity=93)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#71bdd2;margin:0;padding:0;overflow:hidden;opacity:0.94;filter:alpha(opacity=94)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#6ebdd2;margin:0;padding:0;overflow:hidden;opacity:0.93;filter:alpha(opacity=93)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#67a7b9;margin:0;padding:0;overflow:hidden;opacity:0.78;filter:alpha(opacity=77)”></p><p style=”display:block;float:left;width:1px;height:1px;max-height:1px;background-color:#4c5456;margin:0;padding:0;overflow:hidden;opacity:0.22;filter:alpha(opacity=21)”></p></li></ul></div>

The resulting file is so large, that an image larger than 100 by 100 stands a good chance of being truncated by an email client such as gmail.

The other big disadvantage is positioning. You have to do some pretty impressive div wrangling to get the image in the right spot. I didn’t quite succeed in the example above, but that is mostly because wordpress insists on creating rogue paragraph tags.

But! There is a huge advantage. Email clients can’t tell that css images are really images. The image looks like regular old html, so it gets displayed just like the text. The user will still see the images — even in they are in the spam folder. That’s the cool part.

The size limitation makes them best suited for company logos and critical buttons or icons. For example, you might want to make sure your customers can see the social media sharing buttons. Even if they don’t allow your other images, you still want them to be able to share your content.

Those are the four methods of embedding images in emails. Let me know if I missed any. I didn’t know about two of them yesterday, so there are probably others out there that I’m unaware of.

Create Single-Use Bookmarks with Reminder Bear

I just launched Reminder Bear, my app that lets you create single-use bookmarks. It works by sending you an email one week after you bookmark a page with the included bookmarklet. I use it mainly for following comment threads on Hacker News and Reddit. In general, it’s pretty handy for any page that gets updated, but which doesn’t have an established feed. Also, sites that have a feed, but the hassle of subscribing isn’t worth getting the update.

You can follow Reminder Bear on twitter to get updates on development. The app is pretty bare-bones right now, but more features are coming. Expect to see user pages, optional daily email summaries, and variable delays between the time you bookmark and the time you get an email. If you like things the way they are, then don’t worry — I plan to add these features without affecting the current user experience.

Update: At this moment, a Google search for “Reminder Bear” returns this post as the fifth entry, but the actual app as the 10th entry. I’m hoping that the Google juice from my blog will raise my app’s ranking, but if I don’t have enough juice to get my blog to the first result…

Duck Duck Google

I bought the domain duckduckgoogle.com during GoDaddy’s $1/domain sale last week. For the uninitiated, DuckDuckGo is a search engine run by Gabriel Weinberg. Its main advantage is heavy spam filtering, but it also has some neat features like !bang keywords and infinite scrolling. I bought the domain because the name is clever and I have a few ideas for a Google/DuckDuckGo mash-up that I may try to implement over the winter break.

In the meantime, I have the domain set to automatically redirect to duckduckgo.com or google.com. It randomly chooses one of the two with a 6-1 preference to DuckDuckGo. It’s a vague semblance of the game “duck, duck, goose”, with Google playing the role of the goose and javascript playing the role of the picker. I haven’t figured out how to get Google to chase javascript around the circle yet, but I’m working on it.

I put the site up on Friday and submitted it to Reddit and Hacker News. It is currently at 11 upvotes / 10 downvotes on Reddit and 9 upvotes on Hacker News. Despite the low point totals, I still received about 3000 unique visitors 1 from both sources combined. You can click on the image of the Apache logs (created with AWStats) for a more complete list of referrers.

As you can see, I got a nice benefit from being “controversial,” i.e. having an even distribution of upvotes and downvotes, on Reddit. I also got more traffic from Hacker News than I expected. They tend to be very serious bunch, but I think submitting on a Friday evening probably helped.

Most of the traffic has tapered off over the weekend. I got a few new hits from twitter today, but I doubt that will take off. It was fun while it lasted, and I hope a few people enjoyed it.

Cool Tools Published My SKB Pens Review

Cool Tools is a tool review blog powered by reader-submitted reviews. I have found some neat stuff on there, like this Yama Vacuum Pot for making coffee.

Here’s the SKB pens review I sent to Cool Tools:

I have been using this pen for about three months.
This is the only pen I have owned that is suitable for writing technical notes. I like it for the following reasons:
  • It has a .5mm point, which allows me to write small details such as subscripts and fractions.
  • It is a ballpoint, so it doesn’t bleed — another annoyance when writing small details.
  • It doesn’t gum up as my Zebra ballpoints tended to, so it is suitable for drawing diagrams.
  • It can write continuously without drying up and it flows over the paper. Most .5mm pens I’ve used dry up after writing for a while and are so sharp that they scratch the paper.
  • It costs about $1. The downside here is that there is only one supplier in the US (that I’m aware of) and you have to buy twelve pens at a time.
You can buy it in black, blue, red, purple, or green with a .5mm point. You can also get black with a .7mm point.

The editor converted my bulleted list to a paragraph, which explains the odd sentence structure in the review as it appears on Cool Tools.

After I sent in the review, I sent an email warning the person selling the pens that they may get a surge in orders if the review was posted. As a thank you, the seller sent me a free box of pens! Now I have about twenty of these things floating around. Go get your own at skbpens.com.

Update: The seller posted this comment to the review:

Thank you for the interest and review of our pens. We are striving to keep up with the sudden influx of incoming orders. We try to ship in the same business day but this posting has overwhelmed us. If you have placed an order and have not yet received shipping confirmation, please be patient.

Reading Ebooks on Dual Monitors

Here is a clever to read ebooks on a computer with dual monitors:

Ebook reader on dual monitor

Splitting the eReader display across two screens makes reading ebooks feel more like reading a regular paperback. The book in the picture is Anna Karenina and the eReader is from Mobipocket.

Peikoff Answered my Question!

Dr. Peikoff is an Objectivist scholar who answers questions emailed to him in his weekly podcast. I emailed him the following question at the end of March:

Dr. Peikoff,

From my understanding, the derivation of the Objectivist ethics has among its assumptions that human nature (where human nature is defined as the properties of an individual human being) is an absolute. Is this correct?

If so, this assumption is only approximately true because according to evolutionary theory humans change slightly over large stretches of time. I think that a good parallel could be drawn here with the mathematics of infinitesimals.

My question is, how do you think that human nature will change in the future, and what will be its effect on ethics? Will the new ethical theory be a disjoint set of principles that regards humans today similar to how we now regard animals? Will the range narrow, so that we have more restrictions on our actions? Will it widen, so that some actions which are immoral today become moral?

Thanks for reading,
Daniel Woelfel


I think he answered my question in his last podcast, although it was slightly rephrased. The question he answered was: “What would be the effect on morality if human nature changes, for example by continual evolution?” I was a bit embarrassed to have sent him such a convoluted phrase as “continual evolution”, but it never appears in my original letter. Either that was Peikoff’s own convolution, or someone else sent him a similar question.

If you have flash enabled, you can listed to his question below. If the player doesn’t work for you, here is a link to his answer.

[gplayer href=”http://www.peikoff.com/wp-content/uploads/2010/06/2010-6-14.116_A.mp3″ ] [/gplayer]

I’ll summarize his answer:

Superficial changes, such as the addition of wings, would not change the fact that our mind is our means of survival. The Objectivist ethics hold that morality is based on the requirements of survival and that humans survive by means of reason. So morality would only change if reason was no longer the means of survival. If reason was no longer our means of survival, then the Objectivist ethics would no longer apply. Peikoff had no idea what might replace reason.

I was hoping for a more exploratory answer, in which he guessed how our nature could change and what new ethical framework might arise. I thought he wouldn’t be able to resist, since this question is very similar to the “how would an alien intelligence differ from our own” question that is often asked in the sort of science fiction Peikoff says he enjoys.

What I’m Reading

Structure and Interpretation of Computer Programs by Harold Abelson and Gerald Jay Sussman

I’m reading this in pace with the MIT lectures. I’m still in chapter 1, but I think this book could be titled How to Think Like a Computer Scientist.

Rex Barks: Diagramming Sentences Made Easy by Phyllis Davenport

This is to fill a glaring hole in my education that I’ve been meaning to fill for years. I’ve tried a couple of other grammar books, but either they didn’t explain the fundamentals, or they weren’t adequate for self-study. Rex Barks assumes no previous knowledge and provides answers to every problem in the back of the book. It is the perfect self-study grammar book.

I plan to write a sentence diagramming app once I’ve completed the book. Expect to see a few blog posts on that. I’m currently at chapter 3.

Flow: The Psychology of Optimal Experience by Mihaly Csikszentmihalyi

Flow is the state of complete immersion in some activity. This book introduces the concept of flow, how one achieves it, and why it is important. Wikipedia has an good overview of the book.

I’ve just started chapter 6. I’ll write a review with a few criticisms once I finish it.

He has also written Creativity: Flow and the Psychology of Discovery and Invention, which I plan to read next.

Study in Power by Allan Nevins

This is a biography of John D. Rockefeller. I had to check it out from the library since it is very hard to find. The link above is to Amazon.com search results.

I’m reading this book on the recommendation of Alex Epstein in his Triumph and Tragedy of the Oil Industry lectures.

I’m at chapter 4.

Born Standing Up by Steve Martin

This is Steve Martin’s autobiography. I’m about three quarters of the way through. I find him remarkable for two reasons. One, his thoughtful experimenting and theorizing. Two, his constant, purposeful progress towards becoming a comedian.

Perfume: The Story of a Murderer by Patrick Suskind

I decided to read this after seeing the movie. I think that both book and movie are excellent, but I wish I would have read the book first. The main character in the movie doesn’t quite match the description in the book, but I can’t help seeing the movie version in my mind.

Atlas Shrugged by Ayn Rand

I’m reading this in preparation for the Atlas Shrugged Essay Contest. I think this is my third reading, but it is even better than I remember. I’m following along with Diana Hsieh’s podcasts.

I’m at chapter 6.

Anna Karenina by Leo Tolstoy

I’m making slow progress through this book. I started it as an escape from the terrible prose of Larry Niven.

The links are Amazon Associate links, so I make a small amount of money if somebody purchases the books from these links. If this offends you for some reason, I suggest you install my greasemonkey script Shorten Amazon Links (Chrome Compatible).