Nat mit IPTables

NAT mit iptables in 4 einfachen Zeilen.
(Ist eigentlich NAPT und nicht NAT, wird aber weitläufig so bezeichnet)

1. IP Forwarding aktivieren

Zur permanenten Aktivierung, entsprechende Zeile in /etc/sysctl.conf

2. IPTables konfigurieren

Ich nehme an, dass eth0 die Schnittstelle nach draußen ist und eth1 die interne Schnittstelle, die mit dem Internet verbunden werden soll. Also

eth1 -> eth0 -> Internet

Abschließende Hinweise

  • iproute2 untersützt seit Linux 2.6 nicht mehr nat [Verweis]. Leider finden sich noch einige Tutorials dazu im Internet.
  • Was ich hier vorstelle ist eigentlich nicht NAT sondern NAPT. NAT im Sinne von "ich verwende den Routing Stack von Linux" findet sich heute eher selten.

 

Kurzeintrag: Imagemagick und Collagen

Kurzeintrag: Mit dem Imagemagick-Programm montage kann man sehr einfach Collagen erstellen.

Um beispielsweise aus den viert Dateien Plot1.png - Plot4.png eine Collage mit den Namen Collage.png zu erstellen genügt der folgende Befehl:

Um die Dateien auf eine Größe von 320x320 zu bringen, und eine 2x2 Collage zu erstellen

Fertig! Gefunden im Montage User Manual

Fixing Touchpad of the T540p for Ubuntu 14.04

Ubuntu 14.04 scheint einige Probleme mit dem T540p zu haben. Das Touchpad ist im Fabrikneuen System quasi nicht zu gebrauchen.
Glücklicherweise reichen ein paar einfache Knigge um es korrekt zu konfigurieren.

Micht stören zwei Dinge:

  • Die obere Fläche ist für die Linke/Mittlere/Rechte Maustaste konfiguriert. Bei einem Klick werden aber auch die Bewegungen als Mausbewegungen interpretiert, was zu unerwünschten Klickverhalten führt
  • Die mittlere und rechte Maustaste funktionieren gar nicht. Rechtsklick wird mit Mausgesten realisiert, die Mittlere Maustaste gibt's gar nicht
Touchpad vom Lenovo T540p
Touchpad vom Lenovo T540p

Das Ziel ist gesteckt:
Die obere Fläche soll den Funktionstasten (Linke/Mittlere/Rechte Maustaste) zugeordnet werden. Klicken und gleichzeitiges Herumfahren mit der Maus ist störend und unerwünscht.

Abhilfe mit synclient

Der Freund in der Not heißt in diesem Fall synclient. Damit lässt sich das Touchpad so konfigurieren wie es der Benutzer haben will.
Synclient ist unter Ubuntu im Paket xserver-org-input-synaptics drinnen und sollte bereits installiert sein. Andernfalls hilft ein einfaches

Konfiguration auslesen

Ein Aufruf von synclient ohne Parameter liefert die aktuelle Konfiguration

synclient liefert die aktuelle Konfiguration
synclient liefert die aktuelle Konfiguration

Sensitive Fläche reduzieren

Das Touchpad wird in ein Rechteck eingeteilt, dessen Dimensionen mit folgenden Parametern eingestellt werden

  • LeftEdge
  • RightEdge
  • TopEdge
  • BottomEdge

Die Fläche auf dem Touchpad, welche die sensitive Fläche bestimmt sind

  • AreaLeftEdge
  • AreaRightEdge
  • AreaTopEdge
  • AreaBottomEdge

Der folgende Aufruf von synclient und ein grep darauf liefen die aktuellen Einstellungen

In meinem Fall möchte ich, dass die obere Fläche in der sich die Maustasten befinden nicht sensitiv sind. Dazu setze ich den Wert AreaTopEdge auf 1800. Der Werte wurde deterministisch ermittelt, sprich es werden Werte so lange durchprobiert bis das gewünschte Ergebnis erzielt wurde.

Fertig! 🙂

Mausklicks einstellen

Die nächsten Parameter die uns interessieren sind die Mausklick-Regionen. Der folgende Aufruf liefert die passenden Daten, welche selbsterklärend sein sollten

Ich habe die Parameter schon so eingestellt, dass sie meiner Wunschkonfiguration entsprechen. In der Basiskonfiguration waren MiddleButtonAreaLeft, MiddleButtonAreaRight, RightButtonAreaLeft und RightButtonAreaRight jeweils auf 0 eingestellt.

Auch hier wiederum führt ein gezieltes erraten der Werte zum gewünschten Resultat. Die Werte werden sich sicherlich noch etwas verändern, die grobe Richtung passt jedoch schon.

Wichtig: Es muss zuerst die AreaLeft eingestellt werden. Denn wenn beim setzen von AreaRight diese kleiner ist als AreaLeft (AreaRight < AreaLeft) schluckt synclient den neuen Wert nicht!

Summary in a Box

Die gesamte Konfiguration kann mit folgendem Shell-Skript eingestellt werden:

Die Werte können bei dem einen oder anderen eventuell etwas variieren.

[UPDATE]

Das Shell-Skript wurde von mir angepasst und erweitert.

Patch erzeugen (diff, patch)

Dev corner | Patch, diff | Eine kurze Einführung

"Einen Patch einspielen". "Eine Datei patchen". Diese Phrasen hört man häufig wenn es um Software geht, vor allem bei solcher, an der mehrere Personen beteiligt sind.
Ein Patch in diesem Kontext ist nichts anderes als eine Datei, welche die Änderungen einer anderen Datei beschreibt. Also soetwas wie "Ersetze Zeile 3 mit einer leeren Zeile".
Beispiel:
Ich arbeite an einem sehr großen Code (sagen wir mal so um die 10 MB) und entdecke einen Bug, den ich beheben kann. Die Änderung ist ein Einzeiler. Ich möchte die Änderung an den Programm-Entwickler schicken.
Nun kann ich entweder die rießige Code-Datei (10 MB) an den Maintainer schicken, oder ich erstelle eine Datei, welche genau sagt, an welcher Stelle welche Änderungen zu erledigen sind (< 1 kByte).
Nun, Computerentwickler sind faul. Es wäre doch schön, wenn es ein Programm gibt, das eine solche Datei automatisch generiert und anwenden kann.
Hanau hier kommen diff und patch ins Spiel.

Anleitung

Beispielannahmen:

Originaldatei: original.c
Geänderte Datei: original_new.c

Patch erstellen

Die Datei original.c.patch beinhaltet nun alle Änderungen relativ zu original.c.

Patch einspielen

Der Maintainer hat sich den Patch angeschaut und ist mit den Änderungen einverstanden. Nun kann er seine Datei original.c mit der Datei original.c.patch patchen:

Patch und Diff im Einsatz in der Konsole
Patch und Diff im Einsatz in der Konsole

Nützliche Optionen

Notiz für Eclipse

In Eclipse ist es bei GIT oder SVN-Projekten sehr einfach Patches zu erstellen oder einzuspielen:

Rechtsklick auf die Datei -> Team -> Create / Apply patch

Patchen und Patches anwenden in Eclipse
Patchen und Patches anwenden in Eclipse

Fork daemon template

Snippet um in Linux einen Daemon zu Forken

Der Prozess muss zweimal forken, damit
a) Kein Elternprozess existiert (init wird Elternprozess)
b) Der neue Dämonprozess von Terminal detached wird

Shared memory C++ template

Noch eine kleine Wrapper-Library ist fertig. Dieses mal geht es um shared memory, Semaphoren, Linux und C++.

Die Klasse SharedMemory erzeugt ein neues definiertes SharedMemory Segment mit einer bestimmten Größe und erledigt alle notwendigen Schritte zur Erstellung und Löschung der Segmente im Hintergrund.

Darüber hinaus ermöglicht sie auch den Wechselseitigen Zugriff auf dieses Shared Memory segment mittels einer eingebauten Semaphore. Shared memory und semaphore verwenden dabei denselben Schlüssel, der vom Benutzer definiert wird.

Einfaches Beispiel:

Die Library kann hier gedownloaded werden. Beispielcode ist in der example.cpp im Archiv enthalten.
Als Lizenz habe ich wiederum die MIT License gewählt.

BlackBody spectrum generator

Ich habe ein kleines Tool zum Erstellen von Schwarkörper-Spektren erstellt. Das Tool inklusive Binary (zur Zeit nur x64) ist auf GitHub.

Screenshot vom Tool
Screenshot vom Tool

Es kann gleich mehrerer Graphen in einem Plot darstellen.

Beispielspektrum
Beispielspektrum

Geschrieben in Qt4, mit QCustomPlot, eine sehr praktisches Widget im Übrigen, das ich nur empfehlen kann!
Das vorkompilierte Binary ist für Linux 64 gemacht. Noch sind keine weiteren Binaries verfügbar.

English version

I have written a small tool to create custom blackbody spectra using Planck's law.

The tool (Qt4 using QCustomPlot)is available on GitHub. Binaries for Linux (x64) also included on GitHub.

Planck function snippet

The following C++ snipped implements the Planck function. It has found it's way to this blog because of I want to archive it

Have phun!

Einfaches C++ Socket

English version below

Ein weiteres C++ Template für Linux ist fertig: TcpSocket und TcpServerSocket. [Download]

Beides sind sehr einfache Implementierungen für Character-Stream Sockets unter Linux. Sie implementieren istream und ostream, daher kann ähnlich wie auf den Standart-input und Standart-output operiert werden.

Netter Screenshot
Netter Screenshot

Das Archiv inklusive kleinen Beispielprogram (ECHO-Server und Client) steht unter MIT-Lizenz im Repository. Direktlink für den Download hier.

English

I've create a new, very usefull C++ Template: Implementation of a simple and easy-to-use Tcp socket for character streams (Linux only currently). [Download]

What make it so beautiful is the simplicity: It comes basically without dependencies, is C++11 compliant (and you should use the C++11 Standart!) and implements the istream and ostream basic classes.
Reading and writing data from and to your socket becomes as easy as reading to stdin and stdout.
But see this simple example snippet:

The download of the socket package (including a small example program) is in the repository. Or you use the directlink here.

Keywords: C++, Cpp, Linux, TCP, Socket, Server, Client, istream, ostream, Easy TCP, Simple TCP

osmpng

English version below

Für mein SEGeo-Projekt habe ich gerade an einem neuen Tool gebastelt: osmpng

osmpng erstellt große PNG-Karten basierend auf den Kartenmaterial von OpenStreetMap (OSM).
Im Grunde lädt es kleine Kartenausschnitte von OSM-Servern herunter und erstellt aus diesen Teilausschnitten ("tiles") dann eine große Karte.

osmpng lädt einen Kartenausschnitt herunter
osmpng lädt einen Kartenausschnitt herunter

Getestet habe ich das Tool mit einem recht großen Kartenausschnitt von Innsbruck. Resultat ist eine tadellose PNG-Datei von etwa 50MB. Straßennamen und Häusernummer sind klar ersichtlich, lediglich das Laden der Datei ist etwas mühsam 🙂

Das Tool ist ein eigenes Repository auf GitHub und auf der osmpng-Seite des Blogs.

 

English version

My SEGeo-Project is growing. Today I've written a new tool for the project: osmpng.

osmpng is a simple C++ program that creates arbitrary huge PNG maps based on the data of OpenStreetMap (OSM).
In particular it downloads small map pieces ("tiles") from OSM servers and merges them to a single, possibly giant map.

The test osmpng was a ~50MB big PNG map of Innsbruck (Austria). Street names and house numbers are clear visible, only the loading of the PNG file was a bit annoying.

osmpng is found as a repository on GitHub and at the osmpng page of the blog.