programmieren

  • Eclipse vs. Netbeans für Drupal und PHP

    Seit 2 Jahren benutze ich nun auch Eclipse zum entwickeln von Drupal Modulen in PHP. Richtig überzeugen konnte mich Eclipse jedoch nie. Ich fand das Programm einfach zu schwerlastig um PHP-Code damit zu erstellen. So habe ich nun seit einer Woche Netbeans im Einsatz. Der erste Eindruck scheint gelungen. Das ganze Programm kommt viel schlanker daher. Die Installation geht schnell und PHP kann man direkt als fertige Distribution herunterladen (ähnlich wie PHPEclipse).

    Hier meine positiven Punkte:

    • schneller Start des Programmes
    • übersichtliche Oberfläche
    • Projekt-Wizard sehr gut
    • Projekte, welche auf einem entfernten Server getestet werden (via FTP) können als solche verknüpft werden, es ist also kein zusätzliches FTP Programm nötig
    • bereits nach einem Tag kenne ich mehr Funktionen des Programmes als nach 2 Jahren Eclipse
    • Plugin für Drupal
    Negatives:
    • bisher noch nichts zu bemängeln
    Achtung: Das Plugin für Drupal ist nicht aktuell. Auf der offiziellen Seite gibt es keine aktuelle Version. Ich habe aber für NetBeans 9.1 das Drupal Plugin hier gefunden -> http://hollyit.net/files/org-netbeans-modules-php-drupal-module.nbm . Es hat auch funktioniert.
    NetBeans
  • Drupal: XSend bzw mod_xsendfile auf Debian installieren

    Für Apache gibt es ein super Modul, welches den Dateitransfer massiv verschnellert, bzw die Ladezeit bis zum Dateitransfer. Das Modul heisst mod_xsendfile. Ich hatte einige Probleme das Ding auf meinem Debian zum laufen zu bringen. So habe ich es gemacht:

    1. Wechseln zum Ordner für Apache Module (/usr/lib/apache2/modules; wenn anders dann kann man den modules Ordner suchen: find / -name 'modules')
    2. Source herunterladen mit Link (Link Datei; Link Seite)
    3. apxs2 -cia mod_xsendfile.c (Achtung, bei mir musste ich eine 2 an das apxs anhängen, ist nicht so auf Homepage beschrieben!)
    4. Bei mir kam dann am Schluss folgende Fehlermeldung:
      1. apxs:Error: Activation failed for custom /etc/apache2/httpd.conf file..
        apxs:Error: At least one `LoadModule' directive already has to exist..
    5. Lösen kann man das Problem mit folgendem Trick:
      1. nano /etc/apache2/httpd.conf
      2. Die folgenden zwei Zeilen untereinander eintragen
      3. #LoadModule directive to aid module installations
        #LoadModule dummy_module /usr/lib/apache2/modules/mod_dummy.so
      4. Wieder zumachen und speichern
    6. Apache neu starten (invoke-rc.d apache2 restart)
    7. Ich bin nicht ein Fan von Core-Patches, jedoch ziehe ich in diesem Fall ein solcher vor. Anstelle des xfile Modules von Drupal reicht es (für meinen Fall) in der includes/file.inc die Funktion file_transfer mit der Zeile "$headers[] = 'X-Sendfile: '.$source;" gerade nach dem ersten if {} Konstrukt einzufügen. Das Drupal modul xfiles ist so überflüssig.
    function file_transfer($source, $headers) {
      if (ob_get_level()) {
        ob_end_clean();
      }
      $headers[] = 'X-Sendfile: '.$source; 
      foreach ($headers as $header) {
      ..
  • Drupal: PDF Vorschau als jpg, pdf2jpg

    Immer schon wollte ich auf Webseiten pdf's als Bilder darstellen. Sinnvolle Hilfe dazu zu finden ist meiner Meinung nach eher schwierig. Für eine aktuelle Drupal-Installation wollte ich nun endlich mal einen Schritt weitergehen und meine Wünsche in etwas Handfestes umwandeln. Im Drupal CMS sollten sämtliche PDFs auch als jpg/png automatisch zur Verfügung stehen. Dazu habe ich ein neues Modul geschrieben, ich habs Preview genannt. Ich stellte mir vor, dass es in Zukunft verschiedene Dateitypen als Preview erstellen sollte, nicht nur PDFs. Zurzeit bin ich dran, das Modul so umzugestalten, damit ich es auf drupal.org contributen kann. Auf meiner vorhanden Drupalinstallation läuft es aber breits wie geschmiert. Ich werde bei Gelegnheit mehr Details dazu posten (wird auch vom Interesse von Euch abhängen...).Mein Fazit bis jetzt: Es ist alles was ich mir je gewünscht habe. Gerade grosse PDFs (bei uns handelt es sich um Baupläne, >90MB pro Seite) müssen so nicht heruntergeladen werden sondern werden innert Kürze in der "Vorschau" angezeigt.

    screenshoots: 
    screenshot.9.png
  • Drupal: Auf fremde/zweit Datenbank zugreifen

    Problem: Auf der vorhanden Drupal Installation will ich auf Daten einer anderen Datenbank zugreifen. Drupal hat dafür bereits einen Weg vorgesehen. Dazu geht man in die sites/default/settings.php Datei. Folgende Zeile definiert die Standard Datenbank:

    $db_url 'mysql://drupal:drupal@localhost/drupal';

    Wandelt man $db_url in ein Array um, kann man beliebig viele Datenbank definieren.:

    $db_url['default'] ='mysql://drupal:drupal@localhost/drupal';
    $db_url['mydb'] = 'mysql://user:pwd@localhost/anotherdb';
    $db_url['db3'] ='mysql://user:pwd@localhost/yetanotherdb';

    Im Modul, wo man dann auf die Daten zugreifen will mach man das folderndermassen:

    db_set_active('mydb');

    db_query('SELECT * FROM table_in_anotherdb');

    //...
    db_set_active('default');

    Default ist die Standard-Datenbank. Sie ist erforderlich. In dieser Datenbank ist Drupal installiert. Man muss aufpassen, dass man nach dem Sprung in die andere Datenbank die default Datenbank wieder auf aktiv stellt.

    Quelle: http://drupal.org/node/18429

  • Drupal: Files Ordner verschieben

    Um den Files Ordner zu verschieben (in meinem Fall im Private Mode), geht man folgendermassen vor:

    • per FTP oder shell die Daten an den neuen Ort verschieben
      • shell: mv <pfad>/files <neuer pfad>/files
      • per FTP sicherstellen das .htaccess Datei mitgneommen wird
    • Folgender MYSQL Befehl ausführen (zB in mysqladmin)
      • update files set filepath = replace(filepath,'<alter Pfad>','<neuer Pfad>');
    • Nach admin/settings/file-system gehen
      • neuer Pfad angeben
    • Fertig

    Achtung: <...> ersetzen durch eigene Werte! 

  • PHP: Dateien und Ordner rekursive Umbenennen

    Ein altbekanntes Problem der deutschen Sprache im Zusammenhang mit Linux-Dateinamen: Ich habe von meinem Windows System Dateien per FTP hochgeladen und die eingekaufte PHP Anwendung kann nicht richtig mit den Umlauten im Dateinamen umgehen (oder anderen Sonderzeichen, welche Windows im Dateinamen erlaubt). Also lass ich per PHP Script einen ganzen Verzeichnisbaum rekursive durchgehen und alle Umlaute/Sonderzeichen umwandeln. Das geht mit folgendem Snippet:

    <?php
      
    // Directory to scan (Full System Path)
      
    $dir './';
      
      function 
    cleanName($name)
      {
          
    $name str_replace('ä''ae'$name);
          
    $name str_replace('ö''oe'$name);
          
    $name str_replace('ü''ue'$name);
          
    $name str_replace('Ä''Ae'$name);
          
    $name str_replace('Ö''Oe'$name);
          
    $name str_replace('Ü''Ue'$name);
          return 
    $name;
      }
      
      function 
    getDirectory($path '.'$ignore '')
      {
          
    $dirTree = array();
          
    $dirTreeTemp = array();
          
    $ignore[] = '.';
          
    $ignore[] = '..';
          
          
    $dh = @opendir($path);
          
          while (
    false !== ($file readdir($dh))) {
              if (!
    in_array($file$ignore)) {
                  if (!
    is_dir("$path/$file")) {
                      
    $dirTree["$path"][] = $file;
                  } else {
                      
    $dirTree["$path"] = array();
                      
    $dirTreeTemp getDirectory("$path/$file"$ignore);
                      if (
    is_array($dirTreeTemp))
                          
    $dirTree array_merge($dirTree$dirTreeTemp);
                  }
              }
          }
          
    closedir($dh);
          return 
    $dirTree;
      }
      
    // Get all Files and Folders in an Array
      
    $dirTree getDirectory($dir$ignore);
      
    $folders = array();
      foreach (
    $dirTree as $path => $files) {
          foreach (
    $files as $name) {
              if (
    preg_match('/[äöüÄÖÜ]/'$name)) {
                  echo 
    'rename(' $path '/' $name ', ' cleanName($name) . ');<br></br>';
                  
    rename($path '/' $name$path '/' cleanName($name));
              }
          }
          
    $folders[substr_count($path'/')][] = $path;
      }
      
    // Sortiert Ordner nach "Tiefe"
      
    krsort($folders);
      
      
    // Benennt alle Ordner mit Umlauten um
      
    foreach ($folders as $paths_by_debth) {
          foreach (
    $paths_by_debth as $path) {
              
    $pos strrpos($path'/');
              
    $folder substr($path$pos);
              if (
    preg_match('/[äöüÄÖÜ]/'$folder)) {
                  echo 
    'rename(' $path ',' substr($path0$pos) . cleanName($folder) . ');<br></br>';
                  
    rename($pathsubstr($name0$pos) . cleanName($folder));
              }
          }
      }
    ?> 
    <pre> 
       <?php
      
    // Gibt den ganzen Ordner Baum aus
      //print_r($dirTree); 
      ?> 
    </pre>

    Das Programm wurde absichtlich ausführlich geschrieben, um die Einzelnen Schritte klar und verständlich darzustellen. Natürlich könnte man das ganze auch abgekürzter schreiben. Die Funktion cleanName kann beliebig erweitert werden. Hier könnte man auch via preg_replace bestimmte Dateinamen nach einem Muster umbenennen.

  • PHP Performance Tipps

    Heute bin ich auf einen interessanten Eintrag gestossen. Er nennt sich "PHP Script Tips: Cool Secrets of PHP" und birgt einige weniger bekannte Tipps zu PHP, welche ich jedem PHP-Programmierer empfehlen kann. Er behandelt u.a den Unterschied zwischen double quotes und single quotes, und wie es sich auf die Geschwindigkeit auswirken kann. 

  • Excel Werte als Bytes und Bites formatieren

    Schon mal versucht in Microsoft Excel Bites in Kilobytes, Megabytes oder Gigabytes umzuwandeln. Hier ist die Formel, um Bites in Bytes umzuwandeln:
     
    =WENN((A1>=POTENZ(2;33));TEXT((A1/POTENZ(2;33));"##0.00\G");WENN((A1>=POTENZ(2;23)); TEXT((A1/POTENZ(2;23));"##0.00\M");WENN((A1>=8192);TEXT((A1/8192);"##0.00\K");TEXT((A1/8);"##0.00\B"))))

    Mit dieser Zeile in einer Zelle wird der Wert in der vorderen Spalte (selben Zeile), welcher als Bite-Wert vorliegt, in MB, KB, oder B umgerechnet. "A1" ist die Zelle, welche die anzahl Bites enthält.

  • Regular Expressions, nur Buchstaben verwenden inklusive Umlaute

    Deutschsprachige Hilfen für Umlautprobleme sind im Internet immer selten gesät. Hier die Lösung des Problems, wenn man alle Zeichen aus einem String filtern will, welche in deutschen Wörtern nicht vorkommen dürfen:

    $filteredword = utf8_encode(preg_replace('/[^a-zA-Z-äöüÄÖÜéàèÉÈ]/i','',$inputstring));

    Erklärung:

    $filteredword ist der gefilterte String ohne unerlaubte Zeichen

    $inputstring ist der String, welcher noch unerlaubte Zeichen enthält

    utf8_encode: wandelt den gefilterten String in UTF8 um. Dies ist notwendig, wenn man zum Beispiel später den String in einer  MYSQL-Datenbank verwenden will

    mit preg_replace werden alle Zeichen, welche dem Suchmuster entsprechen herausgefiltert. In unserem Fall sind das alle Zeichen, welche in den eckigen Klammern stehen.

    [^a-zA-Z-äöüÄÖÜéàèÉÈ]: [^...] filtert alles raus ausser "..."

    a-zA-Z: bedeutet alle Buchstaben

    -: Bindestrich oder Minus sind in der deutschen Wörtern auch erlaubt

    äöüÄÖÜéàèÉÈ: die spezial-Zeichen. Für uns Schweizer sinds eben noch ein paar mehr. Kann beliebig mit weiteren Zeichen ergänzt werden.

    mit '/.../' wird die Reguläre Expression eingegrenzt

    /i bedeutet: Gross und Kleinschreibung wird nicht berücksitigt; könnte man wahrscheinlich hier auch weglassen

     

Inhalt abgleichen