<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;D08DRH89cCp7ImA9WhRaE0U.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727</id><updated>2012-02-16T10:51:15.168+01:00</updated><category term="technology" /><category term="dll" /><category term="postgres" /><category term="tools" /><category term="bootloader" /><category term="C" /><category term="vm" /><category term="ARM" /><category term="crosscompiler" /><category term="postfix" /><category term="gadget" /><category term="Windows" /><category term="u-boot" /><category term="library" /><category term="GTK" /><category term="GUI" /><category term="C++" /><category term="tls" /><category term="Other" /><category term="git" /><category term="spam" /><category term="OpenSUSE" /><category term="resource" /><category term="video" /><category term="Lua" /><category term="Android" /><category term="X11" /><category term="windres" /><category term="snippets" /><category term="Go" /><category term="virtualbox" /><category term="toolchain" /><category term="msys" /><category term="C/C++" /><category term="elf" /><category term="ssh" /><category term="blog" /><category term="handler" /><category term="PHP" /><category term="MinGW" /><category term="PostgreSQL" /><category term="opinion" /><category term="Linux" /><category term="icon" /><category term="Eclipse" /><category term="gcc" /><category term="AVR" /><category term="Ubuntu" /><category term="interrupt" /><category term="subversion" /><title>(A)bort, (R)etry, (G)et a coffee</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://andrejs-cainikovs.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>36</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/abortretrygetACoffee" /><feedburner:info uri="abortretrygetacoffee" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CkADQnY7fSp7ImA9WhRXEEg.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-5743582747615887936</id><published>2011-12-16T16:52:00.000+01:00</published><updated>2011-12-16T16:52:53.805+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-16T16:52:53.805+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>Nine-patch Bitmaps on Android</title><content type="html">Excerpt from new &lt;a href="https://developer.android.com/training/index.html"&gt;Android Training&lt;/a&gt; by Google:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Supporting different screen sizes usually means that your image resources must also be capable of adapting to different sizes. For example, a button background must fit whichever button shape it is applied to.&lt;br /&gt;
&lt;br /&gt;
If you use simple images on components that can change size, you will quickly notice that the results are somewhat less than impressive, since the runtime will stretch or shrink your images uniformly. The solution is using nine-patch bitmaps, which are specially formatted PNG files that indicate which areas can and cannot be stretched.&lt;br /&gt;
&lt;br /&gt;
Therefore, when designing bitmaps that will be used on components with variable size, always use &lt;a href="https://developer.android.com/training/multiscreen/screensizes.html#TaskUse9Patch"&gt;nine-patches&lt;/a&gt;.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-5743582747615887936?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dTBxO5cmIpQPSuVYgP4rCN7vU0c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dTBxO5cmIpQPSuVYgP4rCN7vU0c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dTBxO5cmIpQPSuVYgP4rCN7vU0c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dTBxO5cmIpQPSuVYgP4rCN7vU0c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/1c5hI4_fbFU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/5743582747615887936/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2011/12/nine-patch-bitmaps-on-android.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/5743582747615887936?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/5743582747615887936?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/1c5hI4_fbFU/nine-patch-bitmaps-on-android.html" title="Nine-patch Bitmaps on Android" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2011/12/nine-patch-bitmaps-on-android.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUGRHY-cSp7ImA9WhRXEEg.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-1149297146184459705</id><published>2011-11-08T20:37:00.000+01:00</published><updated>2011-12-16T16:43:45.859+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-16T16:43:45.859+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gcc" /><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu" /><title>Multiple gcc versions on Ubuntu machine</title><content type="html">&lt;pre name="code" class="text"&gt;# let the beast in
su

# install the older gcc versions
apt-get install gcc-4.4
apt-get install g++-4.4

# configure
update-alternatives --remove-all gcc
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 44
 --slave /usr/bin/g++ g++ /usr/bin/g++-4.4
 --slave /usr/bin/gcov gcov /usr/bin/gcov-4.4
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 46
 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6
 --slave /usr/bin/gcov gcov /usr/bin/gcov-4.6

# switch gcc
update-alternatives --config gcc
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-1149297146184459705?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xzjVpF0rJnewh5EnouR7_BOmFyE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xzjVpF0rJnewh5EnouR7_BOmFyE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xzjVpF0rJnewh5EnouR7_BOmFyE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xzjVpF0rJnewh5EnouR7_BOmFyE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/ys8uJ7yzuPc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/1149297146184459705/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2011/11/multiple-gcc-versions-on-ubuntu-machine.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/1149297146184459705?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/1149297146184459705?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/ys8uJ7yzuPc/multiple-gcc-versions-on-ubuntu-machine.html" title="Multiple gcc versions on Ubuntu machine" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2011/11/multiple-gcc-versions-on-ubuntu-machine.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EESHo7eip7ImA9WhdUEE4.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-8953669245162100847</id><published>2011-09-26T14:20:00.000+02:00</published><updated>2011-09-26T14:20:09.402+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-26T14:20:09.402+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><title>git user configuration override</title><content type="html">In case if it's required to have a different user configuration from the one stored in &lt;i&gt;.gitconfig&lt;/i&gt;, there is two possible ways to achieve this:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Local (per git)&lt;/b&gt;&lt;br /&gt;
&lt;pre name="code" class="text"&gt;$ cd git-repo
$ git config user.name "Name Surname"
$ git config user.email "name.surname@domain.com"
&lt;/pre&gt;&lt;b&gt;Global&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
This method will override default or git's user configuration. Add following to &lt;i&gt;.bashrc&lt;/i&gt;:&lt;br /&gt;
&lt;pre name="code" class="text"&gt;function gitswitch () {
    case "$1" in
    "custom")
        export GIT_AUTHOR_EMAIL="name.surname@domain.com"
        export GIT_AUTHOR_NAME="Name Surname"
        export GIT_COMMITTER_EMAIL="name.surname@domain.com"
        export GIT_COMMITTER_NAME="Name Surname"
        echo "Using custom configuration."
        ;;
    "default")
        unset GIT_AUTHOR_EMAIL
        unset GIT_AUTHOR_NAME
        unset GIT_COMMITTER_EMAIL
        unset GIT_COMMITTER_NAME
        echo "Using default configuration from .gitconfig."
        ;;
    *)
        echo "Bad argument - please specify 'custom' or 'default'."
        ;;
    esac
}
&lt;/pre&gt;And then:&lt;br /&gt;
&lt;pre name="code" class="text"&gt;$ gitswitch custom
Using custom configuration.
$ gitswitch default
Using default configuration from .gitconfig.
$ gitswitch ?
Bad argument - please specify 'custom' or 'default'.
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-8953669245162100847?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wZMtTE_yxa7Zsl108VU2eYIYyL8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wZMtTE_yxa7Zsl108VU2eYIYyL8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wZMtTE_yxa7Zsl108VU2eYIYyL8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wZMtTE_yxa7Zsl108VU2eYIYyL8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/sBUuiJRDu_o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/8953669245162100847/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2011/09/separate-user-configuration-for-github.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/8953669245162100847?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/8953669245162100847?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/sBUuiJRDu_o/separate-user-configuration-for-github.html" title="git user configuration override" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2011/09/separate-user-configuration-for-github.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ABQH44eSp7ImA9WhdXFkk.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-7654075676255085587</id><published>2011-08-29T21:18:00.000+02:00</published><updated>2011-08-29T21:22:31.031+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-29T21:22:31.031+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GTK" /><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="Go" /><category scheme="http://www.blogger.com/atom/ns#" term="GUI" /><title>To Go or not to Go?</title><content type="html">Apparently &lt;a href="http://golang.org"&gt;Go&lt;/a&gt; language makes more and more community attention. Today made a 15 min try and was surprised how simple and fast you can get into it.&lt;br&gt;
Surprisingly, there is bindings for &lt;a href="https://github.com/mattn/go-gtk"&gt;GTK&lt;/a&gt; which allows to write GUI apps for both Linux and Windows, and one of the demos looks as simple as:

&lt;pre name="code" class="go"&gt;
package main

import (
	"os"
	"github.com/mattn/go-gtk/gtk"
	"fmt"
)

func main() {
	gtk.Init(&amp;os.Args)
	window := gtk.Window(gtk.GTK_WINDOW_TOPLEVEL)
	window.SetTitle("GTK Table")
	window.Connect("destroy", gtk.MainQuit)

	swin := gtk.ScrolledWindow(nil, nil)
	swin.SetPolicy(gtk.GTK_POLICY_AUTOMATIC, gtk.GTK_POLICY_AUTOMATIC)

	table := gtk.Table(5, 5, false)
	for y := uint(0); y &lt; 5; y++ {
		for x := uint(0); x &lt; 5; x++ {
			table.Attach(gtk.ButtonWithLabel(fmt.Sprintf("%02d:%02d", x, y)),
						 x, x+1, y, y+1, gtk.GTK_FILL, gtk.GTK_FILL, 5, 5)
		}
	}
	swin.AddWithViewPort(table)

	window.Add(swin)
	window.SetDefaultSize(200, 200)
	window.ShowAll()

	gtk.Main()
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-7654075676255085587?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uAhO0wx1IvOaAf-3e6gbzWtIOsY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uAhO0wx1IvOaAf-3e6gbzWtIOsY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uAhO0wx1IvOaAf-3e6gbzWtIOsY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uAhO0wx1IvOaAf-3e6gbzWtIOsY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/AeHrdEeZRWk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/7654075676255085587/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2011/08/to-go-or-not-to-go.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/7654075676255085587?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/7654075676255085587?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/AeHrdEeZRWk/to-go-or-not-to-go.html" title="To Go or not to Go?" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2011/08/to-go-or-not-to-go.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EERX46fCp7ImA9WhdQGE4.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-2521207005768339905</id><published>2011-07-29T18:18:00.000+02:00</published><updated>2011-08-20T13:26:44.014+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T13:26:44.014+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="blog" /><title>First post, again</title><content type="html">Finally decided to move my blog to blogspot. Hello World.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-2521207005768339905?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VrITJEu3kDK1RtGPyYj0DCTI-Nc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VrITJEu3kDK1RtGPyYj0DCTI-Nc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VrITJEu3kDK1RtGPyYj0DCTI-Nc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VrITJEu3kDK1RtGPyYj0DCTI-Nc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/fdo_kwwSvQs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/2521207005768339905/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2011/07/first-post.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/2521207005768339905?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/2521207005768339905?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/fdo_kwwSvQs/first-post.html" title="First post, again" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2011/07/first-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EDRHo7eCp7ImA9WhdXFkk.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-3284567670347861828</id><published>2010-03-09T16:47:00.002+01:00</published><updated>2011-08-29T21:21:15.400+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-29T21:21:15.400+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="tls" /><title>OpenPGP key generation for GnuTLS</title><content type="html">Create key pair. Write down the key number.&lt;br /&gt;
&lt;pre name="code" class="text"&gt;gpg --gen-key
&lt;/pre&gt;Edit the key with the command below.&lt;br /&gt;
&lt;pre name="code" class="text"&gt;gpg --edit-key 1F8D4A4C
&lt;/pre&gt;In gpg prompt enter &lt;i&gt;passwd&lt;/i&gt; and specify empty password, type &lt;i&gt;quit&lt;/i&gt;.&lt;br /&gt;
&lt;pre name="code" class="text"&gt;gpg --armor --export 1F8D4A4C&amp;gt; public.key
gpg --armor --export-secret-keys 1F8D4A4C&amp;gt; secret.key
&lt;/pre&gt;Delete keys from keyrings if required.&lt;br /&gt;
&lt;pre name="code" class="text"&gt;gpg --delete-secret-keys 1F8D4A4C
gpg --delete-keys 1F8D4A4C
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-3284567670347861828?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ckQqnJY0WMuHOOuNwCRNw_lJ0Y8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ckQqnJY0WMuHOOuNwCRNw_lJ0Y8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ckQqnJY0WMuHOOuNwCRNw_lJ0Y8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ckQqnJY0WMuHOOuNwCRNw_lJ0Y8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/cAOVsJ1h28c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/3284567670347861828/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2010/03/openpgp-key-generation-for-gnutls.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/3284567670347861828?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/3284567670347861828?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/cAOVsJ1h28c/openpgp-key-generation-for-gnutls.html" title="OpenPGP key generation for GnuTLS" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2010/03/openpgp-key-generation-for-gnutls.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IHR3o9eCp7ImA9WhdQGEk.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-4910909743774281800</id><published>2010-02-24T14:39:00.002+01:00</published><updated>2011-08-20T16:12:16.460+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T16:12:16.460+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><title>Write In C</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://1.gvt0.com/vi/XHosLhPEN3k/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/XHosLhPEN3k&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/XHosLhPEN3k&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-4910909743774281800?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/02j1FFE2sXeuMAYZyIPA7WIFcSo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/02j1FFE2sXeuMAYZyIPA7WIFcSo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/02j1FFE2sXeuMAYZyIPA7WIFcSo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/02j1FFE2sXeuMAYZyIPA7WIFcSo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/aBHiI6P-axk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/4910909743774281800/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2010/02/write-in-c.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/4910909743774281800?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/4910909743774281800?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/aBHiI6P-axk/write-in-c.html" title="Write In C" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2010/02/write-in-c.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MDQ3s8eCp7ImA9WhdQGEk.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-436130367952358055</id><published>2009-12-04T18:54:00.001+01:00</published><updated>2011-08-20T16:11:12.570+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T16:11:12.570+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="subversion" /><title>Subversion repository part migration</title><content type="html">&lt;pre name="code" class="text"&gt;svnadmin dump /srv/svn/old-repo | svndumpfilter include --drop-empty-revs --renumber-revs /directory-name &gt; directory.svndump
svnadmin load /srv/svn/new-repo &lt; directory.svndump
&lt;/pre&gt;

Please note, that if directory structure needs to be changed (for example, from &lt;i&gt;/old-repo/projects/dir&lt;/i&gt; to &lt;i&gt;/new-repo/dir&lt;/i&gt;) manual edit of dump file will not help. Instead, &lt;i&gt;sed&lt;/i&gt; must be combined with &lt;i&gt;svndumpfilter&lt;/i&gt;. Additional info regarding this topic can be found &lt;a href="http://blog.fredrikbostrom.net/2007/03/14/migrating-part-of-repository-in-svn"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-436130367952358055?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/43jdBrO37_LkD8Rwp7DBzD_A-Gs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/43jdBrO37_LkD8Rwp7DBzD_A-Gs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/43jdBrO37_LkD8Rwp7DBzD_A-Gs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/43jdBrO37_LkD8Rwp7DBzD_A-Gs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/Ai5gJeeLe3I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/436130367952358055/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/12/subversion-repository-part-migration.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/436130367952358055?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/436130367952358055?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/Ai5gJeeLe3I/subversion-repository-part-migration.html" title="Subversion repository part migration" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/12/subversion-repository-part-migration.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08MRns9fSp7ImA9WhdQGEk.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-4160537631879236437</id><published>2009-12-03T20:07:00.003+01:00</published><updated>2011-08-20T16:18:07.565+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T16:18:07.565+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="vm" /><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="virtualbox" /><category scheme="http://www.blogger.com/atom/ns#" term="OpenSUSE" /><category scheme="http://www.blogger.com/atom/ns#" term="X11" /><title>Virtualbox 3.1.x Linux guest dead keyboard fix</title><content type="html">After new release of Virtualbox was installed and my virtual machine with OpenSUSE on-board had started, I've ended up with a dead keyboard. It worked fine on Windows XP as host, but OpenSUSE VM was acting like there is no keyboard at all. Couple of minutes of brain activity and finger work I've found that &lt;i&gt;/etc/X11/xorg.conf&lt;/i&gt; was replaced during Virtualbox Guest Additions update. Comparing &lt;i&gt;xorg.conf&lt;/i&gt; between two latest VB releases, I was able to get the keyboard working. Here is a fix:&lt;br /&gt;
&lt;br /&gt;
1. Restore old &lt;i&gt;xorg.conf&lt;/i&gt; :&lt;br /&gt;
&lt;pre name="code" class="text"&gt;cp /etc/X11/xorg.conf.bak /etc/X11/xorg.conf&lt;/pre&gt;2. Add &lt;i&gt;Option "CoreKeyboard"&lt;/i&gt; to &lt;i&gt;InputDevice&lt;/i&gt; section of &lt;i&gt;Keyboard[0]&lt;/i&gt;&lt;br /&gt;
3. Add &lt;i&gt;Option "CorePointer"&lt;/i&gt; to &lt;i&gt;InputDevice&lt;/i&gt; section of &lt;i&gt;Mouse[1]&lt;/i&gt;&lt;br /&gt;
4. Add &lt;i&gt;Option "SendCoreEvents"&lt;/i&gt; to &lt;i&gt;InputDevice&lt;/i&gt; section of &lt;i&gt;Mouse[2]&lt;/i&gt;&lt;br /&gt;
5. Rename &lt;i&gt;Device&lt;/i&gt; option from &lt;i&gt;InputDevice&lt;/i&gt; section of &lt;i&gt;Mouse[2]&lt;/i&gt; from &lt;i&gt;/dev/vboxadd&lt;/i&gt; to &lt;i&gt;/dev/vboxguest&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-4160537631879236437?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/viNKUBPlPPw8VGzEni4_xKMsbb4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/viNKUBPlPPw8VGzEni4_xKMsbb4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/viNKUBPlPPw8VGzEni4_xKMsbb4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/viNKUBPlPPw8VGzEni4_xKMsbb4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/Pquojz3pPs4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/4160537631879236437/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/12/virtualbox-31x-linux-guest-dead.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/4160537631879236437?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/4160537631879236437?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/Pquojz3pPs4/virtualbox-31x-linux-guest-dead.html" title="Virtualbox 3.1.x Linux guest dead keyboard fix" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/12/virtualbox-31x-linux-guest-dead.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YBRXc4fSp7ImA9WhdQGEk.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-887626304138479013</id><published>2009-10-28T16:07:00.001+01:00</published><updated>2011-08-20T16:05:54.935+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T16:05:54.935+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="Other" /><title>KTY BOX</title><content type="html">This guy rocks!&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://3.gvt0.com/vi/OKvZ4K5eA_c/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/OKvZ4K5eA_c&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/OKvZ4K5eA_c&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a href="http://ktyprojects.blogspot.com/2008/05/kty-box.html"&gt;Link&lt;/a&gt; to the original article.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-887626304138479013?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Ie9badNkxAfUmzPnICHlXG3czpM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ie9badNkxAfUmzPnICHlXG3czpM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Ie9badNkxAfUmzPnICHlXG3czpM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ie9badNkxAfUmzPnICHlXG3czpM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/CnT8nV-NQ7g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/887626304138479013/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/10/kty-box.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/887626304138479013?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/887626304138479013?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/CnT8nV-NQ7g/kty-box.html" title="KTY BOX" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/10/kty-box.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcASXs4cSp7ImA9WhdVE0s.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-6126028108946814903</id><published>2009-09-17T14:55:00.001+02:00</published><updated>2011-09-18T19:14:08.539+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-18T19:14:08.539+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GTK" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><title>How to change language in GIMP on Windows</title><content type="html">After installing GIMP on my laptop I've found it's language is set according to my regional settings. However, I have failed trying to change it to english because there is no visible configuration option for that. Now that's weird!  &lt;br /&gt;
After googling for few minutes I've found that this is not a GIMP problem but rather &lt;a href="http://www.gtk.org/download/win32.php"&gt;GTK+ for Windows&lt;/a&gt; and to force it to use english translation by default you need to add &lt;i&gt;lang&lt;/i&gt; environment variable with the value of &lt;i&gt;c&lt;/i&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-6126028108946814903?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/D68d-m_p4JeJf95lXqpMg0MUrWs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D68d-m_p4JeJf95lXqpMg0MUrWs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/D68d-m_p4JeJf95lXqpMg0MUrWs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D68d-m_p4JeJf95lXqpMg0MUrWs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/YBddkCBEyWU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/6126028108946814903/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/09/how-to-change-language-in-gimp-on.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/6126028108946814903?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/6126028108946814903?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/YBddkCBEyWU/how-to-change-language-in-gimp-on.html" title="How to change language in GIMP on Windows" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/09/how-to-change-language-in-gimp-on.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cEQXc9eip7ImA9WhdQGEk.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-847647253733683574</id><published>2009-09-14T19:31:00.001+02:00</published><updated>2011-08-20T16:03:20.962+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T16:03:20.962+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gcc" /><category scheme="http://www.blogger.com/atom/ns#" term="MinGW" /><category scheme="http://www.blogger.com/atom/ns#" term="library" /><title>Removing MinGW dll dependencies</title><content type="html">&lt;b&gt;libgcc_s_dw2-1.dll&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Passing &lt;i&gt;-static-libgcc&lt;/i&gt; will remove this dependency for all languages other than C.  &lt;br /&gt;
Note: C++ exceptions depends on this option.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;mingwm10.dll&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Remove &lt;i&gt;-mthreads&lt;/i&gt; option from your makefile.  &lt;br /&gt;
Note: Multithreading and C++ exceptions depends on this option.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-847647253733683574?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tST4LpdABvvRnWXhQIja8oLfnX4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tST4LpdABvvRnWXhQIja8oLfnX4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tST4LpdABvvRnWXhQIja8oLfnX4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tST4LpdABvvRnWXhQIja8oLfnX4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/Etxc34UxPxk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/847647253733683574/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/09/removing-mingw-dll-dependencies.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/847647253733683574?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/847647253733683574?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/Etxc34UxPxk/removing-mingw-dll-dependencies.html" title="Removing MinGW dll dependencies" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/09/removing-mingw-dll-dependencies.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4CRnk7fyp7ImA9WhdQGEk.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-8306848922982485680</id><published>2009-09-09T18:04:00.001+02:00</published><updated>2011-08-20T16:02:47.707+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T16:02:47.707+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gcc" /><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><title>How to set up library paths for configure</title><content type="html">&lt;pre name="code" class="text"&gt;env CPPFLAGS="-I/opt/local/include" LDFLAGS="-L/opt/local/lib" ./configure
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-8306848922982485680?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/q5rkURjxHUzMGsu7btJ_M0ACGEA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/q5rkURjxHUzMGsu7btJ_M0ACGEA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/q5rkURjxHUzMGsu7btJ_M0ACGEA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/q5rkURjxHUzMGsu7btJ_M0ACGEA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/k7OswztcRCI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/8306848922982485680/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/09/how-to-set-up-library-paths-for.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/8306848922982485680?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/8306848922982485680?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/k7OswztcRCI/how-to-set-up-library-paths-for.html" title="How to set up library paths for configure" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/09/how-to-set-up-library-paths-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4AQ3c_fCp7ImA9WhdQGEk.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-6522492741281606958</id><published>2009-09-09T16:25:00.003+02:00</published><updated>2011-08-20T16:02:22.944+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T16:02:22.944+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="msys" /><category scheme="http://www.blogger.com/atom/ns#" term="MinGW" /><title>How to disable system bell in msys</title><content type="html">$HOME/.inputrc:&lt;br /&gt;
&lt;pre name="code" class="text"&gt;# none, visible or audible
set bell-style none
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-6522492741281606958?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QZw0u6B5N0hFA2ZfYyuLa-WktjQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QZw0u6B5N0hFA2ZfYyuLa-WktjQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QZw0u6B5N0hFA2ZfYyuLa-WktjQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QZw0u6B5N0hFA2ZfYyuLa-WktjQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/B4rzG8usp0A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/6522492741281606958/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/09/how-to-disable-system-bell-in-msys.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/6522492741281606958?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/6522492741281606958?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/B4rzG8usp0A/how-to-disable-system-bell-in-msys.html" title="How to disable system bell in msys" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/09/how-to-disable-system-bell-in-msys.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8CQHs8eip7ImA9WhdQGEk.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-3375529052222895575</id><published>2009-08-26T16:29:00.004+02:00</published><updated>2011-08-20T16:01:01.572+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T16:01:01.572+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="subversion" /><category scheme="http://www.blogger.com/atom/ns#" term="ssh" /><title>How to remove absolute path in svn+ssh</title><content type="html">As you may or may not know there is a path difference between svn and svn+ssh links in case if subversion server is configured with default root directory:&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/svnserve&lt;br /&gt;
&lt;pre name="code" class="text"&gt;SVNSERVE_OPTIONS="-d -R -r /path-to-repos"
&lt;/pre&gt;This way repository can be checked out using following commands (consider ssh is set up and working):&lt;br /&gt;
&lt;pre name="code" class="text"&gt;svn co svn://server.com/repository directory
&lt;/pre&gt;or&lt;br /&gt;
&lt;pre name="code" class="text"&gt;svn co svn+ssh://server.com/path-to-repos/repository directory
&lt;/pre&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
The reason is simple - svn+ssh is just accessing a subversion repository &lt;em&gt;locally&lt;/em&gt;, using SSH as the transport, and hence you have access to the entire filesystem. Svnserve daemon, in contrast, is told "start your paths with /path-to-repos", and so you don't have to specify it manually.&lt;br /&gt;
You can't argue with me that this can be really annoying in case if, for example, you work with repositories from your local intranet over svn, and from outside world over ssh.&lt;br /&gt;
&lt;br /&gt;
Solution is simple. Wrapper script in place of original &lt;i&gt;svnserve&lt;/i&gt; binary:&lt;br /&gt;
&lt;br /&gt;
Rename &lt;i&gt;svnserve&lt;/i&gt; to, let's say, &lt;i&gt;svnserve.bin&lt;/i&gt;:&lt;br /&gt;
&lt;pre name="code" class="text"&gt;mv /usr/bin/svnserve /usr/bin/svnserve.bin
&lt;/pre&gt;Save this script as &lt;i&gt;/usr/bin/svnserve&lt;/i&gt;:&lt;br /&gt;
&lt;pre name="code" class="text"&gt;#!/bin/sh
exec /usr/bin/svnserve.bin -r /path-to-repos "$@"
&lt;/pre&gt;Update permissions:&lt;br /&gt;
&lt;pre name="code" class="text"&gt;chmod 755 /usr/bin/svnserve
&lt;/pre&gt;Voila! Now your repository links will look similar for both svn and svn+ssh:&lt;br /&gt;
&lt;pre name="code" class="text"&gt;svn co svn://server.com/repository directory&lt;/pre&gt;&lt;pre name="code" class="text"&gt;svn co svn+ssh://server.com/repository directory&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-3375529052222895575?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Qv_utm7TJ1FVqfsgT4GmtLcJBV8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Qv_utm7TJ1FVqfsgT4GmtLcJBV8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Qv_utm7TJ1FVqfsgT4GmtLcJBV8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Qv_utm7TJ1FVqfsgT4GmtLcJBV8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/-4cCR3J71Ao" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/3375529052222895575/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/08/how-to-remove-absolute-path-in-svnssh.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/3375529052222895575?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/3375529052222895575?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/-4cCR3J71Ao/how-to-remove-absolute-path-in-svnssh.html" title="How to remove absolute path in svn+ssh" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/08/how-to-remove-absolute-path-in-svnssh.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkINQnk9fSp7ImA9WhdQGEk.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-923692016584344120</id><published>2009-08-04T04:38:00.023+02:00</published><updated>2011-08-20T15:56:33.765+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T15:56:33.765+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="crosscompiler" /><category scheme="http://www.blogger.com/atom/ns#" term="ARM" /><category scheme="http://www.blogger.com/atom/ns#" term="gcc" /><category scheme="http://www.blogger.com/atom/ns#" term="elf" /><category scheme="http://www.blogger.com/atom/ns#" term="toolchain" /><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="u-boot" /><category scheme="http://www.blogger.com/atom/ns#" term="bootloader" /><title>How to ARM Linux</title><content type="html">During last few years I've never found a good excessive topic covering most of the areas to get Linux runnnig from scratch. I remember myself doing a lot of investigation about correct building of a &lt;a href="http://en.wikipedia.org/wiki/Cross_compiler"&gt;crosscompiler&lt;/a&gt;, studying &lt;a href="http://en.wikipedia.org/wiki/Booting"&gt;bootloader&lt;/a&gt; internals, and so on... I'm definitely sure - if I had a person that could point me in right direction, then all the development should finish much earlier.&lt;br /&gt;
&lt;br /&gt;
Consider this article as my personal note and feel free using it your own way.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h1&gt;1. Boot Sequence&lt;/h1&gt;&lt;br /&gt;
It is important to understand how the board is able to load Linux. Entire start-up process can be divided into 3 parts.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;1.1. 1-Stage Bootloader&lt;/h2&gt;&lt;br /&gt;
Right after board start-up all the peripherals are uninitialized. The purpose of 1-stage bootloader is to initialize most vital peripherals which are required at the moment - RAM, flash, and console (serial), then transfer 2-stage bootloader from flash to RAM, and execute it.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;I will not mention 1-stage bootloader in the rest of article, as this is specific to the CPU you are using. You should have it already on your resource CD from your development board, including sources. Please note, that in some circumstances you may need to change 1-stage bootloader, so that it can download, for example, 2-stage loader from different resource, which is unsupported by your original 1-stage loader.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;1.2. 2-Stage Bootloader&lt;/h2&gt;&lt;br /&gt;
This stage is required to initialize remaining peripherals and finally load kernel and execute it.&lt;br /&gt;
&lt;br /&gt;
Now, you may wonder, why 2-stage bootloader is actually required if everything can be done by 1-stage bootloader?&lt;br /&gt;
Answer is simple: after the start-up memory is uninitialized and CPU can load code, limited to the amount of CPU's SRAM memory. Definitely, this size is not enough for a good bootloader that has all the possible goodies you may need.&lt;br /&gt;
&lt;br /&gt;
In our example we will use most popular bootloader at the moment, &lt;a href="http://www.denx.de/wiki/U-Boot"&gt;U-Boot&lt;/a&gt;. &lt;a href="http://www.linuxfordevices.com/c/a/Linux-For-Devices-Articles/Introduction-to-Das-UBoot-the-universal-open-source-bootloader/"&gt;Here&lt;/a&gt; is a good intro.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;With a little effort of patching, if this is not already done, it is possible to have a single bootloader, which will serve as 1-stage and 2-stage bootloader at the same time. True, this is the case only if U-Boot is located in parallel flash. Check U-Boot documentation regarding relocation feature.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;1.3. Kernel&lt;/h2&gt;&lt;br /&gt;
Well, this is our task, to get kernel running.&lt;br /&gt;
Believe me or not, but this stage is easiest if we talk about debugging. For 1-stage and 2-stage bootloaders sometimes the only possibility you may have is a hardware JTAG.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;2. Crosscompiler&lt;/h1&gt;&lt;br /&gt;
This is a very first thing to start with. Before doing actual development you may want to play a little with your development kit and get to work at least 'hello world'.&lt;br /&gt;
&lt;br /&gt;
Now, stop surfing the contents of a CD that you get with your development kit. Personally, I own bunch of developer kits, and all of the compilers I had received was outdated.&lt;br /&gt;
&lt;br /&gt;
There is a bunch of pre-made crosscompiler packages out there that you may use out of the box. Check out &lt;a href="http://elinux.org/Toolchains"&gt;this list&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Personally, I use &lt;a href="http://ymorin.is-a-geek.org/dokuwiki/projects/crosstool"&gt;crosstool-ng&lt;/a&gt; - a tool for building your own toolchain. This will give you ability to build everything you need: crosscompiler and libraries for your future filesystem. &lt;a href="http://blog.stranadurakov.com/wp-content/uploads/2009/08/crosstool-ng-1.2.2.config"&gt;Here&lt;/a&gt; is my crosstool-ng (version 1.2.2) configuration file, in case if you are lost in configuration options.&lt;br /&gt;
&lt;br /&gt;
After crosstool-ng will finish building your toolchain there is a good practice to modify your bash profile so you can switch to crosscompiler only when you want to:&lt;br /&gt;
&lt;br /&gt;
.bashrc&lt;pre class="text" name="code"&gt;# Toolchain related functions
toolchain-arm () {
    export ARCH=arm
    export TARGET=arm-linux-gnu
    export CROSS_COMPILE=${TARGET}-
}
    toolchain-none () {
    unset ARCH
    unset TARGET
    unset CROSS_COMPILE
}
&lt;/pre&gt;Remember to update your &lt;i&gt;PATH&lt;/i&gt;, so it will point to your new crosscompiler binaries:&lt;br /&gt;
&lt;br /&gt;
.bash_profile&lt;pre class="text" name="code"&gt;PATH=$PATH:$HOME/x-tools/arm-linux-gnu/bin
export PATH
&lt;/pre&gt;&lt;br /&gt;
Now, as example that everything is right, build a 'hello world' application:&lt;br /&gt;
&lt;br /&gt;
test.cpp&lt;pre class="c++" name="code"&gt;int main(int argc, char **argv)
{
    std::cout &lt;&lt; "Hello world!\n"; return 0;
}
&lt;/pre&gt;
&lt;pre class="text" name="code"&gt;arm-linux-gnu-g++ test.cpp -o test
&lt;/pre&gt;This should successfully build you the test application for your ARM board. Just to be sure you can check it's ELF header: 
&lt;pre class="text" name="code"&gt;arm-linux-gnu-readelf -h test
&lt;/pre&gt;Which will give you something like: 
&lt;pre class="text" name="code"&gt;ELF Header:
Magic:                             7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00
Class:                             ELF32
Data:                              2's complement, little endian
Version:                           1 (current)
OS/ABI:                            ARM
ABI Version:                       0
Type:                              EXEC (Executable file)
Machine:                           ARM
Version:                           0x1
Entry point address:               0x84e0
Start of program headers:          52 (bytes into file)
Start of section headers:          3732 (bytes into file)
Flags:                             0x202, has entry point, GNU EABI, software FP
Size of this header:               52 (bytes)
Size of program headers:           32 (bytes)
Number of program headers:         6
Size of section headers:           40 (bytes)
Number of section headers:         33
Section header string table index: 30
&lt;/pre&gt;That's right, you just have built your first ARM binary using your vanilla gcc crosscompiler.  While you are playing with getting sample applications to work on pre-installed board, you may face some errors with missing libraries. This is absolutely normal, because your pre-installed linux was build using toolchain with different versions of system libraries, and your application needs one or more libraries that is missing at the moment. Solution is easy - you need to transfer these libraries from the toolchain you've just build to your board. List of the libraries required by your application may be obrained using following command: 
&lt;pre class="text" name="code"&gt;arm-linux-gnu-readelf -d test
&lt;/pre&gt;Which will tell you which libraries the application needs: 
&lt;pre class="text" name="code"&gt;0x00000001 (NEEDED)                     Shared library: [libstdc++.so.6]
0x00000001 (NEEDED)                     Shared library: [libm.so.6]
0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED)                     Shared library: [libc.so.6]
&lt;/pre&gt;Now, just copy the missing libraries from the &lt;i&gt;sys-root&lt;/i&gt; directory of your toolchain (for me, they are located in &lt;i&gt;~/x-tools/arm-linux-gnu/arm-linux-gnu/sys-root&lt;/i&gt;) to your board's &lt;i&gt;/lib&lt;/i&gt; directory and the application will work.  
&lt;h2&gt;&lt;span style="color: red;"&gt;This article is a draft... Please come back later.&lt;/span&gt;&lt;/h2&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-923692016584344120?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LuYugQ2Jv-XEnVRR6kglbNgpAus/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LuYugQ2Jv-XEnVRR6kglbNgpAus/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LuYugQ2Jv-XEnVRR6kglbNgpAus/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LuYugQ2Jv-XEnVRR6kglbNgpAus/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/MzQzaQlbcio" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/923692016584344120/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/08/how-to-arm-linux.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/923692016584344120?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/923692016584344120?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/MzQzaQlbcio/how-to-arm-linux.html" title="How to ARM Linux" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/08/how-to-arm-linux.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYBQ3YycSp7ImA9WhdQGEk.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-5527883005798497589</id><published>2009-07-24T17:12:00.007+02:00</published><updated>2011-08-20T15:32:32.899+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T15:32:32.899+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Other" /><category scheme="http://www.blogger.com/atom/ns#" term="spam" /><title>Bloody Hinet SPAM</title><content type="html">&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-KmVVIpJ17mc/Tk-2lYUW8cI/AAAAAAAAAUw/QuWgCtIZAX4/s1600/spam-reports-hinet.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="170" src="http://3.bp.blogspot.com/-KmVVIpJ17mc/Tk-2lYUW8cI/AAAAAAAAAUw/QuWgCtIZAX4/s200/spam-reports-hinet.png" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Mail server logs&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;If one day God will give me his powers for at least a second, I'll burn all the Hinet servers at once!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-5527883005798497589?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2GMQboy3HZnfS_TGnhdlnVdg_nU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2GMQboy3HZnfS_TGnhdlnVdg_nU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2GMQboy3HZnfS_TGnhdlnVdg_nU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2GMQboy3HZnfS_TGnhdlnVdg_nU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/enjN9UOHRDs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/5527883005798497589/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/07/bloody-hinet-spam.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/5527883005798497589?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/5527883005798497589?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/enjN9UOHRDs/bloody-hinet-spam.html" title="Bloody Hinet SPAM" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-KmVVIpJ17mc/Tk-2lYUW8cI/AAAAAAAAAUw/QuWgCtIZAX4/s72-c/spam-reports-hinet.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/07/bloody-hinet-spam.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04CQ3Y9fyp7ImA9WhdQGEk.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-6161126148246839723</id><published>2009-07-10T16:43:00.001+02:00</published><updated>2011-08-20T15:12:42.867+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T15:12:42.867+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="library" /><category scheme="http://www.blogger.com/atom/ns#" term="tls" /><category scheme="http://www.blogger.com/atom/ns#" term="C/C++" /><title>Simple TLS library</title><content type="html">Last few days I've been working on a simple &lt;a href="http://www.gnu.org/software/gnutls/"&gt;TLS&lt;/a&gt; wrapper. So far, client side is finished and working lovely. Next task is to include server part, and when it will be finished I think I'll make the library public.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-6161126148246839723?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UZ5m6YgBvqbM-AAajwIOUhf2Rw4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UZ5m6YgBvqbM-AAajwIOUhf2Rw4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UZ5m6YgBvqbM-AAajwIOUhf2Rw4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UZ5m6YgBvqbM-AAajwIOUhf2Rw4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/dtSuG4pRb1A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/6161126148246839723/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/07/simple-tls-library.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/6161126148246839723?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/6161126148246839723?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/dtSuG4pRb1A/simple-tls-library.html" title="Simple TLS library" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/07/simple-tls-library.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4ARH88cSp7ImA9WhdXFk4.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-7754669515257443502</id><published>2009-07-10T15:14:00.003+02:00</published><updated>2011-08-29T17:15:45.179+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-29T17:15:45.179+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="spam" /><category scheme="http://www.blogger.com/atom/ns#" term="postfix" /><title>AntiSPAM postfix setup</title><content type="html">Recently I've had discussion with one of my colleagues about postfix/sendmail comparison and it's antispam mechanisms. I will not tell much about sendmail as I'm not so competent in it, few years ago all my servers migrated to postfix, after my ex-coworker have send me his postfix setup claiming it's real-spam-proof.&lt;br&gt;
Postfix configuration is more understandable (well, for me at least), and I can fine-tune it better than sendmail. In result, my colleague was really surprised when I had show him my postfix logs with 100% spam filtration (for at least last 2 weeks there was no single spam mail that where able to breach through) and asked me to mail him my setup or post the configuration somewhere.&lt;br&gt;
&lt;a name='more'&gt;&lt;/a&gt;
So here it goes. Please note, I will not post the entire configuration, as it is often specific, but rather excerpt that is responsible for filtering the spam:&lt;br&gt;
&lt;br&gt;
&lt;i&gt;main.cf&lt;/i&gt;
&lt;pre name="code" class="php"&gt;
# Restriction classes
smtpd_restriction_classes =  greylisting
greylisting = check_policy_service inet:127.0.0.1:10031

# RCPT Restrictions
smtpd_recipient_restrictions =
reject_non_fqdn_sender,
reject_non_fqdn_recipient,

permit_mynetworks,
permit_sasl_authenticated,

reject_unknown_sender_domain,
reject_unknown_recipient_domain,

check_client_access pgsql:/etc/postfix/pgsql_ip_control.cf,
check_client_access regexp:/etc/postfix/dsl_stoplist.cf,

reject_invalid_helo_hostname,
reject_non_fqdn_helo_hostname,
reject_non_fqdn_hostname,
reject_unknown_helo_hostname,

reject_unauth_destination,
reject_unauth_pipelining,

check_client_access regexp:/etc/postfix/dyn_fqdn.regexp,

reject_rbl_client zen.spamhaus.org,
reject_rbl_client safe.dnsbl.sorbs.net
&lt;/pre&gt;

&lt;i&gt;dsl_stoplist.cf&lt;/i&gt;
&lt;pre name="code" class="php"&gt;
# Rules for modem/dsl pools, from which the clients connect

# Note : Replace 553 with 451 for temporary reject (not recommended)

/([0-9]*-){3}[0-9]*(\..*){2,}/i 553 SPAM_ip-add-rr-ess_networks
/([0-9]*\.){4}(.*\.){3,}.*/i    553 SPAM_ip-add-rr-ess_networks

/client.*\..*\..*/i             553 SPAM_CLIENT
/cable.*\..*\..*/i              553 SPAM_CABLE
/pool.*\..*\..*/i               553 SPAM_POOL
/dial.*\..*\..*/i               553 SPAM_DIAL
/ppp.*\..*\..*/i                553 SPAM_PPP
/dslam.*\..*\..*/i              553 SPAM_DSLAM
/dhcp.*\..*\..*/i               553 SPAM_DHCP
/[\.-]dsl.*\..*\..*/i           553 SPAM_DSL
/[ax]dsl.*\..*\..*/i            553 SPAM_XDSL
&lt;/pre&gt;

&lt;i&gt;dyn_fqdn.regexp&lt;/i&gt;
&lt;pre name="code" class="text"&gt;
/(\-.+){4}$/ greylisting
/(\..+){4}$/ greylisting
/unknown/ greylisting
/(^|[0-9.x_-])(abo|br(e|oa)dband|cabel|(hk)?cablep?|catv|cbl|cidr|d?client2?|cust(omer)?s?|dhcp|dial?(in|up)?|d[iu]p|[asx]?dsld?|dyn(a(dsl|mic)?)?|home|in-addr|modem(cable)?|(di)?pool|ppp|ptr|rev|static|user|YahooBB[0-9]{12}|c[[:alnum:]]{6,}(\.[a-z]{3})?\.virtua|[1-9]Cust[0-9]+|AC[A-Z][0-9A-F]{5}\.ipt|pcp[0-9]{6,}pcs|S0106[[:alnum:]]{12,}\.[a-z]{2})[0-9.x_-]/ greylisting
&lt;/pre&gt;

&lt;i&gt;pgsql_ip_control.cf&lt;/i&gt;
&lt;pre name="code" class="text"&gt;
user = ****
password = ****
hosts = 127.0.0.1
dbname = postfix
query = select * from Check_Address('%s') where Check_Address is not null
&lt;/pre&gt;

PostgreSQL postfix DB dump:
&lt;pre name="code" class="sql"&gt;
--
-- PostgreSQL database dump
--

SET client_encoding = 'UTF8';
SET standard_conforming_strings = off;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET escape_string_warning = off;

--
-- Name: plpgsql; Type: PROCEDURAL LANGUAGE; Schema: -; Owner: postfix
--

CREATE PROCEDURAL LANGUAGE plpgsql;


ALTER PROCEDURAL LANGUAGE plpgsql OWNER TO postfix;

SET search_path = public, pg_catalog;

--
-- Name: addresses_bu_trigger(); Type: FUNCTION; Schema: public; Owner: postfix
--

CREATE FUNCTION addresses_bu_trigger() RETURNS trigger
AS $$
begin
new.Updated = now();
return new;
end;
$$
LANGUAGE plpgsql;


ALTER FUNCTION public.addresses_bu_trigger() OWNER TO postfix;

--
-- Name: check_address(character varying); Type: FUNCTION; Schema: public; Owner: postfix
--

CREATE FUNCTION check_address(pcaddress character varying) RETURNS character varying
AS $_$
declare 
viAddressId integer;
vcVerdict varchar;
begin
insert into IP_Control_Log(Request) values($1);

select into vcVerdict, viAddressId Verdict, Id
from Addresses 
where Address = $1;

if viAddressId is not null then
update Addresses
set Requests_Count = Requests_Count + 1
where Id = viAddressId;
else
if Is_Inet(pcAddress) then
vcVerdict = Check_IP(cast(pcAddress as inet));
end if;
end if;

return vcVerdict;
end;
$_$
LANGUAGE plpgsql;


ALTER FUNCTION public.check_address(pcaddress character varying) OWNER TO postfix;

--
-- Name: check_ip(inet); Type: FUNCTION; Schema: public; Owner: postfix
--

CREATE FUNCTION check_ip(piaddress inet) RETURNS character varying
AS $$
declare 
vVerdict varchar;
vId bigint;
begin
vVerdict = null;

select into vVerdict, vId Verdict, Id
from IP_Control
where (Address &amp;amp; Mask) = (piAddress &amp;amp; Mask);

if vId is not null then
update IP_Control 
set Requests_Count = Requests_Count + 1  
where (Address &amp;amp; Mask) = (piAddress &amp;amp; Mask);        
end if;

return vVerdict;     
end;
$$
LANGUAGE plpgsql;


ALTER FUNCTION public.check_ip(piaddress inet) OWNER TO postfix;

--
-- Name: ip_check(character varying); Type: FUNCTION; Schema: public; Owner: postfix
--

CREATE FUNCTION ip_check("pcAddress" character varying) RETURNS character varying
AS $_$
declare 
vcVerdict varchar;
begin
insert into IP_Control_Log(Request) values($1);

select into vcVerdict Verdict
from IP_Control 
where IP_Address = $1;

update IP_Control 
set Requests_Count = Requests_Count + 1
where IP_Address = $1;

return vcVerdict;
end;
$_$
LANGUAGE plpgsql;


ALTER FUNCTION public.ip_check("pcAddress" character varying) OWNER TO postfix;

--
-- Name: ip_control_bu(); Type: FUNCTION; Schema: public; Owner: postfix
--

CREATE FUNCTION ip_control_bu() RETURNS trigger
AS $$
begin
new.Updated = now();
return new;
end;
$$
LANGUAGE plpgsql;


ALTER FUNCTION public.ip_control_bu() OWNER TO postfix;

--
-- Name: ip_control_ins(inet, character varying); Type: FUNCTION; Schema: public; Owner: postfix
--

CREATE FUNCTION ip_control_ins(piaddress inet, pcverdict character varying) RETURNS bigint
AS $$
declare 
vId bigint;
begin
/*
for 
select distinct Mask from IP_Control
do
vMaskedAddress = Mask &amp;amp; piAddress
select Id from IP_Control where Masked_Address = vMaskedAddress
*/

select into vId Id 
from IP_Control
where (Address &amp;amp; Mask) = (piAddress &amp;amp; Mask)
limit 1;

if vId is null then
insert into IP_Control(Address, Verdict)
values (piAddress, pcVerdict); 
else
update IP_Control set Requests_Count = Requests_Count + 1
where (Address &amp;amp; Mask) = (piAddress &amp;amp; Mask);
end if;

return 0;
end;
$$
LANGUAGE plpgsql;


ALTER FUNCTION public.ip_control_ins(piaddress inet, pcverdict character varying) OWNER TO postfix;

--
-- Name: is_inet(character varying); Type: FUNCTION; Schema: public; Owner: postfix
--

CREATE FUNCTION is_inet(pcaddress character varying) RETURNS boolean
AS $$
declare
test inet;
begin
Test = cast(pcAddress as inet);
return true;

exception when data_exception then
return false;
end;
$$
LANGUAGE plpgsql;


ALTER FUNCTION public.is_inet(pcaddress character varying) OWNER TO postfix;

--
-- Name: legal_domains_ins(character varying); Type: FUNCTION; Schema: public; Owner: postfix
--

CREATE FUNCTION legal_domains_ins(pcname character varying) RETURNS bigint
AS $$
declare 
viId bigint;
begin
select into viId Id 
from Addresses 
where Address = pcName;

if viId is null then

select into viId Id from Legal_Domains
where Address = pcName;

if viId is null then
insert into Legal_Domains(Address) values(pcName);
else
update Legal_Domains 
set Requests_Count = Requests_Count + 1 
where Id = viId;
end if;     
else
update Addresses 
set Requests_Count = Requests_Count + 1
where Id = viId;
end if;    

return 0; 
end;
$$
LANGUAGE plpgsql;


ALTER FUNCTION public.legal_domains_ins(pcname character varying) OWNER TO postfix;

--
-- Name: process_legal_domains(); Type: FUNCTION; Schema: public; Owner: postfix
--

CREATE FUNCTION process_legal_domains() RETURNS integer
AS $$
declare
r record;
vcAddress varchar;
viId bigint;
Counter integer;
begin
Counter = 0;

update Legal_Domains 
set To_White_List = true 
where Address like 'mail.%' 
or Address like 'smtp.%'
or Address like 'ns.%'
or Address like 'mx1.%'    
or Address like 'mx2.%'    
or Address like 'relay.%'    
or Address like 'relay1.%'    
or Address like 'relay2.%';

for r in 
select Address 
from Legal_Domains 
where To_White_List = true
loop
Counter = Counter + 1;
viId = null;

select into viId Id 
from Addresses 
where Address = r.Address;

if viId is null then
insert into Addresses(Address, Verdict, Comment)
values (r.Address, 'OK', 'probably legal');
else
update Addresses 
set Requests_Count = Requests_Count + 1
where Id = viId;
end if;
end loop;

delete from Legal_Domains where To_White_List = true;

return Counter;
end;
$$
LANGUAGE plpgsql;


ALTER FUNCTION public.process_legal_domains() OWNER TO postfix;

--
-- Name: addresses_id_seq; Type: SEQUENCE; Schema: public; Owner: postfix
--

CREATE SEQUENCE addresses_id_seq
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;


ALTER TABLE public.addresses_id_seq OWNER TO postfix;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: addresses; Type: TABLE; Schema: public; Owner: postfix; Tablespace: 
--

CREATE TABLE addresses (
id bigint DEFAULT nextval('addresses_id_seq'::regclass) NOT NULL,
address character varying(256) NOT NULL,
verdict character varying(256) DEFAULT 'REJECT xxx.com is banned. Please contact mail administrator at andrejs.cainikovs@gmail.com to add you to our whitelist.'::character varying NOT NULL,
comment character varying(256) NOT NULL,
requests_count bigint DEFAULT 0 NOT NULL,
created timestamp(0) without time zone DEFAULT now(),
updated timestamp(0) without time zone DEFAULT now()
);
ALTER TABLE ONLY addresses ALTER COLUMN id SET STATISTICS 0;
ALTER TABLE ONLY addresses ALTER COLUMN address SET STATISTICS 0;
ALTER TABLE ONLY addresses ALTER COLUMN verdict SET STATISTICS 0;


ALTER TABLE public.addresses OWNER TO postfix;

SET default_with_oids = true;

--
-- Name: alias; Type: TABLE; Schema: public; Owner: postfix; Tablespace: 
--

CREATE TABLE alias (
id bigint NOT NULL,
address character varying(256) NOT NULL,
goto character varying(256) NOT NULL,
domain character varying(256) DEFAULT 'example.com'::character varying NOT NULL,
created timestamp without time zone DEFAULT now(),
modified timestamp without time zone DEFAULT now(),
active boolean DEFAULT true
);
ALTER TABLE ONLY alias ALTER COLUMN id SET STATISTICS 0;


ALTER TABLE public.alias OWNER TO postfix;

--
-- Name: alias_id_seq; Type: SEQUENCE; Schema: public; Owner: postfix
--

CREATE SEQUENCE alias_id_seq
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;


ALTER TABLE public.alias_id_seq OWNER TO postfix;

--
-- Name: alias_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postfix
--

ALTER SEQUENCE alias_id_seq OWNED BY alias.id;


--
-- Name: domain; Type: TABLE; Schema: public; Owner: postfix; Tablespace: 
--

CREATE TABLE domain (
id bigint NOT NULL,
domain character varying(256) NOT NULL,
description character varying(256),
aliases integer DEFAULT 0,
mailboxes integer DEFAULT 0,
maxquota integer DEFAULT 0,
transport character varying(256),
backupmx boolean DEFAULT false NOT NULL,
created timestamp(0) without time zone DEFAULT now(),
modified timestamp(0) without time zone DEFAULT now(),
active boolean DEFAULT true NOT NULL
);
ALTER TABLE ONLY domain ALTER COLUMN id SET STATISTICS 0;
ALTER TABLE ONLY domain ALTER COLUMN domain SET STATISTICS 0;
ALTER TABLE ONLY domain ALTER COLUMN description SET STATISTICS 0;
ALTER TABLE ONLY domain ALTER COLUMN aliases SET STATISTICS 0;
ALTER TABLE ONLY domain ALTER COLUMN mailboxes SET STATISTICS 0;
ALTER TABLE ONLY domain ALTER COLUMN maxquota SET STATISTICS 0;
ALTER TABLE ONLY domain ALTER COLUMN transport SET STATISTICS 0;
ALTER TABLE ONLY domain ALTER COLUMN backupmx SET STATISTICS 0;
ALTER TABLE ONLY domain ALTER COLUMN created SET STATISTICS 0;
ALTER TABLE ONLY domain ALTER COLUMN modified SET STATISTICS 0;
ALTER TABLE ONLY domain ALTER COLUMN active SET STATISTICS 0;


ALTER TABLE public.domain OWNER TO postfix;

--
-- Name: domain_id_seq; Type: SEQUENCE; Schema: public; Owner: postfix
--

CREATE SEQUENCE domain_id_seq
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;


ALTER TABLE public.domain_id_seq OWNER TO postfix;

--
-- Name: domain_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postfix
--

ALTER SEQUENCE domain_id_seq OWNED BY domain.id;


--
-- Name: ip_control; Type: TABLE; Schema: public; Owner: postfix; Tablespace: 
--

CREATE TABLE ip_control (
id bigint NOT NULL,
address inet NOT NULL,
mask inet DEFAULT '255.255.255.255'::inet NOT NULL,
verdict character varying(256) DEFAULT 'REJECT Your ass is banned.'::character varying NOT NULL,
comment character varying(256) DEFAULT ''::character varying,
requests_count bigint DEFAULT 0,
created timestamp(0) without time zone DEFAULT now() NOT NULL,
updated timestamp(0) without time zone DEFAULT now()
);


ALTER TABLE public.ip_control OWNER TO postfix;

--
-- Name: TABLE ip_control; Type: COMMENT; Schema: public; Owner: postfix
--

COMMENT ON TABLE ip_control IS 'select Id from IP_Control where (Address &amp;amp; Mask) = (''190.65.140.122'' &amp;amp; Mask)';


--
-- Name: ip_control_id_seq; Type: SEQUENCE; Schema: public; Owner: postfix
--

CREATE SEQUENCE ip_control_id_seq
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;


ALTER TABLE public.ip_control_id_seq OWNER TO postfix;

--
-- Name: ip_control_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postfix
--

ALTER SEQUENCE ip_control_id_seq OWNED BY ip_control.id;


--
-- Name: ip_control_log; Type: TABLE; Schema: public; Owner: postfix; Tablespace: 
--

CREATE TABLE ip_control_log (
id bigint NOT NULL,
event_time timestamp(0) without time zone DEFAULT now(),
request character varying DEFAULT ''::character varying
);
ALTER TABLE ONLY ip_control_log ALTER COLUMN event_time SET STATISTICS 0;


ALTER TABLE public.ip_control_log OWNER TO postfix;

--
-- Name: ip_control_log_id_seq; Type: SEQUENCE; Schema: public; Owner: postfix
--

CREATE SEQUENCE ip_control_log_id_seq
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;


ALTER TABLE public.ip_control_log_id_seq OWNER TO postfix;

--
-- Name: ip_control_log_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postfix
--

ALTER SEQUENCE ip_control_log_id_seq OWNED BY ip_control_log.id;


--
-- Name: mailbox; Type: TABLE; Schema: public; Owner: postfix; Tablespace: 
--

CREATE TABLE mailbox (
id bigint NOT NULL,
username character varying(256) NOT NULL,
password character varying(256) NOT NULL,
name character varying(256) DEFAULT ''::character varying,
maildir character varying(256) NOT NULL,
quota integer DEFAULT 1073741824 NOT NULL,
domain character varying(256) DEFAULT 'example.com'::character varying NOT NULL,
created timestamp(0) without time zone DEFAULT now(),
modified timestamp(0) without time zone DEFAULT now(),
active boolean DEFAULT true NOT NULL
);
ALTER TABLE ONLY mailbox ALTER COLUMN id SET STATISTICS 0;
ALTER TABLE ONLY mailbox ALTER COLUMN username SET STATISTICS 0;
ALTER TABLE ONLY mailbox ALTER COLUMN password SET STATISTICS 0;
ALTER TABLE ONLY mailbox ALTER COLUMN name SET STATISTICS 0;
ALTER TABLE ONLY mailbox ALTER COLUMN maildir SET STATISTICS 0;
ALTER TABLE ONLY mailbox ALTER COLUMN quota SET STATISTICS 0;
ALTER TABLE ONLY mailbox ALTER COLUMN domain SET STATISTICS 0;
ALTER TABLE ONLY mailbox ALTER COLUMN created SET STATISTICS 0;
ALTER TABLE ONLY mailbox ALTER COLUMN modified SET STATISTICS 0;
ALTER TABLE ONLY mailbox ALTER COLUMN active SET STATISTICS 0;


ALTER TABLE public.mailbox OWNER TO postfix;

--
-- Name: mailbox_id_seq; Type: SEQUENCE; Schema: public; Owner: postfix
--

CREATE SEQUENCE mailbox_id_seq
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;


ALTER TABLE public.mailbox_id_seq OWNER TO postfix;

--
-- Name: mailbox_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postfix
--

ALTER SEQUENCE mailbox_id_seq OWNED BY mailbox.id;


--
-- Name: id; Type: DEFAULT; Schema: public; Owner: postfix
--

ALTER TABLE alias ALTER COLUMN id SET DEFAULT nextval('alias_id_seq'::regclass);


--
-- Name: id; Type: DEFAULT; Schema: public; Owner: postfix
--

ALTER TABLE domain ALTER COLUMN id SET DEFAULT nextval('domain_id_seq'::regclass);


--
-- Name: id; Type: DEFAULT; Schema: public; Owner: postfix
--

ALTER TABLE ip_control ALTER COLUMN id SET DEFAULT nextval('ip_control_id_seq'::regclass);


--
-- Name: id; Type: DEFAULT; Schema: public; Owner: postfix
--

ALTER TABLE ip_control_log ALTER COLUMN id SET DEFAULT nextval('ip_control_log_id_seq'::regclass);


--
-- Name: id; Type: DEFAULT; Schema: public; Owner: postfix
--

ALTER TABLE mailbox ALTER COLUMN id SET DEFAULT nextval('mailbox_id_seq'::regclass);


--
-- Name: addresses_address_key; Type: CONSTRAINT; Schema: public; Owner: postfix; Tablespace: 
--

ALTER TABLE ONLY addresses
ADD CONSTRAINT addresses_address_key UNIQUE (address);


--
-- Name: addresses_pkey; Type: CONSTRAINT; Schema: public; Owner: postfix; Tablespace: 
--

ALTER TABLE ONLY addresses
ADD CONSTRAINT addresses_pkey PRIMARY KEY (id);


--
-- Name: alias_address_key; Type: CONSTRAINT; Schema: public; Owner: postfix; Tablespace: 
--

ALTER TABLE ONLY alias
ADD CONSTRAINT alias_address_key UNIQUE (address);


--
-- Name: alias_pkey; Type: CONSTRAINT; Schema: public; Owner: postfix; Tablespace: 
--

ALTER TABLE ONLY alias
ADD CONSTRAINT alias_pkey PRIMARY KEY (id);


--
-- Name: domain_pkey; Type: CONSTRAINT; Schema: public; Owner: postfix; Tablespace: 
--

ALTER TABLE ONLY domain
ADD CONSTRAINT domain_pkey PRIMARY KEY (id);


--
-- Name: ip_control_log_pkey; Type: CONSTRAINT; Schema: public; Owner: postfix; Tablespace: 
--

ALTER TABLE ONLY ip_control_log
ADD CONSTRAINT ip_control_log_pkey PRIMARY KEY (id);


--
-- Name: ip_control_pkey; Type: CONSTRAINT; Schema: public; Owner: postfix; Tablespace: 
--

ALTER TABLE ONLY ip_control
ADD CONSTRAINT ip_control_pkey PRIMARY KEY (id);


--
-- Name: mailbox_pkey; Type: CONSTRAINT; Schema: public; Owner: postfix; Tablespace: 
--

ALTER TABLE ONLY mailbox
ADD CONSTRAINT mailbox_pkey PRIMARY KEY (id);


--
-- Name: mailbox_username_key; Type: CONSTRAINT; Schema: public; Owner: postfix; Tablespace: 
--

ALTER TABLE ONLY mailbox
ADD CONSTRAINT mailbox_username_key UNIQUE (username);


--
-- Name: ip_control_bu; Type: TRIGGER; Schema: public; Owner: postfix
--

CREATE TRIGGER ip_control_bu
BEFORE UPDATE ON ip_control
FOR EACH ROW
EXECUTE PROCEDURE ip_control_bu();


--
-- Name: public; Type: ACL; Schema: -; Owner: postgres
--

REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM postgres;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO PUBLIC;


--
-- Name: alias; Type: ACL; Schema: public; Owner: postfix
--

REVOKE ALL ON TABLE alias FROM PUBLIC;
REVOKE ALL ON TABLE alias FROM postfix;
GRANT ALL ON TABLE alias TO postfix;


--
-- Name: alias_id_seq; Type: ACL; Schema: public; Owner: postfix
--

REVOKE ALL ON SEQUENCE alias_id_seq FROM PUBLIC;
REVOKE ALL ON SEQUENCE alias_id_seq FROM postfix;
GRANT ALL ON SEQUENCE alias_id_seq TO postfix;


--
-- Name: domain; Type: ACL; Schema: public; Owner: postfix
--

REVOKE ALL ON TABLE domain FROM PUBLIC;
REVOKE ALL ON TABLE domain FROM postfix;
GRANT ALL ON TABLE domain TO postfix;


--
-- Name: domain_id_seq; Type: ACL; Schema: public; Owner: postfix
--

REVOKE ALL ON SEQUENCE domain_id_seq FROM PUBLIC;
REVOKE ALL ON SEQUENCE domain_id_seq FROM postfix;
GRANT ALL ON SEQUENCE domain_id_seq TO postfix;


--
-- Name: mailbox; Type: ACL; Schema: public; Owner: postfix
--

REVOKE ALL ON TABLE mailbox FROM PUBLIC;
REVOKE ALL ON TABLE mailbox FROM postfix;
GRANT ALL ON TABLE mailbox TO postfix;


--
-- Name: mailbox_id_seq; Type: ACL; Schema: public; Owner: postfix
--

REVOKE ALL ON SEQUENCE mailbox_id_seq FROM PUBLIC;
REVOKE ALL ON SEQUENCE mailbox_id_seq FROM postfix;
GRANT ALL ON SEQUENCE mailbox_id_seq TO postfix;


--
-- PostgreSQL database dump complete
--
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-7754669515257443502?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/u8Il0Le5MrW4xruW5HLg2rMDKQQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/u8Il0Le5MrW4xruW5HLg2rMDKQQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/u8Il0Le5MrW4xruW5HLg2rMDKQQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/u8Il0Le5MrW4xruW5HLg2rMDKQQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/XBwJrXh7BaQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/7754669515257443502/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/07/antispam-postfix-setup.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/7754669515257443502?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/7754669515257443502?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/XBwJrXh7BaQ/antispam-postfix-setup.html" title="AntiSPAM postfix setup" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/07/antispam-postfix-setup.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MBSXY4fCp7ImA9WhdQGEk.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-6439097007756096653</id><published>2009-05-21T17:05:00.001+02:00</published><updated>2011-08-20T15:04:18.834+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T15:04:18.834+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinion" /><category scheme="http://www.blogger.com/atom/ns#" term="library" /><category scheme="http://www.blogger.com/atom/ns#" term="PostgreSQL" /><category scheme="http://www.blogger.com/atom/ns#" term="C/C++" /><title>libpqtypes</title><content type="html">In recent post I've posted part of my library, that deals with PostgreSQL data in binary format. Today, googling for some hints for implementing binary timestamps in double format I've found a reliable library, &lt;a href="http://libpqtypes.esilo.com"&gt;libpqtypes&lt;/a&gt;, which is doing exactly the same as mine (actually more), except it's purpose is PostgreSQL only.  &lt;br /&gt;
Don't know if it's terrible news or not, as I could adapt my code while using this library and win a lot of time. This is one of the reasons why extensive googling is required before each project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-6439097007756096653?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EFpulYWtQtfbmvxcek8c1-HUBfE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EFpulYWtQtfbmvxcek8c1-HUBfE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EFpulYWtQtfbmvxcek8c1-HUBfE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EFpulYWtQtfbmvxcek8c1-HUBfE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/w4whfqvcH4o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/6439097007756096653/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/05/libpqtypes.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/6439097007756096653?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/6439097007756096653?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/w4whfqvcH4o/libpqtypes.html" title="libpqtypes" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/05/libpqtypes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MFQ307fCp7ImA9WhdQGEk.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-1560870948662065456</id><published>2009-05-21T02:50:00.004+02:00</published><updated>2011-08-20T15:03:32.304+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T15:03:32.304+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="snippets" /><category scheme="http://www.blogger.com/atom/ns#" term="PostgreSQL" /><category scheme="http://www.blogger.com/atom/ns#" term="C/C++" /><title>PostgreSQL binary timestamp functions</title><content type="html">While writing &lt;a href="http://www.postgresql.org/docs/8.3/static/libpq.html"&gt;libpq&lt;/a&gt; wrapper I've run into problems with binary timestamps, which required a lot of debugging and headaches. To avoid your own migraine, feel free to use my code below. Note, however, this code is not perfect, as it's uses long long for timestamps. This will work if your machine is 32bit and your server was compiled with `--enable-integer-datetimes` (highly recommended). If not, You're welcome to patch this code and post it here, so other people will thank you.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;pre name="code" class="c++"&gt;bool Database::get(int row_number, int column_number, struct tm *value)
{
    long long timestamp;
    // get long long with correct byte ordering
    if(!get(row_number, column_number, &amp;timestamp))
        return false;

    memset(value, 0, sizeof(struct tm));

    long long dDate, date0, time;

    date0 = date2j(2000, 1, 1);

    time = timestamp;
    TMODULO(time, dDate, USECS_PER_DAY);

    if(time &lt; (long long)0) {
        time += USECS_PER_DAY;
        dDate -= 1;
    }

    // add offset to go from J2000 back to standard Julian date
    dDate += date0;

    // Julian day routine does not work for negative Julian days 
    if(dDate &lt; 0 || dDate &gt; (long long)INT_MAX)
        return false;

    j2date ((int)dDate, &amp;value-&gt;tm_year, &amp;value-&gt;tm_mon, &amp;value-&gt;tm_mday);
    dt2time(     time,  &amp;value-&gt;tm_hour, &amp;value-&gt;tm_min, &amp;value-&gt;tm_sec);

    // years in tm starts from 1900
    value-&gt;tm_year -= 1900;
    // months in tm are zero based
    value-&gt;tm_mon--;

    // mark this as *no* time zone available
    value-&gt;tm_isdst = -1;

    return true;
}

bool Database::put(struct tm* value)
{
    // Julian day routines are not correct for negative Julian days
    if(!IS_VALID_JULIAN(value-&gt;tm_year + 1900, value-&gt;tm_mon + 1, value-&gt;tm_mday))
        return false;

    long long dDate, time, timestamp;

    dDate = date2j(value-&gt;tm_year + 1900, value-&gt;tm_mon + 1, value-&gt;tm_mday) -
            date2j(2000, 1, 1);
    time  = time2t(value-&gt;tm_hour, value-&gt;tm_min, value-&gt;tm_sec);

    timestamp = dDate * USECS_PER_DAY + time;

    // check for major overflow
    if((timestamp - time) / USECS_PER_DAY != dDate)
        return false;
    // check for just-barely overflow (okay except time-of-day wraps)
    if((timestamp  &lt; 0 &amp;&amp; dDate &gt;= 0) ||
       (timestamp &gt;= 0 &amp;&amp; dDate &lt;  0))
        return false;

    long long *ts = &amp;timestamp;
    unsigned long l1 = htonl(*((unsigned long *) ts + 0));
    unsigned long l2 = htonl(*((unsigned long *) ts + 1));
    unsigned long long ll = l1;
    ll = (ll &lt;&lt; 32) + l2;

    return put(OID_DATETIME, (char*) &amp;ll, sizeof(long long));
}
&lt;/pre&gt;
&lt;br /&gt;
All the functions from this code are available in postgres sources, except `put` and `get` which I will not publish due to specifics of my code. If you're using this, you should already have your own functions for argument saving into some buffer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-1560870948662065456?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/I6-I9JAa_Ps_1gCK5Eg1BM3Ajbk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/I6-I9JAa_Ps_1gCK5Eg1BM3Ajbk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/I6-I9JAa_Ps_1gCK5Eg1BM3Ajbk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/I6-I9JAa_Ps_1gCK5Eg1BM3Ajbk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/OS5_sQGX0XU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/1560870948662065456/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/05/postgresql-binary-timestamp-functions.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/1560870948662065456?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/1560870948662065456?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/OS5_sQGX0XU/postgresql-binary-timestamp-functions.html" title="PostgreSQL binary timestamp functions" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/05/postgresql-binary-timestamp-functions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQHSXw9fip7ImA9WhdQGEk.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-149352646277402739</id><published>2009-05-05T21:31:00.000+02:00</published><updated>2011-08-20T14:45:38.266+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T14:45:38.266+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="snippets" /><category scheme="http://www.blogger.com/atom/ns#" term="Lua" /><title>Lua constants</title><content type="html">By Lua's nature, it is not possible to create constants. There is a workaround, though, using metatables: &lt;br /&gt;
&lt;br /&gt;
&lt;pre name="code" class="lua"&gt;function protect(tbl)
    return setmetatable({}, {
        __index = tbl,
        __newindex = function(t, key, value)
            error("attempting to change constant " ..
                   tostring(key) .. " to " .. tostring(value), 2)
        end
    })
end

constants = {
    x = 1,
    y = 2,
}
constants = protect(constants)

print(constants.x) --&gt; 3
constants.x = 3 --&gt; error: attempting to change constant x to 3
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-149352646277402739?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fDKSURaCy8TDIdMefNygVN3HwQY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fDKSURaCy8TDIdMefNygVN3HwQY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fDKSURaCy8TDIdMefNygVN3HwQY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fDKSURaCy8TDIdMefNygVN3HwQY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/EEeDTFSXDBo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/149352646277402739/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/05/lua-constants.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/149352646277402739?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/149352646277402739?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/EEeDTFSXDBo/lua-constants.html" title="Lua constants" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/05/lua-constants.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIAQXkzeCp7ImA9WhdQGEk.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-8233092887824847084</id><published>2009-05-01T04:22:00.001+02:00</published><updated>2011-08-20T15:39:00.780+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T15:39:00.780+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinion" /><category scheme="http://www.blogger.com/atom/ns#" term="Lua" /><category scheme="http://www.blogger.com/atom/ns#" term="handler" /><category scheme="http://www.blogger.com/atom/ns#" term="C/C++" /><title>Lua error message format</title><content type="html">I work on the library, which will use Lua. Thinking about the possibility to give a good error structure instead of plain message, I've found that &lt;a href="http://www.lua.org/manual/5.0/manual.html#lua_pcall"&gt;lua_pcall&lt;/a&gt; has a nice feature to specify custom error handler function:&lt;br /&gt;
&lt;br /&gt;
&lt;pre name="code" class="c++"&gt;lua_pushcfunction(L, error_handler);
luaL_loadfile(L, "file.lua");
lua_pcall(L, 0, 0, -2);
&lt;/pre&gt;&lt;br /&gt;
Using this there is a way to get a chunk name and it's error line number:&lt;br /&gt;
&lt;br /&gt;
&lt;pre name="code" class="c++"&gt;int error_handler(lua_State* L) {
    lua_Debug d;

    lua_getstack(L, 1, &amp;amp;d);
    lua_getinfo(L, "Sln", &amp;amp;d);

    string err = lua_tostring(L, -1);
    lua_pop(L, 1);

    stringstream msg;
    msg &amp;lt;&amp;lt; d.short_src &amp;lt;&amp;lt; ":" &amp;lt;&amp;lt; d.currentline;
    if(d.name != 0) {
        msg &amp;lt;&amp;lt; "(" &amp;lt;&amp;lt; d.namewhat &amp;lt;&amp;lt; " " &amp;lt;&amp;lt; d.name &amp;lt;&amp;lt; ")";
    }
    msg &amp;lt;&amp;lt; " &amp;gt; " &amp;lt;&amp;lt; err;
    lua_pushstring(L, msg.str().c_str());

    return 1;
}
&lt;/pre&gt;Work's like a charm, except one thing. This is the output from this error handler:  &lt;br /&gt;
&lt;pre name="code" class="text"&gt;[string "test"]:1 &amp;gt; [string "test"]:1: attempt to index global 'a' (a nil value)
&lt;/pre&gt;&lt;br /&gt;
Why? Oh, why the Lua guys are putting assembled error message with chunk name and line number if I use my own error handler? IMHO, this is wrong. There is no other way to give a user nice message except parsing. Actually parsing of such message is easy, but.. the Lua guys have changed error message format a few times already. I'm pissed!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-8233092887824847084?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JhHpRmA_Q--xtpPxibRcmQ1pWXY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JhHpRmA_Q--xtpPxibRcmQ1pWXY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JhHpRmA_Q--xtpPxibRcmQ1pWXY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JhHpRmA_Q--xtpPxibRcmQ1pWXY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/jvkodHDxlOI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/8233092887824847084/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/04/lua-error-message-format.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/8233092887824847084?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/8233092887824847084?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/jvkodHDxlOI/lua-error-message-format.html" title="Lua error message format" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/04/lua-error-message-format.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IGSHg8eip7ImA9WhdQGE4.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-5129018121765944786</id><published>2009-04-30T21:50:00.000+02:00</published><updated>2011-08-20T13:25:29.672+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T13:25:29.672+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="crosscompiler" /><category scheme="http://www.blogger.com/atom/ns#" term="gcc" /><category scheme="http://www.blogger.com/atom/ns#" term="MinGW" /><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><title>Mingw on Linux</title><content type="html">I'm using MinGW for years, but never tried to use it on Linux machine as a crosscompiler. Today I've had first experience. First thing I've noticed is how actually easy to install such environment - there is a totally automated build script available from &lt;a href="http://www.mingw.org/" target="_blank"&gt;MinGW site&lt;/a&gt;.&lt;br /&gt;
Pros:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;One environment&lt;/li&gt;
&lt;li&gt;Speed. Native environment vs MSys is much, much faster.&lt;/li&gt;
&lt;/ul&gt;Cons:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Building non-Linux things on Linux means transferring them from one machine to another.&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/455795685683998727-5129018121765944786?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/n43kgDMJu0qIQxM5f_eCB1H79jU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n43kgDMJu0qIQxM5f_eCB1H79jU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/n43kgDMJu0qIQxM5f_eCB1H79jU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n43kgDMJu0qIQxM5f_eCB1H79jU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/Hwfhe81Dh6w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/5129018121765944786/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/04/mingw-on-linux.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/5129018121765944786?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/5129018121765944786?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/Hwfhe81Dh6w/mingw-on-linux.html" title="Mingw on Linux" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/04/mingw-on-linux.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EDRHg_eyp7ImA9WhdQGE4.&quot;"><id>tag:blogger.com,1999:blog-455795685683998727.post-7545390728591872870</id><published>2009-04-29T21:25:00.000+02:00</published><updated>2011-08-20T13:27:55.643+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T13:27:55.643+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PostgreSQL" /><category scheme="http://www.blogger.com/atom/ns#" term="postgres" /><title>Fastest way to create database in PostgreSQL</title><content type="html">This will create database and it's associated role from Linux shell:&lt;br /&gt;
&lt;pre name="code" class="text"&gt;su postgres
createuser -SDRPE user
createdb -E UTF8 -O user database
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/455795685683998727-7545390728591872870?l=andrejs-cainikovs.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SNABGtIkPaHwtzt_xtNTW_8U-1w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SNABGtIkPaHwtzt_xtNTW_8U-1w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SNABGtIkPaHwtzt_xtNTW_8U-1w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SNABGtIkPaHwtzt_xtNTW_8U-1w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/abortretrygetACoffee/~4/tmUkcwA7S34" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andrejs-cainikovs.blogspot.com/feeds/7545390728591872870/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://andrejs-cainikovs.blogspot.com/2009/04/fastest-way-to-create-database-in.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/7545390728591872870?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/455795685683998727/posts/default/7545390728591872870?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abortretrygetACoffee/~3/tmUkcwA7S34/fastest-way-to-create-database-in.html" title="Fastest way to create database in PostgreSQL" /><author><name>Andrejs Cainikovs</name><uri>https://profiles.google.com/108521765890074466487</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-TqEdoVFODU4/AAAAAAAAAAI/AAAAAAAAAes/0cWjLbitR0o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andrejs-cainikovs.blogspot.com/2009/04/fastest-way-to-create-database-in.html</feedburner:origLink></entry></feed>

