To protect your USB-stick with a password you have to format it first with the Disk Utility program to the Mac OS Extended (Journaled) format with the GUI-Partitiontable.

Attention Please make a backup before you’re formatting it!!!

Then just go into the terminal and enter diskutil list. Here should see the USB drive listed (in my case it’s /dev/disk2)

In case you’ve only one partition on this USB stick you’ve to convert disk2s2 to a AppleCoreStorage with using you own passphrase. You can do this with the following command.

1
diskutil cs convert disk2s2 -passphrase yoursupersecurepassphrase

After some minutes the USB stick should be remounted and it’s protect with the passphrase of your choice. When you want you can save the passphrase in your local keychain so that you don’t have to enter it always again.

But in case that someone will “find” your USB-stick, he’ll have no access to the data that are stored on it without knowing the passphrase.

Comment and share

For some reasons it could be necessary to execute a job in scheduled time.
When running the job within a Docker container there’re two ways to do this.

The first would be to create a cron job on the server on which Docker is
running and let them execute the job with docker run.

The second way would be to let do everything within the Docker container.
But you don’t need to implement any scheduling functionality since it’s out of
the box available from any Linux based container.

For example when your container is using the tiny Alpine base image you can use
crond for it. The following code snippets are showing you everything what
is todo.

run.sh

1
2
3
4
5
#!/bin/sh

NOW=$(date +"%T")

echo "Hello from the job at ${NOW} in $(pwd)" >> /dev/stdout

Dockerfile

1
2
3
4
5
6
FROM alpine:latest

COPY ./job.sh /etc/periodic/15min/job
RUN chmod +x /etc/periodic/15min/job

CMD ["crond", "-fS"]

The dockerfile is doing two things. It’s copying the job.sh into a
predefined folder and mark them as executable.

All scripts that are within this folder will be executed by
crond every 15 minutes. There’re more predefined folders under
etc/periodic to let run a job hourly, daily, weekly or once per month.
In case you need more flexibility you’ve to change the crontabs file for the
root user manually.

The program crond comes with the tiny Alpine image but it will not be
executed automatically as a background daemon.

It’s possible to let run crond as a foreground process, which is intersting
for us. Since we need a process wich is running always, otherwise our Docker
container will be finished immdiately after it was started. So with giving
dockerd the -f flag as argument it will run constantly as a foreground
process and our Docker container will also running continuously.

Please keep in mind that it’s required that the script in the targetfolder
don’t have the .sh extension, otherwise run-parts which is used from
crond, will not use your script.

Please keep also in mind that the workingdirectory where the job.sh will be
executed is the /root folder. So maybe you’ve to change
the working directory in the job.sh at first before executing whatever
you’ve to execute…

Comment and share

From C# to Python

in development

Last week I did my first steps with Python) and I was really suprised about this programming language that has such a long history.

It provides features that I wouldn’t expect. To dive deeper into the language I solved a Kata,
what I mostly do when learning a new programming language. This time I choosen the StringCalculator kata from Roy Osherove. You can find the source code on my github page.

One of the nice features I found was list comprehensions feature.

1
2
[number for number in [1, 2, 1000, 1001] if number <= 1000]
# returns [1, 2, 1000]

Another nice feature was the built-in any function. It does the same like the same linq function from C#. It returns true when any element of the iterable returns true.

1
2
any(number < 0 for number in [-1,2,3])
# returns true

The same is for the filter function. It takes a function as first parameter that returns a boolean and returns all elements from the given list whith those elements for which the function returns true.

At least I used a feature that ES6 also provides, the Destructuring assignment. So in the Kata I used a regular expression to split the definition of delimiter from the list of numbers.

1
2
3
4
5
match = myRegex.search(input)
if match:
delimiter, input = match.groups()

return delimiter, input

The regex returned in a positive case two groups. Both groups I could directly assign to the variables delimiter and input and also return this variables as result of the function. In this case both variables will be automatically packed as a tuple and in the calling function unpacked and assigned to two another variables, very nice…

So I’m just at the beginning of journey through the features of python and I’ll post here more about my experiences…

Comment and share

Today I had the problem, that someone has used the port 3000 on my macbook and I couldn’t start my node.js server.
At first I tried to close all open terminal windows and exit the terminal app, but this wasn’t the solution for my problem.

Now I’ve tried to find out wich process uses the port. For that I entered the following command in the terminal:

1
lsof -i :3000

This command returns me informations about the process that is using my port. With the processid I’m now be able to kill the process.

1
kill -9 11381

Comment and share

Reisebericht Dubai

in Urlaub

Gleich im Anschluss an unseren Urlaub in Indien machten wir einen Zwischenstop in Dubai, um auch diese Stadt kennenzulernen. Und was soll ich sagen, wo Dubai aufgrund der vielen positiven Eindrücke einfach ein Traum war, war Indien manchmal eher ein Albtraum für uns.

Dubai ist eine Stadt, die mit vielen Superlativen glänzen kann. Wir haben zwei geführte Touren mitgemacht und unsere Tourguides haben wirklich sehr oft die Worte “Das höchste”, “Das größte”, “Das beste” usw. gebraucht. Was hier vor allem im neuen Jahrtausend entstanden ist, sucht wirklich seinesgleichen.

Erst als die Engländer gingen und das Öl kam, blühte Dubai und die anderen Städte wie Abu Dhabi auf, und wurde zu dem was es heute ist. Vom ehemaligen Dubai kann man sich heute nur noch im wirklich sehr interessanten und gut gemachten Museum einen Eindruck machen. Im Gegensatz zu Indien, wo es in vielen Regionen noch wie vor hundert Jahren zugeht, sowohl was den Glauben als auch die Lebensumstände angeht. Dubai verlässt sich aber nicht nur auf sein Öl, denn davon hat es eh nicht mehr all zuviel. Deshalb hat Dubai in vielen anderen Industriezweigen deutlich ausgebaut und für die Zukunft vorgesorgt, so dass das Öl nur noch 10 % des Einkommens des Emirats ausmacht.

Dubai machte auf uns nicht den Eindruck einer in Glaubensfragen rückständigen Religion. Die, aus islamischer Sicht, freizügig und unzüchtig bekleideten Frauen waren allerorts zu sehen und scheinen niemanden zu stören.

Überhaupt haben wir über Dubai Dinge erfahren, die man sich eigentlich gar nicht vorstellen kann. So bekommt in Dubai z.B. jedes einheimische Paar vom Staat ein Haus geschenkt und zur Hochzeit noch Geld obendrein. Strom und Wasser sind kostenlos, genauso wie die medizinische Versorgung und das Studium an der eigenen Universität. Wohlgemerkt gilt das nur für den sehr geringen Teil an einheimischen Paaren. An eine Revolution wie sie in anderen arabischen Ländern, wie Ägypten oder aktuell Syrien statt gefunden hat, ist hier nicht zu denken. Warum auch, den einheimischen Menschen hier geht es sehr gut und auch vielen der Emigranten, die den größten Teil der Bevölkerung ausmachen.

Dubai ist eine Stadt, die sehr neu wirkt. Kaum einer der Wolkenkratzer ist älter als 10 Jahre. Die Strassen sind in einem sehr guten Zustand und sehr großzügig, dem, bei über 1.000.000 angemeldeten Kraftfahrzeugen (Stand 2010), sehr großen Fahrzeugaufkommen angemessen. Einen großen Teil davon nehmen die Taxis ein. Man steht wirklich nie mehr als 5 Minuten irgendwo, ohne das ein Taxi vorbeikommt. Und Taxi fahren ist wirklich sehr günstig in Dubai. Und wem das immer noch zu teuer ist, der kann auf den öffentlichen Verkehr ausweichen. Das Busnetz und auch die U-Bahn ist sehr gut ausgebaut. Und wenn man befürchtet, beim Warten auf den Bus einen Hitzekoller zu bekommen, fast jede Haltestelle ist mit einem klimatisierten Warteraum ausgestattet. Die U-Bahn selbst wartet auch mit einer Überraschung auf, sie war weltweit die erste, die führerlos ist.

In Dubai scheint wirklich sehr vieles im Überfluss und auch maßlos zu sein. Wenn ich allein an die Dubai Mall denke, die im Vergleich zu dem Münchner Einkaufszentrum Riem Arkaden mindestens 4 mal größer ist. Dort gibt es wirklich jeden Markenhersteller im eher oberen Preisbereich. Im Verkaufszentrum selbst befindet sich ein Kino (vergleichbar mit dem Münchner Mathäser) und eine große Eislaufbahn, auf der am Vormittag auch das Eishockeyteam (!!!) von Dubai trainiert. Für Kinder gibt es, neben unzähligen Spielegeschäften, auch eine eigene Erlebniswelt in der Eltern ihre Kinder wirklich maßlos verwöhnen können. Und genau das machen viele der Einheimischen auch, sei es beim Spielen, als auch beim Essen, was wir an den vielen übergewichtigen Kindern sehen konnten. Es ist wirklich kaum in Worte zu fassen, auf welche Gegensätze wir bei diesen zwei Urlauben getroffen sind. Auf der anderen Seite sahen wir in Indien Kinder, die morgens nach dem Aufstehen betteln gehen müssen, um wenigstens eine Mahlzeit zu bekommen.

Wir waren natürlich auch auf “The Palm, Jumeirah”, der einer Palme nachempfundenden künstlich angelegten Insel. Dort waren wir im Atlantis, dem größten Hotel von Dubai, und auch einem der größten Welt. Im Hotel wartete eines der größten Aquarien der Welt auf uns, dass wirklich einen beeindruckenende Einblick in die Unterwasserwelt bot.

Der Höhepunkt unserer Besuchs in Dubai war allerdings der Ausflug auf den mit 828 m aktuell höchsten Gebäude der Welt, dem Burj Khalifa. Die Aussichtsplattform lag leider nicht ganz oben, aber 452 m sind trotzdem mehr als beeindruckend. Mit dem Fahrstuhl ist man in genau 60 Sekunden oben. Auf der Aussichtsplattform konnte man durch ein spezielles Fernglas in den historischen Modus schalteten war da, wo sich heute ein Wolkenkratzer neben den anderen reiht, nichts als Wüste oder maximal sehr niedrige Wohngebäude der Beduinen befanden. Die Aussicht auf Dubai war wirklich atemberaubend.

Wir waren nur knapp 3 Tage in Dubai, konnten aber sehr vieles, aber leider nicht alles sehen. So gibt es z.B. in Dubai noch ein natürlich überdachtes Skicenter, an dem wir auch vorbeigefahren sind, aber leider nicht drin waren.
Dubai war auf jeden Fall ein Erlebnis, das ich jedem, den die Hitze nicht abschreckt, weiter empfehlen kann.

Wir haben natürlich auch viele Bilder gemacht. Die besten habe ich wie immer bei Google+ online gestellt. Ihr könnt sie Euch hier anschauen.

Wir hoffen, das sie Euch gefallen!

Ihr Euch könnt Euch noch ein selbst aufgenommenes Video von der Wasserfontänenshow, die jeden Tag direkt vor dem Burj Khalifa aufgeführt wird, bei Youtube anschauen.

Comment and share

Reisebericht Indien

in Urlaub

Eigentlich wollte ich von meiner Reise nach Indien einen ausführlichen Reisebericht schreiben und habe das in meinem privaten Tagebuch auch jeden Tag gemacht.

Da ich aber über die Zustände in Indien sehr enttäuscht und eigentlich auch schockiert war, möchte ich hier nur mein Fazit der Reise ziehen.

Indien, oder besser Hindustan, ist ein Land mit einer langen Geschichte mit viel Tradition und mit für uns Europäer doch recht ungewöhnlich und teilweise befremdlichen Sitten und Gebräuche. Wenn ich allein an die Rolle und Rechte der Frau in Indien denke, so denke ich, dass wir in Europa deutlich weiter sind. In Indien geht die Schere zwischen Arm und Reich doch deutlich auseinander. Man denkt, das man eine Zeitreise unternimmt, allein wenn man in Dehli zwischen den modernen Stadtvierteln und den recht alten und ärmlich wirkenden Vierteln in Alt-Dehli, aber auch in Neu-Dehli reist. Noch größer ist der Unterschied, wenn man auf das Land kommt. Da fühlt man sich wirklich um 100 Jahre und mehr in der Zeit zurückversetzt. Die hygienischen Bedingungen in Indien auf den Strassen und in den “Wohnungen” der Armen sind wirklich katastrophal. Das schlimmste ist, dass die wenigsten Einheimischen sich dessen überhaupt bewusst sind und deshalb auch nicht im Traum daran denken, dass sich diese Situation ändern muss oder kann.

Die Tatsache, das in einem eigentlich wohlhabenden Land, wie Indien, in der keine Diktatoren sich bereichern, Kinder morgens, statt in die Schule, betteln gehen müssen, um am Abend nicht mit einem leeren Magen einschlafen zu müssen, hat mich wirklich sehr nachdenklich und traurig gemacht. Als ich einmal drei Kindern je 10 Rupien in die Hand gedrückt habe, standen ein paar Minuten später, gleich drei mal soviel vor dem Bus. Das zeigt, das die Armut eigentlich noch viel Schlimmer ist, als es auf den ersten Blick schon erscheint.

Ich hatte eigentlich den größten Teil der Reise ein sehr schlechtes Gefühl, weil die Armut und der Schmutz doch die positiven Momente überwog. Ich glaube, ich werde nie den Anblick der wahren Flut an Menschen vergessen, die mehr oder weniger durch den Tag vegetieren und deren Sinn des Lebens darin besteht, irgendwie etwas Geld für Essen zu erbetteln.

Die Reise nach Indien war für uns sehr interessant, zum großen Teil für uns aber ein eher unangenehmes Erlebnis.

Wir haben natürlich auch viele Bilder gemacht. Die besten habe ich wie immer bei Google+ online gestellt. Ihr könnt sie Euch hier anschauen.

Comment and share

Using hooks in git

in develop

Wenn man nach “git hooks” sucht, findet man jede Menge Links zu guten Beschreibungen, was es für verschiedene Hooks in Git gibt und was man alles damit machen kann.

Deshalb möchte ich mich in diesem Artikel darauf beschränken, zu beschreiben, wie ich den post-commit hook in einem meiner Projekte verwende.

Ich habe für mich mit MarkDocein kleines Wiki erstellt das ich über die Github-Websites über wiki.janbaer.de erreiche. Dieses Wiki wird mit einfachen Textdateien im Markdown Format erstellt und über ein Python Script in HTML umgewandelt.

Ich habe jeweils für Text- und HTML-Dateien ein eigenes Git-Repository eingerichet, damit ich die HTML-Dateien über GitHub als Webseiten publishen kann.

Nun möchte ich, das, sobald ich einen Commit in meinem Source Repository gemacht habe, automatisch die HTML-Dateien erstellt und das Ergebnis dann gleich zu Github gepusht wird.

Um den Vorgang zu automatisieren, habe ich im Unterordner .git/hooks die Datei post-commit-sample in post-commit umbenannt und mit chmod aus ausführbar markiert.

1
2
3
4
cd .git/hooks
mv post-commit-sample post-commit
chmod +x post-commit
cd ../..

In die post-commit Datei habe ich jetzt folgende Befehle eingefügt

1
2
3
4
5
6
7
8
9
message=$(git log -1 HEAD --pretty=format:%s)
git push
markdoc build
pushd .

cd ~/DropBox/WebSites/wiki
git add .
git commit -m "$message"
git push
popd .

In der ersten Zeile hole ich mir die Commit-Message aus meinem letzten Commit, damit ich diese an Commit für das zweite Git-Repository verwenden kann. Danach werden zuerst mal meine Änderungen auf Github gepusht. Über markdoc build werden die neuen HTML-Dateien erstellt. Danach wechsle ich in das Verzeichnis, in dem sich mein zweites Git-Repository befindet und führe dort die nötigen Git-Befehle aus, um die neuen oder geänderten Dateien zu commiten und zu Github zu pushen.

Leider gibt es keinen Hook für pre-push. Diesen könnte man gut verwenden, um einen lokalen Build mit anschließenden UnitTests durchzuführen. Das möchte ich ungern bei jedem Commit machen.

Comment and share

In meinem letzten Projekt war eine meiner Aufgaben, ein Script zu erstellen, das eine definierte Verzeichnisstruktur erstellt und einem bestimmten User die notwendigen Zugriffrechte darauf gibt.
Weiterhin sollte das Script dann im IIS eine Website mit einem eigenen AppPool in diesem Verzeichnis erstellen.

Ich hatte mich entschieden, das Script mit Powershell zu erstellen, da es hier schon fertige Module von Microsoft gibt, um den IIS zu verwalten, ohne das man dies über WMI machen müsste.

Um dieses Modul allerdings zu verwenden, muss man es in Powershell erst einmal importieren. Das macht man ganz einfach mit foldener Codezeile.

1
Import-Module -Name WebAdministration

Damit das Module importiert werden kann, muss der IIS mit den Management Services installiert sein. Will man prüfen, ob das Modul auch wirklich installiert ist, so kann man das mit folgendem Code machen und im negativen Fall den Benutzer darauf hinweisen.

1
2
3
4
if ((get-module -name WebAdministration -erroraction silentlycontinue) -eq $false) {
Write-Host "The Powershell module for WebAdministration is not installed! Please check your IIS installation!" -f Red
return
}

Die Website erstellt man dann mit folgendem Code

1
2
3
4
5
6
7
$integrated = 0
New-WebAppPool -Name $appPoolName
Set-ItemProperty IIS:AppPools\$appPoolName managedRuntimeVersion v4.0
Set-ItemProperty IIS:AppPools\$appPoolName managedPipelineMode $integrated
New-Website -Name $webServiceName -PhysicalPath $directoryPath -ApplicationPool $appPoolName
Remove-WebBinding -Name $webServiceName
New-WebBinding -Name $webServiceName -IPAddress "*" -Port $port -HostHeader $webServiceName

Seit IIS7 ist es so, das der AppPool nicht mehr wie früher mit dem Account NetworkService läuft sondern es dafür eigene IIS AppPool Identities gibt. Wenn man einen neuen AppPool erstellt, läuft dieser unter dem Benutzer IIS AppPools\AppPoolname. Es müssen diesem Benutzer noch die Zugriffsrechte auf das Verzeichnis gegeben werden. Normalerweise sollten diesem Benutzer nur auf bestimmte Verzeichniss, wie das Log-Verzeichnis Schreibrechte gegeben werden. Auf die anderen Verzeichniss reichen Lesezugriffsrechte. Auch hierfür hat die Powershell schon die notwendigen Commandlets an Board.

1
2
3
4
5
6
$acl = Get-Acl -Path $directory
$userAccount = New-Object System.Security.Principal.NTAccount("IIS AppPool", $userName)
$permission = $userAccount, $right, "ContainerInherit,ObjectInherit", "None", "Allow"
$right = New-Object System.Security.AccessControl.FileSystemAccessRule $permission
$acl.SetAccessRule($right)
Set-Acl -AclObject $acl -Path $directory

Die meisten Codebeispiele erstellen die Permission mit der folgenden Codezeile

1
$permission = $userAccount, $right

Das hat aber den Nachteil, das sich diese Berechtigung nicht auf neue Unterordner veerbt. Deswegen ist die erste Variante in den meisten Fällen sicher die zu bevorzugende.

Comment and share

LinqPerformanceTips

in develop

In my latest project I learned some thinks about the performance of Linq when you often query in-memory repositories. Linq is very easy to use and with that you can very quick implement the methods that you need for an repository. But sometimes it’s useful to think a little bit more how often a method will be called. In my latest project I had the situation to call the GetById method for more than 20.000 times. And my in-memory repository had more than 700 items. In my first attempt I have used the SingleOrDefault method to return the correct item. But this was not fast enough. My function has needed more than 2 seconds in sum. My second attempt was, to convert the items into a Dictionary with the id as key and use this dictionary in the GetById function. And this was so much faster. It needs just 220 ms for all calls and this was the performance that I needed.

To generate a dictionary very quick, you can use an extension method from the System.Linq namespace. With the following code you can do this very easy

1
items.ToDictionary(i => i.Id);

The same experience I made with the query for any items with the same key. The Linq function SelectMany was in summary to slow. In this situation you can’t use a dictionary because the key isn’t unique. But Linq has also an Extension method to solve this problem. With the ToLookup function you can generate a very fast lookup table.

1
items.ToLookup(i => i.{PropertyToLookup});

Comment and share

Jan Baer

I’m a passionated Softwaredeveloper from Munich.


Softwaredeveloper


Germany