web2bibtex.ps1: BibTeX-Einträge für Onlineartikel aus Fachzeitschriften generieren

Ich pflege mit Zotero eine Liste aller von mir gelesenen Fachartikel. Dazu ist es notwendig, die Metadaten dieser Artikel zu erfassen. Da ich jedoch wenig Spaß daran habe, das für mehrere Artikel pro Woche manuell zu tun, habe ich mir ein kleines PowerShell-Script geschrieben, das aus den Beschreibungen der Artikel auf den Websites der Zeitschriften die verfügbaren Metadaten extrahiert und als BibTeX-Datei ablegt. Diese kann ich dann einfach in Zotero importieren.

Das Script verarbeitet aktuell die Websites folgender Zeitschriften, kann aber sehr einfach durch ein paar zusätzliche reguläre Ausdrücke um weitere Zeitschriften ergänzt werden.

Hier ein Beispiel: Um den Artikel Designing Web Usability 2011: Zur Aktualität des Buch-Klassikers von Jakob Nielsen von Michael Köster zu erfassen, übergebe ich einfach die Adresse des entsprechenden Online-Beitrags an das Script. Es erstellt dann aus den dortigen Angaben die folgende BibTeX-Datei.

Screenshot eines Artikels der objektSPEKTRUM
  1. @article{Köster2011,
  2.  title = {„Designing Web Usability” 2011: Zur Aktualität des Buch-Klassikers von Jakob Nielsen},
  3.  shorttitle = {Köster2011},
  4.  url = {http://www.sigs-datacom.de/fachzeitschriften/objektspektrum/archiv/artikelansicht.html?tx_mwjournals_pi1[pointer]=0&tx_mwjournals_pi1[mode]=1&tx_mwjournals_pi1[showUid]=6905},
  5.  abstract = {Im Jahr 1999, in Zeiten von Netscape und Internet Explorer 4, veröffentlichte Jakob Nielsen seinen Klassiker „Designing Web Usability”. Nielsens klare Sprache haben seinen Namen zu einer Marke werden lassen und die Inhalte seiner Bücher zum einem Element der universitären Curricula. Aber welche Relevanz haben seine Regeln angesichts schneller Browser, neuer Standards, kompilierender Skript-Engines und hoch-verfügbarer Netzverbindungen heute noch? Im Jahr 2011 gibt es eine weit größere Anzahl an konkurrierenden Buchtiteln als damals. Ein erneuter Blick ins Buch erzeugt ein nur in Teilen revisionistisches Gesamtbild.},
  6.  number = {04/2011},
  7.  journal = {objektSPEKTRUM},
  8.  author = {Köster, Michael},
  9.  month = {aug},
  10.  year = {2011},
  11.  pages = {0}
  12. }

Download

web2bibtex.ps1

Excel 2007/2010: Menü Daten (und weitere) komplett ausgegraut

Heute hatte ich das seltsame Problem, dass bei einer Excel-Datei das komplette Menü “Daten” und weitere Funktionen (insb. auch AutoFilter) ausgegraut waren:

Excel 2010: Menü Daten ausgegraut

Die Lösung war so einfach wie seltsam: Es waren zwei Tabellenblätter gleichzeitig ausgewählt (durch Klicken mit gedrückter STRG-Taste):

Excel 2010: 2 Tabellenblätter gleichzeitig ausgewählt

Diese Auswahl wurde auch beim Speichern der Datei mitgespeichert, sodass beim Neuöffnen das Problem immer noch bestand. Sobald man die Doppelauswahl durch Klicken mit gedrückter STRG-Taste auf eines der Blätter wieder aufhebt, geht wieder alles.

Excel 2010: 1 Tabellenblatt gleichzeitig ausgewählt

Oracle: How to call a function from the SQL*Plus command line

23. Mai 2011 um 21:33:32 - Beitrag Nr. 1061
Schlagwörter: , ,

If you would like to verify the result of a function call in Oracle SQL*Plus you could simply include it in a SQL select statement like this:

  1. CREATE OR REPLACE FUNCTION testfunction(testparm IN NUMBER)
  2.   RETURN(testparm);
  3. END testfunction;
SQL> select testfunction(123) from dual;
 
TESTFUNCTION(123)
-----------------
              123
 
SQL> 

Kurz/Rieger: Die Datenfresser

Wer sich (wie ich) schon immer gefragt mal hat, was eigentlich genau das Problem mit dem freigiebigen Umgang mit persönlichen Daten ist, dem empfehle ich aktuell das Buch “Die Datenfresser” von Constanze Kurz und Frank Rieger:

Das Buch hat mir persönlich vor allem die Monetarisierung unserer Benutzerdaten (nicht nur im Internet) sehr anschaulich und gut verständlich erklärt. Womit/wie verdienen Google und Facebook eigentlich ihr Geld? Und was sind die Folgen für die Benutzer, die so freigiebig mit ihren persönlichen Daten umgehen?

Alle wichtigen Bereiche, in denen wir alltäglich unsere Daten preisgeben, werden abgedeckt: allen voran natürlich die ubiquitären soziale Netzwerke, Online-Buchhändler, aber auch (Offline-)Kundenkarten im Supermarkt u.a. Und auch die Daten, die wir preisgeben, ohne es zu merken, sind Thema: z.B. die Bewegungsdaten des eigenen Handys. Außerdem behandelt ein einzelnes Kapitel das (aktuelle) Thema Biometrie und die damit einhergehenden Sicherheitsprobleme.

Kurzum: das Buch bietet einen sehr guten und umfassenden Überblick über die Problematik des Datenschutzes und liefert auch Argumente gegen den alten Spruch: “Ich habe doch nichts zu verbergen”. Und nicht zuletzt die beiden fiktiven Geschichten über ein soziales Netzwerk für Haustiere und unseren (möglichen) komplett digitalisierten Alltag in nicht allzu ferner Zukunft lassen sich flüssig runterlesen.

Was meiner Meinung nach allerdings zu kurz kommt, ist das auch im Untertitel erwähnte “Zurückgewinnen der Kontrolle”. Bis auf wenige (recht offensichtliche) Tipps wie “einfach mal keine Daten angeben” enthält das im Verhältnis zu kurz geratene Kapitel zu diesem Thema wenig Nützliches.

PowerShell: Read user’s groups from Active Directory

Here’s a short PowerShell function to retrieve a list of a user’s groups from Active Directory:

  1. function getADGroups($username)
  2. {
  3.   $root = ([adsi]"").distinguishedName;
  4.   $searcher = new-object System.DirectoryServices.DirectorySearcher($root);
  5.   $searcher.filter = "(&(objectClass=user)(sAMAccountName=$username))";
  6.   $user = $searcher.findall();
  7.  
  8.   $groupNames = @();
  9.   if ($user.count -eq 1)
  10.   {
  11.     $groups = $user[0].Properties.memberof;
  12.     [regex]$regex = "^CN=(.*?),";
  13.     $groups | % {
  14.       $groupNames += $regex.matches($_) | % { $_.groups[1].value }
  15.       };
  16.   }
  17.   else
  18.   {
  19.       write-host "invalid username, result count:" $user.count -foregroundcolor "red";
  20.   }
  21.   $groupNames;
  22. }
  23.  
  24. getADGroups "macke" | % { $_ }

LINQ rules!

6. Mai 2011 um 21:48:37 - Beitrag Nr. 1033
Schlagwörter: , ,

Here’s an example of a small refactoring I did today using LINQ’s features in C#. I had this method that simply constructs a WHERE clause for a SQL statement using an IList of table prefixes:

  1. private string getWhereClauseForTablePrefixes(IList<String> tablePrefixes)
  2. {
  3.     var where = "";
  4.     if (tablePrefixes.Count > 0)
  5.     {
  6.         where += " where ";
  7.         var enumerator = tablePrefixes.GetEnumerator();
  8.         enumerator.MoveNext();
  9.         while (true)
  10.         {
  11.             where += "table_name like ‘" + enumerator.Current + "%’";
  12.             if (enumerator.MoveNext())
  13.             {
  14.                 where += " or ";
  15.             }
  16.             else
  17.             {
  18.                 break;
  19.             }
  20.         }
  21.     }
  22.     return where;
  23. }

So, e.g. for a list containing A and B the method returned where table_name like 'A%' or table_name like 'B%'. Using the Select extension method on IList, the method now looks like this:

  1. private string getWhereClauseForTablePrefixes(IList<String> tablePrefixes)
  2. {
  3.     var where = "";
  4.     if (tablePrefixes.Count > 0)
  5.     {
  6.         where += " where ";
  7.         where += String.Join(" OR ", tablePrefixes.Select(prefix => "table_name like ‘" + prefix + "%’"));
  8.     }
  9.     return where;
  10. }

Simple and concise! :-)

Seven Languages in Seven Weeks (Bruce Tate)

5. Mai 2011 um 17:26:05 - Beitrag Nr. 1045
Schlagwörter: ,

Heute habe ich meine erste Buchrezension bei Amazon geschrieben. Das war schon längst mal überfällig, aber das Buch, um das es geht, war es jetzt auch wirklich wert:

Die Kurzrezension könnte lauten: absolute Leseempfehlung für jeden (objektorientierten) Softwareentwickler :-D

Im Buch beschreibt Autor Bruce Tate sieben (völlig) unterschiedliche Programmiersprachen, die jeweils ein mehr oder weniger eigenes Konzept oder Programmierparadigma verwenden: von Ruby als OO-Sprache mit funktionalen Aspekten, über logische Programmierung mit Prolog bis hin zur reinen funktionalen Sprache Haskell ist alles dabei (wobei der Fokus auf den funktionalen Aspekten liegt). Hier kommt der Langtext meiner Rezension:

Ich habe das Buch, anders als der Autor vorschlägt, nicht gelesen und währenddessen die Programmierbeispiele praktisch ausprobiert (außer bei der ersten beschriebenen Sprache Ruby), sondern direkt runtergelesen, weil ich lediglich einen tieferen Einstieg in (aktuelle) Entwicklungen der verschiedenen Programmierparadigmen (Objektorientierung, funktional, logisch, Prototype) bekommen wollte, ohne diese praktisch anzuwenden. Und dafür ist das Buch wirklich super! Bruce Tate zeigt anhand von sinnvollen Praxisbeispielen mit sehr vielen Quelltextauszügen die Vor- und Nachteile der einzelnen Sprachen (Ruby, Io, Prolog, Scala, Erlang, Clojure und Haskell) auf und geht insbesondere auf die jeweiligen Vorzüge ein, die das Programmieren einfacher machen (syntactic sugar). Für alle, die die Sprachen auch in der Praxis ausprobieren wollen, liefert Tate nach jedem Kapitel Online-Quellen und Tipps für interessante Miniprojekte.

Dabei folgt er einem sehr sinnvollen Aufbau. Bei den ersten behandelten Sprachen werden allgemeingültige Konzepte von Programmiersprachen eingeführt und anhand von Beispielen erklärt (z.B. Pattern Matching, Rekursion, Closures, Futures) und bei den Sprachen im hinteren Teil des Buches wieder aufgegriffen und vertieft. Dabei streift Tate wirklich viele aktuelle Entwicklungen insbesondere aus dem Bereich der funktionalen Sprachen: 5 der 7 Sprachen sind entweder komplett oder in Teilen funktional. Ich kannte bislang von den vorgestellten Sprachen lediglich Prolog, sodass mir das Kapitel hierzu als kleine Auffrischung meiner Kenntnisse diente. Ich war überrascht, wie viele (hilfreiche) Konzepte es aus Prolog inzwischen in andere Programmiersprachen geschafft haben.

Für Anfänger ist das Buch wohl eher schwierig zu verstehen, da nicht lange gefackelt wird und viele grundlegende Kenntnisse vorausgesetzt werden. Für fortgeschrittene Programmierer, insbesondere aus dem Bereich der Objektorientierung, ist es jedoch ein super Buch, um einmal über den Tellerrand zu schauen. Gerade heutzutage, wo die funktionalen Sprachen immer wichtiger werden (aufgrund der guten Parallelisierbarkeit), sollte jeder Entwickler einen Blick riskieren und schauen, welche Konzepte er für seine eigene Arbeit übernehmen kann. Durch die Vielzahl an unterschiedlichen Sprachen wird das Buch definitiv nicht langweilig und man kann es richtig verschlingen.

DBDiff: a C# program to compare two databases

In one of my current projects I have to import an Oracle database dump into a development database every two weeks. But more than once there were tables missing, columns have been changed, or indices have been removed in the new dump. Of course, that led to problems with the programs that used the database.

To be able to find the differences between the old and the new database I wrote a small C# program that “diffs” two databases. It generates a textfile containing

  • a list of all tables
  • including the number of rows per table
  • a list of all indexes
  • a list of all columns and their configuration

Furthermore, it compares two of these text files and produces an output file like this:

== Missing tables ==
TABLE1

== Added tables ==
TABLE2

= Less rows =
TABLE3: 123 -> 100

= Equal number of rows =
TABLE4: 17 -> 17

= More rows =
TABLE5: 123 -> 234

== Missing indexes ==
TABLE3.COL1

== Added indexes ==
TABLE4.COL2

== Missing Columns ==
TABLE3.COL4

== Added Columns ==
TABLE3.COL5

So, before I import the new dump, I create a textfile with DBDiff that contains the current database state. After the import I create another one and compare it to the old file giving me all the changes to the database structure. Of course, the tool could also be used to compare a production database to a development database.

Here are two screenshot showing the tool in action:

DBDiff dumping database information
DBDiff comparing two result text files

Download

You can download the program including its source code here:

All needed configuration (DSN, credentials etc.) is done in DBDiff.exe.config. The database needs to be configured and reachable as an ODBC source.

Auswertung von Google-Suchanfragen zum Thema Private Krankenversicherung (PKV)

26. April 2011 um 10:23:27 - Beitrag Nr. 1024
Schlagwörter: , ,

Vor 5 Tagen habe ich diesen Blog-Beitrag verfasst, der einem Kollegen von mir helfen soll, besser einschätzen zu können, wie schnell man bei Google zu bestimmten Suchbegriffen auf den vorderen Plätzen der Suchergebnisse landet: Test: Vergleich von Suchanfragen zur Privaten Krankenversicherung (PKV). Heute habe ich die gleichen Suchbegriffe noch einmal ausgewertet und komme zu folgendem Ergebnis (ein Klick auf die Bilder zeigt die ersten 50 Suchergebnisse an):

Google-Suche: pkv

→ nicht unter den ersten 800 Treffern

Google-Suche: private krankenversicherung

→ nicht unter den ersten 1000 Treffern

Google-Suche: private krankenversicherung vergleich

→ nicht unter den ersten 800 Treffern

Google-Suche: private krankenversicherung test

→ nicht unter den ersten 700 Treffern

Bei den generischen Suchbegriffen pkv und private krankenversicherung in Kombination mit vergleich und test schneide ich also nicht so gut ab. Das ist aber auch kein großes Wunder, da es enorm viele Websites gibt, die einfach viel mehr und besseren Content zu den Suchbegriffen bieten als mein kleiner Blog-Beitrag. Allein die vielen (Fake-?)Seiten, die die Suchbegriffe schon in ihrer Domain enthalten…

Anders sieht es aus, wenn man die generischen Suchbegriffe um den Ort (vechta) ergänzt:

Google-Suche: pkv vechta

→ auf Position 3

Google-Suche: private krankenversicherung vechta

→ auf Position 17

Allerdings stellt sich die Frage, welcher potentieller Kunde danach sucht :-)

Mit einigen weiteren Schlüsselwörtern habe ich es auch noch in Googles Index geschafft. Wenn man also gezielt Beiträge mit für bereits versicherte Kunden interessanten Begriffen erstellen würde, könnte man durchaus seine Zielgruppe erreichen:

Test: Vergleich von Suchanfragen zur Privaten Krankenversicherung (PKV)

Ein Kollege von mir schreibt gerade einen “Report” im Rahmen seiner Ausbildung zum Kaufmann für Versicherungen und Finanzen und setzt sich mit der Fragestellung auseinander, wie Unternehmen der privaten Krankenversicherung (PKV) (und dabei natürlich insb. unser Arbeitgeber, die ALTE OLDENBURGER AG) das Internet (besser) für den Kontakt zu potentiellen Kunden nutzen können.

In diesem Zusammenhang untersucht er, welche Möglichkeiten bestehen, um bei Suchmaschinen (insb. bei Google) mit generischen Schlüsselwörtern (wie z.B. pkv, private krankenversicherung oder private krankenversicherung vergleich) auf den vorderen Plätzen der Suchergebnisse zu landen. Unser Unternehmen ist zur Zeit über allgemeine Suchbegriffe wenn überhaupt nur auf den hinteren Rängen zu finden (unter den ersten 900 (!) Suchergebnissen zum Suchbegriff private krankenversicherung sind wir aktuell nicht vertreten) und das soll sich ändern :-) Gerade weil wir ein kleines Unternehmen sind, aber trotzdem (oder vielleicht gerade deswegen!?) regelmäßig sehr gute Bewertungen von renommierten Rating-Unternehmen wie Assekurata erhalten, bietet das Internet und hier auch gerade der Bereich Social Media ein gewaltiges (weil kostengünstiges) Potential um (Neu-)Kunden zu erreichen. Und nicht nur das: unseren neuen Studenten für das duale Studium Wirtschaftsinformatik haben wir z.B. über meinen Blog-Beitrag zu dem Thema gefunden. Kein Wunder, da die entsprechende Suchanfrage (duales studium vechta) nicht etwa die entsprechende Seite unseres Unternehmens als Treffer liefert, sondern dieses Blog :-)

Um meinen Kollegen beim praktischen Teil seiner Arbeit zu unterstützen, habe ich nun diesen Blog-Artikel angelegt, der zugepflastert ist mit Schlüsselwörtern zum Thema PKV. Ich warte nun einfach ein paar Tage ab und kontrolliere, ob ich mit diesem Beitrag in die Suchergebnisse bei Google komme oder nicht. Allgemein indexiert Google dieses Blog recht schnell (dank Pingbacks und der Google Webmaster-Tools) und WordPress ist eine sehr “suchmaschinenfreundliche” Blog-Software, sodass ich vielleicht eine geringe Chance habe, unter die ersten 50(0) Treffer zu kommen.

Viele Tipps zur Suchmaschinenoptimierung (SEO) kenne ich bereits und das Wichtigste ist wie so oft der Inhalt der Website: content is king. Durch informative, interessante, ansprechend geschriebene Artikel (z.B. über die private Krankenversicherung, die allgemeine Entwicklung im deutschen Gesundheitswesen oder die ganz konkreten Probleme und Fragen der versicherten Personen zu Themen wie Beitragsrückerstattung, Alterungsrückstellung, Übertragungswert usw.) kann ein Unternehmen Besucher auf seine Website leiten und sie auch dort halten oder sie gar dazu bringen, selbst “Werbung” (z.B. bei Twitter, Facebook usw.) für den Inhalt (und damit indirekt für das Unternehmen) zu machen. Stichwort: Virales Marketing.

Das wichtigste Kriterium für den erfolgreichen Einsatz des Internets und von Social Media ist allerdings eine authentische, offene Kommunikation mit den (potentiellen) Kunden. Alles andere kann sehr schnell ins Gegenteil umschlagen, wie inzwischen viele gewichtige Negativbeispiele unter Beweis stellen: 13 große Social Media Fails (Klaus Eck), Social Web: Trigemas „Beinahe-Social-Media-Desaster“ (Falk Hedemann), Social-Media-Desaster, Teil 3: Jung von Matt (Alex Kölling). Der Erfolg von “Maßnahmen” im Internet setzt somit eine entsprechende offene Unternehmenskultur voraus. Online-Beiträge müssen schnell und authentisch veröffentlicht werden dürfen und nicht erst durch drei Hierarchieebenen abgesegnet werden müssen. Viele Unternehmen (z.B. Daimler) haben bereits Social Media-Richtlinien für ihre Mitarbeiter aufgestellt, um sich den Herausforderungen des Internets zu stellen. Ein sehr interessantes Beispiel aus der Praxis (für den authentischen Einsatz von Twitter) sind die Wynn-Hotels: Hanselminutes Podcast 208 – Social Media and the Business of Social – The Wynn Resorts.

Doch eins nach dem anderen. Zunächst bin ich mal gespannt auf das Google-Ranking, das ich mit diesem Beitrag erziele. Aktuell (21.04.2011) sehen die Ergebnislisten (jeweils die ersten 50 Einträge) von Google zu den entsprechenden Suchbegriffen wie folgt aus (die Suchergebnisse werden nach einem Klick auf das entsprechende Vorschaubild angezeigt):

Google-Suche: pkv
Google-Suche: private krankenversicherung
Google-Suche: private krankenversicherung vergleich
Google-Suche: private krankenversicherung test
Google-Suche: pkv vechta
Google-Suche: private krankenversicherung vechta

In ein paar Tagen werde ich die gleichen Suchanfragen noch einmal stellen und die Ergebnisse dann mit den aktuellen vergleichen. Mal schauen, ob sich dann tatsächlich etwas getan hat. Nach 5 Tagen habe ich die gleichen Suchanfragen noch einmal ausgeführt und hier sind die Ergebnisse: Auswertung von Google-Suchanfragen zum Thema Private Krankenversicherung (PKV)

Um das Thema Social Media kümmere ich mich dann danach :-) Ich lade euch aber natürlich bereits jetzt alle herzlich ein, in den Kommentaren mit mir über das Thema zu diskutieren.