Hier ein paar Eindrücke aus unserem Urlaub 2016 – Bilder aus Dänemark und Schweden.
Spring Boot – App Deployment on Linux
Spring Boot bietet die Möglichkeit seine erstellte Jar-Datei auch als Selbstausführenden Linux-Dienst zur Verfügung zu stellen. Das heißt, die erstellte Jar-Datei lässt sich direkt als Linux-Dienst nutzen.
Um das Feature zu nutzen müsst ihr pom.xml wie folgt anpassen:
1
2
3
4
5
6
7
|
< plugin > Â Â Â Â < groupId >org.springframework.boot</ groupId > Â Â Â Â < artifactId >spring-boot-maven-plugin</ artifactId > Â Â Â Â < configuration > Â Â Â Â Â Â Â Â < executable >true</ executable > Â Â Â Â </ configuration > </ plugin > |
Nach einem Package erstellen können wir die Datei auf unser Zielsystem deployen. Ein Link in die entsprechenden Runlevels und schon können wir die Spring Boot App als Linux Dienst laufen lassen.
Weitere Informationen dazu hier:
http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
SLF4J mit Logback und Liquibase
In einem aktuellen Projekt verwende ich SLF4J mit Logback und möchte einige Logs in die Datenbank schreiben lassen. Dafür liefert Logback auch geeignete SQL Statements. Da ich aber in meinem Projekt mit Liquibase unterwegs bin wollte ich das gerne mit in die DB-Changelog mit aufnehmen. Das Ergebnis dazu möchte ich hier teilen:
< changeSet id = "1" author = "fhabermann" runAlways = "true" > Â Â Â Â Â Â Â Â < validCheckSum >any</ validCheckSum > Â Â Â Â Â Â Â Â < preConditions onFail = "MARK_RAN" > Â Â Â Â Â Â Â Â Â Â Â Â < not > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < tableExists tableName = "logging_event" /> Â Â Â Â Â Â Â Â Â Â Â Â </ not > Â Â Â Â Â Â Â Â </ preConditions > Â Â Â Â Â Â Â Â < createTable tableName = "logging_event" > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "timestmp" type = "BIGINT" > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < constraints nullable = "false" /> Â Â Â Â Â Â Â Â Â Â Â Â </ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "formatted_message" type = "TEXT" > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < constraints nullable = "false" /> Â Â Â Â Â Â Â Â Â Â Â Â </ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "logger_name" type = "VARCHAR(255)" > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < constraints nullable = "false" /> Â Â Â Â Â Â Â Â Â Â Â Â </ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "level_string" type = "VARCHAR(255)" > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < constraints nullable = "false" /> Â Â Â Â Â Â Â Â Â Â Â Â </ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "thread_name" type = "VARCHAR(255)" > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < constraints nullable = "true" /> Â Â Â Â Â Â Â Â Â Â Â Â </ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "reference_flag" type = "SMALLINT" > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < constraints nullable = "true" /> Â Â Â Â Â Â Â Â Â Â Â Â </ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "arg0" type = "VARCHAR(255)" > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < constraints nullable = "true" /> Â Â Â Â Â Â Â Â Â Â Â Â </ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "arg1" type = "VARCHAR(255)" > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < constraints nullable = "true" /> Â Â Â Â Â Â Â Â Â Â Â Â </ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "arg2" type = "VARCHAR(255)" > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < constraints nullable = "true" /> Â Â Â Â Â Â Â Â Â Â Â Â </ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "arg3" type = "VARCHAR(255)" > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < constraints nullable = "true" /> Â Â Â Â Â Â Â Â Â Â Â Â </ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "caller_filename" type = "VARCHAR(255)" > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < constraints nullable = "false" /> Â Â Â Â Â Â Â Â Â Â Â Â </ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "caller_class" type = "VARCHAR(255)" > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < constraints nullable = "false" /> Â Â Â Â Â Â Â Â Â Â Â Â </ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "caller_method" type = "VARCHAR(255)" > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < constraints nullable = "false" /> Â Â Â Â Â Â Â Â Â Â Â Â </ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "caller_line" type = "VARCHAR(4)" > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < constraints nullable = "false" /> Â Â Â Â Â Â Â Â Â Â Â Â </ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "event_id" type = "BIGINT" autoIncrement = "true" > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < constraints nullable = "false" primaryKey = "true" /> Â Â Â Â Â Â Â Â Â Â Â Â </ column > Â Â Â Â Â Â Â Â </ createTable > Â Â Â Â </ changeSet > Â Â Â Â Â Â Â Â < changeSet id = "2" author = "fhabermann" Â runAlways = "true" > Â Â Â Â Â Â Â Â < validCheckSum >any</ validCheckSum > Â Â Â Â Â Â Â Â < preConditions onFail = "MARK_RAN" > Â Â Â Â Â Â Â Â Â Â Â Â < not > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < tableExists tableName = "logging_event_exception" /> Â Â Â Â Â Â Â Â Â Â Â Â </ not > Â Â Â Â Â Â Â Â </ preConditions > Â Â Â Â Â Â Â Â < createTable tableName = "logging_event_exception" > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "event_id" type = "BIGINT" >< constraints nullable = "false" /></ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "i" type = "SMALLINT" >< constraints nullable = "false" /></ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "trace_line" type = "VARCHAR(255)" >< constraints nullable = "false" /></ column > Â Â Â Â Â Â Â Â </ createTable > Â Â Â Â Â Â Â Â < addPrimaryKey tableName = "logging_event_exception" columnNames = "event_id,i" /> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < addForeignKeyConstraint baseColumnNames = "event_id" Â Â Â Â Â Â Â Â Â Â Â Â baseTableName = "logging_event_exception" Â Â Â Â Â Â Â Â Â Â Â Â constraintName = "logging_event_exception_ibfk_1" Â Â Â Â Â Â Â Â Â Â Â Â onDelete = "CASCADE" Â Â Â Â Â Â Â Â Â Â Â Â onUpdate = "RESTRICT" Â Â Â Â Â Â Â Â Â Â Â Â referencedColumnNames = "event_id" Â Â Â Â Â Â Â Â Â Â Â Â referencedTableName = "logging_event" /> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â </ changeSet > Â Â Â Â Â Â Â Â < changeSet id = "3" author = "fhabermann" Â runAlways = "true" > Â Â Â Â Â Â Â Â < validCheckSum >any</ validCheckSum > Â Â Â Â Â Â Â Â < preConditions onFail = "MARK_RAN" > Â Â Â Â Â Â Â Â Â Â Â Â < not > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < tableExists tableName = "logging_event_property" /> Â Â Â Â Â Â Â Â Â Â Â Â </ not > Â Â Â Â Â Â Â Â </ preConditions > Â Â Â Â Â Â Â Â < createTable tableName = "logging_event_property" > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "event_id" type = "BIGINT" >< constraints nullable = "false" /></ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "mapped_key" type = "VARCHAR(255)" >< constraints nullable = "false" /></ column > Â Â Â Â Â Â Â Â Â Â Â Â < column name = "mapped_value" type = "TEXT" >< constraints nullable = "true" /></ column > Â Â Â Â Â Â Â Â </ createTable > Â Â Â Â Â Â Â Â < addPrimaryKey tableName = "logging_event_property" columnNames = "event_id,mapped_key" /> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â < addForeignKeyConstraint baseColumnNames = "event_id" Â Â Â Â Â Â Â Â Â Â Â Â baseTableName = "logging_event_property" Â Â Â Â Â Â Â Â Â Â Â Â constraintName = "logging_event_property_ibfk_1" Â Â Â Â Â Â Â Â Â Â Â Â onDelete = "CASCADE" Â Â Â Â Â Â Â Â Â Â Â Â onUpdate = "RESTRICT" Â Â Â Â Â Â Â Â Â Â Â Â referencedColumnNames = "event_id" Â Â Â Â Â Â Â Â Â Â Â Â referencedTableName = "logging_event" /> Â Â Â Â </ changeSet > |
Java XSL Transformation
Für ein aktuelles Projekt in Java benötigte ich eine Funktion/Klasse die es mir ermöglicht XML Code mittels XSL zu Transformieren. Dazu gibt es auch einige Beispiele im Netz die aber meist fertige Dateien von der Festplatte einlesen und Transformieren.
Hier dazu mein Beispiel welches nur mit Strings umgeht:
import java.io.StringReader; import java.io.StringWriter;import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory;class XslTransformer { /** * transform given xml with given xsl * * @param xml * @param xsl * @return * @throws TransformerException */ public static String transform(String xml, String xsl) throws TransformerException { StringReader srXml = new StringReader(xml); StringReader srXsl = new StringReader(xsl); StringWriter result = new StringWriter();TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer( new javax.xml.transform.stream.StreamSource(srXsl));transformer.transform( new javax.xml.transform.stream.StreamSource(srXml), new javax.xml.transform.stream.StreamResult(result)); return result.toString(); } |
SAP Hana mit SAP Business One – Best Practices aus dem Alltag
Datenbank Import und Export
Um Importe und Exporte mit dem Hana Studio zu machen empfehlen sich folgende SQL Befehle:
# export als binary in angegeben pfad export "FOO" . "*" as binary into '/path' with replace
# Falls es Probleme beim Export mit einigen Tabellen gibt bezüglich der merges dann folgendes ausführen merge delte of [ table ]; # import eines binary backups unter neuem namen import "FOO" . "*" as binary from '/path' with rename schema FOO TO BAR; # Falls es Probleme beim Import gibt: import "FOO" . "*" as binary from '/path' with ignore existing rename schema FOO TO BAR; |
Datenbankbenutzer zurücksetzen wegen zu vieler fehlgeschlagener Logins
SQL Befehl zum zurücksetzen des SYSTEM Benutzers:
ALTER USER SYSTEM RESET CONNECT ATTEMPTS |
Passwort Policy anpassen
Um die Security Policy etwas zu lockern kann man die Einstellungen wie auf dem Bild verwenden.
Starten der Hana DB bei Systemstart
Falls man bei der Installation vergessen hat zu sagen, dass die Hana DB automatisch mit gestartet werden soll beim Systemstart kann man das wie folgt nachholen:
1. Log on to the SAP HANA host as a user with root authorization. 2. Change to the system profile directory /usr/sap/<SID>/SYS/profile. 3. Edit the profile <SID>_HDB<instance number>_<host name>. 4. Change the parameter setting Autostart = 0 to Autostart = 1 . 5. Save the profile <SID>_HDB<instance number>_<host name>. |
Installer Optionen
Nützliche Optionen für den Hana und Business One Installer:
Ignore Memory
--ignore=check_min_mem |
Ignore Signature File
--ignore=check_signature_file |
Hana SYSTEM Benutzer zurücksetzen
Siehe: http://scn.sap.com/docs/DOC-33097
http://help.sap.com/saphelp_hanaplatform/helpdata/en/c0/1fc0f5d38c47c69204d84a700d0ca7/content.htm
su - ndbadm . /HDB stop cd exe hdbnameserver & hdbcompileserver & hdbindexserver –resetUserSystem -- alle dienste wieder stoppen mit STRG-C und kill -- danach . /HDB start |
Disable default lock down
Bearbeite die Datei: /hana/shared/NDB/exe/linuxx86_64/HDB_XXXXX/config/indexserver.ini
Änder den Wert von password_lock_for_system_user auf false
Starte die Hana Services neu.
Die normale System indexserver.ini liegt in /usr/sap/NDB/SYS/global/hdb/custom/config
Unglaublich – SAP B1 mit SAP Hana
Unglaublich was der SAP Support mit da mit geteilt hat.
Aber fangen wir langsam an. Wir haben SAP Business One mit SAP Hana installiert mit PL0. In allen Dokumentationen und der Installer von SAP Business empfiehlt ausdrücklich nicht den Ober-Haupt-Root-Admin von SAP Hana für die Installation zu nutzen. Sondern man soll doch einen neuen Benutzer anlegen. Damals halt auch genau so gemacht.
Mittlerweile hat die SAP das PL2 freigegeben. Und jetzt haltet euch fest. Es wird ausdrücklich empfohlen den Ober-Haupt-Root-Admin von SAP Hana zu nutzen da es ansonsten zu Problemen kommt.
Alle unsere Probleme mit Performance und Funktionen die in diesem Zusammenhang nicht funktionierten lagen einzig und allein daran, dass wir so doof waren und nicht den SYSTEM Benutzer genutzt hatten. Vielen Dank dafür!
Um das aber nochmal sauber zusammen zu fassen. Die SAP ist nicht in der Lage eine SAP Business One Installation ohne den eigentlichen SYSTEM Benutzer zu betreiben. Schönen Gruß an die Sicherheitsabteilung.
Unglaublich sowas heutzutage….
Aber…. SAP is the Future….
Frühlingserwachen
Hier ein paar frische Frühlingsbilder von uns.
SAP Schulung in Kopenhagen
Hier ein paar Bilder von der SAP Schulung aus Kopenhagen letzte Woche.
Eines sei noch erwähnt: SAP is the FUTURE 😀 (haha)
Jahresrückblick 2015 und noch einiges mehr
Unser Jahresrückblick beginnt ungefähr bei Alexa’s 6. Geburtstag und zeigt den täglichen Wahnsinn bei uns. Die Up’s and Down’s, Bauprojekte, eine kleinen Schuhtick, das Bahnchaos, Tränen, Lachen und noch viele andere Dinge. Also viel Spaß beim anschauen…