<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Advanced Programming Stories &#187; php</title>
	<atom:link href="http://developstories.gr/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://developstories.gr</link>
	<description>advanced web development techniques &#38; reverse engineering stories</description>
	<lastBuildDate>Tue, 27 Jul 2010 12:57:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ζητούνται Web developers</title>
		<link>http://developstories.gr/uncategorized/%ce%b6%ce%b7%cf%84%ce%bf%cf%8d%ce%bd%cf%84%ce%b1%ce%b9-web-developers/</link>
		<comments>http://developstories.gr/uncategorized/%ce%b6%ce%b7%cf%84%ce%bf%cf%8d%ce%bd%cf%84%ce%b1%ce%b9-web-developers/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 17:32:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web developers]]></category>
		<category><![CDATA[εργασία]]></category>

		<guid isPermaLink="false">http://developstories.gr/?p=91</guid>
		<description><![CDATA[Αν είστε subscriber στο blog μου σίγουρα θα σας ενδιαφέρει η παρακάτω αγγελία. Η αγγελία αφορά το Social Whale, το project με το οποίο ασχολούμαι τους τελευταίους μήνες.
]]></description>
			<content:encoded><![CDATA[<p>Αν είστε subscriber στο blog μου σίγουρα <a href="http://humanworks.gr/humanworks/%CE%B6%CE%B7%CF%84%CE%BF%CF%8D%CE%BD%CF%84%CE%B1%CE%B9-web-developers/">θα σας ενδιαφέρει η παρακάτω αγγελία</a>. Η αγγελία αφορά το Social Whale, το project με το οποίο ασχολούμαι τους τελευταίους μήνες.</p>
]]></content:encoded>
			<wfw:commentRss>http://developstories.gr/uncategorized/%ce%b6%ce%b7%cf%84%ce%bf%cf%8d%ce%bd%cf%84%ce%b1%ce%b9-web-developers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hacking php</title>
		<link>http://developstories.gr/php/hacking-php/</link>
		<comments>http://developstories.gr/php/hacking-php/#comments</comments>
		<pubDate>Mon, 02 Feb 2009 11:31:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[hacking]]></category>

		<guid isPermaLink="false">http://developstories.gr/?p=73</guid>
		<description><![CDATA[Όταν τελείωσα το Reverse Engineering Academy course &#8211; και σαν καλός μαθητής που είμουν &#8211; μου έγινε η πρόταση να δημιουργήσω ένα project για την REA 2. Φυσικά λόγω του κολλήματος που έχω με την php σκέφτηκα να γράψω μία encrypted έκδοση της βιβλιοθήκης της php στα windows (php4ts.dll)
Φυσικά θα ήταν πιό εύκολο να χρησιμοποιήσω [...]]]></description>
			<content:encoded><![CDATA[<p>Όταν τελείωσα το <a href="http://developstories.gr/reverse-engineering/reverse-engineering-academy/">Reverse Engineering Academy</a> course &#8211; και σαν καλός μαθητής που είμουν &#8211; μου έγινε η πρόταση να δημιουργήσω ένα project για την REA 2. Φυσικά λόγω του κολλήματος που έχω με την <a href="http://www.php.net/">php</a> σκέφτηκα να γράψω μία encrypted έκδοση της βιβλιοθήκης της php στα windows (php4ts.dll)</p>
<p>Φυσικά θα ήταν πιό εύκολο να χρησιμοποιήσω ένα έτοιμο encryption library, ωστόσο έτσι δέν νομίζω οτι μαθαίνεις αρκετά και δεδομένου οτι μιλάμε για ένα project &#8220;ελεύθερου χρόνου&#8221; άξιζε τον κόπο. Επίσης η όλη εμπειρία που αποκόμισα με βοήθησε στην δημιουργία του php encryption που χρησιμοποιούμε στην <a href="http://www.netwerk.gr/">NetWerk</a> για διάφορα projects που χρειάζεται encryption.</p>
<p>Τελικά το project δέν μπήκε στην REA 2 και για κακή μου τύχη έχασα όλα τα sources αφού χάθηκαν τα backup και μου κλέψαν το laptop! Ευτυχώς ο zero (admin στην REA) είχε κρατήσει ένα αντίγραφο και μου το έστειλε.</p>
<p>Όσοι λοιπόν θέλετε να εξασκηθείτε στο hacking μπορείτε να κατεβάσετε το <a href="http://developstories.gr/wp-content/uploads/php.zip">zipάκι απο εδώ</a> και να παίξετε με το project. Ενδεχομένως  να σας φανούν χρήσιμα και τα εργαλεία για <a href="http://developstories.gr/php/10-must-%CE%B5%CF%81%CE%B3%CE%B1%CE%BB%CE%B5%CE%AF%CE%B1-%CE%B3%CE%B9%CE%B1-reverse-engineering/">reverse engineering</a> που έχω γράψει παλιότερα.</p>
<p>Αν βρείτε λύση &#8211; δηλαδή αν βρείτε τα arguments που χρειάζεται το πρόγραμμα για να καταλάβει πως είστε &#8220;php master&#8221; &#8211; αφήστε ένα σχόλιο. Happy cracking <img src='http://developstories.gr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://developstories.gr/php/hacking-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP ping</title>
		<link>http://developstories.gr/php/php-ping/</link>
		<comments>http://developstories.gr/php/php-ping/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 10:31:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[php ping]]></category>
		<category><![CDATA[ping]]></category>

		<guid isPermaLink="false">http://developstories.gr/?p=70</guid>
		<description><![CDATA[Σε ένα απο τα τελευταία projects που ασχολούμαι στην NetWerk, η εφαρμογή μου επικοινωνεί με web services που βρίσκονται σε άλλους servers, ωστόσο για την αποφυγή λαθών και για καλύτερο debugging ήθελα να κάνω ping τον server που &#8220;μιλάω&#8221; ωστε να ξέρω τι συμβαίνει.
Πώς κάνουμε ping με php
Επειδή γενικώς δέν μου αρέσει να ανακαλύπτω τον [...]]]></description>
			<content:encoded><![CDATA[<p>Σε ένα απο τα τελευταία projects που ασχολούμαι στην <a href="http://www.netwerk.gr/">NetWerk</a>, η εφαρμογή μου επικοινωνεί με web services που βρίσκονται σε άλλους servers, ωστόσο για την αποφυγή λαθών και για καλύτερο debugging ήθελα να κάνω ping τον server που &#8220;μιλάω&#8221; ωστε να ξέρω τι συμβαίνει.</p>
<h3>Πώς κάνουμε ping με php</h3>
<p>Επειδή γενικώς δέν μου αρέσει να ανακαλύπτω τον τροχό κάθε φορά που κάνω κάτι καινούριο, έψαξα στο internet και ανακάλυψα ένα code snippet για <a href="http://birk-jensen.dk/articles/php/ping/ping.php">ping μέσω php</a>. Το μόνο πρόβλημα, είναι πως εφόσον o server που κάνουμε ping δέν απαντήσει, το scriptάκι κολλάει. Παρακάτω είναι μία αλλαγμένη έκδοση του snippet οπου ορίζεις το timeout.</p>
<pre class="brush: php;">

&lt;?php

//add
function microtime_float() {
list($usec, $sec) = explode(&quot; &quot;, microtime());
return ((float)$usec + (float)$sec);
}

// Checksum calculation function
function icmpChecksum($data) {
if (strlen($data)%2)
$data .= &quot;\x00&quot;;

$bit = unpack('n*', $data);
$sum = array_sum($bit);

while ($sum &gt;&gt; 16)
$sum = ($sum &gt;&gt; 16) + ($sum &amp;amp; 0xffff);

return pack('n*', ~$sum);
}

// Making the package
$type= &quot;\x08&quot;;
$code= &quot;\x00&quot;;
$checksum= &quot;\x00\x00&quot;;
$identifier = &quot;\x00\x00&quot;;
$seqNumber = &quot;\x00\x00&quot;;
$data= &quot;Scarface&quot;;
$package = $type.$code.$checksum.$identifier.$seqNumber.$data;
$checksum = icmpChecksum($package); // Calculate the checksum
$package = $type.$code.$checksum.$identifier.$seqNumber.$data;
// And off to the sockets
$socket = socket_create(AF_INET, SOCK_RAW, 1);
if (socket_connect($socket, $argv[1], null)) {

socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array(&quot;sec&quot;=&gt;5, &quot;usec&quot;=&gt;0)); // thek add

// If you're using below PHP 5, see the manual for the microtime_float
// function. Instead of just using the m
//     icrotime() function.

//$startTime = microtime(true); // thek remove
$startTime = microtime_float(); // thek add

socket_send($socket, $package, strLen($package), 0);
if (socket_read($socket, 255)) {
//echo round(microtime(true) - $startTime, 4) .' seconds'; // thek remove
echo round(microtime_float() - $startTime, 4) .' seconds'; // thek add
}
else {
echo 'lost connection';
}
socket_close($socket);
}
else {
echo 'lost connection';
}
?&gt;
</pre>
<p>Στο παραπάνω παράδειγμα το timeout θα γίνει σε 5 δευτερόλεπτα. Αν θέλετε να το αλλάξετε απλώς αλλάξτε το 5 στην παρακάτω γραμμή:</p>
<p>socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array(&#8220;sec&#8221;=&gt;5, &#8220;usec&#8221;=&gt;0)); // thek add</p>
<p>Το script τρέχει μόνο απο CLI δίνοντας την εντολή</p>
<p>php -q script.php &lt;ip address&gt;</p>
<p>όπου script.php είναι το παρών σκριπτάκι και &lt;ip_address&gt; είναι η διεύθυνση που θέλετε να κάνετε ping. Σε επόμενο άρθρο θα γράψω πώς να το κάνετε απο web εφαρμογή.</p>
]]></content:encoded>
			<wfw:commentRss>http://developstories.gr/php/php-ping/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10 must εργαλεία για reverse engineering</title>
		<link>http://developstories.gr/php/10-must-%ce%b5%cf%81%ce%b3%ce%b1%ce%bb%ce%b5%ce%af%ce%b1-%ce%b3%ce%b9%ce%b1-reverse-engineering/</link>
		<comments>http://developstories.gr/php/10-must-%ce%b5%cf%81%ce%b3%ce%b1%ce%bb%ce%b5%ce%af%ce%b1-%ce%b3%ce%b9%ce%b1-reverse-engineering/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 14:22:41 +0000</pubDate>
		<dc:creator>thek</dc:creator>
				<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[hack]]></category>

		<guid isPermaLink="false">http://developstories.gr/?p=39</guid>
		<description><![CDATA[Παρακάτω είναι μια λίστα με διάφορα εργαλεία για reverse engineering που μπορείτε να χρησιμοποιήσετε αν ασχολείστε με το &#8220;σπόρ&#8221;.
Servant Salamander
Το Servant Salamander είναι ένα φανταστικό εργαλείο γενικά για development αλλα και για απλούς χρήστες. Το salamander είναι ένας file manager που θυμίζει λίγο το παλιό norton commander, ωστόσο παρέχει αρκετές ευκολίες για τους επαγγελματίες χρήστες [...]]]></description>
			<content:encoded><![CDATA[<p>Παρακάτω είναι μια λίστα με διάφορα εργαλεία για <a href="http://developstories.gr/cat/reverse-engineering/">reverse engineering</a> που μπορείτε να χρησιμοποιήσετε αν ασχολείστε με το &#8220;σπόρ&#8221;.</p>
<h3>Servant Salamander</h3>
<p>Το <a href="http://www.altap.cz/salam_en/index.html">Servant Salamander</a> είναι ένα φανταστικό εργαλείο γενικά για development αλλα και για απλούς χρήστες. Το salamander είναι ένας file manager που θυμίζει λίγο το παλιό norton commander, ωστόσο παρέχει αρκετές ευκολίες για τους επαγγελματίες χρήστες του, όπως file compare, ενσωματομένο ftp και sftp client, κτλ. Αξιοσημείωτο οτι ακόμα και στην αντιγραφή αρχείων είναι πιό γρήγορος απο τα windows <img src='http://developstories.gr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>EmEditor</h3>
<p>O <a href="http://www.emeditor.com/">emEditor</a> είναι ένας απλός text editor ο οποίος παρέχει ένα βασικό code highlighting και &#8220;παίζει&#8221; με οποιοδήποτε encoding(και UTF8). Δέν παρέχει τις ευκολίες ενός επαγγελματικού IDE ωστόσο είναι πολύ καλό για την περίπτωση που θέλουμε να επεξεργαστούμε ένα αρχείο γρήγορα.</p>
<h3>Hex Editor</h3>
<p>Ένας hex editor είναι τουλάχιστον απαραίτητος για όποιον ασχολείται με reverse engineering. Προσωπικά χρησιμοποιώ τον <a href="http://www.x-ways.net/winhex/">WinHex</a> αλλά μπορείτε να δείτε και τον <a href="http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm">xvi32</a> που είναι freeware.</p>
<h3>IDA Pro Dissasembler &amp; Debugger</h3>
<p>Ο  <a href="http://www.hex-rays.com/idapro/">IDA Pro</a> είναι ένας πολύ δυνατός dissasembler. Το εργαλείο παρέχει και debugger ωστόσο για αυτή την χρήση καλύτερα προτιμίστε τον&#8230;</p>
<h3>OllyDbg Debugger</h3>
<p>Ο <a href="http://www.ollydbg.de/">OllyDbg</a> είναι ο πιό εύχρηστος debugger που έχω βρεί μεχρι στιγμής.</p>
<h3>RegMon</h3>
<p>Το <a href="http://technet.microsoft.com/en-us/sysinternals/bb896652.aspx">RegMon</a> είναι ένα utility που αγοράστηκε απο την Microsoft. Η δουλειά του είναι να σας δείχνει ποιές εφαρμογές κάνουν αλλαγές στο registry.</p>
<h3>FileMon</h3>
<p>Το <a href="http://technet.microsoft.com/en-us/sysinternals/bb896642.aspx">FileMon</a> που επίσης έχει εξαγοραστεί απο την Microsoft είναι ένα εργαλείο που παρακολουθεί τις αλλαγές στο filesystem σε real time.</p>
<h3>LordPE</h3>
<p>To <a href="http://www.woodmann.net/collaborative/tools/index.php/LordPE">LordPE</a>(<a href="http://www.woodmann.net/collaborative/tools/index.php/Image:Sc_LordPE_2008-2-4_2.43.png">screenshot</a>) είναι ένα freeware εργαλειάκι που διαχειρίζεται πολλά κομμάτια αρχείων PE (Portable Executable)</p>
<h3>Winspector</h3>
<p>Ο <a href="http://www.windows-spy.com/">Winspector</a> είναι ίσως το καλύτερο alternative για τον Spy++ που έρχεται με το Visual Studio.</p>
<h3>Resource Hacker</h3>
<p>Το τελευταίο προγραμματάκι στην λίστα μας, ο <a href="http://www.angusj.com/resourcehacker/">Resource Hacker</a>, βοηθάει στην διαχείριση resource files. Μπορείτε να το χρησιμοποιήσετε για να δείτε ή και να επεξεργαστείτε resource files και resources απο εκτελέσιμα αρχεία.</p>
<h3>Bonus εργαλείο</h3>
<p>Το 11ο εργαλείο που παρουσιάζουμε σήμερα, είναι μια δική μου, open source, προσθήκη για <a href="http://developstories.gr/cat/php/">php</a> developers. Ονομάζεται <a href="http://code.google.com/p/phphexed/">php hexed</a> και χρησιμοποιείται  σαν patch script engine και μπορεί να συνεργάζεται με τον Win32Dasm  και με τον OllyDbg. Αργότερα θα κάνω post κάποιο παράδειγμα, οπότε αν σας ενδιαφέρει <a href="http://feeds.feedburner.com/DevelopStories">μείνετε συντονισμένοι</a> <img src='http://developstories.gr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://developstories.gr/php/10-must-%ce%b5%cf%81%ce%b3%ce%b1%ce%bb%ce%b5%ce%af%ce%b1-%ce%b3%ce%b9%ce%b1-reverse-engineering/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FirePHP για την έκδοση 4 του PHP</title>
		<link>http://developstories.gr/php/firephp-%ce%b3%ce%b9%ce%b1-%cf%84%ce%b7%ce%bd-%ce%ad%ce%ba%ce%b4%ce%bf%cf%83%ce%b7-4-%cf%84%ce%bf%cf%85-php/</link>
		<comments>http://developstories.gr/php/firephp-%ce%b3%ce%b9%ce%b1-%cf%84%ce%b7%ce%bd-%ce%ad%ce%ba%ce%b4%ce%bf%cf%83%ce%b7-4-%cf%84%ce%bf%cf%85-php/#comments</comments>
		<pubDate>Sat, 06 Dec 2008 10:19:36 +0000</pubDate>
		<dc:creator>thek</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[firePHP]]></category>

		<guid isPermaLink="false">http://developstories/?p=32</guid>
		<description><![CDATA[Είμαι σίγουρος ότι δεν υπάρχει web developer που να μην γνωρίζει το Firebug. Για όποιον δεν το γνωρίζει είναι ένα firefox extension που βοηθάει τον developer στην κατασκευή ενός site. Μπορείτε να επεξεργαστείτε και να κάνετε debug javascript, css και html πάνω στα πραγματικά δεδομένα και σε πραγματικό χρόνο. Βεβαία οι δυνατότητες του δεν έχουν [...]]]></description>
			<content:encoded><![CDATA[<p>Είμαι σίγουρος ότι δεν υπάρχει web developer που να μην γνωρίζει το <a href="http://getfirebug.com/index.html">Firebug</a>. Για όποιον δεν το γνωρίζει είναι ένα <a href="http://en.wikipedia.org/wiki/List_of_Firefox_extensions">firefox extension</a> που βοηθάει τον developer στην κατασκευή ενός site. Μπορείτε να επεξεργαστείτε και να κάνετε debug javascript, css και html πάνω στα πραγματικά δεδομένα και σε πραγματικό χρόνο. Βεβαία οι δυνατότητες του δεν έχουν όρια…, εγώ πχ. σαν <a href="http://en.wikipedia.org/wiki/Reverse_engineering">reverser</a> τον χρησιμοποιώ και διαφορετικά. Δεν θέλω να επεκταθώ παραπάνω για τον firebug γιατί δεν είναι και το θέμα του άρθρου. Όποιος όμως θέλει να μάθει περισσότερα μια αναζήτηση στο <a href="http://www.google.com/search?hl=en&amp;q=firebug">google</a> και θα βρει αξιόλογα πράγματα. Εγώ βρηκα σε ένα <a href="http://www.chatzimanolis.gr/post/11-Tips-ceb3ceb9ceb1-cf84cebf-Firebug.aspx">ελληνικό blog 11 tips</a>.</p>
<p>Ξεφύγαμε στο θέμα μας. <a href="http://www.firephp.org/">FirePHP</a> ένα πολύ δυνατό firefox extension που παράλληλα με το firebug μπορούμε να κατευθύνουμε τα php (error και debug) μηνύματα μας στην κονσόλα του firebug. Στο site του firephp μπορείτε να βρείτε μία php class που μπορείτε να την ενσωματώσετε στο project σας και να χρησιμοποιείτε την firebug console.</p>
<p>Τι γίνεται όμως αν χρησιμοποιείτε την έκδοση 4 του <a href="http://www.php.net/">php</a> ακόμα ? Δεν υπάρχει τίποτα και δεν πρόκειται να βγάλουν, διότι όσο έψαξα, όλοι λένε &#8220;php4 is dead&#8221;. Προσωπικά δεν νομίζω να ισχύει αυτό διότι υπάρχουν πολλά projects που τρέχουν σε php4 και δεν έχουν περάσει σε php5. Εμείς π.χ. στην <a href="http://www.netwerk.gr/">Netwerk</a> δεν έχουμε γυρίσει 100% σε php5 σε όλα μας τα project.</p>
<p>Έτσι σκέφτηκα να δημιουργήσω from scratch (πολύ το γουστάρω αυτό) μία function που να εμφανίζει της μεταβλητές που θέλω, σε πρώτη φάση, και στην συνέχεια να την ενσωματώσω στον <a href="http://www.php.net/set-error-handler">error handler</a> του php και στον mysql error handler ώστε να μου εμφανίζει τα php και mysql errors. Το ποιο ωραίο είναι ότι μπορείς να δεις και ένα dump από ένα mysql query με μορφή table καθώς και ένα πολύπλοκο array ή object, γιατί ανοίγει ένα παραθυράκι στη μέση της οθόνης με scroll.</p>
<p>Το καλό με τον firephp είναι ότι δεν σου χαλάει το site ένα error που θα εμφανιστεί ή ένα dump που θέλεις να κάνεις. Άντε πολύ ασχοληθήκαμε με την θεωρεία, πάμε σε λίγο ανάλυση και κώδικα.</p>
<p>Πως δουλεύει ο firephp; Πολύ έξυπνο χρησιμοποιεί δικούς του headers με μία πολύ έξυπνη δομή. Υπάρχει η προηγούμενη έκδοση <a href="http://www.firephp.org/Wiki/Reference/Protocol">X-FirePHP</a> (ασχολήθηκα λίγο και την παράτησα) και η τωρινή <a href="http://code.google.com/p/firephp/issues/detail?id=63">X-Wf</a> που είναι πολύ ποιο βελτιωμένη.</p>
<p>Έφτιαξα λοιπόν μια function την dev (την ονόμασα έτσι γιατί την είχα και παλιά, απλά τα τύπωνε στον browser), η οποία στην ουσία στέλνει τα κατάλληλα headers. Για json χρησιμοποείσα την php class <a href="http://mike.teczno.com/JSON/JSON.phps">Services_JSON</a>.</p>
<pre class="brush: php;">
function dev($a0) {
static $messageIndex=1;
if ($messageIndex==1) {
header('X-Wf-Protocol-1:http://meta.wildfirehq.org/'.'Protocol/JsonStream/0.2');
header('X-Wf-1-Plugin-1:http://meta.firephp.org/'.'Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.2.0');
header('X-Wf-1-Structure-1:http://meta.firephp.org/'.'Wildfire/Structure/FirePHP/FirebugConsole/0.1');
}
$type='INFO';
$args=func_get_args();
if (is_string($type)) {
$a0=strtoupper($a0);
if ($a0=='LOG' || $a0=='INFO' || $a0=='WARN' || $a0=='ERROR' || $a0=='TABLE') {
array_shift($args);
$type=$a0;
}
}

include_once('json.php');
$json = new Services_JSON();
$_ar=debug_backtrace();
if (strstr($_ar[0]['file'],'cmysql')) {
array_shift($_ar);
}
elseif (is_array($args[0]) &amp;amp;&amp;amp; $args[0][msg]) {
$_ar[0]=$args[0];
$args[0]=$args[0][msg];
}
foreach($args as $arg) {
if (is_resource($arg)) $arg=get_resource_type($arg);
$meta=array('Type'=&gt;$type,'File'=&gt;$_ar[0]['file'],
'Line'=&gt;$_ar[0]['line']);
$msg='['.$json-&gt;encode($meta).','.$json-&gt;encode($arg).']';
$parts=explode(&quot;\n&quot;,chunk_split($msg,5000,&quot;\n&quot;));
for($i=0; $i
$part = $parts[$i];
if ($part) {
if(count($parts)&gt;2) {
header('X-Wf-1-1-1-'.$messageIndex.':'.
(($i==0)?strlen($msg):'').'|'.
$part.'|'.(($i
}
else {
header('X-Wf-1-1-1-'.$messageIndex.':'.
strlen($part).'|'.$part.'|');
}
$messageIndex++;
}
}
}
}
</pre>
<p>Έπειτα χρησιμοποίησα την set_error_handler  και την σύνδεσα με την dev για να έχω και τα php error.</p>
<pre class="brush: php;">
function errorHandler($errno, $errmsg, $filename, $linenum, $vars) {
if(error_reporting()!=0) {
$errortype = array(
E_ERROR           =&gt; &quot;ERROR&quot;,
E_WARNING         =&gt; &quot;WARN&quot;,
E_PARSE           =&gt; &quot;ERROR&quot;,
E_USER_ERROR      =&gt; &quot;ERROR&quot;,
E_USER_WARNING    =&gt; &quot;WARN&quot;,
);
if ($errortype[$errno]) {
dev($errortype[$errno],array(&quot;msg&quot;=&gt;$errno.': '.
$errmsg,&quot;file&quot;=&gt;$filename,&quot;line&quot;=&gt;$linenum));
}
}
}
set_error_handler(&quot;errorHandler&quot;);
</pre>
<p>Σύνδεσα την κλάση που έχω για <a href="http://www.mysql.com/">mysql</a> query ώστε τα error να τα στέλνω στην dev. Τέλος μέσω της dev με τύπο table έδωσα τα αποτελέσματα των queries.</p>
<pre class="brush: php;">
function dump() {
$dbDump = new CMySql();
$dbDump-&gt;query($this-&gt;Query,-1);
$body=array();
$title = $this-&gt;Query.&quot; (rows: &quot;.$dbDump-&gt;num_rows().&quot;, fields: &quot;.($dbDump-&gt;num_fields()-1).&quot;)&quot;;
if ($dbDump-&gt;next()) {
$header = array();
foreach($dbDump-&gt;record() as $i=&gt;$v) $header[]=$i;
$body[] = $header;
do {
$row = array();
foreach($dbDump-&gt;record() as $v) $row[]=$v;
$body[] = $row;
}
while ($dbDump-&gt;next());
}
dev('table',array($title, $body));
}
</pre>
<p>Υπάρχουν και άλλοι τύποι στα headers που δεν ασχολήθηκα ακόμα. Trace, Dump και Groups, αλλά αυτά ας τα αφήσουμε στην php5, για να μην μας πουν ότι κάνουμε και προπαγάνδα κατά της ή ότι στηρίζουμε μόνο την php4. Απλά είναι κρίμα το firephp να είναι προνόμιο της php5, μόνο και μόνο επειδή το αποφάσισαν κάποιοι. Το μόνο configuration που χρειάζεται για να λειτουργήσουν τα παραπάνω, είναι να είναι ανοιχτό το <a href="http://www.webdigity.com/php-manual/ref.outcontrol.html#ini.output-buffering">output buffering</a> ή να χρησιμοποιήσετε την <a href="http://www.webdigity.com/php-manual/function.ob-start.html">ob_start()</a></p>
]]></content:encoded>
			<wfw:commentRss>http://developstories.gr/php/firephp-%ce%b3%ce%b9%ce%b1-%cf%84%ce%b7%ce%bd-%ce%ad%ce%ba%ce%b4%ce%bf%cf%83%ce%b7-4-%cf%84%ce%bf%cf%85-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Php mp3 id3 tag supports UTF-16</title>
		<link>http://developstories.gr/php/php-mp3-id3-tag-supports-utf-16/</link>
		<comments>http://developstories.gr/php/php-mp3-id3-tag-supports-utf-16/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 10:15:05 +0000</pubDate>
		<dc:creator>thek</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[id3]]></category>
		<category><![CDATA[mp3]]></category>

		<guid isPermaLink="false">http://developstories/?p=30</guid>
		<description><![CDATA[Βρήκα ένα php script για mp3 id3 tag, για να το χρησιμοποιήσω με μία ajax form, ώστε όταν επιλέγεις ένα αρχείο mp3 να σου εμφανίζει αυτόματα τα στοιχεία του τραγουδιού (όνομα, συγκρότημα κτλ). Όλα καλά ώσπου ανακάλυψα ότι μπορεί ένα αρχείο να έχει τα στοιχεία στο v2 του id3 σαν UTF-16. Αυτό το κατάλαβα όταν [...]]]></description>
			<content:encoded><![CDATA[<p>Βρήκα ένα <a href="http://en.wikipedia.org/wiki/PHP">php script</a> για <a href="http://rasher.dk/source/mp3/id3.php">mp3 id3 tag</a>, για να το χρησιμοποιήσω με μία <a href="http://en.wikipedia.org/wiki/AJAX">ajax</a> <a href="http://www.w3schools.com/TAGS/tag_form.asp">form</a>, ώστε όταν επιλέγεις ένα αρχείο <a href="http://en.wikipedia.org/wiki/MP3">mp3</a> να σου εμφανίζει αυτόματα τα στοιχεία του τραγουδιού (όνομα, συγκρότημα κτλ). Όλα καλά ώσπου ανακάλυψα ότι μπορεί ένα αρχείο να έχει τα στοιχεία στο v2 του <a href="http://en.wikipedia.org/wiki/ID3">id3</a> σαν UTF-16. Αυτό το κατάλαβα όταν στην φόρμα αντί να εμφανιστούν χαρακτήρες εμφάνιζε κουτάκια, ενώ με ένα <a href="http://en.wikipedia.org/wiki/MP3_player">mp3 player</a> εμφανιζόταν κανονικά. Τότε με ένα <a href="http://en.wikipedia.org/wiki/Hex_editor">hex editor</a> και συγκεκριμένα τον αγαπημένο μου <a href="http://www.x-ways.net/winhex/index-m.html">WinHex</a> ανακάλυψα ότι τα στοιχεία ήταν σε <a href="http://en.wikipedia.org/wiki/UTF-16">UTF-16</a>. Έτσι πείραξα λίγο το script, και τώρα υποστηρίζει και UTF-16.</p>
<p>Στην γραμμή 244 αντί για:<br />
<span style="color: #ff0000;"><code>$this-&gt;v2[$name] = substr($frame, 1);</code></span><br />
έβαλα αυτό:<br />
<span style="color: #3333ff;"><code>$this-&gt;v2[$name] = $encoding=="\01" ? iconv("UTF-16","UTF-8",substr($frame, 1)) : substr($frame, 1);</code></span></p>
]]></content:encoded>
			<wfw:commentRss>http://developstories.gr/php/php-mp3-id3-tag-supports-utf-16/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pass cookie to header location with curl</title>
		<link>http://developstories.gr/php/pass-cookie-to-header-location-with-curl/</link>
		<comments>http://developstories.gr/php/pass-cookie-to-header-location-with-curl/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 09:29:05 +0000</pubDate>
		<dc:creator>thek</dc:creator>
				<category><![CDATA[cURL]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[session]]></category>

		<guid isPermaLink="false">http://developstories/?p=8</guid>
		<description><![CDATA[Ξεκίνησα να φτιάξω ένα seo tool για να μπορώ να καταχωρώ ένα web site σε πολλούς ελληνικούς καταλόγους μέσα από μία μόνο φόρμα. Μέχρι τώρα αυτό που έκανα, και φαντάζομαι και πολλοί άλλοι, είναι να καταχωρώ το web site σε κάθε κατάλογο ξεχωριστά.
Σκέφτηκα λοιπών να συνδέομαι με curl στις φόρμες που έχουν το καθένα για [...]]]></description>
			<content:encoded><![CDATA[<p>Ξεκίνησα να φτιάξω ένα <a href="http://en.wikipedia.org/wiki/Search_engine_optimization">seo tool</a> για να μπορώ να καταχωρώ ένα <a href="http://en.wikipedia.org/wiki/Web_site">web site</a> σε πολλούς ελληνικούς καταλόγους μέσα από μία μόνο φόρμα. Μέχρι τώρα αυτό που έκανα, και φαντάζομαι και πολλοί άλλοι, είναι να καταχωρώ το web site σε κάθε κατάλογο ξεχωριστά.</p>
<p>Σκέφτηκα λοιπών να συνδέομαι με <a href="http://curl.haxx.se/">curl</a> στις φόρμες που έχουν το καθένα για την προσθήκη web site, και να σώζω το <a href="http://en.wikipedia.org/wiki/HTTP_cookie">cookie</a> ώστε να μπορώ να το χρησιμοποιήσω στην συνεχεία, στο submit. Πολλά από αυτά όμως έχουν <a href="http://en.wikipedia.org/wiki/Captcha">captcha</a>. Στην αρχή είπα να ψάξω να βρω κάποιο <a href="http://en.wikipedia.org/wiki/Open_source">open source project</a> με <a href="http://en.wikipedia.org/wiki/OCR">ocr</a> για να μπορέσω να σπάσω τα captcha. Πάνω στην ερευνά μου βρήκα κάποια project που όμως δεν με ενθουσίασαν και πολύ (<a href="http://sam.zoy.org/pwntcha/">Pwntcha</a>, <a href="http://www.alixaxel.com/wordpress/2007/06/15/php-captcha-decoder/">Php Captcha Decoder</a>).</p>
<p>Ένας φίλος, ο Νίκος Παπανώτας ιδρυτής του <a href="http://www.webdigity.com/">webdigity</a> ένα <a href="http://en.wikipedia.org/wiki/Community">community</a> από <a href="http://en.wikipedia.org/wiki/Webmaster">webmasters</a>, μου πρότεινε ένα πολύ καλό web site που έχει ένα <a href="http://en.wikipedia.org/wiki/API">api</a> για captcha <a href="http://en.wikipedia.org/wiki/Decoder">decoder</a> το <a href="http://www.captchakiller.com/">Captcha Killer</a>. Αν και θα μπορούσα να το χρησιμοποιήσω, γιατί το δοκίμασα και παίζει πολύ καλά, (ο τύπος έβγαλε και μπλουζάκια), τελικά κατέληξα σε μια ιδέα που είχα να φέρω τα captcha image urls και να τα δείχνω στη δικιά μου φόρμα.</p>
<p>Αυτό είναι και το θέμα του post. Πως μπορείς να χρησιμοποιήσεις το curl έτσι ώστε να διαβάσει το cookie από τον <a href="http://en.wikipedia.org/wiki/List_of_HTTP_headers">header</a> και να το στείλει απ΄ ευθείας στην επόμενη σελίδα, που υπάρχει στο header location. Περισσότερες <a href="http://www.php.net/manual/en/function.curl-setopt.php#70043">λεπτομέρειες για τον php κώδικα</a> βρήκα στα user comments στο επίσημο web site του php.</p>
<p>Αυτό που χρειάζετε είναι μια function που διαβάζει τον header, βρίσκει τα cookie και τα ξαναστέλνει στο curl, πριν αυτό τελειώσει. Αυτό ορίζετε με την εντολή<br />
<strong>curl_setopt($ch,CURLOPT_HEADERFUNCTION,&#8217;read_header&#8217;)</strong>.<br />
Για να περάσουμε απευθείας στην σελίδα που υπάρχει στο header location χρησιμοποιούμε την εντολή <strong>curl_setopt($ch,CURLOPT_FOLLOWLOCATION, true)</strong>.<br />
Έτσι τα αποτελέσματα που θα πάρουμε από το curl θα είναι το <a href="http://en.wikipedia.org/wiki/HTML">html</a> της σελίδας μετά το redirect.</p>
<p>Μόλις τελειώσει αυτό το tool θα ανακοινώσω το url που θα βρίσκεται γιατί θα είναι free.</p>
]]></content:encoded>
			<wfw:commentRss>http://developstories.gr/php/pass-cookie-to-header-location-with-curl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
