Sieben Innovationsquellen

Die 7 Quellen der Innovation helfen Ihnen, systematisch nach innovativen Ideen zu suchen. Dabei spielt es keine Rolle, ob Sie

  • ein neues Open-Source-Projekt starten wollen
  • auf der Suche nach einem interessanten Thema für Ihre nächste Diplomarbeit sind
  • auf der Suche nach einer innovativen Geschäftsidee sind oder
  • sie ein effektives soziales Projekt auf die Beine stellen wollen.

Es spielt auch keine Rolle, ob Sie auf der Suche nach einer technischen oder sozialen Innovation sind. Es geht vielmehr darum, den Bedarf, die Machbarkeit und den Zeitpunkt einer Innovation herauszufinden.

Ideen werden nicht zufällig gefunden

Um neue Ideen zu finden, werden normalerweise Kreativitätstechniken wie Brainstorming empfohlen, oder man sagt, man solle selbst ein Produkt entwickeln. Ironischerweise gibt es viele Ratschläge, die Idee oder das Geschäftsmodell zu testen – dabei ist die Ideenfindung in erster Linie etwas Zufälliges.

Dieser Ansatz ist nicht systematisch. Er ist nicht dazu geeignet, vielversprechende Ideen für Start-ups, Open-Source- oder soziale Projekte zu finden. Er basiert lediglich auf dem Prinzip: Versuche, so viele Ideen wie möglich zu generieren, vielleicht ist ja eines Tages eine brauchbare dabei.

Das Ergebnis: Es gibt viele Leute da draußen, die sagen: Ideen sind wertlos! Das Einzige, was zählt, ist die Ausführung.

Gute Ideen sind nicht wertlos

Dieser Behauptung möchte ich gerne widersprechen: Nein, gute Ideen sind nicht wertlos!

Wir brauchen gute Ideen. Und um gute Ideen zu finden, muss man wissen, wo man suchen muss.

Der Erfinder des Managements, Peter Drucker, hat 7 Quellen der Innovation entdeckt:

  1. Das Unerwartete
  2. Unvereinbarkeiten
  3. Prozess-Bedarf
  4. Veränderung des Marktes oder der Branche
  5. Demografische Entwicklung
  6. Veränderung der Wahrnehmung
  7. Wissensbasierte Innovation

Drucker wählte die Reihenfolge der Quellen nicht willkürlich:

  1. Das Risiko der Quellen nimmt zu.
  2. Innovationschancen, die in den Quellen 1 – 4 liegen, werden leichter von Insidern einer Branche entdeckt, Chancen, die in den Quellen 5 – 7 liegen, leichter von Außenstehenden.

7 And A Half Sources Of Innovation
Wenn Sie Druckers Konzept hilfreich finden, können Sie sich diese Leinwand als Spickzettel herunterladen.
CC-share alike lizenziert. Sie können es gerne herunterladen, und wenn Sie es weitergeben möchten, verlinken Sie bitte auf diesen Beitrag.

Die Quellen

Bevor wir uns mit den Quellen der Innovation beschäftigen, sollten Sie bedenken, dass sich die Quellen der Innovation nicht gegenseitig ausschließen. Elektrofahrzeuge sind das Ergebnis von neuem Wissen und veränderter Wahrnehmung.

Quelle der Innovation: Das Unerwartete

Zusammenfassung: Innovation entsteht oft durch unvorhergesehene Störungen oder unerwartete Ereignisse, die den Status quo in Frage stellen und Einzelpersonen und Organisationen dazu zwingen, sich anzupassen und zu innovieren.

Ausführliche Erläuterung: die Innovationsquelle “Das Unerwartete” unterstreicht den tiefgreifenden Gedanken, dass bahnbrechende Durchbrüche häufig auf Umstände oder Ereignisse zurückzuführen sind, die von der erwarteten Norm abweichen. Diese unvorhergesehenen Ereignisse dienen als Katalysator für neues Denken und erfinderische Lösungen. Sie veranlassen den Einzelnen, unbekannte Gebiete zu erkunden, sich schnell anzupassen und unkonventionelle Lösungen zu finden.

Zeitgenössische Beispiele:

  1. Post-it-Notizen (3M): Im Jahr 1968 entdeckte der Chemiker Spencer Silver auf der Suche nach einem robusten Klebstoff einen unerwartet schwachen Klebstoff. Diese glückliche Fügung führte schließlich zu den legendären Post-it Notes, die die Art und Weise, wie Menschen kommunizieren und Informationen austauschen, revolutionierten.
  2. Penicillin (Alexander Fleming): Im Jahr 1928 entdeckte der schottische Bakteriologe Alexander Fleming zufällig Schimmelpilzsporen mit bakterientötenden Eigenschaften, die zur Entwicklung von Penicillin führten, dem bahnbrechenden Antibiotikum, das die medizinische Landschaft veränderte.
  3. Zoom Videokonferenzen: Die weite Verbreitung von Zoom während der COVID-19-Pandemie ist ein Beispiel dafür, wie ein unvorhergesehener Umstand – in diesem Fall der Bedarf an Fernkommunikation – ein Tool zur allgemeinen Anwendung bringen kann.

Quelle der Innovation: Unvereinbarkeiten

Zusammenfassung: Innovation entsteht häufig durch das Erkennen von Diskrepanzen oder Fehlanpassungen zwischen bestehenden Umständen und gewünschten Ergebnissen.

Ausführliche Erläuterung: “Inkongruenzen” als Quelle der Innovation konzentrieren sich auf die Identifizierung und Nutzbarmachung von Unstimmigkeiten, Widersprüchen oder unerfüllten Bedürfnissen. Wenn eine wahrnehmbare Inkongruenz zwischen der vorherrschenden Situation und dem angestrebten Zustand besteht, dient sie als starker Anstoß für Innovation. Die Überbrückung dieser Inkongruenzen führt zu erfinderischen Lösungen, die Ungleichheiten harmonisieren.

Zeitgenössische Beispiele:

  1. Die Elektrofahrzeuge von Tesla: Der innovative Ansatz von Tesla hat die Inkongruenz zwischen Umweltbelangen und traditionellen benzinbetriebenen Fahrzeugen durch das Angebot leistungsstarker elektrischer Alternativen überwunden und damit die Automobilindustrie revolutioniert.
  2. Airbnb: Airbnb erkannte die Diskrepanz zwischen ungenutztem Wohnraum und dem Bedarf von Reisenden an Unterkünften und führte eine Plattform ein, die diese Lücke effektiv überbrückte und das herkömmliche Gastgewerbe auf den Kopf stellte.
  3. Smartphones: Die Vereinheitlichung von Kommunikation, Fotografie, Computer und Unterhaltung in einem einzigen Gerät ist ein Beispiel für die Verschmelzung mehrerer Inkongruenzen und bietet den Nutzern ein rationalisiertes und multifunktionales Werkzeug.

Quelle der Innovation: Prozessbedarf

Zusammenfassung: Innovationen entstehen oft, wenn Möglichkeiten zur Optimierung oder Rationalisierung bestehender Prozesse erkannt werden.

Detaillierte Erläuterung: Die Innovationsquelle “Prozessbedarf” unterstreicht die Bedeutung des Erkennens von Möglichkeiten zur Verfeinerung bestehender Prozesse, um deren Effizienz und Wirksamkeit zu verbessern. Durch das Erkennen von Engpässen und Ineffizienzen innerhalb der bestehenden Arbeitsabläufe werden Unternehmen dazu angeregt, nach erfinderischen Lösungen zu suchen, die die betriebliche Leistung verbessern.

Aktuelle Beispiele:

  1. Schlanke Fertigung (Toyota): Die Einführung der Lean-Manufacturing-Prinzipien durch Toyota läutete eine transformative Ära ein. Dabei konzentrierte man sich unablässig auf Prozessverbesserung, Abfallreduzierung, Qualitätsverbesserung und betriebliche Effizienz. Diese Verfeinerungen haben die Fertigungslandschaft neu gestaltet.
  2. Amazons Innovation in der Lieferkette: Amazons kontinuierliche Innovation in der Lieferkette und im Logistikbetrieb ist durch Fortschritte wie Lagerroboter und Drohnenzustellung gekennzeichnet. Diese Innovationen optimieren die Lieferkette, was sich in schnelleren und effizienteren Dienstleistungen für die Kunden niederschlägt.
  3. Lean-Startup-Methodik: Die Lean-Startup-Methode steht für schnelle Iterationen, Feedback-gesteuerte Entwicklung und die Minimierung von Verschwendung im Produktentwicklungsprozess. Dieser Ansatz ist zu einem Eckpfeiler unternehmerischer Unternehmungen geworden, insbesondere im Technologiesektor.

Quelle der Innovation: Industrie- und Marktveränderungen

Zusammenfassung: Innovation entsteht häufig durch Veränderungen in der Branche und der Marktdynamik, die durch Faktoren wie gesetzliche Änderungen, sich verändernde Verbraucherpräferenzen oder demografische Veränderungen ausgelöst werden.

Detaillierte Erläuterung: die Innovationsquelle “Branchen- und Marktveränderungen” unterstreicht die Rolle von Umwälzungen bei der Neugestaltung der Unternehmenslandschaft. Unabhängig davon, ob sie von Änderungen der Rechtsvorschriften, einem sich wandelnden Verbrauchergeschmack oder einer veränderten demografischen Zusammensetzung herrühren, bieten diese Veränderungen Chancen für innovative Produkte und Dienstleistungen. Die Anpassung an diese sich entwickelnde Dynamik kann zu bedeutenden Fortschritten führen.

Aktuelle Beispiele:

  1. Elektroautos: Der Wandel in der Automobilindustrie wurde durch Veränderungen in der Branche ausgelöst, u. a. durch Umweltvorschriften und die gestiegene Nachfrage der Verbraucher nach umweltfreundlichen Transportmöglichkeiten. Dieser Wandel führte zum Aufkommen von Elektrofahrzeugen, wobei Unternehmen wie Tesla an der Spitze der Bewegung stehen.
  2. Pflanzliches und im Labor gezüchtetes Fleisch: Der Wandel der Ernährungsgewohnheiten hin zu ethischen und nachhaltigen Lebensmitteln hat das Wachstum von pflanzlichen und im Labor hergestellten Fleischprodukten vorangetrieben, die den veränderten Verbraucherwünschen entsprechen.
  3. Telemedizin: Branchen- und Marktveränderungen, die durch das Bedürfnis nach einem entfernten Zugang zur Gesundheitsversorgung vorangetrieben wurden, haben die Ausweitung telemedizinischer Dienstleistungen katalysiert, die zugängliche und bequeme Gesundheitslösungen bieten.

Quelle der Innovation: Demografische Entwicklung

Zusammenfassung: Innovationen können durch Veränderungen des Alters, der Größe oder der Zusammensetzung der Bevölkerung angeregt werden, da diese Veränderungen maßgeschneiderte Lösungen erfordern.

Detaillierte Erläuterung: Die Innovationsquelle “Demografie” unterstreicht die Bedeutung des Verständnisses und der Berücksichtigung der unterschiedlichen Bedürfnisse und Präferenzen verschiedener demografischer Gruppen. Da sich die Bevölkerung in Bezug auf Alter, Größe und Zusammensetzung weiterentwickelt, können Unternehmer und Unternehmen Chancen nutzen, indem sie Produkte und Dienstleistungen entwickeln, die auf diese sich entwickelnden demografischen Gruppen zugeschnitten sind.

Aktuelle Beispiele:

  1. Ruhestandsplanung für Babyboomer: Das Älterwerden der Baby-Boomer-Generation hat eine Nachfrage nach maßgeschneiderten Finanz- und Gesundheitsdienstleistungen geschaffen. Innovationen in den Bereichen Ruhestandsplanung und Seniorenbetreuung sind entstanden, um diesem demografischen Wandel Rechnung zu tragen.
  2. Online-Lernplattformen: Online-Lernplattformen wie Coursera und edX richten sich an Lernende aller Altersgruppen und bieten verschiedene Kurse und Programme an, die den unterschiedlichen Bildungsbedürfnissen der verschiedenen Bevölkerungsgruppen gerecht werden.
  3. Apps und Produkte für alternde Bevölkerungsgruppen: Die Entwicklung von Anwendungen und Produkten, die auf die Gesundheits-, Mobilitäts- und Zugänglichkeitsbedürfnisse älterer Bevölkerungsgruppen abzielen, wie z. B. Apps zur Erinnerung an die Einnahme von Medikamenten und seniorenfreundliche Smartphones, ist eine Reaktion auf den demografischen Wandel.

Quelle der Innovation: Veränderungen in der Wahrnehmung

Zusammenfassung: Innovationen können ihren Ursprung in Veränderungen kultureller Normen, Einstellungen und Werte haben, da diese veränderten Wahrnehmungen Chancen für neuartige Produkte und Dienstleistungen schaffen.

Ausführliche Erläuterung: die “veränderte Wahrnehmung” als Quelle von Innovationen unterstreicht den dynamischen Charakter von kulturellen Normen, Einstellungen und Werten. Wenn sich gesellschaftliche Sichtweisen verändern, ebnet dies den Weg für innovative Produkte und Dienstleistungen, die mit diesen sich verändernden Wahrnehmungen in Einklang stehen. Das Erkennen und Ausnutzen dieser Veränderungen kann zu bahnbrechenden und wirkungsvollen Innovationen führen.

Aktuelle Beispiele:

  1. Pflanzenbasierte Ernährung: Die zunehmende Akzeptanz der pflanzlichen Ernährung aufgrund von Gesundheits- und Umweltbedenken hat zu einer Vielzahl von veganen und vegetarischen Lebensmitteln geführt, die der veränderten Wahrnehmung einer ethischen und nachhaltigen Ernährung Rechnung tragen.
  2. Umweltverträgliche Produkte: Das gestiegene Umweltbewusstsein hat in verschiedenen Branchen die Ära der umweltfreundlichen und nachhaltigen Produkte eingeläutet und spiegelt die veränderte Wahrnehmung der Umweltverantwortung wider.
  3. Digitale Kunst und NFTs: Die Kunstwelt befindet sich derzeit im Wandel, da digitale Kunst und NFTs die traditionellen Vorstellungen von Kunstbesitz und -wert in Frage stellen. Diese veränderte Wahrnehmung hat Künstlern und Sammlern neue Möglichkeiten eröffnet.

Quelle der Innovation: Neues Wissen

Zusammenfassung: Innovationen sind oft das Ergebnis von Fortschritten im wissenschaftlichen oder technischen Bereich, wobei Durchbrüche und Entdeckungen Möglichkeiten für revolutionäre Innovationen schaffen.

Ausführliche Erläuterung: Die Innovationsquelle “Neues Wissen” unterstreicht die tiefgreifende Bedeutung von Durchbrüchen und Fortschritten im wissenschaftlichen und technischen Bereich. Wenn Forscher neue Einsichten oder Prinzipien erschließen, eröffnen sich Möglichkeiten für revolutionäre Innovationen in einem breiten Spektrum von Bereichen. Die Anwendung dieses neuen Wissens führt zu transformativen Veränderungen.

Aktuelle Beispiele:

  1. CRISPR-Gen-Editierungstechnologie: Das Aufkommen von CRISPR-Cas9, einer revolutionären Gen-Editierungstechnologie, ist das Ergebnis eines Durchbruchs in der Molekularbiologie. Ihr Potenzial, Medizin, Landwirtschaft und Biotechnologie durch präzises Gen-Editing zu verändern, ist ein Beispiel für die Macht des neuen Wissens.
  2. Fortschritte bei der künstlichen Intelligenz (KI) und dem maschinellen Lernen: Die kontinuierlichen Fortschritte im Bereich der künstlichen Intelligenz und des maschinellen Lernens haben zu Innovationen wie autonomen Fahrzeugen, vorausschauenden Analysen, virtuellen Assistenten und einer Vielzahl von Anwendungen in verschiedenen Branchen geführt.
  3. Nanotechnologie in der Materialwissenschaft: Innovationen in der Nanotechnologie haben die Entwicklung neuartiger Materialien mit einzigartigen Eigenschaften ermöglicht. Diese Materialien finden Anwendung in der Elektronik, Medizin und Werkstofftechnik und eröffnen neue Möglichkeiten der Produktentwicklung.

Sprache und Stil sollen den Geist und die Terminologie von Peter Drucker widerspiegeln und helfen, die Bedeutung und das Potenzial dieser Innovationsquellen in der heutigen wirtschaftlichen und technologischen Landschaft zu vermitteln.

Wie man sich als Solo-Gründer organisiert

Im folgenden Stelle ich euch meine tägliche Arbeitsweise vor, mit der ich zum einen meine Projekte erreiche und auch meine täglichen Aufgaben nicht aus den Augen verliere.

Problemstellung

Wenn man als Arbeitnehmer in einer Firma arbeitet, ist es normalerweise so, dass die eigenen Aufgaben klar definiert sind. In der Regel gibt es eine Projekt-Management-Software aus der klar ersichtlich ist, was als nächstes getan werden muss.

Wenn man als Freelancer, Solopreneur oder nebenberuflich tätig ist, sieht die Lage meistens anders aus.

Als ich mich mit meinen Affiliate-Websites selbstständig gemacht habe, hatte ich kein System, dem nicht folgen konnte. Ich hatte mich derzeit für ein einfaches Kanban-Board entschieden, indem ich meine Aufgaben eintrug.

Nach kurzer Zeit hatte ich Schwierigkeiten eine Balance aus neuen Features, die umgesetzt werden sollten, und regelmäßig wiederkehrenden Aufgaben zu finden.

Mein Hintergrund als Product Owner in einem Scrum-Team war mir nur bedingt hilfreich. Zwar war mir klar, wie ich Aufgaben priorisieren und abarbeiten sollte, aber ich war überfordert wiederkehrende Aufgaben einzuordnen und regelmäßig zu bearbeiten.

Also machte ich mich auf die Suche, nach Planungssystem, die mir weiterhelfen sollten. Ich interviewte Freunde und studierte mehrere Organisationssysteme und kreierte daraus mein eigenes Planungssystem.

Mein Planungssystem sollte mir mit folgenden Anforderungen weiterhelfen:

  • Wichtige Features und Aufgaben sollten hoch priorisiert sein und möglichst zeitnah umgesetzt werden.
  • Wiederkehrende Aufgaben, die regelmäßig umgesetzt werden müssen, sollten mir weder den Backlog zumüllen, noch wollte ich sie in meinem Kopf haben.
  • Darüber hinaus wollte ich, das meine notorisch überfüllte Inbox verschwindet. (In der Vergangenheit, habe ich meine Inbox gerne als Ablagesystem für später zu erledigende Aufgaben eingesetzt.)

Darf ich vorstellen: Getting Things Scrumban

Nach meinen Erfahrungen und Recherchen habe ich folgendes System entwickelt. Im Wesentlichen ist es ein uneheliches Kind aus Getting Things Done, Scrum und Kanban.

Herzstück des Systems ist wie bei den meisten agilen Projektmanagementsysteme ein Taskboard.

Aktuell gliedert sich dieses in vier Spalten: Backlog, Todo, Doing, Done. Das Taskboard ist bewusst simpel gehalten. Menschen, die häufig Aufgaben delegieren oder von anderen bei der Erledigung abhängig sind, sollten noch über eine On-Hold- oder Delegated-Spalte nachdenken.

Allerdings hilft mir das Taskboard noch nicht mit wiederkehrenden Aufgaben. Diese müssen immer wieder neu eingepflegt werden. Wenn man in Sprints arbeitet, könnte man, sobald man eine wiederkehrende Aufgabe erledigt hat, diese immer wieder neu in den Backlog einpflegen. Das finde ich aber äußerst umständlich und es entspricht auch nicht wirklich einem Backlog. Schließlich will ich meinen Backlog ja abarbeiten und nicht automatisch anwachsen lassen.

Deswegen habe ich mich neben dem Taskboard noch für eine separate Liste mit wiederkehrenden Aufgaben entschieden. Die Aufgaben in dieser Liste kennzeichnen sich dadurch, dass sie sich zum einen wie der Name schon sagt wiederholen und Arbeitsumfang begrenzt sind. Typische Einträge sind “E-Mails lesen” oder “Google Analytics checken”. Grundsätzlich ist keine wiederkehrende Aufgabe zu klein, um nicht in dieser Liste zu landen. Hauptsache die Dinge sind aus dem Kopf und belegen keine Kapazitäten im Gehirn.

Für Termine verwende ich noch einen Kalender, um meine Termine zu verwalten.

Mein Arbeitsplatz sieht in etwa so aus

My work desktop

Ablauf

Mein Tagesablauf gliedert sich wie folgt:

Als Erstes checke ich meine Termine und lese dann E-Mails und andere Nachrichten, die an mich gesendet wurden. Wenn aus diesen, neue Aufgaben hervorgehen, werden sie in den Backlog eingepflegt.

Im Anschluss verschaffe ich mir einen Überblick über mein Taskboard und die wiederkehrenden Aufgaben, die eventuell neu aufgepoppt sind. Von hier aus kann ich dann mit der Erledigung aller Tasks beginnen.

Normalerweise starte ich mit den zu wiederholenden Aufgaben, da diese schnell erledigt sind und ich dann Zeit für das Taskboard habe.

Meinen Backlog überarbeite ich mindestens einmal pro Woche. Dabei sortiere ich die Features ggf. neu und schaue, dass sie so beschrieben sind, dass ich während der Umsetzung genau weiß, was ich machen soll. Beim Scrum würde man von einem Backlog-Refinement sprechen, bei GTD von Reflect.

Alle 14 Tage mache ich eine Retrospektive, bei der ich die vergangenen 2 Wochen Revue passieren lasse, entscheide welche Arbeitsweisen gut funktioniert haben und welche ich ändern möchte, um effektiver voranzukommen.

Auf echte Sprints mit festen Scrum-Events verzichte ich, da sie nicht mit meinem aktuellen Leben vereinbar sind und ich alleine natürlich etwas flexibler bin als ein Team von 5 bis 10 Leuten.

Apps

Im Folgenden möchte ich dir noch die Tools vorstellen, die ich derzeit verwende und die gut zu mir passen.

Als To-do-Liste mit wiederholenden Aufgaben verwende ich Google Tasks. Da Google Tasks eigentlich nicht alleine in einem Browser angezeigt werden kann, habe ich mir einen kleinen Workaround geschrieben: Google Tasks im Browser. Nutzt einfach diesen Link, wenn ihr Google Tasks unabhängig von GMail oder Calendar nutzen wollt.

Als Board-Lösung nutze ich ein selbst programmiertes Tool: Metado. Der entscheidende Vorteil für mich: Metado zeigt Google Tasks und GitHub-Issues von ausgewählten Projekten an. So kann ich unterschiedliche Projekte Seite an Seite sehen, ohne sie händisch übertragen zu müssen oder mehrere Tools gleichzeitig pflegen zu müssen.

Als Kalender nutze ich Google Calendar, weil ich gerne im Google-Ökosystem arbeite.

Wer sich mit anderen Tools wohlfühlt, die für seine Zwecke besser geeignet sind, kann natürlich diese natürlich verwenden.

Nun wird es Zeit, dass ich dich zu Wort kommen lasse. Wie strukturierst du deine Arbeit? Hast du vielleicht Tipps für den Rest von uns? Teile doch deine Erkenntnisse in den Kommentaren.

33 Linux Apps, die du lieben wirst

Icon: Apps for Linux

Ich habe hier Anwendungen aufgelistet, die ich selbst auf meinem Linux-Laptop nutze – die meisten sind Open-Source-Software; alle sind kostenlos und großartig zu benutzen.

Um sie zu installieren, verwendest du am Besten, den Paketmanager deiner Linux-Distribution.

Aktuell habe ich keine Apps aufgeführt, die ich persönlich nicht benötige. Deswegen findest du weder einen Video-Editor noch eine Instant-Messaging-App. Wenn du gute Vorschläge hast, möchte ich dich ermutigen, sie in den Kommentaren zu nennen. Auch habe ich keine Webseiten genannt, die ich für bestimmte Aufgaben nutze, wie z.B. Google Calendar oder Gmail.

Abschließend habe ich Systemprogramme wie die Desktopumgebung ausgeklammert. Persönlich nutze ich KDE, aber die gelisteten Apps funktionieren mit jeder Desktopumgebung.

Internet

Firefox

Firefox ist der freie Web-Browser des Mozilla-Projekts. Es gibt eine Menge Erweiterungen, um deine Surf-Erfahrung anzupassen. Firefox wirkt etwas schneller und Ressourcen-schonender als Chromium.

Chromium

Chromium ist die freie Variante von Google’s Chrome Browser. Chromium besitzt ein minimales User-Unterface und es sind für Chromium eine Unmenge an Erweiterungen vorhanden. Anders als Chrome, kommt Chromium nicht mit dem Flash-Player und einigen unfreien Video-Codecs. Ein schönes Feature ist die Fähigkeit, bestimmte Websites im Anwendungs-Menu speichern zu können. Diese öffnen sich dann als unabhängige Anwendung ohne Browser-Tabs.

THUNDERBIRD

Thunderbird ist der freie E-Mail-Client des Mozilla-Projekts. Wie Firefox ist auch Thunderbird sehr stark anpassbar und es gibt eine Menge Erweiterungen.

Office

LIBREOFFICE

LibreOffice ist die Bürosoftware für Linux. Alle Alternativen sind für seriöse Büro-Arbeit nicht geeignet. Seitdem LibreOffice von OpenOffice geforkt wurde, gewinnt die Entwicklung ständig an Fahrt. Wenn du auf der Suche nach OpenOffice bist, verwende LibreOffice.

TYPORA

Typora Typora ist ein sehr eleganter Markdown-Editor. Anders als die meisten anderen Markdown-Editoren besitzt er keine Preview-Funktion, sondern ein WYSIWIG-Interface.

StarDict

StarDict ist eine Wörterbuch-App, die auf unterschiedliche Wörterbücher zugreifen kann. Ich benutze sie, um schnell englische Worte nachzuschlagen. Dafür markierst du einfach das Wort, dass du übersetzt haben möchtest. Und schon erscheint die Übersetzung. Als Qt-Alternative bietet sich GoldenDict an.

Text Editors

Visual Studio Code

VSCode ist ähnlich wie Atom mit Web-Technologien entwickelt. Auch er ist sehr anpassbar und bietet über eine große Anzahl an Erweiterungen. Anders als Atom fühlt er sich deutlich schneller in der Benutzung an. Das Design der Oberfläche gefällt mir im Vergleich zu Atom nicht so gut. Kontraste und Abstände sind zu gering gewählt. Dies wird speziell in der Suchfunktion deutlich.

ATOM

Atom ist ein Texteditor, der mit Web-Technologien entwickelt wurde. Er ist sehr anpassbar, verfügt über eine große Anzahl Erweiterungen und ist leichter zu verwenden als Emacs. Der Nachteil von Atom ist, dass er für einen Texteditor sehr Resourcen-hungrig ist. Speziell, wenn man viele Erweiterungen gleichzeitig verwendet.

EMACS

Emacs ist ein erweiterbarer, anpassbarer Editor des GNU-Projects. Er ist wahrscheinlich der mächtigste Editor, den es gibt. Auf der anderen Seite besitzt das 1984 gestartete Projekt eine Menge Eigenarten, die die Lernkurve recht steil machen. Ich persönlich empfehle dir einen Blick auf Spacemacs oder ErgoEmacs zu werfen, um die Emacs-Erfahrung ein wenig zu erleichtern.

Todo-List

AKIEE

Das ist jetzt schamlose Eigenwerbung: Ich bin der Akiee-Author, aber ich glaube, dass Akiee einer der nützlichsten Task-Manager ist, die erhältlich sind. Seine Benutzung basiert auf der Kanban-Methodik und macht es einfach Aufgaben zu priorisieren und sich darauf zu konzentrieren, was man als Nächstes macht.

ORG-MODE

Org-Mode ist ein spezieler Modus in Emacs, der einem die Möglichkeit gibt, Notizen zu machen, Aufgaben zu planen und Texte zu strukturieren. Für Menschen die Emacs noch nicht benutzen, ist die Einarbeitungszeit leider beträchtlich.

Notizen

ZIM

Zim ist ein persönliches Wiki, mit dem einfach seine eigenen Notizen verwalten kann. Mit Zim kann man seine Notizen wie in einem Wiki verbinden und organisieren. Es kommt mit einigen Erweiterungen, wie einem LaTex-Editor.

LEO

Leo ist eine App zum Gliedern von Texten. Speziell, wenn du eine Menge Text zu schreiben hast, nutze Leo für Notizen, Gliederungen und sogar Literate-Programming. Wie bei den meisten mächtigen Werkzeugen benötigst du eine längere Zeit der Einarbeitung.

BASKET

Basket ist eine mächtige Notiz-App. Basket hat deutlich mehr Features als Zim – aber auch eine höhere Lernkurve.

FREEMIND

FreeMind ist eine Mindmapping-Software, die einfach zu bedienen ist und für alle Plattformen erhältlich ist. Wenn du gerne mit Mindmaps arbeitest, solltest du dir FreeMind genauer ansehen.

Developer-Tools

VIRTUALBOX

Wenn du eine Virtualsierungs-Lösung auf deinem Linux-Desktop brauchst, ist VirtualBox der einfachste Weg. Es gibt noch andere Lösungen, aber keine ist so einfach zu benutzen.

SMARTGIT

SmartGit ist eine einfach zu benutzende, voll funktionsfähige Git-Oberfläche. Sie ist leider keine freie Software, aber für den persönlichen Gebrauch kostenlos.

Security

KEEPASSX

Die Benutzung eines Passwort-Managers ist wahrscheinlich die beste Maßnahme, die man ergreifen kann, um die eigene Sicherheit im Internet zu verbessern. Für mich ist KeePassX die am besten funktionierende Lösung.

Multimedia

VLC

VLC ist einer der bekanntesten Multimedia-Spieler überhaupt. Und das aus gutem Grund. Er spielt fast jede Art von Multimedia-Datei ab. Wenn dein vorinstallierter Multimedia-Spieler nicht deine Erwartungen erfüllt, solltest du VLC einmal ausprobieren.

SPOTIFY DESKTOP

Spotify-Desktop ist kein besonders gutes Stück Software, aber wenn du Spotify-Nutzer bist, gibt es leider keine bessere Alternative.

Grafik

GIMP

Gimp ist deine Lösung, wenn du eine Bildbearbeitungssoftware unter Linux benötigst. Es kann die meisten Dinge, die Photoshop kann. Nutzer, die andere Bildbearbeitungssoftware gewohnt sind, benötigen manchmal ein wenig Einarbeitungszeit.

INKSCAPE

Inkscape ist ein Programm zum Bearbeiten und Erstellen von Vektor-Grafiken, dass du für professionelle Designs nutzen kannst. Es besitzt flexible Zeichenwerkzeuge, kann eine Menge Dateiformate (inklusive PDF) importieren und hat ein mächtiges Textwerkzeug.

SCRIBUS

Scribus ist ein DTP-Programm mit dem man Booklets, Broschüren, Magazine und alles, was man sonst noch so drucken lässt, erstellen kann.

Lernen

ANKI

Anki ist eine intelligente Karteikarten-App, mit der man einfach Fakten lernen kann – wie beispielsweise Vokabeln.

Spiele

STEAM

Steam ist eine Internet-Vertriebsplattform für Computerspiele. Du findest dort über 160 kommerzielle Spiele für Linux. Wenn du ernsthaft unter Linux spielen willst, kommst du an Steam nicht vorbei.

FROZEN BUBBLE

Frozen Bubble ist ein niedliches Logik-Spiel für Linux. Es besitzt einen guten Soundtrack und kann süchtig machen.

FREECIV

FreeCiv ist ein freier Civilization-Klon. Wenn du das Original magst, wirst du FreeCiv lieben.

Zubehör

CLIPIT

ClipIt ist ein leichtgewichtiger Zwischenablage-Manager. Wenn deine Desktopumgebung keinen beinhaltet, solltest du definitiv einen installieren. ClipIt wird Wunder für deine Produktivität bewirken.

ALBERT

Albert ist eine Produktivitäts-App, die dich einfach Anwendungen starten, Dateien suchen, deine Lesezeichen überblicken und sogar einfache Rechnungen durchführen lässt.

AUTOKEY

AutoKey ist ein Tool, mit dem du Aufgaben automatisieren und auf Knopfdruck ausführen lassen kannst. Es erlaubt dir eine Sammlung von Skripten und Text-Phrasen zu speichern, und die mit Abkürzungen und Tastenkombinationen zu versehen. AutoKey ermöglicht dir, bei bedarf einen Text einzufügen – aus jedem Programm heraus, das du gerade nutzt.

QTerminal

QTerminal ist ein leichtgewichtiges Terminal-Programm, dass es dir erlaubt, einzelne Terminals in einem Kachel-artigen Layout zu öffnen. Qterminal ist sehr praktisch, wenn du gleichzeitig mehrerer Terminals benutzen möchtest. Anwender die Gnome, Xfce, Ubuntu und Mint benutzen, können auch Tilix installieren, dass besser in ihre Desktopumgebung integriert ist.

Yukuaka

Yukuake ist ein Terminal, das von der Bildschirm-Spitze herunter scrollt, wenn man eine bestimmte Tastenkombination drückt. Es ist sehr nützlich, wenn du kurz einen Befehl im Terminal eingeben willst, ohne dabei gleich ein neues Fenster zu öffnen. Anwender die Gnome, Xfce, Ubuntu und Mint benutzen, können auch Guake nutzen, dass besser in ihre Desktopumgebung integriert ist.

SYNERGY

Synergy ist eine Anwendung, mit der man eine Maus und Tastatur auf mehreren Computern gleichzeitig nutzen kann. Man kann den Computer einfach wechseln, indem man mit der Maus über den Bildschirmrand zum nächsten Computer wechselt – wie bei einem zweiten Display.

Emulatoren

Wine Icon

Wine

Wine ist eine Windows-kompatible Laufzeitumgebung, mit der man Windows-Programme unter Linux nutzen kann. Ich benutze Wine beispielsweise um eine alte Version von OpenOffice zu verwenden, die noch mit dem Duden-Korrektor kompatibel ist.

PlayOnLinux Icon

PlayOnLinux

PlayOnLinux ist eine grafische Benutzeroberfläche für Wine. Damit ist es sehr viel einfacher Windows-Programme zu installieren und unterschiedliche Wine-Versionen zu verwalten.

Probao-Case-Study: nutzerfreundlich, schnell und SEO-optimiert

Heute möchte ich euch mein neues Projekt “Probao” vorstellen. Auf Probao teste ich Online-Dienste, die ich selbst für nützlich halte. Dabei schreibe ich auf Probao über meine Erfahrungen mit den einzelnen Diensten und wie man sie am besten nutzt.

Mein Ziel mit Probao ist es Verbrauchern die Möglichkeiten aufzuzeigen, wie man sich das Leben mit Online-Diensten erleichtern kann und dabei auch noch den ein oder anderen Euro sparen kann.

Neben meinen persönlichen Erfahrungen, die ich in den Testberichten sehr ausführlich niederschreibe, findest du auf Probao auch noch Erfahrungsberichte von anderen Nutzern.

Anders als auf so vielen anderen Plattform, können die Nutzer aber nicht irgendwelche Erfahrungsberichte hochladen oder unsachliche Hasstiraden loslassen. Alle veröffentlichten Erfahrungsberichte müssen den Qualitätsstandard von Probao entsprechen.

Das heißt Hassberichte oder übertriebenes Lobeshymnen wirst du in den Erfahrungsberichten nicht finden. Nur Erfahrungsberichte, die einen Mehrwert für dich bieten, werden wir veröffentlichen.

Wenn du selbst Erfahrungen mit Online-Diensten gemacht hast, laden wir dich ein, diese auf Probao zu veröffentlichen. Du kannst jeden Monat eine 50 Euro Amazon-Gutschein gewinnen.

Technische Umsetzung

Die technische Umsetzung basiert wie bei meinen meisten Projekten auf WordPress. Mittlerweile setze ich für Content-Projekt eigentlich immer auf WordPress. Mit WordPress bekommt man einfach die meiste Funktionalität frei Haus.

Durch das riesige Angebot an Plugins kann man mit fast jede Art von Projekt schnell umsetzen. Darüber hinaus ist WordPress schnell und Suchmaschinen-freundlich.

Ich nutze bei Probao folgende Plugins:

Als Theme benutze ich eine Eigenentwicklung, die speziell aus SEO-Gesichtspunkten optimiert ist. So lade ich nur die Javascript– und CSS-Dateien, die ich wirklich will. Mein Ziel ist es so die Ladezeiten deutlich zu verkürzen. Vor allem mobile Nutzer sollen auch komfortabel Probao nutzen können.

Herausforderungen technischer Natur

Wie schon geschrieben, war ein zentrales Ziel die Ladezeiten so weit wie möglich zu verkürzen, um ein gutes Ergebnis beim PageSpeed Insights zu bekommen.

Ferner galt es auch die Testergebnisse auf Probao ordentlich darzustellen und sie gleichzeitig als Microformats mit semantischen Informationen zu versehen, damit Suchmaschinen die Inhalte besser verstehen.

Ein dritter Punkt war die Notwendigkeit schnell und einfach Querverlinkungen zwischen unterschiedlich Erfahrungsberichten herstellen zu können. Die Querverweise sollten optisch ansprechender als einfache Links und mehr Kontext für den Leser darstellen.

Minimierung der Ladezeiten

Um die Ladezeiten so kurz wie möglich zu halten, nutze ich im Großen und Ganzen drei Strategien. Als Allererstes lasse ich Probao bei einem ordentlichen auf WordPress spezialisierten Hostinganbieter laufen.

Dies sorgt schon für die nötigen technischen Einstellungen auf dem Server. Ich muss mich weder um Caching, Komprimierung noch HTTP-Version kümmern.

Darüber hinaus sorge ich mit zwei Plugins dafür, dass Bilder stark komprimiert werden und, wenn der Besucher sie denn auslesen kann, im neuen WebP-Format ausgeliefert werden. Dies erspart meinen Besuchern viele Kilobytes und einiges an Ladezeit.

Die wichtigste Maßnahme ist aus meiner Sicht die Reduzierung der Requests. Auch wenn durch HTTP2 mehrere Downloads gleichzeitig angestoßen werden können, ist das Zusammenfassen von JavaScript und CSS immer noch ein wichtiger Teil der Optimierung.

Üblich ist dafür die Nutzung bestimmter Caching-Plugins, die die Dateien der einzelnen Plugins und von WordPress zu jeweils einer einzigen CSS- und einer einzigen JavaScript-Datei zusammenfassen.

Allerdings hatte ich mit diesem Ansatz bisher einige Probleme. Manchmal wurde dadurch die Darstellung meines Themes verhunzt. Deswegen bin ich einen anderen Weg gegangen:

In meinem WordPress-Theme pflege ich die einzelnen JavaScript- und CSS-Dateien händisch ein. Im Produktivmodus werden diese jeweils in eine Datei zusammengefügt.

So kann ich sicherstellen, welches CSS und JavaScript in meinem Theme benutzt wird und habe trotzdem keine Probleme mit der Darstellung.

Darstellung der Testergebnisse und Microformats

Testergebnis und Microformat aus benutzerdefinierten Feldern.
Testergebnis und Microformat aus benutzerdefinierten Feldern.

Eine weitere Herausforderung war die Darstellung der Testergebnisse. Zum einen wollte ich nicht jedes Mal eine Tabelle in das WordPress-Dokument einfügen. Zum anderen sollten die Daten auch als MicroFormat für Google zur Verfügung stehen.

Darüber hinaus gab es auf den Plan, zukünftig die Daten der Testberichte auch an anderer Stelle auf Probao zur Verfügung zu haben.

Aus diesem Grund werden die Testergebnisse nicht direkt im jeweiligen Testbericht gespeichert, sondern als benutzerdefinierte Felder, die jedem WordPress-Dokument zugeordnet werden können.

Das Probao-Theme stellt dann bei Vorhandensein bestimmter benutzerdefinierte Felder die entsprechenden Informationen zum Erfahrungsbericht dar.

Cross-plattform Apps mit Electron und React Teil 4

Nachdem wir im dritten Teil unsere Demoanwendung fertiggestellt haben, werden wir nun installierbare Pakete für die unterschiedlichen Plattformen bauen.

Stellvertretend für Linux-Systeme werden wir ein Debian Paket bauen. Für Windows werden wir ein Squirrel-Paket bauen und für Mac OS eine ZIP-Paket.

Wer seine App in die App Stores der jeweiligen Plattform bringen will, kann dies auch mit electron-forge machen.

Die Dokumentation gibt ausführlich Auskunft über die Möglichkeiten, wie man seine Pakete bauen kann und man sie auch gleichzeitig veröffentlichen kann.

Vorbereitung

In der package.json geben wir unserer Demo-App eine ordentliche Beschreibung und legen fest, dass wir für Linux nur ein Debian-Paket erstellen möchten.

Darüber hinaus geben wir Anwendungsdatei einen Namen und definieren den Pfad zum App-Icon.

"description": "Rebuild of the gtk3-demo-application with electron",
...
 "linux": [
    "deb
]
...
"electronPackagerConfig": {
  "packageManager": "yarn",
        "executableName": "electron-react-example",
        "icon": "./icon.svg"
}
...

Da unser Anwendungsname electron im Namen hat müssen wir die Abfrage für den Entwicklungsmodus ein ganz wenig anpassen. In der index.js fragen wir deswegen nicht nur, ob der Fahrt zur Anwendungsdatei electron enthält, sondern das electron ein Unterverzeichnis ist.

const isDevMode = process.execPath.match(/[\\/]electron[\\/]/);

Nun können wir mit unserem Linux-Build anfangen.

Linux-Build

Als Icon für die Anwendung habe ich mir von openclipart.org ein einfaches Icon heruntergeladen. Grundsätzlich reicht uns hierfür jegliche SVG- oder PNG-Datei.

Für den Linux-Build legen wir in der package.json dann unter electronInstallerDebian Werte für das Icon und die Kategorie fest.

...
"electronInstallerDebian": {
        "icon": "./icon.svg",
        "categories": [
          "Utility"
        ],
        "homepage": "https://foo.com"
      },
...

Nun können wir in der Kommandozeile mit electron-forge make unsere Anwendungen bauen. Wenn alles gut gegangen ist findet man unter out/make das Debian-Paket.

Mac OS-Build

Für den Mac-Build habe ich mir in einer virtuellen Maschine das Repo geklont und unser Icon in das icns-format konvertiert.

In der Kommandozeile habe ich dann mit NPM alle Abhängigkeiten installiert und dann wieder mit electron-forge make den Build angestoßen. Mehr war nicht notwendig.

Am Ende sollte eine ZIP-Datei stehen, die eine ausführbare Anwendung enthält.

electron-forge bietet auch die Möglichkeit DMGs für den Mac zu erstellen.

Windows-Build

Als Vorbereitung für den Windows-Build habe ich unser Icon diesmal in eine ico-Datei konvertiert. Dann habe ich wieder mit electron-forge den-Build in einer virtuellen Maschine angestoßen. Mehr ist auch hier nicht nötig.

Grundsätzlich ist es auch möglich electron-Pakete mit Wine zu bauen. Allerdings ist in der aktuellen Version von electron-forge diese Funktionalitäten nicht eingebaut. Wer trotzdem unter Linux Windows-Pakete bauen will, sollte sich das Paket electron-packager einmal anschauen.

Wir haben jetzt mit geringem Aufwand Pakete für alle bekannten Plattformen gebaut. Damit endet unser Tutorial. Ich hoffe ich konnte zeigen, dass Electron mit React eine interessante Alternative ist, wenn man plattformübergreifende Desktop-Applikation bauen möchte. 

electron-react-example für Ubuntu

electron-react-example für Mac OS

electron-react-example für Window

Unsere Anwendung passt sich gut in allen Umgebungen ein, ist mit Web-Technologien umgesetzt und hat keine externen Abhängigkeiten.

Du findest den Source-Code für dieses Tutorial auf Github: https://github.com/rockiger/electron-react-example

Created with Dictandu

Cross-plattform Apps mit Electron und React Teil 3

Im zweiten Teil haben wir unserer Electron-App einen zum jeweiligen Betriebssystem passenden Look verpasst. Dabei haben wir je nach Plattform ein passendes Stylesheet verwendet, damit sich die Anwendung gut einpasst.

In diesem Teil werden wir nun das Menü der gtk3-demo-application nachbauen. Dazu werden wir als Erstes das App-Menü der Anwendung bauen. Dieses definieren wir beim Start der App. Als zweiten Schritt werden wir ein Kontext-Menü erstellen, dass zur Laufzeit der Anwendung komponiert wird. Damit unterscheidet es sich in der Art und Weise der Definition vom App-Menü.

Abschließend werden wir noch ein paar Optimierungen für Mac OS vornehmen. Das App-Menü auf einem Mac unterscheidet sich grundlegend von den Menüs unter Windows und Linux.

App-Menü

Das App-Menü erstellen wir in der Datei src/index.js. Dort wird es während des Starts der App geladen. Als Template für das Menü verwenden wir einen Javascript-Array, der Javascript-Objekte enthält. Die Javascript Objekte entsprechen einem Menüpunkt.

Das Menü-Template hat folgende Struktur:

[
  {
    label: 'NAME',
    submenu: [
      { role: 'NAME' },
      {
        label: 'NAME',
        click () { ... }
      }
    ]
  }
]

Jeder Menüpunkt kann wiederum eigene Untermenüs enthalten. Der sich so ergebende Baum stellt das App-Menü da.

Mit der Methode buildFromTemplate erstellen wir dann das Menü-Objekt.

Zusätzlich ergänzen wir src/index.js noch um eine Funktion showMessage, die uns als Dummy-Callback dient.

import { app, BrowserWindow, Menu, dialog } from 'electron';
...
  mainWindow = null;
  });

   const showMessage = message => dialog.showMessageBox({
    type: 'info',
    message: `You activated action: "${message}"`,
    buttons: ['Close'],
  });

   const menu = Menu.buildFromTemplate([
    {
      label: 'Preferences',
      submenu: [
        {
          label: 'Prefer Dark Theme',
          type: 'checkbox',
        },
        {
          label: 'Hide Titlebar when maximized',
          type: 'checkbox',
        },
        {
          label: 'Color',
          submenu: [
            {
              label: 'Red',
              type: 'radio',
              accelerator: 'CmdOrCtrl+R',
              click: () => showMessage('Red'),
            },
            {
              label: 'Green',
              type: 'radio',
              accelerator: 'CmdOrCtrl+G',
              click: () => showMessage('Green'),
            },
            {
              label: 'Blue',
              type: 'radio',
              accelerator: 'CmdOrCtrl+B',
              click: () => showMessage('Blue'),
            },
          ],
        },
        {
          label: 'Shape',
          submenu: [
            {
              label: 'Square',
              type: 'radio',
              accelerator: 'CmdOrCtrl+S',
              click: () => showMessage('Square'),
            },
            {
              label: 'Rectangle',
              type: 'radio',
              accelerator: 'CmdOrCtrl+R',
              click: () => showMessage('Rectangle'),
            },
            {
              label: 'Oval',
              type: 'radio',
              accelerator: 'CmdOrCtrl+O',
              click: () => showMessage('Oval'),
            },
          ],
        },
        {
          label: 'Bold',
          type: 'checkbox',
          accelerator: 'CmdOrCtrl+Shift+B',
          click: () => showMessage('Bold'),
        },
      ],
    },
    {
      label: 'Help',
      submenu: [
        {
          label: 'About',
          accelerator: 'CmdOrCtrl+A',
          click: () => dialog.showMessageBox({
            type: 'info',
            title: 'about',
            message: `GTK+ Code Demos
3.22.30
Running against GTK+ 3.22.30
Program to demonstrate GTK+ functions.
(C) 1997-2013 The GTK+ Team
This program comes with absolutely no warranty.
See the GNU Lesser General Public License, 
version 2.1 or later for details.`,
            buttons: ['Close'],
          }),
        },
      ],
    },
  ]);
  Menu.setApplicationMenu(menu);
...

Anschließend sollte das Menü zu sehen sein. Das Development-Menü wird nicht mehr angezeigt. Für ein größeres Projekt könnte es sinnvoll sein, ein Development-Menü zu erhalten, dass im Entwicklungsmodus angezeigt wird und bei Auslieferung ausgeschaltet wird.

electron-react-example-global-menu

Kontext-Menu

Die Demo-App besitzt auch ein Kontextmenü zur Textbearbeitung. Um dieses nachzubauen, gehen wir etwas anders vor. Wir erstellen es nicht mehr aus einem Template, sondern komponieren es zur Laufzeit.

Dementsprechend ergänzen wir unseren Code auch nicht mehr in der src/index.js, sondern in src/app.jsx.

Als Erstes definieren wir das Menü im Konstruktor unsere App-Komponente. Weil die Menu-Klasse nur im Hauptprozess zur Verfügung steht, müssen wir auf sie über das Remote-Objekt zugreifen.

Das Menü selbst ist sehr viel einfacher als das App-Menü gehalten. Wir fügen nur ein paar Standardfunktionen und einen Trenner in das Kontext-Menü ein. Wir machen dabei ausgiebig Gebrauch von der role-Option. Diese erlaubt uns, von Electron vordefinierte Standardmenüs zu verwenden.

    const menu = new remote.Menu();
    menu.append(new remote.MenuItem({ role: 'cut' }));
    menu.append(new remote.MenuItem({ role: 'copy' }));
    menu.append(new remote.MenuItem({ role: 'paste' }));
    menu.append(new remote.MenuItem({ role: 'delete' }));
    menu.append(new remote.MenuItem({ type: 'separator' }));
    menu.append(new remote.MenuItem({ role: 'selectall' }));
    this.menu = menu;
...
    this.onContextMenu = this.onContextMenu.bind(this);

Damit wir auf das Kontext-Menü zugreifen können, definieren wir einen onContextMenu-Handler für die Textarea. Dieser macht nichts anderes, als einfach das Kontextmenü zu öffnen und mit dem Hauptfenster zu verbinden.

  onContextMenu(event) {
    event.preventDefault();
    this.menu.popup({ window: remote.getCurrentWindow() });
  }
...
    <textarea id="TextField" onKeyDown={this.onInput} onContextMenu={this.onContextMenu} />

Jetzt kann man über der Textarea mit der rechten Maustaste ein Kontext-Menü aufrufen.

electron-context-example-context-menu

Mac-Menü

Das App-Menü unter Mac OS unterscheidet sich deutlich von den App-Menüs unter Windows und Linux.

In Mac OS gibt es 3 Standard Menüs, die jeder Anwendung bereitstellen sollte:

  • window
  • help
  • services

Zu diesem Zweck stellt Electron unter Mac OS einige Standard-Menüs über Rollen bereit. Diese helfen beim Aufbau des Menüs.

Als Erstes speichern wir in src/index.js das Template für das App-Menü in einer eigenen Variablen.

Dann passen wir die Rolle unsere Hilfe-Menüs an.

Als Nächstes fügen wir die beiden anderen Unter-Menüs in unserem App-Menü ein, falls wir uns auf einem Mac befinden. Dazu verwenden wir Standard-JavaScript-Methoden, um unser Template-Array zu erweitern.

electron-react-example-macos-menu

Wenn wir nun unsere Beispielanwendung auf einem Mac starten, wird das Menü im globalen Menü von Mac OS angezeigt.

Du findest den Source-Code für dieses Tutorial auf Github: https://github.com/rockiger/electron-react-example

Im letzten Teil werden wir uns um die Paketierung mit electron-forge kümmern.

Created with Dictandu

Epikur und Ubuntu-Linux

Anfang des Jahres habe ich einer Kundin die Epikur-Praxisverwaltung auf ihrem Ubuntu-Laptop installiert. Meine Kundin hat sich zum Jahresanfang mit einem halben Kassensitz selbstständig gemacht. Zur Abrechnung mit den gesetzlichen Krankenkassen benötigte sie den Anschluss an ein Lesegerät für Krankenkassenkarten.

Die Einrichtung der Telematikinfrastruktur spielte noch keine Rolle. Sie wird erst Mitte des Jahres vorgenommen. Da zum jetzigen Zeitpunkt noch nicht genug erforderliche Gerätschaften zur Verfügung stehen.

Im Folgenden möchte ich meine Erfahrungen und die meiner Kundin mit Epikur und Ubuntu beschreiben. Starten werde ich mit der Installation von Server und Client. Danach werde ich auf die Einrichtung des Kartelesegeräts und auf die Benutzung von Epikur eingehen.

Wer noch weitere Fragen zum Thema Epikur und Ubuntu hat, kann mich gerne unter marco@rockiger.com erreichen.

Warum Epikur und Ubuntu?

Auf meinen Rat hin verwendet die Kundin schon seit einiger Zeit Ubuntu. Zum Zeitpunkt der Installation von Epikur war für meine Kundin der Umstieg auf Windows kein Thema mehr.

Die Vorteile von Ubuntu gegenüber Windows liegen auf der Hand:

  • geringerer Ressourcenverbrauch
  • höhere Systemsicherheit
  • bessere Usability (zumindest aus Sicht meiner Kundin)
  • niedrigere Kosten

Die Unterstützung von Ubuntu war der ausschlaggebende Punkt für die Nutzung von Epikur. Epikur ist die einzige Praxisverwaltungssoftware, die Ubuntu unterstützt. Die Konkurrenten Elephant und Psyprax schieden wegen der fehlenden Ubuntu Unterstützung aus.

Installation von Epikur auf Ubuntu Linux

Weil eine Nutzung der Praxisverwaltungssoftware mit einem Tablet sichergestellt werden sollte, haben wir uns für die Server-Variante von Epikur entschieden. Die Epikur-Clients entsprechen der Einzelplatzvariante, nur dass sie sich eben beim Start mit einem Server verbinden.

Mit einem Epikur-Server können sich mehrere Clients verbinden. Mit einem Zusatzmodul ist es darüber hinaus möglich, ein HTML-Frontend zu betreiben. Es erlaubt, einen reduzierten Funktionsumfang von Epikur als Website zu nutzen – hierfür reicht der Browser des Tablets aus.

Ziel ist es, das Dokumentationen schon während der Therapie im Tablet eingegeben werden können, ohne die Notizen von Papier in die Praxisverwaltungssoftware zu übertragen. Alternativ einen Laptop während der Therapie zu benutzen, war für meine Kundin keine Option.

Es empfiehlt sich, im Vorfeld den Epikur-Server sowie den Client herunterzuladen. Beide sind ganz schöne Brocken, die circa 1 GB groß sind.

Installation des Epikur-Servers

Vorbereitend benötigt der Epikur-Server eine Java-Laufzeitumgebung. Auf der Website empfiehlt Epikur das Oracle Java 8 JDK 64 Bit. Ich habe aber das openjdk-8-jdk installiert. 

Nach mehr als 2 Monaten Nutzung gab es bisher noch keine Probleme mit dem Server und dem openjdk-8. Die freie Java-Variante passt sich meiner Erfahrung nach besser in Ubuntu ein und kann direkt aus den Paketquellen installiert werden:

sudo apt install openjdk-8-jdk

Danach wird der heruntergeladene Server installiert:

sudo apt install ./PFAD/ZUR/epikur4Server-x-all.deb 

apt sollte dabei die folgenden Abhängigkeiten installieren:

dependencies libbonobo2-0 libbonobo2-common libgnome-2-0 libgnome2-0 libgnome2-bin libgnome2-common libgnomevfs2-0  libgnomevfs2-common liborbit-2-0

Alternativ kann man den Epikur-Server auch mit Ubuntu Software installieren.

Nun kann man den Server mit epikur4Server starten. Der Start des Servers dauert circa 1 – 2 Minuten.

Der Epikur-Server unter Ubuntu nach dem Start
Der Epikur-Server unter Ubuntu nach dem Start

Nun kann man den Epikur-Server testen. Die genaue Konfiguration wurde von einem Service-Mitarbeiter von Epikur per Teamviewer vorgenommen.

Installation des Epikur-Clients

Für die Installation des Clients fordert Epikur laut Website die folgenden Abhängigkeiten: 

libxi6:i386 libxtst6:i386 libxrender1:i386 libgnome2-0:i386 libusb-0.1-4:i386 lib32stdc++6 libgtk2.0-0:i386 libxxf86vm1:i386 libgl1-mesa-glx:i386

Für was diese Bibliotheken notwendig sind, ist mir nicht klar. Der Client startet auch ohne sie.

Ich empfehle noch, den ttf-mscorefonts-installer zu installieren, damit die Arial-Schriftart installiert ist. Sie wird für manche Grafikanzeigen im Client benötigt.

Um alle Abhängigkeiten nutzt man am besten wieder die Kommandozeile:

sudo apt install libxi6:i386 libxtst6:i386 libxrender1:i386 libgnome2-0:i386 libusb-0.1-4:i386 lib32stdc++6 libgtk2.0-0:i386 libxxf86vm1:i386 libgl1-mesa-glx:i386 ttf-mscorefonts-installer

Den heruntergeladenen Epikur-Client installiert man mit:

sudo apt install ./PFAD/ZUR/epikur4Server-x-all.deb 

Oder man nutzt wieder Ubuntu Software. Um den Epikur-Client zu starten, benutzt man den Befehl epikur4Client. Es wird ein laufender Epikur-Server benötigt, damit der Epikur-Client starten kann. Sonst bricht der Start mit einer Fehlermeldung ab.

Der Epikur-Client unter Ubuntu nach dem Start (mit Dummy-Daten)
Der Epikur-Client unter Ubuntu nach dem Start mit Test-Daten.

Die exakte Konfiguration wurde auch hier vom Service-Mitarbeiter per Fernwartung durchgeführt.

Erfahrungen in der Praxis

Kartenlesegerät SCM eHealth500 unter Ubuntu

Bis zur Einrichtung der Telematikinfrastruktur benötigt meine Kundin noch eine Möglichkeit, Versicherungskarten einzulesen. Die Auswahl an Karten, die mit Ubuntu funktionieren, ist deutlich geringer als Geräte, die mit Windows funktionieren.

Das Kartenlesegerät SCM eHealth500 ist ein ausgelaufenes Produkt, das uns unter Ubuntu anfangs ein wenig Kopfzerbrechen bereitet hat. Anfangs war es uns nicht möglich, das Gerät zum Laufen zu bringen. Auch mithilfe des Service-Mitarbeiters nicht.

Nach Anfrage bei SCM wurde mir mitgeteilt, dass keine Weiterentwicklung der Treiber für Ubuntu 18.04 geplant ist.

Nach kurzer Zeit wurde uns aber glücklicherweise ein extra Treiberpaket von Epikur zur Verfügung gestellt, mit dem wir eingelesene Kartendaten auf den Epikur-Client übertragen konnten.

Beim Einlesen werden die Kartendaten erst mal auf dem kabellosen Kartenlesegerät zwischengespeichert. Bei Bedarf werden die Daten dann im Epikur-Client eingelesen.

Synchronisation der Kalenderdaten mit Google Calendar

Die einzige Funktion, die wir bis jetzt nicht zum Laufen bekommen haben, ist die Google-Calender-Synchronisation. Diese speichert Patienten-Termine anonymisiert in Google Calender. Damit hat der Therapeut seine Termine auch von unterwegs im Griff.

Nach mehreren Teamviewer-Sitzungen konnte das Problem noch nicht gelöst werden. Mittlerweile gab es aber Kontakt mit dem Entwickler des Google-Calendar-Moduls. Dieser arbeitet an einer Lösung des Problems. 

Cross-plattform Apps mit Electron und React Teil 2

Im letzten Teil haben wir eine Electron-Anwendung geschrieben, die auf der GTK-Demo-App basiert. Wir haben die grundsätzliche Struktur der Anwendung erstellt und die Funktionalität, die die Anwendung bereitstellt hinzugefügt.

In diesem Teil möchten wir nur nun die Optik der Anwendung entsprechend anpassen. Dazu werden wir als Erstes herausfinden, auf welchem Betriebssystem und mit welchem Fenstermanager die Anwendung läuft.

Ausgestattet mit dieser Information werden wir dann das jeweilige passende Stylesheet laden, um die Anwendung nativ aussehen zu lassen.

Das Ziel ist es nicht, dass die Anwendung 100 % so aussieht, wie eine Anwendung, die mit dem Window-Toolkit des Betriebssystems geschrieben ist. Unser Ziel ist es, dass die Anwendung mit vertretbarem Aufwand so aussieht, dass sie nicht als Fremdkörper wahrgenommen wird.

In welcher Umgebung läuft die App?

Und herauszufinden, in welcher Umgebung die App läuft, müssen wir eine kleine Javascript-Abfrage beim Start der Anwendung einbauen. Mit dieser Laden wird dann, damit wir ein spezifisches Stylesheet laden können.

Dazu öffnen wir die index.html-Datei, laden style.css für plattformunabhängige Styles und fügen folgendes Javascript ein.

<link rel="stylesheet" type="text/css" href="./styles/style.css">
  <script type="text/javascript"> 
    let cssUrl = '';
    if (process.platform === 'linux') {
      const execSync = require('child_process').execSync;
      const theme = execSync('gsettings get org.gnome.desktop.interface gtk-theme').toString().toLowerCase()
      
      if (theme.includes('adwaita')) {
        cssUrl = 'adwaita.css'
      } else if (theme.includes('arc')) {
        cssUrl = 'arc.css'
      } else if (theme.includes('OSC') || theme.includes('mac')) {
        cssUrl = 'mac.css';
      } else if (theme.includes('win')) {
        cssUrl = 'win.css';
      }
      
    } else if (process.platform === 'darwin') {
        cssUrl = 'mac.css';
    } else if (process.platform === 'win32') {
        cssUrl = 'win.css';
    }
    if (cssUrl) {
        document.write('<link rel="stylesheet" type="text/css" href="./styles/'+ cssUrl +'">');
        }
  </script>

Dabei nutzen wir die process-Bibliothek von NodeJS und schauen als Erstes auf welchem Betriebssystem wir uns befinden. Befinden wir uns auf einem Mac- oder einem Windows-Rechner, nutzen wir die CSS-Datei mac.css oder win.css.

Für den Fall, dass wir uns auf einem Linux Rechner befinden haben wir noch eine kleine Besonderheit eingebaut: Wir führen mit NodeJS eine Kommandozeilen-Abfrage durch, die uns den Namen des aktuellen Themes zurückgibt. Dementsprechend verwenden wir nun die passende CSS-Datei.

Die Auswahl des Themes lässt sich beliebig erweitern, da ich persönlich das Arc-Theme verwende, werden wir uns auf dieses konzentrieren. An dieser Stelle muss jeder selbst entscheiden, mit wie viel Aufwand er Linux-User zu unterstützen möchte. Ich könnte mir vorstellen, dass ein Theme für Ubuntu-Nutzer auch noch sinnvoll wäre. Dies könnte eine gute Übung sein.

Cross-platfform Styling

Um nun ein plattform-gerechtes Styling der Einzelkomponenten zu kreieren, müssen wir diverse CSS-Dateien anlegen. Dazu erstellen wir den Ordner styles im src-Verzeichnis. Für jede angegebene CSS-Dateien müssen wir nun eine anlegen.

Als Erstes entfernen wir jegliche Inline-Styles aus unseren Komponenten. Sonst können wir diese nur mühsam überschreiben.

Im neu geschaffenen styles-Verzeichnis legen wir nun die Datei style.css an. In diese Datei kommen alle Style-Informationen, die wir vorher inline eingefügt hatten. Für die Farben legen wir CSS-Variablen fest. 

:root{
    --fg_color: #5c7080;
    --text_color: #182026;
    --bg_color: rgb(245, 248, 250);
    --borders: rgb(206, 217, 224)
}

#Layout {
    display: flex;
    flex-direction: column;
    height: 100vh;
}

.bp3-button { cursor: default; }

#TextField {
    height: 100%;
    flex-grow: 1;
    overflow: auto;
    border: none;
    resize: none;
    outline: none;
}

#StatusBar {
    background-color: var(--bg_color); 
    border-top: 1px solid var(--borders);
    color: var(--text_color);
    height: 50px;
    padding: 12px;
}

Das hat den Vorteil, dass man nur durch den Austausch der Farben schon unterschiedliche Themes erstellen kann. Soweit so gut. 

Um nun das Arc-Theme nachzubauen, benötigt man nur wenige Zeilen CSS. Zumindest für unsere Beispielanwendung.

Als Erstes überschreiben wir die CSS-Variablen für die verwendeten Farben. Dann passen wir noch Details der einzelnen Komponenten an.

:root {
    --window_bg: #e7e8eb;
    --window_fg: hsla(222, 18%, 39%, 0.8);
    --button_hover_bg: #fdfdfd;
    --button_hover_border: #D1D3DA;
    --selected_bg_color: #5294e2;
    --selected_fg_color: #ffffff;
}

.bp3-navbar {
    background-color: var(--window_bg);
    padding: 0 5px;
    height: 40px;
}
.bp3-navbar-group {
    height: 40px;
}
.bp3-button .bp3-icon {
    color: var(--window_fg)
}
.bp3-button {
    min-width: 35px;
    min-height: 30px;
}
.bp3-button.bp3-minimal:hover {
    background-color: var(--button_hover_bg);
    border: 1px solid var(--button_hover_border);
}
.bp3-menu-item { padding: 1px 7px; }
.bp3-menu-item:hover, .bp3-button.bp3-minimal:active, .bp3-button.bp3-minimal.bp3-active  { 
    background-color: var(--selected_bg_color); 
    color: var(--selected_fg_color);
}
:focus {
    outline: none;
}

#StatusBar {
    max-height: 38px;
    padding: 10px;
}

Das Ergebnis sieht wie folgt aus:

Das Gleiche machen wir noch für das MacOS- und für das Windows-Theme. Wir brauchen dafür jeweils nur wenige Zeilen CSS.

:root {
    --window_bg: #e7e8eb;
    --window_fg: hsla(222, 18%, 39%, 0.8);
    --button_hover_bg: #fdfdfd;
    --button_hover_border: #D1D3DA;
    --selected_bg_color: #5294e2;
    --selected_fg_color: #ffffff;
}

.bp3-navbar {
    background-color: var(--window_bg);
    padding: 0 5px;
    height: 40px;
}
.bp3-navbar-group {
    height: 40px;
}
.bp3-button .bp3-icon {
    color: var(--window_fg)
}
.bp3-button {
    min-width: 35px;
    min-height: 30px;
}
.bp3-button.bp3-minimal:hover {
    background-color: var(--button_hover_bg);
    border: 1px solid var(--button_hover_border);
}
.bp3-menu-item { padding: 1px 7px; }
.bp3-menu-item:hover, .bp3-button.bp3-minimal:active, .bp3-button.bp3-minimal.bp3-active  { 
    background-color: var(--selected_bg_color); 
    color: var(--selected_fg_color);
}
:focus {
    outline: none;
}

#StatusBar {
    max-height: 38px;
    padding: 10px;
}
:root {
    --window_bg: #fffff;
    --window_fg: #000000;
    --button_hover_bg: #cce8ff;
    --button_hover_border: #0078d7;
    --selected_bg_color: #cce8ff;
    --selected_fg_color: #000000;
    --bg_color: #ffffff;
    --borders: rgba(16, 22, 26, 0.1);
}

.bp3-navbar {
    background-color: var(--window_bg);
    padding: 0 10px;
    height: 40px;
    box-shadow: 0 0 0 1px var(--borders);
}
.bp3-navbar-group {
    height: 40px;
}
.bp3-button .bp3-icon {
    color: var(--window_fg)
}
.bp3-button {
    min-width: 35px;
    min-height: 30px;
    border-radius: 0;
}
.bp3-button.bp3-minimal:hover, .bp3-button.bp3-minimal:active, .bp3-button.bp3-minimal.bp3-active  {
    background-color: var(--button_hover_bg);
    border: 1px solid var(--button_hover_border);
}
.bp3-menu-item { padding: 1px 7px; }
.bp3-menu-item:hover, .bp3-button.bp3-minimal:active, .bp3-button.bp3-minimal.bp3-active  { 
    background-color: var(--selected_bg_color); 
    color: var(--selected_fg_color);
}
:focus {
    outline: none;
}

#StatusBar {
    max-height: 45px;
    padding: 15px;
}

Fairerweise muss man dazu sagen, dass alle drei Theme ohne Gradienten auskommen und somit nur wenig Änderungen brauchen. Das Gnome Standard-Theme Adwaita nachzubauen, wäre deutlich aufwendiger.

Du findest den Source-Code für dieses Tutorial auf Github: https://github.com/rockiger/electron-react-example

Im nächsten Teil werden wir das Menü der gtk3-demo-application nachbauen und noch ein wenig Feinschliff betreiben.

Created with Dictandu

Cross-plattform Apps mit Electron und React Teil 1

Mit der Kombination aus Electron und React kann man sehr einfach Desktopanwendungen für Linux, Windows und Mac entwickeln. Die Kombination aus Electron und React ermöglicht einen angenehmen Entwicklungsworkflow, der den meisten anderen GUI-Frameworks weit voraus ist.

Ein Beispiel für eine Anwendung die mit React und Electron entwickelt wurde, ist Alva. Alva ist eine Anwendung um Prototypen für Web-Komponenten zu entwerfen.

Was ist Electron?

Electron ist ein Framework, um Desktop Anwendungen mithilfe von Web-Technologien zu entwickeln. Electron basiert auf dem Chromium-Browser und dem NodeJS-Framework.

Durch die Kombination von Chromium und NodeJS kann man gleichzeitig seine Web-Entwicklungs-Kenntnisse nutzen und trotzdem auf das Dateisystem bzw. die Hardware des Host-Rechners zugreifen.

Bekannte Beispiele für Anwendungen, die mit Electron geschrieben worden sind, sind die Text-Editor Atom und Visual Studio Code, die Desktop-Anwendung von Skype und der Slack Chat-Client. Electron ist vor allem bei Startups aus dem Silicon Valley sehr populär.

Durch die Verwendbarkeit von JavaScript-Bibliotheken kann man bei der Entwicklung von Electron-Apps auf einen riesigen Vorrat an nützlichen Frameworks zurückgreifen. Daher kann man auch React mit Electron verwenden.

Was ist React?

React ist eine JavaScript-Bibliothek zur Entwicklung von Benutzerschnittstellen. React wird von Facebook entwickelt und eignet sich besonders für die Entwicklung von Single-Page-Apps, wie sie häufig mit Electron entwickelt werden.

Das Besondere an der GUI-Entwicklung mit React ist, dass man seine Benutzerschnittstelle deklarativ entwickelt. Das heißt, man muss seine Web-Komponenten nicht selber verändern, wenn sich der zugrundeliegende Zustand der Anwendung verändert. Durch React passen sich die einzelnen Komponenten automatisch dem aktuellen Zustand der Anwendung an.

Dieses reaktive Verhalten ist auch der Namensgeber für React. Darüber hinaus bietet React noch einige interessanten Funktionen zum Zustands-Management, die bei Bedarf auch noch durch weitere Bibliotheken erweitert werden kann.

Warum Electron + React?

Die Kombination aus React und Electron bildet ein GUI-Framework, dass sehr gut dokumentiert ist, sehr Entwickler freundlich ist und auf ein riesiges Ökosystem zurückgreifen kann. Alles Eigenschaften, die die gängigen GUI-Frameworks, speziell unter Linux, so nicht bieten.

Erste Schritte

Im Folgenden gehe ich von grundlegenden JavaScript-Kenntnissen und Basiswissen in der Verwendung von Nodejs aus.

Als Erstes müssen wir Electron mit React aufsetzen. Das geht am leichtesten mit Electron Forge. Electron Forge ist ein Command-Line-Projekt. Mit dem sich Electron Projekte schnell aufsetzen lassen. Es stehen mehrere Templates zur Verfügung um schnell das passende Framework für Electron aufzusetzen. Neben React kann man beispielsweise auch TypeScript oder Angular mit Electron aufsetzen.

Um Electron Forge zu installieren und dann ein neues Electron-React Projekt zu starten, gibst du in einem Terminal folgenden Code ein:

npm install -g electron-forge
electron-forge init electron-react-example --template=react
cd electron-react-example
npm install
electron-forge start

Der Prozess dauert ein wenig, da die komplette Runtime von Electron heruntergeladen wird. Am Ende sollte dic ein Electron Fenster mit einer neuen React-App begrüßen.

Electron-React-Example

Eine weitere beliebte alternative Electron Apps mit React zu erstellen ist das Electron React Boilerplate. Ich habe mich für Electron Forge entschieden, weil die Optionen zur Paketierung der App aus meiner Sicht umfangreicher sind und besser funktionieren. Electron React Boilerplate bietet sehr umfangreiche Voreinstellungen für React, die mir mehr im Weg standen, als sie mir genutzt haben.

Warum kein create-react-app?

Ein Wort noch zu Create React App. Create React App ist das offizielle Tool von Facebook um neue React Apps zu erstellen. Allerdings ist Create React App ganz klar auf “echte” Web-Applikationen ausgelegt.

So verhindert Create React App die Benutzung von nativen Nodejs-Modulen. Damit degradiert es Electron zu einem einfachen Browser-Fenster. Sodass der eigentliche Sinn von Electron zerstört wird.

Am Ende steht folgende Verzeichnisstruktur:

/
├── LICENSE
├── node_modules
├── package.json
├── src
│ ├── app.jsx
│ ├── index.html
│ └── index.js
└── yarn.lock

Wir werden unsere Änderungen ausschließlich in src machen werden.

Eine Demo-App

Unsere Beispielanwendung wird ein Nachbau der gtk3-demo-application.

gtk3-demo-application

Schließlich wollen wir ja eine Alternative zur GUI-Entwicklung finden.

Du findest den Source-Code für dieses Tutorial auf Github: https://github.com/rockiger/electron-react-example

Eine erste Änderung

Um zu sehen, ob das Hot-Reloading von Electron Forge funktioniert, werden wir eine kleine Änderung an unserer App vornehmen, bevor wir richtig loslegen.

Dafür öffnen wir die Datei app.jsx und ändern den Platzhaltertext ab.

...
<h2>Demo Application</h2>
...

Sobald du die Datei geändert hast und abspeicherst, sollte sich auch der angezeigte Text in der Electron App ändern.

Um aus der Kombination von Electron und React ein richtiges GUI framework zu machen, benötigen wir noch eine weitere Bibliothek: BlueprintJS.

BlueprintJS ist ein UI-Toolkit für React. Es bietet eine große Anzahl an Komponenten, aus denen wir unsere Oberfläche bauen können. Um BlueprintJS zu installieren, geben wir folgenden Code in der Kommandozeile ein:

npm i @blueprintjs/core --save

Danach müssen wir noch die CSS-Datein einbinden. Dazu öffnen wir index.html und fügen folgenden Code ein vor dem </head>-Tag ein:

  <link href="../node_modules/normalize.css/normalize.css" rel="stylesheet" />
  <link href="../node_modules/@blueprintjs/core/lib/css/blueprint.css" rel="stylesheet" />
  <link href="../node_modules/@blueprintjs/icons/lib/css/blueprint-icons.css" rel="stylesheet" />

Wenn du nach der Änderung die Electron neu lädst (<Strg>+R), solltest du eine andere Schriftart sehen.

Um unsere Demoanwendung nachzubauen, werden wir wie folgt vorgehen: Zuerst werden wir die Toolbar nachbauen, dann werden wir ein Textfeld integrieren und abschließend die Statuszeile implementieren.

Der Einfachheit halber werden wir alles in einer Datei entwickeln. Bei einer echten Anwendung würden wir aus Gründen der Übersichtlichkeit die Komponenten in mehrere Dateien aufspalten.

Toolbar

Die Toolbar-Komponente heißt in BlueprintJS Navbar. Sie hat mindestens eine NavbarGroup als Tochter. Diese wiederum kann Buttons und Trenner als Töchter haben.

Um die Demo Applikation nachzubilden haben wir der Navbar 5 Töchter gegeben. Davon sind 4 Buttonn und eine ein Trenner. Den Button mit dem Pfeil nach unten haben wir in ein Popover gepackt, um das Menü zu repräsentieren.

Der Code für unsere App sieht wie folgt aus:

import React from 'react';
import {
  Button,
  Classes,
  Navbar,
  NavbarDivider,
  NavbarGroup,
  Popover,
  Menu,
  MenuItem,
} from '@blueprintjs/core';

export default class App extends React.Component {
  render() {
    return (
      <div id="Layout">
        <Navbar>
          <NavbarGroup>
            <Button className={Classes.MINIMAL} icon="folder-open" />
            <Popover content={<Menu><MenuItem text="File 1" /></Menu>}>
              <Button className={Classes.MINIMAL} icon="chevron-down" />
            </Popover>
            <Button className={Classes.MINIMAL} icon="small-cross" />
            <NavbarDivider />
            <Button className={Classes.MINIMAL} icon="properties" />
          </NavbarGroup>
        </Navbar>
      </div>);
  }
}

Wir importieren zuerst die benötigten Module und erweitern dann die App-Komponente. Jede React Komponenten-Klasse benötigt eine Render-Methode. Das Besondere der Render-Methode ist, dass man dort HTML und Javascript mischen kann. (Es gibt auch noch andere Komponenten. Die Besprechung würde hier aber zu weit fühern. Ich verweise daher auf die React-Dokumentation.)

Um das Verhalten der Toolbar nachzubauen, müssen wir nun den einzelnen Buttons eine onclick-Funktion geben.

import { remote } from 'electron';
const showMessageBox = remote.dialog.showMessageBox;
const app = remote.app;
...
            <Popover content={
              <Menu>
                <MenuItem
                  text="File 1"
                  onClick={() => showMessageBox({
                    type: 'info',
                    message: 'You activated action: "file1"',
                    buttons: ['Close'],
                  })}
                />
              </Menu>}
            >
              <Button className={Classes.MINIMAL} icon="chevron-down" />
            </Popover>
            <Button
              className={Classes.MINIMAL}
              icon="small-cross"
              onClick={() => app.quit()}
            />
            <NavbarDivider />
            <Button
              className={Classes.MINIMAL}
              icon="properties"
              onClick={() => showMessageBox({
                type: 'info',
                message: 'You activated action: "logo"',
                buttons: ['Close'],
              })}
            />
...

Da Electron zwischen Haupt- und Render-Prozess unterscheidet, können wir aus einem Render-Prozess ( Das ist immer das, was als Fenster dargestellt wird.) auf den Hauptprozess nur zugreifen, wenn wir das Remote-Modul importieren.

Dies haben wir in den ersten drei Zeilen gemacht: Wir haben das Remote-Modul importiert und dann die Methode ShowMessageBox und das App-Objekt in zwei Konstanten gespeichert.

Die eigentlichen Click-Handler sind sehr einfach gehalten. Aus diesem werden nur die importierten Electron Methoden aufgerufen. Das Ordnersymbol hat übrigens keinen Click-Handler bekommen, weil dies in der Demo App auch so ist. Allerdings könnte es eine gute Übung sein, mit einem Klick auf das Ordnersymbol einen Öffnen-Dialog zu zeigen.

Fertige Toolbar

Textfeld

Als nächstes werden wir das Textfeld einfügen. Hier bedienen wir uns einer HTML-Textarea.

Es muss dazu gesagt werden, dass dies kein vollständiger Text-Editor ist. Eine Textarea hat nur eine eingeschränkte API. Es sind viele Bibliotheken auf dem Markt, um leistungsfähige Editoren in eine Website zu integrieren.

Bekannte Bibliotheken, die gut mit React funktionieren sind draft.js und slate.js. Laut diesem Github-Issue soll eine Lösung auf Basis von draft.js demnächst in Blueprint landen. Allerdings ist dieses Ticket schon relativ alt und ich weiß nicht, wann diese Lösung eingeführt wird.

Um unser Layout wie in der Demo-Application zu halten, müssen wir das CSS für das umschließende Element und den Editor ein wenig abändern. Wir nutzen Flexbox, damit das Textfeld den gesamten freien Raum des Fensters einnimmt.

...
<div id="Layout" style={{ display: 'flex', flexDirection: 'column', height: '100vh' }}>
...
</Navbar>
<textarea
  id="TextField"
  style={{
    height: '100%',
    flexGrow: 1,
    overflow: 'auto',
    border: 'none',
    resize: 'none',
    outline: 'none',
  }}
/>
...

Statusbar

Abschließend erstellen wir noch unsere Statusbar. Diese stellt uns neben dem eigentlichen Layout, noch vor eine zweite Aufgabe: Wir müssen nämlich die Cursorposition und die Anzahl der Zeichen in der Statusbar anzeigen.

Das Layout ist schnell erstellt. Wir erstellen ein HTML Element, das eine Höhe von 50 Pixel hat und einen leicht grauen Hintergrund. Hierzu verwenden wir vordefinierte Farben von Blueprint und schreiben sie in das Style-Attribut der Statusbar.

...
  Colors,
} from '@blueprintjs/core';
...
<div
  id="StatusBar"
  style={{
    backgroundColor: Colors.LIGHT_GRAY5,
    borderTop: `1px solid ${Colors.LIGHT_GRAY1}`,
    height: '50px',
    padding: 12,
  }}
/>
</div>);
  }
}

Aufwändiger wird es nun, die Statistik über das Textdokument zu erstellen. Hierfür müssen wir Zustand in React einführen. Das Tolle an React ist, das bei Veränderungen des Zustands die betroffenen Komponenten aktualisiert werden. Das erlaubt es ein sehr simples Zustandsmodell der Applikation zu entwerfen. Wer noch gar keine Erfahrung mit React hat, sollte an dieser Stelle mit dem offiziellen Tutorial auseinandersetzen und dann hierher zurückkommen.

Als erstes führen wir eine Zustandsvariable statistic ein und initialisieren diese. Darüber hinaus wollen wir deren Inhalt in der Statusbar darstellen.

Als Erstes legen wir einen Konstruktor für unsere Komponente an, in der wir die Zustandsvariable definieren. Wo wir gerade im Konstruktor sind, binden wir noch eine Methode an das this-Objekt der Komponenten. Die Methode werden wir gleich erstellen.

...
export default class App extends React.Component {
  constructor() {
    super();
    this.state = {
      statistic: {
        row: 0,
        col: 0,
        chars: 0,
      },
    };
    this.onInput = this.onInput.bind(this);
  }
...

Als nächstes ergänzen wir das Textfeld um ein onKeyDown-Attribut. Damit wir Nutzer-Eingaben abfangen können. Um die Änderung der Textarea nun von unserer Statusbar darstellen zu können, fügen wir folgenden Text innerhalb des Elements ein.

...
<textarea
  id="TextField"
  style={{
    height: '100%',
    flexGrow: 1,
    overflow: 'auto',
    border: 'none',
    resize: 'none',
    outline: 'none',
  }}
  onKeyDown={this.onInput}
/>
...

Dabei erlaubt uns React mit den geschweiften Klammern direkt auf die Zustandsvariable der Komponente zuzugreifen. Bei jeder Änderung der Zustandsvariablen wird die Komponente aktualisiert.

<div
  id="StatusBar"
  style={{
    backgroundColor: Colors.LIGHT_GRAY5,
    borderTop: `1px solid ${Colors.LIGHT_GRAY1}`,
    height: '50px',
    padding: 12,
  }}
>
  Cursor at row {this.state.statistic.row} column  
  {this.state.statistic.col} - 
  {this.state.statistic.chars} chars in document
</div>

Zu guter Letzt schreiben wir noch eine einen Event-Handler für Nutzer-Eingaben. Dieser passt den Zustand der Komponente der aktuellen Cursorposition des Textfeldes an. Achtung: Der Event-Handler berücksichtigt nicht die typische Vorgehensweise in React. Er dient nur zur Veranschaulichung des reaktiven Charakters von React. Ich möchte an dieser Stelle nicht noch weitere React-Konzepte wie Referenzen oder Props einführen.

...
  onInput() {
    const textField = document.querySelector('#TextField');
    const textBeforCaret = textField.value.slice(0, textField.selectionStart);
    const rows = textBeforCaret.split('\n');
    const row = rows.length;
    const col = rows.pop().length;

    this.setState({ statistic: {
      row,
      col,
      chars: textField.value.length,
    } });
  }

  render() {
...

Wenn er nun unsere Anwendung anschauen ist diese der Beispielanwendung von GTK sehr ähnlich. 

Fertige Electron-React-Demo-Application

Im nächsten Teil, werden wir die Optik der App anpassen, um das Feeling der App noch “nativer” erscheinen zu lassen. Später werden wir noch das Menü entsprechend abändern, dass es die gleiche Funktionalität umfasst wie in der gtk3-demo-application.

Created with Dictandu

Top 10 Ubuntu Linux Audio Player

Auf der Suche nach einem Music-Player für Ubuntu? Keine Ahnung wo du suchen sollst? Ich habe euch die 10 besten Music-Player für Ubuntu zusammengestellt – die ich finden konnte. Mit dieser Auswahl könnt ihr loslegen und ausprobieren welcher Audio-Player euch unter Ubuntu am besten gefällt.

Als Unterstützung habe ich jeweils eine PPA und eine Installations-Anleitung angegeben. Damit könnte ihr bequem, die jeweils neueste Version installieren

Audacious

Ubuntu Linux Audioplayer Audacious

Vorteile

  • leichtgewichtig
  • sowohl GTK-Skin als auch klassisches Winamp-Skin
  • sehr übersichtliche Benutzeroberfläche

Nachteile

  • keine Musikbibliothek

Installieren

sudo apt-get install audacious audacious-plugins

Banshee

Ubuntu Linux Audioplayer Banshee

Vorteile

  • guter Kompromis aus Funktionumfang und Benutzerfreundlichkeit

Nachteile

  • benötigt das Mono-framework

Installieren

sudo apt-get install banshee

Clementine

Vorteile

  • gute Performance, trotz hohen Funktionsumfangs
  • Cross-Platform

Nachteile

  • keine GTK-Anwendung

Installieren

sudo apt-get install clementine

Qmmp

Vorteile

  • schnell
  • unterstützt WinAmp-Skins

Nachteile

  • häßlicher Standardskin
  • keine GTK-Anwendung
  • keine Musikbibliothek

Installieren

sudo apt-get install qmmp

Quod Libet

Ubuntu Linux Audioplayer Quod Libet

Vorteile

  • leistungsfähige Bibliotheksfunktion

Nachteile

  • unaufgeräumte Oberfläche

Installieren

sudo apt-get install quodlibet

Rhythmbox

Ubuntu Linux Audioplayer Rhythmbox

Vorteile

  • großer Funktionsumfang
  • standard in Ubuntu

Nachteile

Installieren

sudo apt-get install rhythmbox

Lollypop

Ubuntu Linux Audioplayer Lollypop

Vorteile

  • großer Funktionsumfang
  • moderne Umsetzung eines Audioplayers

Nachteile

  • sehr auf Gnome zugeschnitten

Installieren

sudo add-apt-repository ppa:gnumdk/lollypop

sudo apt-get update

sudo apt-get install lollypop

Tomahawk

Ubuntu Linux Audioplayer Tomahawk

 

Vorteile

  • unterstützt viele Musikdienste im Internet

Nachteile

  • langsam

Installieren

sudo apt-get install tomahawk

Spotify

Ubuntu Linux Audioplayer Spotify

 

Vorteile

  • einzige Möglichkeit mit einem kostenlosen Account Spotify zu hören

Nachteile

  • langsam
  • umständliche Installation
  • basiert auf Webtechnologien

Installieren

echo deb http://repository.spotify.com stable non-free | sudo tee /etc/apt/sources.list.d/spotify.list

sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com BBEBDCB318AD50EC6865090613B00F1FD2C19886

sudo apt-get update && sudo apt-get install spotify

Musique

Vorteile

  • ansprechendes Design
  • leichtgewichtig

Nachteile

  • ein wenig spartanisch in der Ausstattung

Installieren

sudo apt-get install musiqe

Diese Liste ist natürlich hoch subjektiv – also nicht gleich auf mich einschlagen. Ich persönlich nutze momentan entweder Audacious oder Spotify; Welchen Music-Player benutzt ihr?

Wer noch bessere Audio-Player kennt, ist natürlich aufgefordert, diesen in den Kommentaren zu vermerken.