Convert pdf to png on ubuntu

To convert a pdf document to an png document one can use the terminal.
– Install imagemagick on your system
– Open the folder that holds your pdf document in the terminal
convert -density 150 {filename.pdf} -quality 90 {filename.png}

Each page from the pdf document is now a png file.

Enable Twig Components in Pimcore

I installed Symfony’s Twig Components in Pimcore to test if and how to do that.

A small warning ahead: This feature is still experimental, as their documentation titles.

To install the components in Pimcore simply install the components bundle via composer

composer require symfony/ux-twig-component

Now you need to tell Pimcore about this bundle in config/bundles.php

// config/bundles.php
return [
...
Symfony\UX\TwigComponent\TwigComponentBundle::class => ['all' => true],
];

It is installed and ready to be setup.
Depending on the specific setup these steps might vary, adjust accordingly

  1. Register the components in the services.yaml and make them public
  2. Create the components-class
  3. Create the components-template
  4. Use the template in your code e.g. the default-template
// services.yaml
AppBundle\Components\:
    resource: '../../Components'
    public: true
// src/Components/AlertComponent.php
namespace App\Components;

use Symfony\UX\TwigComponent\Attribute\AsTwigComponent;

#[AsTwigComponent('alert')]
class AlertComponent
{
    public string $type = 'success';
    public string $message;
}
{# templates/components/alert.html.twig #}
<div class="alert alert-{{ type }}">
    {{ message }}
</div>
{{ component('alert', { message: 'Hello Twig Components!' }) }}

Software sollte dem User dienen

Meinung zu TikTok-Feature und ungleiche Machtverteilung bei Software

Heise.de (Link) hat über einen neuen automatischen “Filter” bei Tiktok berichtet Quelle. Dieser Filter verändert automatisch das Gesicht des Users (Kinnpartie) und die Haut (Weichzeichner) ohne, dass diese Option dekativiert werden kann.

Tiktok hat diesen “Fehler” nach Anfrage behoben.

Ich finde das ein sehr tolles Beispiel dafür wieviel Macht die Programmierer der Software bei Closed-Source-Progammen gegenüber den Usern haben. Wird ein solches “Feature” aktiviert können die User nur darauf hoffen, dass die Entwickler so nett sind und eine Option zum Deaktivieren anbieten oder das Feature wieder entfernen.

Bei Open-Source-Software kann ich als User ein Programm selbst anpassen (anpassen lassen) und dieses dann weiter verwenden.

Find all missing entries in two files

I have two csv-Files containing 30k customer information and should only return the customers missing in file1. Usecase: accidentially deleted some data (~1800) and need to import the deleted one, instead of importing 30k data and skip if they exist.

I did this via a small shell-script. The script can be downloaded and used here:

View Gist on Github

This is the magic

grep -v -f <(tr ',' '\n' < "${patterns}") "${search}"

-v negates the search

Pimcore: Create pages via PHP-Code (incl. editables)

I was given the task to create pages of existing data. The challenge: the pages contain editables and these editables should be filled by pre-existing data.

All editables must be created prior to creating pages with the content.

A editable consists of one or multiple elements. each element must be created individually and later added to the areablock which than is saved as a page.

The areablock is created with a name and later on all content gets connected via the name. In this example it is named content for the ease of use.

This code creates a page construct, sets editables and saves it to the database

<?php

$editablesOnPage = [];

$pageInformationYouWantToCreate = [
    'page_title' => 'My first page',
    'folder_path' => '/',
    'seo_description' => 'Pages seo description',
    'seo_title' => 'Seo Title, if needed',

];

$positionOnPageFor = [
    'headline' => 1,
    'wysiwyg' => 2,
];

$foldertoCreateThePageUnder = 1; // Root folder id
$areaBlockName = 'content';

$importPage = new \Pimcore\Model\Document\Page();
$importPage->setKey($pageInformationYouWantToCreate['page_title']);
$importPage->setPath($pageInformationYouWantToCreate['folder_path']);
$importPage->setType('page');
$importPage->setTitle($pageInformationYouWantToCreate['page_title']);
$importPage->setDescription($pageInformationYouWantToCreate['seo_description']);
$importPage->setMetaData([
    'seoTitle' => $pageInformationYouWantToCreate['seo_title'],
]);
$importPage->setParentId($foldertoCreateThePageUnder);
$importPage->setController('Default');

$blockArea = new \Pimcore\Model\Document\Editable\Areablock();
$blockArea->setName($areaBlockName);

// Headline
if ($pageInformationYouWantToCreate['headline_title']) {
    $headline = new \Pimcore\Model\Document\Editable\Input();
    $headline->setName(sprintf('%s:%s.title', $areaBlockName, $positionOnPageFor['headline']));
    $headline->setDataFromEditmode($pageInformationYouWantToCreate['headline_title']);
    $editablesOnPage[] = $headline;
}

// Wysiwyg
if ($pageInformationYouWantToCreate['content_text']) {
    $wysiwygComponent = new \Pimcore\Model\Document\Editable\Wysiwyg();
    $wysiwygComponent->setName(sprintf('%s:%s.text', $areaBlockName, $positionOnPageFor['wysiwyg']));
    $wysiwygComponent->setDataFromEditmode($pageInformationYouWantToCreate['content_text']);
    $editablesOnPage[] = $wysiwygComponent;
}

$blockArea->setDataFromEditmode([
    [
        'key'    => $pageInformationYouWantToCreate['headline'],
        'type'   => 'heading',
        'hidden' => false,
    ],
    [
        'key'    => $pageInformationYouWantToCreate['wysiwyg'],
        'type'   => 'wysiwyg',
        'hidden' => false,
    ]
]);

array_unshift($editablesOnPage, $blockArea);
$importPage->setEditables($editablesOnPage);

$importPage->save();

Einmal Apple und zurück

Ich hab mir vor Jahren einen iPod Nano 4th Generation gekauft und war immer sehr zufrieden damit. Ich konnte normale 3,5mm Kopfhörher verwenden, auch solche die nicht von Apple waren, und mit meinem damaligen Windows- und Linux-Rechner Musik aufspielen.
Nachdem dieser iPod in die Jahre gekommen ist kaufte ich mir einen neuen iPod, mein erstes Apple-Gerät, dass komplett auf Touch basiert. Selbst bei diesem iPod hatte ich noch die Möglichkeit mit Linux Musik aufzuspielen und selbst in alten Autos mit Kasseten-Radio konnte ich den iPod noch verwenden.

Apple stellte zwar mit iTunes eine einfach Möglichkeit zur Verfügung Musik zu verwalten, aber es war nicht ausschließlich über iTunes möglich.

Es folgten weitere Apple Produkte, iPhone 7, MacBook Pro, iPhone 11 und Apple Watch.

Die einfache Integration auf Linux-Basis macht es sehr attraktiv und einfach zu nutzen, der “Vendor lock-in” die Abhängigkeit von einem Anbieter empfand ich damals nicht so schlimm.

Es gab regelmäßige Updates, bei Android haben mich die fehlenden Updates nach kurzer Zeit (1 – 2 Jahre) immer gestört. Somit war nach kurzer Zeit das Handy ohne Sicherheitsupdates und auch neue Android-Versionen gab es somit eher selten. Auch ein zu dieser Zeit “Flagship Modell” stellte keine Garantie da Updates oder neue Android-Versionen zu bekommen.

Subjektiv war es für mich zu dieser Zeit auch noch nicht so schlimm. Wie bei Drogendealern: der erste Schuss ist gratis und von da an gings bergab.

Schlimmer mit jedem Update

Meine Reise ins Apple-Land begann 2015 mit meinem MacBook Pro. Brav wie ich bin hab ich auch immer schön die Updates installiert und mehr und mehr auf die mitgelieferte Software gesetzt: Pages, Numbers, Mail und Fotos. Es hat wunderbar funktioniert und war schön mit dem iPhones integriert.

Nach und nach kamen Systemupdates und damit auch neue Feature. Eines der Gründe für Apple waren regelmäßige Sicherheitsupdates, auch auf dem iPhone, die ich gerne eingespielt habe.

Beim iPhone war es dann nach und nach nichtmehr möglich von anderen Systemen (wie Ubuntu) direkt auf die Fotos zuzugreifen oder Dateien wie mp3 auzutauschen.
MacOS sendet jedes Programm, dass geöffnet wird an Apple zur “Überprüfung” ob das Programm zugelassen ist. Mit welchem Recht darf Apple denn wissen welches Programm ich wann und wie oft am Tag nutze?

Zum Glück gibt es freie Alternativen und ich kann auf meinem MacBook recht einfach Ubuntu installieren. Dank der neuen “Sicherheits”-Chips ist dies nichtmehr ohne weiteres möglich auf neueren MacBooks.

Die Hardware funktioniert noch super und nach den Jahren ohne Probleme, die Software ist das Problem, aber es hat sich ja zum Glück einfach austauschen lassen.
Beim iPhone wird es hier schon schwieriger.

Weitere Updates folgen.

Create custom form themes for Dachcoms Formbuilder Plugin in Pimcore

From time to time you want to overwrite the default templates for forms in pimcore.
I had some problems to find the information I need as they are spreaded widley.

To get it to work it should look like this:

Filestructure

# src/AppBundle/Resources/config/pimcore/config.yml
form_builder:
form:
templates:
ivoclar_div_layout:
value: 'my_form_div_layout.html.twig'
label: 'Custom form layout'
default: true
{# tempaltes/bundles/FormBuilderBundle/Form/Theme/Macro/my_form_div_layout.html.twig #}
{% macro form_builder_form_head() %}
{% endmacro %}

{% macro form_builder_form_foot() %}
{% endmacro %}

{% macro form_builder_form_message(flash_messages) %}
{% if flash_messages is not empty %}
{% for label, messages in flash_messages %}
{% for message in messages %}
<div class="message message-{{ label }}">
{{ message|raw }}
</div>
{% endfor %}
{% endfor %}
{% endif %}
{% endmacro %}
{# tempaltes/bundles/FormBuilderBundle/Form/Theme/my_form_div_layout.html.twig #}
{% extends "form_div_layout.html.twig" %}

{%- block widget_attributes -%}
id="{{ id }}" name="{{ name }}"
{%- if disabled %} disabled="disabled"{% endif -%}
{%- if required %} required="required"{% endif -%}
{{ block('attributes') }}
{%- endblock widget_attributes -%}

Overwrite field-names with a template

In Pimcore I’m using https://github.com/dachcom-digital/pimcore-formbuilder to create input forms in my project.
I have the problem that the default input names are not the once I need for my task.

Default names
<input .. name="formbuilder_1[task]"
<input .. name="task"

I created a form theme to overwrite it

{# /templates/bundles/FormBuilderBundle/Form/Theme/myform_div_layout.html.twig #}
{% extends "form_div_layout.html.twig" %}

{%- block widget_attributes -%}
    id="{{ id }}" name="{{ name }}"
    {%- if disabled %} disabled="disabled"{% endif -%}
    {%- if required %} required="required"{% endif -%}
    {{ block('attributes') }}
{%- endblock widget_attributes -%}

The default name is {{full_name}}, replaced with {{name}} returns the fieldname I’ve set in the formbuilder form.

Toniebox und die Cloud

Liebe Eltern: lest die AGB’s solcher Spielzeuge für Kinder

Hier ein Auszug aus den AGB’s der Toniebox

Phoniebox AGB Stand: 06.07.2020 19:39 Uhr

Ich habe hier nicht schlecht geschaut was sie dann alles wissen.

Warum ist das denn so schlimm?

Ganz einfach: alles was ein Kind mit der Box macht, egal was, wird an den Hersteller geschickt. Was ist denn daran so schlimm? Der Hersteller kann aus den Daten alles Mögliche sehen

  • Wann steht das Kind auf
  • Wann geht es ins Bett
  • Gibt es bestimmte Lieder die zur selben Zeit laufen (Gute-Nacht-Lied, Lieblingslied)
  • Welche Titel werden übersprungen
  • Geburtstag (es kommen während des Jahres an einem Tag immer neue Figuren hinzu)
  • Funktioniert die Werbung für Toniefiguren (Eltern kriegen Werbung für die Figuren, bestellen diese dann oder leihen sie aus, das Kind spielt diese dann ab)
  • Stimmung des Kindes könnte anhand der gespielten Lieder abgelesen werden
  • Wie oft spielt das Kind an der Toniebox (könnte Rückschluss geben ob das Kind viel alleine spielt)

Das sind nur einige Punkte die mir einfallen, wass mit den Daten möglich ist. Gleicht man dann noch die Mailadresse des Cloud-Account-Erstellers mit einem Werbenetzwerk ab ergeben sich seehr viele tolle Möglichkeiten euch zum Kauf zu verleiten.

Meine Probleme mit der Cloud

Ihr entscheidet euch für die Toniebox und den Cloudaccount, der “anonym” erstellt werden kann und es müssen ganz wenig Daten angegeben werden. Nun die Toniebox funktioniert nicht ohne Cloud.
Eine neu gekaufte Figur funktioniert nur, wenn die Toniebox Zugang zur Cloud hat um die Daten nachzuladen. Ohne diesen Zugang: keine Musik.
Wer in Gegenden mit schlechtem Internet wohnt oder nur einen LTE-Router hat wird darüber nicht begeistert sein.
Die Box lädt sich die Musik herunter und speichert diese auf der Box selbst zur Verwendung ohne Internet, im Auto oder bei Freunden.
Der interne Speicher ist begrenzt und es werden einfach ältere Lieder überspielt und müssen bei Bedarf neu geladen werden.

Soweit ich es gefunden habe sind nur 8GB interner Speicher verbaut. Wer viele Hörbücher etc hat muss diese unter Umständen nachladen.

Money for nothing

Der Hersteller beschließt plötzlich 5 oder 10 € im Monat für die Clouddienste zu verlagen. Die Kinder sind schon so dran gewöhnt, dass man das als Eltern vmtl zahlen würde oder eine nutzlose Box zu Hause stehen hat die keine neuen Lieder mehr laden kann.

Abschaltung oder Probleme mit der Cloud beim Hersteller

Wo Menschen arbeiten passieren Fehler, das ist normal und auch gut so, daraus kann man lernen. Was passiert wenn die Cloud nichtmehr erreichbar ist aber das Kind Geburtstag hat und viele neue Figuren geschenkt bekommt die zwar auf der Toniebox stehen können aber keine Musik spielen?

Auch schon geschehen: Firmen mit Cloud diensten wurden gekauft und die Dienste abgeschaltet. Was macht ihr dann mit der Toniebox?
Die Toniebox kann leider nicht anders bespielt werden als durch die Cloud.

Fazit

Die Toniebox kommt für mein Kind nicht in Frage und schon gar nicht in mein WLAN.

Mein Phoniebox Build

Es gibt die sehr beliebte Toniebox https://tonies.de/toniebox/ die viele Eltern kennen und auch schätzen. Es ist ein würfelförmiger Musikspieler für Kinder bei dem die Musik mittels Figuren abgespielt werden können. Klopft das Kind auf eine Seite so wird der nächste oder vorherige Titel abgespielt.

Ich hab diese Box bereits bei Freunden gesehen und fand gut gemacht und ein interessantes Konzept. Also hab ich mich mal eingelesen und auch die AGB’s gelesen.

Meine Motivation für den Eigenbau

Ich hab mich ein wenig mit der Toniebox beschäftigt, die AGB’s angeschaut und das Konzept mit der Cloud genauer durchdacht. Mehr Details gibt es im eigenen Artikel dazu.

Alternativen zur Toniebox

Wie bereits erklärt hat mich die Toniebox von der Idee überzeugt, aber das rundherum passt mir einfach nicht.

Welche Möglichkeiten gibt es für einen MP3 Player der für die Kleinsten gut zu bedienen ist, aber für technisch interessiert Eltern nicht zu komplizert zu bauen?

Ich hatte noch einen Raspberry Pi 2 zu Hause und wollte den dafür verwenden. Ich bin dann auf das tolle Projekt von Micz Flor der Phoniebox gestoßen und war gleich begeistert.

Das Projekt ist Open-Source, einfach zu installieren und hat obendrein noch eine Weboberfläche zum Konfigurieren oder Bedienen der Box die in PHP geschrieben ist.

Ich war gleich davon begeistert.

Benötigte Teile

TeilPreis (Gesamt)
RaspiAb 10,83 € Raspi Zero-W
Arcade Buttons11,52 €
Powerbank11,80 €
RFID-Kartenleser3,83 € (War in nem Kit enthalten)
Ein-/Ausschalter2,77 €
Boxen10,25 €
Entstörfilter10,99 €
NFC Karten (10 Stk)5,74 €
Gesamt67,73

Die Arcade Buttons habe ich leider nicht lötfrei anschließen können, es gibt aber auch andere Buttons die Lötfrei verwendet werden können.

Zusammenbauen (Theorie)

Ich bin nach Anleitung auf der Wiki Seite der Phoniebox vorgegangen.

Erster Versuch in der Kiste
  • SD-Karte vorbereiten und Raspbian flashen
  • Raspberry Pi mittels HDMI-Kabel an einen Monitor anschließen (ist einfacher zur Fehlersuche etc)
  • Die Anleitung durchgehen und den Pi mit der Software der Phoniebox installieren
  • Wlan testen und Ip-Adresse fix hinterlegen, ganz wichtig, damit ich nachher wieder drauf verbinden kann falls es mal notwendig ist oder ich neue Musik aufspielen will
  • Musik aufspielen, dafür reichen 2 Lieder
  • Buttons mittels Breadboard testen, ob alles passt und klappt
  • Ich hab mir zuerst eine zu kleine Schachtel ausgesucht, das wäre sich mit den Buttons nie ausgegangen. Also gleich drauf achten, dass die Schactel/Kiste entsprechend groß ist

Ich hab erst alles auf dem Pi Zero eingerichtet und dafür eine USB-Soundkarte verwendet. Leider hatte ich hier Ground Noise und keinen passenden Filter dazu, also bin ich auf den Raspi 2 gewechselt.

Wer die Box nur zusammenbauen will sollte sich an die Anleitung und die entsprechenden Teile-Listen halte. Ich hab es dann mit einigem Ausprobieren hinbekommen. Eine Anleitung folgt noch.

Ich hatte leider keine passenden Kabellängen zu Hause, ich hab einfach ein Stück altes Telefonkabel auseinander genommen, an die Button und die Kabel mit der Buchse gelötet. Funktioniert super, die Kabel sind so lang, dass ich den Deckel ganz bequem aufklappen kann. Löten braucht seine Zeit, vorallem das Vorbereiten. Kabel abisolieren und zusammendrehen, an den Buttons befestigen. All das braucht leider seine Zeit, gelötet ist das nachher um einiges schneller. Egal es macht Spaß 🙂

Damit die Teile in der Box nicht umherfliegen habe ich Klettkabelbinder genommen und einfach mit Alles Kleber in der Box und auf den einzelnen Komponenten fixiert. Somit hält alles wunderbar, aber kann bei Bedarf noch ausgetauscht werden.

Anbringung einzelner teile mit Kklettverschluss

Fazit

Wenn alle Teile da sind ist es ein Wochenendprojekt. Ich glaub, dass ungeübte hier schon eine Weile dran sein werden. Ich habe mich Abends immer mal wieder ein paar Stunden damit beschäftigt und auch erstmal den Prototypen gebastelt und eine Weile liegen lassen.

Mit der Holzkiste kam neuer Schwung ins Projekt, ich hab die Buttons bestellt und mich hingesetzt, um es wirklich fertig zu kriegen und nicht nur als “proof-of-concept” in einer Ecke liegen zu haben.

Ich hab viel gelötet und auch wieder entlötet, Softwareseitig rumprobiert und Ideen für die Kiste im Netz gesucht. Letztlich ists eine einfach Holzkiste die noch verziert wird.

Dank des coolen Projektes von Micz Flors ist der Nachbau recht einfach und für technisch interessierte möglich. Man muss hier kein Profi sein, sollte aber auf jedenfall Spaß am Basteln haben.

Fertige Box
Innenansicht
Buttons unterseite