<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Thomas 'Toke' Kerpe</title>
 <link href="//toke.de/atom.xml" rel="self"/>
 <link href="//toke.de/"/>
 <updated>2012-02-22T23:05:22+01:00</updated>
 <id>//toke.de/</id>
 <author>
   <name>Thomas Kerpe</name>
   <email>web@toke.de</email>
 </author>

 
 <entry>
   <title>Evaluating Disqus</title>
   <link href="//toke.de/blog/2012/02/21/disqus/"/>
   <updated>2012-02-21T00:00:00+01:00</updated>
   <id>/blog/2012/02/21/disqus</id>
   <content type="html">&lt;h2 id='commenting'&gt;Commenting&lt;/h2&gt;

&lt;p&gt;I&amp;#8217;m not a big fan of external services. Especially since I do not log IP-Adresses and offloading Javascript gives some more problems with privacy. This site is very simple. But I want to add comments to blog posts. My plan was to write a little comment script for embedding via Javascript. Since I don&amp;#8217;t have so much time right now I will look for alternatives. Now I am experimenting with &lt;a href='http://disqus.com'&gt;disqus&lt;/a&gt;. The service looks nice and integrates very well with my site. One downside is the missing SSL support. I will look after this later.&lt;/p&gt;

&lt;p&gt;For the next weeks the disqus service will be available on this site, maybe for a longer time. We&amp;#8217;ll see. Feel free to comment.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>How do I Post</title>
   <link href="//toke.de/blog/perl/2012/02/09/how-i-post/"/>
   <updated>2012-02-09T00:00:00+01:00</updated>
   <id>/blog/perl/2012/02/09/how-i-post</id>
   <content type="html">&lt;h2 id='or_how_this_site_is_updated'&gt;Or how this site is updated&lt;/h2&gt;

&lt;p&gt;This site is build via &lt;a href='https://github.com/mojombo/jekyll'&gt;jekyll&lt;/a&gt; and the sources are coming from a git repository on &lt;a href='https://github.com'&gt;github&lt;/a&gt;. I do not write something special about &lt;code&gt;git&lt;/code&gt; or &lt;code&gt;jekyll&lt;/code&gt; here. Just how the &amp;#8220;deployment&amp;#8221; works.&lt;/p&gt;

&lt;h2 id='github_webhook'&gt;Github webhook&lt;/h2&gt;

&lt;p&gt;Github has a nice feature called &amp;#8220;Service hooks&amp;#8221; - especially a &amp;#8220;Post-Receive URLs&amp;#8221; hook. I use this hook to notify my server to do a &lt;code&gt;git pull&lt;/code&gt; on a local repository, then rebuild the site with &lt;code&gt;jekyll&lt;/code&gt; and &lt;code&gt;rsync&lt;/code&gt; changed data to the document root.&lt;/p&gt;

&lt;p&gt;The webhook endpoint (Dancer.pm code):&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='perl'&gt;    &lt;span class='nb'&gt;package&lt;/span&gt; &lt;span class='n'&gt;ReceiveHook&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='k'&gt;use&lt;/span&gt; &lt;span class='n'&gt;Dancer&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;:syntax&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    
    &lt;span class='k'&gt;our&lt;/span&gt; &lt;span class='nv'&gt;$VERSION&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;0.3&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    
    &lt;span class='c1'&gt;# Configuration for different projects&lt;/span&gt;
    &lt;span class='k'&gt;my&lt;/span&gt; &lt;span class='nv'&gt;$config&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='s'&gt;&amp;quot;PROJECTNAME&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='n'&gt;run&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/home/user/bin/updateblog.sh&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
        &lt;span class='p'&gt;},&lt;/span&gt;
    &lt;span class='p'&gt;};&lt;/span&gt;
    
    &lt;span class='n'&gt;prefix&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;/notify&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    
    &lt;span class='n'&gt;get&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;/*&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='k'&gt;sub &lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;header&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='n'&gt;status&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;405&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='s'&gt;&amp;quot;Not for you\n&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;};&lt;/span&gt;
    
    &lt;span class='n'&gt;post&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;/:project&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='k'&gt;sub &lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ow'&gt;not&lt;/span&gt; &lt;span class='nb'&gt;defined&lt;/span&gt; &lt;span class='nv'&gt;$config&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='n'&gt;params&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='n'&gt;project&lt;/span&gt;&lt;span class='p'&gt;}})&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='n'&gt;status&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;not_found&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;No such project: &amp;quot;&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;params&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='n'&gt;project&lt;/span&gt;&lt;span class='p'&gt;}&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    
        &lt;span class='k'&gt;my&lt;/span&gt; &lt;span class='nv'&gt;$payload&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;params&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='s'&gt;&amp;#39;payload&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;};&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ow'&gt;not&lt;/span&gt; &lt;span class='nb'&gt;defined&lt;/span&gt; &lt;span class='nv'&gt;$payload&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='n'&gt;status&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;415&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;I need a payload\n&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    
        &lt;span class='c1'&gt;# Read the configuration for that repo&lt;/span&gt;
        &lt;span class='k'&gt;my&lt;/span&gt; &lt;span class='nv'&gt;$repo_config&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$config&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='nv'&gt;$repo&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='n'&gt;name&lt;/span&gt;&lt;span class='p'&gt;}};&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;defined&lt;/span&gt; &lt;span class='nv'&gt;$repo_config&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='nb'&gt;defined&lt;/span&gt; &lt;span class='nv'&gt;$repo_config&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='n'&gt;run&lt;/span&gt;&lt;span class='p'&gt;})&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='nb'&gt;eval&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
                &lt;span class='nb'&gt;system&lt;/span&gt; &lt;span class='nv'&gt;$repo_config&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='n'&gt;run&lt;/span&gt;&lt;span class='p'&gt;};&lt;/span&gt;
            &lt;span class='p'&gt;};&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    
        &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;OK&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;};&lt;/span&gt;
    
    &lt;span class='n'&gt;true&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The update itself is done by this little shellscript:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='sh'&gt;    &lt;span class='c'&gt;#!/bin/sh&lt;/span&gt;

    &lt;span class='nv'&gt;REPPATH&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;/home/user/git/localgitrepository&amp;quot;&lt;/span&gt;
    &lt;span class='nv'&gt;DEPLOYTARGET&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;/var/www/sites/mydomain&amp;quot;&lt;/span&gt;
    &lt;span class='nv'&gt;LIVEURL&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;http://mydeploydomain.tld&amp;quot;&lt;/span&gt;

    &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='o'&gt;[&lt;/span&gt; -d &lt;span class='k'&gt;${&lt;/span&gt;&lt;span class='nv'&gt;REPPATH&lt;/span&gt;&lt;span class='k'&gt;}&lt;/span&gt; &lt;span class='o'&gt;]&lt;/span&gt; ; &lt;span class='k'&gt;then&lt;/span&gt;
&lt;span class='k'&gt;        &lt;/span&gt;&lt;span class='nb'&gt;cd&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;${REPPATH}&amp;quot;&lt;/span&gt;
        git pull
        jekyll --url &lt;span class='s2'&gt;&amp;quot;${LIVEURL}&amp;quot;&lt;/span&gt;
        rsync -rXogpEAt _site/ &lt;span class='s2'&gt;&amp;quot;${DEPLOYTARGET}&amp;quot;&lt;/span&gt;
    &lt;span class='k'&gt;fi&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;aside&gt;
&lt;h2&gt;More&lt;/h2&gt;
&lt;p&gt;
That is just the surface what really is possible. I also use this method in
different other setups. Just to mention differnet usecases:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keep repositories synchronized&lt;/li&gt;
&lt;li&gt;Automatic Builds&lt;/li&gt;
&lt;li&gt;Automatic deployments&lt;/li&gt;
&lt;li&gt;Test framework&lt;/li&gt;
&lt;li&gt;Configuration management&lt;/li&gt;
&lt;li&gt;Even a small distributed site or WiKi is possible&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
With a simple git post-commit-hook such a http Post with `curl` it is
github independent.&lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;To be continued&amp;#8230;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Hello world</title>
   <link href="//toke.de/blog/2011/08/17/hello-world/"/>
   <updated>2011-08-17T00:00:00+02:00</updated>
   <id>/blog/2011/08/17/hello-world</id>
   <content type="html">&lt;h1 id='hello_from_jekyll'&gt;Hello from Jekyll&lt;/h1&gt;

&lt;p&gt;First post from jekyll.&lt;/p&gt;</content>
 </entry>
 
 
</feed>

