Blog

Blog

Wenn über DevOps gesprochen wird, gibt es meiner Erfahrung nach vielfältige "Interpretationen". Die einen treffender, die anderen ... weniger.

Worin sich alle einig sind (egal ob Sie es aus meiner Sicht verstanden haben oder nicht):

  • Wir wollen agil Software entwickeln

  • kleine Iterationen -> schnelleres Feedback → weniger Kosten durch vermeidbare "Rolle rückwärts"
  • "die Cloud" hat ganz neue Anforderungen an Betrieb. Ist komplexer, ist vielfältiger. Ist durch reine Manpower nicht mehr qualitativ sicherzustellen.

 

Was viele noch sagen:

  • Wir wollen die Zusammenarbeit zwischen Entwicklung und Betrieb verstärken

 

Wo sich die Geister leider scheiden:

  • wer ist denn "der DevOp"

 

Nun wird's persönlich: Kurzum: DEN gibt es nicht!!
Und nein, bitte betitelt nun nicht einfach alte "Betriebsführer" aka "Ops" um nur weil Sie eben mal Ansible, Chef, Puppet, Salt und Co. kennen oder mit OpenShift, CloudFoundry oder Rancher irgendwelche (Docker, Kubernetes) Container an den Start bringen müssen.

Nur weil man für Cloud / CaaS / Container Platforms / Scaled Applications ... <name it> andere Mittel braucht und nicht mehr wie früher ein WAR / EAR in "den" JBoss, Tomcat/TomEE oder WebSphere knallt, heißt das noch lange nicht das ist "devOp". Nein, auch nicht wenn man da "Variablen" drin benutzt ... NEIN NEIN NEIN

 

Was bedeutet es aber dann?

  • DevOp ist eine Art "Kultur", keine Rolle
  • SW-Entwickler und Ops sind eben beide T-Shaped people ... Sie haben Ihr Spezialwissen, das T wird aber breiter
    • vielleicht ... ich nenne Sie ab jetzt: pi-shaped (π) teams (wink)
  • DevOp ist ganzheitlich. Ganz heißt: von vorne bis hinten. Man behilft sich gegenseitig, behindert sich aber auch nicht gegenseitig.
  • Man entwickelt das vorgehen gemeinsam, nicht einseitig.
  • Man bespricht Probleme zusammen, die Spezialisten bieten aber primär an, das ihrer Domäne am nächsten liegende Problem für alle beteiligten zu lösen
  • Es gibt kein "Die" und "Wir"
  • der Grad der Automatisierung und Reproduzierbarkeit sind zwei wichtige Faktoren für ein erfolgreiches, nachhaltiges Produkt
  • "Machen wir später" ist out. Wir liefern (Idealfall) ab der ersten Minute.
  • Wir entwickeln uns auch hier kontinuierlich weiter, genau wie wir es in der Softwareentwicklung selbst tun.
    • Das muss im ersten Schritt nicht perfekt sein, MVP auch hier.

 

Und was passiert wenn ich das eben doch anders mache?

  • dann haben wir "DevOps Teams" die autark arbeiten und Vorgaben entwickeln wie "Pakete" geschnürt werden müssen
  • dann haben wir SW Entwicklungsteams, die sich erst zum spätmöglichsten Zeitpunkt in der Entwicklung um "Deployment" kümmern
    • Bis dahin einfach auch "ihr eigenes Ding" machen
  • Es existieren zwei Welten, zwei Wahrheiten
  • Irgendwo muss was "über den Zaun" geworfen werden
  • Grad der Automatisierung leidet immens
  • Aussagen zur Produktreife durch reproduktion sind stark eingeschränkt
  • Es wird nicht zusammengearbeitet, sondern im Fehlerfall weiter Fingerpointing betrieben

 

Liegt an euch was Ihr d'raus macht ... ich habe euch meine Meinung dazu gesagt, überzeugt mich vom Gegenteil (tongue)

 

 

 

 

tl;dr

nein DevOps ist nicht tot, nur leider aus meiner Sicht oft falsch verstanden. Der Begriff ist abgenutzt; von Buzzword-Bingo spielern wurde die Sau nun so lange durch's Dorf getrieben und mit Altlasten beladen, dass der Blick auf das richtige und wichtige verloren gegangen ist ... vielerorts

Ein Artikel zum Nachdenken, zum Kommentieren, zum aufregen ... etwas für die besinnliche Weihnachtszeit also (wink)

Haben wir uns in den 90ern nicht noch über den IE (Internet Explorer, das blaue Ding namens Internet auf dem 286er mit Windows 95).

Haben wir uns nicht auch lustig über bunte (meist rosa oder grell-grüne) Scrolleisten gemacht?

(Tipp: im IE 9 kam er wieder https://msdn.microsoft.com/en-us/library/ms531155(v=vs.85).aspx)

 

Warum schlage ich mir nun wohl die Hand auf die Stirn??! :

stackoverflow.com/questions/26960703

Dieser Tage stellt Mozilla - mal wieder - seine Produkte in Frage. ok, nicht ganz so dramatisch, aber sie kommen einmal mehr zu dem Schluss, dass ein Feature nicht in der breiten Masse genutzt wird und man es daher entfernen sollte da man sich damit potentiell Ressourcen für andere, neue, wichtige Themen aufspart.

Konkret geht es um die - vielen Otto-Normal-Nutzern tatsächlich unbekannte - Funktion der Tab-Groups.

 

Das Announcement

https://support.mozilla.org/de/kb/tabgruppen-werden-aus-firefox-entfernt

Ehre wem Ehre gebürt. Nach den ersten Sätzen mit Standard-Floskeln (man bedaure es, aber, ... usw.) folgt etwas, das es heutzutage nicht oft gibt:

Eine sofort anwendbare Lösung für jene, die dieses Produkt-Feature dennoch behalten wollen!

Die Tab-Groups sind weg, lang leben die Tab-Groups

Für was hat man OpenSource, wenn nicht die Community auch Lösungen bieten könnte. Konkret wurde einfach der Teil aus Firefox, der die Funktion mitbringt "ausgeschnitten" und als Extensions (Erweiterung) verfügbar gemacht.

Das ganze kann nun von weiteren Freiwilligen sogar weiter entwickelt werden, und das wurde es auch schon:

Das ganze findet sich im Addons-Verzeichnis unter addons.mozilla.org > "TabGroups" (tab-groups-panorama)

 

Das tolle: Man muss gar nicht erst warten, bis das Feature aus dem Browser ausgebaut wurde um es dann zu ersetzen. Man kann es sofort auf den FF 44 installieren und merkt folglich gar nichts mehr von der "Umstellung"!!

 

Jedem der dieses Feature mag oder nun Kennengelernt und nicht mehr vermissen will: ein Klick-install und fertig ist die Kiste (wink)

 

Verdammt ... ich habe es vergessen zu installieren

jaja, man schiebt ja gerne etwas vor sich her. Wenn Ihr dann auf FF 45 gelandet seid und "alles weg" ist .. keine Sorge, die Jungs von Mozilla wie auch von TabGroups haben vorgesorgt.

Einfach nochmal in Ruhe die Hinweise unter https://support.mozilla.org/de/kb/tabgruppen-werden-aus-firefox-entfernt nachlesen.

JetBrains verpasst sich ein neues Gesicht. Unter https://www.jetbrains.com/ ist seit gestern das neue Corporate Design online.

Aus

aus wird

 

Und auch die Produkte bekommen ein "modernes" aussehen, die Logos ähneln dem des Firmenlogos, Beispiel IntelliJ:

aus wird

 


^^ unter'm Strich:

Wie ich finde leider lieblos und gewöhnlich. War wohl wieder eine der langweiligen Agenturen am Werk.. oder ich erkenne das tolle einfach nicht, wer weiß ... ich bin ja nur Entwickler (wink)

 

Und: warum auch immer erinnert es mich an Adobe ... achja... da war ja was mit Anfangsbuchstaben als dominantes Merkmal eines Produktlogos während der Rahmen immer nahezu gleich ist (Farbgebung darf sich ändern)

(big grin)

Easteregg - Slack

nicht wirklich schwer zu finden, aber lustig (wink)

% is a bad threadshold for many nowadays applications, unfortunatly most developers seems not to think about what it means in reallife.

Why?: read ahead

Qnap

[Media Library] Your disk volume has less than 5% free space on /share/MD0_DATA/. Related functions will be stopped unless you free up additional space. Please free up more space for the Media Library to continue running.

great in a world with 3TB+ HDDs where 5% is more worth than 150 GB!!! There was a time 150 GB HDDs didn't exist and we had Windows, 10 Games, Word and ALL our Music stored on the disc ... c'mon.

 

Microsoft Battery Management in Windows

Another pre-defined 7-5% Level (thank god, in newer Windows versions you are allowed to lower them manually, this wasn't possible in past days).

These levels are fix, never mind how good your battery is. For a 8h battery, 10% lower level equals around 45min time left. 7% equals 30min and 5% still more than 24min. Still enough time to work ahead, safe your documents and shut down. Windows doesn't ask the user if he want to shut down later or it should hibernate automatically. Still, I'm aware of the new Win8 auto-update feature and "it should give a user best experience" if it suspends / hibernates automatically and you can still resume if a power adapter is attached. Unfortunatly, up to Windows 7 (I didn't tested it on Win8 yet) windows doesn't recognize really critical power level in suspend / hibernate mode, so your work will be lost if it automatically suspends but you forget to attach a power adapter within the next hours.

 

final code first:

bool IsEndOfPage()
{
  if (scrollDirection() == statics.scrollDirectionDown) {
      return (leftBorder  <= viewport.position());
  } else {
      return (rightBorder >= viewport.position());
  }
}

Das Problem / Die Diskussion

Schöner Code vs. IDE Code Formatierung und automatisierte Code Style Checks vertragen sich nicht besonders gut. Denn manche Regeln lassen sich wirklich nur mit enormen Aufwand hinterlegen, andere gar nicht.

Das o.g. Beispiel zeigt eine konditionale Rückgabe, die je nach Scroll-Richtung andere Vergleichsoperation nutzt, um den Bildschirmrand mit der aktuellen Scroll-Position zu vergleichen.

Nun kann man hier gerne noch weitere Diskussionen starten wie "aber zwei returns in einer Methode sind doch böse", lassen wir aber ,)

 

In o.g. Fall, würde ich mich ggf. über Code-Formatierung hinwegsetzen um eine bessere Lesbarkeit zu erzielen / die Vergleichsoperatoren in der gleichen optischen Linie / Spalte darzustellen.

Weitere Lösungswege

  1. (tick) geht auch super, hier könnte die code-Formatierung erhalten bleiben, da man einfach die Operatoren tauschte und nun jeder vorne steht, der bei beiden gleich ist, der Vergleichsoperator landet damit in der gleichen "Spalte"

    bool IsEndOfPage()
    {
      if (scrollDirection() == statics.scrollDirectionDown) {
          return (viewport.position() >= leftBorder);
      } else {
          return (viewport.position() <= rightBorder);
      }
    }
  2. andere Meinungen sind: es ist einfacher zu verstehen wenn die Vergleichsoperatoren gleich sind, dem kann ich mich persönlich nun nicht anschließen (thumbs down)

    if (scrollDirection() == statics.scrollDirectionDown) {
        return (leftBorder  <= viewport.position());
    } else {
        return (viewport.position() <= rightBorder);
    }
  3. evil-else. Grundsätzlich richtig und bin ich auch großer Fan von, aber in dem Fall stört mich wieder die verschiedenartige Einrück-Tiefe der Returns

    if (scrollDirection() == statics.scrollDirectionDown) {
        return (leftBorder  <= viewport.position());
    }
    return (rightBorder >= viewport.position());
  4. default value belegen wäre eine weitere Variante, auch nicht besonders "sexy" aber why not (thumbs up)

    /** default return value **/
    var retValue = (rightBorder >= viewport.position());
    
    /** conditional change of return value **/
    if (scrollDirection() == statics.scrollDirectionDown) {
        retValue = (leftBorder  <= viewport.position());
    }
    return retValue; 
  5. (minus) using tenary operator...please: NO

    return ( (scrollDirection() == statics.scrollDirectionDown) ? (leftBorder  <= viewport.position()) : (rightBorder >= viewport.position()) );
Why TDD kills TDD

oder: "Warum Tab Driven Development ein Problem für Test Driven Development ist"

 

Spoiler-Warnung: Dieser Text ist nicht gänzlich ernst zu nehmen! (smile) Ich denke / hoffe aber Ihr merkt worauf ich hinaus möchte.

 

Begriffsklärung

Tab Driven Development :

Nutze für die Entwicklung deiner Software eine IDE welche eine Autovervollständigung ( Tab(ulator)-Completion ) für die genutzte Programmiersprache und Bibliotheken besitzt.

Mach dir keine Gedanken um den Aufbau, es wächst einfach so wie du es gerade brauchst.

Fortan lerne auch nicht mehr irgendwelche APIs / ABIs sondern hangele / tabbe dich durch die "Möglichkeiten". Fehlt eine Möglichkeit, wird sie ergänzt oder was gebastelt um es zu umgehen - im Zweifel jedesmal wieder.

Eng verwandt mit "Try and Error", "Spaghetticode", "" und "f*** it, ship it"

 

Test Driven Development :

Ist eigentlich das was jeder Entwickler tun sollte: Erst denken, dann handeln

-> Erst den Test schreiben - sich dabei Gedanken um den Aufbau machen -, erst dann das Programm selbst entwickeln.

Die Tests belegen dass du alles richtig gemacht hast und geben dir ein gutes Gefühl.

Das Problem sitzt vor dem Rechner

Nun, was sind wohl die klassischen Ausreden keine Tests zu schreiben:

  • Ich habe keine Zeit
  • Aufwendig
  • bezahlt niemand
  • muss ich ständig anpassen da mir während der Entwicklung immer noch was brillantes einfällt
  • Tests schreiben ist langweilig

(smile) ich denke wir kennen genügend weitere und sei es reine Bequemlichkeit, aber: es geht ja um Tab DD vs. Test DD und nicht um "Test DD" vs. "Test-less DD".

 

Nun: Was wäre ohne 'Tabs'?

Annahmen:

  • Wir müssten uns mehr merken
  • Wir müssten uns mit APIs / ABIs mehr auseinandersetzen und verstehen was Sie tun bevor wir programmieren und einen Fehler finden
  • Code wäre tendenziell fehleranfälliger durch Schreibfehler (bei nicht vor-kompilierten Sprachen)
  • Entwicklungszeit verlängert sich

Erwartungen:

  • Mehr Qualität denn Quantität
  • Am Ende höher qualifiziertes Personal
  • Fehlerbehebungen gehen "schneller von der Hand" wenn man mehr Background hat

 


inspired by / related to topic: svenpet.com about Blame driven development - finally a methodology that works

Nun nachdem ich fast 2 Jahre kein PHP mehr in der Hand hatte wird es mal wieder Zeit sich die aktuellen Plattformen und Co anzusehen.

Zunächst mal wieder starten und aufwärmen:

  • Download ZendStudio 9
    • Erkenntnis #1: Lizenzen sind deutlich günstiger geworden
  • phpCloud.com
    • Erkenntnis #1: Mein Login funktioniert noch, um ZendFramework 2 zu nutzen muss ich aber den ApplicationContainer neu anlegen
  • ZendFramework 2
    • Erkenntnis #1:liegt auf gitHub, muss manuell als "User Library" in ZendStudio 9 integriert werden ;/

Das/die erste(n) Problem(e)

  • ZendStudio 9 kann nicht mit ZendFramework 2
    Alle ZendStudio Funktionalitäten bzgl. ZendStudio sind funktionslos! (sad)
    Soviel zum vollmundigen Versprechen:

    Try Zend Framework 2 on the Zend Developer Cloud

    Want a quick way to test drive Zend Framework 2? The Zend Developer Cloud on phpcloud.com makes it easy to set up a ZF2 sample app and start playing with i

    http://framework.zend.com/downloads/phpcloud

  • clone des phpCloud projekts wird nicht über ssh durchgeführt...heißt: im Nachhinein die .git/config anpassen und git-URL anpassen
  • ZendStudio kommt nicht ganz sauber mit Projekten klar die einen Punkt im Namen haben. Die Deploy URL ist falsch
    -> Project Settings -> PHP Debug
  • Habe direkt zu beginn Eclipse Fehler(sad)

    Cannot re-declare method '__anonymous' in type 'Doctrine\Tests\Common\Annotations\Fixtures'
    NamespaceWithClosureDeclaration.php
    /project.name/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures    line 12    DLTK Problem

 


Neueste Info: Zend Studio 10, erwartetes Release in Q4/2012 wird erst ZF 2 vollständig unterstützen...

 

Also Projekt erst mal auf Eis gelegt!

#draft

 

http://maven.apache.org/

http://stackoverflow.com/questions/270445/maven-compile-with-multiple-src-directories
http://www.java-forum.org/deployment/105565-build-helper-maven-plugin-eclipse.html
https://duckduckgo.com/?q=m2eclipse+add+source
https://github.com/mglauche/m2eclipse-extras
http://www.sonatype.com/people/2008/05/adding-additional-source-folders-to-your-maven-build/


<!-- add additional mock source directory for testing
     http://mojo.codehaus.org/build-helper-maven-plugin
     http://www.sonatype.com/people/2008/05/adding-additional-source-folders-to-your-maven-build/
     http://mackaz.de/304
-->
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.7</version>
    <executions>
        <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>${project.basedir}/src/main/java-fake</source>
                    <source>${project.basedir}/src/mock/java</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>





Example project who solved the problem:

Maven dependencies

http://cxf.apache.org/docs/using-cxf-with-maven.html

Servlet in web.xml registrieren

http://cxf.apache.org/docs/servlet-transport.html

pom.xml für mvn-eclipse anpassen

http://maven.apache.org/plugins/maven-eclipse-plugin/examples/additional-facets.html

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-eclipse-plugin</artifactId>
    <version>2.9</version>
    <configuration>
        <additionalProjectFacets>
            <cxf.core>1.0</cxf.core>
        </additionalProjectFacets>
<!-- ... -->

vgl. .settings/org.eclipse.wst.common.project.facet.core.xml

Clean projects, retest and startup eclipse

$ git clean -Xdf
$ mvn eclipse:eclipse

 

Write a service

http://cxf.apache.org/docs/writing-a-service-with-spring.html

Weitere Hinweise

Die Basis

Zunächst brauchen wir mal den Websphere. Die Installationspakete Hierzu finden sich gut versteckt unter:

WebSphere Application Server for Developers - no charge runtime for application 

http://www14.software.ibm.com/webapp/download/preconfig.jsp?id=2009-06-17+09%3A57%3A31.316963R&S_TACT=&S_CMP=

 

Weitere Infos und Hilfe unter http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp

Probleme

Hauptsächlich dreht sich alles um das J9 IBM Java VM

https://www.ibm.com/developerworks/java/jdk/

http://www-01.ibm.com/support/docview.wss?uid=swg21221478

Dieses steht für Linux und Windows, nicht aber für Mac zur Verfügung. Daher

  • WAS Profile werden nicht angelegt
    • Wie folgender Abschnitt darlegt, kann man diese leider auch nicht händisch "nachinstallieren" lassen.
  • Deployments funktionieren nicht (wg. fehlendem Profil)
  • Server wird vermutlich nie Laufen.

Aber hey! Wir können entwickeln (wink) und Für den Rest gibt es Continuous Integration!

Die Installation

./install -is:log install.$(date +%F).log -is:javahome /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home

Anpassungen an MacOS X

Dieser Abschnitt ist nicht fertig geworden bzw. irrelevant, siehe Einschränkungen

-bash:[2012-04-12 13:49:32 @1334231372] silberhorn@masesiapplework
-bash:~
-bash:$ cd Applications/IBM/WebSphere/AppServer/-bash:[return code: (0)]
-bash:[2012-04-12 13:50:54 @1334231454] silberhorn@masesiapplework

-bash:~/Applications/IBM/WebSphere/AppServer
-bash:$ perl -pi -e 's/JAVA_HOME="\$WAS_HOME\/java"/if [ -z "\$JAVA_HOME" ]; then echo "Set JAVA_HOME in environment"; exit 1; fi/' bin/setupCmdLine.sh
-bash:[return code: (0)]
 
-bash:~/Applications/IBM/WebSphere/AppServer
-bash:$ perl -pi -e 's/\/bin\/uname/\/usr\/bin\/uname/' bin/setupCmdLine.sh
-bash:[return code: (0)]
.profile
# …
 
alias setJavaJDK="export JAVA_HOME='/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home/'"
 
# set Java JDK as default JAVA_HOME
setJavaJDK
 
# …

(lightbulb) To be continued ... Wird fortgesetzt ... Fortsetzung folgt ... Oder schreib's selbst :) ... oder schick mir eine Mail ... oder sonst eine Nachricht dass du hier Info's brauchst

Ein Profil Anlegen

http://www14.software.ibm.com/webapp/wsbroker/redirect?version=pix&product=was-nd-dist&topic=rxml_manageprofiles

Eigentlich sollte schon eines da sein, siehe:

properties/WSCustomConstants.properties
defaultProfilePath=/Users/silberhorn/Applications/IBM/WebSphere/AppServer/profiles/AppSrv01

allerdings gibt es das Verzeichnis bei mir nicht. Im Install Log steht hierzu auch nichts. Also legen wir es mal neu an (bzw. versuchen es (smile))

-bash:~/Applications/IBM/WebSphere/AppServer
-bash:$ bin/manageprofiles.sh -create -profileName AppSrv01 -profilePath $PWD/profiles -templatePath $PWD/profileTemplates/default

was leider mit der Meldung endet:

The IBM Class Sharing Adaptor will not work in this configuration.
You are not running on a J9 Java VM.
Die folgenden Validierungsfehler wurden f?r die Befehlszeilenparameter gefunden:
	profilePath: Mindestens einer der angegebenen Parameter ist ung?ltig.

Will nicht. Alle meine Versuche scheitern, also muss es auch ohne gehen!

(lightbulb) To be continued ... Wird fortgesetzt ... Fortsetzung folgt ... Oder schreib's selbst :) ... oder schick mir eine Mail ... oder sonst eine Nachricht dass du hier Info's brauchst

Einrichtung in Eclipse

Zunächst einmal Eclipse Helios SR2 JEE installieren.

Anschließend können / müssen aus dem Marketplace die DeveloperTools bezogen werden:

 

Das erste (Eclipse) Projekt

 

 

Wenn folgende Meldung erscheint, bitte nochmal schauen ob das Profil existiert! Einfach abbrechen. Das wichtigste hat Eclipse schon angelegt!

-bash:~/Applications/IBM/WebSphere/AppServer
-bash:$ bin/manageprofiles.sh -listProfiles

Nun können wir ein neues Web-Projekt anlegen und als Runtime-Environment diesen WAS angeben.

Als Library sollte nun alles korrekt auftauchen:

 

(tick) Nun viel Spaß beim entwickeln!