RSS
 

Linux Befehle

02 Mai

10.79.50.84

linuxconfig.org/Bash_scripting_Tutorial

Secure Copy Examples

// Apt-Market
apt-cache search Paketname   // Suche nach Paket
apt-cache show Paketname // Installiertes Paket anzeigen
apt-get update // Hole Updates für alle installierten Pakete
apt-get dist -upgrade // Führe alle Updates durch
apt-get install Paketname // installiere Paket
apt-get remove Paketname // Löschen eines Pakets
apt-get autoremove Paketname // Löschen mit Abhängigkeiten

// Listet die Ordnerstruktur als Tree auf -R (rekursiv)
tree -R

// Textbasierter Browser
links

// Textbasiertes Mailprogramm
pine

// Datei erstellen
touch       oder        mk

// Change Owner -R (rekursiv)
chown user:gruppe dateiname

// Dateirechte
chmod 755 datei.txt

// Drei Zahlen: Ich/Gruppe/Other
// 1 ausführen
// 2 schreiben
// 4 lesen
// 3 ausführen und schreiben
// 5 lesen und ausführen
// 6 lesen und schreiben
// 7 alle Rechte

// Diskfree -h (Human Readable) -R
df -h

// aktuelles Verzeichnis
pwd

// Datei finden
find sourceDir -name suchbegriff

// Symbolische Links
ln -s sourceFile Link

// Rechnername ändern
//  von /etc/hostname holen
// in /etc/hosts eintragen
// Zeile nach localhost

// Passwort ändern
passwd user passwort

// User anlegen
adduser Username

// User löschen
deluser Username

// Rechner rebooten
shutdown -r now

// Letzte Logins anzeigen
last

// Apache restarten
/etc/init.d/apache2 restart

// Runlevel anzeigen
/etc/inittab

// Bootlog anzeigen
dmesg

// Kernel Information
uname -a

// Prozesse
kill ProzessID
ps -aux  // Alle Prozesse anzeigen (htop)
ps -u // Prozesse des eingeloggten benutzers

// offene Verbindungen anzeigen
netstat

// Runlevel wechseln zu 1
init 1

// Programm in Hintergrund starten
htop&

// Programm in den Vordergrund holen
fg

// Freicher Speicherplatz
df

// Seitenweise anzeigen
Befehl|more   // 1. Seite
Befehl|less      // letzte Seite

// Letzten Zeilen anzeigen
tail -f    // Live Anzeige eines zb Logfiles

// Interfaces einrichten
ifconfig

// Permanente Netzwerkkonfiguration
/etc/network/interfaces

// Route erstellen
route

// in File schreiben und gleichzeitig auf Konsole ausgeben
tee

// Trimmen, Leerzeichen entfernen
tr -d " "

// Ersetzen von Zeilenumbruch mit +
paste -sd +

// Konsolenrechner
bc

// Sequenz
seq 1 5

// Port überprüfen
nc -z ip port

// letzter Befehl erfolgreich
echo $?  // 0 für Ja, 1 für Nein

// Userinformationen anzeigen
finger user

 
 

this.form.submit() funktioniert nicht …

05 Mai

Öfters verwende ich bei <select> Elementen das Event “onchange=’this.form.submit();”
Das funktioniert jedoch NUR wenn kein Formelement mit dem Namen “submit” selber vorhanden ist.
Nennt man zb. den Absenden Button <input type=”submit” name=”submit” value=”Absenden”>, dann funktioniert das onchange nicht mehr.

Ist vielleicht ganz praktisch wenn der Fehler auftaucht und man zuerst nicht weiß warum es auf einmal nicht mehr funktioniert …

 

PHP Simple HTML DOM Parser

18 Apr

Letztens dachte ich mir , es wäre doch praktisch wenn es eine PHP Klasse gäbe, mit der man aus HTML Code einzelne Elemente herausparsen könnte.
Das ganze dann natürlich noch im Stil von jQuery und dessen Selektoren.

Gesucht, Gefunden !

PHP Simple HTML DOM Parser
http://simplehtmldom.sourceforge.net/

Elemente finden:

// Create DOM from URL or file
$html = file_get_html('http://www.google.com/');

// Find all images
foreach($html->find('img') as $element)
       echo $element->src . '<br>';

// Find all links
foreach($html->find('a') as $element)
       echo $element->href . '<br>'; 

Elemente modifizieren:

// Create DOM from string
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');

$html->find('div', 1)->class = 'bar';

$html->find('div[id=hello]', 0)->innertext = 'foo';

echo $html; // Output: <div id="hello">foo</div><div id="world" class="bar">World</div>

News auslesen:

// Create DOM from URL
$html = file_get_html('http://slashdot.org/');

// Find all article blocks
foreach($html->find('div.article') as $article) {
    $item['title']     = $article->find('div.title', 0)->plaintext;
    $item['intro']    = $article->find('div.intro', 0)->plaintext;
    $item['details'] = $article->find('div.details', 0)->plaintext;
    $articles[] = $item;
}

print_r($articles); 

 

Osterhasenparty.at Online

29 Mrz

Die neue Webseite der Osterhasenparty in der Römergrube Willendorf ist ab sofort online

www.Osterhasenparty.at

 

Asynchrones Dilemma

16 Feb

Im Blog phpmonkeys.de findet sich ein interessanter Artikel über Probleme die bei AJAX entstehen können.
Im folgenden ein Auszug:

Asynchrone Requests machen das A in AJAX aus und bieten viel Raum für interessante Betrachtungen. Hier geht es heute um das Problem, das veraltete Anfragen sauber erkannt oder alternativ ein hohe Anzahl von Antworten schnell verteilt werden sollen. Anhand einer Abstraktion werde ich den ersten Punkt beispielhaft beschreiben.

Aktuell bin ich in einem Projekt eingebunden, das sehr viel mit asynchronen Aufrufen arbeitet. Da es sich um eine Webapplikation handelt, ist dies nicht ganz so verwunderlich. Aber zuerst eine kurze Beschreibung des Problems.

Der Anwender kann durch eine Aktion einen Request (A1) auslösen, der – sobald die Antwort vom Server verarbeitet wurde – einen zweiten Request (A2) auslöst. Dessen Antwort kann unter Umständen beliebig viele weitere Requests (A1′) starten, die dem ersten ähneln. Wobei “beliebig” berechnet werden kann und einen maximal Wert hat.
Währen der Verarbeitung der A-Requests- und Response-Daten kann der Benutzer weitere Requests auslösen. Bspw. B1, C1 und D1. Das System verarbeitet diese neuen Requests wie den ersten und wir haben eine wahre Flut von Requests.

Das beim Auslösen von Request B1 die Komponente, die alles verwaltet partiell zurückgesetzt wird, hat man das Problem, das die Antwort von A2 nach dem zurücksetzen eingehen kann und damit zu einem inkonsistenten Zustand führen kann.

Der anfänglich theoretische Zustände konnte bei entsprechenden Benutzung erreicht werden. Somit war die Anwendung an dieser Stelle nicht robust und musste angepasst werden.

Wir haben uns für das ACT-Pattern entschieden. Also einen Asynchronous Completion Token eingeführt. Das heißt, sobald der Request A1 gefeuert wird, setzen wir einen Token in der Komponente und geben diesen dem Request mit. Alle Antworten und Requests, die aus A1 resultieren, müssen diesen Token mitführen, sonst werden sie verworfen und somit die Verarbeitung abgebrochen.

Löst der Benutzer B1, C1 und/oder D1 aus, wird der Token der Komponente neu gesetzt und somit können veraltete Antworten identifiziert werden. Dadurch haben wir die Komponente immer in einem gültigen Zustand.

Als Token nutzen wir aktuell einen Zeichenkette mit 10 Zeichen, die zufällig aus dem Alphabet (inkl. Groß- und Kleinschreibung) und den Zahlen von 0-9 zusammengesetzt sind. Man kann sich auch andere Tokens vorstellen – bspw zeitbasierte oder Hashwerte über bestimmte Request-Parameter.
Unsere 10 Zeichen-Implementierung werden wir noch ersetzen, denn es nicht sichergestellt ist, dass 2 aufeinanderfolgende Tokens nicht zufällig gleich sind. Dann hätte der Zufallszahlengenerator ein Problem oder es wäre der sprichwörtliche 6er im Lotto – und genau das passiert, wenn man eine solche Implementierung Live schaltet

 

Zend Framework Tutorial

16 Feb

Für alle die sich für das PHP Framework von Zend interessieren, gibts es hier eine wie ich finde sehr gute Anleitung für Anfänger:

http://www.zf-tutorials.de/archives/27

Das Tutorial behandelt zwar die Version 1.8, sollte aber auch mit der derzeit aktuellen Version 1.11 funktionieren.
Folgende Themen werden behandelt:

*) Installation und Einrichtung
*) Einrichtung des Apache Server (mod_rewrite)
*) Erklärung von MVC (Model-View-Controller) und Design Pattern
*) Behandlung der Komponenten Zend_Controller,Zend_Tool, Zend_View, Zend_Layout und Zend_Db

Auf alle fälle einen Blick wert !

 

Facebook Connect mit dem Javascript SDK und PHP

22 Dez

Hier ein Bespiel um eine Seitenregistrierung über Facebook Connect zu realisieren.
Zu Beginn erstellen wir eine Facebook Applikation auf www.facebook.com/developers da wir in weiterer Folge den API Key und den API Secret von dieser App verwenden werden.
Dann erstellen wir das Skript und binden zuerst das Javascript SDK im Header der HTML ein:

<script src="http://connect.facebook.net/de_DE/all.js"></script>

Als nächsten Schritt binden wir folgenden Code ans Ende der Datei ein, also unmittelbar vor dem </body> Tag:

<div id="fb-root"></div>
<script type="text/javascript">
 FB.init({appId: 'APP_ID', status: true, cookie: true, xfbml: true});
 FB.Event.subscribe('auth.sessionChange', function(response) {
   if (response.session) {
     // A user has logged in, and a new cookie has been saved
     window.location.reload();
   } else {
     // The user has logged out, and the cookie has been cleared
   }
 });

</script>

Was jetzt noch für das Connect fehlt ist der “Facebook Connect” Button mit dem das Popup geöffnet wird und wir uns bei Facebook anmelden können.
Dazu binden wir irgendwo innerhalb des body Tags folgenden Code ein:

<fb:login-button perms="email,user_birthday">Connect with Facebook</fb:login-button>

Durch die Einbindung des Javascript SDK wird dieser Button gerendert. Das Attribut perms=”email,user_birthday” verlangt zusätzlich Genehmigung um die Emailadresse und den Geburtstag des Benutzer auszulesen.

Bei erfolgreichem Login bei Facebook wird das Cookie auf unserer Domain gesetzt und die Seite durch “window.location.reload()” neu geladen.

Jetzt kann man zu Beginn des Scripts mit einer PHP-Funktion dieses Cookie auslesen:

define('FACEBOOK_APP_ID', '123456');
define('FACEBOOK_SECRET', '123456');

function get_facebook_cookie($app_id, $application_secret) {
   $args = array();
   parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args);
   ksort($args);
   $payload = '';
   foreach ($args as $key => $value) {
      if ($key != 'sig') {
         $payload .= $key . '=' . $value;
      }
   }
   if (md5($payload . $application_secret) != $args['sig']) {
      return null;
   }
   return $args;
}

$cookie = get_facebook_cookie(FACEBOOK_APP_ID, FACEBOOK_SECRET);

Um jetzt mit den Daten des eingeloggten Benutzers arbeiten zu können, verwenden wir folgende Code:

$me = json_decode(file_get_contents('https://graph.facebook.com/me?access_token='.$cookie['access_token'], true));

echo $me->first_name;
echo $me->last_name;
echo $me->email;
echo $me->location->name;

Durch die neue GraphAPI von Facebook ist es damit ziemlich einfach einen Facebook Connect herzustellen.
Weiter Informationen zur API findet man auf http://developers.facebook.com

 
 

Dateiupload und Progressbar mit jQuery und APC

30 Nov

Wenn man APC (Alternative PHP Cache) auf seinem Webserver verwendet, kann man recht schnell eine schöne Progressbar für Dateiuploads erstellen.
Sobald man APC installiert hat auf seinem Server muss man unbedingt noch dafür Sorge tragen das in der php.ini die Direktive “apc.rfc1867=1″ gesetzt wird. Danach einfach noch dem HTML Formular VOR dem Dateifeld ein verstecktes Feld anlegen mit dem Namen “APC_UPLOAD_PROGRESS”

<form enctype="multipart/form-data" id="upload_form" action="upload.php" method="post">

<input type="hidden" name="APC_UPLOAD_PROGRESS" id="progress_key"  value="<?php echo $i; ?>"/>
<input type="file" id="test_file" name="test_file"/>
<input type="submit" value="Upload!" onclick="jacascript:fire(); return false;"/>

</form>

Beim Klick auf den “Upload” Button wird hier das Formular mit der Datei abgesendet und gleichzeitig die Javascript Funktion “fire()” aufgerufen.
Um den Status der gerade raufzuladenden Datei dann abzurufen braucht man noch eine weitere PHP Datei mit folgendem Code:

<?php
if(isset($_GET['progress_key'])) {

$status = apc_fetch('upload_'.$_GET['progress_key']);
echo round($status['current']/$status['total']*100);

}
?>

Diese zweite Datei gibt den aktuellen Uploadfortschritt dann bei Aufruf als Prozentwert zurück.
Mit den folgenden jQuery Funktionen wird dann auf diese Datei per AJAX zugegriffen und in bestimmten frei definierbaren Zeitabständen der Status ausgelesen.
Hinzuzufügen ist hier daß man die jQuery UI Bibliothek inklusive dem Widget “progressbar” benötigt.

<script type="text/javascript">
	$(document).ready(function(){
		$('#progressbar').progressbar({
			value : 0
		});

		fire = function() {
			setTimeout("uploadProgress()", 500);
			$('.upload-progress').fadeIn();
			document.forms[0].submit();
		}

		uploadProgress = function() {
			$.ajax({
				url : 'checkupload.php?progress_key=<?php echo $i; ?>',
				success : function(msg) {
					$("#progressbar").progressbar( "option", "value", parseInt(msg) );
					$(".ui-progressbar-value").html(parseInt(msg) + ' % finished!');
					setTimeout("uploadProgress()", 500);
				}
			});
		};

	});
</script>

 

jQuery Schummelzettel

23 Nov

Auf der Seite http://www.visualjquery.com/ kann man so ziemlich alle Funktionen von jQuery durchblättern und durchprobieren. Die Demos basieren auf der Version 1.2.6 der Javascript Bibliothek und geben einen guten Einblick darauf was mit jQuery alles möglich ist.

Auf http://flowplayer.org/tools/index.html findet man ausserdem noch ein paar stilvolle Plugins für Scrolling, Tabs, Overlay und Form Tools. Einfach mal durchschauen ….

Unter http://dzineblog.com/ findet man tonnenweise neue Inspirationen fürs Webdesign. Vom Grafikdesign über die Benutzeroberfläche bis hin zu der Programmierung. Ein großartiger Blog !

 

Tooltips mit jQuery

20 Nov

Da derzeit das Tooltip Widget der jQuery UI noch den Status “under Development” hat, schreiben wir uns so ein Tooltip einfach mit wenigen Zeilen selber:

$(document).ready(function ()
{
  tooltip();
});

function tooltip()
{
  $("img.tooltip").mouseover(
    function (event)
    {
      var text = this.alt;

      // X- und Y-Koordinaten des Cursor ermitteln
      x = event.pageX+10;
      y = event.pageY+10;

      // ein DIV für den Tooltip erstellen
      $("body").append("<div id='tooltip'>"+text+"</div>");

      // das erstellte DIV mit CSS positionieren
      $("#tooltip").css("left", x).css("top", y);
    }
  );

  $("img.tooltip").mouseout(
    function (event)
    {
      // das DIV beim verlassen des Events entfernen
      $("#tooltip").remove();
    }
  );
}