summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--.htaccess8
-rw-r--r--Gemfile9
-rw-r--r--Makefile7
-rw-r--r--_about.md15
-rw-r--r--_config.yml20
-rw-r--r--_drafts/.keep0
-rw-r--r--_includes/footer.html18
-rw-r--r--_includes/head.html12
-rw-r--r--_includes/header.html27
-rw-r--r--_includes/icon-github.html1
-rw-r--r--_includes/icon-github.svg1
-rw-r--r--_includes/icon-twitter.html1
-rw-r--r--_includes/icon-twitter.svg1
-rw-r--r--_layouts/default.html20
-rw-r--r--_layouts/page.html14
-rw-r--r--_layouts/post.html15
-rw-r--r--_posts/2014-04-18-chirp-und-so.md7
-rw-r--r--_posts/2014-05-02-keepassdroid.md17
-rw-r--r--_posts/2014-06-16-berlicon-11.md61
-rw-r--r--_posts/2014-06-21-urlaub-schon-wieder-vorbei-oo.md10
-rw-r--r--_posts/2014-07-01-microsoft-macht-noip-kaputt.md43
-rw-r--r--_posts/2014-08-29-stichwort-dogecoin.md14
-rw-r--r--_posts/2014-08-29-stickwort-ice-bucket-challenge.md12
-rw-r--r--_posts/2014-08-30-stichwort-steam.md9
-rw-r--r--_posts/2014-11-28-fursuit.md13
-rw-r--r--_posts/2014-12-31-2014-ein-kleiner-rückblick.md62
-rw-r--r--_posts/2015-01-17-cryptocoin-mining.md28
-rw-r--r--_posts/2015-07-31-wieder-da.md10
-rw-r--r--_posts/2015-08-01-landesverrat.md13
-rw-r--r--_posts/2015-08-02-stichwort-e-mail-verschlüsselung.md25
-rw-r--r--_posts/2018-01-18-5-jahre-karriere.md18
-rw-r--r--_posts/2019-01-29-das-blog-ist-zuruck.md32
-rw-r--r--_sass/_base.scss206
-rw-r--r--_sass/_layout.scss242
-rw-r--r--_sass/_normalize.scss425
-rw-r--r--_sass/_syntax-highlighting.scss71
-rw-r--r--css/main.scss53
-rw-r--r--feed.xml30
-rw-r--r--index.html24
-rw-r--r--js/html5shiv.js322
-rw-r--r--js/respond.js353
42 files changed, 2272 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..032fe6c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+/_site/
+Gemfile.lock
+/.sass-cache/
diff --git a/.htaccess b/.htaccess
new file mode 100644
index 0000000..d4cb96c
--- /dev/null
+++ b/.htaccess
@@ -0,0 +1,8 @@
+RewriteEngine On
+RewriteCond %{HTTPS} !on
+#RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]
+RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
+
+Header set Strict-Transport-Security "max-age=604800; includeSubDomains" env=HTTPS
+
+
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..22e379b
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+source "https://rubygems.org"
+
+git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
+
+# gem "rails"
+
+gem "jekyll", "~> 3.8"
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..0b443bb
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,7 @@
+all: development
+
+production:
+ JEKYLL_ENV=production bundle exec jekyll build
+
+development:
+ JEKYLL_ENV=development bundle exec jekyll build
diff --git a/_about.md b/_about.md
new file mode 100644
index 0000000..d0e6de5
--- /dev/null
+++ b/_about.md
@@ -0,0 +1,15 @@
+---
+layout: page
+title: About
+permalink: /about/
+---
+
+This is the base Jekyll theme. You can find out more info about customizing your Jekyll theme, as well as basic Jekyll usage documentation at [jekyllrb.com](http://jekyllrb.com/)
+
+You can find the source code for the Jekyll new theme at:
+{% include icon-github.html username="jglovier" %} /
+[jekyll-new](https://github.com/jglovier/jekyll-new)
+
+You can find the source code for Jekyll at
+{% include icon-github.html username="jekyll" %} /
+[jekyll](https://github.com/jekyll/jekyll)
diff --git a/_config.yml b/_config.yml
new file mode 100644
index 0000000..c4cd0bc
--- /dev/null
+++ b/_config.yml
@@ -0,0 +1,20 @@
+# Welcome to Jekyll!
+#
+# This config file is meant for settings that affect your whole blog, values
+# which you are expected to set up once and rarely need to edit after that.
+# For technical reasons, this file is *NOT* reloaded automatically when you use
+# 'jekyll serve'. If you change this file, please restart the server process.
+
+# Site settings
+title: Uvoks Blog
+description: ""
+baseurl: "" # the subpath of your site, e.g. /blog
+url: "https://blog.uvokchee.de" # the base hostname & protocol for your site
+exclude:
+ - Makefile
+ - Gemfile
+ - Gemfile.lock
+timezone: Europe/Berlin
+
+# Build settings
+markdown: kramdown
diff --git a/_drafts/.keep b/_drafts/.keep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/_drafts/.keep
diff --git a/_includes/footer.html b/_includes/footer.html
new file mode 100644
index 0000000..bc160cb
--- /dev/null
+++ b/_includes/footer.html
@@ -0,0 +1,18 @@
+<footer class="site-footer">
+
+ <div class="wrapper">
+
+ <div class="footer-col-wrapper">
+ <div class="footer-col footer-col-1">
+ </div>
+
+ <div class="footer-col footer-col-2">
+ </div>
+
+ <div class="footer-col footer-col-3">
+ </div>
+ </div>
+
+ </div>
+
+</footer>
diff --git a/_includes/head.html b/_includes/head.html
new file mode 100644
index 0000000..1598d6f
--- /dev/null
+++ b/_includes/head.html
@@ -0,0 +1,12 @@
+<head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <title>{% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %}</title>
+ <meta name="description" content="{% if page.excerpt %}{{ page.excerpt | strip_html | strip_newlines | truncate: 160 }}{% else %}{{ site.description }}{% endif %}">
+
+ <link rel="stylesheet" href="{{ "/css/main.css" | prepend: site.baseurl }}">
+ <link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">
+ <link rel="alternate" type="application/rss+xml" title="{{ site.title }}" href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}">
+</head>
diff --git a/_includes/header.html b/_includes/header.html
new file mode 100644
index 0000000..b3f86db
--- /dev/null
+++ b/_includes/header.html
@@ -0,0 +1,27 @@
+<header class="site-header">
+
+ <div class="wrapper">
+
+ <a class="site-title" href="{{ site.baseurl }}/">{{ site.title }}</a>
+
+ <nav class="site-nav">
+ <a href="#" class="menu-icon">
+ <svg viewBox="0 0 18 15">
+ <path fill="#424242" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
+ <path fill="#424242" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484 h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
+ <path fill="#424242" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
+ </svg>
+ </a>
+
+ <div class="trigger">
+ {% for my_page in site.pages %}
+ {% if my_page.title %}
+ <a class="page-link" href="{{ my_page.url | prepend: site.baseurl }}">{{ my_page.title }}</a>
+ {% endif %}
+ {% endfor %}
+ </div>
+ </nav>
+
+ </div>
+
+</header>
diff --git a/_includes/icon-github.html b/_includes/icon-github.html
new file mode 100644
index 0000000..e501a16
--- /dev/null
+++ b/_includes/icon-github.html
@@ -0,0 +1 @@
+<a href="https://github.com/{{ include.username }}"><span class="icon icon--github">{% include icon-github.svg %}</span><span class="username">{{ include.username }}</span></a>
diff --git a/_includes/icon-github.svg b/_includes/icon-github.svg
new file mode 100644
index 0000000..4422c4f
--- /dev/null
+++ b/_includes/icon-github.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 16 16"><path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/></svg>
diff --git a/_includes/icon-twitter.html b/_includes/icon-twitter.html
new file mode 100644
index 0000000..e623dbd
--- /dev/null
+++ b/_includes/icon-twitter.html
@@ -0,0 +1 @@
+<a href="https://twitter.com/{{ include.username }}"><span class="icon icon--twitter">{% include icon-twitter.svg %}</span><span class="username">{{ include.username }}</span></a>
diff --git a/_includes/icon-twitter.svg b/_includes/icon-twitter.svg
new file mode 100644
index 0000000..dcf660e
--- /dev/null
+++ b/_includes/icon-twitter.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 16 16"><path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/></svg>
diff --git a/_layouts/default.html b/_layouts/default.html
new file mode 100644
index 0000000..e4ab96f
--- /dev/null
+++ b/_layouts/default.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+
+ {% include head.html %}
+
+ <body>
+
+ {% include header.html %}
+
+ <div class="page-content">
+ <div class="wrapper">
+ {{ content }}
+ </div>
+ </div>
+
+ {% include footer.html %}
+
+ </body>
+
+</html>
diff --git a/_layouts/page.html b/_layouts/page.html
new file mode 100644
index 0000000..ce233ad
--- /dev/null
+++ b/_layouts/page.html
@@ -0,0 +1,14 @@
+---
+layout: default
+---
+<article class="post">
+
+ <header class="post-header">
+ <h1 class="post-title">{{ page.title }}</h1>
+ </header>
+
+ <div class="post-content">
+ {{ content }}
+ </div>
+
+</article>
diff --git a/_layouts/post.html b/_layouts/post.html
new file mode 100644
index 0000000..3a0fb52
--- /dev/null
+++ b/_layouts/post.html
@@ -0,0 +1,15 @@
+---
+layout: default
+---
+<article class="post" itemscope itemtype="http://schema.org/BlogPosting">
+
+ <header class="post-header">
+ <h1 class="post-title" itemprop="name headline">{{ page.title }}</h1>
+ <p class="post-meta"><time datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">{{ page.date | date: "%b %-d, %Y" }}</time>{% if page.author %} • <span itemprop="author" itemscope itemtype="http://schema.org/Person"><span itemprop="name">{{ page.author }}</span></span>{% endif %}</p>
+ </header>
+
+ <div class="post-content" itemprop="articleBody">
+ {{ content }}
+ </div>
+
+</article>
diff --git a/_posts/2014-04-18-chirp-und-so.md b/_posts/2014-04-18-chirp-und-so.md
new file mode 100644
index 0000000..06e9f47
--- /dev/null
+++ b/_posts/2014-04-18-chirp-und-so.md
@@ -0,0 +1,7 @@
+---
+title: "Chirp und so"
+layout: post
+---
+
+So ein Blog ist doch was tolles.
+Nur was schreibt man rein? \ No newline at end of file
diff --git a/_posts/2014-05-02-keepassdroid.md b/_posts/2014-05-02-keepassdroid.md
new file mode 100644
index 0000000..760c9ea
--- /dev/null
+++ b/_posts/2014-05-02-keepassdroid.md
@@ -0,0 +1,17 @@
+---
+title: "KeePassDroid - Passwortsafe mobil"
+layout: post
+---
+
+Auch mobil benötige ich meine Passwörter, zumindest einige davon. Auf dem Desktop setze ich KeepassX (bin halt Debian-Nutzer) ein. Den Passwortsafe kann ich dank KeePassDroid auch auf meinem Smartphone öffnen und nutzen.
+
+Eine Autotype-Funktion gibt es soweit ich weiß nicht, wäre aber imho auch gar nicht umzusetzen - dazu müsste die App zum Browser wechseln, was das Android-System wohl kaum zulassen wird. Aber Anzeigen und Kopieren von Passwörtern und Nutzernamen funktioniert. Die Funktion zum Kopieren wird beim Öffnen eines Eintrages sogar in die Notification Area gelegt, sodass man darauf zugreifen kann, während der Browser geöffnet bleibt.
+
+Das einzig nervige ist zugegebenermaßen das Eintippen des ellenlangen Passwortes zum Entschlüsseln der Datenbank. Liegt aber eher an der fipseligen Tastatur.
+
+<ul>
+<li><a href="https://f-droid.org/repository/browse/?fdfilter=keepass&fdid=com.android.keepass">Link F-Droid</a>.</li>
+<li><a href="http://www.keepassdroid.com/">Homepage</a></li>
+</ul>
+
+Für iPhone-Nutzer gibt es übrigens auch diverse Ports, siehe <a href="http://keepass.info/download.html">hier</a>. Dort finden sich auch Ports für Windows 7 Phones, Blackbarrys und J2ME-Handys. Diese konnte ich mangels Hardware aber nicht testen :p \ No newline at end of file
diff --git a/_posts/2014-06-16-berlicon-11.md b/_posts/2014-06-16-berlicon-11.md
new file mode 100644
index 0000000..a2b640d
--- /dev/null
+++ b/_posts/2014-06-16-berlicon-11.md
@@ -0,0 +1,61 @@
+---
+title: "Berlicon 11"
+layout: post
+---
+
+So. Die Berlicon 11 ist vorbei. Und ich bin froh, dabei gewesen zu sein. Als Erinnerungsstütze - vor allem für mich - ist dieser Blogeintrag. Erwartet daher auch bitte keine journalistische Qualität. (Insbesondere angesichts der Uhrzeit)
+
+<p style="font-weight: bold;">Tag 1</p>
+Die Anreise verlief ohne größere Probleme. Letztes Jahr bin ich zwar auch per Fernbus angereist, dieses Jahr waren allerdings keine Vollsperrung oder sonstige größere Verzögerungen auf der Strecke. Nur ein kleiner Stau, der uns um 10 Minuten verzögert hat. Da ich letztes Jahr schon an der Haltestelle ZOB/ICC in Berlin war, wusste ich zumindest ungefähr, wie es da aussieht.
+
+Und ich hätte damals nie gedacht, dass ich das sage, aber: Gott sei Dank habe ich ein Smartphone. So hatte ich sowohl Fahrpläne der BVG als auch eine Übersicht der Haltestellen dabei - auch wenn es kleinere Probleme beim Wechsel von S-Bahn zu Bushaltestelle gab. Auch bin ich froh, einen Rollkoffer zu haben. So eine Tasche zu schleppen wäre mir zu anstrengend.
+
+<img alt="Berlicon-Banner" src="/user/files/bc11/banner.jpg" width="50%">
+
+Also, auf dem Congelände angekommen, erst einmal gewundert, was die vielen kleinen Kinder da machen... Scheinbar war die vorherige Gruppe noch da. Ansonsten das übliche, zur Reg (huch, wo ist die denn geblieben... Ah, weiter in der Mitte des Ganges) und erstmal die Sachen ins Zimmer packen. Anschließend bin ich etwas übers Congelände gedackelt und am Pool verweilt.
+
+Wie man so schön sagt, man lernt nie aus. Schon am ersten Tag habe ich etwas neues gelernt: "Netzhemden machen kleine Kinder schwul". Dies war zumindest sinngemäß die Aussage einer Mutter, die ihr Kind abholte, zu einem teilnehmenden Fur. Man sei doch als Erwachsener ein Vorbild für die Kinder, und wenn man so herumlaufe, mache man doch die Kinder schwul. Ich verkneife mir an dieser Stelle mal einen Kommentar und grinse einfach in mich hinein ;)
+
+Weiterhin habe ich an diesem Abend ein neues Spiel kennengelernt, dass mich zutiefst gefesselt hat: Mahjong (und zwar nicht das PC-Spiel für einen Spieler). Über die Tage hinweg hat sich mehrfach eine Gruppe zusammengefunden, die sich zu viert an einen Tisch setzte. Und es hat immer einen Heidenspaß gemacht (Namensgedächtnis... Mal sehen: Kandril, ich, Nesias, Fafnyr, Kayjay bekomme ich spontan zusammen...)
+
+Oh, außerdem war an dem Abend noch Karaoke angesagt. Ich hab mich an "Broken Wings" gewagt. Es war hoffentlich nicht allzu schlimm...
+
+<p style="font-weight: bold;">Tag 2</p>
+Freitag, der erste "volle" Con-Tag. Was war da los? So richtig weiß ich es auch nicht mehr, größtenteils war ich wohl mit MahJong beschäftigt. Ansonsten waren an dem Tag noch die Suiter-Spiele. An denen ich mangels Suit nur als Zuschauer und Helfer teilgenommen habe,
+
+Weiterhin ist Freitags auf Berlicon (soweit ich mich zurück erinnere) ja immer BBQ-Abend. Und es war der Abend, an dem ich mich das erste verflucht habe, dass ich keine Jacke mitgenommen habe. Also habe ich mir zwei oder drei T-Shirts unter einen - relativ dünnen - Pullover angezogen. Positiv lässt sich jedoch sagen, dass es keine Mückenplage gab. Das BBQ verbrachte ich mit Essen und Gedulds/Kniffelspielen, die jemand mitgebracht hatte.
+<img alt="Ein Würfel" src="/user/files/bc11/cube.jpg" width="70%">
+
+Nach dem BBQ war es Zeit für "Go get it". Tatsächlich hatte sich eine Fünfergruppe (ich verfluche mich gerade wieder für mein schlechtes Namensgedächtnis, Ich (uvok), Meomar, Egnur, Alvord und noch jemand, deren Name mir nicht mehr einfällt) zusammengefunden, nachdem ich mir dachte, dass man dieses Jahr doch mal mitmachen könnte. Nach der Schnitzeljagd war auch das Kältegefühl verschwunden :3 Ein wenig hin- und herrennen wärmt doch unglaublich auf.
+
+<p style="font-weight: bold;">Tag 3</p>
+Wie sich herausstellte, hat unsere Gruppe den 3. Platz belegt - von dreien... Naja, ich muss sagen, ich hätte uns besser eingeschätzt. Da ich in ein Gespräch vertieft war, habe ich nicht gemerkt, dass es mit der Auswertung los ging. Daher weiß ich auch nicht was der Grund war. Aber hey, eine schöne Medaille habe ich trotzdem bekommen :3
+<img alt="Die Medaille" src="/user/files/bc11/medaille.jpg" width="70%">
+
+Nachmittags war dann ein Suitwalk durch den Grunewald angesetzt. Dem habe ich mich angeschlossen. Es ging an einen See, an dem einige Hundebesitzer mit Hunden verweilten. Die die Suiter ziemlich aufmischten.
+Abends war dann wieder PFR angesagt. Und PFR-Essen: Kartoffelsuppe gefolgt von einem wunderbaren gefüllten Schweinefilet. Ich kann gar nicht in Worte fassen, wie sehr mit schon der erste Bissen geschmeckt hat. @.@
+Die Sendung über verbrachte ich jedenfalls - wieder einmal - mit Mahjong.
+
+<p style="font-weight: bold;">Tag 4</p>
+So schnell kann es gehen, dann ist die Con schon vorbei. Abschied nehmen fällt immer schwer. So war am Tag der Abreise für mich nicht mehr viel los, aufstehen, bisschen übers Gelände laufen, frühstücken, noch ein wenig plauschen, Zimmer räumen, weiter plauschen, und dann ging es nach der Verabschiedung auch schon los.
+
+<p style="font-weight: bold;">Abenteuerliche Abreise</p>
+Wie Anfangs schon erwähnt, ist so ein Smartphone schon ein Segen. Nicht jedoch, wenn der Akku leer ist...
+So begab es sich, dass ich mit vom Berlicon-Gelände zum ZOB/ICC eine Busverbindung herausgesucht habe.
+Nur, an der Umsteigehaltestelle angekommen musste ich feststellen, dass die Linie 104 wohl nicht fuhr. Leider auf die schmerzhafte Weise: Warten, bis man merkte, dass der Bus schon 2x nicht kam, und es zu spät war, rechtzeitig am ZOB zu sein. An der Hotline von meinfernbus ging auch keiner ran, obwohl der Fahrschein versprach, dass dort jemand Montag-Sonntag 0-24h erreichbar wäre. :(
+Das Ende vom Lied war, dass ich erst meiner Wut Luft gemacht habe, und dann nochmal zurück zum Congelände bin (dieser Bus fuhr glücklicherweise).
+Also, Akku aufladen, und überlegen. Erst wollte ich schnell noch eine Mitfahrgelegenheit über blablacar organisieren. Zwei Möglichkeiten herausgesucht, keiner ging heran. Na gut, ich hatte sowieso einen großen Rollkoffer dabei, als Gepäckgrenze war bei beiden Mitfahrgelegenheiten auch nur "Reisetasche" angegeben.
+Also, was bleibt einem anderes übrig? In den sauren Apfel beißen, zum Hauptbahnhof (Witzigerweise stellte sich heraus, dass 100m von der Bushaltestelle, an der ich vergeblich gewartet hatte, ein S-Bahnhof war, über den ich zum ZOB gekommen wäre.... Tja, wenn man sich nur auskennen würde...), und ein Ticket für 129 Euro gekauft.
+Nunja, die Zugfahrt verlief vergleichsweise schnell, trotz einer Verspätung von 5 Minuten habe ich den Anschlusszug in Fulda erreicht (da der Anschlusszug ebenfalls Verspätung hatte).
+Nunja, endlich angekommen denkt man sich so schön, "Ins Auto ansteigen, 10km nach Hause, fertig".... Denkste. An dem Tag hatte Murphy wohl was gegen mich. Das Auto sprang nicht an. Kontrollleuchten leuchteten, aber bei der Zündung wimmerte es nur noch. Also, ADAC anrufen, 1h warten. Nochmal Dampf ablassen. Wie sich herausstellte, war die Batterie leer. Na gut, wenn das Auto auch 4 Tage rumsteht. Zu allem Übel musste ich erst einmal 40km fahren, um die Batterie wieder aufzuladen. Als ich nach Hause kam, hatte ich die Schnauze - verständlicherweise ? - gestrichen voll.
+
+Im Nachhinein betrachtet zucke ich aber mit der Schulter und sage mir: "So what?". Die Con war toll, und das ist alles, was zählt.
+
+An dieser Stelle ein riesengroßes <b>Danke</b> an die Orga, aber auch an alle Teilnehmer, die die Con zu dem gemacht hat, was sie war.
+
+<p style="font-weight: bold;">Sonstiges</p>
+Hier noch zwei Bilder vom Congelände. Ich hab mal die Panorama-Funktion meines Smartphones ausprobiert.
+<img alt="IMG_20140613_083326.jpg" src="/user/files/bc11/IMG_20140613_083326.jpg" height="150">
+<img alt="IMG_20140613_083456.jpg" src="/user/files/bc11/IMG_20140613_083456.jpg" height="150">
+
+Weitere Bilder gibt es auf <a href="http://media.furcon.de/BerliCon/BC11/tn">furcon.de</a> zu finden. \ No newline at end of file
diff --git a/_posts/2014-06-21-urlaub-schon-wieder-vorbei-oo.md b/_posts/2014-06-21-urlaub-schon-wieder-vorbei-oo.md
new file mode 100644
index 0000000..8f9ef86
--- /dev/null
+++ b/_posts/2014-06-21-urlaub-schon-wieder-vorbei-oo.md
@@ -0,0 +1,10 @@
+---
+title: "Urlaub - schon wieder vorbei? o.o"
+layout: post
+---
+
+So schnell vergeht die Zeit... letzte Woche um die Zeit war ich noch auf der Berlicon, heute sitze ich zu Hause und wundere mich, was ich letzte Woche gemacht habe.
+
+Von dem, was ich mir vorgenommen habe, habe ich jedenfalls nicht viel umgesetzt. Lediglich das Wohnzimmer habe ich mal etwas aufgeräumt und gestaubsaugt. Schwimmen gehen? In den Wildtierpark? Nichts geworden...
+
+Tja, dann muss ich halt ab Montag wieder so auf Arbeit... \ No newline at end of file
diff --git a/_posts/2014-07-01-microsoft-macht-noip-kaputt.md b/_posts/2014-07-01-microsoft-macht-noip-kaputt.md
new file mode 100644
index 0000000..b05fb35
--- /dev/null
+++ b/_posts/2014-07-01-microsoft-macht-noip-kaputt.md
@@ -0,0 +1,43 @@
+---
+title: "Microsoft macht NoIP kaputt"
+layout: post
+---
+
+Oder: Wenn Micro$ucks das Web zensiert.
+
+Es fing gestern abend schon an. Ich wunderte mich, warum meine Domains nicht erreichar waren
+
+<pre>
+$ nslookup uvok.no-ip.biz
+Server: 192.168.178.1
+Address: 192.168.178.1#53
+
+** server can't find uvok.no-ip.biz: SERVFAIL
+</pre>
+
+Heute Morgen ging es weiter: SSH-Verbindung nach Hause: Nope.
+
+Erst nach einer Weile bekam ich es auf Twitter zu lesen:
+
+Microsoft ist vor Gericht (!) gerannt, und hat erfolgreich (!) geklagt, dass Microsoft jetzt (vorweg: so tief stecke ich im Thema DNS nicht drin) sämtliche/die meisten NoIP-Domains* SELBST (!) auflösen darf, die zuständigen Nameserver werden also zu Microsoft(!) umgeleitet.
+
+(*Ein Dienst, der einen Hostname, der z.B. auf *.no-ip.org endet, sodass man von unterwegs auf das Heimnetzwerk zugreifen kann, da man ja bei jedem einwählen eine neue IP-Adresse bekommt, und einmal am Tag eine Zwangstrennung erfolgt)
+
+Der ursprüngliche Grund war wohl, dass ein oder zwei Domains, die den NoIP-Dienst nutzten, Malware verbreiteten. Microsoft(!) hatte vor(!) nur diese schädlichen Domains nicht aufzulösen, "unschuldige" Domainnamen aber weiterhin korrekt aufzulösen.
+
+<b>UND IST KLÄGLICHST (!!!) GESCHEITERT</b>
+
+Ergebnis ist, dass jetzt (beliebig große Nummer hier einfügen) jetzt nicht erreichbar sind, weil so ein bescheuertes Unternehmen meint, Internetpolizei spielen zu müssen.
+
+Wie gesagt, MS ist vor Gericht gezogen, und hat sich das Recht dort geben lassen! Zensur ahoi.
+Mir ist selbst nicht klar, wie man "einfach" die DNS-Server umleiten kann, so dass Domain Names von einem anderen Server aufgelöst werden...
+Geschweige denn, wie ein US-Gericht (!) das Recht haben kann, das einfach abzunicken.
+
+Weiterführende Berichte:
+
+* <a href="http://heise.de/-2243605">Heise</a>
+* <a href="https://www.noip.com/blog/2014/06/30/ips-formal-statement-microsoft-takedown/">Stellungnahme von NoIP</a>
+* <a href="http://blogs.technet.com/b/microsoft_blog/archive/2014/06/30/microsoft-takes-on-global-cybercrime-epidemic-in-tenth-malware-disruption.aspx">Sinnloses Geschwafel von Microsoft, in dem es sich zu rechtfertigen versucht</a>
+
+
+Inzwischen gibt es zumindest einige Subdomains, die nicht davon betroffen sind... Wie lange der Zustand andauern soll, weiß ich auch nicht.
diff --git a/_posts/2014-08-29-stichwort-dogecoin.md b/_posts/2014-08-29-stichwort-dogecoin.md
new file mode 100644
index 0000000..4793490
--- /dev/null
+++ b/_posts/2014-08-29-stichwort-dogecoin.md
@@ -0,0 +1,14 @@
+---
+title: "Stichwort: Dogecoin"
+layout: post
+---
+
+Ich habe mir vor zwei, drei Wochen mal den DogeCoin-Client zugelegt. Und seitdem gemined, in der Community teilgenommen, und sogar für "echtes Geld" Coins gekauft.
+
+Adresse: DPRaz9CFWdF9gsFELnY6RZscYuwAVHunSy
+
+<img alt="mining.png" src="/user/files/dogecoin/mining.png" width="256" height="256">
+
+Ich muss sagen, sehr nette Community :)
+
+Und ich bin dadurch mal wieder auf reddit.
diff --git a/_posts/2014-08-29-stickwort-ice-bucket-challenge.md b/_posts/2014-08-29-stickwort-ice-bucket-challenge.md
new file mode 100644
index 0000000..012eeb3
--- /dev/null
+++ b/_posts/2014-08-29-stickwort-ice-bucket-challenge.md
@@ -0,0 +1,12 @@
+---
+title: "Stickwort: Ice Bucket Challenge"
+layout: post
+---
+
+Zurzeit im Trend: Die Ice Bucket Challenge.
+Man gießt sich einen Eimer Eiswasser über den Kopf und/oder spendet 100 € / $ / ... zur Erforschung der Nervenkrankheit ALS.
+
+## Kommentare
+
+**Thomas**
+Das ganze war in jedem Fall sehr erfolgreich, zumal auf die Krankheit aufmerksam gemacht wurde und tatsächlich einiges an Spenden für die Forschung zusammen gekommen ist.
diff --git a/_posts/2014-08-30-stichwort-steam.md b/_posts/2014-08-30-stichwort-steam.md
new file mode 100644
index 0000000..b8b6903
--- /dev/null
+++ b/_posts/2014-08-30-stichwort-steam.md
@@ -0,0 +1,9 @@
+---
+title: "Stichwort: Steam"
+layout: post
+---
+
+Ja, ich habe es getan, ich habe mir Steam installiert, für Linux.
+
+Facerig konnte ich unter Linux nicht installieren oder aktvieren, dafür habe ich mir "Dust, an Elysian Tail" gekauft.
+Und suchte es jetzt -.- So sehr, dass ich sogar schon mal das Abendessen vergesse,,, \ No newline at end of file
diff --git a/_posts/2014-11-28-fursuit.md b/_posts/2014-11-28-fursuit.md
new file mode 100644
index 0000000..2b2d03b
--- /dev/null
+++ b/_posts/2014-11-28-fursuit.md
@@ -0,0 +1,13 @@
+---
+title: "Fursuit!"
+layout: post
+---
+
+Ohmeingott, ich hab einen Fursuit! :3
+
+Ein paar Selfie-Fotos hab ich auch schon ^^
+
+<img alt="box2.jpg" src="/user/files/suit/box2.jpg" >
+<img alt="mew2.jpg" src="/user/files/suit/mew2.jpg" >
+
+Der Suit ist von <a href="https://twitter.com/madebymylunee">Made By Mylunee</a> \ No newline at end of file
diff --git a/_posts/2014-12-31-2014-ein-kleiner-rückblick.md b/_posts/2014-12-31-2014-ein-kleiner-rückblick.md
new file mode 100644
index 0000000..d528c41
--- /dev/null
+++ b/_posts/2014-12-31-2014-ein-kleiner-rückblick.md
@@ -0,0 +1,62 @@
+---
+title: "2014 - ein kleiner Rückblick"
+layout: post
+---
+
+So, wieder ein Jahr vorbei. Was ist passiert?
+
+
+
+Dezember 13 / Januar 14: Den Jahreswechsel 2013/14 verbrachte ich, wenn ich mich recht erinnere, (war das dieser Jahreswechsel?) mit Rex, Ryan, Frido und einigen seinen Freunden nahe Bautzen. Ich erinnere mich, dass es *verdammt* kalt war, ich habe regelrecht gezittert. Der Ausblick auf das Bautzener Feuerwerk war aber wunderbar.
+
+
+
+März: Umzug ist angesagt. Ich habe, seit ich Dezember 2013 auf der Suche war, endlich eine Wohnung gefunden. Leider nicht wie gewünscht mit Badewanne ^^. Die Wohnung auf Zeit konnte ich damit freigeben. In der neuen Wohnung habe ich keine Dachschrägen mehr, eine vom Wohnen/Schlafen getrennte Küche und eine Garage! Anfangs schlief ich noch auf einer Matratze auf dem Boden, dann auf einem Lattenrost und am Ende hatte ich endlich ein komplettes Bett. Die Klamotten musste ich trotzdem erst einmal in Pappkisten lagern, einen Kleiderschrank gab es erst einige Monate später. Und wann habe ich nochmal die Waschmaschine gekauft...? Im Juli muss ich sie schon gehabt haben.
+
+
+
+Nach und nach entdecke ich auch meine "Leidenschaft" zum Kochen, die ich durch die eigene Küche nun ja wunderbar ausleben kann! :)
+
+
+
+Juni: Ein Jahr Würzburg! im Juni 2013 hat es mich nach Würzburg verschlagen, 2014 "feiere" ich 1 Jahr Jubiläum.
+
+
+
+Juli: Ich stelle mir einen eigenen PC zusammen! Dabei hatte ich auch Hilfe über Twitter.
+
+
+
+September: Frido kommt zu Besuch. Mein erster Besuch in der neuen Wohnung (von meiner Mutter mal abgesehen). Zum ersten Mal seit einiger Zeit mal wieder ins Kino und "Guardians of the Galaxy" geschaut. Zu zweit macht Kino halt mehr Spaß.
+
+
+
+Oktober: Ende Oktober erleidet meine Oma einen Schlaganfall. Sie kommt ins Krankenhaus.
+
+
+
+November: Ich überlege wieder mal, mit einen Fursuit zuzulegen. Mryia riet mir, mal auf Furbuy nachzuschauen. Und Tatsache, nach einiger Suche habe ich dort einen wunderschönen Schneeleopard-Partial gefunden. Ende November gewinne ich die Auktion - und bekomme ihn in der letzten Novemberwoche!
+
+
+
+Außerdem ist TÜV für das Auto angesagt. Mann, war das teuer. Insbesondere der neue Zahnriemensatz.
+
+
+
+Mitte November kommt meine Oma erst einmal in die Kurzzeitpflege, später ins Pflegeheim. Das Sprachzentrum ist gestört, sie sitzt im Rollstuhl. Besserung ist nicht in Sicht, meine Mutter hat alle Hände voll zu tun, die Wohnung zu räumen (und es wird noch bis in den Januar gehen).
+
+
+
+Dezember: Kekse backen ist angesagt. Wenn ich mich recht erinnere, das erste Mal, dass ich sie komplett alleine backe. Einige werden zu dünn, im Backofen schwarz, und landen im Müll. Insgesamt war es aber eine gute Ausbeute.
+
+
+
+Die letzten Tage nutze ich noch um ein klärendes Gespräch zu führen, um unbeschwert in 2015 starten zu können.
+
+
+
+Und nun sitze ich hier "zu Hause" bei meiner Mutter, schaue fern.und schreibe diesen Blogeintrag.
+
+Ich bin jedenfalls gespannt, was nächstes Jahr kommt.
+
+Allen, die dies hier Leben, einen "Guten Rutsch" ins neue Jahr 2015! \ No newline at end of file
diff --git a/_posts/2015-01-17-cryptocoin-mining.md b/_posts/2015-01-17-cryptocoin-mining.md
new file mode 100644
index 0000000..2cc9f84
--- /dev/null
+++ b/_posts/2015-01-17-cryptocoin-mining.md
@@ -0,0 +1,28 @@
+---
+title: "Cryptocoin mining"
+layout: post
+---
+
+How to mine crypto coins (Dogecoins in this case) on testnet locally? Do this
+
+* Recommended: Create a new data diretory
+* Create the config file in that directory:
+
+ test=1
+ testnet=1
+ daemon=1
+ server=1
+ addnode=testnets.chain.so
+ addnode=suchdig.com
+ addnode=testdoge.lionservers.de
+ addnode=senatorwhiskers.com
+ rpcuser=dogecoinrpc
+ rpcpassword=<password>
+ rpcallowip=192.168.178.0/24
+ rpcallowip=127.0.0.1
+ rpcallowip=192.168.178.22
+
+* Start the wallet (set -datadir)
+* wait for sync
+* Start the miner, or run the waller with the -gen option
+* If using a miner, connect via http://yourip:port/ and enter user credentials (-u / -p in miner)
diff --git a/_posts/2015-07-31-wieder-da.md b/_posts/2015-07-31-wieder-da.md
new file mode 100644
index 0000000..5234924
--- /dev/null
+++ b/_posts/2015-07-31-wieder-da.md
@@ -0,0 +1,10 @@
+---
+title: "Wieder da"
+layout: post
+---
+
+Auch wenn ich Sachen gerne selber in der Hand habe, habe ich mir jetzt ein Webhosting-Paket gemietet, auf dem ich meine Inhalte verteilen kann. Vorteil ist wirklich 24/7-Verfügbarkeit, da sich die IP-Adresse nicht mehr alle 24h ändert. Weiterhin brauche ich mir keine Sorgen machen, dass die Daten bei mit verloren gehen. Im letztem Monat ist mir das Dateisystem von meinem Banana Pi 2x kaputtgegangen, weil die Sicherung flog, während der Banana Pi lief. SD-Karten vertragen das wohl nicht.
+
+Infolge eines solchen Stromausfalls sind aber leider alle Bilder verlorengegangen.
+
+edit: Bilder sind auch wieder da, ich hatte doch noch ein Backup :) \ No newline at end of file
diff --git a/_posts/2015-08-01-landesverrat.md b/_posts/2015-08-01-landesverrat.md
new file mode 100644
index 0000000..68407b8
--- /dev/null
+++ b/_posts/2015-08-01-landesverrat.md
@@ -0,0 +1,13 @@
+---
+title: "Landesverrat?!"
+layout: post
+---
+
+Vor einigen Tagen hat der Generalbundesanwalt Ermittlungen gegen das Blog <a href="https://netzpolitik.org">netzpolitik.org</a> aufgenommen. Der Vorwurf lautet Landesverrat. Ausgelöst hat dies die Veröffentlichung eines Dokuments, das belegt, dass der Nachrichtendienst die Überwachung im Internet ausbauen will (und ein weiteres Dokument). Diese liegt übrigens schon ein knappes halbes Jahr zurück
+
+<ul>
+<li><a href="https://netzpolitik.org/2015/verdacht-des-landesverrats-generalbundesanwalt-ermittelt-doch-auch-gegen-uns-nicht-nur-unsere-quellen/">Artikel auf netzpolitik.org</a></li>
+<li><a href="https://www.tagesschau.de/inland/netzpolitik-ermittlungen-101.html">Artikel auf tagesschau.de</a></li>
+</ul>
+
+Die Welle der Empörung war ziemlich groß, zu Recht. Hier geht es schließlich um die Pressefreiheit. Ganz zu schweigen, dass hier etwas veröffentlicht wurde, was still und heimlich, unbemerkt von der Bevölkerung, durchgesetzt werden sollte, nämlich die Ausweitung der Überwachung aller <del>Terroris</del>Bürger Deutschlands. \ No newline at end of file
diff --git a/_posts/2015-08-02-stichwort-e-mail-verschlüsselung.md b/_posts/2015-08-02-stichwort-e-mail-verschlüsselung.md
new file mode 100644
index 0000000..595ea7e
--- /dev/null
+++ b/_posts/2015-08-02-stichwort-e-mail-verschlüsselung.md
@@ -0,0 +1,25 @@
+---
+title: "Stichwort: E-Mail-Verschlüsselung"
+layout: post
+---
+
+Es folgt ein kleiner (?) Blogpost zum Thema E-Mail-Verschlüsselung.
+
+E-Mails kann man mit Postkarten vergleichen. Der Zusteller kann sie lesen. Im Falle von E-Mail sind das die Mailserver und alle, die darauf Zugriff haben. Daher empfiehlt es sich, E-Mails zu verschlüsseln.
+
+Es gibt 2 populäre Verfahren: PGP und S/MIME. Beide Verfahren erlauben das Verschlüsseln und/oder Signieren von Mails (letzeres stellt sicher, dass die Mail während des Transports nicht manipuliert wurde). Diese beiden Verfahren sind miteinander inkompatibel. Man muss sich also für eines entscheiden.
+
+Unterschiede gibt es einige:
+
+<b>Feststellung der Vertrauenswürdigkeit eines Schlüssels.</b>
+Schhlüssel können gefälscht werden, z.B. unter falschem Namen ausgestellt werden. Daher muss es eine Möglichkeit geben, Schlüssel als vertrauenswürdig zu kennzeichnen.
+Bei S/MIME geschieht das hierarchisch. So genannte "Certification Authorities" (CA) stellen die Schlüssel/Zertifkate aus und beglaubigen/"unterschreiben" diese. Vertraut man der CA, vertraut man damit Schlüsseln/Zertifikaten, die von der CA beglaubigt wurden. Die Prüfung kann auf unterschiedliche Weise erfolgen (es gibt verschiedene Klassen von Zertifikaten). Im einfachsten Fall wird nur geprüft, ob die E-Mail-Adresse existiert und derjenige, der das Zertifikat angefordert hat, Zugriff auf den Mailaccount hat. Höherwertige Zertifikate erfordern eine Identifizierung mit z.B. Personalausweis.
+Bei PGP erfolgt die Ermittlung des Vertrauens über das "Web of Trust", das Vertrauensnetzwerk. Nutzer der Systems legen fest, welchen Schlüsseln sie vertrauen und unterschreiben/beglaubigen diese. Vertraut man (als Benutzer X) dem Schlüssel von Y, und Y vertraut dem Schlüssel von Z, akzeptiert PGP den Schlüssel von Z, auch wenn man diesem Benutzer als X nicht vertraut. (Dies ist etwas vereinfacht, im Detail gibt es da noch Abstufungen)
+
+<b>Software-Unterstützung</b>
+Die Unterstützung für S/MIME ist in gängigen Mail-Clients eingebaut, zumindest was den PC angeht. Mein Android-Smartphone bot standardmäßig keine Möglichkeit für Verschlüsselung. Diese kann nachgerüstet werden, z.B. mit <a href="https://www.ciphermail.com/">cipherMail</a>
+Bei PGP sieht es schon etwas trübe aus, die Unterstützung in Mail-Clients muss durch Plugins nachgerüstet werden, z.B. mit <a href="https://enigmail.net/home/index.php">Enigmail</a> für Thunderbird. Weiterhin wird GnuPG benötigt. Unter Linux kann dies meist über den Paketmanager installiert werden, unter Windows gibt es das Projekt <a href="http://gpg4win.org/">GPG4Win</a>. Unter Android empfehle ich <a href="https://github.com/k9mail/k-9">K9Mail</a> mit z.B. <a href="https://github.com/open-keychain/open-keychain">OpenKeychain</a>. (Von Macs habe ich ehrlich gesagt keine Ahnung).
+
+<b>Kostenpunkt</b>
+S/MIME: 1-Jahres-Zertifikate sind bei einigen Anbietern kostenlos, diese enthalten aber nur E-Mail-Adresse, keinen Namen. Längere Gültigkeit und der Name im Zertifikat sind möglich, das kostet aber. Eine Ausnahme ist <a href="http://cacert.org/">CACert</a>, diesen Zertifikaten wird aber standardmäßig vom Betriebssystem nicht vertraut. Bei S/MIME ist auch die Erstellung eigener, selbstsignierter Zertifikate möglich. In diesem Fall zeigen die meisten (wenn nicht gar alle) E-Mail-Clients eine Warnung an. Eine Liste von CAs gibt es <a href="http://kb.mozillazine.org/Getting_an_SMIME_certificate">hier</a>.
+PGP: Ist Kostenlos, sofern GnuPG verwendet wird. \ No newline at end of file
diff --git a/_posts/2018-01-18-5-jahre-karriere.md b/_posts/2018-01-18-5-jahre-karriere.md
new file mode 100644
index 0000000..7660b3c
--- /dev/null
+++ b/_posts/2018-01-18-5-jahre-karriere.md
@@ -0,0 +1,18 @@
+---
+title: "5 Jahre Firmenjubiläum... Karriere?"
+layout: post
+---
+
+Es ist 2018, und ich bin 29 geworden.
+
+Dieses Jahr habe ich 5-jähriges "Jubiläum" in der Firma, in der ich arbeite. 2013 habe ich in der Firma angefangen; mehr als ein halbes Jahr nach Beendigung des Studiums habe ich eine Stelle bekommen (nach intensiver Suche).
+Mir gefällt es dort... glaube ich. Ich hab ja nur eine Firma, mit der ich vergleichen kann (der Ausbildungsbetrieb im dualen Studium). Unwohl fühle ich mich jedenfalls nicht. Ich habe nette Kollegen und komme auch klar. (Das einzige. was ich auszusetzen hätte, ist die 40-Stunden-Woche, aber das scheint ja "branchenüblich" zu sein).
+
+Ja, ich habe gehört, dass man als Ingenieur alle drei bis fünf Jahre (?) den Arbeitgeber wechseln soll (wechselnde Aufgaben usw.), aber... ich sehe darin mehr Risiken und Arbeit, als es Wert ist. Ein Arbeitgeberwechsel läuft höchstwahrscheinlich auf einen Umzug heraus (ich sehe nicht ein, warum ich mehr als 30 Minuten Arbeitsweg auf mich nehmen soll. Zwei Wohnungen haben find ich ebenso sinnlos. Der Berufsverkehr hier um Würzburg ist schon "heftig" nach meinen Maßstäben, und Stauzeit ist nunmal auch verlorene Zeit). Soziales Umfeld adé; das darf ich mir nochmal neu zusammensuchen. Wo mir das eh schon schwer fällt. Und dann darf ich mir wahrscheinlich auch noch einen neuen Hausarzt und fünf neue Fachärzte suchen.
+Abgesehen davon, weiß ich dann noch gar nicht, wo ich lande, ob es mir in der dann neuen Firma gefällt (Mobbing? Zu hohe Anforderungen?). Wenn nicht, darf ich nochmal eine neue Stelle suchen (juchu...).
+Außerdem nervt mich der Bewerbungsprozess überhaupt (Stellenausschreibungen raussuchen, lesen, wenn's passt -
+ natürlich auf die Ausschreibung superpassendes - Anschreiben verfassen, verschicken, warten, ob man überhaupt eine Antwort bekommt, zum Bewerbungsgespräch, wieder warten ob man eine Antwort bekommt..., und stets von Absagen enttäuscht sein).
+Das nächste ist - ich wüsste nicht mal, wo ich mich bewerben soll. Das trifft sowohl auf die Branche als auch auf die Region in Deutschland zu. Ich weiß nur, dass ich nicht in Großstädte will (sorry Microsoft und Google :p). In der Nähe eines Waldes wohnen hat halt schon seine Vorteile. In kleineren Firmen ist man außerdem "schwerer ersetzbar", auch ein Vorteil.
+Aber, direkt einen "Plan", oder Wunsch, wo ich gerne arbeiten würde, habe ich nicht. Momentan in der Medizintechnik ist der Job zumindest "sinnvoll", man produziert etwas, wovon andere Menschen etwas haben, was ihnen hilft. Im Gegensatz dazu würde ich keine Warenwirtschaftssysteme o.ä. programmieren wollen.
+
+So mach ich mir halt meine Gedanken und komme am Ende immer zum Schluss "Never change a running system". \ No newline at end of file
diff --git a/_posts/2019-01-29-das-blog-ist-zuruck.md b/_posts/2019-01-29-das-blog-ist-zuruck.md
new file mode 100644
index 0000000..449a318
--- /dev/null
+++ b/_posts/2019-01-29-das-blog-ist-zuruck.md
@@ -0,0 +1,32 @@
+---
+title: Das Blog ist zurück
+layout: post
+---
+
+Letztes Jahr wurde ja der Support für PHP5.6 eingestellt, mein Hoster hat da mitgemacht, und standardmäßig auf Version 7 umgestellt. In der Folge hat mein Habari-Blog nicht mehr korrekt funktioniert. Das erste Laden der Seite brachte immer einen Server-Fehler, und in den Admin-Bereich kam ich überhaupt nicht mehr rein.
+
+Da ich selber nicht genug Ahnung von PHP habe, um den Fehler zu beheben (nicht, dass ich es nicht versucht hätte - aber nicht definierte `Error`-Objekte einfach auskommentieren hat nicht zum Ziel geführt), und das Projekt scheinbar nicht mehr gewartet wird, bin ich halt auf [Jekyll](https://jekyllrb.com/) umgestiegen.
+
+Die Migration hab ich mit recht einfach gemacht. Mit [DB Browser for SQLite](https://sqlitebrowser.org/) die `habari__posts`-Tabelle in ein CSV exportiert, das CSV mit [LibreOffice](https://www.libreoffice.org/) Calc geöffnet, mit [einer Frage von StackExchange](https://unix.stackexchange.com/a/421356) die Timestamp zu einem Datum umgewandelt, mit `JJJJ-MM-TT` formatiert, und das ganze dann wieder als CSV abgespeichert, nur mit den Spalten `slug`, `title`, `content` und ebendem Datum, das grade formatiert wurde. Das ganze hab ich dann in ein schnell zusammengewürfeltes Python-Script geworfen:
+
+~~~ python
+import csv
+
+with open('/some/directory/website/blog.uvokchee.de/habari__posts.csv') as f:
+ reader=csv.reader(f)
+ for row in reader:
+ # row[-1] = date, row[0] = slug
+ filename=row[-1] + '-' + row[0] + ".md"
+ print(filename)
+ with open(filename, 'w') as g:
+ g.write('---\n')
+ # row[1] = content
+ g.write('title: "' + row[1] + '"\n')
+ g.write('---\n')
+ g.write('\n')
+ g.write(row[2])
+~~~
+
+Dieses Skript spuckt Markdown-Dateien aus (scheint auch generell mit HTML-Markup zu funktionieren, nur an einigen Stellen musste ich nachbessern und zu Markdown wechseln - speziell ein Code-Block in einer Liste), inklusive dem von Jekyll gewünschten Vorspann.
+
+Sicherlich wär es auch mit dem sqlite-Modul gegangen, da hätte ich mich aber erstmal einlesen müssen. \ No newline at end of file
diff --git a/_sass/_base.scss b/_sass/_base.scss
new file mode 100644
index 0000000..0883c3c
--- /dev/null
+++ b/_sass/_base.scss
@@ -0,0 +1,206 @@
+/**
+ * Reset some basic elements
+ */
+body, h1, h2, h3, h4, h5, h6,
+p, blockquote, pre, hr,
+dl, dd, ol, ul, figure {
+ margin: 0;
+ padding: 0;
+}
+
+
+
+/**
+ * Basic styling
+ */
+body {
+ font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;
+ color: $text-color;
+ background-color: $background-color;
+ -webkit-text-size-adjust: 100%;
+ -webkit-font-feature-settings: "kern" 1;
+ -moz-font-feature-settings: "kern" 1;
+ -o-font-feature-settings: "kern" 1;
+ font-feature-settings: "kern" 1;
+ font-kerning: normal;
+}
+
+
+
+/**
+ * Set `margin-bottom` to maintain vertical rhythm
+ */
+h1, h2, h3, h4, h5, h6,
+p, blockquote, pre,
+ul, ol, dl, figure,
+%vertical-rhythm {
+ margin-bottom: $spacing-unit / 2;
+}
+
+
+
+/**
+ * Images
+ */
+img {
+ max-width: 100%;
+ vertical-align: middle;
+}
+
+
+
+/**
+ * Figures
+ */
+figure > img {
+ display: block;
+}
+
+figcaption {
+ font-size: $small-font-size;
+}
+
+
+
+/**
+ * Lists
+ */
+ul, ol {
+ margin-left: $spacing-unit;
+}
+
+li {
+ > ul,
+ > ol {
+ margin-bottom: 0;
+ }
+}
+
+
+
+/**
+ * Headings
+ */
+h1, h2, h3, h4, h5, h6 {
+ font-weight: $base-font-weight;
+}
+
+
+
+/**
+ * Links
+ */
+a {
+ color: $brand-color;
+ text-decoration: none;
+
+ &:visited {
+ color: darken($brand-color, 15%);
+ }
+
+ &:hover {
+ color: $text-color;
+ text-decoration: underline;
+ }
+}
+
+
+
+/**
+ * Blockquotes
+ */
+blockquote {
+ color: $grey-color;
+ border-left: 4px solid $grey-color-light;
+ padding-left: $spacing-unit / 2;
+ font-size: 18px;
+ letter-spacing: -1px;
+ font-style: italic;
+
+ > :last-child {
+ margin-bottom: 0;
+ }
+}
+
+
+
+/**
+ * Code formatting
+ */
+pre,
+code {
+ font-size: 15px;
+ border: 1px solid $grey-color-light;
+ border-radius: 3px;
+ background-color: #eef;
+}
+
+code {
+ padding: 1px 5px;
+}
+
+pre {
+ padding: 8px 12px;
+ overflow-x: auto;
+
+ > code {
+ border: 0;
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+
+
+
+/**
+ * Wrapper
+ */
+.wrapper {
+ max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit} * 2));
+ max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));
+ margin-right: auto;
+ margin-left: auto;
+ padding-right: $spacing-unit;
+ padding-left: $spacing-unit;
+ @extend %clearfix;
+
+ @include media-query($on-laptop) {
+ max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit}));
+ max-width: calc(#{$content-width} - (#{$spacing-unit}));
+ padding-right: $spacing-unit / 2;
+ padding-left: $spacing-unit / 2;
+ }
+}
+
+
+
+/**
+ * Clearfix
+ */
+%clearfix {
+
+ &:after {
+ content: "";
+ display: table;
+ clear: both;
+ }
+}
+
+
+
+/**
+ * Icons
+ */
+.icon {
+
+ > svg {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ vertical-align: middle;
+
+ path {
+ fill: $grey-color;
+ }
+ }
+}
diff --git a/_sass/_layout.scss b/_sass/_layout.scss
new file mode 100644
index 0000000..9cbfdde
--- /dev/null
+++ b/_sass/_layout.scss
@@ -0,0 +1,242 @@
+/**
+ * Site header
+ */
+.site-header {
+ border-top: 5px solid $grey-color-dark;
+ border-bottom: 1px solid $grey-color-light;
+ min-height: 56px;
+
+ // Positioning context for the mobile navigation icon
+ position: relative;
+}
+
+.site-title {
+ font-size: 26px;
+ font-weight: 300;
+ line-height: 56px;
+ letter-spacing: -1px;
+ margin-bottom: 0;
+ float: left;
+
+ &,
+ &:visited {
+ color: $grey-color-dark;
+ }
+}
+
+.site-nav {
+ float: right;
+ line-height: 56px;
+
+ .menu-icon {
+ display: none;
+ }
+
+ .page-link {
+ color: $text-color;
+ line-height: $base-line-height;
+
+ // Gaps between nav items, but not on the last one
+ &:not(:last-child) {
+ margin-right: 20px;
+ }
+ }
+
+ @include media-query($on-palm) {
+ position: absolute;
+ top: 9px;
+ right: $spacing-unit / 2;
+ background-color: $background-color;
+ border: 1px solid $grey-color-light;
+ border-radius: 5px;
+ text-align: right;
+
+ .menu-icon {
+ display: block;
+ float: right;
+ width: 36px;
+ height: 26px;
+ line-height: 0;
+ padding-top: 10px;
+ text-align: center;
+
+ > svg {
+ width: 18px;
+ height: 15px;
+
+ path {
+ fill: $grey-color-dark;
+ }
+ }
+ }
+
+ .trigger {
+ clear: both;
+ display: none;
+ }
+
+ &:hover .trigger {
+ display: block;
+ padding-bottom: 5px;
+ }
+
+ .page-link {
+ display: block;
+ padding: 5px 10px;
+
+ &:not(:last-child) {
+ margin-right: 0;
+ }
+ margin-left: 20px;
+ }
+ }
+}
+
+
+
+/**
+ * Site footer
+ */
+.site-footer {
+ border-top: 1px solid $grey-color-light;
+ padding: $spacing-unit 0;
+}
+
+.footer-heading {
+ font-size: 18px;
+ margin-bottom: $spacing-unit / 2;
+}
+
+.contact-list,
+.social-media-list {
+ list-style: none;
+ margin-left: 0;
+}
+
+.footer-col-wrapper {
+ font-size: 15px;
+ color: $grey-color;
+ margin-left: -$spacing-unit / 2;
+ @extend %clearfix;
+}
+
+.footer-col {
+ float: left;
+ margin-bottom: $spacing-unit / 2;
+ padding-left: $spacing-unit / 2;
+}
+
+.footer-col-1 {
+ width: -webkit-calc(35% - (#{$spacing-unit} / 2));
+ width: calc(35% - (#{$spacing-unit} / 2));
+}
+
+.footer-col-2 {
+ width: -webkit-calc(20% - (#{$spacing-unit} / 2));
+ width: calc(20% - (#{$spacing-unit} / 2));
+}
+
+.footer-col-3 {
+ width: -webkit-calc(45% - (#{$spacing-unit} / 2));
+ width: calc(45% - (#{$spacing-unit} / 2));
+}
+
+@include media-query($on-laptop) {
+ .footer-col-1,
+ .footer-col-2 {
+ width: -webkit-calc(50% - (#{$spacing-unit} / 2));
+ width: calc(50% - (#{$spacing-unit} / 2));
+ }
+
+ .footer-col-3 {
+ width: -webkit-calc(100% - (#{$spacing-unit} / 2));
+ width: calc(100% - (#{$spacing-unit} / 2));
+ }
+}
+
+@include media-query($on-palm) {
+ .footer-col {
+ float: none;
+ width: -webkit-calc(100% - (#{$spacing-unit} / 2));
+ width: calc(100% - (#{$spacing-unit} / 2));
+ }
+}
+
+
+
+/**
+ * Page content
+ */
+.page-content {
+ padding: $spacing-unit 0;
+}
+
+.page-heading {
+ font-size: 20px;
+}
+
+.post-list {
+ margin-left: 0;
+ list-style: none;
+
+ > li {
+ margin-bottom: $spacing-unit;
+ }
+}
+
+.post-meta {
+ font-size: $small-font-size;
+ color: $grey-color;
+}
+
+.post-link {
+ display: block;
+ font-size: 24px;
+}
+
+
+
+/**
+ * Posts
+ */
+.post-header {
+ margin-bottom: $spacing-unit;
+}
+
+.post-title {
+ font-size: 42px;
+ letter-spacing: -1px;
+ line-height: 1;
+
+ @include media-query($on-laptop) {
+ font-size: 36px;
+ }
+}
+
+.post-content {
+ margin-bottom: $spacing-unit;
+
+ h2 {
+ font-size: 32px;
+
+ @include media-query($on-laptop) {
+ font-size: 28px;
+ }
+ }
+
+ h3 {
+ font-size: 26px;
+
+ @include media-query($on-laptop) {
+ font-size: 22px;
+ }
+ }
+
+ h4 {
+ font-size: 20px;
+
+ @include media-query($on-laptop) {
+ font-size: 18px;
+ }
+ }
+}
diff --git a/_sass/_normalize.scss b/_sass/_normalize.scss
new file mode 100644
index 0000000..08f8950
--- /dev/null
+++ b/_sass/_normalize.scss
@@ -0,0 +1,425 @@
+/*! normalize.css v3.0.1 | MIT License | git.io/normalize */
+
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS text size adjust after orientation change, without disabling
+ * user zoom.
+ */
+
+html {
+ font-family: sans-serif; /* 1 */
+ -ms-text-size-adjust: 100%; /* 2 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove default margin.
+ */
+
+body {
+ margin: 0;
+}
+
+/* HTML5 display definitions
+ ========================================================================== */
+
+/**
+ * Correct `block` display not defined for any HTML5 element in IE 8/9.
+ * Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox.
+ * Correct `block` display not defined for `main` in IE 11.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section,
+summary {
+ display: block;
+}
+
+/**
+ * 1. Correct `inline-block` display not defined in IE 8/9.
+ * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
+ */
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block; /* 1 */
+ vertical-align: baseline; /* 2 */
+}
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+/**
+ * Address `[hidden]` styling not present in IE 8/9/10.
+ * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
+ */
+
+[hidden],
+template {
+ display: none;
+}
+
+/* Links
+ ========================================================================== */
+
+/**
+ * Remove the gray background color from active links in IE 10.
+ */
+
+a {
+ background: transparent;
+}
+
+/**
+ * Improve readability when focused and also mouse hovered in all browsers.
+ */
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+/* Text-level semantics
+ ========================================================================== */
+
+/**
+ * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
+ */
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
+ */
+
+b,
+strong {
+ font-weight: bold;
+}
+
+/**
+ * Address styling not present in Safari and Chrome.
+ */
+
+dfn {
+ font-style: italic;
+}
+
+/**
+ * Address variable `h1` font-size and margin within `section` and `article`
+ * contexts in Firefox 4+, Safari, and Chrome.
+ */
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+
+small {
+ font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+/* Embedded content
+ ========================================================================== */
+
+/**
+ * Remove border when inside `a` element in IE 8/9/10.
+ */
+
+img {
+ border: 0;
+}
+
+/**
+ * Correct overflow not hidden in IE 9/10/11.
+ */
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+/* Grouping content
+ ========================================================================== */
+
+/**
+ * Address margin not present in IE 8/9 and Safari.
+ */
+
+figure {
+ margin: 1em 40px;
+}
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+
+hr {
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+}
+
+/**
+ * Contain overflow in all browsers.
+ */
+
+pre {
+ overflow: auto;
+}
+
+/**
+ * Address odd `em`-unit font size rendering in all browsers.
+ */
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+/* Forms
+ ========================================================================== */
+
+/**
+ * Known limitation: by default, Chrome and Safari on OS X allow very limited
+ * styling of `select`, unless a `border` property is set.
+ */
+
+/**
+ * 1. Correct color not being inherited.
+ * Known issue: affects color of disabled elements.
+ * 2. Correct font properties not being inherited.
+ * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit; /* 1 */
+ font: inherit; /* 2 */
+ margin: 0; /* 3 */
+}
+
+/**
+ * Address `overflow` set to `hidden` in IE 8/9/10/11.
+ */
+
+button {
+ overflow: visible;
+}
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
+ * Correct `select` style inheritance in Firefox.
+ */
+
+button,
+select {
+ text-transform: none;
+}
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ * and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ * `input` and others.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button; /* 2 */
+ cursor: pointer; /* 3 */
+}
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
+ * the UA stylesheet.
+ */
+
+input {
+ line-height: normal;
+}
+
+/**
+ * It's recommended that you don't attempt to style these elements.
+ * Firefox's implementation doesn't respect box-sizing, padding, or width.
+ *
+ * 1. Address box sizing set to `content-box` in IE 8/9/10.
+ * 2. Remove excess padding in IE 8/9/10.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Fix the cursor style for Chrome's increment/decrement buttons. For certain
+ * `font-size` values of the `input`, it causes the cursor style of the
+ * decrement button to change from `default` to `text`.
+ */
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
+ * (include `-moz` to future-proof).
+ */
+
+input[type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ -moz-box-sizing: content-box;
+ -webkit-box-sizing: content-box; /* 2 */
+ box-sizing: content-box;
+}
+
+/**
+ * Remove inner padding and search cancel button in Safari and Chrome on OS X.
+ * Safari (but not Chrome) clips the cancel button when the search input has
+ * padding (and `textfield` appearance).
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9/10/11.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+
+legend {
+ border: 0; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Remove default vertical scrollbar in IE 8/9/10/11.
+ */
+
+textarea {
+ overflow: auto;
+}
+
+/**
+ * Don't inherit the `font-weight` (applied by a rule above).
+ * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
+ */
+
+optgroup {
+ font-weight: bold;
+}
+
+/* Tables
+ ========================================================================== */
+
+/**
+ * Remove most spacing between table cells.
+ */
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+td,
+th {
+ padding: 0;
+}
diff --git a/_sass/_syntax-highlighting.scss b/_sass/_syntax-highlighting.scss
new file mode 100644
index 0000000..8fac597
--- /dev/null
+++ b/_sass/_syntax-highlighting.scss
@@ -0,0 +1,71 @@
+/**
+ * Syntax highlighting styles
+ */
+.highlight {
+ background: #fff;
+ @extend %vertical-rhythm;
+
+ .highlighter-rouge & {
+ background: #eef;
+ }
+
+ .c { color: #998; font-style: italic } // Comment
+ .err { color: #a61717; background-color: #e3d2d2 } // Error
+ .k { font-weight: bold } // Keyword
+ .o { font-weight: bold } // Operator
+ .cm { color: #998; font-style: italic } // Comment.Multiline
+ .cp { color: #999; font-weight: bold } // Comment.Preproc
+ .c1 { color: #998; font-style: italic } // Comment.Single
+ .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special
+ .gd { color: #000; background-color: #fdd } // Generic.Deleted
+ .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific
+ .ge { font-style: italic } // Generic.Emph
+ .gr { color: #a00 } // Generic.Error
+ .gh { color: #999 } // Generic.Heading
+ .gi { color: #000; background-color: #dfd } // Generic.Inserted
+ .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific
+ .go { color: #888 } // Generic.Output
+ .gp { color: #555 } // Generic.Prompt
+ .gs { font-weight: bold } // Generic.Strong
+ .gu { color: #aaa } // Generic.Subheading
+ .gt { color: #a00 } // Generic.Traceback
+ .kc { font-weight: bold } // Keyword.Constant
+ .kd { font-weight: bold } // Keyword.Declaration
+ .kp { font-weight: bold } // Keyword.Pseudo
+ .kr { font-weight: bold } // Keyword.Reserved
+ .kt { color: #458; font-weight: bold } // Keyword.Type
+ .m { color: #099 } // Literal.Number
+ .s { color: #d14 } // Literal.String
+ .na { color: #008080 } // Name.Attribute
+ .nb { color: #0086B3 } // Name.Builtin
+ .nc { color: #458; font-weight: bold } // Name.Class
+ .no { color: #008080 } // Name.Constant
+ .ni { color: #800080 } // Name.Entity
+ .ne { color: #900; font-weight: bold } // Name.Exception
+ .nf { color: #900; font-weight: bold } // Name.Function
+ .nn { color: #555 } // Name.Namespace
+ .nt { color: #000080 } // Name.Tag
+ .nv { color: #008080 } // Name.Variable
+ .ow { font-weight: bold } // Operator.Word
+ .w { color: #bbb } // Text.Whitespace
+ .mf { color: #099 } // Literal.Number.Float
+ .mh { color: #099 } // Literal.Number.Hex
+ .mi { color: #099 } // Literal.Number.Integer
+ .mo { color: #099 } // Literal.Number.Oct
+ .sb { color: #d14 } // Literal.String.Backtick
+ .sc { color: #d14 } // Literal.String.Char
+ .sd { color: #d14 } // Literal.String.Doc
+ .s2 { color: #d14 } // Literal.String.Double
+ .se { color: #d14 } // Literal.String.Escape
+ .sh { color: #d14 } // Literal.String.Heredoc
+ .si { color: #d14 } // Literal.String.Interpol
+ .sx { color: #d14 } // Literal.String.Other
+ .sr { color: #009926 } // Literal.String.Regex
+ .s1 { color: #d14 } // Literal.String.Single
+ .ss { color: #990073 } // Literal.String.Symbol
+ .bp { color: #999 } // Name.Builtin.Pseudo
+ .vc { color: #008080 } // Name.Variable.Class
+ .vg { color: #008080 } // Name.Variable.Global
+ .vi { color: #008080 } // Name.Variable.Instance
+ .il { color: #099 } // Literal.Number.Integer.Long
+}
diff --git a/css/main.scss b/css/main.scss
new file mode 100644
index 0000000..f2e566e
--- /dev/null
+++ b/css/main.scss
@@ -0,0 +1,53 @@
+---
+# Only the main Sass file needs front matter (the dashes are enough)
+---
+@charset "utf-8";
+
+
+
+// Our variables
+$base-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+$base-font-size: 16px;
+$base-font-weight: 400;
+$small-font-size: $base-font-size * 0.875;
+$base-line-height: 1.5;
+
+$spacing-unit: 30px;
+
+$text-color: #111;
+$background-color: #fdfdfd;
+$brand-color: #2a7ae2;
+
+$grey-color: #828282;
+$grey-color-light: lighten($grey-color, 40%);
+$grey-color-dark: darken($grey-color, 25%);
+
+// Width of the content area
+$content-width: 800px;
+
+$on-palm: 600px;
+$on-laptop: 800px;
+
+
+
+// Use media queries like this:
+// @include media-query($on-palm) {
+// .wrapper {
+// padding-right: $spacing-unit / 2;
+// padding-left: $spacing-unit / 2;
+// }
+// }
+@mixin media-query($device) {
+ @media screen and (max-width: $device) {
+ @content;
+ }
+}
+
+
+
+// Import partials from `sass_dir` (defaults to `_sass`)
+@import
+ "base",
+ "layout",
+ "syntax-highlighting"
+;
diff --git a/feed.xml b/feed.xml
new file mode 100644
index 0000000..a6628bd
--- /dev/null
+++ b/feed.xml
@@ -0,0 +1,30 @@
+---
+layout: null
+---
+<?xml version="1.0" encoding="UTF-8"?>
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+ <channel>
+ <title>{{ site.title | xml_escape }}</title>
+ <description>{{ site.description | xml_escape }}</description>
+ <link>{{ site.url }}{{ site.baseurl }}/</link>
+ <atom:link href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}" rel="self" type="application/rss+xml"/>
+ <pubDate>{{ site.time | date_to_rfc822 }}</pubDate>
+ <lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate>
+ <generator>Jekyll v{{ jekyll.version }}</generator>
+ {% for post in site.posts limit:10 %}
+ <item>
+ <title>{{ post.title | xml_escape }}</title>
+ <description>{{ post.content | xml_escape }}</description>
+ <pubDate>{{ post.date | date_to_rfc822 }}</pubDate>
+ <link>{{ post.url | prepend: site.baseurl | prepend: site.url }}</link>
+ <guid isPermaLink="true">{{ post.url | prepend: site.baseurl | prepend: site.url }}</guid>
+ {% for tag in post.tags %}
+ <category>{{ tag | xml_escape }}</category>
+ {% endfor %}
+ {% for cat in post.categories %}
+ <category>{{ cat | xml_escape }}</category>
+ {% endfor %}
+ </item>
+ {% endfor %}
+ </channel>
+</rss>
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..8e063b3
--- /dev/null
+++ b/index.html
@@ -0,0 +1,24 @@
+---
+layout: default
+---
+
+<div class="home">
+
+ <ul class="post-list">
+ {% for post in site.posts %}
+ <li>
+ <span class="post-meta">{{ post.date | date: "%b %-d, %Y" }}</span>
+ <h2>
+ <a class="post-link" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a>
+ </h2>
+ {% if post == site.posts[0] %}
+ <div>{{ post.content }}</div>
+ {% endif %}
+
+ </li>
+ {% endfor %}
+ </ul>
+
+ <p class="rss-subscribe">subscribe <a href="{{ "/feed.xml" | prepend: site.baseurl }}">via RSS</a></p>
+
+</div>
diff --git a/js/html5shiv.js b/js/html5shiv.js
new file mode 100644
index 0000000..77dace4
--- /dev/null
+++ b/js/html5shiv.js
@@ -0,0 +1,322 @@
+/**
+* @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
+*/
+;(function(window, document) {
+/*jshint evil:true */
+ /** version */
+ var version = '3.7.2';
+
+ /** Preset options */
+ var options = window.html5 || {};
+
+ /** Used to skip problem elements */
+ var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
+
+ /** Not all elements can be cloned in IE **/
+ var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;
+
+ /** Detect whether the browser supports default html5 styles */
+ var supportsHtml5Styles;
+
+ /** Name of the expando, to work with multiple documents or to re-shiv one document */
+ var expando = '_html5shiv';
+
+ /** The id for the the documents expando */
+ var expanID = 0;
+
+ /** Cached data for each document */
+ var expandoData = {};
+
+ /** Detect whether the browser supports unknown elements */
+ var supportsUnknownElements;
+
+ (function() {
+ try {
+ var a = document.createElement('a');
+ a.innerHTML = '<xyz></xyz>';
+ //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles
+ supportsHtml5Styles = ('hidden' in a);
+
+ supportsUnknownElements = a.childNodes.length == 1 || (function() {
+ // assign a false positive if unable to shiv
+ (document.createElement)('a');
+ var frag = document.createDocumentFragment();
+ return (
+ typeof frag.cloneNode == 'undefined' ||
+ typeof frag.createDocumentFragment == 'undefined' ||
+ typeof frag.createElement == 'undefined'
+ );
+ }());
+ } catch(e) {
+ // assign a false positive if detection fails => unable to shiv
+ supportsHtml5Styles = true;
+ supportsUnknownElements = true;
+ }
+
+ }());
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * Creates a style sheet with the given CSS text and adds it to the document.
+ * @private
+ * @param {Document} ownerDocument The document.
+ * @param {String} cssText The CSS text.
+ * @returns {StyleSheet} The style element.
+ */
+ function addStyleSheet(ownerDocument, cssText) {
+ var p = ownerDocument.createElement('p'),
+ parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;
+
+ p.innerHTML = 'x<style>' + cssText + '</style>';
+ return parent.insertBefore(p.lastChild, parent.firstChild);
+ }
+
+ /**
+ * Returns the value of `html5.elements` as an array.
+ * @private
+ * @returns {Array} An array of shived element node names.
+ */
+ function getElements() {
+ var elements = html5.elements;
+ return typeof elements == 'string' ? elements.split(' ') : elements;
+ }
+
+ /**
+ * Extends the built-in list of html5 elements
+ * @memberOf html5
+ * @param {String|Array} newElements whitespace separated list or array of new element names to shiv
+ * @param {Document} ownerDocument The context document.
+ */
+ function addElements(newElements, ownerDocument) {
+ var elements = html5.elements;
+ if(typeof elements != 'string'){
+ elements = elements.join(' ');
+ }
+ if(typeof newElements != 'string'){
+ newElements = newElements.join(' ');
+ }
+ html5.elements = elements +' '+ newElements;
+ shivDocument(ownerDocument);
+ }
+
+ /**
+ * Returns the data associated to the given document
+ * @private
+ * @param {Document} ownerDocument The document.
+ * @returns {Object} An object of data.
+ */
+ function getExpandoData(ownerDocument) {
+ var data = expandoData[ownerDocument[expando]];
+ if (!data) {
+ data = {};
+ expanID++;
+ ownerDocument[expando] = expanID;
+ expandoData[expanID] = data;
+ }
+ return data;
+ }
+
+ /**
+ * returns a shived element for the given nodeName and document
+ * @memberOf html5
+ * @param {String} nodeName name of the element
+ * @param {Document} ownerDocument The context document.
+ * @returns {Object} The shived element.
+ */
+ function createElement(nodeName, ownerDocument, data){
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ if(supportsUnknownElements){
+ return ownerDocument.createElement(nodeName);
+ }
+ if (!data) {
+ data = getExpandoData(ownerDocument);
+ }
+ var node;
+
+ if (data.cache[nodeName]) {
+ node = data.cache[nodeName].cloneNode();
+ } else if (saveClones.test(nodeName)) {
+ node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
+ } else {
+ node = data.createElem(nodeName);
+ }
+
+ // Avoid adding some elements to fragments in IE < 9 because
+ // * Attributes like `name` or `type` cannot be set/changed once an element
+ // is inserted into a document/fragment
+ // * Link elements with `src` attributes that are inaccessible, as with
+ // a 403 response, will cause the tab/window to crash
+ // * Script elements appended to fragments will execute when their `src`
+ // or `text` property is set
+ return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;
+ }
+
+ /**
+ * returns a shived DocumentFragment for the given document
+ * @memberOf html5
+ * @param {Document} ownerDocument The context document.
+ * @returns {Object} The shived DocumentFragment.
+ */
+ function createDocumentFragment(ownerDocument, data){
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ if(supportsUnknownElements){
+ return ownerDocument.createDocumentFragment();
+ }
+ data = data || getExpandoData(ownerDocument);
+ var clone = data.frag.cloneNode(),
+ i = 0,
+ elems = getElements(),
+ l = elems.length;
+ for(;i<l;i++){
+ clone.createElement(elems[i]);
+ }
+ return clone;
+ }
+
+ /**
+ * Shivs the `createElement` and `createDocumentFragment` methods of the document.
+ * @private
+ * @param {Document|DocumentFragment} ownerDocument The document.
+ * @param {Object} data of the document.
+ */
+ function shivMethods(ownerDocument, data) {
+ if (!data.cache) {
+ data.cache = {};
+ data.createElem = ownerDocument.createElement;
+ data.createFrag = ownerDocument.createDocumentFragment;
+ data.frag = data.createFrag();
+ }
+
+
+ ownerDocument.createElement = function(nodeName) {
+ //abort shiv
+ if (!html5.shivMethods) {
+ return data.createElem(nodeName);
+ }
+ return createElement(nodeName, ownerDocument, data);
+ };
+
+ ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +
+ 'var n=f.cloneNode(),c=n.createElement;' +
+ 'h.shivMethods&&(' +
+ // unroll the `createElement` calls
+ getElements().join().replace(/[\w\-:]+/g, function(nodeName) {
+ data.createElem(nodeName);
+ data.frag.createElement(nodeName);
+ return 'c("' + nodeName + '")';
+ }) +
+ ');return n}'
+ )(html5, data.frag);
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * Shivs the given document.
+ * @memberOf html5
+ * @param {Document} ownerDocument The document to shiv.
+ * @returns {Document} The shived document.
+ */
+ function shivDocument(ownerDocument) {
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ var data = getExpandoData(ownerDocument);
+
+ if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {
+ data.hasCSS = !!addStyleSheet(ownerDocument,
+ // corrects block display not defined in IE6/7/8/9
+ 'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' +
+ // adds styling not present in IE6/7/8/9
+ 'mark{background:#FF0;color:#000}' +
+ // hides non-rendered elements
+ 'template{display:none}'
+ );
+ }
+ if (!supportsUnknownElements) {
+ shivMethods(ownerDocument, data);
+ }
+ return ownerDocument;
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * The `html5` object is exposed so that more elements can be shived and
+ * existing shiving can be detected on iframes.
+ * @type Object
+ * @example
+ *
+ * // options can be changed before the script is included
+ * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };
+ */
+ var html5 = {
+
+ /**
+ * An array or space separated string of node names of the elements to shiv.
+ * @memberOf html5
+ * @type Array|String
+ */
+ 'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video',
+
+ /**
+ * current version of html5shiv
+ */
+ 'version': version,
+
+ /**
+ * A flag to indicate that the HTML5 style sheet should be inserted.
+ * @memberOf html5
+ * @type Boolean
+ */
+ 'shivCSS': (options.shivCSS !== false),
+
+ /**
+ * Is equal to true if a browser supports creating unknown/HTML5 elements
+ * @memberOf html5
+ * @type boolean
+ */
+ 'supportsUnknownElements': supportsUnknownElements,
+
+ /**
+ * A flag to indicate that the document's `createElement` and `createDocumentFragment`
+ * methods should be overwritten.
+ * @memberOf html5
+ * @type Boolean
+ */
+ 'shivMethods': (options.shivMethods !== false),
+
+ /**
+ * A string to describe the type of `html5` object ("default" or "default print").
+ * @memberOf html5
+ * @type String
+ */
+ 'type': 'default',
+
+ // shivs the document according to the specified `html5` object options
+ 'shivDocument': shivDocument,
+
+ //creates a shived element
+ createElement: createElement,
+
+ //creates a shived documentFragment
+ createDocumentFragment: createDocumentFragment,
+
+ //extends list of elements
+ addElements: addElements
+ };
+
+ /*--------------------------------------------------------------------------*/
+
+ // expose html5
+ window.html5 = html5;
+
+ // shiv the document
+ shivDocument(document);
+
+}(this, document));
diff --git a/js/respond.js b/js/respond.js
new file mode 100644
index 0000000..58883e4
--- /dev/null
+++ b/js/respond.js
@@ -0,0 +1,353 @@
+/* Respond.js: min/max-width media query polyfill. (c) Scott Jehl. MIT Lic. j.mp/respondjs */
+(function( w ){
+
+ "use strict";
+
+ //exposed namespace
+ var respond = {};
+ w.respond = respond;
+
+ //define update even in native-mq-supporting browsers, to avoid errors
+ respond.update = function(){};
+
+ //define ajax obj
+ var requestQueue = [],
+ xmlHttp = (function() {
+ var xmlhttpmethod = false;
+ try {
+ xmlhttpmethod = new w.XMLHttpRequest();
+ }
+ catch( e ){
+ xmlhttpmethod = new w.ActiveXObject( "Microsoft.XMLHTTP" );
+ }
+ return function(){
+ return xmlhttpmethod;
+ };
+ })(),
+
+ //tweaked Ajax functions from Quirksmode
+ ajax = function( url, callback ) {
+ var req = xmlHttp();
+ if (!req){
+ return;
+ }
+ req.open( "GET", url, true );
+ req.onreadystatechange = function () {
+ if ( req.readyState !== 4 || req.status !== 200 && req.status !== 304 ){
+ return;
+ }
+ callback( req.responseText );
+ };
+ if ( req.readyState === 4 ){
+ return;
+ }
+ req.send( null );
+ },
+ isUnsupportedMediaQuery = function( query ) {
+ return query.replace( respond.regex.minmaxwh, '' ).match( respond.regex.other );
+ };
+
+ //expose for testing
+ respond.ajax = ajax;
+ respond.queue = requestQueue;
+ respond.unsupportedmq = isUnsupportedMediaQuery;
+ respond.regex = {
+ media: /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,
+ keyframes: /@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,
+ comments: /\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,
+ urls: /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,
+ findStyles: /@media *([^\{]+)\{([\S\s]+?)$/,
+ only: /(only\s+)?([a-zA-Z]+)\s?/,
+ minw: /\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,
+ maxw: /\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,
+ minmaxwh: /\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,
+ other: /\([^\)]*\)/g
+ };
+
+ //expose media query support flag for external use
+ respond.mediaQueriesSupported = w.matchMedia && w.matchMedia( "only all" ) !== null && w.matchMedia( "only all" ).matches;
+
+ //if media queries are supported, exit here
+ if( respond.mediaQueriesSupported ){
+ return;
+ }
+
+ //define vars
+ var doc = w.document,
+ docElem = doc.documentElement,
+ mediastyles = [],
+ rules = [],
+ appendedEls = [],
+ parsedSheets = {},
+ resizeThrottle = 30,
+ head = doc.getElementsByTagName( "head" )[0] || docElem,
+ base = doc.getElementsByTagName( "base" )[0],
+ links = head.getElementsByTagName( "link" ),
+
+ lastCall,
+ resizeDefer,
+
+ //cached container for 1em value, populated the first time it's needed
+ eminpx,
+
+ // returns the value of 1em in pixels
+ getEmValue = function() {
+ var ret,
+ div = doc.createElement('div'),
+ body = doc.body,
+ originalHTMLFontSize = docElem.style.fontSize,
+ originalBodyFontSize = body && body.style.fontSize,
+ fakeUsed = false;
+
+ div.style.cssText = "position:absolute;font-size:1em;width:1em";
+
+ if( !body ){
+ body = fakeUsed = doc.createElement( "body" );
+ body.style.background = "none";
+ }
+
+ // 1em in a media query is the value of the default font size of the browser
+ // reset docElem and body to ensure the correct value is returned
+ docElem.style.fontSize = "100%";
+ body.style.fontSize = "100%";
+
+ body.appendChild( div );
+
+ if( fakeUsed ){
+ docElem.insertBefore( body, docElem.firstChild );
+ }
+
+ ret = div.offsetWidth;
+
+ if( fakeUsed ){
+ docElem.removeChild( body );
+ }
+ else {
+ body.removeChild( div );
+ }
+
+ // restore the original values
+ docElem.style.fontSize = originalHTMLFontSize;
+ if( originalBodyFontSize ) {
+ body.style.fontSize = originalBodyFontSize;
+ }
+
+
+ //also update eminpx before returning
+ ret = eminpx = parseFloat(ret);
+
+ return ret;
+ },
+
+ //enable/disable styles
+ applyMedia = function( fromResize ){
+ var name = "clientWidth",
+ docElemProp = docElem[ name ],
+ currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[ name ] || docElemProp,
+ styleBlocks = {},
+ lastLink = links[ links.length-1 ],
+ now = (new Date()).getTime();
+
+ //throttle resize calls
+ if( fromResize && lastCall && now - lastCall < resizeThrottle ){
+ w.clearTimeout( resizeDefer );
+ resizeDefer = w.setTimeout( applyMedia, resizeThrottle );
+ return;
+ }
+ else {
+ lastCall = now;
+ }
+
+ for( var i in mediastyles ){
+ if( mediastyles.hasOwnProperty( i ) ){
+ var thisstyle = mediastyles[ i ],
+ min = thisstyle.minw,
+ max = thisstyle.maxw,
+ minnull = min === null,
+ maxnull = max === null,
+ em = "em";
+
+ if( !!min ){
+ min = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );
+ }
+ if( !!max ){
+ max = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );
+ }
+
+ // if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true
+ if( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){
+ if( !styleBlocks[ thisstyle.media ] ){
+ styleBlocks[ thisstyle.media ] = [];
+ }
+ styleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] );
+ }
+ }
+ }
+
+ //remove any existing respond style element(s)
+ for( var j in appendedEls ){
+ if( appendedEls.hasOwnProperty( j ) ){
+ if( appendedEls[ j ] && appendedEls[ j ].parentNode === head ){
+ head.removeChild( appendedEls[ j ] );
+ }
+ }
+ }
+ appendedEls.length = 0;
+
+ //inject active styles, grouped by media type
+ for( var k in styleBlocks ){
+ if( styleBlocks.hasOwnProperty( k ) ){
+ var ss = doc.createElement( "style" ),
+ css = styleBlocks[ k ].join( "\n" );
+
+ ss.type = "text/css";
+ ss.media = k;
+
+ //originally, ss was appended to a documentFragment and sheets were appended in bulk.
+ //this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one!
+ head.insertBefore( ss, lastLink.nextSibling );
+
+ if ( ss.styleSheet ){
+ ss.styleSheet.cssText = css;
+ }
+ else {
+ ss.appendChild( doc.createTextNode( css ) );
+ }
+
+ //push to appendedEls to track for later removal
+ appendedEls.push( ss );
+ }
+ }
+ },
+ //find media blocks in css text, convert to style blocks
+ translate = function( styles, href, media ){
+ var qs = styles.replace( respond.regex.comments, '' )
+ .replace( respond.regex.keyframes, '' )
+ .match( respond.regex.media ),
+ ql = qs && qs.length || 0;
+
+ //try to get CSS path
+ href = href.substring( 0, href.lastIndexOf( "/" ) );
+
+ var repUrls = function( css ){
+ return css.replace( respond.regex.urls, "$1" + href + "$2$3" );
+ },
+ useMedia = !ql && media;
+
+ //if path exists, tack on trailing slash
+ if( href.length ){ href += "/"; }
+
+ //if no internal queries exist, but media attr does, use that
+ //note: this currently lacks support for situations where a media attr is specified on a link AND
+ //its associated stylesheet has internal CSS media queries.
+ //In those cases, the media attribute will currently be ignored.
+ if( useMedia ){
+ ql = 1;
+ }
+
+ for( var i = 0; i < ql; i++ ){
+ var fullq, thisq, eachq, eql;
+
+ //media attr
+ if( useMedia ){
+ fullq = media;
+ rules.push( repUrls( styles ) );
+ }
+ //parse for styles
+ else{
+ fullq = qs[ i ].match( respond.regex.findStyles ) && RegExp.$1;
+ rules.push( RegExp.$2 && repUrls( RegExp.$2 ) );
+ }
+
+ eachq = fullq.split( "," );
+ eql = eachq.length;
+
+ for( var j = 0; j < eql; j++ ){
+ thisq = eachq[ j ];
+
+ if( isUnsupportedMediaQuery( thisq ) ) {
+ continue;
+ }
+
+ mediastyles.push( {
+ media : thisq.split( "(" )[ 0 ].match( respond.regex.only ) && RegExp.$2 || "all",
+ rules : rules.length - 1,
+ hasquery : thisq.indexOf("(") > -1,
+ minw : thisq.match( respond.regex.minw ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ),
+ maxw : thisq.match( respond.regex.maxw ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" )
+ } );
+ }
+ }
+
+ applyMedia();
+ },
+
+ //recurse through request queue, get css text
+ makeRequests = function(){
+ if( requestQueue.length ){
+ var thisRequest = requestQueue.shift();
+
+ ajax( thisRequest.href, function( styles ){
+ translate( styles, thisRequest.href, thisRequest.media );
+ parsedSheets[ thisRequest.href ] = true;
+
+ // by wrapping recursive function call in setTimeout
+ // we prevent "Stack overflow" error in IE7
+ w.setTimeout(function(){ makeRequests(); },0);
+ } );
+ }
+ },
+
+ //loop stylesheets, send text content to translate
+ ripCSS = function(){
+
+ for( var i = 0; i < links.length; i++ ){
+ var sheet = links[ i ],
+ href = sheet.href,
+ media = sheet.media,
+ isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet";
+
+ //only links plz and prevent re-parsing
+ if( !!href && isCSS && !parsedSheets[ href ] ){
+ // selectivizr exposes css through the rawCssText expando
+ if (sheet.styleSheet && sheet.styleSheet.rawCssText) {
+ translate( sheet.styleSheet.rawCssText, href, media );
+ parsedSheets[ href ] = true;
+ } else {
+ if( (!/^([a-zA-Z:]*\/\/)/.test( href ) && !base) ||
+ href.replace( RegExp.$1, "" ).split( "/" )[0] === w.location.host ){
+ // IE7 doesn't handle urls that start with '//' for ajax request
+ // manually add in the protocol
+ if ( href.substring(0,2) === "//" ) { href = w.location.protocol + href; }
+ requestQueue.push( {
+ href: href,
+ media: media
+ } );
+ }
+ }
+ }
+ }
+ makeRequests();
+ };
+
+ //translate CSS
+ ripCSS();
+
+ //expose update for re-running respond later on
+ respond.update = ripCSS;
+
+ //expose getEmValue
+ respond.getEmValue = getEmValue;
+
+ //adjust on resize
+ function callMedia(){
+ applyMedia( true );
+ }
+
+ if( w.addEventListener ){
+ w.addEventListener( "resize", callMedia, false );
+ }
+ else if( w.attachEvent ){
+ w.attachEvent( "onresize", callMedia );
+ }
+})(this);