From 1501da4d18e9ade1b612955c4b07409c15f8fbd7 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Thu, 26 Jun 2014 18:48:13 +0200 Subject: [PATCH] Redesign for Github Pages --- _config.yml | 14 + _includes/about.html | 20 + _includes/blog-post-list.html | 29 + _includes/disqus.html | 14 + _includes/head.html | 14 + _includes/header.html | 44 ++ _includes/pagination.html | 17 + _layouts/default.html | 43 ++ _layouts/page.html | 14 + _layouts/post.html | 36 + _layouts/posts_by_tag.html | 13 + _make_tags.sh | 31 + .../2011-05-12-ethical-hacking-2011.markdown | 29 + ...ed-desktop-with-gnome-3-round-one.markdown | 88 +++ ...2011-05-13-zabbix-performance-tip.markdown | 35 + ...ed-desktop-with-gnome-3-round-two.markdown | 29 + ...rver-vs-debian-5-0-upgrade-to-6-0.markdown | 41 + ...se-incompatible-with-oracle-linux.markdown | 25 + ...es-with-mod-proxy-and-mod-rewrite.markdown | 30 + _posts/2011-09-18-inverse-of-sort.markdown | 30 + ...our-software-with-production-data.markdown | 16 + _posts/2012-03-20-php-5-4-released.markdown | 29 + ...012-03-27-fast-world-fast-updates.markdown | 34 + _posts/2012-06-14-wordpress-madness.markdown | 28 + ...d-on-red-hat-enterprise-linux-6-2.markdown | 28 + ...quiring-a-reboot-on-linux-at-last.markdown | 35 + ...hts-about-that-dead-linux-desktop.markdown | 80 ++ ...to-start-becoming-a-web-developer.markdown | 76 ++ ...10-do-not-track-in-ie10-vs-apache.markdown | 19 + ...th-your-roles-coming-from-the-orm.markdown | 78 ++ ...12-10-07-smsgateway-and-smssender.markdown | 25 + ...ession-cookie-s-name-in-symfony-2.markdown | 26 + ...ation-array-of-associative-arrays.markdown | 56 ++ ...5-development-man-pages-on-fedora.markdown | 14 + ...n-enum-type-in-glib-s-type-system.markdown | 99 +++ .../2013-01-14-git-rm-cached-madness.markdown | 17 + ...s-with-status-code-2-on-fedora-18.markdown | 52 ++ ...rce-busy-after-enabling-multipath.markdown | 32 + ...on-based-routing-in-symfony-today.markdown | 27 + ...013-03-01-programming-as-i-see-it.markdown | 67 ++ ...ve-directory-password-via-kpasswd.markdown | 38 + _posts/2013-03-05-haversine-in-mysql.markdown | 26 + _posts/2013-03-13-dvorak-and-me.markdown | 28 + ...04-09-renaming-a-symfony-2-bundle.markdown | 28 + ...in-fedora-18-with-selinux-enabled.markdown | 111 +++ ...2013-09-16-swe-glib-final-release.markdown | 30 + ...rom-symfony-to-django-in-two-days.markdown | 25 + ...05-first-impressions-of-windows-8.markdown | 29 + ...te-tracking-branches-side-by-side.markdown | 64 ++ ...m-type-in-glib-glib-mkenums-magic.markdown | 148 ++++ _posts/2014-09-17-nyanmacs.markdown | 16 + ...ng-numbers-to-n-decimals-in-emacs.markdown | 43 ++ ...ect-to-find-the-first-good-commit.markdown | 51 ++ about.html | 6 + blog/index.html | 26 + blog/tag/active-directory.html | 4 + blog/tag/apache.html | 4 + blog/tag/astrology.html | 4 + blog/tag/c.html | 4 + blog/tag/citrix-xenserver.html | 4 + blog/tag/command-line.html | 4 + blog/tag/conference.html | 4 + blog/tag/debian.html | 4 + blog/tag/development.html | 4 + blog/tag/django.html | 4 + blog/tag/emacs.html | 4 + blog/tag/fedora.html | 4 + blog/tag/gentoo.html | 4 + blog/tag/git.html | 4 + blog/tag/glib.html | 4 + blog/tag/gnome3.html | 4 + blog/tag/heartbeat-cluster.html | 4 + blog/tag/kerberos.html | 4 + blog/tag/linux.html | 4 + blog/tag/monitoring.html | 4 + blog/tag/mysql.html | 4 + blog/tag/oracle.html | 4 + blog/tag/otrs.html | 4 + blog/tag/php.html | 4 + blog/tag/ranting.html | 4 + blog/tag/red-hat.html | 4 + blog/tag/selinux.html | 4 + blog/tag/ssh.html | 4 + blog/tag/symfony.html | 4 + blog/tag/technology.html | 4 + blog/tag/testing.html | 4 + blog/tag/windows.html | 4 + blog/tag/wordpress.html | 4 + blog/tag/zabbix.html | 4 + css/blog.css | 26 + css/code.css | 45 ++ css/front.css | 248 ++++++ css/resume.css | 51 ++ css/style.sass | 310 ++++++++ css/templatemo_style.css | 729 ++++++++++++++++++ disclaimer/index.md | 20 + export.php | 62 ++ favicon.ico | Bin 0 -> 1150 bytes feed.xml | 20 + images/close.png | Bin 0 -> 1158 bytes images/contact/deviantart_16.png | Bin 0 -> 660 bytes images/contact/email_16.png | Bin 0 -> 608 bytes images/contact/facebook_16.png | Bin 0 -> 502 bytes images/contact/google_plus_16.png | Bin 0 -> 529 bytes images/contact/googletalk_16.png | Bin 0 -> 867 bytes images/contact/linkedin_16.png | Bin 0 -> 714 bytes images/contact/rss_16.png | Bin 0 -> 711 bytes images/contact/skype_16.png | Bin 0 -> 801 bytes images/contact/tumblr_16.png | Bin 0 -> 748 bytes images/contact/twitter_16.png | Bin 0 -> 684 bytes images/deviantart_16.png | Bin 0 -> 660 bytes images/email.png | Bin 0 -> 317 bytes images/email_16.png | Bin 0 -> 608 bytes images/facebook_16.png | Bin 0 -> 502 bytes images/google_plus_16.png | Bin 0 -> 529 bytes images/googletalk_16.png | Bin 0 -> 867 bytes images/komodomedia_azure_16.png | Bin 0 -> 643 bytes images/linkedin_16.png | Bin 0 -> 714 bytes images/phone.png | Bin 0 -> 352 bytes images/profile.png | Bin 0 -> 7692 bytes images/profile.svg | 232 ++++++ images/rss_16.png | Bin 0 -> 711 bytes images/skype_16.png | Bin 0 -> 801 bytes images/tagcloud.png | Bin 0 -> 1387 bytes images/tumblr_16.png | Bin 0 -> 748 bytes images/twitter_16.png | Bin 0 -> 684 bytes index.html | 18 + resume/index.html | 245 ++++++ 128 files changed, 4245 insertions(+) create mode 100644 _config.yml create mode 100644 _includes/about.html create mode 100644 _includes/blog-post-list.html create mode 100644 _includes/disqus.html create mode 100644 _includes/head.html create mode 100644 _includes/header.html create mode 100644 _includes/pagination.html create mode 100644 _layouts/default.html create mode 100644 _layouts/page.html create mode 100644 _layouts/post.html create mode 100644 _layouts/posts_by_tag.html create mode 100644 _make_tags.sh create mode 100644 _posts/2011-05-12-ethical-hacking-2011.markdown create mode 100644 _posts/2011-05-12-gentoo-hardened-desktop-with-gnome-3-round-one.markdown create mode 100644 _posts/2011-05-13-zabbix-performance-tip.markdown create mode 100644 _posts/2011-05-18-gentoo-hardened-desktop-with-gnome-3-round-two.markdown create mode 100644 _posts/2011-05-27-citrix-xenserver-vs-debian-5-0-upgrade-to-6-0.markdown create mode 100644 _posts/2011-05-27-oracle-database-incompatible-with-oracle-linux.markdown create mode 100644 _posts/2011-06-10-proxy-only-non-existing-files-with-mod-proxy-and-mod-rewrite.markdown create mode 100644 _posts/2011-09-18-inverse-of-sort.markdown create mode 100644 _posts/2011-12-11-why-you-should-always-test-your-software-with-production-data.markdown create mode 100644 _posts/2012-03-20-php-5-4-released.markdown create mode 100644 _posts/2012-03-27-fast-world-fast-updates.markdown create mode 100644 _posts/2012-06-14-wordpress-madness.markdown create mode 100644 _posts/2012-06-18-ssh-login-failed-on-red-hat-enterprise-linux-6-2.markdown create mode 100644 _posts/2012-06-22-upgrades-requiring-a-reboot-on-linux-at-last.markdown create mode 100644 _posts/2012-09-05-some-thoughts-about-that-dead-linux-desktop.markdown create mode 100644 _posts/2012-09-07-how-to-start-becoming-a-web-developer.markdown create mode 100644 _posts/2012-09-10-do-not-track-in-ie10-vs-apache.markdown create mode 100644 _posts/2012-09-16-symfony-2-create-role-and-class-based-acls-with-your-roles-coming-from-the-orm.markdown create mode 100644 _posts/2012-10-07-smsgateway-and-smssender.markdown create mode 100644 _posts/2012-10-13-changing-the-session-cookie-s-name-in-symfony-2.markdown create mode 100644 _posts/2012-12-20-symfony-2-configuration-array-of-associative-arrays.markdown create mode 100644 _posts/2013-01-05-development-man-pages-on-fedora.markdown create mode 100644 _posts/2013-01-06-registering-an-enum-type-in-glib-s-type-system.markdown create mode 100644 _posts/2013-01-14-git-rm-cached-madness.markdown create mode 100644 _posts/2013-01-17-jms-diextrabundle-s-greppatternfinder-grep-exits-with-status-code-2-on-fedora-18.markdown create mode 100644 _posts/2013-02-19-mount-device-or-resource-busy-after-enabling-multipath.markdown create mode 100644 _posts/2013-02-27-why-i-stopped-using-annotation-based-routing-in-symfony-today.markdown create mode 100644 _posts/2013-03-01-programming-as-i-see-it.markdown create mode 100644 _posts/2013-03-05-fedora-can-t-change-active-directory-password-via-kpasswd.markdown create mode 100644 _posts/2013-03-05-haversine-in-mysql.markdown create mode 100644 _posts/2013-03-13-dvorak-and-me.markdown create mode 100644 _posts/2013-04-09-renaming-a-symfony-2-bundle.markdown create mode 100644 _posts/2013-05-06-installing-otrs-in-fedora-18-with-selinux-enabled.markdown create mode 100644 _posts/2013-09-16-swe-glib-final-release.markdown create mode 100644 _posts/2013-09-24-from-symfony-to-django-in-two-days.markdown create mode 100644 _posts/2013-11-05-first-impressions-of-windows-8.markdown create mode 100644 _posts/2014-07-18-list-git-branches-and-their-remote-tracking-branches-side-by-side.markdown create mode 100644 _posts/2014-08-16-registering-an-enum-type-in-glib-glib-mkenums-magic.markdown create mode 100644 _posts/2014-09-17-nyanmacs.markdown create mode 100644 _posts/2014-10-07-rounding-numbers-to-n-decimals-in-emacs.markdown create mode 100644 _posts/2015-02-26-using-git-bisect-to-find-the-first-good-commit.markdown create mode 100644 about.html create mode 100644 blog/index.html create mode 100644 blog/tag/active-directory.html create mode 100644 blog/tag/apache.html create mode 100644 blog/tag/astrology.html create mode 100644 blog/tag/c.html create mode 100644 blog/tag/citrix-xenserver.html create mode 100644 blog/tag/command-line.html create mode 100644 blog/tag/conference.html create mode 100644 blog/tag/debian.html create mode 100644 blog/tag/development.html create mode 100644 blog/tag/django.html create mode 100644 blog/tag/emacs.html create mode 100644 blog/tag/fedora.html create mode 100644 blog/tag/gentoo.html create mode 100644 blog/tag/git.html create mode 100644 blog/tag/glib.html create mode 100644 blog/tag/gnome3.html create mode 100644 blog/tag/heartbeat-cluster.html create mode 100644 blog/tag/kerberos.html create mode 100644 blog/tag/linux.html create mode 100644 blog/tag/monitoring.html create mode 100644 blog/tag/mysql.html create mode 100644 blog/tag/oracle.html create mode 100644 blog/tag/otrs.html create mode 100644 blog/tag/php.html create mode 100644 blog/tag/ranting.html create mode 100644 blog/tag/red-hat.html create mode 100644 blog/tag/selinux.html create mode 100644 blog/tag/ssh.html create mode 100644 blog/tag/symfony.html create mode 100644 blog/tag/technology.html create mode 100644 blog/tag/testing.html create mode 100644 blog/tag/windows.html create mode 100644 blog/tag/wordpress.html create mode 100644 blog/tag/zabbix.html create mode 100644 css/blog.css create mode 100644 css/code.css create mode 100644 css/front.css create mode 100644 css/resume.css create mode 100644 css/style.sass create mode 100644 css/templatemo_style.css create mode 100644 disclaimer/index.md create mode 100644 export.php create mode 100644 favicon.ico create mode 100644 feed.xml create mode 100644 images/close.png create mode 100644 images/contact/deviantart_16.png create mode 100644 images/contact/email_16.png create mode 100644 images/contact/facebook_16.png create mode 100644 images/contact/google_plus_16.png create mode 100644 images/contact/googletalk_16.png create mode 100644 images/contact/linkedin_16.png create mode 100644 images/contact/rss_16.png create mode 100644 images/contact/skype_16.png create mode 100644 images/contact/tumblr_16.png create mode 100644 images/contact/twitter_16.png create mode 100644 images/deviantart_16.png create mode 100644 images/email.png create mode 100644 images/email_16.png create mode 100644 images/facebook_16.png create mode 100644 images/google_plus_16.png create mode 100644 images/googletalk_16.png create mode 100644 images/komodomedia_azure_16.png create mode 100644 images/linkedin_16.png create mode 100644 images/phone.png create mode 100644 images/profile.png create mode 100644 images/profile.svg create mode 100644 images/rss_16.png create mode 100644 images/skype_16.png create mode 100644 images/tagcloud.png create mode 100644 images/tumblr_16.png create mode 100644 images/twitter_16.png create mode 100644 index.html create mode 100644 resume/index.html diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..ac5b4ac --- /dev/null +++ b/_config.yml @@ -0,0 +1,14 @@ +# Site settings +title: Gergely Polonkai +email: gergely@polonkai.eu +description: "developer, systems engineer and administrator" +baseurl: "" +url: "http://gergely.polonkai.eu" +timezone: Europe/Budapest +name: Gergely Polonkai +paginate: 10 +paginate_path: "/blog/page/:num" + +# Build settings +markdown: kramdown +permalink: pretty diff --git a/_includes/about.html b/_includes/about.html new file mode 100644 index 0000000..66f862e --- /dev/null +++ b/_includes/about.html @@ -0,0 +1,20 @@ +

+ Gergely Polonkai is a systems engineer of a telco company, and + also a freelancer developer. +

+ +

+ He is learning about different IT subjects since the late + 1990s. These include web development, application building, + systems engineering, IT security and many others. He also dug his + nose deeply into free software, dealing with different types of + Linux and its applications, + while also writing and contributing to some open source projects. +

+ +

+ On this site he is writing posts about different stuff he faces + during work (oh my, yet another IT solutions blog), hoping they + can help others with their job, or just to get along with their + brand new netbook that shipped with Linux. +

diff --git a/_includes/blog-post-list.html b/_includes/blog-post-list.html new file mode 100644 index 0000000..150a2a4 --- /dev/null +++ b/_includes/blog-post-list.html @@ -0,0 +1,29 @@ +
+ +
+{% if counter == 'even' %} +
+{% endif %} diff --git a/_includes/disqus.html b/_includes/disqus.html new file mode 100644 index 0000000..48131fa --- /dev/null +++ b/_includes/disqus.html @@ -0,0 +1,14 @@ +
+ + +comments powered by Disqus diff --git a/_includes/head.html b/_includes/head.html new file mode 100644 index 0000000..f987b5c --- /dev/null +++ b/_includes/head.html @@ -0,0 +1,14 @@ + + + + + Gergely Polonkai{% if page.title %}: {{ page.title }}{% endif %} + + + + + + + + + diff --git a/_includes/header.html b/_includes/header.html new file mode 100644 index 0000000..1ef01e5 --- /dev/null +++ b/_includes/header.html @@ -0,0 +1,44 @@ + + +
+

+ Gergely Polonkai
+ developer, systems engineer and administrator +

+
diff --git a/_includes/pagination.html b/_includes/pagination.html new file mode 100644 index 0000000..8699862 --- /dev/null +++ b/_includes/pagination.html @@ -0,0 +1,17 @@ + diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..792e595 --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,43 @@ + + + +{% include head.html %} + + +
+{% include header.html %} + + {{content}} + +{% if page.name != 'about.html' %} +
+
+{% include about.html %} +
+
+{% endif %} +
+ + + diff --git a/_layouts/page.html b/_layouts/page.html new file mode 100644 index 0000000..b1c332c --- /dev/null +++ b/_layouts/page.html @@ -0,0 +1,14 @@ +--- +layout: default +--- +
+ +
+

{{ page.title }}

+
+ +
+ {{ content }} +
+ +
diff --git a/_layouts/post.html b/_layouts/post.html new file mode 100644 index 0000000..7eff03f --- /dev/null +++ b/_layouts/post.html @@ -0,0 +1,36 @@ +--- +layout: default +--- +
+
+

{{ page.title }}

+

{{ page.date | date: "%b %-d, %Y :: %H:%M" }}{% if page.author %} • {{ page.author.name }}{% endif %}{% if page.meta %} • {{ page.meta }}{% endif %}

+
+ +
+ {{ content }} +
+ + + + {% include disqus.html %} +
diff --git a/_layouts/posts_by_tag.html b/_layouts/posts_by_tag.html new file mode 100644 index 0000000..dbbc160 --- /dev/null +++ b/_layouts/posts_by_tag.html @@ -0,0 +1,13 @@ +--- +layout: default +--- +{{content}} +

Articles under this tag

+{% if site.tags[page.tag] %} +{% for post in site.tags[page.tag] %} +{% include blog-post-list.html %} +{% endfor %} +
+{% else %} +No posts with this tag. +{% endif %} diff --git a/_make_tags.sh b/_make_tags.sh new file mode 100644 index 0000000..2eee779 --- /dev/null +++ b/_make_tags.sh @@ -0,0 +1,31 @@ +#! /bin/sh +# +# Find all tags in all posts under _posts, and generate a file for +# each under blog/tag. Also, if a tag page does not contain the tag: +# or layout: keywords, the script will include them in the front +# matter. + +for tag in `grep -h ^tags: _posts/* | sed -e 's/^tags: \[//' -e 's/\]$//' -e 's/, /\n/g' | sort | uniq` +do + tag_file="blog/tag/${tag}.html" + + if [ ! -f $tag_file ] + then + cat < $tag_file +--- +layout: posts_by_tag +tag: $tag +--- +EOF + else + if ! grep "^tag: ${tag}$" $tag_file &> /dev/null + then + sed -i "0,/---/! s/---/tag: $tag\\n---/" $tag_file + fi + + if ! grep "^layout: " $tag_file &> /dev/null + then + sed -i "0,/---/! s/---/layout: posts_by_tag\\n---/" $tag_file + fi + fi +done diff --git a/_posts/2011-05-12-ethical-hacking-2011.markdown b/_posts/2011-05-12-ethical-hacking-2011.markdown new file mode 100644 index 0000000..5c6c93e --- /dev/null +++ b/_posts/2011-05-12-ethical-hacking-2011.markdown @@ -0,0 +1,29 @@ +--- +layout: post +title: "Ethical Hacking 2012" +date: 2011-05-12 20:54:42+00:00 +tags: [conference] +permalink: /blog/2011/5/12/ethical-hacking-2011 +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +Today I went to the Ethical Hacking conference with my boss. It was my first +appearance at such conferences, but I hope there will be more. Although we +just started to redesign our IT security infrastructure with a 90% clear goal, +it was nice to hear that everything is vulnerable. I was thinking if we should +sell all our IT equipments, fire all our colleagues (you know, to prevent +social engineering), and move to the South Americas to herd llamas or sheep, +so the only danger would be some lurking pumas or jaguars. Or I simply leave +my old background image on my desktop, from the well-known game, which says: +Trust is a weakness. + +Anyways, the conference was really nice. We heard about the weaknesses of +Android, Oracle, and even FireWire. They showed some demos about everything, +exploited some free and commercial software with no problem at all. We have +seen how much power the virtualisation admin has (although I think it can be +prevented, but I’m not sure yet). However, in the end, we could see that the +Cloud is secure (or at least it can be, in a few months or so), so I’m not +totally pessimistic. See you next time at Hacktivity! diff --git a/_posts/2011-05-12-gentoo-hardened-desktop-with-gnome-3-round-one.markdown b/_posts/2011-05-12-gentoo-hardened-desktop-with-gnome-3-round-one.markdown new file mode 100644 index 0000000..071d1e0 --- /dev/null +++ b/_posts/2011-05-12-gentoo-hardened-desktop-with-gnome-3-round-one.markdown @@ -0,0 +1,88 @@ +--- +layout: post +title: "Gentoo hardened desktop with GNOME 3 – Round one" +date: 2011-05-12 20:32:41+00:00 +tags: [gentoo, gnome3, selinux] +permalink: /blog/2011/5/12/gentoo-hardened-desktop-with-gnome-3-round-one +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +After having some hard times with Ubuntu (upgrading from 10.10 to 11.04), I +decided to switch back to my old friend, Gentoo. As I’m currently learning +about Linux hardening, I decided to use the new SELinux profile, which +supports the v2 reference policy. + +Installation was pretty easy, using the [Gentoo x86 +Handbook](http://www.gentoo.org/doc/hu/handbook/handbook-x86.xml). This profile +automatically turns on the `USE=selinux` flag (so does the old SELinux +profile), but deprecated `FEATURE=loadpolicy` (which is turned on by the +profile, so portage will complain about it until you disable it in +`/etc/make.conf`). + +For the kernel, I chose `hardened-sources-2.6.37-r7`. This seems to be recent +enough for my security testing needs. I turned on both SELinux, PaX and +grsecurity. So far, I have no problem with it, but I don’t have X installed +yet, which will screw up things for sure. + +After having those hard times with Ubuntu mentioned before, I decided not to +install Grub2 yet, as it renders things unusable (eg. my Windows 7 +installation, which I sometimes need at the office). So I installed Grub 0.97 +(this is the only version marked as stable, as I remember), touched +`/.autorelabel`, and reboot. + +My first mistake was using an UUID as the root device on the kernel parameter +list (I don’t want to list all the small mistakes like forgetting to include to +correct SATA driver from my kernel and such). Maybe I was lame, but after +including `/dev/sda5` instead of the UUID thing, it worked like… + +Well, charm would not be the good word. For example, I forgot to install the +lvm2 package, so nothing was mounted except my root partition. After I +installed it with the install CD, I assumed everything will be all right, but +I was wrong. + +udev and LVM is a critical point in a hardened environment. udev itself +doesn’t want to work without the `CONFIG_DEVFS_TEMPFS=y` kernel option, so I +also had to change that. It seemed that it can be done without the install CD, +as it compiled the kernel with no problems. However, when it reached the point +when it compresses the kernel with gzip, it stopped with a `Permission denied` +message (although it was running with root privileges). + +The most beautiful thing in the hardened environment with Mandatory Access +Control enabled) is that root is not a real power user any more by default. +You can get this kind of messages many times. There are many tools to debug +these, I will talk about these later. + +So, my gzip needed a fix. After digging a bit on the Internet, I found that +the guilty thing is text relocation, which can be corrected if gzip is +compiled with PIC enabled. Thus, I turned on `USE=pic` flag globally, and +tried to remerge gzip. Of course it failed, as it had to use gzip to unpack +the gzip sources. So it did when I tried to install the PaX tools and gradm to +turn these checks off. The install CD came to the rescue again, with which I +successfully recompiled gzip, and with this new gzip, I compressed my new +kernel, with which udev started successfully. So far, so good, let’s try to +reboot! + +Damn, LVM is still not working. So I decided to finally consult the Gentoo +hardened guide. It says that the LVM startup scripts under `/lib/rcscripts/…` +must be modified, so LVM will put its lock files under `/etc/lvm/lock` instead +of `/dev/.lvm`. After this step and a reboot, LVM worked fine (finally). + +The next thing was the file system labelling. SELinux should automatically +relabel the entire file system at boot time whenever it finds the +`/.autorelabel` file. Well, in my case it didn’t happen. After checking the +[Gentoo Hardening](http://wiki.gentoo.org/wiki/Hardened_Gentoo) docs, I realised that the `rlpkg` program does exactly the same +(as far as I know, it is designed specifically for Gentoo). So I ran `rlpkg`, +and was kind of shocked. It says it will relabel ext2, ext3, xfs and JFS +partitions. Oh great, no ext4 support? Well, consulting the forums and adding +some extra lines to `/etc/portage/package.keywords` solved the problem (`rlpkg` +and some dependencies had to have the `~x86` keyword set). Thus, `rlpkg` +relabelled my file systems (I checked some directories with `ls -lZ`, it seemed +good for me). + +Now it seems that everything is working fine, except the tons of audit +messages. Tomorrow I will check them with `audit2why` or `audit2allow` to see if +it is related with my SELinux lameness, or with a bug in the policy included +with Gentoo. diff --git a/_posts/2011-05-13-zabbix-performance-tip.markdown b/_posts/2011-05-13-zabbix-performance-tip.markdown new file mode 100644 index 0000000..8b4ec7b --- /dev/null +++ b/_posts/2011-05-13-zabbix-performance-tip.markdown @@ -0,0 +1,35 @@ +--- +layout: post +title: "Zabbix performance tip" +date: 2011-05-13 19:03:31+00:00 +tags: [zabbix, monitoring] +permalink: /blog/2011/5/13/zabbix-performance-tip +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +Recently I have switched from [MRTG](http://oss.oetiker.ch/mrtg/) + [Cacti](http://www.cacti.net/) + [Nagios](http://www.nagios.org/) + [Gnokii](http://www.gnokii.org/) to [Zabbix](http://www.zabbix.com/), and I +must say I’m more than satisfied with it. It can do anything the former tools +did, and much more. First of all, it can do the same monitoring as Nagios did, +but it does much more fine. It can check several parameters within one +request, so network traffic is kept down. Also, its web front-end can generate +any kinds of graphs from the collected data, which took Cacti away. Also, it +can do SNMP queries (v1-v3), so querying my switches’ port states and traffic +made easy, taking MRTG out of the picture (I know Cacti can do it either, it +had historical reasons we had both tools installed). And the best part: it can +send SMS messages via a GSM modem natively, while Nagios had to use Gnokii. +The trade-off is, I had to install Zabbix agent on all my monitored machines, +but I think it worths the price. I even have had to install NRPE to monitor +some parameters, which can be a pain on Windows hosts, while Zabbix natively +supports Windows, Linux and Mac OS/X. + +So I only had to create a MySQL database (which I already had for NOD32 +central management), and install Zabbix server. Everything went fine, until I +reached about 1300 monitored parameters. MySQL seemed to be a bit slow on disk +writes, so my Zabbix “queue” filled up in no time. After reading some forums, +I decided to switch to PostgreSQL instead. Now it works like charm, even with +the default Debian settings. However, I will have to add several more +parameters, and my boss wants as many graphs as you can imagine, so I’m more +than sure that I will have to fine tune my database later. diff --git a/_posts/2011-05-18-gentoo-hardened-desktop-with-gnome-3-round-two.markdown b/_posts/2011-05-18-gentoo-hardened-desktop-with-gnome-3-round-two.markdown new file mode 100644 index 0000000..85fb918 --- /dev/null +++ b/_posts/2011-05-18-gentoo-hardened-desktop-with-gnome-3-round-two.markdown @@ -0,0 +1,29 @@ +--- +layout: post +title: "Gentoo hardened desktop with GNOME 3 – Round two" +date: 2011-05-18 10:28:14+00:00 +tags: [gentoo, gnome3, selinux] +permalink: /blog/2011/5/18/gentoo-hardened-desktop-with-gnome-3-round-two +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +After several hours of `package.keywords`/`package.use` editing and package +compiling, I managed to install GNOME 3 on my notebook. Well, I mean, the +GNOME 3 packages. Unfortunately the fglrx driver didn’t seem to recognise my +ATI Mobility M56P card, and the open source driver didn’t want to give me GLX +support. When I finally found some clues on what should I do, I had to use my +notebook for work, so I installed Fedora 14 on it. Then I realised that GNOME +3 is already included in Rawhide (Fedora 15), so I quickly downloaded and +installed that instead. Now I have to keep this machine in a working state for +a few days, so I will learn SELinux stuff in its native environment. + +When I installed Fedora 14, the first AVC message popped up after about ten +minutes. That was a good thing, as I wanted to see `setroubleshoot` in action. +However, in Fedora 15, the AVC bubbles didn’t show up even after a day. I +raised my left eyebrow and said that’s impossible, SELinux must be disabled. +And it’s not! It’s even in enforcing mode! And it works just fine. I like it, +and I hope I will be able to get the same results with Gentoo if I can get +back to testing… diff --git a/_posts/2011-05-27-citrix-xenserver-vs-debian-5-0-upgrade-to-6-0.markdown b/_posts/2011-05-27-citrix-xenserver-vs-debian-5-0-upgrade-to-6-0.markdown new file mode 100644 index 0000000..9d8b31e --- /dev/null +++ b/_posts/2011-05-27-citrix-xenserver-vs-debian-5-0-upgrade-to-6-0.markdown @@ -0,0 +1,41 @@ +--- +layout: post +title: "Citrix XenServer 5.5 vs. Debian 5.0 upgrade to 6.0" +date: 2011-05-27 17:33:41+00:00 +tags: [citrix-xenserver, debian] +permalink: /blog/2011/5/27/citrix-xenserver-vs-debian-5-0-upgrade-to-6-0 +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +Few weeks ago I’ve upgraded two of our Debian based application servers from +5.0 to 6.0. Everything went fine, as the upgraded packages worked well with +the 4.2 JBoss instances. For the new kernel we needed a reboot, but as the +network had to be rebuilt, I postponed this reboot until the network changes. +With the network, everything went fine again, we successfully migrated our +mail servers behind a firewall. Also the Xen server (5.5.0, upgrade to 5.6 +still has to wait for a week or so) revolted well with some storage disks +added. But the application servers remained silent… + +After checking the console, I realised that they don’t have an active console. +And when I tried to manually start them, XenServer refused with a message +regarding pygrub. + +To understand the problem, I had to understand how XenServer boots Debian. It +reads the grub.conf on the first partition’s root or `/boot` directory, and +starts the first option, without asking (correct me, if I’m mistaken +somewhere). However, this pygrub thing can not parse the new, grub2 config. +This is kinda frustrating. + +For the first step, I quickly installed a new Debian 5.0 system from my +template. Then I attached the disks of the faulty virtual machine, and mounted +all its partitions. This way I could reach my faulty 6.0 system with a chroot +shell, from which I could install the `grub-legacy` package instead of grub, +install the necessary kernel and XenServer tools (which were missing from both +machines somehow), then halt the rescue system, and start up the original +instance. + +Next week I will do an upgrade on the XenServer to 5.6.1. I hope no such +problems will occur. diff --git a/_posts/2011-05-27-oracle-database-incompatible-with-oracle-linux.markdown b/_posts/2011-05-27-oracle-database-incompatible-with-oracle-linux.markdown new file mode 100644 index 0000000..61a1c46 --- /dev/null +++ b/_posts/2011-05-27-oracle-database-incompatible-with-oracle-linux.markdown @@ -0,0 +1,25 @@ +--- +layout: post +title: "Oracle Database “incompatible” with Oracle Linux?" +date: 2011-05-27 17:53:31+00:00 +tags: [linux, oracle] +permalink: /blog/2011/5/27/oracle-database-incompatible-with-oracle-linux +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +Today I gave a shot to install [Oracle +Linux](http://www.oracle.com/us/technologies/linux/overview/index.html). I thought I could easily install +an Oracle DBA on it. Well, I was naive. + +As only the 5.2 version is supported by XenServer 5.5, I downloaded that +version of Oracle Linux. Installing it was surprisingly fast and easy, it +asked almost nothing, and booted without any problems. + +After this came the DBA, 10.2, which bloated an error message in my face +saying that this is an unsupported version of Linux. Bah. + +Is it only me, or is it really strange that Oracle doesn’t support their own +distro? diff --git a/_posts/2011-06-10-proxy-only-non-existing-files-with-mod-proxy-and-mod-rewrite.markdown b/_posts/2011-06-10-proxy-only-non-existing-files-with-mod-proxy-and-mod-rewrite.markdown new file mode 100644 index 0000000..6510da1 --- /dev/null +++ b/_posts/2011-06-10-proxy-only-non-existing-files-with-mod-proxy-and-mod-rewrite.markdown @@ -0,0 +1,30 @@ +--- +layout: post +title: "Proxy only non-existing files with mod_proxy and mod_rewrite" +date: 2011-06-10 14:20:43+00:00 +tags: [apache] +permalink: /blog/2011/6/10/proxy-only-non-existing-files-with-mod-proxy-and-mod-rewrite +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +Today I got an interesting task. I had to upload some pdf documents to a site. +The domain is ours, but we don’t have access to the application server that is +hosting the page yet. Until we get it in our hands, I did a trick. + +I enabled `mod_rewrite`, `mod_proxy` and `mod_proxy_http`, then added the following +lines to my apache config: + +{% highlight apache %} +RewriteEngine on +RewriteRule ^/$ http://172.16.72.131:8080/ [QSA,L,P] +RewriteCond %{REQUEST_FILENAME} !-f +RewriteRule ^/(.*) http://172.16.72.131:8080/$1 [QSA,L,P] + +Order allow,deny +Allow from all +{% endhighlight %} + +I’m not totally sure it’s actually secure, but it works for now. diff --git a/_posts/2011-09-18-inverse-of-sort.markdown b/_posts/2011-09-18-inverse-of-sort.markdown new file mode 100644 index 0000000..956a410 --- /dev/null +++ b/_posts/2011-09-18-inverse-of-sort.markdown @@ -0,0 +1,30 @@ +--- +layout: post +title: "Inverse of `sort`" +date: 2011-09-18 14:57:31 +tags: [linux, command-line] +permalink: /blog/2011/9/18/inverse-of-sort +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +I’m using \*NIX systems for about 14 years now, but it can still show me new +things. Today I had to generate a bunch of random names. I’ve create a small +perl script which generates permutations of some usual Hungarian first and +last names, occasionally prefixing it with a ‘Dr.’ title or using double first +names. For some reasons I forgot to include uniqueness check in the script. +When I ran it in the command line, I realized the mistake, so I appended +`| sort | uniq` to the command line. So I had around 200 unique names, but in +alphabetical order, which was awful for my final goal. Thus, I tried shell +commands like rand to create a random order, and when many of my tries failed, +the idea popped in my mind (not being a native English speaker): “I don’t have +to create «random order», but «shuffle the list». So I started typing `shu`, +pressed Tab in the Bash shell, and voilà! `shuf` is the winner, it does just +exactly what I need: + + **NAME** + shuf - generate random permutations + +Thank you, Linux Core Utils! :) diff --git a/_posts/2011-12-11-why-you-should-always-test-your-software-with-production-data.markdown b/_posts/2011-12-11-why-you-should-always-test-your-software-with-production-data.markdown new file mode 100644 index 0000000..0bf8cbf --- /dev/null +++ b/_posts/2011-12-11-why-you-should-always-test-your-software-with-production-data.markdown @@ -0,0 +1,16 @@ +--- +layout: post +title: "Why you should always test your software with production data" +date: 2011-12-11 12:14:51+00:00 +tags: [development, testing, ranting] +permalink: /blog/2011/12/11/why-you-should-always-test-your-software-with-production-data +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +I’m writing a software for my company in PHP, using the Symfony 2 framework. +I’ve finished all the work, created some sample data, it loaded perfectly. Now +I put the whole thing into production and tried to upload the production data +into it. Guess what… it didn’t load. diff --git a/_posts/2012-03-20-php-5-4-released.markdown b/_posts/2012-03-20-php-5-4-released.markdown new file mode 100644 index 0000000..30793d0 --- /dev/null +++ b/_posts/2012-03-20-php-5-4-released.markdown @@ -0,0 +1,29 @@ +--- +layout: post +title: "PHP 5.4 released" +date: 2012-03-20 13:31:12+00:00 +tags: [php] +permalink: /blog/2012/3/20/php-5-4-released +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +After a long time of waiting, PHP announced 5.4 release on 1 March (also, +today they announced that they finally migrate to Git, which is sweet from my +point of view, but it doesn’t really matter). + +About a year ago we became very agressive towards a developer who created our +internal e-learning system. Their database was very insecure, and they didn’t +really follow industry standards in many ways. Thus, we forced them to move +from Windows + Apache 2.0 + PHP 5.2 + MySQL 4.0 to Debian Linux 6.0 + Apache +2.2 + PHP 5.3 + MySQL 5.1. It was fun (well, from our point of view), as their +coders… well… they are not so good. The code that ran “smoothly” on the +old system failed at many points on the new one. So they code and code, and +write more code. And they still didn’t finish. And now 5.4 is here. Okay, I +know it will take some time to get into the Debian repositories, but it’s +here. And they removed `register_globals`, which will kill that funny code again +at so many points that they will soon get to rewrite the whole code to make it +work. And I just sit here in my so-much-comfortable chair, and laugh. Am I +evil? diff --git a/_posts/2012-03-27-fast-world-fast-updates.markdown b/_posts/2012-03-27-fast-world-fast-updates.markdown new file mode 100644 index 0000000..5a2609f --- /dev/null +++ b/_posts/2012-03-27-fast-world-fast-updates.markdown @@ -0,0 +1,34 @@ +--- +layout: post +title: "Fast world, fast updates" +date: 2012-03-27 06:18:43+00:00 +tags: [linux] +permalink: /blog/2012/3/27/fast-world-fast-updates +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +We live in a fast world, that’s for sure. When I first heard about Ubuntu +Linux and their goals, I was happy: they gave a Debian to everyone, but in +different clothes. It had fresh software in it, and even they gave support of +a kind. It was easy to install and use, even if one had no Linux experience +before. So people liked it. I’ve even installed it on some of my servers +because of the new package versions that came more often. Thus I got an up to +date system. However, it had a price. After a while, security updates came +more and more often, and when I had a new critical update every two or three +days, I’ve decided to move back to Debian. Fortunately I did this at the time +of a new release, so I didn’t really loose any features. + +After a few years passed, even Debian is heading this very same way. But as I +see, the cause is not the same. It seems that upstream software is hitting +these bugs, and even the Debian guys don’t have the time to check for them. At +the time of a GNOME version bump (yes, GNOME 3 is a really big one for the +UN\*X-like OSes), when hundreds of packages need to be checked, security bugs +show off more often. On the other hand however, Debian is releasing a new +security update every day (I had one on each of the last three days). This, of +course, is good from one point of view as we get a system that is more secure, +but most administrators don’t have maintenance windows this often. I can think +of some alternatives like Fedora, but do I really have to change? Dear fellow +developers, please code more carefully instead! diff --git a/_posts/2012-06-14-wordpress-madness.markdown b/_posts/2012-06-14-wordpress-madness.markdown new file mode 100644 index 0000000..77fdc80 --- /dev/null +++ b/_posts/2012-06-14-wordpress-madness.markdown @@ -0,0 +1,28 @@ +--- +layout: post +title: "Wordpress madness" +date: 2012-06-14 06:40:12+00:00 +tags: [wordpress, ranting] +permalink: /blog/2012/6/14/wordpress-madness +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +I’m a bit fed up that I had to install [MySQL](http://www.mysql.com/) on my +server to have [Wordpress](http://wordpress.org/) working, so I’ve Googled a +bit to find a solution for my pain. I found this: +[http://codex.wordpress.org/Using_Alternative_Databases]. I don’t know when +this post was written, but I think it’s a bit out of date. I mean come on, PDO +is the part of PHP for ages now, and they say adding a DBAL to the dependencies +would be a project as large as (or larger than) WP itself. Well, +yes, but PHP is already a dependency, isn’t it? Remove it guys, it’s too +large! + +Okay, to be serious… Having a heavily MySQL dependent codebase is a bad +thing in my opinion, and changing it is no easy task. But once it is done, it +would be a child’s play to keep it up to date, and to port WP to other +database backends. And it would be more than enough to call it 4.0, and +raising version numbers fast is a must nowadays (right, Firefox and Linux +Kernel guys?) diff --git a/_posts/2012-06-18-ssh-login-failed-on-red-hat-enterprise-linux-6-2.markdown b/_posts/2012-06-18-ssh-login-failed-on-red-hat-enterprise-linux-6-2.markdown new file mode 100644 index 0000000..9d4420f --- /dev/null +++ b/_posts/2012-06-18-ssh-login-failed-on-red-hat-enterprise-linux-6-2.markdown @@ -0,0 +1,28 @@ +--- +layout: post +title: "SSH login FAILed on Red Had Enterprise Linux 6.2" +date: 2012-06-18 18:28:45+00:00 +tags: [linux, selinux, ssh, red-hat] +permalink: /blog/2012/6/18/ssh-login-failed-on-red-hat-enterprise-linux-6-2 +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +Now this was a mistake I should not have done… + +About a month ago I have moved my AWS EC2 machine from Amazon Linux to RHEL +6.2. This was good. I have moved all my files and stuff, recreated my own +user, everything was just fine. Then I copied my +[gitosis](https://github.com/tv42/gitosis) account (user `git` and its home +directory). Then I tried to log in. It failed. I was blaming OpenSSH for a week +or so, changed the config file in several ways, tried to change the permissions +on `~git/.ssh/*`, but still nothing. Permission were denied, I was unable to +push any of my development changes. Now after a long time of trying, I +coincidently `tail -f`-ed `/var/log/audit/audit.log` (wanted to open `auth.log` +instead) and that was my first good point. It told me that `sshd` was unable to +read `~git/.ssh/authorized_keys`, which gave me the idea to run `restorecon` on +`/home/git`. It solved the problem. + +All hail SELinux and RBAC! diff --git a/_posts/2012-06-22-upgrades-requiring-a-reboot-on-linux-at-last.markdown b/_posts/2012-06-22-upgrades-requiring-a-reboot-on-linux-at-last.markdown new file mode 100644 index 0000000..53cf53a --- /dev/null +++ b/_posts/2012-06-22-upgrades-requiring-a-reboot-on-linux-at-last.markdown @@ -0,0 +1,35 @@ +--- +layout: post +title: "Upgrades requiring a reboot on Linux? At last!" +date: 2012-06-22 20:04:51+00:00 +tags: [linux] +permalink: /blog/2012/6/22/upgrades-requiring-a-reboot-on-linux-at-last +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +I’ve recently received an article on Google+ about Fedora’s new idea: package +upgrades that require a reboot. The article said that Linux guys have lost +their primary adoo: “Haha! I don’t have to reboot my system to install system +upgrades!” My answer was always this: “Well, actually you should…” + +I think this can be a great idea if distros implement it well. PackageKit was +a good first step on this road. That software could easily solve such an +issue. However, it is sooo easy to do it wrong. The kernel, of course, can not +be upgraded online (or could it be? I have some theories on this subject, +wonder if it can be implemented…), but other packages are much different. +From the users’ point of view the best would be if the packages would be +upgraded in the background seemlessly. E.g. PackageKit should check if the +given executable is running. If not, it should upgrade it, while notifying the +user like “Hey dude, don’t start Anjuta now, I’m upgrading it!”, or simply +denying to start it. Libraries are a bit different, as PackageKit should check +if any running executables are using the library. Meanwhile, PK should also +keep a notification somewhere telling the users that some packages could be +upgraded, but without stopping this-and-that, it can not be done. + +I know these things are easier said than done. But I think (a) users should +tell such ideas to the developers and (b) developers (mostly large companies, +like Microsoft or Apple) should listen to them, and at least think of these +ideas. Some users are not as stupid as they think… diff --git a/_posts/2012-09-05-some-thoughts-about-that-dead-linux-desktop.markdown b/_posts/2012-09-05-some-thoughts-about-that-dead-linux-desktop.markdown new file mode 100644 index 0000000..21a29c6 --- /dev/null +++ b/_posts/2012-09-05-some-thoughts-about-that-dead-linux-desktop.markdown @@ -0,0 +1,80 @@ +--- +layout: post +title: "Some thoughts about that dead Linux Desktop" +date: 2012-09-05 09:01:31+00:00 +tags: [linux] +permalink: /blog/2012/9/5/some-thoughts-about-that-dead-linux-desktop +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +There were some arguments in the near past on [What Killed the Linux +Desktop](http://tirania.org/blog/archive/2012/Aug-29.html). After reading many +replies, like [Linus +Torvalds’](http://www.zdnet.com/linus-torvalds-on-the-linux-desktops-popularity-problems-7000003641/), +I have my own thoughts, too. + +I know my place in the world, especially in the online community. I’m a Linux +user for about 15 years and a Linux administrator for 10 years now, beginning +with WindowMaker and something that I remember as GNOME without a version +number. I have committed some minor code chunks and translations in some minor +projects, so I’m not really into it from the “write” side (well, until now, +since I have began to write this blog, and much more, but don’t give a penny +for my words until you see it). + +I’m using Linux since 2.2 and GNOME since 1.whatever. It’s nice that a program +compiled years ago still runs on today’s Linux kernel, especially if you see +old DOS/Windows software failing to start on a new Windows 7 machine. I +understand Linus’ point that breaking external APIs is bad, and I think it can +work well on the kernel’s level. But the desktop level is much different. As +the Linux Desktop has such competitors (like OS/X and Windows’ Aero and Metro), +they have to give something new to the users almost every year to keep up with +them. Eye candies are a must (yes, of course my techy fellows, they are +worthless, but users *need* it), and they can not be created without extending +APIs. And the old API… well, it fades away fast. I don’t really understand +however, why they have to totally disappear, like +[GTK_DIALOG_NO_SEPARATOR](http://developer.gnome.org/gtk/stable/GtkDialog.html#GtkDialogFlags) +in Gtk3. It could be replaced with a 0 value (e.g: it won’t do anything). This +way my old Gtk2 program could compile with Gtk3 nicely. Also, there could be a +small software that goes through your source code and warn you about such +deprecated (and no-doer but still working) things. Porting applications between +Gtk (and thus, GNOME) versions became a real pain, which makes less enthusiast +programmers stop developing for Linux. Since I’m a GNOME guy for years, I can +tell nothing about Qt and KDE, but for the GNOME guys, this is a bad thing. As +of alternatives, there is Java. No, wait… it turned out recently that [it has +several security +bugs](http://www.theregister.co.uk/2012/08/31/critical_flaw_found_in_patched_java). +Also it’s not that multiplatform as they say (I can’t find the article on +that at the moment, but I have proof). Also, the JVMs out there eat up so much +resources, which makes it a bit hard and expensive to use. + +Also, I see another problem: those blasted package managers. RPM, DPKG, +Portage, whatever. What the hell? Why are there so many? Why do developers +reinvent the wheel? The nave is too small or there are to few spokes? Come on… +we live in an open source world! Contribute to the one and only package manager +(which one is that I don’t actually care)! I’m sure the two (three, many) +bunches of develoeprs could make a deal. Thus, it could become better and +“outsider” companies would be happier to distribute their software for Linux +platforms. + +And now that we get to the big companies. I don’t really understand them. +nVidia and ATI made their own closed source drivers for Linux. Some other +hardware vendors also write Linux drivers, and as the kernel API doesn’t really +change, they will work for a long time. But what about desktop +application vendors? Well, they try to stick to a desktop environment or two, +and if they change too frequently, they stop developing for Linux, like Skype +did (OK, maybe Skype has other reasons, but you see my point). But why? The +main part for Linux programs is the Linux kernel and the basic userland like +libc/stdlib++. If you write graphical software, it will have to use X-Windows. +Yes, it’s much different in many ways, mostly because they have a… well… pretty +ugly design by default. But still, it’s the same on every Linux distributions, +as it became somewhat an industry standard, as it was already on the market +back in the old UN\*X days. The protocol itself changed just like the Linux +kernel: almost no change at all, just some new features. + +So what kills the Linux desktop in my opinion is these constant wars inside, +and the lack of support from the outside. Open Source is good, but until these +(mostly the first) problems are not resolved, Linux Desktop can do nothing on +the market. It’s a downward spiral hard to escape. diff --git a/_posts/2012-09-07-how-to-start-becoming-a-web-developer.markdown b/_posts/2012-09-07-how-to-start-becoming-a-web-developer.markdown new file mode 100644 index 0000000..4a21aa5 --- /dev/null +++ b/_posts/2012-09-07-how-to-start-becoming-a-web-developer.markdown @@ -0,0 +1,76 @@ +--- +layout: post +title: "How to start becoming a web developer" +date: 2012-09-07 18:12:12+00:00 +tags: [development, technology] +permalink: /blog/2012/9/7/how-to-start-becoming-a-web-developer +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +A friend of mine asked me today how to become a web developer. It took me a +while, but I made up a checklist. It’s short, but it’s enough for the first +steps. + +#### First of all, learn English + +Well, if you read this, maybe this was a bad first point… + +#### Choose a language and stick to it! + +For the UN\*X/Linux line, there is PHP. It’s free, easy to learn, and has many +free tools and documentations available. It can be used in a functional or an +object-oriented way. + +C# is another good way to start, but for the Windows line. It’s fully object- +oriented, and the web is full of tutorials, how-tos and other resources. + +#### Learn the basics of the system you are working on + +To become a good developer, learn at least the basics of the system you are +working on. Basic commands can always come in handy. Debugging (yes, you will +do tons of bugs for sure) can become much easier if you know the huge set of +tools provided by your OS. You should also try to develop in the chosen +environment. Chose PHP? Get a Linux desktop! ASP.NET? Get a Windows. +Everything will be much easier! + +#### Learn the basics of the web server you are using + +PHP can run on [Apache](http://httpd.apache.org/) (as a module), or any +CGI-capable webserver, like [lighttpd](http://www.lighttpd.net/) or +[nginx](http://nginx.org/) (well, it can also run on IIS, but trust me: you +don’t want that). ASP.NET is designed for IIS, and although some scripts can +be run under a mono-capable server, it should still stay there. + +Whichever you choose, learn the basics! How to start and stop the service, +basic configuration methods, modules/extensions, and so on. It’s more than sure +that you will face some issues while developing, so it can never hurt. + +#### Keep your versions under control + +Version control is critical nowadays. It gives you a basic backup solution, +can come in handy with debugging, and if you ever want to work in a team, you +will badly need it. + +Subversion is a bit out of date now, and it’s kind of hard to set up. + +Git is no easy. You will have to learn a lot of stuff, but basicly it’s just +another version control system. Just choose if you want to stick to +merge-then-commit or rebase-then-commit, get a client, and get on the run. + +Microsoft’s Team Foundation is another good way if you are working in a team. +It provides several other features besides version controlling, and is well +integrated into Visual Studio, which is highly recommended for Windows based +development. + +#### Choose an environment to work in + +There are so many good tools out there. You should choose according to the +language and OS on what you are working on. [Zend +Studio](http://www.zend.com/en/products/studio) or +[Netbeans](https://netbeans.org/) are both good tools for PHP development, +while [Visual Studio](http://www.visualstudio.com/) is a best buy for Windows +development. Both of these have many ups and downs, but once you get in touch +with their deeper parts, you will like them. diff --git a/_posts/2012-09-10-do-not-track-in-ie10-vs-apache.markdown b/_posts/2012-09-10-do-not-track-in-ie10-vs-apache.markdown new file mode 100644 index 0000000..dbb6c26 --- /dev/null +++ b/_posts/2012-09-10-do-not-track-in-ie10-vs-apache.markdown @@ -0,0 +1,19 @@ +--- +layout: post +title: "Do-Not-Track in IE10 vs. Apache" +date: 2012-09-10 20:22:32+00:00 +tags: [apache, technology] +permalink: /blog/2012/9/10/do-not-track-in-ie10-vs-apache +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +[Apache developer decided not to accept Do-Not-Track headers from IE10 +users](http://arstechnica.com/security/2012/09/apache-webserver-updated-to-ignore-do-not-track-settings-in-ie-10/), +because it’s enabled by default. So… if I install a plugin that hides the +fact from the web server that I’m using IE10, I become eligible of using +it. But if I do this, I simply became eligible because I consciously installed +that addon, so I could actually use it without hiding the fact. Sorry if +I’m a bit Philosoraptorish… diff --git a/_posts/2012-09-16-symfony-2-create-role-and-class-based-acls-with-your-roles-coming-from-the-orm.markdown b/_posts/2012-09-16-symfony-2-create-role-and-class-based-acls-with-your-roles-coming-from-the-orm.markdown new file mode 100644 index 0000000..67f5b00 --- /dev/null +++ b/_posts/2012-09-16-symfony-2-create-role-and-class-based-acls-with-your-roles-coming-from-the-orm.markdown @@ -0,0 +1,78 @@ +--- +layout: post +title: "Symfony 2 – Create role- and class-based ACLs with your roles coming from the ORM" +date: 2012-09-16 18:39:25+00:00 +tags: [php, symfony] +permalink: /blog/2012/9/16/symfony-2-create-role-and-class-based-acls-with-your-roles-coming-from-the-orm +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +During the last weeks I had some serious issues with one of my private Symfony +2 projects. One of my goals was to create a dynamic security system, e.g my +administrators wanted to create roles, and grant these roles access to +different object types (classes) and/or objects. + +So I have created a `User` entity, which implements `UserInterface` and +`AdvancedUserInterface`, the latter for the possibility to enable/disable +accounts and such. It had a `$roles` property, which was a `ManyToMany` relation +to the `Role` entity, which implemented `RoleInterface`. Also I have created my +own role hierarchy service that implements `RoleHierarchyInterface`. + +So far so good, first tests. It soon turned out that if `User::getRoles()` +returns a `DoctrineCollection` as it does by default, then the standard + +{% highlight php %} +$this->get('security.context')->isGranted('ROLE_ADMIN'); +{% endhighlight %} + +doesn’t work. I know, it should not be hard coded, as my roles and permission +tables are dynamic, I have just tested. So I fixed my `User` entity so +`getRoles()` returns an array of `Role` objects instead of the +`DoctrineCollection`. Also I implemented a `getRolesCollection()` method to +return the original collection, but I think it will never be used. + +After that, I had to implement some more features so I put this task away. +Then, I tried to create my first ACL. + +{% highlight php %} +$securityIdentity = new RoleSecurityIdentity('ROLE_ADMIN'); +$objectIdentity = new ObjectIdentity('newsClass', 'Acme\\DemoBundle\\Entity\\News'); +$acl = $aclProvider->createAcl($objectIdentity); + +$acl->insertClassAce($securityIdentity, MaskBuilder::MASK_OWNER); +$aclProvider->updateAcl($acl); +{% endhighlight %} + +I was about to check if the user who is logged in has an `OWNER` permission on +the `User` class. + +{% highlight php %} +$this->objectIdentity = new ObjectIdentity(self::OBJECT_ID, self::OBJECT_FQCN); +if ($this->securityContext->isGranted('OWNER', $this->objectIdentity) === false) { + throw new AccessDeniedException('You don’t have the required permissions!'); +} +{% endhighlight %} + +The ACL was defined based on a role, so everyone who had the `ROLE_ADMIN` role +should gain access to the user listing page. But they didn’t. It took several +weeks to find the cause, I have put it on +[stackoverflow](http://stackoverflow.com/questions/12057795/symfony-2-1-this-getsecurity-context-isgrantedrole-admin-returns-fa) +and the Symfony Google Group, but no usable answers. + +Then I went off for debugging. Setting up NetBeans for xdebug-based PHP +debugging was real fun under Fedora, but that’s another story. After a while I +have found that Symfony’s basic access decision manager checks for +`$role->getRole()` only if `$role` is an instance of +`Symfony\Component\Security\Core\Role\Role`, instead of checking if the object +implements `Symfony\Component\Security\Core\Role\RoleInterface`. So I’ve +checked if the bug is already reported. It turned out that it was, and my +solution was available in a specific commit about a year ago, but as [Johannes +Schmitt commented, it would introduce a security +issue](https://github.com/symfony/symfony/commit/af70ac8d777873c49347ac828a817a400006cbea), +so it was reverted. Unfortunately neither Johannes Schmitt, nor Fabien +Potencier (nor anyone else) could (or wanted) to tell about this issue. So the +final (and somewhat hack-like) solution was to extend +`Symfony\Component\Security\Core\Role\Role`. And boom! It worked. diff --git a/_posts/2012-10-07-smsgateway-and-smssender.markdown b/_posts/2012-10-07-smsgateway-and-smssender.markdown new file mode 100644 index 0000000..db24273 --- /dev/null +++ b/_posts/2012-10-07-smsgateway-and-smssender.markdown @@ -0,0 +1,25 @@ +--- +layout: post +title: "SmsGateway and SmsSender" +date: 2012-10-07 00:10:26+00:00 +tags: [development, php, symfony] +permalink: /blog/2012/10/7/smsgateway-and-smssender +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +I have just uploaded my SmsGateway, SmsSender and SmsSenderBundle packages to +[GitHub](http://github.com/gergelypolonkai) and +[Packagist](http://packagist.org). I hope some of you will find it useful. + +* SmsGateway + * [GitHub](https://github.com/gergelypolonkai/smsgateway) + * [Packagist](https://packagist.org/packages/gergelypolonkai/smsgateway) +* SmsSender + * [GitHub](https://github.com/gergelypolonkai/smssender) + * [Packagist](https://packagist.org/packages/gergelypolonkai/smssender) +* SmsSenderBundle + * [GitHub](https://github.com/gergelypolonkai/smssender-bundle) + * [Packagist](https://packagist.org/packages/gergelypolonkai/smssender-bundle) diff --git a/_posts/2012-10-13-changing-the-session-cookie-s-name-in-symfony-2.markdown b/_posts/2012-10-13-changing-the-session-cookie-s-name-in-symfony-2.markdown new file mode 100644 index 0000000..90e6835 --- /dev/null +++ b/_posts/2012-10-13-changing-the-session-cookie-s-name-in-symfony-2.markdown @@ -0,0 +1,26 @@ +--- +layout: post +title: "Changing the session cookie’s name in Symfony 2" +date: 2012-10-13 12:49:28+00:00 +tags: [symfony, development] +permalink: /blog/2012/10/13/changing-the-session-cookie-s-name-in-symfony-2 +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +I have a development server, on which I have several Symfony 2.x projects under +the same hostname in different directories. Now I’m facing a funny problem +which is caused by that the cookies Symfony places for each of my projects have +the same name. + +To change this, you will have to modify the `config.yml` file like this: + +{% highlight yaml %} +session: + name: SiteSpecificSessionName + lifetime: 3600 +{% endhighlight %} + +I hope it helps some of you. diff --git a/_posts/2012-12-20-symfony-2-configuration-array-of-associative-arrays.markdown b/_posts/2012-12-20-symfony-2-configuration-array-of-associative-arrays.markdown new file mode 100644 index 0000000..5c2ed11 --- /dev/null +++ b/_posts/2012-12-20-symfony-2-configuration-array-of-associative-arrays.markdown @@ -0,0 +1,56 @@ +--- +layout: post +title: "Symfony 2 Configuration – Array of associative arrays" +date: 2012-12-20 12:03:23+00:00 +tags: [php, symfony] +permalink: /blog/2012/12/20/symfony-2-configuration-array-of-associative-arrays +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +Few days ago I have struggled with a problem using Symfony2 configuration. I +wanted to add the following kind of configuration to `config.yml`: + +{% highlight yaml %} +acme_demo: + transitions: + - { hc_cba: 180 } + - { cba_hc: -1 } +{% endhighlight %} + +The problem was that the stuff under `transitions` is dynamic, so those +`hc_cba` and `cba_hc` tags can be pretty much anything. After hitting many +errors, I came to the solution: + +{% highlight php %} +children() + ->arrayNode('state_machine') + ->requiresAtLeastOneElement() + ->beforeNormalization() + ->ifArray() + ->then(function($values) { + $ret = array(); + + foreach ($values as $value) { + foreach ($value as $transition => $time) { + $ret[] = array('transition' => $transition, 'time' => e); + } + } + + return $ret; + }) + ->end() + ->prototype('array') + ->children() + ->scalarNode('transition')->end() + ->scalarNode('time')->end() + ->end() + ->end() + ->end() + ->end() +; +{% endhighlight %} diff --git a/_posts/2013-01-05-development-man-pages-on-fedora.markdown b/_posts/2013-01-05-development-man-pages-on-fedora.markdown new file mode 100644 index 0000000..a073df5 --- /dev/null +++ b/_posts/2013-01-05-development-man-pages-on-fedora.markdown @@ -0,0 +1,14 @@ +--- +layout: post +title: "Development man pages on Fedora" +date: 2013-01-05 18:20:41+00:00 +tags: [development, fedora] +permalink: /blog/2013/1/5/development-man-pages-on-fedora +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +If you use Fedora (like me), and can’t find the development manual pages for +e.g. `printf(3)` (like me), just `yum install man-pages` (like me). diff --git a/_posts/2013-01-06-registering-an-enum-type-in-glib-s-type-system.markdown b/_posts/2013-01-06-registering-an-enum-type-in-glib-s-type-system.markdown new file mode 100644 index 0000000..c8a7873 --- /dev/null +++ b/_posts/2013-01-06-registering-an-enum-type-in-glib-s-type-system.markdown @@ -0,0 +1,99 @@ +--- +layout: post +title: "Registering an enum type in GLib’s type system" +date: 2013-01-06 02:34:03+00:00 +tags: [c, development, glib] +permalink: /blog/2013/1/6/registering-an-enum-type-in-glib-s-type-system +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +I faced a problem in my [GLib](https://developer.gnome.org/glib/) self-teaching +project, [wMUD](https://github.com/gergelypolonkai/wmud) today. I wanted to +register a signal for a `GObject`, whose handler should accept two `enum` +parameters for which I had to register a new `GEnum` type in the `GObject` type +system. However, the [documentation on this +feature](https://developer.gnome.org/gobject/unstable/gtype-non-instantiable.html) +(thanks for pointing out goes to hashem on `#gnome-hackers`) is not… uhm… +obvious. Making the long story short, I have checked with the `GIO` sources for +an example, and using that, I have created this small, working chunk: + +{% highlight c %} +#ifndef __WMUD_CLIENT_STATE_H__ +#define __WMUD_CLIENT_STATE_H__ + +#include + +/** + * WmudClientState: + * @WMUD_CLIENT_STATE_FRESH: Client is newly connected. Waiting for a login + * player name + * @WMUD_CLIENT_STATE_PASSWAIT: Login player name is entered, waiting for a + * login password + * @WMUD_CLIENT_STATE_MENU: Authentication was successful, player is now in the + * main game menu + * @WMUD_CLIENT_STATE_INGAME: Character login was successful, player is now + * in-game + * @WMUD_CLIENT_STATE_YESNO: Player was asked a yes/no question, and we are + * waiting for the answer. client.yesNoCallback MUST be set at this point! + * TODO: if wmudClient had a prevState field, and there would be some hooks + * that are called before and after the client enters a new state, this + * could be a three-state stuff, in which the player can enter e.g ? as + * the answer, so they would be presented with the question again. + * @WMUD_CLIENT_STATE_REGISTERING: Registering a new player. Waiting for the + * e-mail address to be given + * @WMUD_CLIENT_STATE_REGEMAIL_CONFIRM: E-mail address entered séms valid, + * waiting for confirmation + * + * Game client states. + */ +typedef enum { + WMUD_CLIENT_STATE_FRESH, + WMUD_CLIENT_STATE_PASSWAIT, + WMUD_CLIENT_STATE_MENU, + WMUD_CLIENT_STATE_INGAME, + WMUD_CLIENT_STATE_YESNO, + WMUD_CLIENT_STATE_REGISTERING, + WMUD_CLIENT_STATE_REGEMAIL_CONFIRM +} WmudClientState; + + +GType wmud_client_state_get_type (void) G_GNUC_CONST; +#define WMUD_TYPE_CLIENT_STATE (wmud_client_state_get_type()) + +#endif /* __WMUD_CLIENT_STATE_H__ */ +{% endhighlight %} + +{% highlight c %} +#include "wmudclientstate.h" + +GType +wmud_client_state_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter(&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { WMUD_CLIENT_STATE_FRESH, "WMUD_CLIENT_STATE_FRESH", "fresh" }, + { WMUD_CLIENT_STATE_PASSWAIT, "WMUD_CLIENT_STATE_PASSWAIT", "passwait" }, + { WMUD_CLIENT_STATE_MENU, "WMUD_CLIENT_STATE_MENU", "menu" }, + { WMUD_CLIENT_STATE_INGAME, "WMUD_CLIENT_STATE_INGAME", "ingame" }, + { WMUD_CLIENT_STATE_YESNO, "WMUD_CLIENT_STATE_YESNO", "yesno" }, + { WMUD_CLIENT_STATE_REGISTERING, "WMUD_CLIENT_STATE_REGISTERING", "registering" }, + { WMUD_CLIENT_STATE_REGEMAIL_CONFIRM, "WMUD_CLIENT_STATE_REGEMAIL_CONFIRM", "regemail-confirm" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = g_enum_register_static(g_intern_static_string("WmudClientState"), values); + g_once_init_leave(&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} +{% endhighlight %} + +Still, it can be made more perfect by using the +[glib-mkenums](http://developer.gnome.org/gobject/stable/glib-mkenums.html) +tool. I will read through the GLib Makefiles tomorrow for some hints on +this. diff --git a/_posts/2013-01-14-git-rm-cached-madness.markdown b/_posts/2013-01-14-git-rm-cached-madness.markdown new file mode 100644 index 0000000..2519e1d --- /dev/null +++ b/_posts/2013-01-14-git-rm-cached-madness.markdown @@ -0,0 +1,17 @@ +--- +layout: post +title: "git rm --cached madness" +date: 2013-01-14 21:38:00+00:00 +tags: [development, git] +permalink: /blog/2013/1/14/git-rm-cached-madness +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +I have recently learned about `git rm --cached`. It’s a very good tool, as it +removes a file from tracking, without removing your local copy of it. However, +be warned that if you use `git pull` in another working copy, the file will be +removed from there! If you accidentally put the configuration of a production +project, and remove it on your dev machine, it can cause a lot of trouble ;) diff --git a/_posts/2013-01-17-jms-diextrabundle-s-greppatternfinder-grep-exits-with-status-code-2-on-fedora-18.markdown b/_posts/2013-01-17-jms-diextrabundle-s-greppatternfinder-grep-exits-with-status-code-2-on-fedora-18.markdown new file mode 100644 index 0000000..163d150 --- /dev/null +++ b/_posts/2013-01-17-jms-diextrabundle-s-greppatternfinder-grep-exits-with-status-code-2-on-fedora-18.markdown @@ -0,0 +1,52 @@ +--- +layout: post +title: "JMS\\DiExtraBundle’s GrepPatternFinder – grep exits with status code 2 on Fedora 18" +date: 2013-01-17 00:32:12+00:00 +tags: [fedora, selinux, symfony] +permalink: /blog/2013/1/17/jms-diextrabundle-s-greppatternfinder-grep-exits-with-status-code-2-on-fedora-18 +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +Yesterday I’ve upgraded my development machines from Fedora 17 to Fedora +18. Although it went well, my [Symfony](http://symfony.com/) projects stopped +working with a message like this: + + RuntimeException: Command "/usr/bin/grep --fixed-strings --directories=recurse --devices=skip --files-with-matches --with-filename --color=never --include=*.php 'JMS\DiExtraBundle\Annotation' + '/var/www/html/gergelypolonkaiweb/app/../src' + '/var/www/html/gergelypolonkaiweb/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle' + '/var/www/html/gergelypolonkaiweb/vendor/symfony/symfony/src/Symfony/Bundle/SecurityBundle' + '/var/www/html/gergelypolonkaiweb/vendor/symfony/symfony/src/Symfony/Bundle/TwigBundle' + '/var/www/html/gergelypolonkaiweb/vendor/symfony/monolog-bundle/Symfony/Bundle/MonologBundle' + '/var/www/html/gergelypolonkaiweb/vendor/symfony/swiftmailer-bundle/Symfony/Bundle/SwiftmailerBundle' + '/var/www/html/gergelypolonkaiweb/vendor/symfony/assetic-bundle/Symfony/Bundle/AsseticBundle' + '/var/www/html/gergelypolonkaiweb/vendor/doctrine/doctrine-bundle/Doctrine/Bundle/DoctrineBundle' + '/var/www/html/gergelypolonkaiweb/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle' + '/var/www/html/gergelypolonkaiweb/vendor/jms/aop-bundle/JMS/AopBundle' + '/var/www/html/gergelypolonkaiweb/vendor/jms/security-extra-bundle/JMS/SecurityExtraBundle' + '/var/www/html/gergelypolonkaiweb/vendor/doctrine/doctrine-migrations-bundle/Doctrine/Bundle/MigrationsBundle' + '/var/www/html/gergelypolonkaiweb/vendor/friendsofsymfony/jsrouting-bundle/FOS/JsRoutingBundle' + '/var/www/html/gergelypolonkaiweb/vendor/avalanche123/imagine-bundle/Avalanche/Bundle/ImagineBundle' + '/var/www/html/gergelypolonkaiweb/vendor/genemu/form-bundle/Genemu/Bundle/FormBundle' + '/var/www/html/gergelypolonkaiweb/src/GergelyPolonkai/FrontBundle' + '/var/www/html/gergelypolonkaiweb/src/GergelyPolonkai/GeshiBundle' + '/var/www/html/gergelypolonkaiweb/vendor/symfony/symfony/src/Symfony/Bundle/WebProfilerBundle' + '/var/www/html/gergelypolonkaiweb/vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle' + '/var/www/html/gergelypolonkaiweb/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle'" exited with non-successful status code "2". + +After getting through my logs and such, I’ve finally found out that the new +SELinux policy is causing the trouble together with git. Eventually, my +`.git/logs` directory is tagged as `unconfined_u:object_r:httpd_log_t:s0`. +`httpd_log_t` type is not readable by the `system_u:system_r:httpd_t:s0` user, +which makes `/usr/bin/grep` throw an access denied error. To fix this, I needed +to do + + semanage fcontext -a -t httpd_sys_content_t '/var/www(/.*)?/\.git/logs(/.*)?' + +as root. This makes `.git` directories readable for the httpd process, thus, +for `grep`. The optimal solution would be to tell `GrepPatternFinder` to ignore +version control stuff, so the `httpd` process would have no access to them at +all. Also, in production, removing the `.git` or `.svn` directories could be a +good idea. diff --git a/_posts/2013-02-19-mount-device-or-resource-busy-after-enabling-multipath.markdown b/_posts/2013-02-19-mount-device-or-resource-busy-after-enabling-multipath.markdown new file mode 100644 index 0000000..a8ef126 --- /dev/null +++ b/_posts/2013-02-19-mount-device-or-resource-busy-after-enabling-multipath.markdown @@ -0,0 +1,32 @@ +--- +layout: post +title: "mount: device or resource busy after enabling multipath" +date: 2013-02-19 23:09:05+00:00 +tags: [linux, heartbeat-cluster] +permalink: /blog/2013/2/19/mount-device-or-resource-busy-after-enabling-multipath +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +We have a heartbeat cluster with two nodes. It has been running for several +months without problems. The shared storage is on an IBM DS3400, on which we +have a large volume formatted with ext4. + +Today I decided to reboot the active node for security reasons. So I’ve +switched to the passive node, which failed at the first step: it was unable to +mount the storage (`/dev/sda1`). After whining for a few moments, I tried to +mount it by hand, which told me + + /dev/sda1 already mounted or /data is busy + +I’ve quickly made sure that none of that was true. After checking +this-and-that, it turned out that the passive node had `multipathd` running, so +I looked under `/dev/mapper`, and found two symlinks there, `` +and `-part1`. As the partition table and the disk size was the +same as on `/dev/sda`, I tried to + + mount /dev/-part1 /data + +and voilà! It worked like charm! diff --git a/_posts/2013-02-27-why-i-stopped-using-annotation-based-routing-in-symfony-today.markdown b/_posts/2013-02-27-why-i-stopped-using-annotation-based-routing-in-symfony-today.markdown new file mode 100644 index 0000000..6a89efb --- /dev/null +++ b/_posts/2013-02-27-why-i-stopped-using-annotation-based-routing-in-symfony-today.markdown @@ -0,0 +1,27 @@ +--- +layout: post +title: "Why I stopped using annotation based routing in Symfony today" +date: 2013-02-27 23:10:24+00:00 +tags: [development, symfony] +permalink: /blog/2013/2/27/why-i-stopped-using-annotation-based-routing-in-symfony-today +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +I have read several opinions about routing configuration in Symfony. I stayed +with annotation based routing as it was convinient for me to see the URL right +above the controller action. This was because by just checking the URL, I +remembered the controlling code, as they always were fresh ones. Well, until +today. + +I had to take a look into an old (Sf 2.0, last commit was about 3 months ago) +project of mine. In the same run I’ve upgraded the whole project to 2.2 (it was +a fast one, thanks for [JMikola@GitHub](https://github.com/jmikola) for the +quick reply on my issue with +[JmikolaJsAssetsHelperBundle](https://github.com/jmikola/JmikolaJsAssetsHelperBundle) +again!). After that I went on to the requested change. Now, finding a route in +about 40 controller files spread between 3 bundles can really be a pain! So +I’ve finished with annotation based routing. It’s still a nice feature, it’s +simply not for me. diff --git a/_posts/2013-03-01-programming-as-i-see-it.markdown b/_posts/2013-03-01-programming-as-i-see-it.markdown new file mode 100644 index 0000000..94915a5 --- /dev/null +++ b/_posts/2013-03-01-programming-as-i-see-it.markdown @@ -0,0 +1,67 @@ +--- +layout: post +title: "Programming, as I see it" +date: 2013-03-01 23:32:35+00:00 +permalink: /blog/2013/3/1/programming-as-i-see-it +published: false +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +Since my age of around 11, I write code. I began with BASIC, which is, well, +the most basic language I have ever seen. Simply writing + +{% highlight basic %} +10 PRINT "Hello World!" +{% endhighlight %} + +does the job (with Assembly it would be tens of lines as I recall). Then I +moved to Pascal, then Delphi (which is basically the same thing). The next step +was a bit longer, as I started learning more languages after this, like Perl +(for dynamic web pages), C (for desktop applications), TCL (for eggdrop +programming. Yes, I might have been a weird kid), PHP (again, for dynamic web +pages. It was becoming mainstream back then). + +Many of my classmates looked down on me, as they thought I was a geek (hell I +was, but I wouldn’t have confessed it then), and called me a nerd. For a few +months maybe I was depressed, but after that I realised that this is the thing +I want to do in my life, this is the thing I’m good at. + +Most people I ask why don’t they code say “it’s too hard”. I’ve attended some +courses (both online and offline, and I was like “Whoa! Coding is extremely +hard! What the hell! I will never learn it!”, but right after the course I +realised that everything is just fine, I can still write programs, and it’s +eeeeasy. So then, what’s the problem? + +After looking through many course papers, I found that most teachers do it +totally wrong. A programming language is just that: a language. You don’t start +learning Spanish by going into a classic literature conference in Madrid and +doing a speech, but learn the basic vocabulary and grammar. The same goes for +coding. You learn the vocabulary (the basic commands or keywords) and grammar +(syntax). I had several ideas how this could be taught, just didn’t have the +background to do it. + +The idea of teaching programming lingers in my head for years now, and a few +days ago, I’ve bumped into [this +video](https://www.youtube.com/watch?v=dU1xS07N-FA). So it seems that +technology superstars like Bill Gates and Mark Zuckerberg wants to do the same. +Maybe they don’t have enough high quality coders at hand. Well of course, +if teachers make it awfully hard to learn it! So a bunch of guys sat together +and created [code.org](http://www.code.org/) to achieve my old dream. I like +the idea. And although I have almost no visitor on this blog of mine, allow me +to give you a few points on how I see programming. + +#### Great learning process + +When you write programs, especially during the first years, you adapt a new way +of thinking and learning. If you learn it as an adult, it can be a bit of a +pain, but as a child, it’s easy as learning how the wheels of those little cars +spin). + +#### A job + +#### Art + +#### Magic + diff --git a/_posts/2013-03-05-fedora-can-t-change-active-directory-password-via-kpasswd.markdown b/_posts/2013-03-05-fedora-can-t-change-active-directory-password-via-kpasswd.markdown new file mode 100644 index 0000000..3687525 --- /dev/null +++ b/_posts/2013-03-05-fedora-can-t-change-active-directory-password-via-kpasswd.markdown @@ -0,0 +1,38 @@ +--- +layout: post +title: "Fedora can’t change Active Directory password via kpasswd" +date: 2013-03-05 08:55:04+00:00 +tags: [fedora, kerberos, active-directory] +permalink: /blog/2013/3/5/fedora-can-t-change-active-directory-password-via-kpasswd +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +I wanted to change my AD password today. As the AD is actually a Kerberos +server, I was pretty sure that `kpasswd` will do the trick. However, `kpasswd` +output looked like this: + + $ kpasswd + Password for polonkai.gergely@EXAMPLE.LOCAL: + Enter new password: + Enter it again: + kpasswd: Cannot find KDC for requested realm changing password + +I’ve checked `kinit` and `klist`, everything looked fine. After a while it came +to my mind that password changing is done through the kadmin server, not +through the KDC. It seems that when I set up the Active Directory membership, +the `admin_server` directive is not get written to `krb5.conf`. So all I had to +do was to put + + admin_server = ad.example.local + +in that file, and voilà! + + $ kpasswd + Password for polonkai.gergely@EXAMPLE.LOCAL: + Enter new password: + Enter it again: + Password changed. + diff --git a/_posts/2013-03-05-haversine-in-mysql.markdown b/_posts/2013-03-05-haversine-in-mysql.markdown new file mode 100644 index 0000000..8afed61 --- /dev/null +++ b/_posts/2013-03-05-haversine-in-mysql.markdown @@ -0,0 +1,26 @@ +--- +layout: post +title: "Haversine in MySQL" +date: 2013-03-05 12:49:28+00:00 +permalink: /blog/2013/3/5/haversine-in-mysql +tags: [mysql, development] +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +Just insert it in your database, feed them two Google coordinates, and you get +the distance in kilometres. If you happen to need it in miles, change the +constant `12756.200` in the `RETURN` row to `7922.6` instead. + +{% highlight sql %} +DELIMITER $$ + +CREATE FUNCTION `haversine` (lng1 FLOAT, lat1 FLOAT, lng2 FLOAT, lat2 FLOAT) +RETURNS float NO SQL DETERMINISTIC +BEGIN + SET @a = ABS(POWER(SIN(RADIANS(lat1 - lat2)) / 2, 2) + COS(RADIANS(lat1)) * COS(RADIANS(lat2)) * POWER(SIN(RADIANS(lng1 - lng2)) / 2, 2)); + RETURN 12756.200 * ATAN2(SQRT(@a), SQRT(1 - @a)); +END$$ +{% endhighlight %} diff --git a/_posts/2013-03-13-dvorak-and-me.markdown b/_posts/2013-03-13-dvorak-and-me.markdown new file mode 100644 index 0000000..b74ba9a --- /dev/null +++ b/_posts/2013-03-13-dvorak-and-me.markdown @@ -0,0 +1,28 @@ +--- +layout: post +title: "Dvorak and me" +date: 2013-03-13 21:20:13+00:00 +tags: [linux] +permalink: /blog/2013/3/13/dvorak-and-me +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +A few months ago I have decided to switch to the Dvorak layout. After using +QWERTY (well, QWERTZ, to be precise) for almost 17 years, it was a hard +decision, but now I think it worthed the try. I started with the UK (Dvorak +with UK punctuation) layout, and in about four weeks, I’ve almost reached my +original typing speed. Today I have modified the Hungarian xkb definitions file +to add the Hungarian accended letters like ű to the layout, so I don’t have to +use dead keys anymore (which apparently turned out to be a problem, as the +Linux version of Java doesn’t support dead keys at all). + +Best thing is, as I never learned proper 10-finger typing, but learned Dvorak +that way, I can switch between QWERTY and Dvorak more or less painlessly (about +10 minutes of confusion, so to say). + +Conclusion: I don’t know yet if this was actually a good decision, but it +wasn’t bad, after all. But seeing people’s faces when they try to type on my +machine totally worths it. diff --git a/_posts/2013-04-09-renaming-a-symfony-2-bundle.markdown b/_posts/2013-04-09-renaming-a-symfony-2-bundle.markdown new file mode 100644 index 0000000..49cf39a --- /dev/null +++ b/_posts/2013-04-09-renaming-a-symfony-2-bundle.markdown @@ -0,0 +1,28 @@ +--- +layout: post +title: "Renaming a Symfony 2 bundle" +date: 2013-04-09 22:29:48+00:00 +tags: [development, symfony] +permalink: /blog/2013/4/9/renaming-a-symfony-2-bundle +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +Today I’ve realised that the name I gave to one of my Symfony 2 bundles should +be something else. To rename a bundle, one must do four things (at least). + +1. Change the namespace from `Vendor\OldBundle` to `Vendor\NewBundle` in every + PHP class (sounds like pain? It is…) +1. Change the name of files and classes. Some files under + `src/Vendor/OldBundle` (and the classes in them) contain the name of the + bundle, like `OldBundle/DependencyInjection/VendorOldBundleExtension.php` + and `OldBundle/VendorOldBundle.php`. You should rename them, or Symfony + won’t find the classes defined in them! When done, rename the whole bundle + directory either. +1. Change the configuration files accordingly, including `AppKernel.php`. These + config files are usually `routing.yml`, `services.yml`, and in some cases, + `config.yml` +1. Change the references in other parts of your code. A `grep OldBundle .` will + usually help… diff --git a/_posts/2013-05-06-installing-otrs-in-fedora-18-with-selinux-enabled.markdown b/_posts/2013-05-06-installing-otrs-in-fedora-18-with-selinux-enabled.markdown new file mode 100644 index 0000000..f4d76d1 --- /dev/null +++ b/_posts/2013-05-06-installing-otrs-in-fedora-18-with-selinux-enabled.markdown @@ -0,0 +1,111 @@ +--- +layout: post +title: "Installing OTRS in Fedora 18 with SELinux enabled" +date: 2013-05-06 06:01:52+00:00 +tags: [fedora, selinux, otrs] +permalink: /blog/2013/5/6/installing-otrs-in-fedora-18-with-selinux-enabled +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +I’ve read somewhere in an OTRS installation howto that if you want to install +OTRS, you will have to disable SELinux. Well, I won’t. + +During the last few months, I have been using Fedora 18 with SELinux on all of +my desktop machines and on my notebook, and I had no problems at all. +Meanwhile I got familiar with SELinux itself, and got used to solving problems +caused by it. So I started `tail -f /var/log/httpd/error_log` in one terminal +(to see if something Apache related thing appears), +`tail -f /var/log/audit/audit.log` in another (to see errors caused by +SELinux), opened the admin manual at the installation chapter, took a deep +breath, and went on. + +Throughout this article, I will refer to OTRS 3.2.6 as OTRS and Fedora 18 +(with only “stock” repositories) as Fedora. I assume that you have already +installed OTRS in a non-SELinux environment before, and that you have at least +some basic knowledge about SELinux, MAC, RBAC, and all the like. I’m +installing OTRS in `/opt/otrs`, so if you install it somewhere else, you will +have to modify the paths below. Also, if you happen to install under +`/var/www` (I wouldn’t recommend it), that directory already has the +`httpd_sys_content_t` type, so you won’t have to set it explicitly. + +As the first step I have unpacked the archive to `/opt/otrs`. This directory +is the OTRS default, many config files have it hardcoded, and changing it is +no easy task. + +Running `otrs.CheckModules.pl` gave me a list of missing perl modules. Red Hat +and Fedora makes it easy to install these, as you don’t have to know the RPM +package name, just the perl module name: + + yum install 'perl(Crypt::SSLeay)' \ + 'perl(DBD::Pg)' \ + 'perl(GD)' \ + 'perl(JSON::XS)' \ + 'perl(GD::Text)' \ + 'perl(GD::Graph)' \ + 'perl(Mail::IMAPClient)' \ + 'perl(Net::DNS)' \ + 'perl(PDF::API2)' \ + 'perl(Text::CSV_XS)' \ + 'perl(YAML::XS)' + +I also needed to install `mod_perl`. Although `otrs.CheckModules.pl` didn’t +mention it, the default settings use syslog as the logging module, so unless +you change it in `Config.pm`, you will also need to install +`'perl(Unix::Syslog)'`, either. + +The default SELinux policy doesn’t permit any network connection to be +initiated by Apache httpd. As OTRS needs to connect to its database, you +need to enable it explicitly. In older distributions, the +`httpd_can_network_connect` was the SELinux boolean for this, but recent +installations also have a `httpd_can_network_connect_db` flag. As far as I +know, this enables all network connections to the well-known database +servers’ default port, but I will have to check for it. For me, with a +MySQL listening on its standard port, the +`setsebool httpd_can_network_connect_db=1` command just did it. + +With SELinux enabled, Apache won’t be able to read anything that’s not +marked with the `httpd_sys_content_t` type, nor write anywhere without the +`httpd_sys_rw_content_t` type. The trivial, quick and dirty solution is to +label all the files as `httpd_sys_rw_content_t`, and let everything go. +However, the goal of SELinux is just the opposite of this: grant access +only to what is really needed. After many trial-and-error steps, it finally +turned out that for OTRS to work correctly, you must set + +* `httpd_sys_content_t` + * on `/opt/otrs/var/httpd/htdocs` +* `httpd_script_exec_t` + * on `/opt/otrs/bin/cgi-bin` +* `httpd_sys_rw_content_t` + * on `/opt/otrs/Kernel` + * on `/opt/otrs/var/sessions` + * on `/opt/otrs/var/log` (unless you use syslog for logging) + * on `/opt/otrs/var/packages` (this is used only when you download an .opm + package) + * on `/opt/otrs/var/stats` + * on `/opt/otrs/var/tmp` + * on `/opt/otrs/bin` (I wonder why this is required, though) + +To do this, use the following command: + + # semanage fcontext -a -t + +Where `` is something like `/opt/otrs/Kernel(/.*)?`. When +this is done, all you have to do is running `restorecon -vR /opt/otrs` so +it will relabel everything with the correct types (you can omit -v, I just +like to see what my software does). + +The last thing I faced is that Fedora is more restrictive on reading +directories other than `/var/www`. It has a `Require all denied` on +``, and a `Require all granted` on ``, so +`/opt/otrs/var/httpd/htdocs` will throw a +`403 Forbidden (client denied by server configuration)` error. To get rid +of this, I had to modify `scripts/apache2-httpd.include.conf` and add +`Require all granted` to both the `cgi-bin` and `htdocs` directories. + +As I will have to use OTRS in a production environment soon with SELinux +enabled, it is more than sure that this list will change in the near future. +As there are no official documentation on this (I haven’t find one yet), I +have to do it with the trial-and-error way, so be patient! diff --git a/_posts/2013-09-16-swe-glib-final-release.markdown b/_posts/2013-09-16-swe-glib-final-release.markdown new file mode 100644 index 0000000..874496e --- /dev/null +++ b/_posts/2013-09-16-swe-glib-final-release.markdown @@ -0,0 +1,30 @@ +--- +layout: post +title: "SWE-GLib final release" +date: 2013-09-16 21:37:17+00:00 +tags: [development, astrology] +permalink: /blog/2013/9/16/swe-glib-final-release +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +Few of you may know that I’m interested in astrology. About two months ago +I have decided to create an astrologers’ software for the GNOME desktop. +Since then, I have contacted Jean-André Santoni, who created a software +called [Astrognome](https://code.google.com/p/astrognome/) some years ago. +We exchanged some e-mails, and after several weeks of coding, I’m proud to +present [SWE-GLib](https://github.com/gergelypolonkai/swe-glib) 1.0.1. This +is “just” a library which wraps around [Swiss +Ephemeris](http://www.astro.com/swisseph/), creating a nice GLib-ish +interface around it. See the project page and the built-in GTK-Doc document +for more information. + +The astrologer’s software I’m writing will be +[Astrognome](https://github.com/gergelypolonkai/astrognome) (thanks for +Jean-André for letting me use the name). It is currently in pre-alpha +status, but already utilizes SWE-GLib (it just can’t display the results +yet). If you happen to be interested in astrology and/or Astrognome, fork +the repository and contribute! You can also contact me (or open an +enhancement issue on GitHub) if you have any ideas. diff --git a/_posts/2013-09-24-from-symfony-to-django-in-two-days.markdown b/_posts/2013-09-24-from-symfony-to-django-in-two-days.markdown new file mode 100644 index 0000000..40afa29 --- /dev/null +++ b/_posts/2013-09-24-from-symfony-to-django-in-two-days.markdown @@ -0,0 +1,25 @@ +--- +layout: post +title: "From Symfony to Django in two days" +date: 2013-09-24 14:05:22+00:00 +tags: [development, symfony, django] +permalink: /blog/2013/9/24/from-symfony-to-django-in-two-days +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +I was a Python hater for a long time, although I can’t really tell why. It +didn’t fit in my mind, maybe. I was programming in BASIC, Pascal (none of +these would come to my mind, though), C, PHP, Perl, JavaScript, and +different shell “languages” like awk, sed or bash. + +After I could not fit my next Symfony app on my cloud server (it is pretty +low on storage), I have decided to move slowly to Django. My first task was +simple: transition my web page (this one) from PHP + Symfony 2 to Python + +Django. The results: the “static” pages are already working, the blog +listing is almost ready (some styling issues are still around), only +tagging remains. And this is after about 6 hours of work. Oh, and the admin +site is included with Django, so I don’t have to port that. I have also +decided to finally integrate a comment feature in the Django version. diff --git a/_posts/2013-11-05-first-impressions-of-windows-8.markdown b/_posts/2013-11-05-first-impressions-of-windows-8.markdown new file mode 100644 index 0000000..f23237b --- /dev/null +++ b/_posts/2013-11-05-first-impressions-of-windows-8.markdown @@ -0,0 +1,29 @@ +--- +layout: post +title: "First impressions of Windows 8" +date: 2013-11-05 08:14:50+00:00 +tags: [windows] +permalink: /blog/2013/11/5/first-impressions-of-windows-8 +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +Many of you may know my commitment to Linux and Open Source Software. But this +doesn’t mean I hate proprietary software like many others do. I think +everything has its own place in the world, and this goes for software as well. + +A few days ago I got my hands on a new notebook, thanks to my company. It was +shipped with Windows 8 by default, and although I installed Fedora 19 in an +instant (which went smoothlessly, even with Secure Boot enabled), I’ve decided +to give a try to this new Windows Version. + +Being a heavy Windows 7 user, my first thought was “What the hell is this?” +But in a day, I got totally used to it. I don’t miss the Start button at all. +The applications already installed were almost enough for me (I still need +Office. Maybe I’ll also enroll for Office 365 later…), and the games are great +and beautiful too. So overall, this new version may be totally different (by +the looks), but it seems almost the same Windows as we know it. So if you +don’t freak out by touching something new, go give it a try: don’t +instant-remove 8 in favour of 7! diff --git a/_posts/2014-07-18-list-git-branches-and-their-remote-tracking-branches-side-by-side.markdown b/_posts/2014-07-18-list-git-branches-and-their-remote-tracking-branches-side-by-side.markdown new file mode 100644 index 0000000..daab2ba --- /dev/null +++ b/_posts/2014-07-18-list-git-branches-and-their-remote-tracking-branches-side-by-side.markdown @@ -0,0 +1,64 @@ +--- +layout: post +title: "List Git branches and their remote tracking branches side by side" +date: 2014-07-18 21:46:45+00:00 +tags: [git] +permalink: /blog/2014/7/18/list-git-branches-and-their-remote-tracking-branches-side-by-side +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +I had a hard time following my own branches in a project. They got pretty +numerous, and I wasn’t sure if I pushed them to origin at all. +`git branch -a` can list all the branches, including remote ones, but, as +my list grew too big, it was impossible to follow it any more. + +Thus, I have created a small script called git-branches-with-remotes, which +does the work for me. Its only requirements are git (of course), and the +`column` command, which is pretty obviously present on every POSIX +compliant systems (even OSX). + +{% highlight sh %} +#! /bin/sh + +COLUMN=`which column 2> /dev/null` +if test -z $COLUMN +then + echo "`column' is not found in PATH. Cannot continue." + exit 1 +fi + +current_branch=`git rev-parse --abbrev-ref HEAD` + +for branch in $(git for-each-ref --shell --format='%(refname)' refs/heads | sed -e s/^\'refs\\/heads\\///-e s/\'$//) +do + remote=`git config branch.$branch.remote` + merge=`git config branch.$branch.merge | sed -e 's/^refs\/heads\///'` + + [ x"$current_branch" == x"$branch" ] && echo -n '*' + + echo -n "$branch" + + if ! test -z $merge + then + echo -en "\t" + echo -n $remote + echo -n / + echo -n $merge + fi + + echo +done | $COLUMN -t +{% endhighlight %} + +I just put it in my path, and `git branches-with-remotes` does the work! + +Edit (16 August): I have added some code to mark the current branch (if any) +with an asterisk. Also, I have put this script [in a +gist](https://gist.github.com/gergelypolonkai/8af6a3e86b57dd4c250e). + +Edit (26 February, 2015): It turns out that `git branch -vv` shows the same +information and some more: it also shows if the branches are diverged, and the +first line of the last commit’s message. diff --git a/_posts/2014-08-16-registering-an-enum-type-in-glib-glib-mkenums-magic.markdown b/_posts/2014-08-16-registering-an-enum-type-in-glib-glib-mkenums-magic.markdown new file mode 100644 index 0000000..93d3acb --- /dev/null +++ b/_posts/2014-08-16-registering-an-enum-type-in-glib-glib-mkenums-magic.markdown @@ -0,0 +1,148 @@ +--- +layout: post +title: "Registering an enum type in GLib, glib-mkenums magic" +date: 2014-08-16 15:10:54+00:00 +tags: [development, c, glib] +permalink: /blog/2014/8/16/registering-an-enum-type-in-glib-glib-mkenums-magic +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +In [this +post](/blog/2013/1/6/registering-an-enum-type-in-glib-s-type-system) I said +I will get through the GLib Makefiles to add an enum type to GLib in a more +sophisticated way. + +In my other project, +[SWE-GLib](https://github.com/gergelypolonkai/swe-glib) I already used this +method. The following two rules in `Makefile.am` create `gswe-enumtypes.h` +and `gswe-enumtypes.c`. + +{% highlight make %} +gswe-enumtypes.h: $(gswe_enum_headers) gswe-enumtypes.h.template + $(GLIB_MKENUMS) --template $(filter %.template,$^) $(filter-out %.template,$^) > \ + gswe-enumtypes.h.tmp && mv gswe-enumtypes.h.tmp gswe-enumtypes.h +gswe-enumtypes.c: $(gswe_enum_headers) gswe-enumtypes.h gswe-enumtypes.c.template + $(GLIB_MKENUMS) --template $(filter %.template,$^) $(filter-out %.template,$^) > \ + gswe-enumtypes.c.tmp && mv gswe-enumtypes.c.tmp gswe-enumtypes.c +{% endhighlight %} + +`$(GLIB_MKENUMS)` is set in `configure` with +`AC_PATH_PROG([GLIB_MKENUMS], [glib-mkenums])`. + +This approach requires the GNU Autotools (you can get rid of it by changing +`$(GLIB_MKENUMS)` to the path to `glib-mkenums` binary), and two template +files, one for the header and one for the code. `$(gswe_enum_headers)` +contains a list of all the header files that have enum types defined +throughout the project. + +{% highlight c %} +/*** BEGIN file-header ***/ +/* gswe-enumtypes.h - Enumeration types for SWE-GLib + * + * Copyright © 2013 Gergely Polonkai + * + * SWE-GLib is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * SWE-GLib is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this library; if not, see . + */ +#ifndef __GSWE_ENUM_TYPES_H__ +#define __GSWE_ENUM_TYPES_H__ +#include + +/*** END file-header ***/ + +/*** BEGIN file-production ***/ +/* enumerations from "@filename@" */ + +#include "@filename@" +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +GType @enum_name@_get_type(void); +#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) +/*** END value-header ***/ + +/*** BEGIN file-tail ***/ + +#endif /* __GSWE_ENUM_TYPES_H__ */ +/*** END file-tail ***/ +{% endhighlight %} + +{% highlight c %} +/*** BEGIN file-header ***/ +/* gswe-enumtypes.c - Enumeration types for SWE-GLib + * + * Copyright © 2013 Gergely Polonkai + * + * SWE-GLib is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * SWE-GLib is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this library; if not, see . +*/ +#include "swe-glib.h" +#include "gswe-enumtypes.h" +#include "@filename@" + +/*** END file-header ***/ + +/*** BEGIN file-production ***/ +/* enumerations from "@filename@" */ +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +GType +@enum_name@_get_type(void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + gswe_init(); + + if (g_once_init_enter(&g;_define_type_id__volatile)) { + static const G@Type@Value values[] = { +/*** END value-header ***/ + +/*** BEGIN value-production ***/ + { + @VALUENAME@, + "@VALUENAME@", + "@valuenick@" + }, +/*** END value-production ***/ + +/*** BEGIN value-tail ***/ + { 0, NULL, NULL } + }; + + GType g_define_type_id = g_@type@_register_static( + g_intern_static_string("@EnumName@"), + values + ); + + g_once_init_leave(&g;_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +/*** END value-tail ***/ +{% endhighlight %} diff --git a/_posts/2014-09-17-nyanmacs.markdown b/_posts/2014-09-17-nyanmacs.markdown new file mode 100644 index 0000000..0316552 --- /dev/null +++ b/_posts/2014-09-17-nyanmacs.markdown @@ -0,0 +1,16 @@ +--- +layout: post +title: "NyanMacs" +date: 2014-09-17 12:45:42+00:00 +tags: [emacs] +permalink: /blog/2014/9/17/nyanmacs +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +I was a Vi/ViM user for years. For several reasons I had to change to Emacs +now and then. And then, I found +[this](http://nyan-mode.buildsomethingamazing.com). I surrender. Emacs is +just better. (And it’s working even in plain text mode without graphics) diff --git a/_posts/2014-10-07-rounding-numbers-to-n-decimals-in-emacs.markdown b/_posts/2014-10-07-rounding-numbers-to-n-decimals-in-emacs.markdown new file mode 100644 index 0000000..4817c46 --- /dev/null +++ b/_posts/2014-10-07-rounding-numbers-to-n-decimals-in-emacs.markdown @@ -0,0 +1,43 @@ +--- +layout: post +title: "Rounding numbers to N decimals in Emacs" +date: 2014-10-07 10:28:50+00:00 +tags: [emacs, development] +permalink: /blog/2014/10/7/rounding-numbers-to-n-decimals-in-emacs +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +I have recently faced a problem, where I had a bunch of SVG files with a +large amount of fraction numbers in the path definitions. These images were +displayed in small size, so this amount of precision was irrelevant, and +these numbers took almost half of my SVG images’ size. So I created an +Elisp defun to round these numbers to 2 decimals: + +{% highlight common-lisp %} +(defun get-number-at-point () + (interactive) + (skip-chars-backward "0123456789.-") + (or (looking-at "[0123456789.-]+") + (error "No number at point")) + (string-to-number (match-string 0))) + +(defun round-number-at-point-to-decimals (decimal-count) + (interactive "NDecimal count: ") + (let ((mult (expt 10 decimal-count))) + (replace-match (number-to-string + (/ + (fround + (* + mult + (get-number-at-point))) + mult))))) +{% endhighlight %} + +This finds the first digit of the number under point (the cursor), and +reduces its digits to the given amount (or the number given with `C-u`). It +has some drawbacks, though, as it cannot handle exponential forms (e.g. +`1e-1234`), but these were rare in my case, and its hard to iterate through +all numbers. I will come over this latter problem soon(ish). diff --git a/_posts/2015-02-26-using-git-bisect-to-find-the-first-good-commit.markdown b/_posts/2015-02-26-using-git-bisect-to-find-the-first-good-commit.markdown new file mode 100644 index 0000000..75c39ff --- /dev/null +++ b/_posts/2015-02-26-using-git-bisect-to-find-the-first-good-commit.markdown @@ -0,0 +1,51 @@ +--- +layout: post +title: "Using Git bisect to find the first good commit" +date: 2015-02-26 10:42:56+00:00 +tags: [git] +permalink: /blog/2015/2/26/using-git-bisect-to-find-the-first-good-commit +published: true +author: + name: Gergely Polonkai + email: gergely@polonkai.eu +--- + +Few months ago we “implemented” a bug in our software, which was released +to the customers. We continued development for two weeks when the first +customer ticket arrived about the bug. We successfully reproduced it with +the customer’s version, but not with the development sources; it turned out +that one of the developers unconsciously fixed the bug. The devs spent some +hours finding where the fix lied before coming to me like “There is +`git-bisect` which we can use to find the commit where we messed up things. +Is there a way to find where we fixed it?” + +For those who don’t know this feature, you have to mark a known “good” and +“bad” commit, then git-bisect will go through the commits between this two, +present you the corresponding snapshots, and you have to mark each of them +as “good” or “bad”. At the end, you will get a commit hash where the bug +first occured. + +As it turned out, our developers’ problem rooted in the naming convention +of git-bisect: they assumed that the “good” commit must be a working one, +while a “bad” one must be the buggy. In this case, we did the following: + +The commit with the customer’s release tag was marked as good (even though +this had the bug), and the latest commit on our development branch was +marked as “bad” (even though the bug was fixed by then). Now with every +snapshot presented by git-bisect we had to do the opposite what you usually +do: mark commits still having the bug as “good”, and commits that don’t as +“bad”. At the end, we had the hash of the commit that fixed the bug (among +some other things; luckily, the developer who pushed that commit had a +workflow that introduced a lot of cherry-picking and squashing before the +push, so he could easily find the bit that actually fixed the problem in +his local repository with the same technique). + +[This StackOverflow answer](http://stackoverflow.com/a/17153598/1305139) +suggests the very same, but with some aliases: + +{% highlight ini %} + +[alias] + bisect-fixed = bisect bad + bisect-unfixed = bisect good +{% endhighlight %} diff --git a/about.html b/about.html new file mode 100644 index 0000000..76c12bb --- /dev/null +++ b/about.html @@ -0,0 +1,6 @@ +--- +layout: page +title: About the author +permalink: /about/ +--- +{% include about.html %} diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 0000000..88264f9 --- /dev/null +++ b/blog/index.html @@ -0,0 +1,26 @@ +--- +layout: page +title: Blog +--- + +{% include pagination.html %} + +{% for post in paginator.posts %} +
+
+

{{ post.title }}

+ +
+ {{ post.excerpt }} +
+ +
+
+{% endfor %} + +{% include pagination.html %} diff --git a/blog/tag/active-directory.html b/blog/tag/active-directory.html new file mode 100644 index 0000000..cd6458b --- /dev/null +++ b/blog/tag/active-directory.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: active-directory +--- diff --git a/blog/tag/apache.html b/blog/tag/apache.html new file mode 100644 index 0000000..935698b --- /dev/null +++ b/blog/tag/apache.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: apache +--- diff --git a/blog/tag/astrology.html b/blog/tag/astrology.html new file mode 100644 index 0000000..47b6515 --- /dev/null +++ b/blog/tag/astrology.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: astrology +--- diff --git a/blog/tag/c.html b/blog/tag/c.html new file mode 100644 index 0000000..e3c2ade --- /dev/null +++ b/blog/tag/c.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: c +--- diff --git a/blog/tag/citrix-xenserver.html b/blog/tag/citrix-xenserver.html new file mode 100644 index 0000000..7958f53 --- /dev/null +++ b/blog/tag/citrix-xenserver.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: citrix-xenserver +--- diff --git a/blog/tag/command-line.html b/blog/tag/command-line.html new file mode 100644 index 0000000..39f30a0 --- /dev/null +++ b/blog/tag/command-line.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: command-line +--- diff --git a/blog/tag/conference.html b/blog/tag/conference.html new file mode 100644 index 0000000..bd0b949 --- /dev/null +++ b/blog/tag/conference.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: conference +--- diff --git a/blog/tag/debian.html b/blog/tag/debian.html new file mode 100644 index 0000000..7d194d4 --- /dev/null +++ b/blog/tag/debian.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: debian +--- diff --git a/blog/tag/development.html b/blog/tag/development.html new file mode 100644 index 0000000..5367242 --- /dev/null +++ b/blog/tag/development.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: development +--- diff --git a/blog/tag/django.html b/blog/tag/django.html new file mode 100644 index 0000000..6f67613 --- /dev/null +++ b/blog/tag/django.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: django +--- diff --git a/blog/tag/emacs.html b/blog/tag/emacs.html new file mode 100644 index 0000000..462fcec --- /dev/null +++ b/blog/tag/emacs.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: emacs +--- diff --git a/blog/tag/fedora.html b/blog/tag/fedora.html new file mode 100644 index 0000000..22c3851 --- /dev/null +++ b/blog/tag/fedora.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: fedora +--- diff --git a/blog/tag/gentoo.html b/blog/tag/gentoo.html new file mode 100644 index 0000000..862782e --- /dev/null +++ b/blog/tag/gentoo.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: gentoo +--- diff --git a/blog/tag/git.html b/blog/tag/git.html new file mode 100644 index 0000000..5a4d741 --- /dev/null +++ b/blog/tag/git.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: git +--- diff --git a/blog/tag/glib.html b/blog/tag/glib.html new file mode 100644 index 0000000..4431bb8 --- /dev/null +++ b/blog/tag/glib.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: glib +--- diff --git a/blog/tag/gnome3.html b/blog/tag/gnome3.html new file mode 100644 index 0000000..2f86c88 --- /dev/null +++ b/blog/tag/gnome3.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: gnome3 +--- diff --git a/blog/tag/heartbeat-cluster.html b/blog/tag/heartbeat-cluster.html new file mode 100644 index 0000000..b7758c7 --- /dev/null +++ b/blog/tag/heartbeat-cluster.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: heartbeat-cluster +--- diff --git a/blog/tag/kerberos.html b/blog/tag/kerberos.html new file mode 100644 index 0000000..845e7c1 --- /dev/null +++ b/blog/tag/kerberos.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: kerberos +--- diff --git a/blog/tag/linux.html b/blog/tag/linux.html new file mode 100644 index 0000000..621e0e5 --- /dev/null +++ b/blog/tag/linux.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: linux +--- diff --git a/blog/tag/monitoring.html b/blog/tag/monitoring.html new file mode 100644 index 0000000..03eadd7 --- /dev/null +++ b/blog/tag/monitoring.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: monitoring +--- diff --git a/blog/tag/mysql.html b/blog/tag/mysql.html new file mode 100644 index 0000000..38a23d8 --- /dev/null +++ b/blog/tag/mysql.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: mysql +--- diff --git a/blog/tag/oracle.html b/blog/tag/oracle.html new file mode 100644 index 0000000..7e78c3f --- /dev/null +++ b/blog/tag/oracle.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: oracle +--- diff --git a/blog/tag/otrs.html b/blog/tag/otrs.html new file mode 100644 index 0000000..8185855 --- /dev/null +++ b/blog/tag/otrs.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: otrs +--- diff --git a/blog/tag/php.html b/blog/tag/php.html new file mode 100644 index 0000000..6162444 --- /dev/null +++ b/blog/tag/php.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: php +--- diff --git a/blog/tag/ranting.html b/blog/tag/ranting.html new file mode 100644 index 0000000..d4945d9 --- /dev/null +++ b/blog/tag/ranting.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: ranting +--- diff --git a/blog/tag/red-hat.html b/blog/tag/red-hat.html new file mode 100644 index 0000000..2360d47 --- /dev/null +++ b/blog/tag/red-hat.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: red-hat +--- diff --git a/blog/tag/selinux.html b/blog/tag/selinux.html new file mode 100644 index 0000000..d2f74fb --- /dev/null +++ b/blog/tag/selinux.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: selinux +--- diff --git a/blog/tag/ssh.html b/blog/tag/ssh.html new file mode 100644 index 0000000..3f72aa6 --- /dev/null +++ b/blog/tag/ssh.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: ssh +--- diff --git a/blog/tag/symfony.html b/blog/tag/symfony.html new file mode 100644 index 0000000..2b8a7c1 --- /dev/null +++ b/blog/tag/symfony.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: symfony +--- diff --git a/blog/tag/technology.html b/blog/tag/technology.html new file mode 100644 index 0000000..1723aa6 --- /dev/null +++ b/blog/tag/technology.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: technology +--- diff --git a/blog/tag/testing.html b/blog/tag/testing.html new file mode 100644 index 0000000..e0849e9 --- /dev/null +++ b/blog/tag/testing.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: testing +--- diff --git a/blog/tag/windows.html b/blog/tag/windows.html new file mode 100644 index 0000000..8e9670c --- /dev/null +++ b/blog/tag/windows.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: windows +--- diff --git a/blog/tag/wordpress.html b/blog/tag/wordpress.html new file mode 100644 index 0000000..f2221bd --- /dev/null +++ b/blog/tag/wordpress.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: wordpress +--- diff --git a/blog/tag/zabbix.html b/blog/tag/zabbix.html new file mode 100644 index 0000000..7a5c3fe --- /dev/null +++ b/blog/tag/zabbix.html @@ -0,0 +1,4 @@ +--- +layout: posts_by_tag +tag: zabbix +--- diff --git a/css/blog.css b/css/blog.css new file mode 100644 index 0000000..b9778cd --- /dev/null +++ b/css/blog.css @@ -0,0 +1,26 @@ +/* + Document : blog + Created on : 2012.09.14., 14:53:34 + Author : polonkai.gergely + Description: + Purpose of the stylesheet follows. +*/ + +.post { + margin-bottom: 2em; +} + +p.article-date { + text-indent: 0; + font-size: 80%; + color: #7f7f7f; +} + +.paginator { + margin: .5em 0; +} + +.plusone-container { + margin-left: 1em; + display: inline; +} \ No newline at end of file diff --git a/css/code.css b/css/code.css new file mode 100644 index 0000000..0bfaea3 --- /dev/null +++ b/css/code.css @@ -0,0 +1,45 @@ +/* + Document : code + Created on : 2012.09.04., 10:05:47 + Author : polonkai.gergely + Description: + Purpose of the stylesheet follows. +*/ + +.code-chunk { + background-color: #b5b5b5; + padding: 10px; +} + +.code-chunk .code-title { + text-indent: 0 !important; + font-size: 120%; + font-weight: bold; +} + +.code-chunk .code-description { + border: 1px solid #333; + background-color: #d9d9d9; + padding: 3px; + text-indent: 0 !important; + margin: .5em 0 0 0 !important; + font-size: 75%; + color: #444; +} + +.code-chunk .code { + font-family: monospace; + background-color: #002b36; + padding: 5px; + height: 300px; + overflow: auto; +} + +.code-chunk .code * { + font-family: monospace; +} + +.code-chunk .code ol { + background-color: #002b36; + color: #586e75; +} diff --git a/css/front.css b/css/front.css new file mode 100644 index 0000000..887454c --- /dev/null +++ b/css/front.css @@ -0,0 +1,248 @@ +* { + font-family: sans-serif; +} + +body { + background-color: #333333; + margin: 0; +} + +#content-wrapper { + background-color: #ffffff; + width: 960px; + margin-left: auto; + margin-right: auto; + padding-top: 14px; +} + +#header { + height: 120px; + background-color: #4d4d4d; + color: #ffffff; + position: absolute; + width: 960px; + height: 190px; +} + +#header #picture { + background-color: white; + position: relative; + width: 170px; + height: 170px; + display: inline; + float: left; + top: 40px; + left: 20px; +} + +#header #picture img { + margin: 10px; +} + +#header h1 { + text-align: right; + margin: 40px 10px 0 0; + font-size: 41px; + font-weight: bold; + padding-top: 45px; +} + +#header h1 a { + color: #ffffff; + text-decoration: none; +} + +#header h2 { + text-align: right; + margin: 0 10px 0 0; + font-size: 12px; + font-weight: normal; + padding-top: 5px; +} + +#contact-list { + position: absolute; + right: -22px; + width: 20px; +} + +#contact-list a { + display: block; +} + +#menu { + background-color: #f18137; + height: 39px; + margin-top: 15px; +} + +#tagcloud-button { + float: left; + padding-top: 2px; + padding-left: 6px; + cursor: pointer; +} + +#menu ul { + margin: 8px; + padding: 0; + list-style-type: none; + float: right; +} + +#menu ul li { + float: right; + margin-top: 1px; + margin-bottom: 10px; + margin-left: 1em; + height: 30px; +} + +#menu ul li.active { + background-image: url('../images/arrow-up.png'); + background-repeat: no-repeat; + background-position: center bottom; +} + +#menu ul li a { + color: white; + font-weight: bold; + text-decoration: none; + font-size: 12px; +} + +#content { + clear: both; + padding: 8px; +} + +#content-padding { + height: 200px; +} + +#content h3 { + margin: .5em 0 .2em 0; +} + +#content p { + margin: .6em 0; + text-indent: 1.5em; + text-align: justify; + font-size: 80%; +} + +#content a { + color: black; + text-decoration: underline; +} + +dt { + font-weight: normal; + text-decoration: underline; +} + +dd p { + text-indent: 0 !important; + margin-top: .5em !important; +} + +#page-disclaimer { + margin-top: 2em; + text-align: right; + font-size: 80%; + color: #7f7f7f; +} + +#page-disclaimer a { + color: #7f7f7f; + text-decoration: underline; +} + +#bottombar-wrapper { + display: block; +} + +#bottombar-padding { + clear: both; + height: 35px; +} + +#bottombar { + position: fixed; + background-color: #4d4d4d; + bottom: 0; + left: 0; + margin: 0; + z-index: 70000; + width: 100%; + padding: 1em; + text-align: center; + vertical-align: center; + color: #b3b3b3; + font-size: 10px; + border-top: 1px solid black; +} + +#bottombar a { + color: #b3b3b3; + text-decoration: underline; +} + +#bottombar img { + vertical-align: middle; +} + +#more-posts { + margin-top: 1em; + text-align: right; +} + +#tag-cloud { + position: absolute; + width: 600px; + padding: 8px; + border: 1px solid black; + background-color: #303030; + margin-left: 5px; + margin-top: 2px; + display: none; +} + +#tag-cloud a { + color: #b3b3b3; + text-decoration: none; + padding: 8px; +} + +#tag-cloud .size0 { + font-size: 80%; +} + +#tag-cloud .size1 { + font-size: 90%; +} + +#tag-cloud .size2 { + font-size: 100%; +} + +#tag-cloud .size3 { + font-size: 110%; +} + +#tag-cloud .size4 { + font-size: 130%; +} + +#tag-cloud .size5 { + font-size: 150%; +} + +.clear { + clear: both; +} + +pre { + font-family: monospace; +} + diff --git a/css/resume.css b/css/resume.css new file mode 100644 index 0000000..24ce485 --- /dev/null +++ b/css/resume.css @@ -0,0 +1,51 @@ +#keywords-button { + font-size: 50%; + color: #7f7f7f; + font-weight: normal; +} + +#keywords-button:hover { + background-color: #4d4d4d; + color: #ffffff; + cursor: pointer; +} + +#keywords { + position: absolute; + top: 100px; + left: 100px; + font-size: 75%; + background-color: #4d4d4d; + color: #ffffff; + text-align: justify; + width: 50%; + padding: .5em; + border: 1px solid #f18137; + z-index: 200; + display: none; +} + +.keyword-first-letter { + font-weight: bold; + color: #f18137; +} + +#keywords-close { + width: 24px; + height: 24px; + background-image: url('../images/close.png'); + z-index: 210; + position: absolute; + display: block; + top: -13px; + right: -13px; +} + +.i { + font-style: italic; +} + +.b { + font-style: italic; +} + diff --git a/css/style.sass b/css/style.sass new file mode 100644 index 0000000..21dc659 --- /dev/null +++ b/css/style.sass @@ -0,0 +1,310 @@ +--- +--- + +$main-font: sans-serif +$page-background: #333333 +$content-background: #ffffff +$content-text: #000000 +$header-background: #4d4d4d +$header-text: #ffffff +$menu-background: #f18137 +$menu-text: #ffffff +$footer-text: #7f7f7f + +body + font: 100% $main-font + background-color: $page-background + margin: 0 + + #content-wrapper + background-color: $content-background + width: 960px + margin: 0 auto 0 auto + padding-top: 14px + + #header + height: 190px + width: 960px + background-color: $header-background + color: $header-text + position: absolute + + #picture + background-color: $content-background + position: relative + width: 170px + height: 170px + display: inline + float: left + top: 40px + left: 20px + + img + margin: 10px + + h1 + text-align: right + margin: 40px 10px 0 0 + font-size: 41px + font-weight: bold + padding-top: 45px + + a + color: $header-text + text-decoration: none + + h2 + text-align: right + margin: 0 10px 0 0 + font-size: 12px + font-weight: normal + padding-top: 5px + + #contact-list + position: absolute + right: -22px + width: 20px + + a + display: block + + #menu + background-color: $menu-background + height: 39px + margin-top: 15px + + ul + margin: 8px + padding: 0 + list-style-type:none + float: right + + li + float: right + margin: 1px 0 10px 1em + height: 30px + + a + color: $menu-text + font-weight: bold + font-size: 12px + text-decoration: none + + li.active + background-image: url('../images/arrow-up.png') + background-repeat: no-repeat + background-position: center bottom + + #tagcloud-button + float: left + padding: 2px 0 0 6px + cursor: pointer + + #content + clear: both + padding: 8px + + h3 + margin: .5em 0 .2em 0 + + p + margin: .6em 0 + text-indent: 1.5em + text-align: justify + font-size: 80% + + a + color: $content-text + text-decoration: underline + + #content-padding + height: 200px + + dt + font-weight: normal + text-decoration: underline + + dd + p + text-indent: 0 !important + margin-top: .5em !important + + #page-disclaimer + margin-top: 2em + text-align: right + font-size: 80% + color: $footer-text + + a + color: $footer-text + text-decoration: underline + + #bottombar-wrapper + display: block + + #bottombar-padding + clear: both + height: 35px + + #bottombar + position: fixed + background-color: #4d4d4d + bottom: 0 + left: 0 + margin: 0 + z-index: 70000 + width: 100% + padding: 1em + text-align: center + vertical-align: center + color: #b3b3b3 + font-size: 10px + border-top: 1px solid black + + a + color: #b3b3b3 + text-decoration: underline + + img + vertical-align: middle + + #more-posts + margin-top: 1em + text-align: right + + #tag-cloud + position: absolute + width: 600px + padding: 8px + border: 1px solid black + background-color: #303030 + margin-left: 5px + margin-top: 2px + display: none + + a + color: #b3b3b3 + text-decoration: none + padding: 8px + + .size0 + font-size: 80% + + .size1 + font-size: 90% + + .size2 + font-size: 100% + + .size3 + font-size: 110% + + .size4 + font-size: 130% + + .size5 + font-size: 150% + + .clear + clear: both + + pre + font-family: monospace + + code + font-family: monospace + background-color: #ddd + + .highlight + background-color: #b5b5b5 + padding: 10px + + .code-title + text-indent: 0 !important + font-size: 120% + font-weight: bold + + .code-description + border: 1px solid #333 + background-color: #d9d9d9 + padding: 3px + text-indent: 0 !important + margin: .5em 0 0 0 !important + font-size: 75% + color: #444 + + pre + font-family: monospace + background-color: #002b36 + padding: 5px + height: 300px + overflow: auto + color: #586e75 + + * + font-family: monospace + background-color: #002b36 + color: #586e75 + + code + .k + color: #b58900 + + #keywords-button + font-size: 50% + color: #7f7f7f + font-weight: normal + + #keywords-button:hover + background-color: #4d4d4d + color: #ffffff + cursor: pointer + + #keywords + position: absolute + top: 100px + left: 100px + font-size: 75% + background-color: #4d4d4d + color: #ffffff + text-align: justify + width: 50% + padding: .5em + border: 1px solid #f18137 + z-index: 200 + display: none + + .keyword-first-letter + font-weight: bold + color: #f18137 + + #keywords-close + width: 24px + height: 24px + background-image: url('../images/close.png') + z-index: 210 + position: absolute + display: block + top: -13px + right: -13px + + .i + font-style: italic + + .b + font-weight: bold + + .post + margin-bottom: 2em + + p.article-date + text-indent: 0 + font-size: 80% + color: #7f7f7f + + .paginator + margin: .5em 0 + + .plusone-container + margin-left: 1em + display: inline diff --git a/css/templatemo_style.css b/css/templatemo_style.css new file mode 100644 index 0000000..4f8c93c --- /dev/null +++ b/css/templatemo_style.css @@ -0,0 +1,729 @@ +/* +templatemo 395 urbanic +*/ + +/* +Urbanic Template +http://www.templatemo.com/preview/templatemo_395_urbanic +*/ + +body, html { overflow-x:hidden; } + +body { + background-color: #ffffff; + font-family: 'Open Sans', Arial, Helvetice Neue, sans-serif; + font-size: 12px; + + font-weight: 300; + font-style: normal; + -webkit-font-smoothing: antialiased; /* Fix for webkit rendering */ + -webkit-text-size-adjust: 100%; +} + +h1, h2, h3, h4, h5, h6, span, p { font-family: 'Open Sans', Arial, Helvetice Neue, sans-serif; } + +* { + -webkit-border-radius: 0 !important; + -moz-border-radius: 0 !important; + border-radius: 0 !important; +} + +.templatemo_clear { + clear: both; +} + +.height30 { + height: 30px; +} + +.templatemo-top-bar { + min-height: 40px; + background-color:#eeeeee; +} + +.templatemo-top-menu { + min-height:110px; + background-color:#ffffff; + z-index: 5000; + width:100%; +} + +.templatemo-top-menu .navbar-toggle { + margin-top: 38px; +} + +.templatemo-top-menu .navbar-brand { + padding: 0; + margin: 30px 0 0 0; +} + +/* ------ Carousel ----- */ + +#templatemo-carousel { + background: url('../images/templatemo_carousel_bg.jpg') no-repeat center center fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + overflow-x: hidden; + margin-bottom:0; + height: 500px; +} + +#templatemo-carousel .carousel-caption { + z-index: 10; +} + +#templatemo-carousel .item { + height: 500px; +} +#templatemo-carousel .carousel-inner > .item > img { + position: absolute; + min-width: 100%; + height: 500px; + left: 0; + top: 0; +} + +@media (min-width: 768px) { + #templatemo-carousel .carousel-caption p { + margin-bottom: 20px; + line-height: 1.4; + font-size: 21px; + } + + #templatemo-carousel .carousel-caption { + padding-bottom: 140px; + right: 20%; + left: 20%; + } +} + +@media (max-width: 768px) { + #templatemo-carousel .carousel-caption { + padding-bottom: 120px; + } +} + +@media (max-width: 1024px) { + #templatemo-carousel { + background: url('../images/templatemo_carousel_bg_s.jpg') no-repeat center center; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + overflow-x: hidden; + margin-bottom:0; + height: 500px; + } +} + +/* ------ End of Carousel ----- */ + +/* ------ Welcome & Slogna ------ */ +.templatemo-welcome { + border-bottom: 1px solid #cccccc; + min-height: 230px; +} + +.templatemo-slogan { + font-family: 'Open Sans', sans-serif; + font-weight: normal; + font-size: 42px; + margin: 60px 0; + color: #333333; +} + +.templatemo-service { + margin-bottom: 100px; + margin-top: 100px; +} + +.templatemo-service-item { + font-family: 'Open Sans', sans-serif; + margin-bottom: 10px; + font-size: 20px; +} + + +.templatemo-service-item p { + font-weight: lighter; + text-align: justify; + margin-top: 25px; + font-size: 14px; + color: #929292; +} + +.subheader { + font-family: 'Open Sans', sans-serif; + font-weight: normal; + margin-top: 12px; + font-size: 12px; + color: #e67e22; +} + + +.btn-orange { + background-color: #ff7600; + border-bottom:2px solid #d35400; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color:#ffffff; +} + +.btn-orange:hover, .btn-orange:focus, .btn-orange:active, .btn-orange.active, .open .dropdown-toggle.btn-orange { + background-color: #d35400; + color:#ffffff; +} + +.btn-green { + background-color:#2ecc71; + border-bottom:2px solid #27ae60; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color:#ffffff; +} + +.btn-green:hover, .btn-green:focus, .btn-green:active, .btn-green.active, .open .dropdown-toggle.btn-green { + background-color: #27ae60; + color:#ffffff; +} + +.nav > li > a { + padding: 10px 20px; +} + +.nav > li > a:hover, +.nav > li > a:focus { + background-color: #ff7600; + color:#fff; +} + +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + background-color: #ff7600; + color:#fff; +} + + +.nav > li > a { + color: #929292; +} +.navbar-default { + background-color:#fff; + border:none; +} + +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + background-color: #ff7600; + color:#fff; +} + +.navbar { + margin-bottom: 0px; +} + +.templatemo-service-item-header { + margin-left: -10px; + padding: 16px 20px 20px; + font-weight: bold; + display: inline-block; +} + +.templatemo-header-orange { + background-color:#ff7600; + min-width: 298px; + height: 67px; + color: #fff; + +} + +.team_hr { + border: 1px solid #fff; + width: 39.5%; + float: left; +} + +.team_hr_left { + margin-right: 30px; + margin-left: 15px; +} + +.team_hr_right { + margin-left: 30px; +} + +.hr_gray { + border: 1px solid #cccccc; +} + +.templatemo-team { + background: url('../images/background.png') ; + font-family: 'Open Sans', sans-serif; + min-height:590px; + color:#ffffff; + +} +.templatemo-line-header { + margin-top:100px; + margin-bottom:80px; +} + +.member-thumb:hover .thumb-overlay { + transition: all 0.3s ease-in-out 0s; + visibility: visible; + opacity: 1; +} + +.member-thumb { + position: relative; + overflow: hidden; +} + +.member-thumb .thumb-overlay { + background-color: rgba(220, 157, 102, 0.8); + position: absolute; + visibility: hidden; + padding-top: 35%; + padding-left: 25%; + height: 100%; + width: 100%; + opacity: 0; + right: 0; + top: 0; +} + +.thumb-overlay a { + float:left; + margin-right: 5px; +} + + + +.team-inner { + margin-top:10px; +} + +.team-inner-header { + font-family: 'Open Sans', sans-serif; + font-weight:600; + font-size:16px; +} + +.team-inner-subtext { + font-weight:normal; + font-size:12px; +} + +.row_team { + margin-left:-50px; + margin-top:70px; +} + +.row_team li { + list-style: none; +} + +.templatemo-project-box { + background-size: cover; + position: relative; + overflow: hidden; + cursor:pointer; + height: 200px; + width: 200px; +} + +.templatemo-project-box:hover .project-overlay { + transition: all 0.3s ease-in-out 0s; + visibility: visible; + opacity: 1; +} + +.project-overlay { + background : rgba(0,0,0,.75); + border : 2px solid #ff7600; + visibility: hidden; + position: absolute; + text-align:center; + padding-top:40px; + color: #ffffff; + height: 100%; + width: 100%; + opacity: 0; + right: 0; + top: 0; +} + + +.project-overlay hr { + width : 70%; + +} + +.templatemo-project-gallery li { + margin:15px; +} + +.txt_darkgrey { + color: #333333; +} + +.txt_orange { + color: #e67e22; +} + +.txt_slogan { + font-size:14px; + color:#929292; +} + +.templatemo-line-header span { + font-size: 18px; + float :left; + margin-top: 10px; +} + +.team_box div { + text-align: center; + padding-top: 100px; +} + +.span_blog { + margin-bottom: 80px; +} + +.blog_post { + color: #333333; + padding: 10px; +} + +.blog_header { + font-weight: bold; + font-size: 16px; +} + +.blog_text { + text-align: justify; + font-size: 14px; + margin-top: 20px; +} + +#templatemo-contact { + margin-top:100px; + border-top: 1px solid #cccccc; + font-size:14px; +} +.templatemo-contact-map { + margin-bottom: 15px; + height: 378px; + +} + +.head_contact { + padding-bottom:80px; + margin-bottom:0; +} + +.contact_right img { + margin-right:5px; +} + +.contact_right form { + padding-left:15px; + padding-right:15px +} + +.tweet_txt { + border-left:2px solid #ffffff; + min-height:160px; +} + +.twitter_user { + color: #FFFF33; + font-size: 14px; + float: right; +} + +.templatemo-partners { + border-top: 2px solid #cccccc; +} + +.templatemo-partners .templatemo-partner-item { + margin-bottom: 5px; +} + +.templatemo-footer { + border-top: 2px solid #cccccc; + margin-top: 100px; +} + +.footer_container { + margin-top:60px; + margin-bottom:20px; +} + +.footer_bottom_content { + margin: auto; + margin-bottom: 30px; + font-size: 14px; + color:#333333; +} + +.social-icon-fb { + background: url('../images/social-icon-fb.png') no-repeat; + width: 42px; + height: 42px; + display: block; +} + +a:hover .social-icon-fb { + background: url('../images/social-icon-fb-over.png') no-repeat; +} + +.social-icon-rss { + background: url('../images/social-icon-rss.png') no-repeat; + width: 42px; + height: 42px; + display: block; +} + +a:hover .social-icon-rss { + background: url('../images/social-icon-rss-over.png') no-repeat; +} + +.social-icon-twitter { + background: url('../images/social-icon-twitter.png') no-repeat; + width: 42px; + height: 42px; + display: block; +} + +a:hover .social-icon-twitter { + background: url('../images/social-icon-twitter-over.png') no-repeat; +} + +.social-icon-linkedin { + background: url('../images/social-icon-linkedin.png') no-repeat; + width: 42px; + height: 42px; + display: block; +} + +a:hover .social-icon-linkedin { + background: url('../images/social-icon-linkedin-over.png') no-repeat; +} + +.social-icon-dribbble { + background: url('../images/social-icon-dribbble.png') no-repeat; + width: 42px; + height: 42px; + display: block; +} + +a:hover .social-icon-dribbble { + background: url('../images/social-icon-dribbble-over.png') no-repeat; +} + +ul.templatemo-project-gallery li a img:hover { + border: 3px solid #ff7600; +} + +.templatemo-gallery-category a { + color:#333333; +} + +.templatemo-gallery-category a.active { + color:#e67e22; + text-decoration:none; +} + +.templatemo-gallery-category a:focus { + color:#e67e22; + text-decoration:none; +} + +.templatemo-gallery-category a:hover { + color:#e67e22; + text-decoration:none; +} + +.link_orange:hover { + text-decoration:none; +} +.templatemo-project-gallery { + margin:0 0 0 0; + margin-top:30px; + margin-left: -40px; +} +.templatemo-project-gallery li { + list-style:none; + margin-bottom:25px; +} +.templatemo-project-gallery li img { + cursor: pointer; +} + +.templatemo-tweets { + background-color: #8996a0; + min-height:200px; + font-family: 'Open Sans', sans-serif; + font-size:20px; + color:#ffffff; + margin-top:100px; +} + +.form-control { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + font-style: italic; +} + +.btn_loadmore { + margin-top:30px; + margin-bottom:80px; +} + +.blog_box { + margin-left: -12px; +} + +@media (min-width:991px) and (max-width:1200px) { + .templatemo-project-box, .project-overlay { + height:170px; + width:170px; + } + + .templatemo-project-gallery { + margin-left: -70px; + } + + .templatemo-service-item-header { + padding: 16px 10px 20px; + } + + .templatemo-header-orange { + min-width: 230px; + } + + .team_box, .team_box_over { + height:220px; + width:220px; + } + +} + + +@media (max-width:991px) { + .team-inner { + margin-top: 20px; + margin-bottom: 20px; + } + + .templatemo-btn-read-more { + float:right; + margin-bottom :40px; + } +} + + +@media (min-width:768px) and (max-width:990px) { + .member-thumb .thumb-overlay { + padding-left: 30%; + } + .templatemo-project-box , .project-overlay { + height:130px; + width:130px; + padding-top: 0px; + } + + .templatemo-project-gallery { + margin-left: 10px; + } + + .blog_box{ + margin-right: -140px; + } +} + + +@media (min-width: 768px) { + .navbar-nav > li > a { + padding-top: 9px; + padding-bottom: 9px; + } +} + +@media (max-width: 768px) { + .member-thumb .thumb-overlay { + padding-left: 40%; + + } + .templatemo-btn-read-more { + float:right; + margin-bottom :40px; + } +} + +@media (max-width: 380px) { + .member-thumb .thumb-overlay { + padding-left: 30%; + + } + .templatemo-service-item-header { + font-size: 16px; + + padding: 23px 10px 22px; + } + .templatemo-header-orange { + min-width: 0px; + } + +} + +@media (min-width:991px) and (max-width: 1200px) { + .team_hr { + width: 37%; + } +} + +@media (min-width:683px) and ( max-width: 991px) { + .team_hr { + width: 33%; + } +} + +@media (min-width:585px) and ( max-width: 683px) { + .member-thumb .thumb-overlay { + padding-left: 25%; + + } + .team_hr { + width: 30%; + } +} + +@media (min-width:536px) and ( max-width: 585px) { + .team_hr { + width: 28%; + } +} + +@media (min-width:410px) and ( max-width: 536px) { + .team_hr { + width: 21%; + } +} + +@media ( max-width: 410px) { + .team_hr { + width: 11%; + } +} diff --git a/disclaimer/index.md b/disclaimer/index.md new file mode 100644 index 0000000..9854598 --- /dev/null +++ b/disclaimer/index.md @@ -0,0 +1,20 @@ +--- +layout: page +title: Disclaimer +--- + +This work by Gergely Polonkai is licensed under a [Creative Commons +Attribution-ShareAlike 3.0 Unported +License](http://creativecommons.org/licenses/by-sa/3.0/) + +The articles and thoughts on this site all originate from me, unless +otherwise stated. Please use them with this statement in your mind. If +you use anything, please put a backlink on your site to the given +article(s) or the main page. + +The social media icons in the contact menu are from +[![komodomedia.com]({{site_url}}/images/komodomedia_azure_16.png) +komodomedia.com](http://komodomedia.com). + +Some design ideas, like the arrows under the menu items are from a +friend, Judit Pásti. diff --git a/export.php b/export.php new file mode 100644 index 0000000..bc6d74c --- /dev/null +++ b/export.php @@ -0,0 +1,62 @@ +select_db('gergelypolonkai'); + +$st = $my->prepare('SELECT * FROM taggit_tag'); +$st->execute(); +$res = $st->get_result(); +$tags = []; + +while ($row = $res->fetch_assoc()) { + $tags[$row['id']] = $row['slug']; +} + +$st = $my->prepare('SELECT * FROM taggit_taggeditem'); +$st->execute(); +$res = $st->get_result(); +$tagging = []; + +while ($row = $res->fetch_assoc()) { + if (!array_key_exists($row['object_id'], $tagging)) { + $tagging[$row['object_id']] = []; + } + + $tagging[$row['object_id']][] = $row['tag_id']; +} + +$st = $my->prepare('SELECT * FROM blog_post'); +$st->execute(); +$res = $st->get_result(); + +while ($row = $res->fetch_assoc()) { + $date = substr($row['created_at'], 0, 10); + preg_match('/([0-9]{4})-([0-9]{2})-([0-9]{2})/', $date, $m); + $url = sprintf("/blog/%d/%d/%d/%s", $m[1], $m[2], $m[3], $row['slug']); + $file = '_posts/' . $date . '-' . $row['slug'] . '.markdown'; + + $out = "--- +layout: post +title: \"{$row['title']}\" +date: {$row['created_at']} +"; + + if (array_key_exists($row['id'], $tagging)) { + $post_tags = []; + foreach ($tagging[$row['id']] as $tag) { + $post_tags[] = $tags[$tag]; + } + $out .= "tags: " . join(' ', $post_tags) . "\n"; + } + + $out .= "permalink: {$url} +categories: blog +published: {$row['draft']} +--- + +{$row['content']} +"; + + $fd = fopen($file, "w"); + fputs($fd, $out); + fclose($fd); +} diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..327adce7a8a88d7820fff7527351adf54e370774 GIT binary patch literal 1150 zcmbu8X->m15Jso8Aj+nKSj847I|76R^am0gpuc+u?tg*u9&xH5q&UD=y-Z@y*faJt zqQh@62%bfJ^dhz+;tCjIq#VcmMau*o{xZ;Qm1#V}9;_!YSv}xk>>X^u8O*@}979eg zIJnh}GZ{C6&DlsHRX!%Z4%GUk2@)miJi3hr%w zISp~p|1CMXx93nmn|SNDc5~>!3rt`E#*kB0_b!h1e_iI5llN8iN5Ok_f5w?h8y(?f ezbdW$>OHpU0o=Z1&)Q4=7xrNVerP(4_z$1RYAmDx literal 0 HcmV?d00001 diff --git a/feed.xml b/feed.xml new file mode 100644 index 0000000..fcc9102 --- /dev/null +++ b/feed.xml @@ -0,0 +1,20 @@ +--- +--- + + + + {{ site.title | xml_escape }} + {{ site.description | xml_escape }} + {{ site.url }}{{ site.baseurl }}/ + + {% for post in site.posts limit:10 %} + + {{ post.title | xml_escape }} + {{ post.content | xml_escape }} + {{ post.date | date: "%a, %d %b %Y %H:%M:%S %z" }} + {{ post.url | prepend: site.baseurl | prepend: site.url }} + {{ post.url | prepend: site.baseurl | prepend: site.url }} + + {% endfor %} + + diff --git a/images/close.png b/images/close.png new file mode 100644 index 0000000000000000000000000000000000000000..d07cbb965dff32ece8edb3cde53a74200051c77d GIT binary patch literal 1158 zcmV;11bO?3P)V^3@nJH|Yk*rE?qiAI&W0#&e}UiGzU{{XsTU3Jqj;QE!b3*Pg|j?aCwYL?&L zcJng!5f+7iVK0J5VTonLQPp;p@bOwkCSQy28?aHUH!Ogf0nY)Sj(z64`=)xT=khY~ z5eXUy(!D%?I}{E<@UrcW%+Cd*m5dk<+`D?C)hAs!74*W`M_)CQlg9@xrV_4kGF&IZ z9O#gcgk!4BTlxV*AG2zfPbXeo2F|CLy97YRdp_^j!s!iLl7XM2@8?(w*C?wtA;|&Y zAa&Ez$<-4V9kytHkxInYbv@$;uS+5!Uj^heZLxgovlMj0dW^1;Dy31H1&D z5CULPq>d{^Vpf3LA+QLX8Mrta`v|}H)gU3<1Fh;70Tw}6(rYh)19$?)K4ReFC?5>Y z0E=O&gH8yuexJdfk_1>@*G&LcP4y-4e@TP{m4#jV1sw8{8FG(5>@q^Y0VX6F3O+u_ zElYZhRa3>|S=LW*sC`c%ctY$DFn|kz4sdra7)~-WVc_FE9rkkzfI~ee{FFp+WMslz zFf_njpc4W;;7%l_lMnhQwq2eCA;M5rZ7Tb?WmfoE5``rn^ohi@)1>VMX`VmOm|MkQ zvy+htnuHVKI#vCM=00wj3jfe7QPnMusb?q*v5Y7LTWyWG2|TFP8_9H4Q-o`as{6sb zEfsq%FF6^|N>1|3miBeatc5G#W5!-HAME&|+Wb3>@8(|EUA@t=mo6@MmG~qV43`Ez zE_ZB!t}9^B2lkR9VBlkRe2%P)c_V7JGGe|3ey!CT!{^fU(#7Q=a8F}e3qkLkLFXqv z5=W3m^^0-s2uaAwgnZC6?8>dbVG7wVRUJ4ZXi@?ZDjyAFETeTFgZd4&$$2q0qsdd zK~y-6osm6jQ(+W-Xb>yQ$K($aXw^YQSUbDT#nrql66tR$k5 z0$oJlhZVV|ioz9cDG^H+`jh>Dv&-=fn!lR`txZYT&=$gQorNC@-3X9~C9$C`2(1ha zr?I7>T&^%Yy!}?jG|2}N-2b=6g|;C0HjoWny-@2?*l*^ z%e%L;ZRJ#gY&JtSo9O^NrP>DZ-Z)_xvbN%JdGaDp%QKsrh8vfz1Ms=_g_mz$F<-5c z%MEl4Tqz~S7*?9AoIP;{$8~9~wK{-v6XV=_avvNxee4v)kumD^C5$mhDRHIN7;DK7 z?kCfq=0WKpUl(g_fVJGddXpdsn1244*K-wy4jm@9H;1tnsWqsLYR2=t1Kk+7t~(bIky~ literal 0 HcmV?d00001 diff --git a/images/contact/email_16.png b/images/contact/email_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2cabb177d7738f49c0f2993234b458016dd6ea16 GIT binary patch literal 608 zcmV-m0-ybfP)dbVG7wVRUJ4ZXi@?ZDjy9FETVQ zFgfRSb zB*`D*%G`Bbq?8mz@hd?^!!Q^O25dGP&gXO8`1yQhv)M2h3@{9X_nJCEQ53a_@B7SV zGcK14m&=9ue2(w?7>4nX3P6`-SwAY6rpb6bCJaLWMxzm?Y1UgSlx6w$3zb2h=WMrI z`u#qZWno!XJ$$`hNz)Y1^B$JTD#87JXT4rC91iP}-qSQq9LFIDf`^keKp2LkY06|W zsgwK-&1REcug7Asz;)fX1WKvbAPDGoy9go3vh1Pdig})Mzu#%KT6mtva=Aon{VHBw uUOu&2t#7y6t^0eKA3;iqlrqk;?CVeXtCdq}03v$;0000dbVG7wVRUJ4ZXi@?ZDjy9FETVQ zFgfL9Ke+nA~Ys>BZDYUUupTH(XEW}69H?R~7K@e=x2wL04 zSFkaOxCWEBVSnzuV-XXwL3TH{ngjPcoHH}(sB%*PW~#N;br}JZfwWzAYP}xdP;jPh`Bmi==8HAy-H3_5b`iTIA9z6HE56>^5?fM{L zXeI`;B*K@KZLF;p0RV?*4*&orh9(xUm{^005g5R5pID%Y2_*3e*8kvx)B9*LruYhO z`y-+|tp)&KF29(r!t-_cU%gkp8>^6TiQ_Za?^lRPuyt|^0C>7Oj_AQK3p5iYKI145 z(L~TBjFshlDueMo=e-UsEadbVG7wVRUJ4ZXi@?ZDjy9FETVQFgfJF(@wVN#TEE{{l}ZItN}K{A1lH>{1Q8*MqRb-S_W=N{R%=fqA`lUD zW=39ko(IqKa&=~gU}g|erh{U!7;no$Jb;bUNMJ zl+5*dy~7TUAz91J(7N5OvMejJcruv)03653)Wa}@P)Z$jkf$r9e*ZzH~X literal 0 HcmV?d00001 diff --git a/images/contact/googletalk_16.png b/images/contact/googletalk_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a003ddf0cd893810cae9d7b1c84218e3c3e0401a GIT binary patch literal 867 zcmV-p1DyPcP)6?8>dbVG7wVRUJ4ZXi@?ZDjy9FETVQFgf3td#xR$SYb(stvf zbkjxDMJfpHLeUl%twJmn7cM0AD{(?F(P|_hWX5FjVlp3@xo_UR_qi|zhAwIkoYndN z&c`2)*!9iSn?kk>5rk9xpAi1dz%KMU*3=EPG}_eqxJC%^T5J#m%(*tTuv9nXn5s>M zq|elh2Y|OcPig)!l|r@#s#}vFwyvE>!#V((>m{aYQ;yLU+=36lQYOtiNz38mJLuk) ztZ6Wu&hYEyyZrNXinYmYxCJm;Bf35x3!+VLP;#gE?noQ^KI&j%y29n*MRJQT8@D!x z`J}s<_uA^Xa{VEvE=&`PZ$jm(I7Tas4(QtxXaC0?oc?WwYa@#Q7{7ulWYJ!c>whQc z-MyJ_KkZ<4zQFHyJ&g8{R+q6_(RW}guc5?QIUUs%sxO(du z!k6%W!aSC&`$LD$Zei zZ#9DezButG$(YN*y`9{+mszPPq}9t_;dL&^{r2aeMHZkT*FO)2+)Qtkl{$A{_M z5O8teC{l*#9~@ipU>UJ-*Qp@7wgrG>YmA@1?&ke1Z&6(Kn0%Z8A=uKMps_x}$mA?1 z28PMxN&u*(1;pDQ{uo4?T5E1j#3OvRZ!^aZrO4)roVhT{o%>lbbHy5+%I9#5F5_47 z$Z%w}5Nl}UgYBF6`TT7LFO5+sdH?zc>w6eoMkKa>H6o$yOXE`TV^<@A6002ovPDHLkV1oPhmKFd2 literal 0 HcmV?d00001 diff --git a/images/contact/linkedin_16.png b/images/contact/linkedin_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0ebcde0be0dcb248fdecbe6d82e77a8b9bec7ae9 GIT binary patch literal 714 zcmV;*0yX`KP)BR__kQ2|I>Z(VR`G0SIh=FPxd!0u+?$6J2WmIU zku@IA-(WCw#rfsc)}z<6XKtFA2QM!jtdBj}%tPPR3?CFs;4|=l7V_ZBp=Bgc^JS%Z z*{URyZ87vTHQ8p1ljR=ox+Uzs+8!dtY&eGtEh@>Rb*albJ;7x;7mwCCJuyOcd6Q?2 zb!@PAkdEfK)MZvgP<42pGv8>V-tg*kn=H%GJiq`3PmaL=0XcY&F##fi6%j-oS?)PB z)MxGc8e@6PvJ{x9_W9Ax_}1FuM7_#-A}lm>%9R?%*`%0U}DEqKI?9U4RJ+8ZnPbo+>Ns3=xd5X}(h@IV-bcpz29gduSVZyQa*LO@)M0Z2uW$f7D(O%+K8 zF7RNZ2t1^TKp_GkS4XPs@HABdbVG7wVRUJ4ZXi@?ZDjy9FETVQ zFgf2>@*^pm{)V1x4Nl z;*HW$B_@fR2>ie`0l=5{8SMEK_S+=7YO~+F4a5RT+(4iM7t-JhgSQ(1=X;4y=`pMq z29b_`xG91pt|RDZxb%e~Za~jP0Lr;Jmc|E&`s}|Ut00Lh2)ZDf1D6WA2fFrv;t#|5 z6m<6DluIn#2@`3vn*kp|rUE!{c)ZjF7XM~U7wDF%nJzX6j8gqgt;>_t9d;8dFdl1Ly3HrP64z{ybnK0G={D4#;{ zhjB(`5P)^>03C8Y$_mIEw0sHX3y_~QV7woI(4{1+6%C3eOi!S;YS5QxiXl_Cqz)QH z9+;?u2CU4&^V=vMAM&xQ;DGXK3;=h}+24R_13-@_aJ6@%$Ll{lHCQi~(2myUHIvHP zGTws&e*hfdD=2T0U@h0q4SV@nT_Jw2#Hu|VHJZYCKxgGq2rUz9gqFS1+&ii+4QP)Sx9I1~l1_TO~8dHh*nk3tmV# zx$wKb;wQmYvu0{D`S8aP+o_-}#<89-iHZR$Wt+8?{RA}(lW{OQ1x$ji`lyztF>_%w z!!NIJrx_x`mKm+vJOJO-4PX5*;@Ly{=r6P}Gh$Yvl6^>-m<87@namU?u)90qeqXcF zaR{(A%j`%K3X*Rc6-7b*9y+> zjCuN?M}eS*57B6n@n9)@v72a2SUyD)h6^zh6lMx-l+7w}@rAos>j@`5*<|qEm0L78 zZbqe1<>x98GK84%K{G*(+KfjR3*O!eT$?J#k1TR^WASeShm%B9qZYVW3CFz=G~=6O zG-{|BM_ZZoe!(4|-eBWMhqVK3051Izd4IE}-*!~V7$-;2`S?DnxtY!}{jJHISaRG~ zcKB#JaAw$mz=EG!uosP4G9DQeRLO{H&O0Z=8zi}SgF{brTmM*R_HPUSI_e0c?d#`1fA!dtQgq8jt*2dJ f%KuAQbj$irrU{YGk;9@^00000NkvXXu0mjf*tl=C literal 0 HcmV?d00001 diff --git a/images/contact/tumblr_16.png b/images/contact/tumblr_16.png new file mode 100644 index 0000000000000000000000000000000000000000..7bb562fa0c58d52bb959d24de0a0801a314df880 GIT binary patch literal 748 zcmVFwK2#T-hb3F$D150spt5JF}R^O+&JX zY9!~x`mJAh`|y6A-L(VNNJ>gF#k9jDi;SBFvzUU#1~Y|{aXzs2;}0C%^9;i+Tlnk# zD%aQ6@J<+RU1Yd*0m@X3I4m{&7pnI6TIi^i#J$V zy^C|w?TbTWOE7IQi%>Fcj4W+m;@;maQ0NbypjR*8gJbT>Z>Y8e?`8_LC74D`Bjn7W z5?(y^F)JtDAzIrT)(>YAzRKe5&z@QdzLR|;EWaetYdjS%v zX_m%JL1*DHfocSNmwCz413L;Jl#M`V1aW2oz_bMt;2HK3Ki{}Y9UMD%EHTNwu4Ruc z#7HoUB#q>$0wHr{^(HSY@8Y#rUSjX==a}ETiO;|Mj+5Vfzi~t-4zq|ei(a)WQnE

?0y#-U zK~y-)m6N+`R8bIzzd7gJ-RzA~lZ6mbV%!8FLA10G1hr8M3wwiF*w|a?{~*{|C}?YC z;iFJHQM6Ks1T^N^L_$~-v-j@3XU1Ze4Z#p_V7g)E_Zk6s_+$Q2WAMO@nhzMpUL^>v zSTeWXe0*zs?4~^UI&l0gLBv%sv?;UAc zrHo2zE8i8uR#c)HzFwbjg+|R(Q49oTzAZ3){XTc^J*6+Lpk_N;4aLY*DKu)xqEQ+s z;02b}+SJF#Y33!rH@5Ief|&t=s$yM<9FRpLv~_zs;-Hd1no_C3`;W6^g#r*&Id}F1 zA_8h4LR*cHt5KSv23`#f2~ta`IN{w~*`uxs_Gy9hr^kp24kK41WEP1S+EEw{0n!w4 z!k;W6T~EqrOf^O*RI%=CW|5F9MC-IS!;%DQDa}H8cKbNZR*4xnf$tj`T}F5yR|vUj zmx5s`s81m6Cq;PlVV=gJ{T$p^K}33U0vJMWN@zvxA#hk%#6S???W*VX;wD-Ys47=a z4bT`)J7|GcR6?emP?Tn1aAw5wxmlw$!`J%pT@j-RYd+_wwTWFTGgU%vxVCP8z^|g@ z&QzP(&9vt^fC!A%O4dt55Y&v^aKSCkFRe^YayWR4oiNIBmeC)we^R_w2m6?8>dbVG7wVRUJ4ZXi@?ZDjyAFETeTFgZd4&$$2q0qsdd zK~y-6osm6jQ(+W-Xb>yQ$K($aXw^YQSUbDT#nrql66tR$k5 z0$oJlhZVV|ioz9cDG^H+`jh>Dv&-=fn!lR`txZYT&=$gQorNC@-3X9~C9$C`2(1ha zr?I7>T&^%Yy!}?jG|2}N-2b=6g|;C0HjoWny-@2?*l*^ z%e%L;ZRJ#gY&JtSo9O^NrP>DZ-Z)_xvbN%JdGaDp%QKsrh8vfz1Ms=_g_mz$F<-5c z%MEl4Tqz~S7*?9AoIP;{$8~9~wK{-v6XV=_avvNxee4v)kumD^C5$mhDRHIN7;DK7 z?kCfq=0WKpUl(g_fVJGddXpdsn1244*K-wy4jm@9H;1tnsWqsLYR2=t1Kk+7t~(bIky~ literal 0 HcmV?d00001 diff --git a/images/email.png b/images/email.png new file mode 100644 index 0000000000000000000000000000000000000000..9cf4edd512c7f89a9a7a7fb9320a130c56d22854 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8gy!3HEdYt9+~DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MfW{j978H@CH?vT-=0~QL72Jszy;$OtgYe4UNESfCmTS7& zaHZ_;eTHk@>YuJLi@srRH$B0`#>T9W$MUG(Bg@X|D9?c`hb+e`hpLGT%3f@m$u506 zm=lo N44$rjF6*2Ung9qOa;yLV literal 0 HcmV?d00001 diff --git a/images/email_16.png b/images/email_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2cabb177d7738f49c0f2993234b458016dd6ea16 GIT binary patch literal 608 zcmV-m0-ybfP)dbVG7wVRUJ4ZXi@?ZDjy9FETVQ zFgfRSb zB*`D*%G`Bbq?8mz@hd?^!!Q^O25dGP&gXO8`1yQhv)M2h3@{9X_nJCEQ53a_@B7SV zGcK14m&=9ue2(w?7>4nX3P6`-SwAY6rpb6bCJaLWMxzm?Y1UgSlx6w$3zb2h=WMrI z`u#qZWno!XJ$$`hNz)Y1^B$JTD#87JXT4rC91iP}-qSQq9LFIDf`^keKp2LkY06|W zsgwK-&1REcug7Asz;)fX1WKvbAPDGoy9go3vh1Pdig})Mzu#%KT6mtva=Aon{VHBw uUOu&2t#7y6t^0eKA3;iqlrqk;?CVeXtCdq}03v$;0000dbVG7wVRUJ4ZXi@?ZDjy9FETVQ zFgfL9Ke+nA~Ys>BZDYUUupTH(XEW}69H?R~7K@e=x2wL04 zSFkaOxCWEBVSnzuV-XXwL3TH{ngjPcoHH}(sB%*PW~#N;br}JZfwWzAYP}xdP;jPh`Bmi==8HAy-H3_5b`iTIA9z6HE56>^5?fM{L zXeI`;B*K@KZLF;p0RV?*4*&orh9(xUm{^005g5R5pID%Y2_*3e*8kvx)B9*LruYhO z`y-+|tp)&KF29(r!t-_cU%gkp8>^6TiQ_Za?^lRPuyt|^0C>7Oj_AQK3p5iYKI145 z(L~TBjFshlDueMo=e-UsEadbVG7wVRUJ4ZXi@?ZDjy9FETVQFgfJF(@wVN#TEE{{l}ZItN}K{A1lH>{1Q8*MqRb-S_W=N{R%=fqA`lUD zW=39ko(IqKa&=~gU}g|erh{U!7;no$Jb;bUNMJ zl+5*dy~7TUAz91J(7N5OvMejJcruv)03653)Wa}@P)Z$jkf$r9e*ZzH~X literal 0 HcmV?d00001 diff --git a/images/googletalk_16.png b/images/googletalk_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a003ddf0cd893810cae9d7b1c84218e3c3e0401a GIT binary patch literal 867 zcmV-p1DyPcP)6?8>dbVG7wVRUJ4ZXi@?ZDjy9FETVQFgf3td#xR$SYb(stvf zbkjxDMJfpHLeUl%twJmn7cM0AD{(?F(P|_hWX5FjVlp3@xo_UR_qi|zhAwIkoYndN z&c`2)*!9iSn?kk>5rk9xpAi1dz%KMU*3=EPG}_eqxJC%^T5J#m%(*tTuv9nXn5s>M zq|elh2Y|OcPig)!l|r@#s#}vFwyvE>!#V((>m{aYQ;yLU+=36lQYOtiNz38mJLuk) ztZ6Wu&hYEyyZrNXinYmYxCJm;Bf35x3!+VLP;#gE?noQ^KI&j%y29n*MRJQT8@D!x z`J}s<_uA^Xa{VEvE=&`PZ$jm(I7Tas4(QtxXaC0?oc?WwYa@#Q7{7ulWYJ!c>whQc z-MyJ_KkZ<4zQFHyJ&g8{R+q6_(RW}guc5?QIUUs%sxO(du z!k6%W!aSC&`$LD$Zei zZ#9DezButG$(YN*y`9{+mszPPq}9t_;dL&^{r2aeMHZkT*FO)2+)Qtkl{$A{_M z5O8teC{l*#9~@ipU>UJ-*Qp@7wgrG>YmA@1?&ke1Z&6(Kn0%Z8A=uKMps_x}$mA?1 z28PMxN&u*(1;pDQ{uo4?T5E1j#3OvRZ!^aZrO4)roVhT{o%>lbbHy5+%I9#5F5_47 z$Z%w}5Nl}UgYBF6`TT7LFO5+sdH?zc>w6eoMkKa>H6o$yOXE`TV^<@A6002ovPDHLkV1oPhmKFd2 literal 0 HcmV?d00001 diff --git a/images/komodomedia_azure_16.png b/images/komodomedia_azure_16.png new file mode 100644 index 0000000000000000000000000000000000000000..02b1d8229d1021745a8f132bf62505dbed6c120e GIT binary patch literal 643 zcmV-}0(||6P)6?8>dbVG7wVRUJ4ZXi@?ZDjyAFETeTFgZd4&$$2q0o+MM zK~y-6m6E@2(?A@>KXxoNCJJ%V7Kx>a7(h$}wruUzp#uwLjSxS?0O|%a@Ha4$OiT<6 zL4v6uwIBu>p(+vs5^+@tlm;huNbI|FYz8Y-5sP!uTb}Ow?tR}qjhC-Vm}ZMirp6*? zI{k$2Zy9Jti-J{SwFH`$Za9wN#HkUemO&ULFMqceGC&~@VN^2^0#2O8h9Q{|0t2BS z8$#y?_yR7iLHeG>O{o46>^{Cj zwS1l{C2L;5m*@xyD*SJ~#{F$7#j`YSUB}906EcjFyE6!hj-O=E?GNV!hJm2lA25vL zQ!iCK>nwW0t}DBR__kQ2|I>Z(VR`G0SIh=FPxd!0u+?$6J2WmIU zku@IA-(WCw#rfsc)}z<6XKtFA2QM!jtdBj}%tPPR3?CFs;4|=l7V_ZBp=Bgc^JS%Z z*{URyZ87vTHQ8p1ljR=ox+Uzs+8!dtY&eGtEh@>Rb*albJ;7x;7mwCCJuyOcd6Q?2 zb!@PAkdEfK)MZvgP<42pGv8>V-tg*kn=H%GJiq`3PmaL=0XcY&F##fi6%j-oS?)PB z)MxGc8e@6PvJ{x9_W9Ax_}1FuM7_#-A}lm>%9R?%*`%0U}DEqKI?9U4RJ+8ZnPbo+>Ns3=xd5X}(h@IV-bcpz29gduSVZyQa*LO@)M0Z2uW$f7D(O%+K8 zF7RNZ2t1^TKp_GkS4XPs@HAB0ub*9 z;s8nvW<+r@$WR7``AG7K3|;>hP-Za1h3m1X2?QFxfs&xW<+6TC!}tRZH4iB@_y899 zi9k$NB(k6dMLZIJAuwzUC{J!(|3NOkNUL<*fW(dmrW6C}7z{~P2a!bflWRC5MwTvP zQ~;6}fS4aD@&KBaFCeKA09(qy0HO=ArE|!CT8fQxZw zZ{$prKq!YY;w{}EhEG5W7JT3!&|nALL4g`93!q*;NQA))hzkl#*9SnuRv(KjMk&Zh yazS6l=l~642WYAYfMzZR$_ysE2B8uF2rvM)j9Y|dTPN870000SU z|KIoX=7T=x@tku%_kI7a>wEp~P)!YGLVOy01Oh>*a!)}Ue#fJ~ak1g&9So-x_=Rn* zs;q#xM1N&8e~N`y@Lt?AaDh7}(cc(%Ig>r$MI2WZbw!*xJS-xf8`);8VF(0$l8S=d zBafM1sh&>;HyCO&bik~wu|rZfp^;CiAUPcKRzvs zI~^FZre@E~$T41rj8m%iw=ciQXp_c{e}KWmOR1~RTU4g6Z&qGbhB7w`>_Xv(2L@75 z68!hl|6PMiaE*DMvm#2?`Sa(`@6*$xR#wc*hlPcOGYbmv6cvx1Do~&OQ&Q+UdwN)I z+`tG73}j*^LDoIt=jP_lC@C?Pmt9?5?d|WE*VUyA!L6yOdEx4+@N+0tX7*<)y>WA`CJ{++S+1Cb@)@J)Z`ZTq)%mUeNDkv$f>@Igq zHF*kQU%UQw^A8m+X5EYBD{uY%N9tW{20jWCeD99%fBW_d53fN^Ljz5+sH2jV6`T9- zIXo+?RT0OBhK4k+UcDkgBHyqmN1FcKU3O+Gx-2zWrOMR2$Is7CPD;xB;g_nqI@`mC z4;x%JV&?9+{FBkuaZuFJ*1jubGn7+TCsyEKV{Ofz^zq{;4BEgB=14GMy+r?P)R--xI6CMM)kWf{~Gtdk-Ec>*!EaRaXmo z9j<#V$`TS1mit}$iiwFW{aN%=K0E$paJ8W725G2(c_;2%gB!u-=4P?;a99{VCN?(n zty`pCUS8LQZOL6-T{R62!{Xw|F|n}ZILXbs!YIlrD=jGNN=;h3lZ0%_oW3h@a&w#S zt#oPX>GibuoK1B#RyiGQ>KN8K7!@|t(Mfs5tqrBBW@cuxl7?qa z$J(0GWT^>9^gV^gwGM2Ol9Hsjn5-nYy}i95=H}*>Ufgm0NW1N+axvF+lGCHD$*gRq z^kHQO2Y!5feDs#|{_|VTz<_#aXsE2F#zFU-R^+*?tt~gdQ9}Ss2iC&ELP%Jc`7iy^ zyS~2CO7E_}$;ru~EVwBwOyTS6OA@N^bz&k2784fY3OzmjHAZPVTU%Q`_PM?9JslGh zly(zEZ$d-yU_njo?E3LlX>f6IWuH8uBchiW+ir-Y6MqYm%AD2^d$gnS_NuP{iME`*~nyYWg*&0*OSHRaD$I|#%p8r2g@vW=E~#5@UFom6=!$Qf!%Y}^3%d?KHk;5k-(0cOZox^;Cin?Ee+g1<= zmae|`2sKt9J01@oAEA2l$2D?r%&1W`5`b^HAZo9@%)k!?DXLT55qVmvx5A5 z)1|gIbuV|))GjEUtM#T@{rpm-eQ028FyTs1pK_v5sJ8EWn|ui|F{3|@bl@SFSpcuz&9=DPe!mlPLo@9PVtPGVO}WI8@S`?GU{9Dk(Q`(@|? z!=K;t1pEo%!NiQW&SGFw-BVZZ`rZ@ewEBgjv#TpJBLi{e4FWublb5#>Zj4Sy(Ayc3 z1?!-rr$AKO$R}JqZSqz{ILmRrWfTM0(A8C^&M@M z{QUgt8XK=7zyWdW?d=h=YHHVXiw)UE%+L2%``-zt^sm0{Sk8bk^!D|&ul6UvRDyzH z2nh*2pKqv^BkS%@xaoAfZSZ`di5kRg|B!)A2KBk9s7Q!cN=Am!%*?FLV~-iZBrcxh zwB~)d93&fo1av#^w#wqLQd zw3Ib6GRh*41|fCpCV?s-oo{fn7}c1Wo^Br+(#Vn^BO_~Hb#^*fQ-`^~Audks;NY

Xl?UKA>8!49aWx2^59vx`e;$a-OEOIBG~ znTY+LEXDBNo*w1xO7NbMxq25X39gX2clz=1@tmBTrj#SqAaNK31O(PQ0>Z-8eI)~Y zis{lm@8jdyj}06gN(O%R#L${?fngqPj{k*%+HC3uec*VIW_h9U;DMuy*%4^J(pLqL zNXrQ$rQZQq2$&#rxqw>Qoww+f8n2J$5?K7%ge{(IqX}T8^!z#RMar7&!-r%bm7u6t zIyyQ}>Rw=!l$3b<`|A|36B`>V=y&l7@j5=9(zwZEWX)dW)~&Y<4GoElAM*0pK_vk* z$j(oX+2a&VJP{?ru*DL2Y8xIxcpnNqK{fj@cr+KWU`C&CShKFwUs78SXwg z_=$liFE1~vt%diXyyJ694l@Us)YBb7yLU8cGFb;&hoc~H^&Q)y02XPa`fvM%~b`WO8kX{iiS_9 z(wPx|`TL27hX)fI8x|DAl5@Ss$vztzH*9Qd$~$f8h;RV$l(n@EZDe?4x&b zG67cOfocMOE)c>9_$imPbefdvC*gvkB33}_u*gVuX684tvP48gk2E!5K`<~d;^N|1 zb*)hWc&-3!Ydb%FSZ)H474BGoY{kFw@kw&=B_$=zFDiNm1 zi^^uBcZ_BWJQ?6CC?bL|1ebt{zY~TFLiHwBH32m@N5{_2Ugx}uj|ODK`fP3KlySH+qc-gXFvBmdWVN? zHnnthv7>tA!R*6ZM|--uZg6p_Y*%>`1z(kskpY5O0SzF*4+OI|Pr>g0^5uO@40?s0 zwE8wH?tiPaD^e;0c%G?xMutRo_4IsuM=cZ*vfdR=bsOk;tzl`&)UfI)^573JR^R-* zQ4zngva*EFscU#OpQvcU-2A+qT1U+LloT~6xkoxWig|f?j~+eh)CeqA1n)pc5h^Mw z668ejsIT`V6x`a_kbC@?c4K2>@XIN$dT(bm2V-ULuE!mKt3Z|0a{E~kz$jEl zhkyMsl=gLTXI7RxtNwU1c-BNw$29%am%r!UG&V}EeE*)jT};i$7zGT68XhM8`0-;| zRaGY>7+b0Gt?5b|bTln{V}N)$luzxp_$2!RYr-&Z7GrQuWXYoadH^NXdaOqvz#? zl#8h~L|psXnus5GNdoT|8r;Hzh#7|hJmy<`l0!oF4-N_*q)Q*gQ-msv73!5rR5ryW zB*YdM^A#I4)-1$o*;zp1tqzlbniP3HC99#K0n8^e-fQl1vTwB(aa&3%6`Pnrjg5`X znS-~$#6rsFG_J3hgp91Ci4fR>3IIGMFqe@&~DggaLLgXxU40xH(SH7VP5f`)^M|S8`5HPKST@EJ8;K&y&nLf{*~@e@{W8qd$D00P>iiP7rgL6T7db_FOkT zEG(=S$N;QtRaYNhTRLt9Bws*8q#K^i3?9j8x~l4Set!P#&FA#0s;U9O!5#hm1dT6u zO7_kHg9V^k6F+_wDKwFjlPjyPE*AC4En*o*0W06_iKHKC@$m+>$$$?hO*lF@@GmU1 z%iftTw@`*RVv&-f7qT9Z1?opELHhu5u%mXW9~%dUvct8^TUw#nD&R8C&6_vTkJsN@`|KNgliwu+(C#~}8a7Dl z{*{$N#?4;i`5US9<%TahPZKE|f6Y`ULMTa{R8mk7NV4#_V;sR+qrM6-55;}6?ukSA zkt$$SrS%}H;NhpKg0kYk+|p8$ov6q9`cqjl7s^19$113e!<(b4{LPR5y(~K`etoG?xL^n3#DDDgy9$4)*pi(uZ+& z+wFg5_km44;kD9IR8;gow+I|Z-SNA4GGMk-ie?1ZAKkDDWxnTLh_)Cu)y{nrAAAYd zbp&J?okHDZFh5OAP4tzeA3rc%TwD~Cm01J?NI>TiuYsDsLz`+qVlPVO0Gksr3**F=g(PolO-cVsghhwOs}E+ zV>gcr5+;RK3!MNq65Q)@J_m!Mx2*@RmoH7xOS*rpuU4?B zPa!1OPaMNzYQA_OAT$c5HJYOm+u1}7Ou2Ek)5;+)FTa0ul>46@lm0O=@%l#@Kk2}L zfU(napwef9ABElGhkJW7G*TtBKn0VJS$KHD*&n2-K@(`8*KPlYil9spjNRGE=?1LR zOr;HREO!cpEcCKNe7aLSR|MPD8_;{PP-!wq>+hq?S^ zS?~mn&G|-A^>pb}Fd3^;OZ);7T@@8PNTj1s3rU!aN9C|vW?)(UvlT%)xL8=S$Ir;< z>D7Cp7)uY%O#IG20PPh(7e*tv13o7@IvQF0xHb~jX;9)+I3Buyrn5EnFPxoGHTJU^ zxw+$})NE|I*s)%&I}7yCL^N+NDpmxlY~H8>&=h>JBugjb+cdEQMdh^8i3d&0yYli^ zFaP$)2)L}Np__ZqK&-YH@9BAklfZ9e>pBe!fA2?sT2c}^@)x%_IK6!N3BuBZxBC72 z_JYb{Gdb+s3F|NBb@((kWe?iDut2m;8p_Hz zE^7nr(Jab_)sCRWgps_ET?127Q}wy~C2Ez)$xR&{qd<#U*x9k~Fc72v7~;Fr<``GO zoMT)cT}})>0piY`J4;(z1euyspU+Zaegyp8>tS?)9bSH0m2f0il?onu2^ed4Z%+=; z5u1=E00O!%=}zRZhJFlw*VNQ?lUI9Kl_rxkkS$eQ>++zv0sVkZBI2jlKxC$xy+xs` zW@cp-=y|YawlCbzE#w z2LQ==_APHb1a(ogfG=|tf`tHqMMp6Zy9w@Jg?w(>@{Xm9EKSMb&COB}fr6p_YoB=} zso|^Y=v0sVT;5)2riJRX|KQ>Zi4|caFU2O5mR^~;lj}?$X6ElEKHGZsDb%vDgjt2<< zSXZ^(Bn|zy{7;{7XlZEy9##023Wx9OBLu9zkh^Y-VqIKZ@XfFTGXs31CMT%?8Pz{q z01%>^;7;V?IJ<28{0-k$_+9QldOl5KR059)+`47EyQJpM9mnj_VdCWO-VGv- zc1-KgE%+bW-a&yM=Q#SD9?Cg8R}2uSvPXTeTWpbnhnH1Q3tGrq`u&>-#2PxfEMj7H zBiM@3_X4E6kC(oD;ECXVd4B5l_w+O?CkGQ9J|Np)e+lE44`nHwMsAT^XOeVXe+}&d z>&ey4%`h|+Lo+%;di(;&68d&_t`5hrr7hauV&M`H$O91xI;|)a88uP@o__uM_34Bk zCA5{;p|?(gi|Mwe^gu(S+aHJceOz1s#H{SBtSgXmdj|)*LXa$Fc9Z;TGqA2caGuruM&{W7M5Xh-P23|NhwL@D9kUq4ih__xWU&T5w7g|Jb zWDx*r2*#n=dZ+K$L+LV6(7Q`aOl(7;u0TKwfc(W02aW#q%}sN(WlmReJY0lnMAFj} zLhhfMowb0M69p}lQnPzN^D{Cs+Hy2(uK^~P2+qt*O|^A*D>zkmCjITg0w-LM?=i>*&0H0JOGoMTF-_E2{k9k(S2F1Au1}0Hs>ftnIIrpZEbDa z=1VB+E{)EoMG$Bzn09(|iY>?TwaDq{)X-i6qY&ZFV&mhBXn47^uvDW82RPF+GcgGX z2~!wXJv}`wZEa^PMN^<-ISSoR72{|FNlFCzxCYdJs=US67MgrL-{qJ{n0R@w(M!0tLF3KT)KoKj0Eo10)w$ey@T1oj zoNg#VMgW}^^xU^ZL#k&$tfE=pHqF*UQW~23;FYe>DK<26-<<8|;o{1KRPqfxadqYT zLS9L^^cJ#E`j(Io`eyVA2M!V4`=^9dG&EuB>racG)N5}G3=I(W5Yj1_x{n?Os3(h*69);u7h!~gg_=P(SykhC%@}d*nC#1IQo@$~GJkckf|2^=8Yl;oaOP5FrUS7VwO9VrL W9>#)4tRI})B2*ML6iV)zzWpD=>HUcS literal 0 HcmV?d00001 diff --git a/images/profile.svg b/images/profile.svg new file mode 100644 index 0000000..bb36a2a --- /dev/null +++ b/images/profile.svg @@ -0,0 +1,232 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/images/rss_16.png b/images/rss_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f921046f9cdd1a3c52e2620969d6be299712c5ab GIT binary patch literal 711 zcmV;&0yzDNP)dbVG7wVRUJ4ZXi@?ZDjy9FETVQ zFgf2>@*^pm{)V1x4Nl z;*HW$B_@fR2>ie`0l=5{8SMEK_S+=7YO~+F4a5RT+(4iM7t-JhgSQ(1=X;4y=`pMq z29b_`xG91pt|RDZxb%e~Za~jP0Lr;Jmc|E&`s}|Ut00Lh2)ZDf1D6WA2fFrv;t#|5 z6m<6DluIn#2@`3vn*kp|rUE!{c)ZjF7XM~U7wDF%nJzX6j8gqgt;>_t9d;8dFdl1Ly3HrP64z{ybnK0G={D4#;{ zhjB(`5P)^>03C8Y$_mIEw0sHX3y_~QV7woI(4{1+6%C3eOi!S;YS5QxiXl_Cqz)QH z9+;?u2CU4&^V=vMAM&xQ;DGXK3;=h}+24R_13-@_aJ6@%$Ll{lHCQi~(2myUHIvHP zGTws&e*hfdD=2T0U@h0q4SV@nT_Jw2#Hu|VHJZYCKxgGq2rUz9gqFS1+&ii+4QP)Sx9I1~l1_TO~8dHh*nk3tmV# zx$wKb;wQmYvu0{D`S8aP+o_-}#<89-iHZR$Wt+8?{RA}(lW{OQ1x$ji`lyztF>_%w z!!NIJrx_x`mKm+vJOJO-4PX5*;@Ly{=r6P}Gh$Yvl6^>-m<87@namU?u)90qeqXcF zaR{(A%j`%K3X*Rc6-7b*9y+> zjCuN?M}eS*57B6n@n9)@v72a2SUyD)h6^zh6lMx-l+7w}@rAos>j@`5*<|qEm0L78 zZbqe1<>x98GK84%K{G*(+KfjR3*O!eT$?J#k1TR^WASeShm%B9qZYVW3CFz=G~=6O zG-{|BM_ZZoe!(4|-eBWMhqVK3051Izd4IE}-*!~V7$-;2`S?DnxtY!}{jJHISaRG~ zcKB#JaAw$mz=EG!uosP4G9DQeRLO{H&O0Z=8zi}SgF{brTmM*R_HPUSI_e0c?d#`1fA!dtQgq8jt*2dJ f%KuAQbj$irrU{YGk;9@^00000NkvXXu0mjf*tl=C literal 0 HcmV?d00001 diff --git a/images/tagcloud.png b/images/tagcloud.png new file mode 100644 index 0000000000000000000000000000000000000000..a58e4e941e31d18b49bf81d075dcda3828431783 GIT binary patch literal 1387 zcmV-x1(f=UP)J z``+)}bI;c^q#%;k09C+IpaggwSPKZ40{#KofS-U4W6T^YO(eZ5sYy~$(wO4Qti5Jf z(if6euM~(}Nk2%MkTj#@Wm3{3Nj0w;WV58dBu#7SGAZeMNw2*M5T~Rk)?}7TCMC5= za-` z-@qzXo=gHwz|mOgQO1J*yR6NwM9Bp{1Zrblun?wrId)}cW@btH1VG1PouP#=Yk`y_ z^Tfmib#--|Jb5zib?48Yr?$41d-v|8a+@6B%V>(M1^;J(IUqBc)yK!jxpe6gO-)S% zgF%XliV`^)0)YU5KmeD^g~#Jz)22CFWLT+x{d8=1HuLe3hJL&A~q`bTwuh&aSNy%bvJq?rrfq34m3aA4L;;l3?GD1T` z16QwJB@_zHkFQ&|jw45oP+3`t!{La#Gd(>$_V_#={=i1#HEFIyWJc=ewbNB9D>g(&dapMM(=Eofl2bGnT96EG}_3PIs^In2R(pW0BOE?@R5D4J+`(KLW zWo2cYK7Bgo+$&eEaPHi>h_Sr9JofM3&w&F6$j?uylp4$eez6H$Qugu84EFBb%gviN zxp3jayn7uP8Hqdh@#Du4ZvEiFgH%;jk&}~?>X8cr*Rp_9!25~3Sv*g)d-rb2%gecS z>lXF(^)H!UG$|}BY1PaW;v_N2M->^)ejC1DjW_kXJh2l zi$NUPTh<^V%BgTDs+noJXLN!g*K0$>ZU*?vJQ1KzQTYo6^Vych|m tY$ZEkUqTFwK2#T-hb3F$D150spt5JF}R^O+&JX zY9!~x`mJAh`|y6A-L(VNNJ>gF#k9jDi;SBFvzUU#1~Y|{aXzs2;}0C%^9;i+Tlnk# zD%aQ6@J<+RU1Yd*0m@X3I4m{&7pnI6TIi^i#J$V zy^C|w?TbTWOE7IQi%>Fcj4W+m;@;maQ0NbypjR*8gJbT>Z>Y8e?`8_LC74D`Bjn7W z5?(y^F)JtDAzIrT)(>YAzRKe5&z@QdzLR|;EWaetYdjS%v zX_m%JL1*DHfocSNmwCz413L;Jl#M`V1aW2oz_bMt;2HK3Ki{}Y9UMD%EHTNwu4Ruc z#7HoUB#q>$0wHr{^(HSY@8Y#rUSjX==a}ETiO;|Mj+5Vfzi~t-4zq|ei(a)WQnE

?0y#-U zK~y-)m6N+`R8bIzzd7gJ-RzA~lZ6mbV%!8FLA10G1hr8M3wwiF*w|a?{~*{|C}?YC z;iFJHQM6Ks1T^N^L_$~-v-j@3XU1Ze4Z#p_V7g)E_Zk6s_+$Q2WAMO@nhzMpUL^>v zSTeWXe0*zs?4~^UI&l0gLBv%sv?;UAc zrHo2zE8i8uR#c)HzFwbjg+|R(Q49oTzAZ3){XTc^J*6+Lpk_N;4aLY*DKu)xqEQ+s z;02b}+SJF#Y33!rH@5Ief|&t=s$yM<9FRpLv~_zs;-Hd1no_C3`;W6^g#r*&Id}F1 zA_8h4LR*cHt5KSv23`#f2~ta`IN{w~*`uxs_Gy9hr^kp24kK41WEP1S+EEw{0n!w4 z!k;W6T~EqrOf^O*RI%=CW|5F9MC-IS!;%DQDa}H8cKbNZR*4xnf$tj`T}F5yR|vUj zmx5s`s81m6Cq;PlVV=gJ{T$p^K}33U0vJMWN@zvxA#hk%#6S???W*VX;wD-Ys47=a z4bT`)J7|GcR6?emP?Tn1aAw5wxmlw$!`J%pT@j-RYd+_wwTWFTGgU%vxVCP8z^|g@ z&QzP(&9vt^fC!A%O4dt55Y&v^aKSCkFRe^YayWR4oiNIBmeC)we^R_w2m +

+
+

Blog posts

+
+
+ + +
+ {% for post in site.posts limit: 6 %} + {% capture counter %}{% cycle 'odd', 'even' %}{% endcapture %} + {% include blog-post-list.html %} + {% endfor %} +
diff --git a/resume/index.html b/resume/index.html new file mode 100644 index 0000000..b3d7b85 --- /dev/null +++ b/resume/index.html @@ -0,0 +1,245 @@ +--- +layout: default +title: Resume +--- +

Resume [ want some keywords only? click +this! ]

+ +
+

I am Gergely Polonkai + (sometimes referred to + as W00d5t0ck + or Polesz), a software developer, systems engineer and + administrator. I was born on 7 March, 1983 in Budapest, Hungary. I + spent my life moving here-and-there in the country, and finally + settled in + Budapest. Although + I have already found my mate for life, I + am single yet (living in a common-law + marriage), being the proud father of a son and a daughter.

+

You can reach me on gergely@polonkai.eu, or by phone + on +36 (30) + 7375-706. I fluently speak and + write English + and Hungarian.

+

I have graduated in 2001 + from Táncsics Mihály Szakközépiskola, Szakiskola + és Kollégium, an architecture high school based in + Veszprém, Hungary. There, I learned + about electricity and elevators, while + getting my feet wet in the area of IT systems + engineering. Together with some teachers, we + developed the IT + infrastructure of the school, building it from scratch + with Windows XP based clients, + and Debian GNU/Linux servers + with Squid proxy, an Apache httpd web server, Exim+Courier IMAP + based internal mailing and a Samba file + server. Meanwhile, I have created the school’s + first web + page using Perl CGI, and + later it’s replacement in PHP. + Although I did that as a student, I consider + it my first job. You can contact Imre + Pataki at +36 (20) 970-5830 if you need more + information.

+

My first contract was made in 2002 + with GaTeS Group Kft., a Budapest + based ISP that served Internet connection + to a large warren. I have mastered Linux based firewalling and routing there + using iptables, + and tc for QoS. I have + also created a web page for the company + using PHP and MySQL. The + company went through several merges since then. My only contact + was Ákos Szabó, whose phone number is not reachable any more.

+

After that, I contracted with Webvilág + Kft. in 2004. It was + a web development company, where I was in + the role of both a web developer and a systems administrator. I + have mastered PHP there, together + with MySQL administration. I also + built a small router/firewall out of a PC for office + needs. Although the company has changed its name to Fejlesztők + Háza Kft., you may still contact Péter Bali + at +36 (70) 318-4050.

+

My next job came in 2006, when I + contracted with eWorldCom Kft., a + small VoIP company, developing a call + center software based on Asterisk. My job was to create a small base system + for this software, while managing the old, Ubuntu based ones. For + the new version we targeted Gentoo + Linux because of its possible small size, and performance + reasons. The company since then merged with Virtual Call Center + Kft. You may reach my ex-bosses (Tamás Jalsovszky and Szabolcs + Tóth) there, altough I don’t know any of their new contacts.

+

The job that followed was with Lufthansa + Systems Hungary in 2007, where I + became the member of a large team supporting and administering + several thousand servers, mostly based on Red Hat Enterprise Linux and SUSE Linux Enterprise Server. There I mastered + cluster technologies (Heartbeat 2 + and Red Hat + Cluster), SAN, iSCSI + and NFS based + storages, Apache httpd + and Tomcat web servers, + administration of MySQL and Oracle 10g + Databases, Bacula based + backup, Windows 2003 Server + and Windows Server 2008 (both + standalone and cluster) with Active + Directory, Group + Policy, Microsoft Exchange Server + 2005 and Microsoft SQL Server + 2005, Xen Open Source + virtualization, Citrix XenServer + and XenApp, VMware ESXi + and vSphere, Nagios + monitoring (and monitoring in + general), and last, but not least, Linux + hardening (SELinux, + firewalls of different kinds, fighting application security issues). My boss + was László Kiss-Kalló, who can be reached + on +36 (30) 429-9483.

+

All this knowledge came in very handy, when I went + to Brokernet Group Zrt. + in 2010. The IT infrastructure was in a + very bad shape there, and our job was to rebuild most of it from + scratch. We utilized Debian + GNU/Linux servers (both standalone and Heartbeat 2 clusters), Apache httpd web servers, Exim+Courier IMAP + for mailing, Bacula based + backup, MySQL and PostgreSQL database + servers, Oracle Databases + (both 10g and 11g), Microsoft SQL + Servers (both 2005 and 2008), Windows 2003 Server and Windows Server 2008 (both standalone and + clusters), Active + Directory, Group Policy, + centralised ESET NOD32 + anti-virus, Windows cluster + based file + server with AD backend, WSUS, OTRS::ITSM + helpdesk, Zabbix based monitoring, + virtualization with Citrix + XenServer, IT security solutions with SonicWall appliances, SELinux, Snort + and iptables, Perl for + system administration scripts, and PHP and the Symfony + 2 framework for internal web development. Although much has + changed in this list since then, it was my best experience so + far. You can contact Attila Balogh on +36 + (30) 924-8179.

+

Since I left the company in 2013, I am + working as a freelancer developer and + a systems engineer for + a startup network monitoring company. Here + we are building a help desk system using open source products + like OTRS::ITSM, OpenLDAP, and Zabbix.

+

In my free time, I wander in forests, + take pictures, and sometimes manipulate them with + the GIMP. Sometimes I write short + fantasy or sci-fi novels using LibreOffice. I am also developing some software + in C, whose source code is managed + with Git. When I’m not in the mood + for writing, I go and check out the news on several technical + areas, mostly IT and engineering, or give a try to a new + programming language in the name of “why not?”. Currently I’m + experimenting with Python.

+

As an employee I am looking for firms where can I use and + develop my skills, while getting financial stability through an + interesting job.

+
+ +
+
You can download the latest version of my resume at {{site.url}}/resume.pdf.
+