Archive for the ‘Allgemein’ Category

4. Januar 2017

by

In: Allgemein, Tech

No comments

One of the core principles of modern Object-oriented programming (OOP) says „Once and Only Once“. Having several places in a system where the same or similar code performs the same or similar tasks is usually bad. It makes code longer than necessary, it allows bugs to remain in one place that have already been solved in another and it increases cost of optimization, feature development, adjusting code to new versions of frameworks and dependencies.

But what’s worse, it is a lazy, half-hearted approach to programming. We can do better. Imagine a cook book of 200 pages which explains making fresh pasta. 200 Pages, the ultimate book, containing everything you ever wanted to know about pasta, right? Wrong. The first twenty pages describe making dough. Then we have a page on how to form the first noodle out of the dough. Then we have a page on how to form the second noodle out of the dough. Several pages later, we have a chapter which goes into explaining short thick noodles. It begins with twenty pages on making dough. Then we have a page on how to form the first short thick noodle, the second short thick noodle. The next chapter is about long thin noodles. It begins with 20 pages on making dough…

You wouldn’t buy that, right? Why should a customer accept such a product?

Good software is created by refactoring. First, you want to write the first thing that works. You might even copy-paste and adapt from something similar you wrote somewhere else.
Or somebody else, respecting license and naming the original author. You finish the day, a few hours late and glad you arrived at a point where your program somehow, for some reason, does the right thing, at least in your defined test case. You want to go to sleep.

But if you don’t get back at that code, look into this, reorganize the parts, remove things you don’t need or already have somewhere else, you get software like this pasta book.

Recently, I was working on a component which implements multiple types of fields to hold and display data. Among those fields were an enumeration (choose one out of several predefined options), a relation (choose one out of a list of things stored somewhere else), a multienum (choose none, one or many out of several predefined options) and a multirelation (You can imagine, right?). They were somehow related, that’s obvious. It took a little time to figure out which way the code needed to be structured to reduce the amount of duplication in the different classes. I ended up with the following:

  • A single-select enumeration is a special case of a multi-select enumeration, as the latter can do all the first needs to do – it must only be restricted.

Now for purely technical reasons an important question was if the different types of relation were more similar to each other than they were to single and multiple enumeration respectively. It turned our they were. So the complete set of inheritance was like this:

  • A single-select enumeration is a special case of a multi-select enumeration, as the latter can do all the first needs to do – it must only be restricted.
  • A multi-select relation is a special case of a multi-select enumeration.
  • A single-select relation is a special case of a multi-select relation, as the latter can do all the first needs to do – it must only be restricted.

The „it must only be restricted“ part was still annoying duplication but I needed to move on and implement other field types. A little bit later I decided once and for all that all those validations should be reusable parts which should be independent from the fields. Don’t repeat the same validation for similar fields but let the fields each use the validation items like „mandatory“ (choose at least one value), „singleOption“ (Don’t allow multiple options), „existingValue“ (value must be from option list). In the old Form class I wanted to replace, all was organized a little different.

It also coupled the presentation to the field type. I did not do this. I separated presentation type from field type just like I separated validation from storage.

The reason is simple. A list of radio buttons represents a single-choice enumeration just like a dropdown box or a clickable selection list. The data type cannot know which presentation fits best. For yes/no questions, even a checkbox might be an option. Or a multiselect could be served by a list of options with checkboxes. But if we have really huge lists of hundreds or ten thousands of elements, a searchable box with auto completion might be the best presentation. Maybe combined with a short selection of recently used or frequently used items. How could a data type know that? On the other hand, different presentations might mean the same thing and should not be different data types.

Most expert find it important to strictly separate the process of feature development from the process of refactoring existing code. Otherwise you can end up in a complete mess. Or never finish. In different software projects, I have seen both. Some people have a talent to limit themselves, to make minor improvements on the fly while moving around bits and pieces. I think this is fine, you just need to know when to stop messing around and get one thing done and leave the other for later.

Before I published this article, I already had it written for some time. I decided to move some things around, to amend some parts, to delete what was said twice. At some point it was important to stop fiddling around. I thought „stop messing around, get the pasta done and leave the text for later“. Life is not so different from programming, after all.

16. Dezember 2015

by

In: Allgemein

Kommentare deaktiviert für Boneyard – a barebone horde „dynamic view“ app based on „skeleton“.

Boneyard – a barebone horde „dynamic view“ app based on „skeleton“.

In this article, I will show you some minimal setup for a „horde5 dynamic view“ application as demonstrated by hermes time tracking and kronolith calendar

Pre-requisite
We have a working git checkout of a 5.2 or master installation of horde with some authentication and prefs backend working and the migrations inplace.
If your setup did not involve editing install_dev.conf, you probably have something else and I cannot guarantee this walkthrough will work for you without adopting some parts.

Let’s generate a fresh application called boneyard

maintaina:/srv/git/horde5-webmail/horde # php framework/bin/horde-generate-module boneyard "Ralf Lang "
Started new Module in /srv/git/horde5-webmail/horde/boneyard!
Register the new Module with a file in the config/registry.d directory:

$this->applications['boneyard'] = array('name' => _("Boneyard"));

We put a file with this oneliner into the directory as advised

maintaina:/srv/git/horde5-webmail/horde # vim horde/config/registry.d/boneyard.php

Now let’s re-run the script generating the links for the git checkout installation

maintaina:/srv/git/horde5-webmail/horde # php framework/bin/install_dev
EMPTYING old web directory /srv/www/vhosts.d/horde.ralf-lang.de

LINKING horde
Setting static directory permissions...
LINKING applications to web directory /srv/www/vhosts.d/horde.ralf-lang.de
LINKING sam
LINKING luxor
[.. snip ..]
LINKING pastie
LINKING ingo
LINKING boneyard
LINKING hvview
LINKING sesha
LINKING passwd
LINKING operator
LINKING nag
LINKING gollem
LINKING jonah
LINKING sueporter
LINKING ulaform

LINKING framework
[ INFO ] Source directory: /srv/git/horde5-webmail/horde/framework
[ INFO ] Framework destination directory:
/srv/www/vhosts.d/horde.ralf-lang.de/libs
[ INFO ] Horde directory: /srv/www/vhosts.d/horde.ralf-lang.de
[ INFO ] Create symbolic links: Yes

[ INFO ] Package(s) to install: ALL (129 packages)
[ INFO ] Installing package ActiveSync
[.. snip ..]
[ INFO ] Installing package xxhash

Now boneyard is set up in your web-accessible dir.
Let’s make the config dir web-writeable

chown wwwrun:www /srv/www/vhosts.d/horde.ralf-lang.de/boneyard/config

This is for SUSE – debian or redhat may have different user/group for the web server.

Next go to $yourdomain/admin/config/ the admin panel and generate the conf.php file by clicking on the „boneyard“ entry and then the „create boneyard config“ button.
At this point, we do not care about the actual contents of this config – the defaults are just fine.

If you only see „horde“ and some library names, you most probably have not edited registry.local.php to contain something like:


// By default, applications are assumed to live within the base Horde
// directory (e.g. their fileroot/webroot will be automatically determined
// by appending the application name to Horde's 'fileroot'/'webroot' setting.
// If your applications live in a different base directory, defining these
// variables will change the default directory without the need to change
// every application's 'fileroot'/'webroot' settings.
$app_fileroot = '/srv/www/vhosts.d/horde.ralf-lang.de/';

Now „Boneyard“ should appear in your horde topbar with some bogus buttons and content

Let’s create the structure of a „dynamic“ application

* lib/Ajax.php – The Boneyard Ajax base class to load locale- and setting-dependent content into the browser’s javascript
* lib/Ajax/Application/Handler/Example.php – A handler for Ajax requests to load data from the server — we skip that for now
* lib/View/Sidebar.php – Boneyard_View_Sidebar – a sidebar for the dynamic view
* template/dynamic/sidebar.html.php – The template used by the sidebar view
* template/dynamic/index.inc – The main template of the dynamic view
* template/dynamic/example1.inc – One of our two example views in this demo
* template/dynamic/example2.inc – One of our two example views in this demo
* js/boneyard.js – The BoneyardCore object which contains the main click handler etc

We also need to touch the index.php file to enable the dynamic view and the lib/Application.php file to advertise that dynamic view exists.

See https://github.com/ralflang/horde-boneyard to view the code in detail.

31. Dezember 2014

by

In: Allgemein

Kommentare deaktiviert für Thimbleweed Park angekündigt

Ron Gilbert, der Mann, der uns Maniac Mansion, Monkey Island (1+2) und Total Annihilation brachte, hat zusammen mit Gary Winnick die Entwicklung eines klassischen Point&Click-Adventures begonnen. Thimbleweed Park wird für PC, Android und iOS erscheinen und (optionale) Sprachausgabe sowie Übersetzung von Boris Schneider-Johne, der schon Monkey Island übersetzte. Mitte Juni 2016 soll das Spiel im Handel erscheinen, so der erste Zeitplan. Ich bin gespannt.

Vorbestellungen sind zu 25 US-$ möglich über Amazon und Paypal.

http://blog.thimbleweedpark.com/

23. Juli 2014

by

In: Allgemein, OpenSUSE, Tech

3 comments

For more than 10 years, PHP core developers repeatedly raised the topic of providing a formal language specification for PHP. Now a team of facebook employees has written such a specification. The spec document is currently only available as a preview chapter a preview chapter . PHP veteran Sara Golemon announced on the „PHP internals“ list that the full document will be ready for O’Reilly’s OSCON 2014. Sara Golemon published the standard book on „Extending and Embedding PHP“ some years ago and now works for Facebook’s own PHP implementation HHVM. The PHP spec defines PHP version 5.6 in about 200 pages and contains all the odd and obscure quirks of the language core. Facebook’s own HHVM aims to be as close to the spec as possible. Currently, PHP developers discuss how amending the spec can become a mandatory part of the language development process. Though some are sceptic that all developers will embrace the change in the process, everybody on the list was happy to have the new document.

Software Architect Stas Malyshev:

Thank you Sara and Facebook team for doing something we’ve been talking
about for more than a decade and before that nobody actually attempting
to do. I think it is a great development and I hope to see the first
version soon.

http://dl.hhvm.com/resources/PHPSpec-SneakPeak.pdf

26. September 2013

by

In: Allgemein, Non-Tech and German

Kommentare deaktiviert für Die Wahlfälscher-Angst: Warum die Sorgen der AfD unbegründet sind

Am 22. September 2013 wählten die Deutschen den neuen Bundestag mit sensationellem Ergebnis: Erstmals in ihrer Geschichte ist die FDP nicht im deutschen Parlament vertreten und scheiterte knapp mit 4,8% der Stimmen.

Ihr schärfster Konkurrent, die im Frühjahr gegründete Anti-Euro-Partei „Alternative für Deutschland“ (AfD) kam knapp hinter ihr auf 4,7%. Beide sind damit nicht im Parlament vertreten. AfD-Anhänger witterten unmittelbar Wahlbetrug. Aus Sicht der Mitglieder ist das nachvollziehbar: Hatte doch Parteichef Lucke erklärt, die Umfragen seien manipuliert und man stehe bei 8-9% – Eine Aussage, für die er eine Verfügung vom Gericht bekam, sie nicht zu wiederholen. Hatte doch der von der AfD häufig zitierte Internet-Dienst Wahl-Radar 2013 in seiner Meta-Prognose vom 19. September die AfD noch auf 7,3% taxiert. Kritikern fiel schnell auf, dass der Unternehmer hinter diesem Prognosedienst selber AfD-Aktivist war.

Es ist nicht verwunderlich, dass auf der Facebook-Seite von AfD schnell einige User von angeblichen Ungereimtheiten im Wahllokal raunten. So knapp gescheitert, da kommen schnell komische Ideen zustande.

In dieser Situation ist es wichtig, einen kühlen Kopf zu bewahren und das Vertrauen in unsere Demokratie nicht zu beschädigen. Selbst der AfD-Führung ist es mittlerweile peinlich, mit welcher Verve enttäuschte Anhänger unseren Institutionen flächendeckenden Betrug vorwerfen. Daher fordert er die Fans bei Facebook auf:

Der Bundesvorstand hat mögliche Probleme bei der Auszählung der Stimmen zur Kenntnis genommen und wird den Vorwürfen natürlich nachgehen.

und die nötigen Schritte einleiten.

Bis zu diesem Zeitpunkt möchten wir Sie bitten, von Aussagen Abstand zu nehmen, die in der Presse falsch aufgefasst werden könnten

Um deutlicher zu machen, warum viele im Internet und in Leserbriefen kursierende Betrugsszenarien übertriebene Ängste sind, habe ich einige typische Behauptungen herausgesucht und kommentiert.

„Im Wahllokal wurden Stimmzettel radiert“
In den meisten Wahllokalen liegen Kugelschreiber aus. Nur in wenigen Wahllokalen werden Bleistifte verwendet. Jeder Stift ist legal, mit dem deutlich erkennbare Markierungen gemacht werden können. Der Wähler trägt seinen Stimmzettel zur Wahlurne und wirft den Zettel selbst ein. Die Urne ist mit einem Schloß gesichert und mit einem Siegel versehen, das erst nach 18 Uhr im Beisein aller Wahlhelfer und Wahlbeobachter geöffnet und dabei zerstört wird. Zu keinem Zeitpunkt könnte irgendwer außer dem Wähler selbst Radierungen vornehmen.

„Die Wahlhelfer lassen Stimmzettel verschwinden“
Jeder Wähler wird im Wählerverzeichnis markiert, wenn er seinen Stimmzettel einwirft. Die Urne ist mit einem Schloß gesichert und mit einem Siegel versehen, das erst nach 18 Uhr im Beisein aller Wahlhelfer und Wahlbeobachter geöffnet und dabei zerstört wird. Verschwundene Stimmzettel würden auffallen, weil die Zahl der Markierungen im Protokoll nicht zur Zahl der Wahlzettel passen würde.
Vor Beginn der Auszählung werden alle leeren Stimmzettel vom Tisch entfernt und in einem Karton gelagert, sodass nicht versehentlich oder absichtlich weitere Stimmzettel hinzugefügt werden können.

„Die haben meinen Ausweis nicht kontrolliert“
Der Wahlvorstand hat das Recht, aber nicht die Pflicht, den Ausweis des Wählers zur Identifizierung zu verlangen. Normalerweise übergibt der Wähler die Wahlbenachrichtigung (meist eine Postkarte) mit einer Nummer an den Wahlhelfer. Der Wahlhelfer schaut, dass derjenige im Wählerverzeichnis vorhanden ist, dass das Geschlecht stimmt und auch das Alter ungefähr zum Aussehen passt. Bei Zweifeln oder stichprobenartig verlangt er ein Ausweisdokument. Der Wahlvorstand behält die Wahlbenachrichtigung nach der Wahl ein.

„Die Wähler gehen zweimal wählen – einmal mit Ausweis, einmal mit Wahlkarte“
Wähler, die bereits gewählt haben, werden im Wählerverzeichnis markiert. Eine doppelte Stimmabgabe, einmal mit Karte und einmal mit Ausweis, ist ausgeschlossen.

„Einige Wähler machen Briefwahl und gehen dann nochmal wählen“
Briefwähler sind im Wählerverzeichnis vermerkt und können nicht regulär wählen.

„Einige Wähler klauen Wahlkarten und gehen mit diesen mehrmals wählen“.
Um es gleich vorweg zu sagen: Es handelt sich um eine Straftat, die bis zu fünf Jahren Haft bedeuten kann, wenn sie auffliegt. Praktisch wird das so aber nur sehr selten jemand wagen. Versuchen Sie es lieber nicht!

  •  Der Wahlvorstand besteht aus 7-9 Leuten, manchmal in zwei Schichten. Es sind immer mindestens drei Wahlhelfer anwesend, darunter der Wahlvorsteher oder sein Stellvertreter. Der Wahlvorstand könnte den Betrüger oder den Betrogenen persönlich oder namentlich kennen.
  • Das Geschlecht muss passen
  • Das Alter muss passen
  • Es fällt auf, wenn dieselbe Person mehrfach im Wahllokal auftaucht
  • Es fällt auf, wenn der echte Wähler zuvor schon mit Ausweis wählen gegangen ist. Hören Sie schon die Handschellen klicken?
  • Es fällt auf, wenn der echte Wähler nach Erhalt der Wahlbenachrichtigung verstorben oder verzogen ist – die Listen werden vor der Wahl und noch am Wahltag berichtigt.
  • Es fällt auf, wenn der echte Wähler Briefwahl beantragt hat. Das kann er unabhängig vom Versand der Wahlbenachrichtigung tun.
  • Es fällt auf, wenn der echte Wähler später zu wählen versucht. Dann kriegt man den Betrüger vielleicht nicht, aber man bemerkt den Betrug.

Es ist nicht bekannt, dass solche Fälle gehäuft aufgetreten sind. Die Meldung stellt sich bei näherer Betrachtung meist als Hörensagen heraus.

„Die Wahlhelfer erklären unerwünschte Stimmen für ungültig“
Damit ein Stimmzettel als ungültig gilt, muss er laut Gesetz entweder leer, gefälscht oder falsch ausgefüllt sein. Zu viele Kreuze oder irgendwelche Stichwörter und Markierungen auf dem Stimmzettel machen einen Wahlschein ungültig. Die Wahlhelfer werden vor der Wahl geschult, welche Fälle gültig und welche ungültig sind. Mindestens für den Vorsitzenden des Wahllokals und den Schriftführer ist diese Schulung verpflichtend.
Die Auszählung findet öffentlich statt, Sie können also zusehen. Eindeutig ungültige Stimmzettel (alles/nichts angekreuzt usw) werden in einem gesonderten Stapel gezählt und an den Kreiswahlleiter gegeben. Über Zweifelsfälle stimmt der Wahlvorstand gemeinsam ab, das Abstimmungsergebnis und das Urteil werden auf dem Stimmzettel notiert. Diese Streitfälle werden ebenfalls in einem besonderen Umschlag an den Kreiswahlleiter gegeben und können bei begründetem Verdacht nachgeprüft werden.

„Die Wahlhelfer haben sich verzählt“
Die Auszählung findet nach einem festgelegten Verfahren statt, die einzelnen Zählschritte werden protokolliert:

Zunächst werden die Stimmzettel durchgezählt und Abweichungen von der Zahl der Vermerke im Wählerverzeichnis überprüft.
Dann sortieren die Wahlhelfer die Stimmzettel:

  • Stimmzetteln mit Erst- und Zweitstimme auf derselben Höhe (zB Linke-Kandidat und Linke-Liste)
  •  Stimmzettel mit nur Erststimme, nur zweitstimme, Erststimme und Zweitstimme auf derselben Höhe (zB CDU-Direktkandidat, AfD-Listenstimme)
  •  Zweifelsfälle
  •  Eindeutig ungültige und nicht ausgefüllte Zettel

 

Die verschiedenen Stapel werden im weiteren Verfahren durchgezählt, auf die Details gehe ich hier nicht ein. Da alle Schritte protokolliert sind und die Stimmzettel in sortierten Stapeln abgegeben werden, können Nachzählungen und logische Konsistenzprüfungen leicht erfolgen.

Abschließend muss man sagen: Vorsätzlicher Wahlbetrug ist strafbar, aufdeckungsgefährdet und mit vertretbarem Aufwand nur in so kleinem, wirkungslosen Maß möglich, dass niemand, der bei Verstand ist, sich darauf einlässt. Fehler hingegen sind schon öfter passiert und werden weiter passieren. Das komplizierte Verfahren stellt auf vielfache Weise sicher, dass die ehrenamtlichen Wahlhelfer Irrtümer, Flüchtigkeitsfehler und dergleichen selbst entdecken können und dass unabhängige Prüfungen hinterher leicht möglich sind. Der annehmbare Restfehler, ob nun durch Irrtum oder Betrug, ist dabei so gering, dass er nicht die Sitzverteilung im Bundestag beeinflusst. Knappe Fälle und statistisch arg abweichende Wahllokale werden routinemäßig kontrolliert.

30. Juli 2013

by

In: Allgemein, Energie, Jena, Non-Tech and German

Kommentare deaktiviert für Link: Lokal-TV-Beitrag zu BürgerEnergie

Der Lokalsender JenaTV berichtet über die aktuellen Pläne der BürgerEnergie Jena eG.
Im Gespräch: Reinhard Guthke (Vorsitzender der BürgerEnergie Thüringen e.V.), Thomas Winkelmann (Vorstand der BürgerEnergie Saale-Holzland eG) und Ralf Lang (Vorstand der BürgerEnergie Jena eG).

Unter anderem will die Genossenschaft das Thema JenaWohnen stärker in den Vordergrund rücken und in einer öffentlichen Veranstaltung am 12.09.2013 den neuen Ökostrom der Stadtwerke Energie Jena-Pößneck genauer unter die Lupe nehmen. Die Partner im Holzland übernehmen einige Projekte, die ursprünglich von der BürgerEnergie Jena vorbereitet wurden.

Online nachzuschauen ist der Beitrag hier:

JenaTV: Zwischenbilanz: Die Genossenschaft BürgerEnergie Jena hat mehr als 700 Mitglieder

15. April 2013

by

In: Allgemein, Jena, Non-Tech and German

Kommentare deaktiviert für BürgerEnergie Jena und Saale-Holzland nun eng verbunden: Erste Energieprojekte

Veranstaltungsbericht von Reinhard Guthke zum 8. BürgerEnergieTreff in Jena am 11.04.2013

Herr Thomas Winkelmann, Vorstand der im Februar neu gegründeten BürgerEnergie Saale-Holzland, war zu Gast. Er und die Mitglieder der Jenaer BürgerEnergie-Genossenschaft Josefine Diekhof und Christian Weber stellten neue Projekte zu geplanten Photovoltaik-Anlagen vor, sowohl in Jena-Lobeda-West als auch im Landkreis. Mit bereits genauen Zahlen auf der Einnahmen- und Ausgabenseite wurde für beide Projekte die erwartete Wirtschaftlichkeit bei Zinserlösen von über 3% für Darlehen von Bürgern demonstriert. Darlehen von weniger als 100.000 Euro genügen, um die Projekte in der Regie der BürgerEnergie Saale-Holzland in kommenden Sommer oder Herbst zu realisieren. Frau Diekhof, studierte Betriebswirtin und jetzige Doktorandin im Bereich Innovationsökonomik an der Jenaer Uni, vertritt die Jenaer Energiegenossenschaft im Aufsichtsrat der Energiegenossenschaft des Landkreises. Ferner haben jetzt sowohl Ralf Lang, der Vorstand der Jenaer Genossenschaft, als auch die Jenaer Genossenschaft selbst, Anträge auf Mitgliedschaft in der BürgerEnergie Saale-Holzland gestellt. Damit sind beide Energiegenossenschaften strukturell eng verbunden. Das ist eine ausgezeichnete Voraussetzung für eine gute, arbeitsteilige Zusammenarbeit beider Genossenschaften. Die BürgerEnergie Jena mit derzeit über 700 Mitgliedern setzt weiterhin ihren Schwerpunkt auf die Bürgerbeteiligung an den Stadtwerken, wofür nun dank der Kooperation auch im Landkreis um neue Mitglieder geworben wird.

Die Vortragsfolien von dieser Veranstaltung können Sie hier einsehen:

http://www.buergerenergie-jena.de/wiki/img_auth.php/2/2f/2013_04_11BETreff_BE-J1.pdf

http://www.buergerenergie-jena.de/wiki/img_auth.php/1/1f/2013_04_11BETreff_BE-SH.pdf

18. Februar 2013

by

In: Allgemein, Energie

Kommentare deaktiviert für Thüringer Kommunen: EON-Aktien an Kommunalen Energiezweckverband (KET)

Die Thüringer Kommunen stimmen der Übertragung der EON-Aktien an den Kommunalen Energiezweckverband (KET) mehrheitlich zu. Sollte die Transaktion tatsächlich so über die Bühne geben, wäre ein wichtiges Ziel erreicht: Die Netze in die Hände von Körperschaften geben, die direkt den Bürgern verpflichtet sind, die von Netzausbau und Netzinstandhaltung betroffen sind.

Ganz richtig sagt Bodo Ramelow, Vorsitzender der LINKEn im Thüringer Landtag:

 “Die Energieversorgung in kommunale Hand zu nehmen, ist eine gute Investition in die Zukunft”

http://www.jenapolis.de/2013/02/mehrheit-stimmte-fuer-uebertragung-der-eon-aktien-auf-den-kommunalen-energiezweckverband-ket/

http://www.bodo-ramelow.de/nc/politik/aktuell/detail_aktuell/zurueck/bodo-ramelow/artikel/ramelow-fordert-von-landesregierung-mehr-schwung-fuer-die-energiewende/

14. Februar 2013

by

In: Allgemein, Energie, Jena, Non-Tech and German

Kommentare deaktiviert für Ich werde Vorstand der BürgerEnergie Jena e.G.

Seit 2012 bin ich Mitglied der BürgerEnergie Jena e.G., deren Vorstand ich nun geworden bin. Die Genossenschaft versucht über eine Beteiligung an der Energiesparte der Stadtwerke (zunächst 2%) und eigene Projekte Einfluss zu nehmen auf die kommenden Herausforderungen für die Jenaer: Energiewende, Marktliberalisierung und das relativ teure und knappe Wohnungsangebot in der „kleinen Großstadt“ Jena.

Die offizielle Pressemitteilung geht so:

BürgerEnergie Jena hat neuen Vorstand und 610 Mitglieder

Jena. Die BürgerEnergie Jena hat einen neuen Vorstand: Ralf Lang (29). Er ist beruflich als Informatiker in einem IT-Unternehmen tätig. Ehrenamtlich wird er künftig zusammen mit Gunther Lorenz, dem anderen Vorstandsmitglied, die Geschicke der Genossenschaft führen und gestalten. Nötig war die Neubestellung deshalb, weil Martin Berger am ab 15. Februar eine neue berufliche Aufgabe als Stadtkämmerer übernimmt und zum gleichen Tag sein Vorstandsamt bei der BürgerEnergie niederlegt.

Der Aufsichtsrat der Genossenschaft hat in einem dreistufigen Findungs- und Auswahlverfahren und nach intensiven Gesprächen mit mehreren Vorstandskandidaten den neuen Vorstand berufen. „Ich freue mich, dass mehrere sehr kompetente Jenaer Persönlichkeiten bereit waren zu diesem arbeitsintensiven und verantwortungsvollen bürgerschaftlichen Engagement“, sagt Reinhard Guthke, der Vorsitzende des Aufsichtsrates der BürgerEnergie. „Wir danken Martin Berger und seiner verständnisvollen Familie, dass er zwei Jahre lang vor allem seinen kaufmännischen Sachverstand mit wöchentlich vielen Stunden seiner Freizeit in das Demokratieexperiment der Bürgerbeteiligung an den Stadtwerken investiert hat. Wir sind froh, dass Martin Berger uns weiterhin mit Rat und Tat zur Seite steht.“ Vieles liegt in den Händen des Vorstands: Beispielsweise die Aufnahme von neuen Mitgliedern – allein im vergangenen Monat waren es 75 – und die Verwaltung ihrer Einlagen möchte korrekt und rasch abgewickelt sein. Anfang dieser Woche hat die Genossenschaft die Schwellen von 600 Mitgliedern und 5 Millionen Euro Einlagen deutlich überschritten. Im März steht die Wirtschaftsprüfung durch den Genossenschaftsverband bevor und im Juni die erstmalige Gewinnausschüttung. Ebenso wichtig ist die konzeptionelle Arbeit des Vorstandes gemeinsam mit dem Aufsichtsrat. Diese Arbeit wird nicht weniger werden. Gilt es doch den Beitrag der Genossenschaft für die dringend nötige Energiewende gemeinsam mit den Stadtwerken Energie Jena-Pößneck und den anderen Thüringer BürgerEnergie-Genossenschaften zu gestalten. Aufsichtsrat und Vorstand freuen sich darauf und hoffen weiterhin auf Interesse, Unterstützung und Mitarbeit der Jenaer Bürger und umliegender Landkreise.

29. Januar 2013

by

In: Allgemein, OpenSUSE, Tech

1 comment

In a recent discussion among php core developers, Zeev Suraski of Zend Technologies offered to open source their proprietary byte cache „Zend Optimizer+“. The main objective is to get a bytecode cache into the PHP distribution and finally into the core. There is a lot of discussion if the 5.5 release should be delayed by two months to include the open-sourced Optimizer+. Some advocate that PHP 5.5 should stick to its original release schedule and Optimizer should go into the master instead, eventually becoming PHP 5.6 : While there is strong support for getting a byte code cache into PHP Core, some are questioning why the php.net project’s native cache extensions „APC“ is not the preferred option. PHP Leader Rasmus Lerdorf says “

You also have to take into account that most sites can’t actually move
to the next release of PHP until APC is stable with it. So effectively
the PHP 5.4 release didn’t happen until APC 3.1.13 in September 2012
which was a full 6 months after PHP 5.4.0. I don’t foresee this getting
any better for PHP 5.5.

In order for PHP releases to actually mean something this is a problem
we have to fix. I honestly don’t care which opcode cache implementation
we base a core version on, what I care about is developer buy-in. Dmitry
and Stas being familiar with the code already outnumbers the number of
active core devs working on APC today.

I understand some of the skepticism and hurt feelings around this from a
few old-timers, but let’s move on and see if we can finally push out a
release with solid opcode caching right at the release date. From my
perspective anything up to a 6-month delay would beat the current situation.

The APC would then be reduced to a userspace data cache. For Optimizer+ to get into the core, some cleanup and compatibility with ZTS (Thread Safety) needs to be achieved. Traditionally, Zend products only run in PHP’s non-threadsafe mode.

29. Dezember 2012

by

In: Allgemein, horde, Tech

8 comments

Now that Horde Groupware 5 has been released as stable software, a lot of users noticed the shortcomings of the PEAR packaging systems. It does not provide an easy and smooth way to upgrade Horde 4 to the latest bugfix version anymore. If you run Horde 4 apps that have not been ported for Horde 5 yet, you need to be very cautious which pear commands you run. A simple pear upgrade -c horde would break your existing installation because it would upgrade everything to the most recent major version. This is not desirable for production systems. Distribution packaging is the solution to this. Receive only compatible upgrades until you decide to do a major upgrade.

Distribution packages of Horde 5 are available for openSUSE and SUSE Linux Enterprise Server from the isv:B1-Systems:Horde5:rolling project.

These packages include development snapshots of unreleased applications like Passwd for Horde 5. They have been modified to fit into the distribution specific standard directories, install regular jobs the distribution way etc. For example, the distribution apps don’t have separate .htaccess files but provide a ready-to-run apache2 vhost config.

Under debian however, nobody stepped up to help the main debian horde packager, Mathieu Parent, to finish the Horde 5 packages in time. This means, the next stable Debian release will probably not include Horde 5.

I have talked to Mathieu and built a patch for the Open Build Service which facilitates PEAR packaging for debian targets.

You can see the progress of debian packaging by adding the Debian repository of the project to your /etc/apt/sources.list file

cd /root/
echo "deb http://widehat.opensuse.org/repositories/isv:/B1-Systems:/Horde5:/rolling/Debian_6.0 ./" >> /etc/apt/sources.list
wget http://download.opensuse.org/repositories/isv:/B1-Systems:/Horde5:/rolling/Debian_6.0/Release.key
apt-key add Release.key
apt-get update

As of today, the repository only contains php-horde-autoloader but it I aim to fill it with all ~ 100 Horde pear packages (minus the bundles).

If you need business critical, supported Horde 4 or Horde 5 packages for openSUSE/SLES, Redhat/CentOS, Debian, Ubuntu or special architectures like ARM or Itanium, don’t wait for community action but ask for a commercial solution.

27. November 2012

by

In: Allgemein

2 comments

-------- Original-Nachricht --------
Betreff: [announce] End Of Life for Horde 3
Datum: Tue, 27 Nov 2012 13:21:17 +0100
Von: Jan Schneider 
Antwort an: core@lists.horde.org
An: announce@lists.horde.org, vendor@lists.horde.org, horde@lists.horde.org

The Horde Team is announcing the End Of Life (EOL) for the Horde 3
release series.

With the final release of Horde 5 the state of the following release
series is updated:

Horde 3: EOL
Horde 4: Security Fixes
Horde 5: Bug Fixes

Please see http://wiki.horde.org/Doc/Dev/ReleaseCycle for details
about the Horde release cycle and
http://www.horde.org/development/versions for the affected applications.

Horde 3 had been a huge milestone in Horde's history and has served us
well for 8 long years. We really hope you enjoyed it too. We know it's
still in use in many, many places, and we like to encourage everyone
to upgrade to the latest version which is such a huge improvement over
the now outdated Horde 3 line.

Thank you, Horde 3, and thank you, everyone who made it such a great
success!

26. November 2012

by

In: Allgemein, Tech

Kommentare deaktiviert für No Bullshit #1: Apache vhost config AllowOverride All does not activate mod_rewrite

This is beginner’s talk, but I have seen it too many times anyway.

A lot of tutorials on the web claim that you have to state „AllowOverride All“ in an apache config and it magically activates mod_rewrite somehow.

This is all bullshit. Your mileage may vary, you may be lucky on debianish systems. It’s not very secure anyway.

Here’s what you do instead:

(suse)

yourserver:# /etc/apache2/conf.d # a2enmod rewrite
yourserver:# /etc/apache2/conf.d # vim /etc/apache2/vhosts.d/www.somesite.com.conf

 DocumentRoot /srv/www/somesite.com/wordpress
 ServerName www.somesite.com
 ServerAdmin ralf.lang@somesite.com
 /somesite.com/wordpress>
  Options +FollowSymlinks
  RewriteEngine On
  ## put your rewriting-related .htaccess file content here, for example wordpress
  RewriteBase /
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.php [L]
  ## end put stuff here
  ## ... more vhost stuff to follow

  ## finally
  Order allow,deny
  Allow from all
 
 yourserver:# rcapache2 reload

(debian)

yourserver:~# /etc/apache2/conf.d # a2enmod rewrite
yourserver:~# vim /etc/apache2/sites-available/www.somesite.com 

        ServerAdmin webmaster@localhost
        ServerName  www.somesite.com
        DocumentRoot /var/www/somesite.com/www
        

                Options FollowSymLinks
                AllowOverride None
        
        somesite.com/>

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
                Options Indexes +FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        
     ## more debianish vhost stuff
     ## ...
     ## finally
yourserver:/etc/apache2/conf.d # a2ensite www.somesite.com
yourserver:/etc/init.d/apache2 reload

Here’s the explanation why:

AllowOverride allows a special hidden file .htaccess in any directory of your vhost to override settings from your apache vhost configs, especially security-related stuff like URL rewriting and symlink behaviour. This is fine for your hacky development setup but you do not want this in production. First, it’s slow because every lookup has to check for a .htaccess file and parse it if present. Second, it’s a hassle to debug once something screws up. Something will screw up at some point. Usually you are better off configuring your vhost properly.

Why does it work on debian?

Debian systems often have mod_rewrite enabled (loaded) but not active (working) in the default config. Allowing .htaccess files to magically activate them will work in many cases and provide a confusing problem for the rest.

Why doesn’t it work on openSUSE 12 and SLES 11??

SLES is optimized for enterprise environments where security counts. If you don’t enable overriding, it’s usually turned off. If you don’t enable mod_rewrite globally or for the site, it won’t magically be loaded later on. This leads to more tedious work but also a more predictable environment for admins under fire.

Stop confusing people. Tell them how to do it right and make them understand why it works. It will spare you trouble.

10. Mai 2012

by

In: Allgemein, horde, OpenSUSE, Tech

4 comments

Dear folks, I am very pleased to announce:
The Sesha Inventory application is ready for Horde 5 and it is in good shape. Sesha is a simple inventory keeping application which originally developed by Bo Daley and Andrew Coleman on Horde 3. The product was never officially released but it went into production at several sites. Sesha release cycle can now start together with the Horde 5 Alpha release cycle.

Sesha inventory can be configured to hold any number of stock categories with any number and type of attributes.
Like the original version, Sesha for Horde 5 can provide its stock categories as ticket queues for the horde ticketing application whups.
There are a lot of plans and ideas for upcoming versions but for this time the focus was on finishing a releasable product.There are no surprises for existing users of Horde 3 based sesha. Most work happened invisibly under the hood:

  • The Horde_Template library was exchanged by new Horde_View code
  • A migration script for database was added
  • Users can keep their original Horde 3 Sesha tables and data.
  • The sql backend driver was completely reworked into a driver based on the Horde_Rdo ORM library The new Driver Api provides enhanced search capabilities but the current frontend doesn’t make use of it. I do not plan to add any features to the classic view but start working on an Ajax view once the Horde 5 Redesign is completed. This may ship with Sesha 1.1 later on.
  • Object oriented code has replaced complicated hashes in many places

The Horde Rdo library is the new work horse inside Sesha. Rdo means Rampage Data Objects and is a lightweight ORM layer by Horde founder Chuck Hagenbuch. It maps database tables to PHP Objects. This is similar to the ActiveRecord pattern. Each database row can be turned into one Rdo item. For Sesha and another – non-public – software project, some enhancements went into the Rdo library for Horde 5:

  • Rdo now provides a caching factory or root object which speeds up creation of mapper objects
  • Methods for add, removing or checking many-to-many relations have been added
  • A number of edge case bugs have been fixed

I think the Horde 5 release cycle will start with alpha1 releases sometime in May. I know we’re a little late but it’s worth the wait.
That said, I welcome any early testing or updates of the language files. Provided everything works as expected, Sesha will be shipped with Horde 5 for OpenSUSE 12.2

18. Februar 2012

by

In: Allgemein

Kommentare deaktiviert für The Author

The author is a developer and trainer in perl and PHP with several years of professional experience in both areas. While leaning strongly towards solutions involving the horde framework he also solved problems with perl catalyst, moose, CakePHP, wordpress, facebook api, PHP Symfony and Zend Framework.

Get my GPG key for secure communication.

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)

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
=5AYj
—–END PGP PUBLIC KEY BLOCK—–