What does the -p option stand for in mkdir?

If you want to create several directories with the command mkdir you use the -p option. But what does the -p stand for? One could assume it stands for “Path”. But no. It stands for “parent”. And the flag is needed to create a parent directory if it is required. If you try to create a parent and a child directory without the p option, you would get an error.

Instead of -p you can also enter -parent. Both options work:

mkdir -p ParentFolder/ChildFolder
mkdir -paren ParentFolder/ChildFolder

Wofür steht das -p option bei mkdir?

Wenn man mit mkdir mehrere Verzeichnis mit Unterverzeichnis anlegen möchte benutzt man die -p Option. Aber wofür steht das -p eigentlich? Man könnte annehmen für “Path”. Es steht für “Parent”. Und der Flag ist erforedlich um ein Übergeordnetes Verzeichnis anzulegen, wenn es erforderlich ist. Wenn man ohne p Option versucht ein Parent und ein Child Verzeichnis anzulegen würde man einen Fehler erhalten.

Statt -p kann man auch -parent eingeben. Beide Möglichkeiten gehen:


mkdir -p ParentFolder/ChildFolder
mkdir -paren ParentFolder/ChildFolder

oder:

mkdir -p fall{1..10}/{1,2,3}


Und Du erhälst fall1, fall2,…,fall10 und mit jeweils 1, 2 and 3 Unterverzeichnissen.

Zwischen den Git Commits springen

Allgemein kann man zwischen den einzelnen Git Branches springen. Aber wie sieht es aus, wenn man zwischen einzelnen Commits innerhalb einer Branch springen will? Ein Fall wäre, man arbeitet an einem Feature. Ist immer Feature Branche ausgecheckt und setzt während der Entwicklung kleinere Commits ab. Dann kommt die Stelle wo man sagt, ok ich muss doch so machen wie ich es vorher hatte. Aber man hat bereits mehrer Commits abgesetzt und kann auch nicht mehr mit der IDE zurück springen. Man braucht diese eine Funktion von damals. Wie kommt man da ran?

`git log –oneline –all`

`git checkout 20963d0`

und ihr seid in dem commit von damals. Holt euch euren code den ihr braucht und springt mit git checkout commit id die auf euren master verweist zurück.

Switch between Git Commits

In general you can switch between the various Git Branches. But how it will look, if someone like to switch between the various Git Commits?

On case would be. You working on a feature. You checked out to the feature-branch and writing your code. You made some smaller commits. Then you will come to the point where you speak to your self: Hmm, better i do it like some commits before. But you already overrided this function and already fired some commits inner this feature branch. The recovery function from your IDE cant bringed back this function. It lost as well? You need this earlier function. But how can i get there.

Follow this steps:


git log --oneline --all
git checkout 20963d0

And you are checked out to the previoust commit with: git checkout 20963d0 .Fetch your code and jump back to your current commit. Because the old commit are “detached HEAD”. and any changes on this commit will delete your commits afterwards.

Laravel Mailhog Docker

Letztens wurde ich gefragt, wie ich Mail bei Laravel teste. Ich meinte ich habe einen SMTP Server den ich nutzen kann. Da meinte er, dass wäre zwar okay aber man könnte sich damit auch eine valide Mailadresse verbrennen. Mit verbrennen meint der Kollege, dass sie global als SPAM Mailadresse angerechnet werden kann. Falls die Tests mal ausufern sollten. Hmm. So richtig überzeugt hatte es mich jetzt nicht, aber ich hab mich seiner Empfehlung Mailhog zu nutzen nicht wiedersetzt. Im Gegenteil ich sogar ganz dankbar dafür. Weil wann hätte ich mit dieser Gewohnheit sonst gebrochen.

Mailhog ist ein lokal Dienst. Man kann sich diesen auf den Rechner Installieren. Dieser Dienst kommuniziert über den SMTP Standard Port 1025. Das bedeutet wenn wir unsere Laravel Konfiguration in der .env auf mailhog anpassen, senden wir aus der Applikation an unseren lokalen SMTP Server. Mailhog hat auch ein User Interface mit dem wir die Mails dann anzeigen lassen können.

Der einfachste Weg Mailhog zu nutzen ist über Docker. Dafür müssen wir nur:

docker run -d -p 1025:1025 -p 8025:8025 mailhog/mailhog

eingeben.

In unserer .env Datei passen wir noch die SMTP Konfiguration an:

MAIL_MAILER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=hello@world.com
MAIL_FROM_NAME="${APP_NAME}"

Dein “Fake” Mailhog EmailClient kannst über localhost:8025 erreichen.

Wenn Du deine gesamte Umgebung über ein docker-compose laufen lässt kannst du natürlich auch den Mailhog SMTP Server mit hinzu fügen.

services:
   mailhog:
     image: mailhog/mailhog:latest
     restart: always
     ports:
       - 1025:1025
       - 8025:8025

Ein gesamte docker-compose Laravel Umgebung findet ihr hier:
https://github.com/MikeLowrey/docker-compose-laravel-2021

. Ansonsten findest Du eine ausführlichere Mailhog Anleitung unter: https://kinsta.com/de/blog/mailhog/.

MySQL über die Console

Vielleicht geht es euch ja wie mir. Ständig vergesse ich die MySQL Commands. Schnell kommt es vor, dass man in einer MySQL Docker Instanz etwas an der Datenbank machen muss. In meinem Fall, der mich dazu brachte es ein für alle mal die wichtigsten MySQL Commands niederzuschreiben, war es, dass meine Docker App ständig meinte er kenne die Datenbank nicht.

Logt euch über die CLI auf eure MySQL Docker Instanz ein.

docker exec -it laravel-app-mysql bash
 mysql -u root -p
 SHOW DATABASES; // Zeigt dir alle Datenbanken an
 +--------------------+
 |     Databases      |
 +--------------------+
 | information_schema |
 | database_name      |
 | mysql              |
 | opencart           |
 | laravel          |
 | performance_schema |
 | sys                |
 +--------------------+
 7 rows in set (0.00 sec)
 SHOW DATABASES LIKE 'lara%'; // Zeigt dir die Datenbanken die auf lara matchen.
 USE laravel; // Loggt dich in die laravel DB ein
 SHOW Tables; / Zeigt dir alle Tabellen an

Starte und Stoppe dein Mysql Service:

service mysql start

service mysql stop

Docker: Laravel 8 mit PHP 8

Moinsen Leute! Laravel 8 mit PHP 8 auf einem nginx mit node 14 laufen lassen. Wer das benötigt, der sollte folgende docker config nutzen.

FROM php:8.0-fpm
 Arguments defined in docker-compose.yml
 ARG user
 ARG uid
 Install system dependencies
 RUN apt-get update && apt-get install -y \
     git \
     curl \
     libpng-dev \
     libonig-dev \
     libxml2-dev \
     zip \
     unzip
 Clear cache
 RUN apt-get clean && rm -rf /var/lib/apt/lists/*
 Install PHP extensions
 RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
 Get latest Composer
 COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
 Create system user to run Composer and Artisan Commands
 RUN useradd -G www-data,root -u $uid -d /home/$user $user
 RUN mkdir -p /home/$user/.composer && \
     chown -R $user:$user /home/$user
 Install Nodejs
 RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
 RUN apt-get install -y nodejs
 Set working directory
 WORKDIR /var/www
 USER $user

Wer eine andere Node Version braucht, der schaut hier nach welche er braucht und kopiert den Link hier zur geeigneten Nodejs Distribution rein.

Und hier die Docker-compose.yml Datei.

version: "3.7"
 services:
 Laravel App
 app:
     build:
       args:
         user: martin
         uid: 1000
       context: ./
       dockerfile: Dockerfile
     image: laravel-app
     container_name: laravel-api-app
     restart: unless-stopped
     working_dir: /var/www/
     volumes:
       - ./:/var/www
     networks:
       - mynetwork
 #Nginx Service
   nginx:
     image: nginx:alpine
     container_name: laravel-api-nginx
     restart: unless-stopped
     ports:
       - 8000:80
     volumes:
       - ./:/var/www
       - ./nginx/conf.d:/etc/nginx/conf.d/
     networks:
       - mynetwork
   #Mysl Service
 networks:
   mynetwork:
     driver: bridge

Lege einen nginx Ordner und eine Datei conf an:

mkdir -p nginx/conf
server {
     listen 80;
     index index.php index.html;
     error_log  /var/log/nginx/error.log;
     access_log /var/log/nginx/access.log;
     root /var/www/application/public;
     location ~ .php$ {
         try_files $uri =404;
         fastcgi_split_path_info ^(.+.php)(/.+)$;
         fastcgi_pass app:9000;
         fastcgi_index index.php;
         include fastcgi_params;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_param PATH_INFO $fastcgi_path_info;
     }
     location / {
         try_files $uri $uri/ /index.php?$query_string;
         gzip_static on;
     }
 }

Hier kannst Du dir meine Docker-Compose YML ziehen und bauen. Du erhälst eine sehr geeignete Umgebung für eine Laravel, VueJS Applikation. Mit dabei sind: nginx, mysql, php 8, node, npm, vim , composer.

https://github.com/MikeLowrey/docker-compose-laravel-2021

Git Remote Eintrag löschen

Ihr habt ein lokales Repository und ein Remote Repository. Das Remote Repository liegt zum Beispiel bei GitHub und ihr wollt es nun aber bei GitLab unterbringen. Wie löscht man jetzt die Remote Config im lokalen Git Projekt Verzeichnis. Falls ihr noch nicht in dem gewünschten Verzeichnis seid, dann aber schnell hin da.

Mit git status checkt ihr noch mal ob ihr im richtigen Ordner seid.
Mit git remote -v werden dir alle Fernbeziehungen unserer lokalen Repositories angezeigt.

origin git@github.com:SeoTheater/xxx-yyy.git (fetch)
origin git@github.com:SeoTheater/xxx-yyy.git (push)

Und nun könnt ihr mit

git remote rm origin

die Remotebeziehung zu eurem GiHub oder Ähnlichem beenden. Den: “Nichts ist für die Ewigkeit.”

Viel Spaß beim UnRemoten!

Drei nützliche JavaScript Object Funktionen

Es gibt im JavaScript viele nützliche Array Funktionen aber wiederum gelten die nicht für Objekte. Das kann zum Beispiel ein Grund sein, warum man sich einer Object Funktion bedient um daraus ein Array zu machen. Ich stelle im Folgenden die Funktionen: Object.keys, Object.value und Object.entries vor.

Ausgangsituation wäre ein nettes Objekt:

const niceObject = { 
     2019: {visitors:1}, 
     2020: {visitors:2}, 
     2021: {visitors:4}
 }

Das sind nämlich die Unique Besucher meiner Website und nun möchte ich errechnen wieviele Besucher ich seit 2019 hatte. Mit Array.reduce() wäre das im Handumdrehen gemacht. Aber mit einem Object. Wie geht den das?

Object.keys

Objekt.keys gibt uns alle Keys des Objektes als Array wieder.

const years = Object.keys(niceObject)
// output years
[2019, 2020, 2021]

Nun können wir mit der Arrayfunktion reduce() was anfangen. Ist doch ein Array.

const result = years.reduce((sum, key) => {
    return sum + niceObject[key].visitors;
}, 0)
// output result
7

Object.values

Object.values gibt uns ein Array mit allen (drei Objekten) Values zurück.

const visitors = Object.values(niceObject)
 // output visitors
 [
   {visitors: 1},
   {visitors: 2},
   {visitors: 4},
 ]

Deshalb können wir nun folgendes machen:

const result = visitors.reduce((sum, singleObject) => {
   return sum + singleObject.visitors;
}, 0);
// output result
7

// Oder richtig kurz
const resultShortObject.values(niceObject).reduce((t, n) => t + n.visitors, 0)
// output resultShort
7

Object.entries

Object.entries gibt uns ein Array mit drei Arrays zurück.

const entriesArray = Object.entries(niceObject)
// output entriesArray
[
  ["a", {visitors: 1}],
  ["b", {visitors: 2}],
  ["c", {visitors: 4}]
];
let result = entriesArray.reduce((sum, arr) => {
  return sum + arr[1].visitors;
}, 0)
// output result
7

Also 7 Besucher in drei Jahren. Not bad! Aber ich war schon mal besser…

Bei alle drei Funktionen übergeben wir einen Parameter mit dem Wert 0. Dieser ist der Initial Wert.

Docker GUI – Portainer easy und übersichtlich

Klar, ich mag die Kommandozeile. Für alle möglichen Aufgaben ist sie mein zuverlässiger Begleiter. So auch im Docker Umfeld. Die Commands sind eigentlich einfach aber man vergisst schnell wieder einiges und muss dann im Netz Nachschlagen. Vielleicht geht es euch ja genau so?

Und für Docker gibt es eine freie und wirklich gute GUI. Sie heißt Portainer und ist einfach zu installieren und zu handhaben.

Installieren mit:

docker run -d -p 9000:9000 --name=portainer -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

Nutzen unter:

http://localhost:9000

Ihr solltet es so wie jetzt auf jeden Fall nur Lokal beieuch nutzen. Falls ihr es in einem Netzwerk betreibt wäre eine HTTP Verschlüsselung zwingend nutwendig. Das wars auch schon!

SeoTheater Autoren