<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>web performance | δικτυακή παράσταση</title>
	
	<link>http://www.andmarios.com</link>
	<description>DO NOT PANIC</description>
	<lastBuildDate>Fri, 12 Apr 2013 15:41:35 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/andmarios/SGQr" /><feedburner:info uri="andmarios/sgqr" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>andmarios/SGQr</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Android, Open Source and a self-induced hackathon</title>
		<link>http://feedproxy.google.com/~r/andmarios/SGQr/~3/6IbSTFMUVxk/</link>
		<comments>http://www.andmarios.com/en/2013/04/android-open-source-and-a-self-induced-hackathon/#comments</comments>
		<pubDate>Thu, 11 Apr 2013 17:53:15 +0000</pubDate>
		<dc:creator>Marios</dc:creator>
				<category><![CDATA[Όλα τα Άρθρα]]></category>
		<category><![CDATA[Επιλεγμένα Άρθρα]]></category>
		<category><![CDATA[Linux και Ανοιχτό Λογισμικό]]></category>
		<category><![CDATA[Τεχνολογία]]></category>
		<category><![CDATA[Κείμενα]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[hackathon]]></category>

		<guid isPermaLink="false">http://www.andmarios.com/?p=1255</guid>
		<description><![CDATA[tl;dr Android as a whole -from Google&#8217;s code repository to cheap Chinese tablets- is open source to a certain extent but, although this acts as a cushion for poor product releases, it isn&#8217;t an excuse. Some weeks ago I had to spend more time than usual to get my Android devices do my binding; more [...]]]></description>
				<content:encoded><![CDATA[<blockquote><p><strong>tl;dr</strong> Android as a whole -from Google&#8217;s code repository to cheap Chinese tablets- is open source to a certain extent but, although this acts as a cushion for poor product releases, it isn&#8217;t an excuse.</p></blockquote>
<p>Some weeks ago I had to spend more time than usual to get my Android devices do my binding; more time as in four (4) days!</p>
<p>When it comes to Android, I am an advanced user, having rooted and flashed some ROMs on my devices. Also, due to my Linux knowledge, Android&#8217;s lower levels don&#8217;t feel that strange to me.</p>
<p>That said, without any specific knowledge, in 4 days I got to resolve a hardware (software related though) issue, write a really basic Android application, submitted it to Play store and create a custom ROM image by using a ready made ROM as base (some orders of magnitude easier than compiling cyanogenmod).</p>
<p>For any Linux user, Android has a low entry hacking barrier.</p>
<h2>Day 1: hardware hacking on Samsung&#8217;s Galaxy R i9103 phone</h2>
<p>I like photography. Since the 1st day, one and a half year ago, being on Android GB 2.3, my Samsung Galaxy R didn&#8217;t permit for exposure compensation (and consequently HDR) from any 3rd party app. This was unacceptable. I emailed various app developers about this, but it was a device specific problem they could not solve. The trend continued even when Samsung released Android ICS 4.0.1 for my model.</p>
<p>Since I upgraded to a custom, almost alpha, version of CM 10.1, I thought it was about time to solve it myself. I downloaded kernel sources, CM sources, did some online search, did some <em>grepping</em> and found possible places of failure. Although in the end I could describe perfectly the problem, like which Android framework&#8217;s call were failing to provide accurate data, I couldn&#8217;t tell where exactly the failure happened. The kernel driver returned correct information, yet Android framework reported them wrong (or probably reported some default Android values).</p>
<p>Samsung had fixed this in their camera apk. Yeap, they knew the problem and instead of fixing it properly, they opt to fix it only for their built-in camera app, breaking any 3rd party app from Google Play. Kudos Samsung for being a douchebag.</p>
<p>I would report the problem to the CM developer but I wanted an easy fix (and proof of concept) for myself. I decided that the easiest way for me, would be to hardcode my device&#8217;s capabilities inside Android&#8217;s framework. But again, compiling CM from source, isn&#8217;t the easiest path possible. So, hello Dalvik assembly. I downloaded an Android jar/apk disassembler, took <em>framework.jar</em> from my phone, disassemble it, hardcoded my device&#8217;s data, reassemble it and I was ready. I could now both describe the problem and provide a proof-of-concept fix, since many people didn&#8217;t want to aknowledge that their device had a problem.</p>
<p>Suffice it to say, for the next few days, I only took HDR photos. <img src='http://png.andmarios.com/wp/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>For the technical oriented, you could see my post over XDA which explains the problem: <a href="http://forum.xda-developers.com/showpost.php?p=38757391">http://forum.xda-developers.com/showpost.php?p=38757391</a></p>
<p>So, day 1 ended. I learned a bit about Android kernel, CM/Android sources, CM development model, Android&#8217;s framework, Android&#8217;s Dalvik assembly.</p>
<h2>Day 2: hacking on Android Jelly Bean, releasing an app</h2>
<p>Day 1 was Monday. On Tuesday I received a chinese Android tablet I had ordered a month before. I spent the best part of this day shooting HDR and playing with the tablet. Day 2 was Wednesday.</p>
<p>I sincerely think that Android can be used for some work, though this may require a hardware keyboard. I connected a usb keyboard to my tablet and was delighted to find that Android JB 4.1 has proper support for hardware keyboards. Unfortunately though, it didn&#8217;t support Greek. Thankfully, language layouts could be added via 3rd party apps, but none was available for Greek.</p>
<p>There was one paid app in Play, that supported Greek via a hardware keyboard by implementing a software keyboard. That may be needed for older Android versions but not for Jelly Bean which lets you use any software keyboard (and its correction/prediction methods) with your physical keyboard. Also its cost was about €2.5, which I think is a bit too much for anyone who just want to write in his mother tongue.</p>
<p>Open source wins again and after some search, I found an open source project which added an English variant layout to Jelly Bean. This was a good start.</p>
<p>I downloaded it and tried to compile it since I had Android SDK installed because I needed adb. It couldn&#8217;t compile because I had an older Android SDK and also the downloaded project included some configuration files that I should create myself.</p>
<p>After a quick course in Android&#8217;s build system and an update to the SDK, I could compile it myself. It took me some trials to understand the format Android uses to describe keyboard layouts. Google&#8217;s documentation is good but I think in this case, it could be a little better. When I understood the format,  it took me a couple of hours, at most, to transfer the Greek layout and get something that worked.</p>
<p>But I couldn&#8217;t stop there. I wanted to be easy for all people to write in Greek, so I decided to uploaded it to Google Play.</p>
<p>I got myself a Google developer account and paid the $25 fee, a tad ironic since earlier I refused to buy the €2.5 app, but this was different. Then I learned that in order to upload an app to Google Play, I have to add icons to my application, to write descriptions, to add screenshots etc.</p>
<p>All these took about as much time, as the development process. I had to learn about android resources (how to add icons to an app for various resolutions), I had to create an icon, to stage some screenshots from the mobile phone because the tablet had a non standard screen resolution which Google wouldn&#8217;t accept, write an accurate description and translate it to Greek.</p>
<p>For the icon, I couldn&#8217;t find a decent icon of a keyboard button with a permissive enough license, so I resorted to my camera and used a photo of my keyboard. I am not very happy with the result, but it was the best I could get. We should introduce more artists to free software.</p>
<p>Last, I wrote about my app in a couple of forums that I am a regular, respecting each forum&#8217;s rules (aka I didn&#8217;t spam).</p>
<p>So, day 2 ended. I learned a bit about Android&#8217;s build system, Android&#8217;s SDK, Android Programming, Google Play. In the morning I knew nothing about developing an app. In the evening my app was published (and visible) in Google Play. I don&#8217;t think Google can lower this barrier any further.</p>
<p>Oh, of course my app&#8217;s source code is available. Head over to github to check it out: <a href="https://github.com/andmarios/GreekHWKeyboard">https://github.com/andmarios/GreekHWKeyboard</a></p>
<h2>Day 3 and 4: ROM/hardware/software hacking over Pipo S2 tablet</h2>
<p>This wasn&#8217;t as exciting. The chinese tablet (a Pipo Max S2) had a decent ROM but with some shortcomings, like the absence of root and an easy way to root, as well as some built in apps I didn&#8217;t need to use my resources.</p>
<p>No one had released an acceptable -for me- ROM for the tablet. There was one ROM available at the time but it was very obtrusive for my taste, masquerading the tablet as a Samsung Galaxy S2 phone and tampering with framework.jar in unknown to me ways. So I thought I should release a ROM (a first for me) for all to enjoy.</p>
<p>I started by learning a bit about the tools you need to flash a RK3066 device. After that it was a matter of mounting an image and using my Android and linux knowledge to do some changes. It took me enough time though, because I would never risk to release a firmware less than perfect. So every step needed much testing.</p>
<p>I wanted to add nfs and smb support, so I downloaded some kernel sources and tried to built them. I couldn&#8217;t get working modules, so I used some that I found ready on the net. I needed to run some commands at startup, so I learned a bit about Android&#8217;s init. I wanted to add support for usb devices (disabled on Android&#8217;s level due to being flakky) so I learned a bit about Android permissions. I found that performance was IO bounded, so I tried to enhance it a bit. The default notification ringtone could cause a heart attack, so I changed it.</p>
<p>It was fun, like hacking around a distribution, but not that great of a learning experience. I posted it to a couple of forums, got some feedback, adjusted some issues and issued an update.</p>
<p>So, days 3 and 4 ended. I learned a bit about Android&#8217;s OS level workings, I learned a bit about cross compiling, I learned a bit about proprietary embedded boards.</p>
<h2>Conclusion</h2>
<p>I am awesome! :p</p>
<p>No, seriously. Open source is awesome. Android is mostly awesome. Android devices are nice but not always awesome.</p>
<p>Should Samsung get away by the fact that they sold me a handset they knew to be broken? They programmed their own app to work around the problem, so they can&#8217;t deny that they had knowledge of it. They sold me a smartphone that couldn&#8217;t run 3rd party apps properly, so should we still consider it a smartphone?</p>
<p>Should Google get away by the fact that they didn&#8217;t include a Greek layout for physical keyboards in Android 4.1 nor in Android 4.2? They do have limited resources, but all it would take for them, would be 2 hours at most for one of their Greek speaking employees to do a completely mechanical task.</p>
<p>As for the Chinese vendor, they are illegal. They do not provide kernel sources as they should (the compiling I mentioned, was for sources provided by other vendors). Due to Android, they are able to sell and make profit of a decent tablet for a low price (below €100) which, because of Android being based on the open source Linux kernel, I was able to tamper with at a (super)user level and adapt partially to my needs. On the other hand, the lack of GPL compliance, means there aren&#8217;t serious community efforts to develop a ROM from scratch, or a way to use a more recent Android version, or for someone to try to improve the flakky usb support. We are at the vendor&#8217;s mercy to get updates and fixes.</p>
<p>Android shows the way. But we can do better.</p>
<div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://www.andmarios.com/en/2012/06/yet-another-backup-script-mrbstudio/' rel='bookmark' title='Yet Another Backup Script: mrbStudio'>Yet Another Backup Script: mrbStudio</a></li>
<li><a href='http://www.andmarios.com/en/2009/11/fujitsu-amilo-pi-3560-review-from-a-linux-user/' rel='bookmark' title='Fujitsu Amilo Pi 3560 review from a Linux user'>Fujitsu Amilo Pi 3560 review from a Linux user</a></li>
<li><a href='http://www.andmarios.com/en/2009/10/opening-act/' rel='bookmark' title='Opening Act'>Opening Act</a></li>
</ol></p>
</div>
<img src="http://feeds.feedburner.com/~r/andmarios/SGQr/~4/6IbSTFMUVxk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.andmarios.com/en/2013/04/android-open-source-and-a-self-induced-hackathon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.andmarios.com/en/2013/04/android-open-source-and-a-self-induced-hackathon/</feedburner:origLink></item>
		<item>
		<title>Gitlab 4.0 on a Gentoo server, ~amd64, hardened w/ Apache.</title>
		<link>http://feedproxy.google.com/~r/andmarios/SGQr/~3/hwELsMZ0jpw/</link>
		<comments>http://www.andmarios.com/en/2012/12/gitlab-40-on-a-gentoo-server-amd64-hardened-w-apache/#comments</comments>
		<pubDate>Fri, 28 Dec 2012 22:15:42 +0000</pubDate>
		<dc:creator>Marios</dc:creator>
				<category><![CDATA[Επιλεγμένα Άρθρα]]></category>
		<category><![CDATA[Linux και Ανοιχτό Λογισμικό]]></category>
		<category><![CDATA[Τεχνολογία]]></category>
		<category><![CDATA[Gentoo]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[gitlab]]></category>
		<category><![CDATA[guide]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.andmarios.com/?p=1188</guid>
		<description><![CDATA[he article about Gitlab on Ubuntu gets some views every day, so I guess it is an interesting subject -and it should be. GitLab is a great project. It could do with less RAM consumption and less frequent updates though, but I am only whining because I am using it and I am not going [...]]]></description>
				<content:encoded><![CDATA[<p><span class='et-dropcap'>T</span>he article about  <a href="http://www.andmarios.com/en/2012/06/gitlab-on-an-ubuntu-10-04-server-with-apache/" target="_blank">Gitlab on Ubuntu</a> gets some views every day, so I guess it is an interesting subject -and it should be. <a href="http://gitlabhq.com/" target="_blank">GitLab</a> is a great project. It could do with less RAM consumption and less frequent updates though, but I am only whining because I am using it and I am not going to uninstall it anytime soon. :p</p>
<p>The thing is I am in love with Gentoo for many years now and my Ubuntu server was more like an one time thing. So I set to install Gitlab on my ~amd64 hardened Gentoo and log the process for anyone interested. It is a great time too since Gitlab recently reached version 4.0 with enhanced project management.</p>
<p></br></p>
<h2>How to read this tutorial</h2>
<p>This tutorial&#8217;s purpose is to be used as a generic guide. Gitlab has frequent updates, once every month for both the software and the installation instructions; unfortunately I can&#8217;t maintain such a document.</p>
<p>The official installation guide covers Debian and Ubuntu. Since we are on Gentoo, we have to depart here and there. Fortunately, these parts that are different between Linux distributions, doesn&#8217;t change much.</p>
<p>So ideally you will open my guide on one half of your screen and <a href="https://github.com/gitlabhq/gitlabhq/blob/4-0-stable/doc/install/installation.md" target="_blank">the official guide</a> on the other half. You will follow the official guide and when you detect a difference, you will use my guide -but apply some logic too, you are running Gentoo after all.</p>
<p>I will try my best to make it clear when I copy the official guide and when I am doing Gentoo specific parts.</p>
<p>During most of this guide I use the sudo command, even when a command needs to run as root. I assume though that you are already root (Gentoo&#8217;s usual way). Using sudo in this case doesn&#8217;t harm in any way, I just try to keep my commands similar to Gitlab&#8217;s official instructions.</p>
<p><strong>Note:</strong> Chances are if you want to run Gitlab, you already run a web server. So, I won&#8217;t go into specifics about setting up Apache, MySQL, postfix etc. I will give you only the Gitlab specific parts for these programs. Before running my commands, I expect to you to think a bit and if needed, adjust them to your setup.</p>
<p></br></p>
<h2>1-2. Packages / Dependencies / Ruby (Gentoo way)</h2>
<p>Gitlab, as most programs, has dependencies. Emerging them one by one isn&#8217;t elegant and won&#8217;t help if you ever decide to remove Gitlab from your system.<br />
Download this ebuild instead (<a href="http://www.andmarios.com/wp/wp-content/plugins/download-monitor/download.php?id=gitlab-deps-0.ebuild.zip" title="download gitlab-deps-0.ebuild 4.0-stable">gitlab-deps-0.ebuild 4.0-stable</a>), put it on your local overlay, emerge it and you are good to go. If you ever remove Gitlab, unmerge gitlab-deps and do an <em>emerge &#8211;depclean</em>.</p>
<p><strong>Important:</strong> Gitlab depends on postfix. On my ebuild, I changed this to <em>virtual/mta</em>, so that it won&#8217;t ask you to change your setup. I haven&#8217;t test it though with anything else other than postfix. If you haven&#8217;t set an mta for your server (unlikely), then I encourage you to install and set up postfix before installing <strong>gitlab-deps</strong>.</p>
<p>If you don&#8217;t care about doing things elegantly and just want an emerge oneliner, here it is. It is strongly discouraged though. Gentoo isn&#8217;t designed to be used like this (adding dependencies as world entries).</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ emerge app-admin/sudo net-misc/wget net-misc/curl sys-devel/gcc dev-libs/libxml2 dev-libs/libxslt sys-libs/readline virtual/libc sys-devel/make sys-libs/zlib dev-libs/icu dev-db/redis net-misc/openssh dev-vcs/git dev-lang/python dev-lang/ruby:1.9 dev-ruby/rubygems dev-ruby/bundler dev-python/pip dev-libs/libyaml mail-mta/postfix dev-python/pygments</code></div></div>
<p>If you went with the oneliner, also emerge the database you want to use (mysql or postgres).</p>
<p></br></p>
<h2>3. System Users (Gentoo way)</h2>
<p>Create accounts for Git and Gitolite.</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ useradd -m -U -s /bin/sh -b /home -c "git repositories" git
$ useradd -m -U -s /sbin/nologin -b /home -c "gitlab" gitlab</p>
<p>$ usermod -a -G git gitlab
$ usermod -a -G gitlab git</p>
<p>$ sudo -H -u gitlab ssh-keygen -q -N '' -t rsa -f /home/gitlab/.ssh/id_rsa</code></div></div>
<p>The git account you just created is disabled, so you can&#8217;t ssh (or git/ssh) to it. Enable it by giving it a random password (no need to remember it):</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ passwd git</code></div></div>
<p></br></p>
<h2>4. Gitolite (Gitlab way)</h2>
<p>This is a direct copy from Gitlab&#8217;s official installation guide.</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ cd /home/git
$ sudo -H -u git git clone -b gl-v304 https://github.com/gitlabhq/gitolite.git /home/git/gitolite</p>
<p>$ sudo -u git -H mkdir bin
$ sudo -u git sh -c 'echo -e "PATH=\$PATH:/home/git/bin\nexport PATH" >> /home/git/.profile'
$ sudo -u git sh -c 'gitolite/install -ln /home/git/bin'</p>
<p>$ cp /home/gitlab/.ssh/id_rsa.pub /home/git/gitlab.pub
$ chmod 0444 /home/git/gitlab.pub</p>
<p>$ sudo -u git -H sh -c "PATH=/home/git/bin:$PATH; gitolite setup -pk /home/git/gitlab.pub"
$ sudo chmod 750 /home/git/.gitolite/
$ sudo chown -R git:git /home/git/.gitolite/
$ sudo chmod -R ug+rwXs,o-rwx /home/git/repositories/
$ sudo chown -R git:git /home/git/repositories/</code></div></div>
<p></br></p>
<h3>4.1. Disable StrictHostKeyChecking for localhost and your domain (Gitlab way)</h3>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ echo "Host localhost
   StrictHostKeyChecking no
   UserKnownHostsFile=/dev/null" | sudo tee -a /etc/ssh/ssh_config</p>
<p>$ echo "Host YOUR_DOMAIN_NAME
   StrictHostKeyChecking no
   UserKnownHostsFile=/dev/null" | sudo tee -a /etc/ssh/ssh_config</code></div></div>
<p></br></p>
<h3>4.2. Custom ssh port (Gitlab/Gentoo way)</h3>
<p>Usually you want your ssh daemon to hear to a non standard port in order to avoid automated port scans. In order for this to work with Gitlab, you have to configure the ssh client for your gitlab account:</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo -u gitlab -H echo -e "Host localhost\n  Port CUSTOM_SSH_PORT" >> /home/gitlab/.ssh/config</code></div></div>
<p></br></p>
<h3>4.3. Test if everything works so far (Gitlab way)</h3>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo -u gitlab -H git clone git@localhost:gitolite-admin.git /tmp/gitolite-admin
$ sudo rm -rf /tmp/gitolite-admin</code></div></div>
<p></br></p>
<h2>5. Database</h2>
<p>This section exists because it is present on the official guide too. No need to do anything here.</p>
<p></br></p>
<h2>6. Gitlab (Gitlab way with Gentoo specific parts)</h2>
<p></br></p>
<h3>6.1-6.2. Clone the source and configure it (Gitlab way)</h3>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ cd /home/gitlab/
$ sudo -H -u gitlab git clone -b stable https://github.com/gitlabhq/gitlabhq.git gitlab
$ cd /home/gitlab/gitlab
$ sudo -u gitlab -H git checkout 4-0-stable
$ sudo -u gitlab -H cp config/gitlab.yml.example config/gitlab.yml
$ sudo -u gitlab -H nano -w config/gitlab.yml
$ sudo chown -R gitlab log/
$ sudo chown -R gitlab tmp/
$ sudo chmod -R u+rwX  log/
$ sudo chmod -R u+rwX  tmp/
$ sudo -u gitlab -H cp config/unicorn.rb.example config/unicorn.rb</code></div></div>
<p></br></p>
<h3>6.3 Configure GitLab DB settings (Gentoo way)</h3>
<p>We are going to use a MySQL database. Create a database and a user for Gitlab, then configure Gitlab.</p>
<p>In case you don&#8217;t remember how to create a MySQL database:</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ mysql -uroot -p
mysql> CREATE DATABASE IF NOT EXISTS gitlabdb;
mysql> GRANT ALL ON gitlabdb.* TO gitlab@localhost IDENTIFIED BY 'gitlabpass';</code></div></div>
<p>Now configure Gitlab to use MySQL. Only the production section of <strong>database.yml</strong> needs to be adjusted.</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo -u gitlab cp config/database.yml.mysql config/database.yml
$ sudo -u gitlab -H nano -w config/database.yml</code></div></div>
<p></br></p>
<h3>6.4 Install Gems (Gentoo way)</h3>
<p>Gentoo has a problem with <em>charlock_holmes</em> due to its LDFLAGS.<br />
In order to fix it, you have to edit <strong>rbconfig.rb</strong>:</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ nano -w /usr/lib/ruby/1.9.1/x86_64-linux/rbconfig.rb</code></div></div>
<p>Find the line below (hint: search for &#8220;undefined&#8221;, it will be the 1st result) and remove the last ldflag:</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">CONFIG["LDFLAGS"] = "-L. -Wl,-O1 -Wl,--as-needed -rdynamic -Wl,-export-dynamic -Wl,--no-undefined"</code></div></div>
<p>Change to:</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">CONFIG["LDFLAGS"] = "-L. -Wl,-O1 -Wl,--as-needed -rdynamic -Wl,-export-dynamic"</code></div></div>
<p>Now you can install charlock_holmes and gitlab:</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ gem install charlock_holmes
$ sudo -u gitlab -H bundle install --deployment --without development test postgres</code></div></div>
<p>If you want, revert the changes you made to <strong>rbconfig.rb</strong>.</p>
<p></br></p>
<h3>6.5 Configure Git (Gitlab way)</h3>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo -u gitlab -H git config --global user.name "GitLab"
$ sudo -u gitlab -H git config --global user.email "gitlab@localhost"</code></div></div>
<p></br></p>
<h3>6.6 Setup GitLab Hooks (Gitlab way)</h3>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo cp ./lib/hooks/post-receive /home/git/.gitolite/hooks/common/post-receive
$ sudo chown git:git /home/git/.gitolite/hooks/common/post-receive</code></div></div>
<p></br></p>
<h3>6.7 Initialise Database and Activate Advanced Features (Gentoo way)</h3>
<p>If you are on hardened Gentoo using PAX, you have to adjust your ruby by disabling mprotect for it:</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ paxctl -m /usr/bin/ruby19</code></div></div>
<p>Start redis and mysql if you haven&#8217;t already, and add them to the default runlevel.</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ eselect rc start mysql
$ eselect rc start redis
$ eselect rc add mysql default
$ eselect rc add redis default</code></div></div>
<p>Proceed to setup Gitlab:</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo -u gitlab -H bundle exec rake gitlab:app:setup RAILS_ENV=production</code></div></div>
<p></br></p>
<h3>6.8 Check Application Status (Gitlab way with a note)</h3>
<p>The normal check suggested by the official instructions, may fail:</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo -u gitlab -H bundle exec rake gitlab:env:info RAILS_ENV=production</code></div></div>
<p>The thorough one should pass though, complaining only for Gitlab not running yet and missing the init script:</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo -u gitlab -H bundle exec rake gitlab:check RAILS_ENV=production</code></div></div>
<p></br></p>
<h3>6.9 Install Init Script (Gentoo way)</h3>
<p>Fortunately a Gentoo init script already exists, so I didn&#8217;t have to write it from scratch.<br />
Currently you can find it <a href="https://gist.github.com/2360407" target="_blank">at this gist</a>. In case this link stop working, google for <strong>gitlab gentoo init script</strong> and you surely get some results with updated versions of this script. <img src='http://png.andmarios.com/wp/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Download the gist, extract the init script and move it to your <em>init.d</em> directory. You may need to adjust the filenames and/or urls below.</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ cd /tmp
$ wget https://gist.github.com/2360407/download
$ tar xf download
$ mv gist2360407-aea491f595955282bdc0a259e9fccc8cae3e7274/gistfile1.sh /etc/init.d/gitlab
$ rm -r gist2360407-aea491f595955282bdc0a259e9fccc8cae3e7274
$ chmod 755 /etc/init.d/gitlab</code></div></div>
<p>If you installed Gitlab on a different path, adjust your init script:</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ nano -w /etc/init.d/gitlab</code></div></div>
<p><strong>Update:</strong> Yesterday (22/01/2013) Gitlab 4.1 came out which uses sidekiq instead of resque. I adjusted the init script and you can find it here: <a href="https://gist.github.com/4607331" target="_blank">Gitlab 4.1 init script for Gentoo</a>.</p>
<p></br></p>
<h2>7. Apache</h2>
<p>On my server I use Apache behind varnish. So, I will give you instructions for Apache.</p>
<p>Gitlab is a rails app. It runs on its own server (unicorn in our case) and Apache (or nginx) serve as a proxy.</p>
<p>By default, Gitlab (unicorn) listens on a socket. We want it to listen on a port. Set it below. Also you can set the worker processes to 1 in order to save some RAM. Generally, you don&#8217;t want to run Gitlab on a machine with less than 1GiB RAM, unless you only run Gitlab on it. With 1GiB though, your machine will be left with enough free RAM to work as a competent web server hosting many LAMP sites/apps.</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo -u gitlab -H nano -w /home/gitlab/gitlab/config/unicorn.rb</code></div></div>
<p>Your Apache should have the <strong>proxy</strong> modules as well as the <strong>byrequests</strong> method. These can be enabled by the appropriate <strong>APACHE2_MODULES</strong>.</p>
<p>If you have to rebuild your Apache to get them, don&#8217;t forget to restart it, a reload won&#8217;t help.</p>
<p>Also do not forget to enable proxy and ssl (<em>-D PROXY -D SSL -D SSL_DEFAULT_VHOST</em>) for your Apache setup at <strong>/etc/conf.d/apache2</strong>.</p>
<p>Next you have to set up Apache&#8217;s virtual host for Gitlab.<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ nano -w /etc/apache2/vhosts.d/20-gitlab.conf</code></div></div></p>
<p>I hope you can adjust the file below to your setup. Notice that in my example I have set <em>unicorn</em> to listen on port <strong>8080</strong>.</p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><pre>&lt;VirtualHost *:80&gt;
  ServerName gitlab.myserver.com
  ServerAlias www.gitlab.myserver.com
  DocumentRoot /home/gitlab/gitlab/public
  ErrorLog /var/log/apache2/gitlab.myserver.com_error_log
  CustomLog /var/log/apache2/gitlab.myserver.com_access_log combined

  &lt;Proxy balancer://unicornservers&gt;
      BalancerMember http://127.0.0.1:<strong>8080</strong>
  &lt;/Proxy&gt;

  &lt;Directory /home/gitlab/gitlab/public&gt;
    AllowOverride All
    Options -MultiViews
  &lt;/Directory&gt;

  RewriteEngine on
  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
  RewriteRule ^/(.*)$ balancer://unicornservers%{REQUEST_URI} [P,QSA,L]

  ProxyPass /uploads !
  ProxyPass / balancer://unicornservers/
  ProxyPassReverse / balancer://unicornservers/
  ProxyPreserveHost on

   &lt;Proxy *&gt;
      Order deny,allow
      Allow from all
   &lt;/Proxy&gt;
&lt;/VirtualHost&gt;

&lt;VirtualHost *:443&gt;
  ServerName gitlab.myserver.com
  ServerAlias www.gitlab.myserver.com
  DocumentRoot /home/gitlab/gitlab/public
  ErrorLog /var/log/apache2/gitlab.myserver.com_error_log
  CustomLog /var/log/apache2/gitlab.myserver.com_access_log combined

  &lt;Proxy balancer://unicornservers&gt;
      BalancerMember http://127.0.0.1:<strong>8080</strong>
      Header add X-Forwarded-Proto "https"
  &lt;/Proxy&gt;

  &lt;Directory /home/gitlab/gitlab/public&gt;
    AllowOverride All
    Options -MultiViews
  &lt;/Directory&gt;

  RewriteEngine on
  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
  RewriteRule ^/(.*)$ balancer://unicornservers%{REQUEST_URI} [P,QSA,L]

  ProxyPass /uploads !
  ProxyPass / balancer://unicornservers/
  ProxyPassReverse / balancer://unicornservers/
  ProxyPreserveHost on

   &lt;Proxy *&gt;
      Order deny,allow
      Allow from all
   &lt;/Proxy&gt;

  SSLEngine on
  SSLCertificateFile /etc/ssl/apache2/server.cert
  SSLCertificateKeyFile /etc/ssl/apache2/server.key
&lt;/VirtualHost&gt;</pre></div></div>
<p>If you want to restrict Gitlab to ssl for enhanced security, add this to the plain http section of your vhost configuration and remove the proxy/rewrite lines:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><pre>RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}</pre></div></div></p>
<p>You are almots ready to use Gitlab!</p>
<p>Start gitlab service and add it to the default runlevel. Also start or reload Apache:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ eselect rc start gitlab
$ eselect rc add gitlab default
$ eselect rc reload apache2</code></div></div></p>
<p>Now open your browser and visit your new Gitlab installation.<br />
Your credentials are <strong>admin@local.host / 5iveL!fe</strong>.<br />
Congratulations!</p>
<p>I hope everything went ok and you can start using Gitlab right away.</p>
<p>Remember, Gitlab updates on 22th every month. To upgrade your installation visit <a href="https://github.com/gitlabhq/gitlabhq/wiki" target="_blank">Gitlab&#8217;s wiki</a> and follow their instructions.</p>
<h2>Update: Gitlab on a rolling distribution</h2>
<p>When you install gems, you compile them for your system, tying them to your system&#8217;s libraries. As we know very well on Gentoo, sometimes an update to a library can brake a program that depends on it.<br />
Same goes for Gitlab, only, because we install it for a local user instead system wide, <strong>revdep-rebuild</strong> can&#8217;t detect the breakage automatically (but it will detect it for packages installed with gem system wide at <em>/usr/local</em>).</p>
<p>Let&#8217;s try to fix this!</p>
<p><strong>Condition:</strong> After an <em>emerge -u</em> you find Gitlab stopped working.</p>
<p>First make sure that there are broken files, in <em>/usr/local</em> and/or in <em>/home/gitlab</em>:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ revdep-rebuild
$ SEARCH_DIRS="/home/gitlab/" revdep-rebuild</code></div></div></p>
<p>If <strong>charlock_holmes</strong> or a system wide gem is broken, reinstall it:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ gem install BROKEN_SYSTEM_WIDE_GEM
$ sudo -u gitlab -H gem install charlock_holmes</code></div></div></p>
<p>If another user gem is broken, it is part of bundle. We have to remove bundle&#8217;s files, to force a rebuild in the next command:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ rm -rf /home/gitlab/gitlab/vendor/bundle</code></div></div></p>
<p>Last, create a fresh bundle for Gitlab.<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ cd /home/gitlab/gitlab/
$ sudo -u gitlab -H bundle install  --deployment --without development test postgres</code></div></div></p>
<p>That&#8217;s it. Now your Gitlab should once again work fine.<br />
A final note; Gitlab may be the UI/Wiki/Emailer etc but it is not your git server. So while you try to fix Gitlab, your repositories still work fine.</p>
<div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://www.andmarios.com/en/2012/06/gitlab-on-an-ubuntu-10-04-server-with-apache/' rel='bookmark' title='GitLab on an Ubuntu 10.04 server with Apache'>GitLab on an Ubuntu 10.04 server with Apache</a></li>
<li><a href='http://www.andmarios.com/en/2009/10/musearch-per-ebuild-use-flag-descriptions-on-your-terminal/' rel='bookmark' title='musearch: per ebuild USE flag descriptions on your terminal'>musearch: per ebuild USE flag descriptions on your terminal</a></li>
<li><a href='http://www.andmarios.com/en/2010/02/new-theme-new-404-page-new-server-and-zero-ads/' rel='bookmark' title='New theme, new 404 page, new server and zero ads!'>New theme, new 404 page, new server and zero ads!</a></li>
</ol></p>
</div>
<img src="http://feeds.feedburner.com/~r/andmarios/SGQr/~4/hwELsMZ0jpw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.andmarios.com/en/2012/12/gitlab-40-on-a-gentoo-server-amd64-hardened-w-apache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.andmarios.com/en/2012/12/gitlab-40-on-a-gentoo-server-amd64-hardened-w-apache/</feedburner:origLink></item>
		<item>
		<title>GitLab on an Ubuntu 10.04 server with Apache</title>
		<link>http://feedproxy.google.com/~r/andmarios/SGQr/~3/wnvWUDzyyio/</link>
		<comments>http://www.andmarios.com/en/2012/06/gitlab-on-an-ubuntu-10-04-server-with-apache/#comments</comments>
		<pubDate>Sat, 23 Jun 2012 23:08:34 +0000</pubDate>
		<dc:creator>Marios</dc:creator>
				<category><![CDATA[Όλα τα Άρθρα]]></category>
		<category><![CDATA[Linux και Ανοιχτό Λογισμικό]]></category>
		<category><![CDATA[Τεχνολογία]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[gitlab]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.andmarios.com/?p=987</guid>
		<description><![CDATA[ecently I saw the light, or something very bright at least, and decided it is time to use a central git repository to store my personal projects which span across many categories (code, documentation, translations, scripts, etc). Alas, as it usually is the case when you decide to change your workflow, you have to give [...]]]></description>
				<content:encoded><![CDATA[<p><span class='et-dropcap'>R</span>ecently I saw the light, or something very bright at least, and decided it is time to use a central git repository to store my personal projects which span across many categories (code, documentation, translations, scripts, etc). Alas, as it usually is the case when you decide to change your workflow, you have to give it a bit more thought.</p>
<p>The thing about <em>personal</em> projects, is that there are too many of them and none has a known or at least certain development timeline. I may work on my backup script (<a href="http://www.andmarios.com/2012/06/yet-another-backup-script-mrbstudio/" target="_blank">mrbStudio</a>) today and touch it again after two years, when I&#8217;ll need a new feature. Thus, the need for project management: documentation, issues, code snippets, etc. Anything that can help me get on track with a project I abandoned for some months -or more.</p>
<p>The simple (and probably correct) way would be to use a flat file policy, just add a README, ISSUES etc text file in the project&#8217;s directory. But I thought a dedicated solution could be better at this, making my workflow more efficient. It would make my projects index better looking too.</p>
<p>I checked some open source project management solutions, like <a href="http://www.redmine.org/" target="_blank">Redmine</a> and its fork, the <a href="https://www.chiliproject.org/" target="_blank">ChiliProject</a>, as well as <a href="http://www.indefero.net/" target="_blank">indefero</a> and others, but decided that for what would mostly be personal use, <a href="http://gitlabhq.com/" target="_blank">GitLab</a> is the best choice out there.</p>
<p><a href="http://gitlabhq.com/" target="_blank">GitLab</a> is essentially a personal GitHub. You set up git and gitolite, and then GitLab sits on top of that, managing gitolite (users, projects, ssh keys), giving you a nice web interface and providing you some extra features, like wiki pages, a wall, issues management and others. It even recognizes and formats documents written in markdown (like the README.md files you see on GitHub) which is great for documentation writing.</p>
<h1>To the code!</h1>
<p>GitLab has a very good installation documentation but in order to keep it simple, the writers describe the process of installing GitLab mostly on a <em>dedicated to GitLab</em> server.</p>
<p>I chose to install it on a normal Ubuntu 10.04 based webserver which hosts some domains and is using Apache. So I will show you how to set (and manage) GitLab for such a setup while maintaining your style.</p>
<p>Through this guide, no reboots nor Apache downtime will occur.</p>
<p><strong>Disclaimer:</strong> <em>To use this guide, you must have the super power of&#8230; thinking. If you want to just copy &#8211; paste, it will probably not work for you and certainly you shouldn&#8217;t perform administration tasks on a public server. At every step check the possible variables of each command and set them for your setup.</em></p>
<h2>1. Installing gitolite and GitLab</h2>
<p>The developers of GitLab did a great job writing their installation guide and do their best to keep it updated. So it would be foul of me to just copy paste their work.</p>
<p>Just head over their GitHub page and <a href="https://github.com/gitlabhq/gitlabhq/blob/v2.6.3/doc/installation.md" target="_blank">read their installation instructions</a> apart from the parts for the resque process and the web server (nginx, unicorn, init script) for the time being.</p>
<p>At the time of the writing of this article, GitLab is at version 2.6.0. You can find the installation instructions for the most recent stable release <a href="https://github.com/gitlabhq/gitlabhq/wiki" target="_blank">at the project&#8217;s wiki</a>.</p>
<h2>2. Deviating from the official guide for GitLab installation</h2>
<p>As good as the above guide may be, you may have to deviate a bit or perform additional steps. Here are some I can think of.</p>
<p><strong>Important:</strong> These steps would be better to be performed before you reach the <em>Setup DB</em> step of the official installation guide.</p>
<h3>2.1. Installing the latest version of Ruby</h3>
<p>The latest Ruby version for now is 1.9.3-p194, so you could use that instead of the 1.9.2-p290.<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p194.tar.gz
$ tar xzvf ruby-1.9.3-p194.tar.gz
$ cd ruby-1.9.3-p194
$ ./configure
$ make
$ sudo make install</code></div></div></p>
<h3>2.2. Configure gitlab.yml</h3>
<p>You should edit your <strong>gitlab/config/gitlab.yml</strong> to at least reflect your real host under the git_host section. This is useful because it sets how GitLab will show your project&#8217;s URIs. Also set anything else you think of use.</p>
<h3>2.3. If you use a custom ssh port</h3>
<p>Usually in public servers we don&#8217;t use the default ssh port (22) in order to avoid some of the automated attacks out there, targeting known ports.</p>
<p>If that&#8217;s your case, start by setting your ssh port in <strong>gitlab.yml</strong> under the git_host section.</p>
<p>Then create the file:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">/home/gitlab/gitlab/.ssh/config</code></div></div><br />
And set it like this (assuming your ssh port is 10001):<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">Host localhost
Port <em>100001</em></code></div></div></p>
<h3>2.4. Create a MySQL database if you need one</h3>
<p>GitLab&#8217;s installation guide doesn&#8217;t deal with that but you probably should know how to create a MySQL database and a user for it.</p>
<p>In case you don&#8217;t remember, you run MySQL:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ mysql -u root -p</code></div></div></p>
<p>In the MySQL prompt that will appear, you type (change any variable you may need, like *password*):<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">mysql&gt; create database <em>gitlabdb</em>;
mysql&gt; create user '<em>gitlab</em>'@'localhost' identified by '<em>password</em>';
mysql&gt; grant all privileges on <em>gitlabdb</em>.* to '<em>gitlab</em>'@'localhost' with grant option;
mysql&gt; exit;</code></div></div></p>
<p>Set your database credentials in <strong>gitlab/config/database.yml</strong></p>
<h2>3. Apache setup</h2>
<p><strong>Update:</strong> Originally this guide suggested to use Phusion Passenger to serve GitLab instead of Unicorn. Since then (yesterday that would be) I&#8217;ve found that Unicorn performs considerably faster and maybe consumes a bit less RAM. So we are going to use Unicorn.</p>
<h3>3.1. Configure Unicorn</h3>
<p>As the official installation guide instructs, create the unicorn configuration file:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo -u gitlab -H cp /home/gitlab/gitlab/config/unicorn.rb.orig /home/gitlab/gitlab/config/unicorn.rb</code></div></div></p>
<p>Now edit <strong>gitlab/config/unicorn.rb</strong> and add a listening port. Just uncomment the following line and set a custom port if you want:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">listen "127.0.0.1:8080"</code></div></div></p>
<h3>3.2. Enable and load needed Apache modules</h3>
<p>We need the proxy, proxy_balancer and proxy_http Apache modules. Enable them:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo a2enmod proxy proxy_balancer proxy_http</code></div></div></p>
<p>In order for Apache to load the new modules, it has to be restarted. This is the only restart of the Apache service we are going to need:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo /etc/init.d/apache2 restart</code></div></div></p>
<h3>3.3. Create a virtualhost for GitLab</h3>
<p>Create a configuration file for GitLab&#8217;s virtualhost:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">/etc/apache2/sites-available/gitlab.myserver.conf</code></div></div></p>
<p>Insert the lines below (adjusted accordingly) to your GitLab site&#8217;s configuration file (the one we created). If you don&#8217;t need a ssl section, remove it. If you want to keep it, I assume you know where your ssl certificates are. Notice that the SSL virtualhost needs a specific IP instead of generic. Also if you set a custom port for Unicorn, do not forget to set it at the <em>BalanceMember</em> line.<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><pre>&lt;VirtualHost *:80&gt;
  ServerName gitlab.myserver.com
  ServerAlias www.gitlab.myserver.com
  DocumentRoot /home/gitlab/gitlab/public
  ErrorLog /var/log/apache2/gitlab.myserver.com_error_log
  CustomLog /var/log/apache2/gitlab.myserver.com_access_log combined

  &lt;Proxy balancer://unicornservers&gt;
      BalancerMember http://127.0.0.1:8080
  &lt;/Proxy&gt;

  &lt;Directory /home/gitlab/gitlab/public&gt;
    AllowOverride All
    Options -MultiViews
  &lt;/Directory&gt;

  RewriteEngine on
  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
  RewriteRule ^/(.*)$ balancer://unicornservers%{REQUEST_URI} [P,QSA,L]

  ProxyPass /uploads !
  ProxyPass / balancer://unicornservers/
  ProxyPassReverse / balancer://unicornservers/
  ProxyPreserveHost on

   &lt;Proxy *&gt;
      Order deny,allow
      Allow from all
   &lt;/Proxy&gt;
&lt;/VirtualHost&gt;

&lt;VirtualHost <em>MY_IP</em>:443&gt;
  ServerName gitlab.myserver.com
  ServerAlias www.gitlab.myserver.com
  DocumentRoot /home/gitlab/gitlab/public
  ErrorLog /var/log/apache2/gitlab.myserver.com_error_log
  CustomLog /var/log/apache2/gitlab.myserver.com_access_log combined

  &lt;Proxy balancer://unicornservers&gt;
      BalancerMember http://127.0.0.1:8080
      Header add X-Forwarded-Proto "https"
  &lt;/Proxy&gt;

  &lt;Directory /home/gitlab/gitlab/public&gt;
    AllowOverride All
    Options -MultiViews
  &lt;/Directory&gt;

  RewriteEngine on
  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
  RewriteRule ^/(.*)$ balancer://unicornservers%{REQUEST_URI} [P,QSA,L]

  ProxyPass /uploads !
  ProxyPass / balancer://unicornservers/
  ProxyPassReverse / balancer://unicornservers/
  ProxyPreserveHost on

   &lt;Proxy *&gt;
      Order deny,allow
      Allow from all
   &lt;/Proxy&gt;

  SSLEngine on
  SSLCertificateFile /home/gitlab/gitlab/ssl.cert
  SSLCertificateKeyFile /home/gitlab/gitlab/ssl.key
&lt;/VirtualHost&gt;</pre></div></div></p>
<p>Enable your GitLab virtual host for Apache:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo a2ensite gitlab.myserver.conf</code></div></div></p>
<p>Reload Apache for your GitLab virtualhost to start:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo /etc/init.d/apache2 reload</code></div></div></p>
<p>While your GitLab virtual host is up now, it doesn&#8217;t work as GitLab hasn&#8217;t started yet. To the next section!</p>
<h2>4. GitLab Unicorn and Resque init script</h2>
<p>This part is almost identical to the official guide except the insserv directive which doesn&#8217;t work for Ubuntu.</p>
<p>Create the file:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">/etc/init.d/gitlab</code></div></div></p>
<p>Put these lines inside it. They are copied from the official installation guide, so check the official installation guide for possible updates.<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">#! /bin/bash
### BEGIN INIT INFO
# Provides: gitlab
# Required-Start: $local_fs $remote_fs $network $syslog redis-server
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: GitLab git repository management
# Description: GitLab git repository management
### END INIT INFO</p>
<p>DAEMON_OPTS="-c /home/gitlab/gitlab/config/unicorn.rb -E production -D"
NAME=unicorn
DESC="Gitlab service"
PID=/home/gitlab/gitlab/tmp/pids/unicorn.pid
RESQUE_PID=/home/gitlab/gitlab/tmp/pids/resque_worker.pid</p>
<p>case "$1" in
start)
CD_TO_APP_DIR="cd /home/gitlab/gitlab"
START_DAEMON_PROCESS="bundle exec unicorn_rails $DAEMON_OPTS"
START_RESQUE_PROCESS="./resque.sh"</p>
<p>echo -n "Starting $DESC: "
if [ `whoami` = root ]; then
sudo -u gitlab sh -l -c "$CD_TO_APP_DIR &gt; /dev/null 2&gt;&amp;1 &amp;&amp; $START_DAEMON_PROCESS &amp;&amp; $START_RESQUE_PROCESS"
else
$CD_TO_APP_DIR &gt; /dev/null 2&gt;&amp;1 &amp;&amp; $START_DAEMON_PROCESS &amp;&amp; $START_RESQUE_PROCESS
fi
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
kill -QUIT `cat $PID`
kill -QUIT `cat $RESQUE_PID`
echo "$NAME."
;;
restart)
echo -n "Restarting $DESC: "
kill -USR2 `cat $PID`
kill -USR2 `cat $RESQUE_PID`
echo "$NAME."
;;
reload)
echo -n "Reloading $DESC configuration: "
kill -HUP `cat $PID`
kill -HUP `cat $RESQUE_PID`
echo "$NAME."
;;
*)
echo "Usage: $NAME {start|stop|restart|reload}" &gt;&amp;2
exit 1
;;
esac</p>
<p>exit 0</code></div></div></p>
<p>Make the script executable:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo chmod +x /etc/init.d/gitlab</code></div></div></p>
<p>For this time only, start GitLab manually by invoking our init script:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo /etc/init.d/gitlab start</code></div></div></p>
<p>Set GitLab&#8217;s init script to start automatically upon boot:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo update-rc.d gitlab defaults</code></div></div></p>
<p><em>Note:</em> For the above script, I think the reload and restart commands won&#8217;t probably work. You don&#8217;t need them anyway, just do a start/stop when you need to.</p>
<p><strong>Congratulations!</strong> Your GitLab is up and running!</p>
<h2>5. Updating GitLab without interrupting the web server</h2>
<p>Since you are on a proper webserver, hosting more than one sites, you cannot afford downtime.</p>
<p>The official guide about upgrading GitLab goes like this (official way to <a href="https://github.com/gitlabhq/gitlabhq/wiki/From-2.5.0-to-2.6.0" target="_blank">upgrade from 2.5.0 to 2.6.0</a>).</p>
<p>For our setup, we can avoid Apache downtime and only have GitLab downtime which should be ok.</p>
<p>Just follow the commands below while adjusting for your setup if needed, they are easy to understand. They are the commands from the official upgrade guide but first we stop only the GitLab virtualhost and service, make the upgrade and restart them.</p>
<p><em><strong>Update: </strong></em><span style="color: #993300;"><span style="color: #000000;">While the commands below serve as a nice &#8220;update skeleton&#8221;, it would be sane to check gitlab&#8217;s documentation for version specific upgrade tasks. For example during the <a href="https://github.com/gitlabhq/gitlabhq/wiki/From-2.6.x-to-2.7.0" target="_blank">upgrade from 2.6.x to 2.7.0</a>, the <em>gitlab.yml </em>format changed, so on top of the commands below, you had to update this file.</span></span><br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><code class="prettyprint">$ sudo su # you just became root, be careful
$ a2dissite <em>gitlab.myserver.conf</em>
$ /etc/init.d/apache2 reload
$ /etc/init.d/gitlab stop
$ cd <em>/home/gitlab/gitlab</em>
$ sudo -u gitlab -H git pull origin stable
$ sudo -u gitlab -H bundle install --without development test
$ sudo -u gitlab -H bundle exec rake db:migrate RAILS_ENV=production
$ a2ensite <em>gitlab.myserver.conf</em>
$ /etc/init.d/apache2 reload
$ /etc/init.d/gitlab start</code></div></div></p>
<p>That&#8217;s all folks, hope I helped some of you.</p>
<div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://www.andmarios.com/en/2012/12/gitlab-40-on-a-gentoo-server-amd64-hardened-w-apache/' rel='bookmark' title='Gitlab 4.0 on a Gentoo server, ~amd64, hardened w/ Apache.'>Gitlab 4.0 on a Gentoo server, ~amd64, hardened w/ Apache.</a></li>
<li><a href='http://www.andmarios.com/en/2010/02/new-theme-new-404-page-new-server-and-zero-ads/' rel='bookmark' title='New theme, new 404 page, new server and zero ads!'>New theme, new 404 page, new server and zero ads!</a></li>
<li><a href='http://www.andmarios.com/en/2012/06/yet-another-backup-script-mrbstudio/' rel='bookmark' title='Yet Another Backup Script: mrbStudio'>Yet Another Backup Script: mrbStudio</a></li>
</ol></p>
</div>
<img src="http://feeds.feedburner.com/~r/andmarios/SGQr/~4/wnvWUDzyyio" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.andmarios.com/en/2012/06/gitlab-on-an-ubuntu-10-04-server-with-apache/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		<feedburner:origLink>http://www.andmarios.com/en/2012/06/gitlab-on-an-ubuntu-10-04-server-with-apache/</feedburner:origLink></item>
		<item>
		<title>Yet Another Backup Script: mrbStudio</title>
		<link>http://feedproxy.google.com/~r/andmarios/SGQr/~3/qNUNbQ1ulfs/</link>
		<comments>http://www.andmarios.com/en/2012/06/yet-another-backup-script-mrbstudio/#comments</comments>
		<pubDate>Wed, 13 Jun 2012 19:43:53 +0000</pubDate>
		<dc:creator>Marios</dc:creator>
				<category><![CDATA[Όλα τα Άρθρα]]></category>
		<category><![CDATA[Επιλεγμένα Άρθρα]]></category>
		<category><![CDATA[Aρχεία]]></category>
		<category><![CDATA[Linux και Ανοιχτό Λογισμικό]]></category>
		<category><![CDATA[Προγραμματισμός]]></category>
		<category><![CDATA[Τεχνολογία]]></category>
		<category><![CDATA[btrfs]]></category>
		<category><![CDATA[hard links]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[snapshots]]></category>
		<category><![CDATA[versioned backups]]></category>

		<guid isPermaLink="false">http://www.andmarios.com/?p=961</guid>
		<description><![CDATA[ome years ago I decided that I needed backups. Our systems are more fragile than we tend to think; hardware break downs, hard disks failures, laptop thefts, accidents, software malfunctions or user errors can strip us of our precious data. By data I mean both things we can&#8217;t afford to lose (like your work files [...]]]></description>
				<content:encoded><![CDATA[<p><span class='et-dropcap'>S</span>ome years ago I decided that I needed backups. Our systems are more fragile than we tend to think; hardware break downs, hard disks failures, laptop thefts, accidents, software malfunctions or user errors can strip us of our precious data. By data I mean both things we can&#8217;t afford to lose (like your work files or photographs) or things it would take a great amount of time to replace (like your OS installation along with a ton of custom settings).</p>
<p>I tried to think of a backup policy that would work for me, an advanced user. I knew I wanted something that would be easy to access, like a copy of an original directory and maybe versions, so I can return my files to a point in time. After that I searched the net for tested policies and solutions on the matter. What I liked best was rsync (which I already used for simple backups) and hard links. I think this <a href="http://www.mikerubel.org/computers/rsync_snapshots/" target="_blank">guide</a> was the one that grabbed my attention. I didn&#8217;t use the script which it includes, but I learnt all about hard links and how to use them to reserve space.</p>
<p>After that I proceeded to write my own script, mrbStudio, which I use since then for my backups and that have saved my ass more than a few times.</p>
<p>What it does? It copies the directory you want to backup to a backup directory, while preserving any special information you may need (file attributes, ownerships, links, devices, etc). Only the first time though it copies the whole directory. Next time, it uses the most recent backup as a starting point (hard-linking to it or snapshotting if you use btrfs) and copies only the files that have changed since. This saves time and space. It could save more space if something like rdiff was used but that would make my backups inaccessible through easy means. <strong>I want my backups accessible, that is a priority.</strong></p>
<p>I won&#8217;t go in much detail. Since mrbStudio helped me many times and became part of my system maintenance routine, I thought I should share it. Cleaning, restructuring the code and adding documentation for this task, also helped me make it better.</p>
<p>Its features:</p>
<ul>
<li> <strong>Versioned backups</strong> of <strong>local</strong> and <strong>remote filesystems</strong> (through ssh) to a local filesystem.</li>
<li> Easy to run once you create your configuration files, no need to postpone your backups again.</li>
<li> <strong>Hard links</strong> <strong>or</strong> <strong>btrfs snapshots</strong> are used for backup versions in order to save time and space.</li>
<li> Easy way to <strong>exclude files from backups</strong>.</li>
<li> Automatic <strong>mount</strong>ing of <strong>local</strong> and/or <strong>remote filesystems</strong> if needed.</li>
<li> Backups are exact copies of the original directories, no special software needed to access them, only a shell.</li>
<li> Script is compact and easy to modify. You need an extra feature? You can implement it fast.</li>
</ul>
<p>Running it is easy. First you have to create a configuration file. Let&#8217;s say you want to backup your home to /media/backups/. Create a <em>home.mrbStudio </em>text file like this:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><pre>source="/home/<em>USER</em>"
destination_parent="/media/backups/"
prefix="My.home"</pre>
<pre>EXCLUDE_START
/torrents/*
.gvfs
cache-*
socket-*
tmp-*
.kde/share/apps/nepomuk/*
EXCLUDE_STOP</pre></div></div></p>
<p>Now call mrbStudio with the above file as parameter:<br />
<div class='et-box et-shadow'>
					<div class='et-box-content'><pre>$ mrbStudio home.mrbStudio</pre></div></div></p>
<p>That&#8217;s it, congratulations, your first backup is ready. Next one will take less time (and space).</p>
<p>You will understand it much better once you take a look at the examples that come with the script.</p>
<p>You can find the latest version at github: <a href="https://github.com/andmarios/mrbStudio" target="_blank">https://github.com/andmarios/mrbStudio</a></p>
<h4>Extra tip!</h4>
<p>Btrfs is almost mainstream these days and performs so well that I use it for my rootfs and for one of my backup disks. A cool feature of btrfs is subvolumes, which you can mount as partitions. Getting what am I going to say? I just installed grub in a small partition on my usb hard disk I use for backups and now, by editing just two files (fstab and grub.conf), I can boot into my backups through usb! How cool is that?</p>
<p>I get my main system (a laptop) stolen? I find a replacement system, I edit two lines of two files on my usb disk and I can boot into my system and continue my work like nothing happened. When I find the time I can make the system more permanent, like copy it to the internal disk of the new system.</p>
<div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://www.andmarios.com/en/2009/10/musearch-per-ebuild-use-flag-descriptions-on-your-terminal/' rel='bookmark' title='musearch: per ebuild USE flag descriptions on your terminal'>musearch: per ebuild USE flag descriptions on your terminal</a></li>
<li><a href='http://www.andmarios.com/en/2012/06/gitlab-on-an-ubuntu-10-04-server-with-apache/' rel='bookmark' title='GitLab on an Ubuntu 10.04 server with Apache'>GitLab on an Ubuntu 10.04 server with Apache</a></li>
<li><a href='http://www.andmarios.com/en/2010/03/wallpaper-kde-permanent-type/' rel='bookmark' title='Wallpaper: KDE &#8211; permanent type'>Wallpaper: KDE &#8211; permanent type</a></li>
</ol></p>
</div>
<img src="http://feeds.feedburner.com/~r/andmarios/SGQr/~4/qNUNbQ1ulfs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.andmarios.com/en/2012/06/yet-another-backup-script-mrbstudio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.andmarios.com/en/2012/06/yet-another-backup-script-mrbstudio/</feedburner:origLink></item>
		<item>
		<title>adversities: dog day</title>
		<link>http://feedproxy.google.com/~r/andmarios/SGQr/~3/V48MQBz6ScA/</link>
		<comments>http://www.andmarios.com/en/2011/10/adversities-dog-day/#comments</comments>
		<pubDate>Mon, 10 Oct 2011 11:20:42 +0000</pubDate>
		<dc:creator>Marios</dc:creator>
				<category><![CDATA[Όλα τα Άρθρα]]></category>
		<category><![CDATA[Καλλιτεχνικές Ανησυχίες]]></category>
		<category><![CDATA[Επιλεγμένα Άρθρα]]></category>
		<category><![CDATA[Φωτογραφία & Τέχνη]]></category>

		<guid isPermaLink="false">http://www.andmarios.com/?p=883</guid>
		<description><![CDATA[esterday afternoon I took my camera with my favorite -and only prime- lens, the EF 50mm f/1.8, to exploit the rare light of the upcoming storm. The weather conditions were difficult and the beach isn&#8217;t a good place to be with an entry level camera when heavy wind duels around you. I was hoping for [...]]]></description>
				<content:encoded><![CDATA[<p><span class='et-dropcap'>Y</span>esterday afternoon I took my camera with my favorite -and only prime- lens, the EF 50mm f/1.8, to exploit the rare light of the upcoming storm.</p>
<p>The weather conditions were difficult and the beach isn&#8217;t a good place to be with an entry level camera when heavy wind duels around you.</p>
<p>I was hoping for a good static shot, when suddenly I saw this black dog heading into my frame. I shot immediately without thinking and the shutter clicked at the right moment.</p>
<p>Definitely one of my favorite photographs. Click to enlarge.</p>

<a href="http://www.andmarios.com/wp/gallery/artistic-temperaments/dog_day.jpg" title=""  >
	<img class="ngg-singlepic ngg-center" src="http://www.andmarios.com/wp/gallery/cache/79__400x300_dog_day.jpg" alt="Adversities - Dog Day" title="Adversities - Dog Day" />
</a>

<div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://www.andmarios.com/en/2010/11/old-photo-new-post-processing/' rel='bookmark' title='old photo, new post processing'>old photo, new post processing</a></li>
<li><a href='http://www.andmarios.com/en/2011/09/before-instagram-and-a-bit-of-a-rant/' rel='bookmark' title='before instagram -and a bit of a rant'>before instagram -and a bit of a rant</a></li>
<li><a href='http://www.andmarios.com/en/2011/09/granny-hair/' rel='bookmark' title='Granny Hair'>Granny Hair</a></li>
</ol></p>
</div>
<img src="http://feeds.feedburner.com/~r/andmarios/SGQr/~4/V48MQBz6ScA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.andmarios.com/en/2011/10/adversities-dog-day/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.andmarios.com/en/2011/10/adversities-dog-day/</feedburner:origLink></item>
		<item>
		<title>before instagram -and a bit of a rant</title>
		<link>http://feedproxy.google.com/~r/andmarios/SGQr/~3/9sNKkMEV8pc/</link>
		<comments>http://www.andmarios.com/en/2011/09/before-instagram-and-a-bit-of-a-rant/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 17:25:08 +0000</pubDate>
		<dc:creator>Marios</dc:creator>
				<category><![CDATA[Όλα τα Άρθρα]]></category>
		<category><![CDATA[Καλλιτεχνικές Ανησυχίες]]></category>
		<category><![CDATA[Επιλεγμένα Άρθρα]]></category>
		<category><![CDATA[Φωτογραφία & Τέχνη]]></category>
		<category><![CDATA[Σκέψεις]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.andmarios.com/?p=801</guid>
		<description><![CDATA[hese days social networks&#8217; inhabitants can often be divided into pro-instagram and anti-instagram. The former usually don&#8217;t put much thought into it, they just post happily their photographs after a quick post-processing with instagram&#8217;s filters. The latter are either tired of the way more than we need and are able to follow through human measure instagram posts or can&#8217;t [...]]]></description>
				<content:encoded><![CDATA[<p><span class='et-dropcap'>T</span>hese days social networks&#8217; inhabitants can often be divided into pro-instagram and anti-instagram.</p>
<p>The former usually don&#8217;t put much thought into it, they just post happily their photographs after a quick post-processing with instagram&#8217;s filters. The latter are either tired of the <em>way more than we need and are able to follow through human measure</em> instagram posts or can&#8217;t put up with the fact that instagram processed photographs are often mistaken (a strong word, I know, a stronger one comes soon) for art and, as a further consequence, sometimes act as an excuse for pro-instagrammers to post complete and utter bullshit (I told you).</p>
<p>Let&#8217;s start with the easiest case to understand; when someone thinks of something as <em>art</em>, automatically drops any logical thresholds that may apply prior to sharing it on a social network. A bad photograph won&#8217;t get any better with instagram. You can&#8217;t filter out a bad shot. It is as simple as that.</p>
<p>The other case is when we have a photograph worthy to share on a social network but not in the form of art per se. There are many definitions for art and I wouldn&#8217;t dare to choose any single one to present as the norm. What I believe though to be a prerequisite for it, is a mix of self creativity -even in the form of imitation- and the investment of personal time. Instagram, in the common case, almost minimizes these two conditions to <em>null</em>. When prerequisites for art are minimized to such an extend, the result unavoidably becomes kitch and bothers.</p>
<p>Of course I have to admit that there are numerous talented people using instagram and the above doesn&#8217;t apply to them. Also there are people not that talented but with an understanding of which photo can be instagrammed and which should be uploaded to other photo-hosts without any effects applied. The problem is that the vast majority of instagram bombing we get daily, isn&#8217;t coming from them.</p>
<p>Below is an old post-processed photograph of mine. I shot it and edited it about 6 years before instagram was born. It may not qualify as art but I can assure you that a certain amount of time and thought was invested during both the scene composition and the edit process.</p>

<a href="http://www.andmarios.com/wp/gallery/artistic-temperaments/before-instagram.jpg" title="my watch, shot and edited almost 6 years before instagram"  >
	<img class="ngg-singlepic ngg-center" src="http://www.andmarios.com/wp/gallery/cache/77__400x300_before-instagram.jpg" alt="Filter Art (?)" title="Filter Art (?)" />
</a>

<p>&nbsp;</p>
<div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://www.andmarios.com/en/2011/09/granny-hair/' rel='bookmark' title='Granny Hair'>Granny Hair</a></li>
<li><a href='http://www.andmarios.com/en/2011/10/adversities-dog-day/' rel='bookmark' title='adversities: dog day'>adversities: dog day</a></li>
<li><a href='http://www.andmarios.com/en/2010/11/old-photo-new-post-processing/' rel='bookmark' title='old photo, new post processing'>old photo, new post processing</a></li>
</ol></p>
</div>
<img src="http://feeds.feedburner.com/~r/andmarios/SGQr/~4/9sNKkMEV8pc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.andmarios.com/en/2011/09/before-instagram-and-a-bit-of-a-rant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.andmarios.com/en/2011/09/before-instagram-and-a-bit-of-a-rant/</feedburner:origLink></item>
		<item>
		<title>Granny Hair</title>
		<link>http://feedproxy.google.com/~r/andmarios/SGQr/~3/cA-mUqvJ2aQ/</link>
		<comments>http://www.andmarios.com/en/2011/09/granny-hair/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 13:44:11 +0000</pubDate>
		<dc:creator>Marios</dc:creator>
				<category><![CDATA[Όλα τα Άρθρα]]></category>
		<category><![CDATA[Καλλιτεχνικές Ανησυχίες]]></category>
		<category><![CDATA[Επιλεγμένα Άρθρα]]></category>
		<category><![CDATA[Φωτογραφία & Τέχνη]]></category>

		<guid isPermaLink="false">http://www.andmarios.com/?p=791</guid>
		<description><![CDATA[he Greek phrase for cotton candy is granny hair. This photo was shot in June, at the old harbor of Chania, during a blackout. I like it because I see in it many values which would be nice to apply in our everyday life; family, hard work, respect of our past.]]></description>
				<content:encoded><![CDATA[<p><span class='et-dropcap'>T</span>he Greek phrase for cotton candy is <em>granny hair</em>. This photo was shot in June, at the old harbor of Chania, during a blackout. I like it because I see in it many values which would be nice to apply in our everyday life; family, hard work, respect of our past.</p>

<a href="http://www.andmarios.com/wp/gallery/artistic-temperaments/granny-hair-l.jpg" title=""  >
	<img class="ngg-singlepic ngg-center" src="http://www.andmarios.com/wp/gallery/cache/76__400x300_granny-hair-l.jpg" alt="Granny Hair" title="Granny Hair" />
</a>

<div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://www.andmarios.com/en/2011/09/before-instagram-and-a-bit-of-a-rant/' rel='bookmark' title='before instagram -and a bit of a rant'>before instagram -and a bit of a rant</a></li>
<li><a href='http://www.andmarios.com/en/2010/02/nespresso-art/' rel='bookmark' title='Nespresso Art'>Nespresso Art</a></li>
<li><a href='http://www.andmarios.com/en/2011/10/adversities-dog-day/' rel='bookmark' title='adversities: dog day'>adversities: dog day</a></li>
</ol></p>
</div>
<img src="http://feeds.feedburner.com/~r/andmarios/SGQr/~4/cA-mUqvJ2aQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.andmarios.com/en/2011/09/granny-hair/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.andmarios.com/en/2011/09/granny-hair/</feedburner:origLink></item>
		<item>
		<title>What is your favorite…</title>
		<link>http://feedproxy.google.com/~r/andmarios/SGQr/~3/UW4vSHXqkJA/</link>
		<comments>http://www.andmarios.com/en/2011/09/what-is-your-favorite/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 20:55:29 +0000</pubDate>
		<dc:creator>Marios</dc:creator>
				<category><![CDATA[Όλα τα Άρθρα]]></category>
		<category><![CDATA[Επιλεγμένα Άρθρα]]></category>
		<category><![CDATA[Σκέψεις]]></category>
		<category><![CDATA[Κείμενα]]></category>

		<guid isPermaLink="false">http://www.andmarios.com/?p=779</guid>
		<description><![CDATA[Sorry, this entry is only available in Ελληνικά.]]></description>
				<content:encoded><![CDATA[<p>Sorry, this entry is only available in <a href="http://www.andmarios.com/el/feed/">Ελληνικά</a>.</p>
<div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://www.andmarios.com/en/2009/10/opening-act/' rel='bookmark' title='Opening Act'>Opening Act</a></li>
<li><a href='http://www.andmarios.com/en/2010/02/frontaccounting-erp-are-you-interested-in-a-greek-translation/' rel='bookmark' title='FrontAccounting ERP, are you interested in a Greek Translation?'>FrontAccounting ERP, are you interested in a Greek Translation?</a></li>
<li><a href='http://www.andmarios.com/en/2011/10/adversities-dog-day/' rel='bookmark' title='adversities: dog day'>adversities: dog day</a></li>
</ol></p>
</div>
<img src="http://feeds.feedburner.com/~r/andmarios/SGQr/~4/UW4vSHXqkJA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.andmarios.com/en/2011/09/what-is-your-favorite/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.andmarios.com/en/2011/09/what-is-your-favorite/</feedburner:origLink></item>
		<item>
		<title>how to choose who to follow on twitter</title>
		<link>http://feedproxy.google.com/~r/andmarios/SGQr/~3/hUHo23QyfGs/</link>
		<comments>http://www.andmarios.com/en/2011/08/how-to-choose-who-to-follow-on-twitter/#comments</comments>
		<pubDate>Tue, 23 Aug 2011 19:02:04 +0000</pubDate>
		<dc:creator>Marios</dc:creator>
				<category><![CDATA[Όλα τα Άρθρα]]></category>
		<category><![CDATA[Επιλεγμένα Άρθρα]]></category>
		<category><![CDATA[Χιουμοριστικά]]></category>
		<category><![CDATA[algorithm]]></category>
		<category><![CDATA[follow]]></category>
		<category><![CDATA[funny]]></category>
		<category><![CDATA[illustrated]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.andmarios.com/?p=553</guid>
		<description><![CDATA[ou are a heterosexual male. Your EQ (emotional quotient) isn&#8217;t something to brag about and most probably you wouldn&#8217;t want to brag about it anyway. But here comes the difficult time of having to decide who to follow on twitter. Fear not my hairy friend. The illustrated algorithm below, which I devised upon whole minutes [...]]]></description>
				<content:encoded><![CDATA[<p><span class='et-dropcap'>Y</span>ou are a heterosexual male. Your EQ (emotional quotient) isn&#8217;t something to brag about and most probably you wouldn&#8217;t want to brag about it anyway.</p>
<p>But here comes the difficult time of having to decide who to follow on twitter. Fear not my hairy friend. The illustrated algorithm below, which I devised upon whole minutes of research (but they seemed like ages mind you), can be your safe guide to choosing followers. It covers only 99% of cases but I had to keep it short, because I respect your short attention span and that&#8217;s the kind of man I am.</p>
<p>Without any further delay, I present you the algorithm of <em>how to choose who to follow on twitter [for heterosexual males]</em>.</p>
<p>Right click, open link in new tab to enjoy in full size. <img src='http://png.andmarios.com/wp/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

<a href="http://www.andmarios.com/wp/gallery/comics/htcwtfot.png" title=""  >
	<img class="ngg-singlepic ngg-center" src="http://www.andmarios.com/wp/gallery/cache/73__500x500_htcwtfot.png" alt="how to choose who to follow on twitter" title="how to choose who to follow on twitter" />
</a>

<p><em>As long as the copyright notice remains visible in the image, feel free to use it for your own dirty purposes.</em></p>
<div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://www.andmarios.com/en/2011/03/porn-vs-war/' rel='bookmark' title='Porn vs War'>Porn vs War</a></li>
<li><a href='http://www.andmarios.com/en/2011/09/before-instagram-and-a-bit-of-a-rant/' rel='bookmark' title='before instagram -and a bit of a rant'>before instagram -and a bit of a rant</a></li>
<li><a href='http://www.andmarios.com/en/2009/11/fraud-art-the-void-towards-knowledge-in-the-dusk-of-the-industrial-era/' rel='bookmark' title='Fraud Art: The void towards knowledge in the dusk of the industrial era'>Fraud Art: The void towards knowledge in the dusk of the industrial era</a></li>
</ol></p>
</div>
<img src="http://feeds.feedburner.com/~r/andmarios/SGQr/~4/hUHo23QyfGs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.andmarios.com/en/2011/08/how-to-choose-who-to-follow-on-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.andmarios.com/en/2011/08/how-to-choose-who-to-follow-on-twitter/</feedburner:origLink></item>
		<item>
		<title>Porn vs War</title>
		<link>http://feedproxy.google.com/~r/andmarios/SGQr/~3/mj97HJN-P2o/</link>
		<comments>http://www.andmarios.com/en/2011/03/porn-vs-war/#comments</comments>
		<pubDate>Fri, 04 Mar 2011 18:55:14 +0000</pubDate>
		<dc:creator>Marios</dc:creator>
				<category><![CDATA[Όλα τα Άρθρα]]></category>
		<category><![CDATA[Επιλεγμένα Άρθρα]]></category>
		<category><![CDATA[Χιουμοριστικά]]></category>
		<category><![CDATA[Κείμενα]]></category>
		<category><![CDATA[funny]]></category>
		<category><![CDATA[porn]]></category>
		<category><![CDATA[sex]]></category>
		<category><![CDATA[war]]></category>

		<guid isPermaLink="false">http://www.andmarios.com/?p=509</guid>
		<description><![CDATA[Warning #1: This post may change the image you have for me, but it shouldn&#8217;t. Humor, in all of its instances, is a sign of a healthy mind. Warning #2: If you aren&#8217;t comfortable reading about porn and despicable sex acts, please, do not read any further! ve given a fair amount of thought in [...]]]></description>
				<content:encoded><![CDATA[<p><em><span lang="en">Warning #1: This post may change the image you have for me, but it shouldn&#8217;t. Humor, in all of its instances, is a sign of a healthy mind.<br />
Warning #2: If you aren&#8217;t comfortable reading about porn and despicable sex acts, please, do not read any further!</span></em></p>
<p><span lang="en"><span class='et-dropcap'>I&#8217;</span>ve given a fair amount of thought in this post&#8217;s subject. What are the differences between war and porn, if any? Actually there are many. I won&#8217;t tire you with a long prologue, here are some of the differences I&#8217;ve found. If you can think of any more, post them!</span></p>
<ul>
<li><span lang="en">Warlords come and conquer. Porn stars conquer and cum.</span></li>
<li><span lang="en">In war they provide you with a gun. In porn you come with your own.</span></li>
<li><span lang="en">In porn the enemy helps you get a headshot.</span></li>
<li><span lang="en">You can make war in the dark.</span></li>
<li><span lang="en">In porn you try to look good in the camera. In war you don&#8217;t want to look good.</span></li>
<li><span lang="en">In war everyone hates assholes. In porn everyone licks them.</span></li>
<li><span lang="en">In war women are spared. In porn there is no mercy for them.</span></li>
<li><span lang="en">In the army you shave your face. In the porn industry your genitals.</span></li>
<li><span lang="en">In war privates doesn&#8217;t get much publicity. In porn it is all about privates.</span></li>
<li><span lang="en">In war the enemy tries to avoid your load. In porn she tries to swallow it.</span></li>
<li><span lang="en">In porn you can&#8217;t wait to stand in front of enemy&#8217;s canons.</span></li>
<li><span lang="en">In porn the other side easily turns their backs on you.</span></li>
<li><span lang="en">In porn your enemy may ask you to violate her human rights.</span></li>
<li><span lang="en">In porn pain can be an aphrodisiac.</span></li>
<li><span lang="en">In porn you don&#8217;t see many helmets.</span></li>
<li><span lang="en">In porn 2 vs 1 is fair.</span></li>
<li><span lang="en">In war impalement is used as capital punishment.</span></li>
<li><span lang="en">In war you don&#8217;t want many opened fronts.</span></li>
</ul>
<p><span lang="en">I may or may not update it in the future!</span></p>
<p>&nbsp;</p>
<p>PS. Since I feel good about this, here is a photo for your viewing pleasure.</p>

<a href="http://www.andmarios.com/wp/gallery/artistic-temperaments/dirty-freddo-brewing.jpg" title=""  >
	<img class="ngg-singlepic ngg-center" src="http://www.andmarios.com/wp/gallery/cache/75__400x300_dirty-freddo-brewing.jpg" alt="Dirty Freddo Brewing" title="Dirty Freddo Brewing" />
</a>

<p>&nbsp;</p>
<div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://www.andmarios.com/en/2011/08/how-to-choose-who-to-follow-on-twitter/' rel='bookmark' title='how to choose who to follow on twitter'>how to choose who to follow on twitter</a></li>
<li><a href='http://www.andmarios.com/en/2009/10/opening-act/' rel='bookmark' title='Opening Act'>Opening Act</a></li>
<li><a href='http://www.andmarios.com/en/2009/11/fraud-art-the-void-towards-knowledge-in-the-dusk-of-the-industrial-era/' rel='bookmark' title='Fraud Art: The void towards knowledge in the dusk of the industrial era'>Fraud Art: The void towards knowledge in the dusk of the industrial era</a></li>
</ol></p>
</div>
<img src="http://feeds.feedburner.com/~r/andmarios/SGQr/~4/mj97HJN-P2o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.andmarios.com/en/2011/03/porn-vs-war/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.andmarios.com/en/2011/03/porn-vs-war/</feedburner:origLink></item>
		<item>
		<title>old photo, new post processing</title>
		<link>http://feedproxy.google.com/~r/andmarios/SGQr/~3/t5WGP2p32Hw/</link>
		<comments>http://www.andmarios.com/en/2010/11/old-photo-new-post-processing/#comments</comments>
		<pubDate>Thu, 18 Nov 2010 17:45:33 +0000</pubDate>
		<dc:creator>Marios</dc:creator>
				<category><![CDATA[Όλα τα Άρθρα]]></category>
		<category><![CDATA[Καλλιτεχνικές Ανησυχίες]]></category>
		<category><![CDATA[Φωτογραφία & Τέχνη]]></category>
		<category><![CDATA[Canon G3]]></category>
		<category><![CDATA[dog]]></category>
		<category><![CDATA[post processing]]></category>
		<category><![CDATA[sad]]></category>

		<guid isPermaLink="false">http://www.andmarios.com/?p=490</guid>
		<description><![CDATA[oo much time has passed since my last published post -though my drafts keep piling. Today I want to share with you a photograph I took a long time ago, during a trip to Heraklion, Crete. I knew from the moment my finger started moving toward the shutter button that I would love this shot. [...]]]></description>
				<content:encoded><![CDATA[<p><span class='et-dropcap'>T</span>oo much time has passed since my last published post -though my drafts keep piling. Today I want to share with you a photograph I took a long time ago, during a trip to Heraklion, Crete.</p>
<p>I knew from the moment my finger started moving toward the shutter button that I would love this shot. For some reason though I never post processed it till yesterday. I usually do not post process my photos but this one was shot at harsh conditions and needed some &#8220;repairs&#8221;.  In the end my &#8220;repairs&#8221; were more creative than what I originally planned but I am satisfied with the result.</p>

<a href="http://www.andmarios.com/wp/gallery/artistic-temperaments/sad-dog.jpg" title=""  >
	<img class="ngg-singlepic ngg-center" src="http://www.andmarios.com/wp/gallery/cache/66__400x300_sad-dog.jpg" alt="Sad [melancholic] Dog" title="Sad [melancholic] Dog" />
</a>

<p style="text-align: center;"><em>Sad [melancholic] Dog</em>, click to enlarge</p>
<div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://www.andmarios.com/en/2011/10/adversities-dog-day/' rel='bookmark' title='adversities: dog day'>adversities: dog day</a></li>
<li><a href='http://www.andmarios.com/en/2011/09/before-instagram-and-a-bit-of-a-rant/' rel='bookmark' title='before instagram -and a bit of a rant'>before instagram -and a bit of a rant</a></li>
<li><a href='http://www.andmarios.com/en/2011/09/granny-hair/' rel='bookmark' title='Granny Hair'>Granny Hair</a></li>
</ol></p>
</div>
<img src="http://feeds.feedburner.com/~r/andmarios/SGQr/~4/t5WGP2p32Hw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.andmarios.com/en/2010/11/old-photo-new-post-processing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.andmarios.com/en/2010/11/old-photo-new-post-processing/</feedburner:origLink></item>
		<item>
		<title>Wallpaper: KDE – permanent type</title>
		<link>http://feedproxy.google.com/~r/andmarios/SGQr/~3/ekZA8_uxN-4/</link>
		<comments>http://www.andmarios.com/en/2010/03/wallpaper-kde-permanent-type/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 22:05:03 +0000</pubDate>
		<dc:creator>Marios</dc:creator>
				<category><![CDATA[Όλα τα Άρθρα]]></category>
		<category><![CDATA[Επιλεγμένα Άρθρα]]></category>
		<category><![CDATA[Aρχεία]]></category>
		<category><![CDATA[Linux και Ανοιχτό Λογισμικό]]></category>
		<category><![CDATA[Ταπετσαρίες]]></category>
		<category><![CDATA[Canon 500D]]></category>
		<category><![CDATA[EF 50mm f/1.8]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[wallpaper]]></category>

		<guid isPermaLink="false">http://www.andmarios.com/?p=448</guid>
		<description><![CDATA[his is the fourth and last wallpaper of the KDE wallpapers week. It is the less &#8220;clean&#8221; image in this series. I think that it doesn&#8217;t match up well with widgets but if you have a virtual desktop clean of plasmoids you will love it. It is so good it may even get you a [...]]]></description>
				<content:encoded><![CDATA[<p><span class='et-dropcap'>T</span>his is the fourth and last wallpaper of the KDE wallpapers week. It is the less &#8220;clean&#8221; image in this series. I think that it doesn&#8217;t match up well with widgets but if you have a virtual desktop clean of plasmoids you will love it. It is so good it may even get you a girlfriend! :p</p>
<p style="text-align: center;">
<a href="http://www.andmarios.com/wp/gallery/imagesForPosts/08_KDE-permanenttype-preview.jpg" title="a wallpaper for KDE lovers"  >
	<img class="ngg-singlepic ngg-center" src="http://www.andmarios.com/wp/gallery/cache/65__400x300_08_KDE-permanenttype-preview.jpg" alt="KDE - permanent type" title="KDE - permanent type" />
</a>
</p>
<ul>
<li>for 4:3 monitors
<ul>
<li><a href="http://www.andmarios.com/wp/wp-content/plugins/download-monitor/download.php?id=KDE+-+permanent+type+-+1600x1200.jpg" title="download KDE - permanent type - 1600x1200 ">KDE - permanent type - 1600x1200 </a></li>
</ul>
</li>
<li>for 5:4 monitors
<ul>
<li><a href="http://www.andmarios.com/wp/wp-content/plugins/download-monitor/download.php?id=KDE+-+permanent+type+-+1280x1024.jpg" title="download KDE - permanent type - 1280x1024 ">KDE - permanent type - 1280x1024 </a></li>
</ul>
</li>
<li>for 16:10 monitors
<ul>
<li><a href="http://www.andmarios.com/wp/wp-content/plugins/download-monitor/download.php?id=KDE+-+permanent+type+-+1280x800.jpg" title="download KDE - permanent type - 1280x800 ">KDE - permanent type - 1280x800 </a></li>
<li><a href="http://www.andmarios.com/wp/wp-content/plugins/download-monitor/download.php?id=KDE+-+permanent+type+-+1680x1050.jpg" title="download KDE - permanent type - 1680x1050 ">KDE - permanent type - 1680x1050 </a></li>
<li><a href="http://www.andmarios.com/wp/wp-content/plugins/download-monitor/download.php?id=KDE+-+permanent+type+-+1920x1200.jpg" title="download KDE - permanent type - 1920x1200 ">KDE - permanent type - 1920x1200 </a></li>
</ul>
</li>
<li>for 16:9 monitors
<ul>
<li><a href="http://www.andmarios.com/wp/wp-content/plugins/download-monitor/download.php?id=KDE+-+permanent+type+-+1920x1080.jpg" title="download KDE - permanent type - 1920x1080 ">KDE - permanent type - 1920x1080 </a></li>
</ul>
</li>
</ul>
<blockquote><p><a href="http://creativecommons.org/licenses/by-nc-sa/3.0/" rel="license"><img style="border-width: 0;" src="http://png.andmarios.com/wp/wp-content/uploads/somerights203.png" alt="Creative Commons License" /></a></p>
<p>KDE &#8211; permanent type by <a href="http://www.andmarios.com" rel="cc:attributionURL">Marios Andreopoulos</a> is licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/" rel="license">Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License</a>.</p>
<p>Permissions beyond the scope of this license may be available at <a href="http://www.andmarios.com/lang/en/contact/" rel="cc:morePermissions">http://www.andmarios.com/lang/en/contact/</a>.</p>
<p>KDE and the KDE logo are trademarks of KDE e.V.</p></blockquote>
<div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://www.andmarios.com/en/2010/03/wallpaper-kde-logo-textured/' rel='bookmark' title='Wallpaper: KDE logo textured'>Wallpaper: KDE logo textured</a></li>
<li><a href='http://www.andmarios.com/en/2010/03/wallpaper-powered-by-kde-plain/' rel='bookmark' title='Wallpaper: powered by KDE &#8211; plain'>Wallpaper: powered by KDE &#8211; plain</a></li>
<li><a href='http://www.andmarios.com/en/2010/03/wallpaper-powered-by-kde/' rel='bookmark' title='Wallpaper: powered by KDE'>Wallpaper: powered by KDE</a></li>
</ol></p>
</div>
<img src="http://feeds.feedburner.com/~r/andmarios/SGQr/~4/ekZA8_uxN-4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.andmarios.com/en/2010/03/wallpaper-kde-permanent-type/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.andmarios.com/en/2010/03/wallpaper-kde-permanent-type/</feedburner:origLink></item>
	</channel>
</rss><!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced
Database Caching 48/161 queries in 0.023 seconds using disk
Object Caching 4872/4939 objects using disk
Content Delivery Network via jpg.andmarios.com

 Served from: www.andmarios.com @ 2013-05-24 11:38:55 by W3 Total Cache -->
