Was ich so treibe...

Uli's IT-Blog - Konzeption, Entwicklung, Betrieb

GitHub - Downloads

GitHub – Anlegen eines Download-Bereichs

Ende 2012 sorgte GitHub bei mir für einige Verwirrung, indem die Möglichkeit des Bereitstellens von Download-Dateien abgeschafft wurde.

Als Notbehelf verwende ich aktuell einfach einen speziellen Zweig namens “downloads” und lege dann die runterladbaren Dateien darin ab.

Download-Zweig anlegen

Den Download-Zweig legt man grob so an:

  • Sicherstellen: Alle Dateien sind gespeichert in Git! (mittels: git status)
  • Neuen Zweig anlegen und leeren
  • README.txt erzeugen mit einer kurzen Beschreibung
  • README.txt in Git abspeichern
  • Zweig nach GitHub hochschieben
Download-Zweig anlegen
1
2
3
4
5
6
7
8
9
10
11
$ git checkout master
$ git status
# On branch master
nothing to commit, working directory clean
$ git checkout --orphan downloads
$ git rm -rf .
$ jmacs README.txt # Enter description of the branch
$ git add README.txt
$ git commit -m "Created branch: downloads"
$ git push --set-upstream origin downloads
$ git checkout master

Dateien ablegen

Dateien ablegen
1
2
3
4
5
6
7
$ git checkout downloads
$ cp .../my-project-0.1-bin.tar.xz .
$ cp .../my-project-0.1-bin.zip .
$ git add my-project-0.1-bin.tar.xz my-project-0.1-bin.zip
$ git commit -m "Added downloads of version 0.1" .
$ git push # might take some time depending on your internet connection bandwidth
$ git checkout master # switch back to master

Rails-2.3.15

Rails-Update für Redmine-1.2

Einleitung

Auf einem etwas älteren Linux-Server betreibe ich eine fast genauso alte Redmine-Instanz. Redmine ist eine Rails-Anwendung und weil ich so eine alte Version davon verwende, ist die Rails-Version anfällig gegen die diese Woche entdeckten kritischen Schwachstellen.

Redmine selbst kann zur Zeit nicht auf die aktuelle Version 2.2 aktualisiert werden, weil ich ältere, mit der neuen Version nicht verträgliche Plugins verwende. Also heißt die Strategie: Redmine beibehalten, Rails aktualisieren auf Version 2.3.15.

Gems herunterladen und zum Redmine-Server übertragen

Der Redmine-Server hat keinen Zugang zum Internet. Deshalb müssen die Gems auf einem anderen Rechner heruntergeladen und zum Redmine-Server übertragen werden.

(get-2.3.15.sh) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/sh
VERSION=2.3.15

fetch() {
  (
  GN="$1-$2.gem"
  if [ ! -s "${GN}" ]; then
    gem fetch "$1" -v "$2"
  fi
  )
}

for i in actionmailer actionpack activerecord activeresource activesupport rails; do
  fetch "${i}" "${VERSION}"
done
fetch rack 1.1.3

Die Dateien werden danach mit SCP auf den Redmine-Server übertragen.

Basissystem aktualisieren

Basissystem aktualisieren
1
2
3
apt-get update
apt-get upgrade
apt-get dist-upgrade

Gems einspielen

Gems einspielen
1
gem install rails-2.3.15.gem

Alte Gems deininstallieren

(uninstall-2.3.11.sh) download
1
2
3
4
5
6
7
8
9
10
#!/bin/sh
VERSION=2.3.11

gem uninstall rails -v "${VERSION}"
gem uninstall actionmailer -v "${VERSION}"
gem uninstall actionpack -v "${VERSION}"
gem uninstall activerecord -v "${VERSION}"
gem uninstall activeresource -v "${VERSION}"
gem uninstall activesupport -v "${VERSION}"
gem uninstall rack -v 1.1.1

WSGEN - Wie man’s mit Interfaces macht

Erzeugen einer WSDL-Datei für ein JAXWS-Webservice-Interface

Vorab – unser Webservice

Ausgangspunkt ist dieses Interface für unseren Webservice:

(SampleWebService.java) download
1
2
3
4
5
6
7
8
9
10
11
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;

@WebService(name = "sampleWebService", targetNamespace = "http:/sample.de/sample-web-service/")
public interface SampleWebService {
   @WebMethod
   public String echo(
            @WebParam(name = "msg", mode = WebParam.Mode.IN) String msg
   );
}

Zusätzlich gibt’s auch schon eine Implementierung dafür, nämlich diese:

(SampleWebServiceImpl.java) download
1
2
3
4
5
6
7
8
import javax.jws.WebService;

@WebService(endpointInterface = "SampleWebService", serviceName = "SampleWebService", targetNamespace = "http:/sample.de/sample-web-service/")
public class SampleWebServiceImpl implements SampleWebService {
   public String echo(String msg) {
       return "Echo: "+msg;
   }
}

Da wir nur zwei Quelldateien haben, können wir die schnell manuell durchkompilieren:

Kompilieren der Quelldateien
1
2
3
4
$ javac SampleWebServiceImpl.java  # ... kompiliert beide Dateien
$ ls
SampleWebService.class      SampleWebServiceImpl.java
SampleWebServiceImpl.class  SampleWebService.java

WSGEN – das übliche Vorgehen

Das übliche Vorgehen basiert auf dem Tool wsgen, welches dem JDK beiliegt:

Vorgehen mit WSGEN
1
2
3
4
$ wsgen -cp . SampleWebServiceImpl -wsdl -inlineSchemas
$ ls
jaxws                   SampleWebServiceImpl.class  SampleWebService.java
SampleWebService.class  SampleWebServiceImpl.java   SampleWebService.wsdl

Da haben wir sie, die WSDL-Datei mit dem Namen “SampleWebService.wsdl”.

WSGEN – das Problem

Manchmal steht nur das Interface für den Webservice zur Verfügung, also nur die Datei SampleWebService.java. Wenn wir versuchen, daraus eine WSDL-Datei zu erzeugen, erscheint so eine Fehlermeldung:

WSGEN und ServiceInterface
1
2
3
4
5
6
7
8
9
10
11
$ wsgen -cp . SampleWebService -wsdl -inlineSchemas
The class "SampleWebService" is not an endpoint implementation class.

Usage: WSGEN [options] <SEI>

where [options] include:
  -classpath <path>          specify where to find input class files
...
Examples:
  wsgen -cp . example.Stock
  wsgen -cp . example.Stock -wsdl -servicename {http://mynamespace}MyService

Wie’s aussieht funktioniert WSGEN also nicht mit Interface-Klassen, es wird eine Implementierungsklasse benötigt:

Ein erster Versuch mit abstrakter Klasse

Hier eine abstrakte Implementierungsklasse:

(AbstractSampleWebServiceImpl.java) download
1
2
3
4
5
import javax.jws.WebService;

@WebService(endpointInterface = "SampleWebService", serviceName = "SampleWebService", targetNamespace = "http:/sample.de/sample-web-service/")
abstract public class AbstractSampleWebServiceImpl implements SampleWebService {
}

Leider klappt’s auch nicht:

WSGEN mit abstrakter Implementierungsklasse
1
2
3
4
5
$ javac AbstractSampleWebServiceImpl.java
$ wsgen -cp . AbstractSampleWebServiceImpl -wsdl -inlineSchemas
...
com.sun.tools.internal.ws.processor.modeler.ModelerException: modeler error: Classes annotated with @javax.jws.WebService must not be abstract. Class: AbstractSampleWebServiceImpl
...

Dynamische Erstellung einer Implementierungsklasse

Der nächste Versuch sieht so aus:

  • ich lade das Interface und untersuche alle seine Methoden
  • daraus erzeuge ich den Quelltext für eine Implementierungsklasse
  • die Implementierungsklasse kompiliere ich mit dem JavaCompiler
  • auf die dabei erstellte .class-Datei lasse ich dann wsgen los

Den Versuch habe ich in einem GITHUB-Projekt plattformübergreifend umgesetzt. Er scheint grundsätzlich zu funktionieren, ich kann in meinem aktuellen Projekt auf die manuelle Erstellung von Dummy-Implementierungsklassen verzichten.

Beispielaufruf: ./uli-wsgen.sh -c myproject.jar -f sample.wsdl SampleWebService

ASM - BytecodeOutline-Plugin in Eclipse installieren

BytecodeOutline-Plugin für Eclipse

Zuerst ein paar Angaben zu meiner Systemumgebung:

Ich benötige das Plugin nur temporär. Es soll nicht permanent in meiner Eclipse-Umgebung verfügbar sein.

Neue Eclipse-Installation

Neue Eclipse-Installation
1
2
3
4
cd /opt
gzip -cd "${HOME}/Downloads/eclipse/eclipse-jee-juno-SR1-linux-gtk-x86_64.tar.gz |sudo tar xf -
sudo chown -R uli.uli eclipse
sudo mv eclipse eclipse-botst

Test der neuen Eclipse-Installation

Test der Eclipse-Installation
1
2
3
/opt/eclipse-botst/eclipse &
# Eclipse wird gestartet
# -> wieder stoppen

Einspielen des Plugins

Einspielen des Plugins
1
2
3
# Sicherstellen: Eclipse ist gestoppt
cd /opt/eclipse-botst
cp "${HOME}/Downloads/de.loskutov.BytecodeOutline_2.4.0.jar dropins

Kurztest des Plugins

  • Eclipse starten
  • Java-Klasse aus einem bestehenden Eclipse-Projekt selektieren
  • Window –> Show View –> Other –> Java –> Bytecode

LXC

LXC

Installation

sudo apt-get install lxc

Container-Partition /lxc

Dieser Teil ist optional. Man kann ihn auch einfach weglassen, dann
werden die LXC-Container eben unterhalb von /var angelegt. Das setzt
dann natürlich voraus, dass dort noch genügend freier Platz vorhanden ist
- etwa 10GB sollten für den Anfang reichen. Prüfen kann man das mit
df -h /var.

Die nachfolgende Beschreibung geht davon aus, dass das System mit LVM
partitioniert ist und dass eine VolumeGroup namens “datavg” vorhanden
ist.

Partition anlegen

sudo lvcreate -n lxclv -L10G datavg
sudo mkfs.btrfs /dev/datavg/lxclv

Partition einbinden

sudo -s
mkdir /lxc
echo "/dev/datavg/lxclv /lxc btrfs defaults 0 3" >>/etc/fstab
mount /lxc
rmdir /var/lib/lxc
ln -s /lxc/lib /var/lib/lxc
rm -rf /var/cache/lxc
ln -s /lxc/cache /var/cache/lxc

Erstellen von Containern

12.04, 64bit

64-bit Container können nur erstellt werden, wenn das Basissystem auch ein 64-bit-System ist!

sudo lxc-create -t ubuntu -n ubuntu1204-64 -- -r precise -a amd64

12.04, 32bit

sudo lxc-create -t ubuntu -n ubuntu1204-32 -- -r precise -a i386
uli@uli-hp-ssd:~/Downloads/virtualbox$ sudo lxc-create -t ubuntu -n ubuntu1204-32 -- -r precise -a i386
[sudo] password for uli: 

No config file specified, using the default config
debootstrap ist /usr/sbin/debootstrap
Checking cache download in /var/cache/lxc/precise/rootfs-i386 ... 
Copy /var/cache/lxc/precise/rootfs-i386 to /var/lib/lxc/ubuntu1204-32/rootfs ... 
Copying rootfs to /var/lib/lxc/ubuntu1204-32/rootfs ...

##
# The default user is 'ubuntu' with password 'ubuntu'!
# Use the 'sudo' command to run tasks as root in the container.
##

'ubuntu' template installed
'ubuntu1204-32' created

13.04, 64bit

sudo lxc-create -t ubuntu -n ubuntu1304-64 -- -r raring -a amd64

13.04, 32bit

sudo lxc-create -t ubuntu -n ubuntu1304-32 -- -r raring -a i386

10.04, 32bit

sudo lxc-create -t ubuntu -n ubuntu1204-32 -- -r lucid -a i386

Arbeit mit Containern

  • Anmelden
    • Benutzer: “ubuntu”
    • Kennwort: “ubuntu”
  • Netzwerk
    • IP-Adressen: Aus dem Adressbereich 10.0.3/24
    • NAT: Funktioniert – ping google.com
    • SSH vom Host in den Container: Funktioniert – ssh ubuntu10.0.3.250@

Anpassung der Container

Verwenden des Apt-Cache-Ng vom Host-System

Erstellen von /etc/apt/apt.conf.d/01proxy:

Acquire::http::Proxy "http://10.0.3.1:3142";

Installation von JOE/JMACS

sudo apt-get install joe

Sichern und Rückspielen von Containern

Sichern

cd /lxc
sudo tar -cvjpf /backups/lxc/20121119.tar.bz2 .

Rückspielen

cd /lxc
sudo tar -xvjpf /backups/lxc/20121119.tar.bz2

Probleme

Offene Punkte

Wie sorgt man dafür, dass ein Container nur über ein Host-Only-Netzwerk erreichbar ist?

Erledigte Punkte

Verwendung des Apt-Cacher-Ng durch einen Container

… geht wie üblich durch /etc/apt/apt.conf.d/01proxy innerhalb des Containers

Wie übernimmt man einen Container auf ein anderes System?

… durch Sichern und Rückspielen.

Links

  • Ubuntu 12.04 Server Guide: https://help.ubuntu.com/12.04/serverguide/lxc.html

Octopress-2.1

Meine Tests mit Octopress-2.1

Ausgangspunkt ist meine “normale” Octopress-Installation:

Normale Octopress-Installation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
octopress$ git branch -a
  master
* source
  remotes/octopress/2.1
  remotes/octopress/gh-pages
  remotes/octopress/linklog
  remotes/octopress/master
  remotes/octopress/refactor_with_tests
  remotes/octopress/rubygemcli
  remotes/octopress/site
  remotes/origin/HEAD -> origin/master
  remotes/origin/gh-pages
  remotes/origin/master
  remotes/origin/source

Mit diesem Setup kann man nun umschalten auf Version 2.1:

Umstellen auf Octopress-2.1
1
2
3
4
5
6
7
8
9
octopress$ export LANG=C.UTF-8
octopress$ git checkout -t remotes/octopress/2.1
Branch 2.1 set up to track remote branch 2.1 from octopress by rebasing.
Switched to a new branch '2.1'
octopress$ bundle install
octopress$ rake install
octopress$ rake generate
octopress$ rake preview
# Browser: http://localhost:4000

Hier meine ersten Eindrücke:

  • Code-Blöcke verwenden nun weißen Hintergrund, was für mich deutlich lesbarer und ansprechender aussieht
  • Blog-Einträge mit published: false werden nicht veröffentlicht, in 2.0 werden alle Blog-Einträge veröffentlicht
  • Bei RVM wird Ruby-1.9.2 “angezogen”, es funktioniert aber auch mit 1.9.3
  • Beim Drücken auf “Blog” erscheint in der Leiste rechts keine Liste der Blog-Einträge – source/_includes/sidebars/blog_index_default.html
  • Bei Überschriften werden die ersten Buchstaben immer groß geschrieben (also: So Eine Überschrift) – _config.yml, titlecase
  • Datumsangaben erfolgen in Englisch (wie bei 2.0) – etwas kompliziert zu ändern
Anpassungen an Octopress-2.1
1
2
3
git branch -m 2.1 source-2.1
git checkout source-2.1
git push -u origin source-2.1

Eigenes Darstellungsthema erzeugen

Kopie des Standards-Themas anlegen

Eigenes Darstellungsthema f
1
2
3
cp -a .themes/classic .themes/uli
git add .themes/uli
git commit -m ".themes: classic -> uli"

Anpassungen von Octopress-2.0 übernehmen

  • Historie vom Zweig “source” durchsuchen nach den dort erledigten Änderungen am Thema
  • Übernehmen der Änderungen in den Zweig “source-2.1”
Anpassungen des Darstellungsthemas von Octopress-2.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Sichten der Historie
octopress$ git log --oneline ..source -- .themes/uli
b941c1c Anpassungen am Layout
1cfd652 cp -a .themes/classic .themes/uli
# Änderungen in source-2.1 übernehmen
octopress$ git rebase -i --onto source-2.1 1cfd652 b941c1c
# Konflikt wird angezeigt -> auflösen und festschreiben (committen)
octopress$ ...
# Zustand sichten
octopress$ gitk
# "Detached head", source-2.1 liegt ein wenig "zurück"
octopress$ git checkout -b tmp
octopress$ git checkout -B source-2.1 tmp
octopress$ git branch -d tmp

Darstellungsthema aktivieren

Anpassungen des Darstellungsthemas von Octopress-2.0
1
2
3
4
5
6
7
8
9
octopress$ rake install['uli']
A theme is already installed, proceeding will overwrite existing files. Are you sure? [y/n] y
## Copying uli theme into ./source and ./sass
mkdir -p source
cp -r .themes/uli/source/. source
mkdir -p sass
cp -r .themes/uli/sass/. sass
mkdir -p source/_posts
mkdir -p public

Blog-Einträge von Octopress-2.0 übernehmen

Dokumente von Octopress-2.0
1
2
3
4
git add source
git commit -m "Quelltexte in's Repository aufgenommen" .
git checkout source -- ./source/_posts
git commit -m "Blog-Einträge kopiert von 'source'" ./source

Einstellungen anpassen

Grundeinstellungen

Einstellungen anpassen - _config.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@@ -2,10 +2,10 @@
 #      Main Configs       #
 # ----------------------- #

-url: http://yoursite.com
-title: My Octopress Blog
-subtitle: A blogging framework for hackers.
-author: Your Name
+url: http://uli-heller.github.com
+title: Was ich so treibe...
+subtitle: Java, Linux und Groovy
+author: Uli Heller
 simple_search: http://google.com/search
 description:

Überschriften – keine Großbuchstaben

Keine Gro
1
2
3
4
5
6
7
8
9
10
@@ -49,7 +49,7 @@
 linklog_marker_position: after
 linklog_marker_position_feed: after
 standard_post_marker:

-titlecase: true       # Converts page and post titles to titlecase
+titlecase: false       # Converts page and post titles to titlecase

 # To change the layout's default sidebar Add a new sidebar source/_includes/sid
 # then make changes below, eg. post_sidebar: your_sidebar.html

Deutsche Übersetzungen

Die Ideen sind weitgehend “geklaut” von Roger Schärer. In folgenden Dateien sind englische Texte hinterlegt:

  • _config.yml … OK
  • source/_includes/archive_post.html … OK
  • source/includes/asides/recent_posts.html … nicht gefunden source/includes/sidebars/sections/recent_posts.html
  • source/includes/asides/twitter.html .. nicht gefunden source/includes/sidebars/sections/twitter.html
  • source/_includes/custom/navigation.html
  • source/_includes/navigation.html
  • source/_includes/post/author.html
  • source/_layouts/post.html
  • source/_layouts/posts.html … nicht gefunden
  • source/_layouts/page.html … nicht gefunden
  • source/index.html
  • source/blog/archives/index.html … nicht gefunden source/archives/index.html

Die meisten dieser Änderungen führe ich nicht direkt an den Dateien unterhalb von “source” durch, sondern in meinem Themenverzeichnis “.themes/uli”. Von dort kann ich sie dann mittels rake install['uli'] aktivieren.

Deutsche Datumsangaben

Das grundätzliche Vorgehen kommt von Marc . Er schreibt allerdings, dass man als Einstellung für das Format “ordinal” verwenden muß. Grund hierfür ist eine Unschönheit in seiner Implementierung der Methode “format_date”. Bei meiner Variante kann man auch beliebige andere Einstellungen verwenden. Ich verwende beispielsweise “%d. %B %Y”.

Deutsche Datumsangaben - plugins/date.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
@@ -1,5 +1,57 @@
+# -*- coding: utf-8 -*-
 module Octopress
   module Date
+    #Deutsche Lokalisation:
+    MONTHNAMES_DE = [nil,
+      "Januar", "Februar", "März", "April", "Mai", "Juni",
+      "Juli", "August", "September", "Oktober", "November", "Dezember" ]
+    ABBR_MONTHNAMES_DE = [nil,
+      "Jan", "Feb", "Mär", "Apr", "Mai", "Jun",
+      "Jul", "Aug", "Sep", "Okt", "Nov", "Dez" ]
+    DAYNAMES_DE = [
+      "Sonntag", "Montag", "Dienstag", "Mittwoch",
+      "Donnerstag", "Freitag", "Samstag" ]
+    ABBR_DAYNAMES_DE = [
+      "So", "Mo", "Di", "Mi",
+      "Do", "Fr", "Sa" ]
+
+    # Returns a datetime if the input is a string
+    def datetime(date)
+      if date.class == String
+        date = Time.parse(date)
+      end
+      date
+    end
+
+    # in _config.yml muss stehen: date_format: ordinal 
+    def ordinalize(date)
+      #**** hier Format bei Bedarf ändern, z.B. %A für ausgeschriebenen Wochent
+      format_date(date, "%a, %e. %B %Y") # SA, 10. MÄRZ 2012
+    end
+
+
+    # Formats date either as ordinal or by given date format
+    # Adds %o as ordinal representation of the day
+    def format_date(date, format)
+      myformat = format.dup
+      date = datetime(date)
+      if format.nil? || format.empty? || format == "ordinal"
+        date_formatted = ordinalize(date) 
+      else
+        myformat.gsub!(/%a/, ABBR_DAYNAMES_DE[date.wday])
+        myformat.gsub!(/%A/, DAYNAMES_DE[date.wday])
+        myformat.gsub!(/%b/, ABBR_MONTHNAMES_DE[date.mon])
+        myformat.gsub!(/%B/, MONTHNAMES_DE[date.mon])
+        date_formatted = date.strftime(myformat)
+        # date_formatted = date.strftime(format)
+        # date_formatted.gsub!(/%o/, ordinal(date.strftime('%e').to_i))
+      end
+      date_formatted #+" ULI:#{date.mon}"
+    end
+
+  end
+
+  module DateEn

     # Returns a datetime if the input is a string
     def datetime(date)
@@ -95,4 +147,11 @@ module Jekyll
       self.data['updated_formatted'] = format_date(self.data['updated'], date_format) if self.data.has_key?('updated')
     end
   end
+
+  module Filters
+    include Octopress::Date
+    def date(date, format)
+      format_date(date, format)
+    end
+  end

Änderung an _config.yml, damit das Datum so angegeben wird: “25. Dezember 2012”

Datumsangaben ‘TT. Monat JJJJ’ - _config.yml
1
2
3
4
5
6
7
8
9
10
11
@@ -13,7 +13,11 @@ description:
 # You can customize the format as defined in
 # http://www.ruby-doc.org/core-1.9.2/Time.html#method-i-strftime
 # Additionally, %o will give you the ordinal representation of the day
-date_format: "ordinal"
+#  %d.%m.%Y" -> 25.12.2012
+#  %d. %B %Y" -> 25. December 2012 (oder 25. Dezember 2012)
+date_format: "%d. %B %Y"

 # RSS / Email (optional) subscription links (change if using something like Fee
 subscribe_rss: /atom.xml

GitHub-Pages reaktivieren

GutHub-Pages reaktivieren - Rakefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@@ -9,13 +9,13 @@
 ssh_user       = "user@domain.com"
 ssh_port       = "22"
 document_root  = "~/website.com/"
 rsync_delete   = false
-deploy_default = "rsync"
+deploy_default = "push"

 # Hidden "dot" files that should be included with the deployed site (see task c
 copy_dot_files = []

 # This will be configured for you when you run config_deploy
-deploy_branch  = "gh-pages"
+deploy_branch  = "master"

 ## -- Misc Configs -- ##

Octopress-Installation

Meine erste Octopress-Installation

Installation

Vorbereitungen

  • Sicherstellen: Zugang zum Internet besteht
  • Größe der /usr-Partition auf 800MB setzen
  • Größe der /tmp-Partition auf 300MB setzen
  • Größe der /home-Partition auf 250MB setzen
  • GCC installieren
  • Libs installieren
  • Curl installieren
Partition vergr
1
2
3
4
5
6
7
8
9
sudo lvextend -L+400M /dev/systemvg/usrlv
sudo resize2fs /dev/systemvg/usrlv
sudo lvextend -L+200M /dev/systemvg/tmplv
sudo resize2fs /dev/systemvg/tmplv
sudo lvextend -L+200M /dev/systemvg/homelv
sudo resize2fs /dev/systemvg/homelv
sudo apt-get install gcc build-essential
sudo apt-get install libyaml-dev libz-dev libssl-dev
sudo apt-get install curl

Basispakete

Git

Git installieren
1
2
sudo apt-get install -y git
sudo apt-get clean

Für GIT wird die Version 1.8.0-0dp3~precise01 vom DPREPO angezogen.

Ruby mittels RVM

Ruby installieren
1
2
3
4
5
6
curl -L https://get.rvm.io | bash -s stable --ruby
. ./.rvm/scripts/rvm
rvm install 1.9.3 # Zeigt eine Fehlermeldung, weil 1.9.3 bereits installiert ist
rvm use 1.9.3
rvm rubygems latest
ruby --version    # ruby 1.9.3p327 (2012-11-10 revision 37606) [i686-linux]

Octopress

Erstinstallation

Die Schritte in diesem Abschnitt werden nur bei der allerersten Installation durchgeführt. Die dabei gemachten Einstellungen werden in einem zentralen Speicherbereich auf GitHub abgelegt und bei nachfolgenden Installationen von dort geladen.

Octopress und Pakete
Octropress installieren
1
2
3
4
5
git clone git://github.com/imathis/octopress.git octopress
cd octopress
gem install bundler
bundle install
rake install
Textile statt Markdown
Textile statt Markdown - Rakefile
1
2
3
4
5
6
7
8
9
@@ -22,8 +22,8 @@ deploy_dir      = "_deploy"   # deploy directory (for Github p
 stash_dir       = "_stash"    # directory to stash posts for speedy generation
 posts_dir       = "_posts"    # directory for blog files
 themes_dir      = ".themes"   # directory for blog files
-new_post_ext    = "markdown"  # default new post file extension when using the 
-new_page_ext    = "markdown"  # default new page file extension when using the 
+new_post_ext    = "textile"   # default new post file extension when using the 
+new_page_ext    = "textile"   # default new page file extension when using the 
 server_port     = "4000"      # port for preview server eg. localhost:4000
Autor und Titel
Autor und Titel - _config.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@@ -2,10 +2,10 @@
 #      Main Configs       #
 # ----------------------- #

-url: http://yoursite.com
-title: My Octopress Blog
-subtitle: A blogging framework for hackers.
-author: Your Name
+url: http://uli-heller.github.com
+title: Was ich so treibe...
+subtitle: Linux, Java und Groovy
+author: Uli Heller
 simple_search: http://google.com/search
 description:

Veröffentlichung auf GitHub

Ziel: Die Octopress-Seiten sollen auf GitHub unter

veröffentlicht werden.

Vorbereitungen auf GitHub

Auf GitHub muß ein spezielles Repository angelegt werden:

  • mein GitHub-Benutzer: “uli-heller”
  • neu anzulegendes Repository: “uli-heller.github.com”

In der Liste der eigenen Repositories erscheint dann:

  • uli-heller/uli-heller.github.com

Test: Lege in dem Master-Zweig dieses Repositories eine Datei mit Namen

  • index.html

an und gib’ danach im Browser die URL

ein. Mit etwas Glück erscheint der Inhalt der “index.html”

Anpassungen im Octopress-Verzeichnis
Octopress f
1
2
3
4
5
cd octopress
rake setup_github_pages
# Repository url: git@github.com:uli-heller/uli-heller.github.com
rake generate
rake deploy
Quellverzeichnis zur Sicherung hinzufügen
Sicherung vorbereiten
1
2
git add source
git commit -m "Quelltexte sichern"
Neue Artikel sichern

Neue Artikel werden mit diesem Befehl auf GitHub gesichert:

Quellverzeichnis sichern
1
2
3
cd octopress
git commit -m "Sprechende Nachricht mit Änderungsbeschreibungen"
git push origin source
Neue Veröffentlichungen

Immer dann, wenn neue Artikel veröffentlicht werden sollen, muß man so vorgehen:

Neue Ver
1
2
3
cd octopress
rake generate
rake deploy

Folgeinstallation

Folgeinstallation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git clone  git@github.com:uli-heller/uli-heller.github.com octopress
cd octopress
git checkout source
gem install bundler
bundle install
rake install['uli']
git remote add octopress git://github.com/imathis/octopress.git
git fetch octopress
# ... nachfolgend nur für GitHub-Veröffentlichungen
rm -rf _deploy
git init _deploy
cd _deploy
git remote add -t master -f origin git@github.com:uli-heller/uli-heller.github.com
git checkout master
cd ..

Anpassungen

Darstellung

Meinen Darstellungsstil aktivieren
1
2
cd octopress
rake install['uli']

Zurück zur Standard-Darstellung geht’s so:

Standarddarstellung aktivieren
1
2
cd octopress
rake install

Ein erster Blog-Eintrag

Ersten Blog-Eintrag erstellen
1
2
3
4
5
6
7
8
9
$ rake new_post["Octopress"]
$ mkdir -p source/_posts
Creating new post: source/_posts/2012-11-10-octopress.textile
# Datei source/_posts/2012-11-10-octopress.textile editieren
$ rake generate
$ rake preview
# Sichten mit http://localhost:4000
$ git commit -m "Erster Blog-Eintrag ist fertig"
$ git push origin source

Probleme

Offene Probleme

Erledigte Probleme

Farben sind recht duster

Die Beschreibung ist obsolet! Verwende besser: rake install['uli']!

Hellere Farben - sass/custom/_colors.scss
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
uli@uli-hp:~/git/octopress$ diff -u sass/custom/_colors.scss~ sass/custom/_colors.scss
--- sass/custom/_colors.scss~    2012-11-10 19:45:17.000000000 +0100
+++ sass/custom/_colors.scss 2012-11-18 11:21:14.913856809 +0100
@@ -41,3 +41,61 @@
 //$pre-bg: $base03;
 //$pre-border: darken($base02, 5);
 //$pre-color: $base1;
+
+// 2012-11-18
+// http://aijazansari.com/2012/08/27/how-to-customize-octopress-theme/
+// ////////////////////////////////////////
+// change the background colors
+//
+html {
+  background: #fff !important;
+}
+body {
+  > div {
+    background: #fff !important;
+    > div {
+      background: #fff !important;
+      }
+  }
+}
+$main-bg: #ffffff !default;
+$page-bg: #ffffff !default;
+
+// ////////////////////////////////////////
+// change the header colors
+//
+$header-bg: #fff;
+$title-color: #000000 !default;
+$text-color: #333 !default;
+$text-color-light: #777 !default;
+$subtitle-color: darken($header-bg, 58);
+
+// ////////////////////////////////////////
+// change the nav bar
+//
+$nav-bg: #fff;
+$nav-bg-front: #fff;
+$nav-bg-back: #fff;
+$nav-color: darken($nav-bg, 78) !default;
+$nav-color-hover: darken($nav-color, 25) !default;
+$nav-border: darken($nav-bg, 50) !default;
+$nav-border-top: darken($nav-bg, 33) !default;
+$nav-border-bottom: darken($nav-bg, 33) !default;
+$nav-border-left: darken($nav-bg, 11) !default;
+$nav-border-right: lighten($nav-bg, 7) !default;
+
+
+// ////////////////////////////////////////
+// change the footer
+//
+$footer-color: #888 !default;
+$footer-bg: #fff !default;
+$footer-bg-front: #fff !default;
+$footer-bg-back: #fff !default;
+$footer-color: darken($footer-bg, 38) !default;
+$footer-color-hover: darken($footer-color, 10) !default;
+$footer-border-top: lighten($footer-bg, 15) !default;
+$footer-border-bottom: darken($footer-bg, 15) !default;
+$footer-link-color: darken($footer-bg, 38) !default;
+$footer-link-color-hover: darken($footer-color, 25) !default;
+$page-border-bottom: darken($footer-bg, 5) !default;

Listen sind nicht eingerückt

Die Beschreibung ist obsolet! Verwende besser: rake install['uli']!

Die Darstellung von Listen ist unschön. Der Fehler betrifft Listen wie diese:

  • Erster Listeneintrag
  • Zweiter Listeneintrag

Die Listeneinträge werden zu weit links angeziegt, so dass die “Punkte” links außerhalb des Textbereichs erscheinen.

Korrektur: Editiere sass/custom/_layout.scss wie folgt:

Einger
1
2
3
4
5
6
7
8
9
10
11
12
diff -u sass/custom/_layout.scss~  sass/custom/_layout.scss
--- sass/custom/_layout.scss~    2012-11-10 19:45:17.000000000 +0100
+++ sass/custom/_layout.scss 2012-11-18 11:05:43.661813157 +0100
@@ -6,7 +6,7 @@
 //$header-padding-bottom: 1.5em;

 //$max-width: 1350px;
-//$indented-lists: true;
+$indented-lists: true;

 // Padding used for layout margins
 //$pad-min: 18px;

Ruby mittels RBENV

Funktioniert nicht, wir verwenden stattdessen RVM!

RBENV
RBENV
1
2
3
4
5
6
cd
git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
source ~/.bash_profile
RUBY
RUBY
1
2
rbenv install 1.9.3-p0
rbenv rehash

Danach sollte dann ruby --version irgendwas mit 1.9.3 anzeigen, funktioniert aber nicht!

YAML und zlib

Fehlermeldung yaml und zlib
1
2
3
4
5
6
7
8
$ gem install bundler
/home/uli/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/yaml.rb:56:in `<top (required)>':
It seems your ruby installation is missing psych (for YAML output).
To eliminate this warning, please install libyaml and reinstall your ruby.
ERROR:  Loading command: install (LoadError)
    cannot load such file -- zlib
ERROR:  While executing gem ... (NameError)
    uninitialized constant Gem::Commands::InstallCommand

Lösungsversuch mit libyaml-dev und libz-dev:

yaml und zlib installieren
1
2
3
4
sudo apt-get install libyaml-dev libz-dev
rvm reinstall 1.9.3
cd octopress
gem install bundler

… funktioniert.

OpenSSL

Fehlermeldung OpenSSL
1
2
3
4
5
6
7
8
uli@ubuntu1204:~/octopress$ rake generate
## Generating Site with Jekyll
directory source/stylesheets/
   create source/stylesheets/screen.css
/home/uli/.rvm/gems/ruby-1.9.3-p327/gems/maruku-0.6.0/lib/maruku/input/parse_doc.rb:22:in `<top (required)>': iconv will be deprecated in the future, use String#encode instead.
Configuration from /home/uli/octopress/_config.yml
/home/uli/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/net/https.rb:22:in `require': cannot load such file -- openssl (LoadError)
  from /home/uli/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/net/https.rb:22:in `<top (required)>'

Lösungsversuch mit libssl-dev:

libssl-dev installieren
1
2
3
4
sudo apt-get install libssl-dev
rvm reinstall 1.9.3
cd octopress
rake generate

… funktioniert.

Markdown-Testdokument

Markdown-Testdokument

Dies ist mein Testdokument für Markdown. Ich packe hier einfach alle denkbaren Konstrukte in Markdown rein, damit ich nicht immer wieder neu suchen muß.