Archive for the ‘sonstiges’ Category

Briefvorlage mit LaTeX

Ich bin vor kurzem umgezogen und bin inzwischen Besitzer eines Festnetztelefon. Aus diesem Grund wollte ich in meiner \LaTeX-Vorlage für meine Briefe beide Nummern stehen haben. Die KOMA-Skript Pakte können von Haus aus, nur eine Telefonnummer, deswegen habe ich meine Vorlage, welche ich von meet-unix habe, wie folgt angepasst.

\ProvidesFile{letter_options.lco}[letter-class-option file]
 
% symbols: (cell)phone, email
\RequirePackage{marvosym} 
% for gray color in header
\RequirePackage{color}
\RequirePackage[utf8]{inputenc}
 
\KOMAoptions{
foldmarks=true,
foldmarks=BlmTP,
%fromurl=true,
fromemail=true,
fromphone=true,
fromalign=right,
fromrule=aftername,
fromemail=true,
footsepline=off
}
 
% define gray for header
\definecolor{firstnamecolor}{rgb}{0.65,0.65,0.65}
\definecolor{familynamecolor}{rgb}{0.45,0.45,0.45}
 
\setkomavar{fromname}{\color{firstnamecolor}Michael\color{familynamecolor}Rennecke}
\setkomafont{fromname}{\fontsize{38}{40}\sffamily\mdseries\upshape}
 
\setkomafont{fromrule}{\color{firstnamecolor}}
\@setplength{fromrulethickness}{0.25ex}
 
\setkomafont{addressee}{\small}
\setkomavar{fromaddress}{Solarisgasse 2\\12345 Tuxhausen}
 
\newkomavar[\Mobilefone]{frommobilephone} 
\setkomavar{frommobilephone}{(01\,60)~1\,23\,45\,67}
\setkomavar{fromphone}[\Telefon]{(03\,45)~12\,34\,56\,78}
 
\setkomavar{fromemail}[\Letter]{michael\_rennecke@gmx.net}
%\setkomavar{fromurl}[]{http://0rpheus.net}
 
\firsthead{
  \noindent
  \parbox[b]{\useplength{firstheadwidth}}{
    \noindent%
    \raggedleft%
    {\usekomafont{fromname}\usekomavar{fromname}}\\
    \rule{\useplength{firstheadwidth}}{1pt}\\
    \usekomavar{fromaddress}\\
    \Telefon\enskip\usekomavar{fromphone}\\
    \Mobilefone\enskip\usekomavar{frommobilephone}\\
    \Letter\enskip\usekomavar{fromemail}
  }
}
 
\setkomafont{fromaddress}{\small\rmfamily\mdseries\slshape}
\setkomavar{backaddress}{Michael Rennecke, Große Schlossgasse 2, 06108 Halle (Saale)}
 
\setkomavar{signature}{Michael Rennecke}
% signature same indention level as rest
\renewcommand*{\raggedsignature}{\raggedright}
% space for signature
\@setplength{sigbeforevskip}{1.7cm}
 
\endinput

So sieht nun ein Beipieldokument aus:

\documentclass[letter_options,parskip=half+,version=last,fontsize=11pt,DIV=11,BCOR=10mm, DIN]{scrlttr2}
 
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english,ngerman]{babel}
\usepackage{amssymb}
\usepackage{lmodern}
 
% overall sans serif font
\renewcommand{\familydefault}{\sfdefault}
 
\setkomavar{subject}{Was machst Du}
\setkomavar{place}{Halle (Saale)}
 
\begin{document}
\begin{letter}{Karl Mustermann\\ Straße 4\\ 06019 Halle (Saale)}
 
 
\opening{Sehr geehrte Damen und Herren,}
  blabla
 
  \closing{Mit freundlichem Gruß}
\end{letter}
 
\end{document}

Ich hoffe ich konnte allen helfen, die ein ähnliches Problem haben. Ich bin für Anmerkungen dankbar, die meine Vorlage noch verbessern ;-) Wie das aussieht kann man hier sehen

Richtfest einer Mensa in Halle

Heute fand um 16:30 Uhr das feierliche Richtfest des Mensa-Neubau am von-Seckendorff-Platz. Die Festrede haben der Vorsitzenden des Verwaltungsrates Herr Prof. Lilie, der Finanzminister Herr Bullerjahn, die Kultusministerin Frau Prof. Wolff und der Rektor der Martin-Luther-Universität Halle-Wittenberg Herr Prof. Sträter gehalten. Im Anschluss haben der Stadtrat Herr Tobias Kogge sowie der Architekt Herr Prof. Schulz ihr Grußworte überbracht.

Zum Schluss kommen noch ein paar Impressionen vom Richtfest.

kurz vor dem Richtfest

Bild 1 von 19

Hochwasser in Halle

Einige Bilder vom Hochwasser in Halle. Ich habe einmal etwas an der Galerie herum gepfuscht. ich hoffe es gefällt Euch. Im Zweifel einen Kommentar schreiben.

Saalearm

Bild 1 von 51

partielle Sonnenfinsternis

Ich habe ein paar Bilder von der partiellen Sonnenfinsternis am 04.01.2011 gemacht. Der Wettergott war leider nicht ganz auf meiner Seite.  Man kann die Sonne nur erahnen… Ich hoffe ihr habt trotzdem etwas Spaß an Bildern. Ich habe versucht etwas mit der Helligkeit herum zu spielen, damit die Farben besser heraus kommen.

Nutzer anlegen im Active Directory

Ich habe vor einigen Tagen mich mit dem Active Directory beschäftigen müssen. Für mich als Solaris-User ist das eine ganz andere Welt. Deswegen habe ich mich sehr schwer getan, ohne Martin wär dieser Artikel nicht möglich gewesen. Er stand mir mit Rat und Tat eine Stunde telefonisch zur Verfügung. Danke noch einmal!

Nun zu meinen Problem: Ich wollte Nutzer aus einer spool-Datei automatisch in das Active Directory eintragen. Weiterhin mussten die Benutzer in die Organizational Unit peter_lustig_user verschoben werden. Das anlegen der Nutzer habe ich noch alleine hinbekommen. Dazu habe ich aus zahlreichen Skripten Codezeilen kopiert. Aber das Verschieben habe ich nicht hinbekommen. Martin hat mich auf die Active Directory Tools von Microsoft hingeweisen. Diese fangen alle mit ds an. Mit dsquery * habe ich mich durch die Struktur des Active Directory gewühlt. Das grafische Frontend ist zwar schön, aber da habe ich nicht mitbekommen, aber da weiß ich nicht wie der Distinguished Name aussieht…
Zum Schluss bin ich zu folgen Skript gekommen:

Set args = WScript.Arguments
profile_pfad = "\\odin\homes\%username%\profile"
gruppe_neu = "benutzer"
if args.count <> 1 then
	MsgBox "Es muss genau eine spool-Datei angegeben werden"
	Wscript.quit
End If
Randomize
protokoll = "C:\Dokumente und Einstellungen\Administrator\Desktop\skripte\protokoll.txt"
Set fs = CreateObject("Scripting.FileSystemObject")
' Das WScript.Network-Objekt liefert den Namen des Computers
Set net = CreateObject("WScript.Network")
' Protokolldatei öffnen
Set output = fs.CreateTextFile(protokoll, True)
'Holt den Namen des Computers aus dem net Objekt
name = net.ComputerName
Set computer = GetObject("WinNT://" & name)
' Datei öffnen
dateiname = args(0)
If Not fs.FileExists(dateiname) Then
	MsgBox "Die Datei (" & dateiname & ") existiert am angegebenen Ort nicht!"
	WScript.Quit
End If
Set infos = fs.OpenTextFile(dateiname)
' Datei zeilenweise bis zum Ende (atEndOfStream) lesen:
Do Until infos.AtEndOfStream
	' eine Zeile einlesen
	zeile = infos.ReadLine
	' Informationen durch Semikola splitten
	details = Split(zeile, ";")
	username = Trim(details(0))
	' Konto anlegen
	Set kontoneu = computer.Create("User", Trim(details(0)))
	kontoneu.FullName = Trim(details(1))
	kontoneu.Profile = profile_pfad
	' Passwort auslesen, wenn es das default-Passwort ist, dann generiere ein Passwort
	passwort =  Trim(details(2))
	if passwort = "du34!$7_.4-@" then
		passwort = Trim(genPasswort)
		kontoneu.PasswordExpired = CLng(1)
	end if
	kontoneu.SetPassword passwort
	' Ablaufdatum setzten
	if trim(details(3)) <> "never" then
		kontoneu.AccountExpirationDate = Trim(details(3))
	end if
	' Normales Benutzerkonto
	kontoneu.UserFlags = 512
	if not fs.FolderExists("\\odin\homes\" & username) then
		set folder = fs.CreateFolder("\\odin\homes\" & username)
		set folder_files = fs.createfolder("\\odin\homes\" & username & "\files")
		set folder_profile = fs.createfolder("\\odin\homes\" & username & "\profile")
		set IShellDispatch2 = CreateObject("Shell.Application")
		Call IShellDispatch2.ShellExecute("C:\skripte\subinacl", "/file \\odin\homes\" & username & " /setowner=" & username, , , 0)
		Call IShellDispatch2.ShellExecute("c:\skripte\subinacl", "/subdirectories \\odin\homes\" & username & " /setowner=" & username, , , 0)
		Call IShellDispatch2.ShellExecute("C:\skripte\cacls", "\\odin\homes\" & username & " /T /G Administratoren:F " & username & ":F System:F < echo j", , , 0)
	end if
	err.clear
	On Error Resume Next
	kontoneu.SetInfo
	if Err.number = 0 then
		WriteLog "Benutzername:  " & username & "   Passwort: " & passwort
		AddToGroup gruppe_neu, kontoneu.ADsPath
		' User in die ou peter_lustig_user verschieben
		set dsMove = CreateObject("Shell.Application")
		dsMoveArg = " " & Chr(34) & "CN=" & username & ",CN=Users,DC=w2k8-pool,DC=windows,DC=0rpheus,DC=net" & Chr(34) & _
	                       " -newparent " & Chr(34) & "OU=peter_lustig_user,DC=w2k8-pool,DC=windows,DC=0rpheus,DC=net" & Chr(34)
		Call dsMove.ShellExecute("dsmove", dsMoveArg, , ,0)
	else
		if Err.number = -2147022672 then
			WriteLog "Fehler beim Anlegen von " & username & ": Nutzer existiert bereits"
		else
			WriteLog "Fehler beim Anlegen von " & username & ": " & Err.Number
		end if
	end if
	Err.Clear
Loop
' Dateien schließen
infos.Close
output.Close
' Protokoll anzeigen:
'SYS: Microsoft (r) Script Runtime
Set wshshell = CreateObject("WScript.Shell")
wshshell.Run """" & protokoll & """"
Sub AddToGroup(gruppenname, kontoname)
	On Error Resume Next
	Set gruppe = GetObject("WinNT://" & ComputerName & "/" & gruppenname & ",group")
	gruppe.Add kontoname
	gruppe.SetInfo
	If Err.number = 0 Then
		'WriteLog "Konto ist Mitglied in Gruppe " & gruppenname
	Else
		'WriteLog "Konto konnte nicht zum Mitglied in Gruppe " & gruppenname & " gemacht werden."
	End If
	Err.Clear
End Sub
 
Sub WriteLog(text)
	' eine Zeile ins Protokoll schreiben und Leerzeile einfügen
	output.WriteLine text & vbCrLf & vbCrLf
End Sub
 
function genPasswort()
	password = ""
	for i=1 to 12
		if Int(100*Rnd mod 2 ) = 1 then
			password = password & chr(Int(61*Rnd+33))
		else
			password = password & chr(Int(29*Rnd+97))
		end if
	next
	genPasswort = password
end function

Der AD-Guru oder Windows-Hardcore User wird sicher sagen, wie dumm ist das denn, das geht in einen 3-Zeiler. Aber ich kann kein Windows und will es eigentlich auch nicht lernen :P Wenn ich Zeit hätte wüsste ich wie man mit den ds*-Tools das ganze schöner machen könnte. Ich habe das komplette Skript hier rein gestellt, da man sicher die ein oder andere Zeile klauen kann *g*. Der Passwortgenerator ist schlecht, es war aber die schnellste Lösung.

Meine Canon EOS 40D

Seit gestern bin ich stolzer Besitzer einer Canon EOS 40D. Ich muss sagen es ist eine super Kamera. Sie passt sehr gut in meine großen Hände.

Dahlie

Bild 1 von 3

orange Dahlie, über den Zaun fotografiert.

Metadaten

Kameratyp Canon EOS 40D
Blende F 0
Brennweite 0 mm
Belichtungszeit 1/130 Sek.
Datum/Zeit 6. September 2010 19:37

Optischer Randausgleich

Ich schreibe meine Diplomarbeit mit \LaTeX. Da bekommt man auch einen schönen Blocksatz hin. Der Blocksatz wird auf dem gesamten Absatz, unter beachtung möglicher Worttrennungen berechnet. Deswegen sieht der Blocksatz besser aus als mit Word. Man kann den Blocksatz noch verbessern, indem man den optischen Randausgleich nutzt. Das funktioniert wie normaler Blocksatz, mit dem unterschied, dass der Grauwert des linken Rand gleich ist. Ein Bindestrich ragt z.B. mehr in Rand hinein als ein m. da ein Bindestrich weniger schwarz enthält als ein m. Für das Auge sieht der linke Rand nun gerade aus. Man muss dafür nur das Package microtype einbinden. Hier ist die Doku dazu.

...
%optischer Randausgleich aktivieren
\usepackage{microtype}             % ist auf alten Installation nicht immer vorhanden
% \usepackage[activate]{pdfcprot}  % wird nicht mehr weiter entwickelt
...

LaTeX: Bilder an eine bestimmte Stelle platzieren

Wenn man bei \LaTeX Bilder einfügt, dann wundert man sich vielleicht, dass sie an einer anderden Stelle sind. \LaTeX setzt normal die Bilder so, dass man möglichst wenig weiße Fläche hat. Manchmal möchte man erzwingen, dass ein Bild an einer bestimmten Position ist. Dafür gibt es das alte Package here, welches inzwischen bei TeX Live durch float ersetzt wurde.

\usepackage{float} % lädt das Paket zum erzwingen der Grafikposition
%\usepackage{here} auf älteren LaTeX Distributionen
 
\begin{document}
 
\begin{figure}[H]
   %mit dem großen H wird die Grafikposition auf HERE gesetzt
   \centering
   \fbox{ %erzeugt einen Rahmen um die Grafik
      \includegraphics[angle=0,width=5cm]{Bild.png}
   }
\end{figure}
 
\end{document}

Zertifikatfehler bei gmx

Ich habe mich heute früh mit meinem thunderbird und icedove herumgeärgert, weil ich Zertifikatfehler von gmx bekommen habe. Ich dachte erst, dass es das pop3-Zertifikat ist. Bis ich auf die Idee gekommen bin, dass es das Zertifikat für den mediacenter ist. Dort habe ich meine Kalender abgelegt.

Nachdem ich nun das Problem erkannt habe, habe ich eine Mail an den webmaster von gmx geschrieben. Die bekommt man mit whois heraus. (In solchen Fragen vertraue ich keiner minderbemittelten Kraft aus einem Callcenter (Ich weiß nicht wie das Personal bei gmx ist)) Für mich war es sehr erfreulich, dass ich sehr zeitnah eine Antwort vom Webmaster bekommen habe. Dieser hat in der Zwischenzeit das Problem behoben bzw. beheben lassen.

Einem Admin können immer einmal Fehler passieren. Ich finde es gut, dass der Fehler schnell behoben wurde und sich der Admin bedankt hat. So muss ich letztendlich sagen, weiter so gmx.

“Sichere” Captchas programmieren

Man möchte manchmal Teile seiner Seite mittels Captchas schützen. Es gibt zahlreiche fertige Varianten, auch für wordpress. Diese haben fast immer den Nachteil, dass sie JavaScript, Flash, oder Sessions benutzen. Persönlich habe ich eine Abneigung gegen JavaScript und Flash. Sessions lassen sich nicht immer nachträglich nutzen und man erzeugt serverseitig etwas Last. Fakt ist, dass ich keine Sessions mag! Das schlimmste an fertigen Captcha-Lösungen ist der zum Teil invalide html-Code. Ich möchte validen xhtml 1.0 strict-Code haben und das Captcha sollte in mein Design passen. Wenn man die ganzen Anforderungen erfüllt haben möchte, so muss man wohl oder übel sein Captcha selbst programmieren.

Wie komme ich zum sicheren Captcha

Wenn ich auf Sessions verzichten möchte, so muss ich die Lösung des Captcha mit auf die Seite schreiben. Das kann man in einen nicht sichtbaren Feld machen. Damit man dieses Feld nicht so einfach auslesen kann, schreibt man einen Hash hinein bzw. man verschlüsselt den Inhalt.

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
70
71
72
73
74
75
76
define(KEY, "Ich bin ein Key");
define(IV, "KlyV6gxG3MOPzlfuj8azF6sKKTnsdsiN58i0zjHA0EU=");
 
function Crypt($plaintext){
    $td = mcrypt_module_open('rijndael-256', '', 'ofb', '');
 
    $iv = base64_decode(IV);
    $ks = mcrypt_enc_get_key_size($td);
 
     /* Create key */
    $key = substr(md5(KEY), 0, $ks);
 
    /* Intialize encryption */
    mcrypt_generic_init($td, $key, $iv);
 
    /* Encrypt data */
    $encrypted = mcrypt_generic($td, $plaintext);
 
    /* Terminate decryption handle and close module */
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
 
    return base64_encode($encrypted);
}
 
function Decrypt($chiffre){
    $td = mcrypt_module_open('rijndael-256', '', 'ofb', '');
 
    $iv = base64_decode(IV);
    $ks = mcrypt_enc_get_key_size($td);
 
     /* Create key */
    $key = substr(md5(KEY), 0, $ks);
 
    $chiffre = base64_decode($chiffre);
    mcrypt_generic_init($td, $key, $iv);
    $plaintext = mdecrypt_generic($td, $chiffre);
 
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
 
    return $plaintext;
}
 
function draw_captcha_form(){
    .....
    $time = time() + 60*30;
    $captchaSolution = "Test"
    echo "\t\n\tBitte Captcha lösen<br/>\n";
    // erzeuge ein Captcha
    echo "\t\n";
    echo "\t" . '
<input name="captvalue" id="captvalue" value="" size="40" tabindex="4" type="text"/>' . "\n";
    echo "\t"    . '
<input name="captcha" value="'. Crypt($time . "~" . $captchaSolution . "~" . $REMOTE_ADDR) . '" type="hidden"/>' . "\n";
}
 
function check_post($) {
    ....
    $captcha = $_POST['captvalue'];
    list($timeOld, $secret, $addr) = explode('~',Decrypt($_POST['captcha']));
    ....
    if($timeOld <= time()){
            echo "Deine Zeit ist abgelaufen";
            return;
    }
    if($addr != $REMOTE_ADDR){
            echo "Falsche IP";
            return;
    }
    if($secret != $captcha){
            echo "Falsches Captcha";
            return;
    }
    .....
}

Mit diesen Ideen kann man sich nun sein eigenes Captcha zusammen bauen. Ich generiere z.B. Matheaufgaben.