Webdesign und TYPO3 Blog aus DuisburgGulp run sequence – Gulp Task sequentiell abarbeiten (24.11.2016, 11:41 UTC)

Frontend-Webdevelopment mit Gulp Task sequentiell abarbeiten ist bei modernen Webdesign nötig. Dabei sind Gulp-Tasks ein wichtiger Bestandteil dieser tollen neuen Technologie. Gulp ist eine NodeJS Applikation, die natürlich auch in der Prozessverarbeitung ihre großen Vorzüge bezüglich der Performance hat. Asynchrone Prozessverarbeitung. Damit tun sich traditionelle Webdeveloper, gerade aus der PHP-Welt recht schwer. Hier findet man sich dann schnell in der sogenannten Callback-Hell wieder. An diesem Punkt sollte man sich natürlich fragen, ob man die richtige Technologie für das zu lösende Problem gewählt hat.

Gulp Task sequentiell ausführen – TYPO3 Gulp

In einer TYPO3 Migration von 6.2 auf 7.6 bin ich vor kurzem auf eine Herausforderung mit Gulp gestoßen. Hier war es wichtig die CSS-Files und JS-Files erst zu minimieren und dann an die richtige Stelle zu meiner Design Extension zu exportieren. So konnte unabhängig im Front- und Backend im Team gearbeitet werden.

const gulp = require('gulp');
const debug = require('gulp-debug');
const gulpLoadPlugins = require('gulp-load-plugins');
const wiredep = require('wiredep').stream;
const del = require('del');
const runSequence = require('run-sequence');

const $ = gulpLoadPlugins();

var stylesTarget = 'Resources/Public/Styles/';
var scriptsTarget = 'Resources/Public/Scripts';
var imagesTarget = 'Resources/Public/Images';
var fontsTarget = 'Resources/Public/Fonts';

gulp.task('clean-styles', del.bind(null, [stylesTarget]));
gulp.task('styles', () => {
  return gulp.src('../../rogoit-design/app/Styles/*.scss')
    .pipe(debug())
    .pipe($.plumber())
    .pipe($.sourcemaps.init())
    .pipe($.sass.sync({
      outputStyle: 'expanded',
      precision: 10,
      includePaths: ['.']
    }).on('error', $.sass.logError))
    .pipe($.autoprefixer({browsers: ['> 1%', 'last 2 versions', 'Firefox ESR']}))
    .pipe($.sourcemaps.write())
    .pipe(gulp.dest(stylesTarget));
});

gulp.task('clean-scripts', del.bind(null, [scriptsTarget]));
gulp.task('scripts', () => { // ['lint'],
  return gulp.src('../../rogoit-design/app/Scripts/**/*.js')
    .pipe(debug())
    .pipe($.plumber())
    .pipe($.babel())
    .pipe(gulp.dest(scriptsTarget));
});

gulp.task('vendor-scripts', () => { // ['lint'],
    return gulp.src(['../../rogoit-design/dist/Scripts/vendor/**/*', '../../rogoit-design/dist/Scripts/vendor.js'])
        .pipe(debug())
        .pipe(gulp.dest('Resources/Public/Scripts/vendor'));
});

gulp.task('clean-images', del.bind(null, [imagesTarget]));
gulp.task('images', () => {
  return gulp.src('../../rogoit-design/app/Images/**/*')
    .pipe(debug())
    .pipe($.imagemin({
      progressive: true,
      interlaced: true,
      svgoPlugins: [{cleanupIDs: false}]
    }))
    .pipe(gulp.dest(imagesTarget));
});

gulp.task('clean-fonts', del.bind(null, [fontsTarget]));
gulp.task('fonts', () => {
  return gulp.src(require('main-bower-files')('**/*.{eot,svg,ttf,woff,woff2}', function (err) {})
    .concat('../../rogoit-design/app/Fonts/**/*'))
    .pipe(debug())
    .pipe(gulp.dest(fontsTarget));
});


function lint(files, options) {
  return gulp.src(files)
    .pipe($.eslint(options))
    .pipe($.eslint.format());
}

gulp.task('lint', () => {
  return lint('../../rogoit-design/Scripts/**/*.js', {
    fix: true
  })
  .pipe(gulp.dest(scriptsTarget));
});

gulp.task('compress', ['styles', 'scripts'], () => {
  return gulp.src(['Resources/Public/**/*'])
    .pipe(debug())
    .pipe($.if('*.js', $.uglify()))
    .pipe($.if('*.css', $.cssnano({safe: true, autoprefixer: false})))
    .pipe(gulp.dest('Resources/Public'));
});

gulp.task('default', function(done) {
    runSequence('clean-styles', 'clean-scripts', 'clean-images', 'clean-fonts','styles', 'scripts', 'vendor-scripts', 'fonts', 'images', 'compress', function() {
        console.log('All tasks finished');
        done();
    });
});

Gulp Task sequentiell

Artikel gek: Lesen Sie den Rest hier (weitere 1424 Bytes)

Link
PHPUG WürzburgEinladung zum November-Treffen / Verlosung PHPStorm-Lizenz (22.11.2016, 14:14 UTC)

Hallo alle zusammen!

Wir treffen uns am 29. November um 19 Uhr in

Mennas Time Out
Frankfurter Straße 1
97082 Würzburg

Parkplätze sind in der näheren Umgebung ausreichend vorhanden, Straßenbahn-Haltestelle: Wörthstraße.

Und dran denken: Es wird eine Lizenz von PHPStorm verlost!

Ich freue mich auf viele Teilnehmer und rege Diskussionen!

Viele Grüße
Jason

Link
PHPUGFFMDie UG trifft sich zum 5. Mal in 2016 (3.11.2016, 06:30 UTC)

Am 17. November dürfen wir wieder zu Gast bei solvians sein. Diesmal geht es um die Gesundheit im Programmiereralltag und um einen vergleichsweise neuen Ansatz bei der DependencyInjection.

Mehr Infos – und die Möglichkeiten deinen Platz zu reservieren – findest du auf der Veranstaltungsseite oder bei joind.in.


We will be guests at solvians on the 17th of November.

This time we’ll be talking about health in a programmers everyday routine as well as a rather new way of handling DependencyInjection.

Find more informations – as well as the possibility to RSVP – on the eventpage or at joind.in.

Link
Webdesign und TYPO3 Blog aus DuisburgTYPO3 Seiten mit Extensions Plugin suchen PID (30.10.2016, 18:45 UTC)

Das Open Source CMS TYPO3 ist weit verbreitet und hat in den letzten Jahren auch von den Versionen einen großen Schritt nach vorne gemacht. Legacy Code und veraltete Versionen der eingesetzten Software stellen allerdings leider eine große Herausforderung in der so schon sehr angespannten Welt des Webdesigns dar. Naben dem Update der eigentlichen CMS Version müssen allerdings auch immer wieder alle Extensions aktualisiert werden. Bei eigenen Extensions stellt das zum Teil eine sehr große Herausforderung dar.

TYPO3 Extensions im Pagetree suchen

TYPO3 Seiten mit Extensions Plugin suchen PID

TYPO3-Seiten-mit-Extensions-Plugin-suchen-PID

Es gibt unterschiedliche Wege sich die PIDs zu den eingesetzten TYPO3 Extensions anzeigen zu lassen. Tatsächlich gibt es genau für diesen Zweck auch wieder Extensions. Aber jede installierte Extension bedeutet auch immer mehr Aufwand, eine mögliche Sicherheitslücke in TYPO3 und in Zukunft auch immer mehr Arbeit. Von daher sollte man immer den einfachsten Weg wählen und der geht ganz einfach über die Datenbank.

TYPO3 Seiten mit Extension in Datenbank finden

Folgendes SQL-Statement kann einfach auf der Datenbank ausgeführt werden:

SELECT tt_content.pid,pages.title
FROM tt_content JOIN pages ON tt_content.pid = pages.uid
WHERE tt_content.list_type LIKE '%extensionkey%'
ORDER BY tt_content.uid DESC

Mit dem oben abgebildeten TYPO3 SQL Statement kann man ganz gezielt nach einem TYPO3 Extension Key suchen.

TYPO3 alle Seiten mit Extensions finden

Neben der Möglichkeit eine Extension zu suchen, ist es vielleicht auch wichtig alle eingesetzten Extension und ihre PIDs als Übersicht zu sehen. Das kann man auch einfach mit einem entsprechenden SQL Statement ausführen

SELECT tt_content.pid,pages.title
FROM tt_content JOIN pages ON tt_content.pid = pages.uid
WHERE tt_content.list_type <> ''
ORDER BY tt_content.list_type ASC

 

Der TYPO3 Webdesign Blog TYPO3 Seiten mit Extensions Plugin suchen PID erschien zuerst auf Webdesign und TYPO3 Blog aus Duisburg.

Link
Coding – byteludeWie lade ich in Django 1.10 ein Bild von der Festplatte per Django Command hoch? (9.10.2016, 18:00 UTC)

Für den Fall, dass man ein Bild in eine Django Applikation uploaden möchte, gibt es unzählige Tutorials – kniffelig wird es dann ein bisschen, wenn man ein Bild von der Festplatte des Servers, auf dem die Applikation läuft, mittels Django Command hochladen möchte. In meinem Beispiel importiere ich Bilder per Cronjob aus einem anderen Programm. Bisher ging der Upload auch ohne Probleme, aber seit Django 1.9 oder 1.10 wurde das Sicherheitskonzept geändert – man darf keine Dateien mehr ausserhalb des Media_Path Kontextes hochladen (Suspicious File Operation. Um das Problem zu umgehen, muss man das “normale” Fileobject, welches man normalerweise dann an das Model übergeben würde, in den Django File Wrapper packen. Dazu importiert ihr diesen Wrapper wie im Beispiel unten, übergebt den realen Pfad zum Bild und, und das ist nun wichtig, übergebt per “name” Parameter einen beliebigen Dateinamen, mit dem diese Datei dann im “Upload Prozess” von Django ankommt. Nun müsst ihr das “image” Objekt einfach nur an den Image Parameter eures Models hängen, und schon klappt das Einspielen der Datei wieder. Bei mir war es tatsächlich der fehlende “name” Parameter, der mich in die Verzweiflung getrieben hat

from django.core.files import File
image = File(open("[PATH_TO_REAL_FILE]", "rb"), name="[SOME_FILE_NAME]")

Link
Coding – bytelude[Quicktip] Nginx Reverse Proxy mit Basic Auth (7.10.2016, 18:00 UTC)

Nehmen wir an, ihr richtet einen Nginx als reverse Proxy ein und möchtet nun, dass bestimmte Subdomains, die von anderen Servern durchgeschliffen werden, per Basic Auth “geschützt” werden sollen. Dann werdet ihr wahrscheinlich auf das Problem stoßen, dass ihr immer wieder nach dem Basic Auth Login gefragt werdet und der Reverse Proxy nicht korrekt agiert. Die Lösung ist ganz einfach: ihr müsst verhindern, dass die Basic Auth Header weitergereicht werden. Und das geht so:

server {
    listen 80;
    server_name foo.bar.com;
    access_log            /var/log/nginx/foo.access.log;
    location / {
      proxy_set_header        Authorization "";    # <== das ist die wichtige Zeile, die verhindert, dass Basic Auth weiter gereicht wird!
      auth_basic              "Protected";
      auth_basic_user_file    /etc/nginx/basic_auth;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;
      proxy_set_header        Host [YOUR_REMOTE_DOMAIN];
      proxy_set_header        Accept-Encoding "";
      proxy_pass              [YOUR_REMOTE_URL];
      proxy_read_timeout      90;
    }
}

Link
Webdesign und TYPO3 Blog aus DuisburgOH-MY-ZSH zsh-autosuggestions key tab and color (4.10.2016, 20:37 UTC)

oh-my-zsh ist unter Webdevelopern sehr beliebt und mit dem zsh-autosuggestions Plugin bekommt man auch das nötige Fish-Feeling. Dabei müssen allerdings 2 kleine Settings vorgenommen werden, damit man Tabbing zur Verfügung hat und auch die farbliche Hervorhebung richtig einsetzen kann.

zsh autosuggestions

zsh autosuggestions

zsh-autosuggestions muß installiert werden

Im Gegensatz zu den meisten verfügbaren zsh-Plugins muß das Plugin zusätzlich installiert werden. Hierfür gibt es eine hervorragende Dokumentation in der entsprechenden Readme Datei auf Github. Dabei wird das Plugin nicht nur im Kontext zu zsh eingesetzt. Hier muß nur folgender Befehl ausgeführt werden.

git clone git://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions

 

zsh-autosuggestions aktivieren

Die Autovervollständigung ist mit der Aktivierung des Plugins direkt aktiv. oh-my-zsh Plugins werden dabei, wie gewohnt on der .zshrc im Root-Folder des aktiviert.

plugins=(zsh-autosuggestions)

zsh-autosuggestions color setting

Per Default ist der Farbwert leider nicht so schön. Diesen kann man allerdings auch sehr einfach in der .zshrc anpassen. Mit dem Farbton „cyan“ hingegen bekommt man ein sehr angenehmes Farbschema, welches dem von Fish sehr nahe kommt.

ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=cyan"

zsh-autosuggestions key binding vor tabbing

Die wichtigste Funktion der Autovervollständigung ist allerdings das Tabbing. Also Wortweise vorspringen zu können. Sonst ist die Arbeit mit diesem ungalublich tollen Plugin nicht effektiv, sondern hinderlich und frustrierend.

bindkey '^f' vi-forward-blank-word

Änderungen an .zshrc wirksam machen

Es gibt 2 Möglichkeiten Änderungen, die an dem .zshrc durchgeführt wurden wirksam zu machen. Einmal kann man einfach in Tools, wie iTerm, einen neuen Tab öffnen und Änderungen dadurch wirksam werden lassen. Eine zweite Möglichkeit ist es auf der Command Line CLI einfach folgenden Befehl einzugeben.

source ~/.zshrc

zsh mit Plugins effektiv nutzen

Mit zsh ist es sehr gut möglich das Terminal zu beherrschen und sich schnell und effektiv zu bewegen. Aus diesem Grund haben wir auch schon eine Schulung bei Entwicklungshilfe NRW eingeführt und halten auch sehr häufig bei Usergroups Talks zu dem Thema. Hier geht es auch zu einer Präsentation zu dem Thema.

Der TYPO3 Webdesign Blog OH-MY-ZSH zsh-autosuggestions key tab and color erschien zuerst auf Webdesign und TYPO3 Blog aus Duisburg.

Link
Webdesign und TYPO3 Blog aus DuisburgGit Checkout Files von anderem Branch (20.9.2016, 12:19 UTC)

Git Versionierung ist das Maß aller Dinge beim Webdevelopment mit PHP. Dabei ist natürlich ein Git Checkout ein elementares und wichtiges Kommando. In der Regel wird es allerdings nur dazu benutzt, um neue Branches zu erstellen, zwischen Branches zu wechseln und natürlich Files in der aktuellen Entwicklung zu resetten, also zurückzusetzen. Dabei hat das Git Command noch eine andere wichtige Funktion, die ich heute näher erläutern möchte.

Git Checkout File von Master

Schaut man sich einmal die offizielle Dokumentation zum Git Checkout Command an findet man weit mehr Funktionen, als den einfachen Wechsel zwischen Branches.

When or –patch are given, git checkout does not switch branches. It updates the named paths in the working tree from the index file or from a named (most often a commit)…The argument can be used to specify a specific tree-ish (i.e. commit, tag or tree) to update the index for the given paths before updating the working tree. https://git-scm.com/docs/git-checkout

Leider sind Dokumentationen nicht immer benutzerfreundlich geschrieben. Daher versuche ich mit diesem Blog-Post hier einmal ein wenig Licht in die technische Dunkelheit zu bringen. Grundsätzlich ist es in Git immer möglich mit Hilfe des ‚tree-ish‘ einen bestimmten Commit oder auch ein File von einem anderen Branch aus auszuchecken. Damit man seinen aktuellen Branch mit den Files eines bestimmten Commits aktualisieren kann ist folgendes nötig.

git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>

Git Einzelnes File von anderem Branch auschecken

Git Checkout

Git Checkout – Aspectra

Es kommt natürlich auch bei den besten Webdevelopern vor, daß man sich einmal verstrickt hat. Wenn man mit PhpStormBest Practice arbeitet kenn man natürlich die nützliche Funktion mit einem Remote Branch zu vergleichen. Was aber, wenn man dahin zurück möchte. Es gibt natürlich auch den Fall, daß man sich vielleicht zu erst auf einen aktuellen Stand aus einem anderen Branch bringen möchte. Das kann man hier auch immer auf File-Ebene tun. Hier bietet sich der Web über ein Terminal an, da in in meinen Augen schneller und einfacher ist.

git checkout <branch_name> -- <paths>

Beispiel Git Einzelnes File von anderem Branch auschecken

Es kann sein, daß man gerade Codeception Tests einführt und die Tests auch in seinem Git-Branch verfügbar haben möchte. Hier gibt es natürlich die richtige Möglichkeit den kompletten Branch zu mergen. Hier treten natürlich auch keine Konflikte auf. Sicher? Natürlich besteht die Möglichkeit in seinem aktuellen Branch Änderungen an der composer.json gemacht zu haben. Und vielleicht hat man diese verworfen, will aber trotzdem den Stand von dem anderen Branch.

git checkout cc-testing -- composer.json
git commit -m "Update composer.js from cc-testing"

Fazit Git Checkout Files von anderem Branch

Leider ist die Nutzung der Command Line für viele Webdeveloper noch ein immer eine große Hürde sich fundiertes und professionelles Wissen über Git leicht zugänglich zu machen und anzueignen.

Ich benutze PhpStorm und brauche keine Git-Commands – Webdeveloper mit 4 Jahren Berufserfahrung

Leider fällt mir da auch nicht immer die passende Antwort bei Schulungen ein und ich begebe mich verlegen in ein Schweigen. Natürlich ist das ein Einstellungsproblem und es ist leider exemplarisch für die Realität. Etwas beurteilen zu können setzt in diesem Falle natürlich Fachwissen voraus. Das hier jetzt detailliert auszuführen ist sicher nicht in dem Sinn meiner Leser.

Git bietet tolle Möglichkeiten und entwickelt sich natürlich a

Artikel gek: Lesen Sie den Rest hier (weitere 905 Bytes)

Link
Webdesign und TYPO3 Blog aus DuisburgBash Script für SQL Files in Folder – Database Migration Deployment (11.9.2016, 09:19 UTC)

Es gibt unterschiedliche Möglichkeiten ein automatisiertes SQL Depoyment durchzuführen. SQL Files sind hier eine Option. Dabei kann man dann alle zugehörigen SQL Files in einen Release Folder ablegen und manuell ausführen. Das ist leider keine sehr elegante Lösung, da man hier nicht ohne weiteres zurück rollen kann. Man kann also so gesehen nur nach vorne gehen und hat zudem das Risiko SQL-Statements, die nur einmal ausgeführt werden sollen öfter auszuführen.

SQL Files in Folder mit Bash Script ausführen

#!/bin/bash
sqlfiles=(*.sql)
for i in "${sqlfiles[@]}"
do
 if grep -q PROCEDURE "$i"; then
    echo $i
    mysql -h127.0.0.1 -udbuser -pdbpass exactag < $i
 fi
done

SQL Files Bash Script - googlinux.com

SQL Files Bash Script – googlinux.com

Damit man nicht manuell alle SQL Files einzeln ausführen muß kann man ein Bash-Script nutzen. Das führt dann dann alle SQL Files automatisiert aus. Das oben abgebildete Bash-Script kann das auf eine einfache und unsichere Art tun. Es leider nötig Username und Passwort für die DB mit abzuspeichern. Allerdings erfüllt das Bash-Script seinen Zweck. Es interiert im aktuellen Folder über alle SQL Files und führt diese mit dem MYSQL-Command aus.

Professionells Webdevelopment und Deployment mit Migrationen

PHP Migration Phinx

PHP Migration Phinx

Eine zuverlässige und sichere Lösung bieten Migration Tools, wie Phinx. Hier ist es möglich neue Änderungen einfach automatisiert durchzuführen. Dadurch behält man zu jedem Zeitpunkt die Kontrolle über den aktuellen DB Status. Damit ist es einfach und übersichtlich einen Rollback durchzuführen. Zudem wird verhindert, das SQL-Files doppelt ausgeführt werden. DB Migrations gibt es auch Out-Of-The-Box in vielen PHP-Frameworks. Hier kann man das Doctrine Migrations Bundle in Symfony und die Database Migrations im Laravel Projekt sehr empfehlen. Beim Refactoring von Legacy Code Anwendungen bietet sich Phinx sehr gut an, da es autark neben dem bestehenden Projekt mit Composer einfach hinzugefügt werden kann.

Unterstützung beim Web zu Continuous Integration

Wir haben uns seit langen auf automatisiertes Deployment und Continuous Integration spezialisiert. In den jüngsten Kunden-Projekten haben wir es erfolgreich eingeführt. Dieses Angebot werden wir in den nächsten Monaten gezielt ausbauen. Hier werden wir unter anderem fertige Codeception-Tests für allgemeine Tests und Screenshots in unterschiedlichen Display Auflösungen anbieten. Ein aktuelles Angebot gibt es dazu hier. Build Pipelines für PHP-Projekte.

Der TYPO3 Webdesign Blog Bash Script für SQL Files in Folder – Database Migration Deployment erschien zuerst auf Webdesign und TYPO3 Blog aus Duisburg.

Link
Webdesign und TYPO3 Blog aus DuisburgWarum Continuous Integration wichtig ist (6.9.2016, 12:07 UTC)

Automatisierte Tests und ein automatisiertes Deployment sind sehr wichtig für eine zuverlässige Software in der auch Innovationen möglich sind. Es wird mit Continuous Integration sehr viel Zeit gespart und doch ist es immer wieder eine große Hürde diese tolle Technik einzuführen. Veränderungen sind immer ein schwieriger Prozess und Continuous Integration erfordert bei seiner Einführung viel mehr als nur guten Willen. Deshalb möchte ich mich in diesem Blog-Post an Entscheider und Entwickler wenden. Jeder wird schon einmal versucht haben den eigenen Code-Kosmos oder den in einer Firma zu verändern und nachhaltig zu verbessern und effektiver zu machen. Aber das funktioniert nur, wenn alle das auf einmal gemeinsam tun und sich zielstrebig in die Richtung bewegen. Es kostet sehr viel Energie. Hier müssen sich vor allem die Entwickler-Teams, die bekanntlich immer an ihrer Belastungsgrenze arbeiten, viel Zeit für nehmen und ihre Arbeitsweise auch noch umstellen. Das ist nicht leicht. Schlüssel sind hier u.a. Teamwork und ein stetiger Know-How Transfer.

Denn wenn im Chaos nur einer aufräumt und alle anderen sich nicht kümmern wird es scheitern. Sehr schnell – Roland Golla

Daher dreht sich dieser Artikel nicht um die tatsächliche Implementierung, sondern einfach um Argumente für diese Entscheidung und vor allem gegen den aktuellen Ist-Zustand. Am Ende muß sie von oben gefällt, durchgesetzt und kontrolliert werden. Denn der innere Schweinehund ist auch beim Thema Software-Qualität schwer zu überwinden. Der Gewinn liegt auf der Hand. Software-Qualität bringt Lebensqualität und schlechte Software-Qualität macht bekanntlich krank.

Continuous Integration ist nachhaltig und effizient

Ist-Zustand ohne Continuous Integration

Continuous Integration ist nachhaltig und effizient

Continuous Integration ist nachhaltig und effizient

Software-Entwicklung und das daraus resultierende Produkt ist ein elementarer Bestandteil der Geschäftsmodelle, die im Internet Geld verdienen. Von daher wundert es immer wieder, wie schlecht und ineffektiv hier auch bei professionellen Web-Applikationen gearbeitet wird. Hier arbeiten sehr viele unterschiedliche Stellen und Abteilungen an der Weiterentwicklung und einige wenige bis gar keine auch an der Instandhaltung. Neben dem eigentlichen Webdevelopern sind hier auch Manager, Projektleiter, Product-Owner, das Marketing und natürlich je nach Struktur noch viel mehr Personalien involviert. In kleineren Strukturen belegen vielleicht einzelne Personen mehrere Rollen. Sie alle haben dabei eines gemeinsam. Ein sehr großes Interesse an zuverlässiger und hoher Software-Qualität. Aber tun sie auch etwas dafür und wie versuchen sie diesen Zustand zu ändern?

“Trust is the essential reason we need continuous integration.” via @settermjd

Robert C. Martin alias Uncle Bob hat es schon vor langer Zeit auf den Punkt gebracht. Eines der größten Probleme in der Software-Entwicklung ist das fehlende Vertrauen in die Entwickler von allen anderen Beteiligten. Es ist hier allerdings auch ein schwarzer Peter unterwegs, der natürlich bei dem abgelegt wird, der sich am wenigsten wehrt. Den Webdevelopern. Dabei fängt am Anfang alles so schön ein. Ein spannendes neues Feature soll von einem Entwickler Team umg

Artikel gek: Lesen Sie den Rest hier (weitere 21229 Bytes)

Link
LinksRSS 0.92   RDF 1.
RSS 2.0 Feed   RDF 1.
100% Planet PHP   PHP5 powered
PEAR powered  
Code wird von Planet-PHP zur Verfügung gestellt. Vielen Dank.