Php mp3 id3 tag supports UTF-16

November 5th, 2008

Βρήκα ένα php script για mp3 id3 tag, για να το χρησιμοποιήσω με μία ajax form, ώστε όταν επιλέγεις ένα αρχείο mp3 να σου εμφανίζει αυτόματα τα στοιχεία του τραγουδιού (όνομα, συγκρότημα κτλ). Όλα καλά ώσπου ανακάλυψα ότι μπορεί ένα αρχείο να έχει τα στοιχεία στο v2 του id3 σαν UTF-16. Αυτό το κατάλαβα όταν στην φόρμα αντί να εμφανιστούν χαρακτήρες εμφάνιζε κουτάκια, ενώ με ένα mp3 player εμφανιζόταν κανονικά. Τότε με ένα hex editor και συγκεκριμένα τον αγαπημένο μου WinHex ανακάλυψα ότι τα στοιχεία ήταν σε UTF-16. Έτσι πείραξα λίγο το script, και τώρα υποστηρίζει και UTF-16.

Στην γραμμή 244 αντί για:
$this->v2[$name] = substr($frame, 1);
έβαλα αυτό:
$this->v2[$name] = $encoding=="\01" ? iconv("UTF-16","UTF-8",substr($frame, 1)) : substr($frame, 1);

php , ,

Ελληνικό blog για πραγματικό SEO

October 22nd, 2008

Ένα νέο blog το HumanWorks ξεκίνησε πριν λίγες μέρες, ιδιοκτήτης του, ο φίλος και συνεργάτης Νίκος Παπανώτας, γνωστός στον χώρο για τις επιτυχίες του στο seo γενικότερα. Συνεργάζεται με μεγάλους Seo Professionals, παγκοσμίως, και είναι ένας άνθρωπος που πραγματικά γνωρίζει το αντικείμενο.

Ουφ γεμίσαμε από διαφορά blog που λένε, ότι μιλάνε για seo… . Το συγκεκριμένο blog δεν θα μεταφέρει απλά ότι βρίσκεται στην μπλογκόσφαιρα για το seo (π.χ. από το seomoz.com) όπως κάνουν πολλοί, άλλα με δικά του πειράματα και των συνεργατών του, σχηματίζουν μια άποψη που δεν μένει μόνο στην θεωρεία.

Και για να πάμε στην πράξη, ο Νίκος έχει ένα community από webmasters το Webdigity, έχει ένα blog σε συνεργασία με τον Tim Nash το Paymentblogger. Είναι ιδρυτής του Topsites.gr που πρόσφατα θεωρήθηκε το κορυφαίο ελληνικό directory, από το PC Magazine, με το μεγαλύτερο site index στην κατηγορία του στο google. Το συγκεκριμένο για κάποια keywords έρχεται πιο μπροστά και από τα ίδια τα sites που περιέχει. Έχει ασχοληθεί με τα Social Media, και ειδικότερα με το Stumbleupon όπου έχει δημιουργήσει ένα έξυπνο concept για friend request το Mystumblefriends. Τέλος έχει δημιουργήσει mashup sites όπως το Web2Announcer και ασφαλώς σαν σωστός developer είναι fun του open source, (PhpUserClass), εδώ έχουμε και μια seo επιτυχία με το keyword “php class“, στα 10 πρώτα από 16.400.000 αποτόλεσματα.

Όλα τα παραπάνω δείχνουν ότι το blog θα είναι διαφορετικά από τα άλλα. Όσοι πραγματικά θέλουν να μάθουν πως μπορούν με seo και διάφορους άλλους σωστούς τρόπος να φέρουν καλή κίνηση στο site τους, και τονίζω την λέξη, γιατί το να φέρεις κίνηση είναι απλό, αλλά το να φέρεις καλή είναι η επιτυχία, δεν έχετε παρά να παρακολουθείτε τα νέα του από κοντά.

Καλή αρχή, HumanWorks

seo , , ,

JSON++ compiled with VS 6.0

September 17th, 2008

Χρειαζόμουν έναν τρόπο να συνδέσω ένα c++ script με ένα php script, ώστε να ανταλλάσουνε δεδομένα. Στην αρχή σκέφτηκα με xml από το stdin/stdout, άλλα δεν ήθελα και τόσο δομημένη πληροφορία, όποτε αποφάσισα να χρησιμοποιήσω json.

Για php δεν υπήρχε συζήτηση ότι θα χρησιμοποιούσα μία κλάση που έχω βρει, και την έχω δουλέψει αρκετά σε πολλά projects, την Services_JSON. Για C++ όμως δεν είχα χρησιμοποιήσει ποτέ, όποτε έπρεπε να ψάξω και να βρω κάτι που να με βολεύει.
Googlesearch, json.org, πολλά project, στα πρώτα αποτελέσματα, άλλα όχι κάτι απλό έτσι που το ήθελα εγώ. Κάπου στη 3η σελίδα βρήκα ένα ενδιαφέρον project το JSON++. Αμέσως το κατέβασα, και έφτιαξα ένα test project στο Visual Studio 6.0 να το δοκιμάσω. Το JSON++ όμως ήταν για Visual Studio .NET. Δεν πτοήθηκα, διότι στο παρελθών έχω κάνει και compile το php5 με VC++ 6.0, οπότε ξεκίνησα τις αλλαγές ώστε να γίνει το compile.
Στο αρχείο value.cpp στην γραμμή 428 και 432, διόρθωσα την εντολή swprintf από
swprintf(strnum,31,L”%.1lld”,(*(__int64 *)val));
σε
swprintf(strnum,L”%.1lld”,(*(__int64 *)val));

και
swprintf(strnum,31,L”%lG”,(*(double *)val));

σε
swprintf(strnum,L”%lG”,(*(double *)val));

Στο αρχείο parser.h έβγαλα την μεταβλητή errstrings, από την γραμμή 28 extern const wchar_t *errstrings[8];
Στο αρχείο parser.cpp πρόσθεσα τα παρακάτω includes στην αρχή

#include <stdio.h>

#include <stdlib.h>

Μετέφερα την μεταβλητή errstrings από το αρχείο errstrings.cpp εδώ μέσα namespace json {const wchar_t *errstrings[9]={
/*0*/ L”Invalid Unicode escape sequence”,
L”Tried to read past End of File”,
L”Error reading Array, ] expected”,
L”Unquoted object names not allowed”,
L”Error reading Object, : expected after name”,
/*5*/ L”Error reading Object, } expected”,
L”Could not find a valid Object value”,
L”Invalid unquoted string, or misspelled literal”,
L”Duplicate value name in Object”
};

και στην γραμμή 253 του παλιού αρχείο άλλαξα την συνάρτηση _wtof σε _wtol.Από
val->setnumber(_wtof(number.c_str()));
σε
val->setnumber(_wtol(number.c_str()));

Αυτό βέβαια δεν είναι σωστό, γιατί μία μεταβλητή float θα χαλάει, το σωστό θα ήταν να ασχολούμουν λίγο παραπάνω και να έβρισκα το σωστό συνδυασμό από functions προκείμενο να μετατραπεί σωστά το string σε float. Στην προκειμένη περίπτωση δεν θα είχα float όποτε και δεν ασχολήθηκα παραπάνω. Αν κάποιος το βρει θα ήθελα να το γράψει στα σχόλια για είναι ποιο ολοκληρωμένη η μετατροπή του project από .net σε 6.0.Τέλος έβγαλα το αρχείο errstrings.cpp από το compile γιατί ήταν άχρηστο πλέων, και το compile έγινε κανονικά.

Το JSON++ ήταν ακριβώς αυτό που χρειαζόμουν, διότι είναι πού εύκολο στην χρήση του σε αντίθεση με τα υπόλοιπα open source projects.

JSON, c++, php , ,

Reverse Engineering Academy

August 21st, 2008

Κάπως έτσι ξεκίνησε το οδοιπορικό μου στον κόσμο του reverse engineering. Φεβρουάριος 2003 και ένα απόγευμά σκάει ένας φίλος, που τον είχα χαμένο καμιά 5ετία, και πάνω στην κουβέντα τι κάνεις τώρα κτλ. μου αναφέρει μία ακαδημία REA (Reverse Engineering Academy) στο internet και συγκεκριμένα στην Γερμανία με το site www.reverser.de(τώρα δεν υπάρχει) , ότι έχει γίνει registered, σπάει προγράμματα, παίρνει βαθμούς και ανεβαίνει στον πίνακα σε σχέση με τους άλλους χρήστες.

Δεν ήθελα και εγώ πολύ για να γραφτώ, και να ξεκινήσω και τελικά να τερματίσω στην 3η θέση σε ένα χρόνο (πολύ ξενύχτι) . Το αποτέλεσμα ήταν να ανοίξει το μυαλό μου και να σκέφτομαι με τελείως διαφορετικό τρόπο πάνω στον προγραμματισμό. Με έχει βοηθήσει αρκετές φορές σε προβλήματα που παρουσιαστήκαν πάνω στην δουλειά μου και χρειάστηκαν γνώσεις reverse για να αντιμετωπιστούν. Τέλος άνοιξαν νέοι ορίζοντες για ιδέες και υλοποιήσεις σε διάφορα projects.

Αυτό που θέλω να πω, είναι ότι ένας προγραμματιστής καλό θα είναι να έχει και γνώσεις reverse, ώστε να μπορεί πάνω στην δουλεία του, ότι και να του τύχει, να βρίσκει πάντα την καλύτερη λύση. Σε κάποιο από τα επόμενα post, σκέπτομαι να βάλω ένα tutorial πως μπορείς να patchάρεις ένα πρόγραμμα.

Αν κάποιος ενδιαφέρετε η εξέλιξη της REA έχει πάρει άλλη διάσταση, με Bootcamps, Certifications , Consulting ρίξτε μία ματιά αξίζει. Στο community βρήκα ένα post για την REA 3, η REA 2 προς το παρόν δεν λειτουργεί. Αυτό που είναι στα σχέδια μου είναι να οργανώσω και εγώ μία REA σε κάποιο ελληνικό site.

Reverse Engineering

jQuery UI Tab conflict with xStandard

August 6th, 2008

Χρησιμοποίησα την jQuery με το plugin της UI για tabs, και ταυτόχρονα το ActiveX του XStandard για WYSIWYG XHTML editor, με αποτέλεσμα να χάνει το περιεχόμενο από τον editor στην αλλαγή των tabs. Το πρόβλημα το έλυσα με ένα patch του ui στη function tabify. Ποιο συγκεκριμένα, το plugin στο init των tabs, έκανε όλα τα panels hide και στην συνέχεια visible το selected. Αυτό που πείραξα εγώ, είναι να κάνει hide όλα εκτός από το selected.

// highlight selected tab
this.$panels.addClass(o.hideClass);

/* PATCHED BY THEK (not select tab invisible) */
var cc=0;
this.$panels.each(function() {
 var $this = $(this);
 if (cc++!=o.selected) $this.addClass(o.hideClass);
});
//this.$panels.addClass(o.hideClass);
//
/* PATCH BY THEK */

jQuery