<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Karl Jepertinger IT Consulting</title>
	<atom:link href="https://www.jepertinger-itconsulting.de/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.jepertinger-itconsulting.de</link>
	<description>Consultant as a Service!</description>
	<lastBuildDate>Wed, 07 Dec 2022 17:32:56 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>
	<item>
		<title>DATEV/S-MIME &#8222;Secure-Email&#8220; : Praktische Outlook Integration</title>
		<link>https://www.jepertinger-itconsulting.de/2021/01/11/datev-s-mime-secure-email-praktische-outlook-integration/</link>
		
		<dc:creator><![CDATA[Karl Jepertinger]]></dc:creator>
		<pubDate>Mon, 11 Jan 2021 11:04:19 +0000</pubDate>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[datev]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[smime]]></category>
		<category><![CDATA[verschlüsselung]]></category>
		<guid isPermaLink="false">https://www.jepertinger-itconsulting.de/?p=1025</guid>

					<description><![CDATA[Die Firma Datev hat für alle seine angeschlossenen Steuerberater ein E-Mail System mit automatischer Verschlüsselung zur Verfügung gestellt &#8211; fast alles wird verschlüsselt. Für Personen ausserhalb des Datev-Systems ist es aber nur wenig praktisch &#8230; Wird also aus einer Steuerkanzlei &#8230; <a href="https://www.jepertinger-itconsulting.de/2021/01/11/datev-s-mime-secure-email-praktische-outlook-integration/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[
<p>Die Firma <a href="https://www.datev.de" data-type="URL" data-id="https://www.datev.de">Datev</a> hat für alle seine angeschlossenen Steuerberater ein E-Mail System mit automatischer Verschlüsselung zur Verfügung gestellt &#8211; fast alles wird verschlüsselt. Für Personen ausserhalb des Datev-Systems ist es aber nur wenig praktisch &#8230;</p>



<span id="more-1025"></span>



<p>Wird also aus einer Steuerkanzlei eine E-Mail an einen Mandanten versendet, erhält dieser nicht mehr den originalen Inhalt sondern eine verschlüsselte Form. Der Inhalt liegt verschlüsselt in der Datei &#8222;secure-email.html&#8220; vor.</p>



<figure class="wp-block-image size-large is-resized"><a href="https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_inbox_mail.jpg" rel="lightbox-0"><img fetchpriority="high" decoding="async" src="https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_inbox_mail.jpg" alt="" class="wp-image-1028" width="494" height="389" srcset="https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_inbox_mail.jpg 657w, https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_inbox_mail-300x236.jpg 300w" sizes="(max-width: 494px) 100vw, 494px" /></a><figcaption>Secure E-Mail von Datev</figcaption></figure>



<p>Um die Email zu lesen, wird die HTML Datei geöffnet. Bei erster Verwendung muss an dieser Stelle ein Account angelegt werden. Von diesem Webportal aus, kann dann auch verschlüsselt geantwortet werden. Antwortet man dagegen aus Outlook heraus auf die E-Mail, ist der eigene Text auf dem Weg zum Datev Server nicht geschützt und nur Transport-verschlüsselt!</p>



<p>Soweit so einfach. Positiv ist, dass nun die Verschlüsselung für jedermann umgesetzt ist. Für viele Nachrichten pro Tag ist das Prozedere dann aber zu aufwendig und unübersichtlich &#8211; immerhin landen die eigenen Antworten die aus dem Webportal versendet werden nicht mehr im eigenen Sent-Ordner.</p>



<h2 class="wp-block-heading">Secure-Mail Anhang durch S-MIME Verschlüsselung ersetzen</h2>



<p>Um zukünftig keine Anhänge mehr im Webportal öffnen zu müssen, benötigt es auf der Sender-Seite (z.B. Ihr Steuerberater) Ihren eigenen öffentlichen Schlüssel. Da nun aber der Datev-Mail Server die Verschlüsselung übernimmt, ist es nicht notwendig jedem Sender das Zertifikat aufzudrängen, es wird einfach an zentraler Positon hinterlegt.</p>



<p>Nach erfolgter Anmeldung am <a rel="noreferrer noopener" href="https://demvreply.datevnet.de/" target="_blank">Webportal</a> kann nun unter Schlüsselverwaltung ein eigener S-MIME oder PGP Schlüssel hinterlegt werden. <br />Sobald das Zertifikat hier hochgeladen ist , erhält man &#8222;normal&#8220; verschlüsselte E-Mails. Läuft das Zertifikat ab, erhält man wieder den erwähnten Anhang.</p>



<figure class="wp-block-image size-large"><a href="https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_upload.jpg" rel="lightbox-1"><img decoding="async" width="1024" height="772" src="https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_upload-1024x772.jpg" alt="" class="wp-image-1029" srcset="https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_upload-1024x772.jpg 1024w, https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_upload-300x226.jpg 300w, https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_upload-768x579.jpg 768w, https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_upload.jpg 1233w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption>Schlüsselverwaltung im Datev Webportal</figcaption></figure>



<h2 class="wp-block-heading">Adressaten-Zertifikate erhalten</h2>



<p>Mit dem letzten Absatz ist nun sichergestellt, dass alle empfangenen Nachrichten normal verschlüsselt sind. Bleibt die Frage wie man eigene Nachrichten verschlüsselt versendet.</p>



<p>I.d.R. erhält man dazu eine signierte E-Mail, erhält damit den Schlüssel und ist bereit. Die E-Mails von Datev sind aber nicht signiert. Woher also den öffentlichen Schlüssel des Adressaten erhalten? </p>



<p>Dafür lassen sich alle Zertifikate an <a rel="noreferrer noopener" href="https://www.crl.esecure.datev.de/ENCAUT/ENC/suche.php" target="_blank">zentraler Stelle </a>abrufen. Unter &#8222;Persönliche Angaben&#8220; ist dabei die E-Mail Adresses des Empfängers, z.B. mitarbeiter1@steuerberater-musterstadt.xy , anzugeben.</p>



<figure class="wp-block-image size-large"><a href="https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_download.jpg" rel="lightbox-2"><img decoding="async" width="1024" height="855" src="https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_download-1024x855.jpg" alt="" class="wp-image-1030" srcset="https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_download-1024x855.jpg 1024w, https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_download-300x251.jpg 300w, https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_download-768x641.jpg 768w, https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_download.jpg 1037w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption>Suche und Download des Adressaten Zertifkats</figcaption></figure>



<p>Nach dem Download kann das Zertifikat dem Outlook Kontakt zugeordnet werden und ist ab dann zum verschlüsselten Versand verfügbar.</p>



<figure class="wp-block-image size-large"><a href="https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_import.jpg" rel="lightbox-3"><img loading="lazy" decoding="async" width="1024" height="487" src="https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_import-1024x487.jpg" alt="" class="wp-image-1031" srcset="https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_import-1024x487.jpg 1024w, https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_import-300x143.jpg 300w, https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_import-768x365.jpg 768w, https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_import-1536x731.jpg 1536w, https://www.jepertinger-itconsulting.de/wp-content/uploads/2021/01/datev_secure_mail_cert_import.jpg 1673w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption>Import S-MIME Zertifikat in Outlook Kontakt</figcaption></figure>



<p>Auch wenn diese Anleitung nicht so direkt auf der Datev-Website zu finden ist, kann man sich die verschlüsselte Kommunikation doch sauber einrichten.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Snowflake: File format does not exist</title>
		<link>https://www.jepertinger-itconsulting.de/2019/08/15/snowflake-file-format-does-not-exist/</link>
		
		<dc:creator><![CDATA[Karl Jepertinger]]></dc:creator>
		<pubDate>Thu, 15 Aug 2019 14:36:08 +0000</pubDate>
				<category><![CDATA[Snowflake Computing]]></category>
		<guid isPermaLink="false">http://www.jepertinger-itconsulting.de/?p=890</guid>

					<description><![CDATA[Für das Laden von Dateien gibt es in Snowflake den COPY INTO Befehl. Der Befehl ist dazu gedacht &#8211; mit Hilfe eines File Formats &#8211; Daten aus der Datei in eine Tabelle zu kopieren. Aber auch ohne die Daten zu &#8230; <a href="https://www.jepertinger-itconsulting.de/2019/08/15/snowflake-file-format-does-not-exist/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[
<p>Für das Laden von Dateien gibt es in Snowflake den <a rel="noreferrer noopener" aria-label="COPY INTO Befehl (öffnet in neuem Tab)" href="https://docs.snowflake.net/manuals/sql-reference/sql/copy-into-table.html" target="_blank">COPY INTO Befehl</a>. Der Befehl ist dazu gedacht &#8211; mit Hilfe eines File Formats &#8211; Daten aus der Datei in eine Tabelle zu kopieren. Aber auch ohne die Daten zu laden kann man einfache Selects auf Dateien ausführen. </p>



<span id="more-890"></span>



<p>Syntax eines einfachen Copy Into Befehls:<br /> <pre class="brush: sql; title: ; notranslate">COPY INTO MyTable(Column01, Column02, Column03)
FROM (
SELECT $1, $2, $3 
FROM '@MyStage/folder01'
) 
FILE_FORMAT = CSVFILEFORMAT
PATTERN= '.*\.csv$' ;  
</pre> </p>



<p>Die Syntax für die Verwendung in einem Select ist ähnlich, aber dann doch wenig intuitiv:<pre class="brush: sql; title: ; notranslate">SELECT $1, $2, $3 FROM '@MyStage/folder01'         (         --FILE_FORMAT =&amp;gt;  CSVFILEFORMAT, --falsch         FILE_FORMAT =&amp;gt;  'CSVFILEFORMAT', --richtig         PATTERN =&amp;gt; '.*\.csv         ) </pre></p>



<p>
Cheat-Sheet:<ul>
<li>Angaben zum File Format, Pattern etc stehen nun in Klammern nach dem FROM</li>
<li>Die &#8222;=&#8220; werden zu &#8222;=&gt;&#8220;</li>
<li>Die Zeilen müssen durch Kommas getrennt werden</li>
<li>Das FileFormat muss nun in Hochkommas stehen.</li>
</ul>
</p><p>Wer diesen letzten Punkt ignoriert erhält die verwirrende Fehlermeldung</p>
<pre class="brush: sql; title: ; notranslate">
SQL-Fehler &#x5B;2003] &#x5B;02000]: SQL compilation error:
File format 'CSVDATEN' does not exist.
</pre>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Snowflake: Unsupported feature &#8218;Table&#8216;</title>
		<link>https://www.jepertinger-itconsulting.de/2019/05/15/snowflake-unsupported-feature-table/</link>
		
		<dc:creator><![CDATA[Karl Jepertinger]]></dc:creator>
		<pubDate>Wed, 15 May 2019 14:27:19 +0000</pubDate>
				<category><![CDATA[Snowflake Computing]]></category>
		<guid isPermaLink="false">http://www.jepertinger-itconsulting.de/?p=968</guid>

					<description><![CDATA[Das Laden von Dateien funktioniert in Snowflake via SQL mit direktem Zugriff auf einen Blob Storage via Stages. Hier ein Select auf CSV-Dateien in der persönlichen Stage mit einem nicht so leicht zu findenden Fehler: SELECT metadata$filename, T.$1, T.$2, T.$3 &#8230; <a href="https://www.jepertinger-itconsulting.de/2019/05/15/snowflake-unsupported-feature-table/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[
<p>Das Laden von Dateien funktioniert in Snowflake via SQL mit direktem Zugriff auf einen Blob Storage via Stages. Hier ein Select auf CSV-Dateien in der persönlichen Stage mit einem nicht so leicht zu findenden Fehler:</p>



<pre class="brush: python; title: ; notranslate">
SELECT metadata$filename, T.$1, T.$2, T.$3
FROM '@~/data' 
(
FileFormat =&gt; 'Db.kjeperti.CSV',
Pattern =&gt; &quot;.*/&#x5B;0-9]{8}.csv.gz$&quot;
) t
</pre>



<p> Die Fehlermeldung ist dabei leider gar nicht hilfreich:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Unsupported feature ‘Table’</p></blockquote>



<pre class="brush: python; title: ; notranslate">
SELECT metadata$filename, T.$1, T.$2, T.$3
FROM '@~/data' 
(
File_Format =&gt; 'Db.kjeperti.CSV',
Pattern =&gt; &quot;.*/&#x5B;0-9]{8}.csv.gz$&quot;
) t
</pre>



<p>Im richtigen SQL ist der Tippfehler bei &#8222;File_Format&#8220; korrigiert. Es hat der &#8222;_&#8220; gefehlt.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Sphinx: Unexpected unindent</title>
		<link>https://www.jepertinger-itconsulting.de/2018/08/08/sphinx-unexpected-unindent/</link>
		
		<dc:creator><![CDATA[Karl Jepertinger]]></dc:creator>
		<pubDate>Wed, 08 Aug 2018 20:58:31 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">http://www.jepertinger-itconsulting.de/?p=873</guid>

					<description><![CDATA[Sphinx ist das Standardtool zur Dokumentation von Python Code. Sphinx liest direkt DocStrings aus dem Quellcode aus und bereitet dabei eine Dokumentation auf. Ideal wäre es wenn das natürlich ganz ohne Änderungen am Code oder der Dokumentation abläuft und man &#8230; <a href="https://www.jepertinger-itconsulting.de/2018/08/08/sphinx-unexpected-unindent/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>Sphinx ist das Standardtool zur Dokumentation von Python Code. Sphinx liest direkt DocStrings aus dem Quellcode aus und bereitet dabei eine Dokumentation auf.</p>
<p>Ideal wäre es wenn das natürlich ganz ohne Änderungen am Code oder der Dokumentation abläuft und man nicht noch mehr syntatktische Regeln beachten muss.</p>
<blockquote><p>WARNING: Block quote ends without a blank line; unexpected unindent.</p></blockquote>
<p>Diese Fehlermeldung sagt allerdings etwas anderes. Dies ist ein Warning das Sphinx beim Kommando &#8222;make html&#8220; ausgespuckt hat.</p>
<p>Ursache dafür war dieser Docstring mit Einrückungen:</p>
<pre class="brush: python; title: ; notranslate">

def dummyfunction():

'''Das ist ein langer Kommentar mit mehreren Punkten:

   - Punkt1 : Lorem ipsum
     dolor il

   - Punkt2: ....

'''

....

</pre>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Oracle SQL: ungewollte Zeichen aus einem String entfernen</title>
		<link>https://www.jepertinger-itconsulting.de/2018/07/11/oracle-ungewollte-zeichen-aus-einem-string-entfernen/</link>
		
		<dc:creator><![CDATA[Karl Jepertinger]]></dc:creator>
		<pubDate>Wed, 11 Jul 2018 14:55:16 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<guid isPermaLink="false">http://www.jepertinger-itconsulting.de/?p=991</guid>

					<description><![CDATA[&#8222;All input is evil&#8220; ist eine alte Weisheit. In der Praxis liefern Datenquellen die verschiedensten Überraschungen. Leerzeichen/Whitespaces am Anfang oder am Ende ist dabei noch am einfachsten zu finden. Wie aber nun ungewollte Zeichen aus einem String filtern ? Die &#8230; <a href="https://www.jepertinger-itconsulting.de/2018/07/11/oracle-ungewollte-zeichen-aus-einem-string-entfernen/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[
<p>&#8222;All input is evil&#8220; ist eine alte Weisheit. In der Praxis liefern Datenquellen die verschiedensten Überraschungen. Leerzeichen/Whitespaces am Anfang oder am Ende ist dabei noch am einfachsten zu finden. Wie aber nun ungewollte Zeichen aus einem String filtern ?</p>



<p>Die Funktionen Replace oder Translate bieten sich an, scheitern aber daran, dass eine Negativliste (also alle Zeichen die man entfernen möchte) erwarten &#8211; ziemlich unpraktisch bei UTF8. Ein regulärer Ausdruck könnte auch helfen, ist aber (auch mit Hinblick auf die Performance) mit Kanonen auf Spatzen geschossen.</p>



<p>Die Kombination aus zwei Translate Befehlen arbeitet mit einer Positivliste. Man gibt also eine Liste erlaubter Zeichen an. </p>



<p>Im folgenden Beispiel soll aus einer Strassenangabe nur der Hausnummernanteil gefiltert werden. Die Positivliste sind hier die Zahlen von 0-9.</p>



<pre class="wp-block-preformatted"> <pre class="brush: sql; title: ; notranslate">
 with input as 
 (
 select &#039;Hauptstrasse 35a&#039; hausnummer from dual
 )
 select translate(hausnummer,&#039;x&#039;||translate(hausnummer,&#039;0123456789&#039;,&#039;X&#039;),&#039;x&#039;) from input
 --ergibt : 35
 </pre> </pre>



<p>Hier der <a href="https://sqltest.net/#701210">Link </a>zu einer Demo.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SQLAlchemy: Joined Table Inheritance</title>
		<link>https://www.jepertinger-itconsulting.de/2018/06/29/sqlalchemy-joined-table-inheritance/</link>
		
		<dc:creator><![CDATA[Karl Jepertinger]]></dc:creator>
		<pubDate>Fri, 29 Jun 2018 19:23:31 +0000</pubDate>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[object relationaler mapper]]></category>
		<category><![CDATA[orm]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[sqlalchemy]]></category>
		<category><![CDATA[sqlite]]></category>
		<guid isPermaLink="false">http://www.jepertinger-itconsulting.de/?p=859</guid>

					<description><![CDATA[Eigentlich lässt die Dokumentation des ORM SQLAlchemy für Python keine Wünsche offen. Auch das Klassenmapping mit Polymorphy ist gut dokumentiert. Was aber noch etwas zu kurz kommt ist die Datenbanksicht. Ich möchte hier das Beispiel der Dokumentation aufgreifen. Von einer &#8230; <a href="https://www.jepertinger-itconsulting.de/2018/06/29/sqlalchemy-joined-table-inheritance/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>Eigentlich lässt die Dokumentation des <a href="https://de.wikipedia.org/wiki/Objektrelationale_Abbildung" target="_blank" rel="noopener">ORM</a> <a href="http://docs.sqlalchemy.org/en/latest" target="_blank" rel="noopener">SQLAlchemy</a> für Python keine Wünsche offen. Auch das <a href="http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/inheritance.html?highlight=joined%20table%20inheritance" target="_blank" rel="noopener">Klassenmapping mit Polymorphy</a> ist gut dokumentiert. Was aber noch etwas zu kurz kommt ist die Datenbanksicht.</p>
<p>Ich möchte hier das Beispiel der Dokumentation aufgreifen.<br />
Von einer Basisklasse &#8222;Employee&#8220; werden zwei weitere Klassen &#8222;Manager&#8220; und &#8222;Engineer&#8220; abgeleitet.</p>
<p>Grundsätzlich gibt es verschiedene Strategien Klassenhirarchien abzubilden</p>
<ul>
<li>Joined Table Inheritance:<br />
Bei dieser Variante gibt es für jede Klasse eine eigene Tabelle. Die beiden Subklassen erhalten eigene Tabellen mit Referenzen auf die Basisklasse.</li>
<li>Single Table Inheritance:<br />
In dieser Form wird die ganze Klassenhierarchie in einer einzelnen Tabelle abgebildet. Aus Blick des Python Codes ist alles sauber. In der Datenbank gibt es aber in der Tabelle Felder, die nur abhängig vom Typ befüllt werden dürfen. Echte Datenbank-Constraints sind damit fast unmöglich.</li>
<li>Concrete Table Inheritance:<br />
Hier gibt es auch wieder für jede Klasse eine Tabelle. Diesesmal haben die Subklassen aber keine Foreign Key Beziehung mit der Basisklasse. Jede Tabelle dupliziert auch die Spalten der Basisklasse. Aus Sicht der Datenbank gibt es nun keine Zentrale Tabelle mehr in der alle &#8222;Employees&#8220; erfasst sind. Es lässt sich damit auch kein Foreign Key Constraint mehr setzen.</li>
</ul>
<p>Um ein sauberes Datenbankmodell zu erhalten, ist somit nur die &#8222;Joined Table Inheritance&#8220; zu empfehlen:</p>
<ul>
<li>Auf Spaltenebene können ohne Problem Check-Constraints und Not-Null-Constraints definiert werden.</li>
<li>Auch ohne die Kenntnis des SQLALchemy Mappings ergibt sich für andere Anwendungen ganz automatisch welche Felder für welche Klasse gefüllt werden können.</li>
<li>Die Basisklasse kann durch andere Tabellen via Foreign Key Constraint referenziert werden.</li>
</ul>
<p>Wie wird nun eine Joined Table Inheritance in Python gemappt?</p>
<pre class="brush: python; title: ; notranslate">
class Employee(Base):
    __tablename__ = 'employee'
    Id = Column(Integer
                , primary_key=True)
    Name = Column(String(50))

class Manager(Employee):
    __tablename__ = 'manager'
    Id = Column(Integer
                , ForeignKey(Employee.Id)
                , primary_key=True)
    ManagerStatus = Column(String(50))

    __mapper_args__ = {
        'polymorphic_identity': 'manager',
    }

class Engineer(Employee):
    __tablename__ = 'engineer'
    Id = Column(Integer
                , ForeignKey(Employee.Id)
                , primary_key=True)

    EngineerDegree= Column(String(50))

    __mapper_args__ = {
        'polymorphic_identity': 'engineer',
    }
</pre>
<p>Daraus lassen sich diese Create-Statements generieren.</p>
<pre class="brush: python; title: ; notranslate">
create_engine('sqlite:///', echo= True)
Base.metadata.create_all(bind=engine)
</pre>
<pre class="brush: sql; title: ; notranslate">

CREATE TABLE employee (
	&quot;Id&quot; INTEGER NOT NULL, 
	&quot;Name&quot; VARCHAR(50), --Felder der Basisklasse sind hier  ...
	PRIMARY KEY (&quot;Id&quot;)
);
-- und werden in den abgeleiteten Tabelle nicht mehr wiederholt
CREATE TABLE engineer (
	&quot;Id&quot; INTEGER NOT NULL, 
	&quot;EngineerDegree&quot; VARCHAR(50), 
	PRIMARY KEY (id), 
	FOREIGN KEY(id) REFERENCES employee (&quot;Id&quot;)
);

CREATE TABLE manager (
	&quot;Id&quot; INTEGER NOT NULL, 
	&quot;ManagerStatus&quot; VARCHAR(50), 
	PRIMARY KEY (id), 
	FOREIGN KEY(id) REFERENCES employee (&quot;Id&quot;)
);
</pre>
<p>Wichtig ist dabei der Fremdschlüssel in den abgeleiteten Klassen, der auf die Basisklasse zeigt:</p>
<pre class="brush: python; title: ; notranslate">
#Employee.Id bezieht sich dabei auf den Klassen/Attributnamen,
#nicht etwa auf Tabellen oder Spaltenbezeichnungen
Id = Column(Integer,ForeignKey(Employee.Id), primary_key=True)
</pre>
<p>Vergisst man diesen Fremdschlüssel erhält man folgende Meldung:</p>
<blockquote><p>  Can&#8217;t find any foreign key relationships between &#8218;employee&#8216; and &#8218;manager&#8216;.</p></blockquote>
<p>&nbsp;</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Datenschutz für kleine Unternehmen &#8211; Handreichung</title>
		<link>https://www.jepertinger-itconsulting.de/2018/04/13/datenschutz-fuer-kleine-unternehmen-handreichung/</link>
		
		<dc:creator><![CDATA[Karl Jepertinger]]></dc:creator>
		<pubDate>Fri, 13 Apr 2018 17:09:35 +0000</pubDate>
				<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">http://www.jepertinger-itconsulting.de/?p=852</guid>

					<description><![CDATA[Das Thema Datenschutz betrifft jedes Unternehmen, egal ob groß oder klein. Aber gerade in kleineren Unternehmen scheint das Thema unüberwindbar und wird gar nicht erst angegangen. Das Bayrische Landesamt für Datenschutzaufsicht hat auf ihrer Website eine Todo-Liste speziell für einzelne &#8230; <a href="https://www.jepertinger-itconsulting.de/2018/04/13/datenschutz-fuer-kleine-unternehmen-handreichung/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>Das Thema Datenschutz betrifft jedes Unternehmen, egal ob groß oder klein. Aber gerade in kleineren Unternehmen scheint das Thema unüberwindbar und wird gar nicht erst angegangen.</p>
<p>Das Bayrische Landesamt für Datenschutzaufsicht hat auf ihrer Website eine Todo-Liste speziell für einzelne Branchen online gestellt.</p>
<p><a href="https://www.lda.bayern.de/de/kleine-unternehmen.html">https://www.lda.bayern.de/de/kleine-unternehmen.html</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>GIT-Cheatsheet</title>
		<link>https://www.jepertinger-itconsulting.de/2017/10/08/git-cheatsheet/</link>
		
		<dc:creator><![CDATA[Karl Jepertinger]]></dc:creator>
		<pubDate>Sun, 08 Oct 2017 16:23:29 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[tortoise]]></category>
		<category><![CDATA[versionsverwaltung]]></category>
		<guid isPermaLink="false">https://www.jepertinger-itconsulting.de/?p=820</guid>

					<description><![CDATA[Wer bereits mit den Grundsätzen der Versionsverwaltung in SVN vertraut ist, wird sich auch in GIT schnell zurecht finden. Einer der Hauptunterschiede ist, dass nun jeder zur Working-Copy auch noch das komplette Repository lokal hält. Änderungen am Code werden also &#8230; <a href="https://www.jepertinger-itconsulting.de/2017/10/08/git-cheatsheet/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>Wer bereits mit den Grundsätzen der Versionsverwaltung in SVN vertraut ist, wird sich auch in GIT schnell zurecht finden. Einer der Hauptunterschiede ist, dass nun jeder zur Working-Copy auch noch das komplette Repository lokal hält.</p>
<p>Änderungen am Code werden also erst an das lokale Repository und dann an ein entferntes verteilt. Deswegen sind auch die Begrifflichkeiten für SVN-Umsteiger erst verwirrend.</p>
<h3>Wichtige GIT-Begriffe im Schnellcheck:</h3>
<p><span id="more-820"></span></p>
<ul>
<li><em>clone</em><br />
Kopieren/checkout eines entfernten Repositories (komplettes Repository wird kopiert)</li>
<li><em>add</em><br />
Dateien der GIT-Verwaltung im lokalen Repository hinzufügen.</li>
<li><em>commit</em><br />
Änderungen an Dateien im lokalen Repository festschreiben.</li>
<li><em>push</em><br />
Die Commits des eigenen Repositories in ein entferntes Repository schreiben. Im SVN-Jargon ist dies ein &#8222;commit&#8220;.</li>
<li><em>pull</em><br />
Update des lokalen Repositories mit Änderungen aus dem entfernten Repo (fetch+ merge). Im SVN-Jargon ist dies ein &#8222;update&#8220;.</li>
<li><em>fetch</em><br />
Nur Download der Änderungen, kein automatischer Merge</li>
<li><em>merge</em><br />
Zusammenführen verschiedener Zweige (zb. Änderungen aus entferntem Repo mit eigenen Änderungen)</li>
<li><em>stash</em><br />
temporäres, lokales Speichern eines Arbeitsstandes (wichtig z.B. vor Pull mit Änderungen an eigenen Dateien)</li>
</ul>
<h3>Links:</h3>
<p>Walkthrough: <a href="https://rogerdudler.github.io/git-guide/index.de.html" target="_blank" rel="noopener">https://rogerdudler.github.io/git-guide/index.de.html</a><br />
Best Practises: <a href="http://sethrobertson.github.io/GitBestPractices/" target="_blank" rel="noopener">http://sethrobertson.github.io/GitBestPractices/</a><br />
Stashes: <a href="http://de.gitready.com/beginner/2009/01/10/stashing-your-changes.html" target="_blank" rel="noopener">http://de.gitready.com/beginner/2009/01/10/stashing-your-changes.html</a><br />
Grafischer Client: <a href="https://git-scm.com/download/win" target="_blank" rel="noopener">https://git-scm.com/download/win</a> + <a href="https://tortoisegit.org/" target="_blank" rel="noopener">https://tortoisegit.org/</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Regular Expressions und Top Level Domains</title>
		<link>https://www.jepertinger-itconsulting.de/2017/10/04/regular-expressions-und-top-level-domains/</link>
		
		<dc:creator><![CDATA[Karl Jepertinger]]></dc:creator>
		<pubDate>Wed, 04 Oct 2017 19:20:00 +0000</pubDate>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[domain]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[länge]]></category>
		<category><![CDATA[prüfung]]></category>
		<category><![CDATA[regexp]]></category>
		<category><![CDATA[validierung]]></category>
		<guid isPermaLink="false">https://www.jepertinger-itconsulting.de/?p=766</guid>

					<description><![CDATA[Eine häufige Aufgabe in der Programmierung ist das suchen/validieren von Email-Adressen. Mal davon abgesehen, dass ein regulärer Ausdruck nur bedingt dazu benutzt werden kann, funktionieren filtern grobe Näherungen schon mal die meisten. Dies ist eine grobe Näherung wie sie in vielen &#8230; <a href="https://www.jepertinger-itconsulting.de/2017/10/04/regular-expressions-und-top-level-domains/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>Eine häufige Aufgabe in der Programmierung ist das suchen/validieren von Email-Adressen. Mal davon abgesehen, dass ein regulärer Ausdruck nur <a href="http://www.regular-expressions.info/email.html" target="_blank" rel="noopener">bedingt </a>dazu benutzt werden kann, funktionieren filtern grobe Näherungen schon mal die meisten. <span id="more-766"></span>Dies ist eine grobe Näherung wie sie in vielen Programmen bereits hinterlegt ist. Auch im Internet finden sich noch oft Ausdrücke wie dieser (<a href="https://stackoverflow.com/questions/29392621/regex-to-extract-email" target="_blank" rel="noopener">Quelle</a>):</p>
<p><code><span class="pln">strPattern  </span><span class="pun">=</span> <span class="str">"^([a-zA-Z0-9_\-\.]+)@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$"</span></code></p>
<p>In diesem Blogpost geht es mir im besonderen um das Matching der Toplevel-Domain. Dabei ist vielfach noch hinterlegt, dass diese zwischen zwei und drei Buchstaben lang sein muss. Das gilt aber leider nur bei &#8222;country code top level domains&#8220;, die eben einem Land gehören. Generische Top Level Domains sind meist länger. Eine&#8220;.info&#8220;-Domain ist valide, würde aber von obigem Regex nicht gematcht.</p>
<p><code><span class="pln">strPattern  </span><span class="pun">=</span> <span class="str">"^([a-zA-Z0-9_\-\.]+)@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]<strong>{2,}</strong>)$"</span></code></p>
<p>Obiger Regex ist derweil immer noch nur eine Näherung an den IEEE-Standard, filtert aber längere Toplevel-Domains nicht mehr aus.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Oracle SQLCL Export in UTF8 mit BOM</title>
		<link>https://www.jepertinger-itconsulting.de/2017/08/07/oracle-sqlcl-export-in-utf8-mit-bom/</link>
		
		<dc:creator><![CDATA[Karl Jepertinger]]></dc:creator>
		<pubDate>Mon, 07 Aug 2017 18:06:33 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[cmd]]></category>
		<category><![CDATA[eingabeaufforderung]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[sql ci]]></category>
		<category><![CDATA[sqlci]]></category>
		<category><![CDATA[sqlplus]]></category>
		<category><![CDATA[windows]]></category>
		<guid isPermaLink="false">https://www.jepertinger-itconsulting.de/?p=798</guid>

					<description><![CDATA[Der Export von Daten mit SQLCL funktioniert ähnlich wie beim Großvater SQLPlus. Leider bietet SQLCL keine Option mit welcher Kodierung die Ausgabe erfolgt. Das lässt sich mit JAVA_TOOL_OPTIONS einstellen. Folgende Befehle in der Kommandozeile (oder einem CMD-Script) bringen SQLCL einmalig &#8230; <a href="https://www.jepertinger-itconsulting.de/2017/08/07/oracle-sqlcl-export-in-utf8-mit-bom/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>Der Export von Daten mit SQLCL funktioniert ähnlich wie beim Großvater SQLPlus.</p>
<p>Leider bietet SQLCL keine Option mit welcher Kodierung die Ausgabe erfolgt. Das lässt sich mit JAVA_TOOL_OPTIONS einstellen. <span id="more-798"></span>Folgende Befehle in der Kommandozeile (oder einem CMD-Script) bringen SQLCL einmalig dazu, jede Ausgabe ins Filesystem mit UTF8 zu schreiben :</p>
<pre class="brush: bash; title: ; notranslate">
set JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF-8'
</pre>
<p>Leider ergibt das aber nur UTF8 ohne <a href="https://de.wikipedia.org/wiki/Byte_Order_Mark">BOM/Byte Order Mark</a>.<br />
Im Default kann SQLCL oder die CMD nun keine BOM erzeugen. Dabei handelt es sich aber nur um fest kodierte Bytes, die der Datei vorran gestellt werden: <code>EF BB BF</code></p>
<p>Der Trick in der CMD ist, eine Datei &#8211; die nur diese Bytes enthält &#8211; dem eigentlichen Export voran zu &#8222;stellen&#8220;:</p>
<pre class="brush: bash; title: ; notranslate"> copy utf8bom.txt+export.csv final_export.csv /B </pre>
<p>Die Datei <a href="https://www.jepertinger-itconsulting.de/wp-content/uploads/2017/08/utf8bom.txt">utf8bom.txt</a> steht zum Download bereit. Das Flag &#8222;/B&#8220; ist wichtig, bringt es doch den copy-Befehl dazu, die Zeichen binär zu kopieren.</p>
<p>Darüber hinaus gibt es auch eine Variante mit der Powershell, die ich in einem der nächsten Beiträge erörtern möchte.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
