Blog

  • Alle SharePoint-Solutions mit einem einzigen PowerShell-Befehl exportieren

    Wenn man alle installierten Farm-Solutions/WSPs einer SharePoint-Farm mit einem simplen, einzeiligen PowerShell-Befehl exportieren möchte (vielleicht weil man sie sonst nirgends mehr hat oder nicht mehr sicher ist welche Version installiert ist – beides sollte man natürlich vermeiden), dann kann man in der SharePoint Management Shell einfach folgenden Befehl absetzen:

    (Get-SPFarm).Solutions | ForEach-Object{$var = (Get-Location).Path + "\" + $_.Name; $_.SolutionFile.SaveAs($var)}

    Die WSP-Datein befinden sich danach im aktuellen Working-Directory, welches man in der PowerShell „offen“ hatte, z.B. im Verzeichnis des aktuellen Benutzer-Kontos.

  • QooliImapEmailExtractor – Ein IMAP Email-Adressen-Extrahierer in Python

    QooliImapEmailExtractor – Ein IMAP Email-Adressen-Extrahierer in Python

    Ich wurde kürzlich angefragt, ob ich nicht ein Programm kennen würde, um aus einen Mail-Postfach alle Email-Adressen zu extrahieren. Egal, ob diese im „To“- oder „From“- oder „CC“-Feld stehen.

    Leider kannte ich kein Programm, dass dafür geeignet ist, obwohl es ein solches mit Sicherheit aber gibt. Aber bei vielen Gratis-Tools oder auch Trials kann man sich nicht sicher sein, ob es Malware enthält oder ob am Ende die Email-Adressen die extrahiert wurden auch noch gleich an den Hersteller des Programms gesendet werden.

    Warum diese Aufgabe also nicht einfach selber mit Python lösen? Im Internet wurde ich schnell fündig und fand die Basis für ein Skript, welches schon einmal grundsätzlich alle Adressen aus einem einzelnen IMAP-Inbox-Folder eines Postfachs (mittels imaplib) in eine Variable extrahiert: https://www.quora.com/Is-there-a-way-to-extract-email-addresses-from-all-emails-in-my-Gmail-account/answer/Jerry-Neumann

    Das Skript habe ich dann etwas schöner formatiert und erweitert, dass alle Folder eines Postfachs durchlaufen und die Daten dann in eine CSV-Datei exportiert werden. Das sieht dann wie folgt aus:

    import imaplib
    import email
    import csv
    import re
    
    
    list_response_pattern = re.compile(r'\((?P<flags>.*?)\) "(?P<delimiter>.*)" (?P<name>.*)')
    
    
    def parse_list_response(line):
        flags, delimiter, mailbox_name = list_response_pattern.match(line).groups()
        mailbox_name = mailbox_name.strip('"')
        return flags, delimiter, mailbox_name
    
    
    def split_addresses(s):
        # split an address list into list of tuples of (name,address)
        if not s:
            return []
        out_q = True
        cut = -1
        res = []
        for i in range(len(s)):
            if s[i] == '"':
                out_q = not out_q
            if out_q and s[i] == ',':
                res.append(email.utils.parseaddr(s[cut + 1:i]))
                cut = i
        res.append(email.utils.parseaddr(s[cut + 1:i + 1]))
        return res
    
    
    def main():
        print 'Processing started...'
        addresses = []
        mail = imaplib.IMAP4_SSL('imap.server.com')  # enter hostname eg: imap.gmail.com
        mail.login('user@server.com', 'Password')  # userid, password
        response_code_folders, mail_folder_lines = mail.list()
        for mail_folder_line in mail_folder_lines:
            flags, delimiter, mailbox_name = parse_list_response(mail_folder_line)
            print '  Extracting from folder: ' + mailbox_name
            mail.select(mailbox_name)
            result, data = mail.search(None, "ALL")
            ids = data[0].split()
            mail_count = len(ids)
            print '   Mails found in folder: ' + str(mail_count)
            if mail_count > 0:
                msgs = mail.fetch(','.join(ids), '(BODY.PEEK[HEADER])')[1][0::2]
                mail_ix = 0
                for x, msg in msgs:
                    mail_ix += 1
                    msgobj = email.message_from_string(msg)
                    print '   extracting data from message ' + str(mail_ix) + '/' + str(len(msgs))
                    addresses.extend(split_addresses(msgobj['to']))
                    msgobj = email.message_from_string(msg)
                    addresses.extend(split_addresses(msgobj['from']))
                    addresses.extend(split_addresses(msgobj['cc']))
        # only take unique addresses
        addresses = set(addresses)
        csv_filename = 'email_addresses_export.csv'
        with open(csv_filename, 'wb') as out:
            csv_out = csv.writer(out)
            csv_out.writerow(['Name', 'Address'])
            for row in addresses:
                csv_out.writerow(row)
        print ' CSV with addresses written to: ' + csv_filename
        print 'Processing finished'
    
    
    main()
    

    Wenn ihr das Skript verwenden wollt, müsst ihr Python installiert haben und euren Mailserver und die Postfach-Logindaten eintragen:

    mail = imaplib.IMAP4_SSL(‚imap.server.com‚)  # IMAP-Hostname
    mail.login(‚user@server.com‚, ‚Password‚)  # Postfach-Benutzer-ID, Passwort

  • Microsoft SQL Server Management Studio – verbleibende Datenbank-Restore-Dauer anzeigen

    Microsoft SQL Server Management Studio – verbleibende Datenbank-Restore-Dauer anzeigen

    Vielleicht habt ihr auch schon mal in einem Microsoft SQL Server einen Restore einer Datenbank durchgeführt und wolltet wissen, wie weit der Restore nach einigen Minuten/Stunden schon gekommen ist und wann der Restore ungefähr beendet sein wird.

    Wird der Restore via „Management Studio“-GUI durchgeührt (Datenbank-Kontextmenü -> Tasks -> Restore), dann habt ihr im Restore-Dialog zumindest eine ungefähre Prozent-Anzeige. In der 2012er-Version wird diese oben rechts angezeigt:

    Die Prozent-Anzeige erscheint aber erst nach einem Weilchen und wenn man den Restore via SQL-Skript gestartet hat und dabei „STATS“ nicht (oder mit einem ungünstigen Wert) verwendet hat, weiss man auch nicht bei wieviel Prozent der Restore aktuell steht und wie lange er noch dauert. Häufig bleibt die Prozentzahl auch lange unverändert und man ist sich nicht sicher, ob der Restore noch läuft oder sich aufgehängt hat.

    Zum Glück gibt es jedoch eine Möglichkeit mit einem SQL-Befehl den aktuellen Fortschritt und die geschätzte Endzeit zu erhalten – egal ob  der Backup-Job via GUI, Skript oder sogar von einer anderen Maschine gestartet wurde. Voraussetzung ist ein MSSQL Server der Dynamic Management Views (DMVs) unterstützt, also ab MSSQL 2005. Ist das gegeben kann man folgenden Befehl als Query absetzen (es muss keine Datenbank dazu vorselektiert werden):

    SELECT session_id as SPID, command, a.text AS Query, start_time, percent_complete, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time
    FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a
    WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE')

    Das Resultat sieht dann zum Beispiel wie folgt aus (unterer Bereich, Spalten percent_complete und estimated_completion_time):

    Im Beispiel sieht man also, dass bereits 96.16975 % des Restores durchlaufen ist und der Restore um 12:38 Uhr, des 7. Dezember 2016, fertig sein sollte – nach ungefähr 19 Stunden Laufzeit. Praktisch oder?

    Gefunden auf: https://www.mssqltips.com/sqlservertip/2343/how-to-monitor-backup-and-restore-progress-in-sql-server/

  • Chili Ernte 2015

    Chili Ernte 2015

    Letzten Mittwoch-Abend habe ich die Chili-Ernte, zumindest den ersten Teil davon, „eingefahren“.

    Folgende fünf Sorten habe ich ca. im April/Mai als Stecklinge gepflanzt und zwar von jeder Sorte zwei Stück:

    • Breva
    • Cayenne
    • Habanero
    • Apache
    • Jalapena Samira Shiny

    Lustigerweise hat jeweils immer nur ein Exemplar jeder Sorte brauchbare früchte getragen, das andere Exemplar hatte entweder gar keine, unreife oder sonstwie unbrauchbare Chilis – dies obwohl die Exemplare nur wenige Zentimeter nebeneinander standen und sonst die gleichen Bedingungen hatten, vielleicht lag’s am Konkurrenzdruck :-).

    Jedenfalls habe ich die für mich brauchbaren gepflückt, gewaschen, aufgeschnitten und dann im Backofen bei ca. 70° Celsius getrocknet. Die einen Exemplare für ca. 3-4 Stunden, Jalapenas nochmals 4-5 Stunden länger, da diese sehr fleischig sind.

    Einige davon konnte ich schon probieren und haben eine „angenehme“ Schärfe :-).

    Hier die Bilder davon:

  • Unity 5 Spiel-Engine

    Unity 5 Spiel-Engine

    Letzte Woche wurde die neueste Version, nämlich Nummer 5, der Unity Spiel-Engine offiziell veröffentlicht. Ausserdem wurde in der selben Woche das Lizenzierungsmodel der Unreal Engine 4 angepasst, so dass diese nun grundsätzlich von jedem verwendet werden kann (erst ab einem Umsatz von 3000 Dollar pro Quartal, muss man selber etwas bezahlen). Auch Valve hat die Veröffentlichung der „Source 2“-Engine angekündigt, welche voraussichtlich ebenfalls in einer freien Version verfügbar sein soll.

    Unity gibt es schon länger gratis in einer Einsteiger-Version, mit der man aber schon sehr viel machen kann. Möchte man aber z.B. einen Asset Server verwenden (mit Versionsverwaltung) oder einen eigenen Splash-Screen vor dem Spiel präsentieren (und noch einige andere Features mehr, siehe Unity-Website), dann muss man die Pro-Lizenz erwerben, welche mit 75$ im Monat immer noch sehr bezahlbar ist. Für die Möglichkeit das Entwickelte Produkt auf iOS oder Android zu deployen, wird jedoch nochmals (je) 1500$ verlangt oder je 75$ zusätzlich pro Monat.

    Aus Neugierde habe ich mich einige Stunden mit der Unity-Engine auseinander gesetzt und auch einige der Einsteiger-Tutorials bereits umgesetzt. Die Engine hat meiner Einschätzung nach eine gute Lernkurve, man erreicht schon nach kurzer Zeit erste Erfolgserlebnisse die einen anspornen sich tiefer mit den weiteren Möglichkeiten zu beschäftigen. Der Editor, mit welchem die Szenen, Animationen und Objekte bearbeitet werden können wirkt sehr aufgeräumt und kann intuitiv bedient werden – man fühlt sich schnell zu Hause. Für einen C#-Entwickler ist es zudem praktisch, dass als Script-Sprache C# (Mono via einer mitgelieferten MonoDevelop-Version) verwendet werden kann. Unreal 4 mit C++ hat mich da schon etwas abgeschreckt 🙂

    Nach wenigen Stunden hatte ich bereits ein kleines, erstes Spiel fertig (nach Tutorial, Objekte/Texturen wurden als Asset bereitgestellt):

    Wer selber mit Unity loslegen will, der sollte am besten mit den Tutorials auf der offiziellen Unity-Webseite beginnen:

    Viel Spass!

  • Texas Jailhouse Chili 2014

    Texas Jailhouse Chili 2014

    Es war wieder soweit, es wurde das jährliche, rituelle „Texas Jailhouse Chili“-Essen zubereitet und verspiesen.

    Ich denke, dass dank den beigefügten „Trinidad Scorpion Butch T pepper“ dieses Jahr ein neuer Scoville-Rekord aufgestellt wurde – jedenfalls fühlte es sich so an 😳

    Nachfolgend einige Impressionen:

    Für das Rezept und Infos vom 2012er-Event klickt folgenden Link an: http://qoo.li/2012/12/texas-jailhouse-chili/

  • Fiescheralp, Egishorn, Aletschgletscher, Riederalp, Moosfluh und Bettmeralp

    Fiescheralp, Egishorn, Aletschgletscher, Riederalp, Moosfluh und Bettmeralp

    Letztes Wochende war ich mit meiner Familie im Wallis und wir machten (mal wieder) einen Ausflug in die „Aletsch Arena“ und zum Aletschgletscher.

    Hier einige Impressionen:

    Weitere Bilder findet ihr auf meiner dedizierten Fotografie-Seite: http://schielke.ch/galleries/aletschgletscher-und-aletsch-arena/

  • Ferien im Elsass

    Ferien im Elsass

    Wir waren vor kurzem über Pfingsten einige Tage im Elsass und haben dabei folgende Orte besichtigt:

    • Strasbourg
    • Wissembourg
    • Marienthal
    • Eguisheim
    • Colmar
    • Riquewihr
    • Ribeauvillé
    • Delta de la Sauer
    • Schiffshebewerk Saint-Louis/Arzviller

    Hier einige Fotos von unserem Tripp:

  • Canon EF 70-200mm f/2.8L IS II USM mit 2x Extender

    Canon EF 70-200mm f/2.8L IS II USM mit 2x Extender

    Konnte letzthin das Canon EF 70-200mm f/2.8L IS II USM mit dem Canon 2x Extender (III) kombiniert testen.

    Tolles Objektiv welches auch in der Kombination mit dem Extender noch eine sehr gute Bildqualität liefert, auch wenn natürlich der Autofokus mit dem Extender langsamer wird und die grösste Blende auf 5.6 „herunterrutscht“. Aber für mich nicht tragisch und und ein praktischer Ersatz für ein „Canon EF 400mm f/5.6L USM“.

    Nachfolgend einige Impressionen:

  • Qooli Timelapse Calculator

    Abgekürzt QTLC. Eine Anwendung für Google’s Android-Plattform mit welcher man bequem auf seinem Handy Timelapse-Berechnungen durchführen kann.

    Qooli Timelapse Calculator LogoMan kann zum Beispiel ausrechnen, wie lange man bei eingem gewissen Shutter-Intervall und FPS (im resultierenden) Aufnahmen machen muss. Man kann aber auch umgekehrt ausrechnen wieviel Filmdauer man auf Grund einer Aufnahmezeit, dem Intervall und den FPS erreicht hat.

    Die Anwendung wird ständig weiter ausgebaut und mit weiteren Features versehen, so ist z.B. eine Timerlapse-Stoppuhr mit Erinnerungsfunktion geplant oder der zu erwartende Speicherplatz verbrauch für die Aufnahmen während der Aufnahme-Session.

    Die Anwendung kann im Play Store heruntergeladen werden:

    Get it on Google Play

    Direkt den QR-Code scannen um die App-Store-Seite der Anwendung auf dem Handy zu öffnen… wo man sie dann kaufen kann 🙂

    QR-Code von QTLC
    QR-Code von QTLC: mit einem QR-Code-Scanner einlesen um die App-Store-Seite zu öffnen