Flight Log
Familienergänzende Kinderbetreuung Kanton Zug
Plattform für Kinderbetreuungangebote auf der Website des Kantons Zug ...mehr
Sie sind hier: Startseite Blog

Blog

News rund um Plone, Python, repoze sowie allgemeine Web-Trends

111 Posts gefunden.
Filter Posts
| |

Warum Open Source Code qualitativ besser ist

Open Source bietet eine bessere Code-Qualität und damit eine bessere Zuverlässigkeit und Performance. Die Erklärung dafür liegt auf der Mikroebene, sprich beim Programmierer.

Auch ein Heer von Businessanalysten, Software-Architekten und der Trend zu Outsourcing in Niedriglohnländer (Indien, China) ändern nichts daran, dass Software von Programmieren geschrieben wird. Wenn wir nach Gründen für die bessere Qualität von Open Source Code suchen, müssen wir uns auf die Programmierer konzentrieren:

  • Freude, Leidenschaft
    Open Source Programmierer arbeiten aus Freude und Leidenschaft an einem Projekt, sie werden nicht von ihrem Chef dazu verknurrt.
  • Handwerk
    Programmierer in der Open Source Welt verstehen sich als Handwerker und wollen eine Sache ihrer selbst willen gut machen. In einem Open Source Projekt haben sie die nötige Muse (sprich Zeit) dafür. Die Arbeitsweise des Software-Handwerkers ist durch das zeitgleiche Lösen und Finden von neuen Problemen gekennzeichnet. Er ist kein Akkord-Maurer, der - ohne grosse gedankliche Eigenleistung - die vom Architekten geplante Mauer in möglichst kurzer Zeit hochzieht.
  • Peer Review
    Das Argument ist hinlänglich diskutiert: Da der Quellcode offen liegt werden Fehler viel schneller erkannt.
  • Erfahrung: "Programmieren als Jugendsünde"
    Leider scheint es so, dass Programmieren der Jugend vorbehalten ist. Programmierer mit grauen Schläfen sind teurer als ihre jüngeren Kollegen. Da Arbeitgeber offenbar nicht bereit sind, Erfahrung im Programmieren mit einem höheren Lohn zu würdigen,  wechseln Programmierer nach ein paar Jahren in einen Management-Job. Die NZZ schreibt dazu: "Dass ein Programmierer bei der Lösung von grösseren Problemen in der Regel keine zweite Chance erhält, vermag vielleicht zu erklären, warum sich aus der Sicht des Anwenders Software oftmals unfertig, unausgereift, unstabil anfühlt, pubertär."
    Seinem Open Source Projekt bleibt man jahrelang verbunden.
  • Code steht im Zentrum
    Bei Open Source steht der Code im Zentrum, man konzentriert sich auf guten Code. Elegante Lösungen eines Problems werden in der Community entsprechend gewürdigt.
  • Kein Outsourcing
    Würde ein Open Source Projekt je auf die Idee kommen seine Kern-Aktivität, also das Programmieren, auszulagern?

Dies führt dazu, dass der Einsatz von Open Source in Unternehmen nicht mehr in erster Linie aus Kostengründen sondern aufgrund besserer Qualität geschieht.

http://www.silicon.de/cio/strategie/0,39038989,41536153,00/qualitaet_hauptargument_fuer_open_source.htm

05.09.2010 15:45

Die Leiden des jungen Unternehmers

Posted by Fabian Reinhard | | Karegorie

Gedanken zum Unternehmertum aus der Software-Manufaktur von seantis

Wann gründe ich ein Unternehmen?

Gleich vorweg: Dies ist keine Gebrauchanweisung zum Unternehmertum. Davon gibt es schon zu viele und wohl keine davon ist brauchbar, weil sie dem Umstand, dass das Glück der am meisten unterschätze Erfolgsfaktor ist, nicht Rechnung tragen. Dinge entwickeln sich nie so, wie man es sich vorgestellt hat.

Der beste Zeitpunkt ein Unternehmen zu gründen? Während des Studiums! Als Student ist man jung, hat noch keine echten Verpflichtungen und - wenn man sich das Studium entsprechend einrichten kann - sogar etwas Zeit. Zudem ist man noch naiv genug es zu wagen. Während des Studiums bietet die eigene Firma einen guten Nebenjob; der Punkt der Entscheidung kommt mit dem Studienabschluss. Die Opportunitätskosten werden nun entscheidend höher und es gilt, den relativ hohen Einstiegslöhnen für Uniabsolventen zu widerstehen. Wenn man sein Unternehmen bereits während des Studiums gegründet hat, sollte man zu diesem Zeitpunkt bereits eine gewisse Kundenbasis haben und das Wasser, in das man nach dem Studienabschluss springt, sollte nicht mehr ganz so kalt sein. Einen impliziten Lohnverzicht bedeutet es aber auch so noch.

Wie starte ich?

Entscheidend ist, seinen Kunden eine Dienstleistung mit Mehrwert anbieten zu können. Die Art von Lösungen, welche wir unseren Kunden bieten, sind nur möglich, weil wir in eine globale Open-Source-Community - mit hunderten von Programmieren rund um den Globus - eingebettet sind. So standen uns von Anfang an mächtige Werkzeuge ohne grosse Startinvestitionen zur Verfügung. Das einzige Kapital, das wir in die Firma einzubringen hatten, ist unser Know-how.

Warum soll ich es wagen?

Unsere Motivation ist die unternehmerische Freiheit. Sie zwingt zu eigenständigen Entscheidungen und dazu, die Konsequenzen des eigenen Handelns voll zu tragen. Es geht uns jedoch nicht nur darum frei zu entscheiden, was wir tun, sondern genauso darum, wie wir es tun. Obwohl wir kein physisches Produkt, sondern ausschliesslich Software “produzieren”, verstehen wir uns als Handwerker. Die Arbeitsweise des Software-Handwerkers ist durch das zeitgleiche Lösen und Finden von neuen Problemen gekennzeichnet. Dem Open-Source-Programmierer steht der Angehöriges eines anderen modernen Stamms entgegen: jener Bürokrat, der nichts tun möchte, bevor nicht alle Ziele, Verfahren und politisch gewünschten Ergebnisse festgelegt sind. Für uns als Software-Handwerker sind das freie Experimentieren und die damit verbundenen Gestaltungsmöglichkeiten zentral. Dies schenkt einem unmittelbar eine emotionale Belohnung für den Erwerb von Fähigkeiten und man ist stolz auf seine eigenes Werk.

Die Idee dahinter ist einfach, kommt aber in der modernen Arbeitswelt zu kurz. Was man tut, soll man mit Hingabe tun. Man macht eine Sache ihrer selbst willen gut!

Lohnt sich das Ganze?

Finanziell wohl nur sehr beschränkt; fast niemand wird mit der eigenen Firma reich. Das Ziel kann daher kein Monetäres sein. Es geht uns vielmehr darum, das zu tun, woran wir glauben, es geht darum, nach unseren eigenen Vorstellungen arbeiten zu können. Wir sehen, was wir tun, und wir erhalten ein direktes Feedback: Software, die funktioniert, oder ein erfolgreich akquiriertes neues Projekt. Wir haben uns bisher keine Minute gelangweilt.
So aber schafft diese Leidenschaft auch ein grosses Mass an Leiden; so bleibt Work-Life-Balance für uns ein Fremdwort; so gehört Scheitern auch dazu, nicht nur einmal, sondern immer und immer wieder. Aber nur wer scheitern kann, kann wirklich gewinnen.

Die Freiheit bleibt immer ein Wagnis, niemand sagt, es sei einfach: der Versuch aber lohnt sich immer wieder!

01.09.2010 10:15

Die Apps sind tot, es leben die Apps!

Nach dem Hype um all die Apps - gerade auch im Zusammenhang mit dem iPad - wird es Zeit mal grundsätzlich über Apps nachzudenken.

Die Apps sind tot, es leben die Apps!

An open marketplace for web apps

Apps sind toll und jeder hat eine Menge davon auf seinem Handy. Doch Apps sind böse, denn sie zerstören das Internet. Das Internet mit offenen Standards (HTML, CSS, JavaScript) ist eine echte Errungenschaft die hart erkämpft werden musste. Für Besucher ist es möglich eine Website mit allen möglichen Endgeräten anzuschauen. Die Seite muss dazu nur einmal in HTML geschrieben werden. Natürlich war auch dies lange Zeit die Idealvorstellung, weil gewisse Browser (Internet Explorer) sich nicht an die Standards hielten. Dies war weniger auf Unvermögen zurückzuführen als vielmehr auf strategische Überlegungen. Microsoft wehrte sich gegen das offene Internet und erhoffte sich durch den Einbau von proprietären Elementen seine Marktmacht zu sichern.

Mit der neusten Generation von Browsern wären wir endlich soweit, dass die Web-Standards von allen Browsern vernünftig unterstützt werden. Gerade jetzt kommen die Apps! Apps sind das pure Gegenteil von offenen Standards: ich kann meine App nur auf dem iPhone, dem Android Phone oder dem Blackberry verwenden. Wer eine iPhone-App baut, baut für das iPhone. Wer eine Android-App baut, baut für Android.

Glücklicherweise gäbe es jedoch einen Weg zurück zu echten Web-Standards: mit HTML5 und CSS3 stehen eine Vielzahl von Funktionen wie local storage zur Verfügung, die bisher Apps vorenthalten haben. Wer eine HTML5-App baut, baut für alle Systeme mit Browsern, die HTML5 unterstützen oder unterstützen werden.

Das in letzter Zeit viel gescholtene Google könnte ein Vorreiter auf dem Weg zurück zu einem offenen Web sein.  Mit seinem geplanten chrome webstore will google installierbare Web-Anwendungen, die direkt über den Browser aufgerufen werden, gegenüber den geschlossenen Apps besser in Position bringen. Denn Googles Erfolg baut auf dem offenen Internet und seit iAds ist klar, dass es für Google gefährlich wird, wenn Apple die Welt weiterhin mit Apps überschwemmt.

Wir alle wollen ein offenes Internet. Apps sind tot, es leben die HTML5-Apps!

http://www.w3.org/TR/offline-webapps/

19.06.2010 17:55

repoze.bfg Language Negotiator

Posted by Fabian Reinhard | | Karegorie

Since version 1.3 repoze.bfg offers internationalization and localization. For one of our projects (Flight Log) we have written a custom locale negotiator showing the page in the language defined in the users browser settings.

The way how to internationalize your application is fully documented in the amazing repoze.bfg documentation: http://docs.repoze.org/bfg/1.3/narr/i18n.html

Let's have a look at the test first:

from unittest import TestCase

from webob.acceptparse import Accept

from repoze.bfg.interfaces import ISettings
from repoze.bfg.threadlocal import get_current_registry
from repoze.bfg.testing import DummyRequest

class TestLocaleNegotiator(TestCase):

def test_get_preferred_languages(self):
from flightlog.locale_negotiator import get_preferred_languages

# No header
request = DummyRequest()
langs = get_preferred_languages(request)
self.assertEquals([], langs)

# Empty header
request = DummyRequest()
setattr(request, 'accept_language', Accept('Accept-Language', ''))
langs = get_preferred_languages(request)
self.assertEquals([], langs)

request = DummyRequest()
setattr(request, 'accept_language', Accept('Accept-Language', 'de'))
langs = get_preferred_languages(request)
self.assertEquals(['de'], langs)

def test_locale_negotiator(self):
from flightlog.locale_negotiator import locale_negotiator

registry = get_current_registry()
settings = {'available_languages' : 'en de', 'default_locale_name' : 'de'}
registry.registerUtility(settings, ISettings)

# No header
request = DummyRequest()
lang = locale_negotiator(request)
self.assertEquals('de', lang)

# Single accepted language
request = DummyRequest()
setattr(request, 'accept_language', Accept('Accept-Language', 'en'))
lang = locale_negotiator(request)
self.assertEquals('en', lang)

# List of languages
request = DummyRequest()
setattr(request, 'accept_language', Accept('Accept-Language', 'de, en'))
lang = locale_negotiator(request)
self.assertEquals('de', lang)

# Qualities
request = DummyRequest()
setattr(request, 'accept_language', Accept('Accept-Language', 'da, en-gb;q=0.8, en;q=0.7'))
lang = locale_negotiator(request)
self.assertEquals('en', lang)

# Malformed quality
request = DummyRequest()
setattr(request, 'accept_language', Accept('Accept-Language', 'da, en-gb;q=0.8.0, en;q=0.7'))
lang = locale_negotiator(request)
self.assertEquals('en', lang)

Next the language negotiator (this code has mostly been copied from zope.i18n):
from repoze.bfg.settings import get_settings

def get_preferred_languages(request):

# Not availabe in DummyRequest during testing
if not hasattr(request, 'accept_language') or not hasattr(request.accept_language, 'header_value'):
return []

accept_langs = request.accept_language.header_value.split(',')

# Normalize lang strings
accept_langs = [normalize_lang(l) for l in accept_langs]
# Then filter out empty ones
accept_langs = [l for l in accept_langs if l]

accepts = []
for index, lang in enumerate(accept_langs):
l = lang.split(';', 2)

# If not supplied, quality defaults to 1...
quality = 1.0

if len(l) == 2:
q = l[1]
if q.startswith('q='):
q = q.split('=', 2)[1]
try:
quality = float(q)
except ValueError:
# malformed quality value, skip it.
continue

if quality == 1.0:
# ... but we use 1.9 - 0.001 * position to
# keep the ordering between all items with
# 1.0 quality, which may include items with no quality
# defined, and items with quality defined as 1.
quality = 1.9 - (0.001 * index)

accepts.append((quality, l[0]))

# Filter langs with q=0, which means
# unwanted lang according to the spec
# See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
accepts = [acc for acc in accepts if acc[0]]

accepts.sort()
accepts.reverse()

return [lang for quality, lang in accepts]

def normalize_lang(lang):
lang = lang.strip().lower()
lang = lang.replace('_', '-')
lang = lang.replace(' ', '')
return lang

def normalize_langs(langs):
# Make a mapping from normalized->original so we keep can match
# the normalized lang and return the original string.
n_langs = {}
for l in langs:
n_langs[normalize_lang(l)] = l
return n_langs

def locale_negotiator(request):

settings = get_settings()
available_languages = settings.get('available_languages', '').split()
preferred_languages = get_preferred_languages(request)

available_languages = normalize_langs(available_languages)
for lang in preferred_languages:
if lang in available_languages:
return available_languages.get(lang)
# If the user asked for a specific variation, but we don't
# have it available we may serve the most generic one,
# according to the spec (eg: user asks for ('en-us',
# 'de'), but we don't have 'en-us', then 'en' is preferred
# to 'de').
parts = lang.split('-')
if len(parts) > 1 and parts[0] in available_languages:
return available_languages.get(parts[0])

return settings.get('default_locale_name', 'en')

Finally have to include it via ZCML in configure.zcml.

<configure xmlns="http://namespaces.repoze.org/bfg">

<!-- this must be included for the view declarations to work -->
<include package="repoze.bfg.includes" />

<localenegotiator negotiator=".locale_negotiator.locale_negotiator" />

<translationdir dir="flightlog:locale/" />

</configure>
22.05.2010 00:00

Game over für unnötige Verbote

Posted by Fabian Reinhard | | Karegorie

Verbot von Killerspielen – eine liberale Replik

Sie vergiften die Gedanken und korrumpieren die Moral der Jugend, welche ihre Zeit damit vergeudet in gefährliche Fantasiewelten abzutauchen. So äussersten sich im 18. Jahrhundert die Kritiker der neu aufkommenden Gattung der Romane und zeigten sich äussert besorgt wegen des Einflusses des neuen Mediums auf die junge Generation. An die jungendgefährdende Wirkung von Romanen glaubt heute niemand mehr.

Dennoch hat der Luzerner Kantonsrat die Regierung mit einer Motion beauftragt, eine Standesinitiative auszuarbeiten, welche sogenannte Killergames verbieten soll.

Bekannter Abwehrreflex gegen neue Unterhaltungsformen

Die Kritik an Games passt in ein bekanntes Muster im Umgang mit neuen Formen der Unterhaltung. Im 18. Jahrhundert waren es die Romane, anfangs des 20. Jahrhunderts Filme, in den 50-er Jahren die Rock’n’Roll-Musik, in den 60-er Jahren die Hippie-Subkultur; die Liste lässt sich beliebig fortsetzen . Immer war es die junge Generation, die sich ins lockende Vergnügen stürzte, während die Generation der Eltern, die ihnen unbekannte angsteinflössende Unterhaltung zu verbannen suchte.

Mit dem Erwachsenwerden der jungen Generation fand das neue Medium jeweils Akzeptanz und – um den Generationen-Zyklus in Gang zu halten – wurde eine neue aufkommende Form der Unterhaltung als gefährlich gebrandmarkt.

Praktische Einwände gegen ein Verbot

Die praktischen Einwände gegen Verbote solcher Art sind bekannt. Verbote lassen sich nicht durchsetzen, weil die Inhalte aus dem Internet heruntergeladen werden können. Da die Definition, was ein Killergame ausmacht, strittig bleibt, kommt es zu einer erheblichen Abgrenzungsproblematik und als Folge zu einem Katz-und-Maus-Spiel zwischen den behördlichen Sittenwächtern und den Spielproduzenten.

Zurück zu einer einfachen liberalen Grundhaltung

Viel schwerer wiegt jedoch der Eingriff in die Freiheit des Einzelnen. Die Motion fordert ein generelles Verbot  solcher Spiele, also explizit auch für Erwachsene. Es ist nicht zulässig, dass unter dem Denkmantel des Jugendschutzes mündigen Bürgern sozial erwünschtes Verhalten aufgezwungen wird. Wenn die erwachsene Gamerin in den eigenen vier Wänden nicht mehr ihrem Vergnügen nachgehen darf, dann ist dies ein – aus liberaler Sicht nur schwer zu rechtfertigender - Eingriff in die Freiheit des Einzelnen.

Computerspiele gehören in das Reich der Fiktion. In der Realität haben die FDP.Die Liberalen in Luzern mit dem Referendum gegen das Gesellschaftsgesetz erfolgreich gezeigt, an welchem einfachen Massstab sich gelebter Liberalismus misst: „Wenn es nicht unbedingt notwendig ist, ein Gesetz zu erlassen, ist es unbedingt notwendig, ein Gesetz nicht zu erlassen. “ (Montesquieu)

04.05.2010 00:00

SuisseID: Huhn und Ei

Mit der zunehmenden Verbreitung von Online-Applikationen wird ein elektronischer Identitätsnachweis und damit verbunden eine rechtsgültige elektronische Signatur sowie ein sicheres Login immer wichtiger.

Ab Montag kann die SuisseID bei Quo Vadis (https://suisseid-shop.ch) oder SwissSign (http://swisssign.com) bestellt werden.

Um den viel zitierten "Huhn-Ei-Effekt" (Endkunden kaufen keine elektronischen IDs, weil es keine Anwendungen dafür gibt und Anbieter programmieren keine Anwendungen dafür, weil die Kunden die ID nicht haben) zu überwinden werden im Rahmen des Konjunkturprogramms nun einerseits Pilotprojekte gefördert und andererseits Endkunden mit einem Cashback ein Teil der Kosten zurückerstattet.

seantis entwickelt zur Zeit zusammen mit AVIONIS GmbH eine Anbindung der SuisseID an das Online-Flugbuch Flight Log.
01.05.2010 00:00

PDF View in Plone with z3c.rml

Posted by Fabian Reinhard | | Karegorie

Use z3c.rml to add a PDF view in Plone: http://pypi.python.org/pypi/z3c.rml

First you add the z3c.rml package to the eggs section in your buildout.cfg:

# Add additional eggs here
# elementtree is required by Plone
eggs =
    z3c.rml

Next you write a new view class for the PDF view. A nifty way is to subclass the view class already in use for the (standard html) view

from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
from z3c.rml.rml2pdf import parseString

class NiceViewPDF(NiceView):
   
def __call__(self):
self.request.response.setHeader('content-type', 'application/pdf')
rml_doc = ViewPageTemplateFile('templates/nice_view_pdf.pt')(self)
return parseString(rml_doc.encode('utf-8')).read()

The last thing you need is a 'nice_view_pdf.pt' template file.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE document SYSTEM "http://www.reportlab.com/docs/rml.dtd">
<document filename="template.pdf"
xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
i18n:domain="mydomain">

<template pageSize="A4" author="www.seantis.ch" title="Title">
<pageTemplate id="main">
<frame id="first" x1="72" y1="70" width="451" height="600"/>
</pageTemplate>
</template>

<story>

<h1 tal:content="python: context.Title()">Title</h1>

</story>

</document>

(example from: http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/input/)

"RML Reference": http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/rml-reference.pdf?view=auto

12.03.2010 00:00

Google mit Selbstzensur im chinesischen Markt

Posted by Fabian Reinhard | | Karegorie

Mit einer massiven Selbstzensur will sich Google den chinesischen Internetmarkt erschliessen. So werden beispielsweise Suchergebnisse zu den Themen "Tiananmen" oder "Tibet" in in der chinesischen Google-Version nicht angezeigt. So gibt google.cn (nur innerhalb Chinas erreichbar) mehr oder weniger die Meinung der chinesischen Regierung wieder. Ob sich diese Selbstzensur für Google wirtschaftlich auszahlt ist mehr als fraglich. Das Image als unabhängigie Datenquelle in der westlichen Welt leidet jedoch sicher massiv unter einer solchen Massnahme.

http://www.giga.de/index.php?storyid=130720

http://derstandard.at/?url=/?id=2345350

18.02.2010 00:00

Image upload panel

We just released a project including a nice image upload panel. The approach allows to upload images in a very convenient way.

image_preview_panel

 

  • upload images in jpg, png or gif format
  • file size limit
  • resize the image
  • ajax upload: page is not reloaded
  • change oder of images by drag and drop
  • delete uploaded images
  • works in all browsers

 

Technical background

27.01.2010 00:00

Bundesamt warnt vor Benutzung von Internet Explorer

Posted by Fabian Reinhard | | Karegorie

Offenbar schätzen nun verschiedene Behörden die Sicherheitslücken beim Internet Explorer als gravierdend ein. Das Bundesamt für Sicherheit in der Informationstechnik warnt vor der Benutzung des Microsoft-Browsers.

Die Experten raten, bis zur Behebung des Problems alternative Browser zu nutzen.

Bundesamt für Sicherheit in der Informationstechnik
15.01.2010 00:00
abgelegt unter: