Neuigkeiten:

Privates MODX und LINUX BLOG, User Registrierung ist deaktiviert! Fragen oder Tipps? Bitte per Matrix: @jo42:freiburg.social

Hauptmenü

Neueste Beiträge

#91
LINUX / Antw:CEWE Fotobuch
Letzter Beitrag von Jo - 2013-09-26 | 23:19:56
Version 5.x ist raus und die gibt es für 32Bit als auch 64Bit Linux.

PS: Pixum ist ein Fotodienstleister in Köln mit eigenem Versanddienst, dessen Software ebenso unter Linux rennt und die Fotobücher werden bei CEWE produziert.

Damit ihr das Programm auch unter Linux updaten könnt, wird noch "xterm" und "perl" benötigt:
sudo apt-get install xterm perl

#92
LINUX / Linux Treiber
Letzter Beitrag von Jo - 2013-08-21 | 11:53:19
Linux bietet für Drucker eine großartige Unterstützung, da der Kernel von Haus aus schon viele Drucker kennt. Sollte doch einer fehlen (besonders neue Modelle) dann gibt es noch die Möglichkeit einen passenden Treiber beim Hersteller oder Linux Freunde zu suchen, z.B.:


#93
CMS / Antw:eventsCalendar2 Multidays
Letzter Beitrag von Jo - 2013-07-29 | 20:37:14
und noch ein Nachtrag für eine schöne W3C-Validation-Korrektur an der eventscalendar2.class.php

Ersetzt:
$thead['link_prev'] = $self.'?action=refreshCalendar&month='.$prev_month.'&year='.$prev_year;
$thead['link_next'] = $self.'?action=refreshCalendar&month='.$next_month.'&year='.$next_year;

mit:
$thead['link_prev'] = $self.'?action=refreshCalendar&month='.$prev_month.'&year='.$prev_year;
$thead['link_next'] = $self.'?action=refreshCalendar&month='.$next_month.'&year='.$next_year;


#94
LINUX / Antw:LMDE
Letzter Beitrag von Wasi - 2013-06-27 | 13:25:01
Ihr sucht ein Semi-Rolling Release mit KDE oder XFCE Desktop?

Das Projekt SolydXK basiert auf Linux Mint Debian Edition (LMDE), jedoch mit dem KDE (SolydK) und dem XFCE (SolydX) Desktop. Der Entwickler Schoelje legt großen Wert darauf die Update Packs in monatlichen Zyklen auszuteilen.

Link: http://solydxk.com/
#95
LINUX / PPA LibreOffice
Letzter Beitrag von Wasi - 2013-06-23 | 15:36:32
Mit dem Terminal die aktuellste und stabilste Version von LibreOffice einbinden und installieren:
sudo add-apt-repository ppa:libreoffice/ppa
sudo apt-get update && sudo apt-get dist-upgrade
sudo apt-get install libreoffice libreoffice-l10n-de libreoffice-pdfimport libreoffice-style-breeze


Im Anhang ist ein Screenshot mit dem neuen Icon-Set Breeze (Extras -> Optionen -> Ansicht -> Stil = Breeze)

Alles rückgängig machen, also zurück auf die vorherige Version:
sudo apt-get install ppa-purge
sudo ppa-purge -d trusty ppa:libreoffice/ppa



PS: PPAs sind nicht Sicher! Damit ist es sehr leicht Fremdquellen einzubinden und deren Fremdpakete zu installieren. Denke dem offiziellen PPA vom LibreOffice-Team kann man vertrauen - ohne Gewähr!  >:D

#96
CMS / PHP 5.4
Letzter Beitrag von Wasi - 2013-06-12 | 17:54:58
In PHP 5.4 wurden endlich die register Globals, Magic Quotes und das verrufene Safe Mode entfernt welches als Quelle für potentielle Sicherheitsprobleme betrachtet wurde.

Damit zwingt man PHP-Entwickler, sich selbst um die Sicherheit ihrer Applikationen zu kümmern!
#97
CMS / MODX mit validem RSS-Feed
Letzter Beitrag von Jo - 2013-04-15 | 12:31:09
Wer neue Artikel, Blogs oder Nachrichten veröffentlicht, will wahrscheinlich seinen Besuchern (wie auch dieses Forum) einen RSS-Dienst anbieten wollen.

Auf rtfm.modx.com zeigt Mark Hamstra wie man sehr einfach mit getResources einen RSS-Feed erstellen kann.

Seit MODX Revo 2.2 gibt es in der Area "Lexicon and Language" die Einstellung locale. Da ich diese auf "de_DE.UTF-8" gesetzt habe, bekam ich kein Datum mehr im Feed angezeigt. Schnell war das Problem per "Feed Validation Service" gefunden: der RSS-Feed ist nicht valide da das Datumsformat auf englisch sein muss!


Ein kleines getRSSdate Snippet als Output-Filter löst das Problem:
<?php
// RSS-Feed Time must be in english!
// we need this time format, e.g.: Wed, 02 Oct 2002 15:00:00 +0200
// unix timestamp to english rss-Date
// usage e.g.: [[+publishedon:getRSSdate]]

setlocale(LC_TIME,'en_GB.UTF8');
$format ='D, d M Y H:i:s O';
return 
date($formatstrtotime($input));


Mein Template Chunk sieht dann so aus:
<item>
  <title>[[+pagetitle:cdata]]</title>
  <link>[[~[[+id]]? &scheme=`full`]]</link>
  <description>
    [[+introtext:default=`[[+content:ellipsis=`600`]]`:cdata]]
  </description>
  <pubDate>[[+publishedon:getRSSdate]]</pubDate>
  <guid isPermaLink="false">[[~[[+id]]? &scheme=`full`]]</guid>
  <dc:creator>
      [[+createdby:userinfo=`fullname`]]
  </dc:creator>
</item>


:-[
#98
LINUX / Adobe Flashplayer: Linux wird ...
Letzter Beitrag von Jo - 2013-03-27 | 18:56:19
Bin gerade auf folgenden Hinweis gestoßen:

ZitatAdobe Flash Player 11.2 ist die letzte Version, die noch die Linux-Plattform unterstützt. Adobe bietet weiterhin Sicherheits-Backports zu Flash Player 11.2 für Linux an.

Wer das braucht und nicht die 11.2 hat, einfach das Paket adobe-flashplugin installieren. Beim installieren solltet ihr alle anderen Flash-Plugins entfernen, dann habt ihr die aktuelle Version.

Ich hoffe das Flash bald nicht mehr nötig ist, da die neuen HTML5-Player das ohne Flash können...

PS:
Per WebM kann ich YouTube-Videos anschauen ohne Flash-Plugin! WebM ist ein qualitativ hochwertiges und offenes frei verfügbares Videocontainerformat. Er wird von den meisten modernen Browsern (HTML5) nativ unterstützt.

Beispiel: jolichter.de/filme
siehe auch youtube.com/html5

#99
CMS / MODX cleanUpload
Letzter Beitrag von Jo - 2013-03-14 | 21:29:32
cleanUpload ist ein Plugin-Snippet für den MODX Revolution File Manager

Features:
  • Zeichen im Dateinamen welche im Ziel-Zeichensatz nicht zur Verfügung stehen, werden durch ähnliche Zeichen ersetzt (Transliteration)
  • Ab MODX 3 muss das Transliterieren in den Einstellungen deaktiviert werden (cleanUpload verwendet sein eigenes)
  • Optimiert die maximale Größe von Bildern per GD2
  • Entfernt Metadaten von Bildern und PDF Dateien (benötigt Ghostscript)
  • gleiche Dateinamen werden nicht überschrieben und bekommen eine eindeutige ID angehangen

Snippet:
<?php
/*
* V 25.01.022 - Optimiert
*
* cleanUpload is a MODX Revolution FileManager Plugin when uploading with Media Browser
* Clean up and optimize data, JPEG and PDF Metadata will be removed, GDPR compliant (DSGVO Konform)
*
* Testet with MODX 2.8.8 (PHP 8.2.27) and 3.1.0 (PHP 8.3.14)
* File name transliteration and customizing the picture size
* Same file names are NOT overwritten, instead a unique ID is appended to these files
* Two system events need to be enabled: OnFileManagerBeforeUpload, OnFileManagerUpload
*
* Since MODX 3: Transliterate (upload_translit) must be disabled in the settings for this (cleanUpload uses its own).
*  - Transliterate names of uploading files
*  - Type: Yes/No (default: Yes)
*  - if 'Yes', the name of any uploading file will be transliterated by global transliteration rules
*
* Reference and inspiration:
* https://www.php.net/manual/en/function.image-type-to-extension.php
* https://forums.modx.com/?action=thread&thread=73940&page=2
*/

// Einstellungen für die PDF-Verarbeitung
if (!defined('PDF_PROCESSING_WAIT')) {
    
define('PDF_PROCESSING_WAIT'5); // Maximale Wartezeit (Sekunden)
}
if (!
defined('PDF_PROCESSING_ATTEMPTS')) {
    
define('PDF_PROCESSING_ATTEMPTS'3); // Maximale Versuche für PDF-Verarbeitung
}

// Settings
$maxWidth 1280;    // Maximum pixel width | Maximale Pixelbreite
$maxHeight 1280;   // Maximum pixel height | Maximale Pixelhöhe
$quality 80;       // JPEG quality in % (default 80) | JPEG Qualität in % (Vorgabe 80)
$slug '_';         // Replacement character | Ersetzungszeichen

global $modx;
$eventName $modx->event->name;

// Checks if GD extension is loaded
if (!extension_loaded('gd') && !extension_loaded('gd2')) {
    
$modx->log(modX::LOG_LEVEL_ERROR'[cleanUpload] Error: GD extension not loaded');
    return 
false;
}

// ###################################
// Cleaning filename function
if (!function_exists('cleanFilename')) {
    function 
cleanFilename($modx$filename$slug) {
        
// trim, replace special chars, transliterate

        // Replace German Umlaute (no problem if use meta charset="UTF-8")
        # $filename = str_replace(array('ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß'), array('ae', 'oe', 'ue', 'Ae', 'Oe', 'Ue', 'ss'), $filename);

        // Trying to use iconv (I've disabled this because I want to have German Umlaute)
        # if (function_exists('iconv')) {
        # setlocale(LC_ALL, strtolower($modx->getOption('cultureKey')) . '_' . strtoupper($modx->getOption('cultureKey')));
        # $filename = trim(preg_replace('~[^a-zA-Z0-9-' . preg_quote(null, '~') . ']+~i', $slug, iconv('UTF-8', 'ASCII//TRANSLIT', $filename)), $slug);
        # } else {
        // Without transliterate (If you don't want to have Umlaute, remove: äöüÄÖÜß)
        
$filename trim(preg_replace('~[^a-zA-Z0-9äöüÄÖÜß-' preg_quote(null'~') . ']+~i'$slug$filename), $slug);
        
# }
        
if (empty($filename)) {
            return 
false;
        }
        return 
$filename;
    }
}

// ###################################
// Resize JPEG function
if (!function_exists('imgResize')) {
    function 
imgResize($modx$source$target$maxWidth$maxHeight$quality) {
        list(
$source_width$source_height$source_type) = getimagesize($source);
        
$source_gd_image = match ($source_type) {
            
IMAGETYPE_JPEG => imagecreatefromjpeg($source),
            
IMAGETYPE_GIF => imagecreatefromgif($source),
            
IMAGETYPE_PNG => imagecreatefrompng($source),
            default => 
false,
        };

        if (
$source_gd_image === false) {
            return 
false;
        }

        
$source_aspect_ratio $source_width $source_height;
        
$aspect_ratio $maxWidth $maxHeight;

        [
$image_width$image_height] = ($source_width <= $maxWidth && $source_height <= $maxHeight)
            ? [
$source_width$source_height]
            : (
$aspect_ratio $source_aspect_ratio
                
? [(int) ($maxHeight $source_aspect_ratio), $maxHeight]
                : [
$maxWidth, (int) ($maxWidth $source_aspect_ratio)]);

        
// Create a new temporary image
        
$gd_image imagecreatetruecolor($image_width$image_height);

        
// Copy and resize old image into new image
        
imagecopyresampled($gd_image$source_gd_image0000$image_width$image_height$source_width$source_height);

        
// Save gd_image into a file
        
imagejpeg($gd_image$target$quality);

        
// Destroy the images to free up memory
        
imagedestroy($source_gd_image);
        
imagedestroy($gd_image);
    }
}

// ###################################
// Resize images and process PDFs
foreach ($files as $file) {
    try {
        if (
$file['error'] != 0) {
            throw new 
Exception('[cleanUpload] Error during upload: ' $file['error']);
        }

        
$dir $directory;
        
$fileDir $directory $file['name'];
        
$bases $source->getBases($directory);
        
$fullPath $bases['pathAbsolute'] . ltrim($directory'/');
        
$pathInfo pathinfo($file['name']);
        
$fileName $pathInfo['filename'];
        
$fileNameNew cleanFilename($modx$fileName$slug);
        
$fileExt '.' $pathInfo['extension'];
        
$fileExtLow strtolower($fileExt);
        
$fullNameNewLow $fileNameNew $fileExtLow;
        
$fullPathNameNew $fullPath $fileNameNew $fileExtLow;

        switch (
$eventName) {
            case 
'OnFileManagerBeforeUpload':
                if (
file_exists($fullPathNameNew)) {
                    
$uni uniqid();
                    
$fileTemp $fileNameNew '_' $uni $fileExtLow;
                    
$source->renameObject($dir $fullNameNewLow$fileTemp);
                }
                break;

            case 
'OnFileManagerUpload':
                if (
$fileName != $fileNameNew) {
                    
$source->renameObject($fileDir$fullNameNewLow);
                } elseif (
$fileExt != $fileExtLow) {
                    
$source->renameObject($fileDir$fullNameNewLow);
                }

                if (
$fileExtLow == '.jpg' || $fileExtLow == '.jpeg') {
                    
imgResize($modx$fullPathNameNew$fullPathNameNew$maxWidth$maxHeight$quality);
                }

                if (
$fileExtLow == '.pdf') {
                    for (
$attempt 0$attempt PDF_PROCESSING_ATTEMPTS$attempt++) {
                        if (
file_exists($fullPathNameNew)) {
                            break;
                        }
                        
sleep(PDF_PROCESSING_WAIT);
                    }

                    if (!
file_exists($fullPathNameNew)) {
                        throw new 
Exception('[cleanUpload] PDF not found after attempts.');
                    }

                    
$inputPDF $fullPathNameNew;
                    
$outputPDF $fullPathNameNew '.tmp';
                    
$tempPS $fullPathNameNew '.ps';

                    
$command1 "pdf2ps $inputPDF $tempPS";
                    
$command2 "ps2pdf -dPDFSETTINGS=/prepress $tempPS $outputPDF";

                    
exec($command1$output1$return1);
                    
exec($command2$output2$return2);

                    if (
$return1 !== || $return2 !== || !file_exists($outputPDF)) {
                        throw new 
Exception('[cleanUpload] PDF processing failed.');
                    }

                    
rename($outputPDF$inputPDF);
                    
unlink($tempPS);
                }
                break;
        }
    } catch (
Exception $e) {
        
$modx->log(modX::LOG_LEVEL_ERROR$e->getMessage());
    }
}
#100
CMS / dummeFrage für MODX
Letzter Beitrag von Jo - 2013-03-08 | 18:46:14
Anstatt Captchas oder Rechenaufgaben für eine Unterscheidung zwischen Computern und Menschen festzustellen, kann man auch einfach mal eine dumme Frage stellen.

Zum Beispiel nach dem Vornamen von Alfred Neumann, das im Vergleich zu verzerrten Wörtern oder dem Ausrechnen von Rechenaufgaben die Benutzerfreundlichkeit erhöht.

Das ist wohl die dümmste funktionierende Sicherheitsabfrage der Welt.

Hier mein dummeFrage Snippet, welches die Fragen per Zufall generiert (auf eigene Gefahr!):
<?php
#
# dumme Fragen per Zufall erstellen
#
$strIntro1 = array('Dumme Frage: ''Blöde Frage: ''Nur eine Frage: ''Fangfrage: ');
$strIntro2 = array('Wie lautet der Vorname von ''Das erste Wort von ''Wie lautet der Nachname von ''Das letzte Wort von ');
$strName = array('Peter Maffay''Martin Luther''Anne Hathaway''Eva Rosenberg''Rosi Musterfrau''Alfred Neumann');

$randIntro1 $strIntro1[array_rand($strIntro1)];
$randIntro2 $strIntro2[array_rand($strIntro2)];
$randName $strName[array_rand($strName)];

# Frage zusammen setzen
  
$randFrage $randIntro2.$randName.'?';

# Session erstellen
   
if (!isset($_SESSION['dummeFrage']))
      {
      
$_SESSION['dummeFrage'] = $randFrage;
      }

# Platzhalter [[+dummeFrage]]
$modx->setPlaceholder('dummeFrage'$randIntro1.$_SESSION['dummeFrage']);


#
# dumme Antwort in Platzhalter schreiben
#

# den Zufallsnamen in ein Array (Position 0=Vorname und 1=Nachnahme)
  
$randName explode(' '$randName);
  
$intPosition array_search($randIntro2$strIntro2);
     if (
$intPosition !== false) { 
           
# die ersten 2 Variablen im Array $strIntro2 wird nach dem Vornamen gefragt
           
if ($intPosition 2) {
           
$strAntwort $randName[0];  #Vorname
           
} else {
           
$strAntwort $randName[1];  #Nachname
           
}
        }

# Session erstellen
   
if (!isset($_SESSION['dummeAntwort']))
      {
      
$_SESSION['dummeAntwort'] = $strAntwort;
      }

# Platzhalter [[+dummeAntwort]]
$modx->setPlaceholder('dummeAntwort'$_SESSION['dummeAntwort']);



Die richtige Antwort auf die dumme Frage holt ihr in euren entsprechenden Script dann so:$dummeAntwort = $modx->getPlaceholder('dummeAntwort');
Das vergleicht ihr nur noch mit der eingegebenen Antwort. Voila fertig.

Nicht vergessen, nach der richtigen Antwort die Session zu löschen - sonst hat der Besucher immer die gleiche Frage ,-)
unset($_SESSION['dummeFrage']);
unset($_SESSION['dummeAntwort']);