Iron Monkey – Our Problem (1998)

000fdeb3
Στις 24 Αυγούστου του 1998 μια παρέα από το Nottingham της Αγγλίας κυκλοφόρησε αυτό που έμελλε να είναι το τελευταίο της full length L.p. Ήταν οι Iron Monkey. Oι Iron Monkey ήταν μια sludge μπάντα, ενεργή από το 1994 έως και το 1999. Κυκλοφόρησαν δύο full length L.p’s και ένα split με τους Church of Misery.Παρά τον βραχύβιο της βίο, η μπάντα είχε παίξει στην Ελλάδα σαν support στους Pro – Pain.

To album περιέχει οκτώ κομμάτια. Πρώτο κομμάτι το ”Bad Year”. To ”Bad Year” είναι ένα εντυπωσιακά πωρωτικό κομμάτι με μια φοβερή εισαγωγή που είναι αδύνατον να μην κάνει αρκετά κεφάλια να γυρίσουν, κατά την αμερικάνικη έκφραση. Εκεί παίρνουμε και ένα πρώτο δείγμα των τρομερών φωνητικών skills του Johnny Morrow. To ”Supagorgonizer” είναι ένας sludge κομμάταρος. Για το κομμάτι αυτό είχε φτιαχτεί και ένα video clip με σκηνές κάτς. Το ”Boss Keloid” είναι ένα κομμάτι το οποίο θα πρέπει να ακούγεται αρκετά δυνατά. Δεν γίνεται διαφορετικά.  Τρομερό πάντα το σημείο στο 1:48. Όπως σε όλο το δίσκο έτσι και στο κομμάτι αυτό φαίνεται η αγάπη της μπάντας για τους Black Sabbath. Μετά το ”ΙRMS” σειρά έχει το δεύτερο αγαπημένο μου κομμάτι του δίσκου που είναι το ”House Anxiety”. Τρομερό κομάτι κατά την άποψη μου, με φοβερή εναλλαγή γρήγορων και downtempo σημείων. Όσα χρόνια και αν το ακούω η τρίχα μου σηκώνεται κάγκελο στο 02:23. Στο ”2 Golden Rules” η μπάντα δίνει αρκετά γκάζια. To ending του δίσκου για μένα είναι ουσιαστικά η εισαγωγή στο feel good heat of the winter στο rampton των Teeth of Lions Rule the Divine.

Για μένα το Our Problem είναι μια από τις καλύτερες κυκλοφορίες των τελευταίων δεκαπέντε χρόνων. Ένα αξεπέραστο διαμάντι του παγκόσμιου underground. Μετά τη διάλυση της μπάντας το 1999 τα μέλη ασχολήθηκαν με διάφορα projects όπως My War, Armour of God, Dukes of Nothing. O Justin Graves έπαιξε ντράμς και στους Electric Wizard. To 2002 o Johnny Morrow δυστυχώς απεβίωσε, αλλά τα άλμπουμς των Iron Monkey, η φωνάρα του αλλά και οι θεϊκοί στίχοι που τραγουδούσε θα είναι για πάντα μαζί μας.

Advertisements

King Dude & Chelsea Wolfe – Sing More Songs Together​.​.​.​

a1315393803_10

We begin this review with a fact. Chelsea Wolfe can sing. She has some serious singing skills. Together with King Dude, who has a pretty cool voice too, they created this 7” L.p. Chelsea Wolfe is an american songwriter and so far she has released four full length L.p’s. King Dude is an american singer-songwriter too and he has released three full length L.p’s.

”Sing More Songs Together” 7” contains two songs. First one is ”Be Free”, which is a lovely, acoustic song. ”Bed on Fire” is enchanting as hell. Chelsea Wolfe, especially on ”Bed on Fire” sounds like a strange creature from an elven kingdom. I must admit, i love her eerie voice.

I’m not entirely sure how to descibe the music style of this 7”. Some call it neo folk while others describe it as ”doomish” goth rock. All i know is that is highly recommended. The production is awesome, and as bandcamp says ”Sing More Songs Together” will be available on the 25th of March. Links about Chelsea Wolfe, King Dude & Sing More Songs Together:

Blvck Ceiling – Ghost e.p

a3580598555_10
February 21st, and Blvck Ceiling has returned with yet another release. And all i can say is, what a release this is! Blvck Ceiling is an american procuder. He has released many works in the past, with Ghost e.p being the latest one.

Ghost contains five tracks. Five tracks that combine electronic music, hip hop, and some post punk/goth ambience perhaps. Songs like ”Runner” and ”future islands” might remind you of the Canadian duo Crystal Castles, with some nostalgic 90’s electronica. ”Bad Girls” is a pretty cool song. It’s actually a nice remix of bad girls, which is a song by british rapper M.I.A. ”Body Electric” is nice too, while ”Ghost” is the darkest song of this e.p.

I consider ”Ghost” e.p to be one of the best releases of February. It is a release that is highly recommended. Here are some useful links about Blvck Ceiling and ”Ghost” e.p:

MYSQL statement generation from object


The last one and a half year, my main project at work has to do with various sports data, different leagues, different teams, different matches, different countries and tons & tons of statistical information about teams & players that i’ve never heard before. Importing large amount of data of uknown structure every day to my super-dooper MYSQL database has become my daily routine. The process goes like that: fetch uknown data from a source through a SOAP call (or other means), examine the data structure, check if the data can be distributed to an existing database table, if not, create a table with the specified attributes, add some unique keys that will differentiate each row from the others aaaaaannnnndddd fill it with stuff!! Yeah! And pretty much this is it regarding data fetching. Although, one day, i got a request to fetch and store data that had to do with detailed team statistics, but they were soooooooo detailed that i almost cried after observing the received object through SOAP. The object was actually a huge data set, where all attributes couldn’t make any sense to me, because i am not a sports guy (OK i am, but not a friend of the most popular ones) and every value was a double number. We are talking about one object that had 200+ (?!!) attributes. So, i was thinking, OK, i am gonna store it and stuff, but someone needs to write the FUCKING CREATE TABLE/INSERT STATEMENTS HERE! OMG! This would take me 3 days, only to write & parse correctly the MYSQL queries, plus after the vast amount of MYSQL programming errors, i would turn blind. So i thought “Wait a minute! My friend here is gonna do it for me! I just need to describe him what i want to do!”.

MYSQL create table statement generation

How? Well, let’s start with the most hardcore one, the generation of a MYSQL create table, by having as input an object received through a SOAP call of a known & trusted source/web service. If it isn’t trusted, then through the following method, someone can trick you to generate table that holds weird information such as binaries, bank accounts, stolen passwords, monitored ips, whatever he wants, so let’s be precise to who is trusted and who is not. Let’s start by downloading the data and storing them in an object variable in our program. The following UML shows the steps i followed, in order to be able to generate a nice & safe MYSQL .

create_table


After ensuring that our attribute lists are filled with the correct keys, we pass the initial dictionary (our fetched object) along the not_null, index , auto_incr and primary_key lists to the MYSQL create table statement generation function to do the magic.

import datetime
import math
def generate_create_table_from_dict(d,db_name,db_table,autoincrement_id=True,index=None,primary_key=None,not_null=False):
    if not d:
        return 
    print ‘Generate create table from dict’
    #print d
    keys = d.keys()
    Q = ‘CREATE TABLE ‘ + db_name + ‘.’ + db_table + ‘ (‘
    if autoincrement_id == True:
        Q += ‘id INT NOT NULL AUTO_INCREMENT,’    for k in keys:
         if isinstance(d[k],float) == True:
             if not_null:
                 if k in not_null:
                     Q += k +‘ DOUBLE NOT NULL,’
                 else:
                     Q += k +‘ DOUBLE,’
         elif isinstance(d[k],int) == True:
             if not_null:
                 if k in not_null:
                     Q += k +‘ INT NOT NULL,’
                 else:
                     Q += k +‘ INT,’
         elif isinstance(d[k],string) == True:
             if not_null:
                 if k in not_null:
                     Q += k +‘ TEXT NOT NULL,’ # Disadvantage: why blob and not VARCHAR(k) -> save some space?
                 else:
                     Q += k +‘ TEXT,’
         elif isinstance(d[k],datetime.datetime) == True:
             if not_null:
                 if k in not_null:
                     Q += k +‘ DATETIME NOT NULL,’
                 else:
                     Q += k +‘ DATETIME,’
         elif isinstance(d[k],datetime.date) == True:
             if not_null:
                 if k in not_null:
                     Q += k +‘ DATE NOT NULL,’
                 else:
                     Q += k +‘ DATE,’    if primary_key:
        Q += ‘ PRIMARY KEY (‘+primary_key+‘)’
    if not index:
        Q += ‘);’
    else:
        Q += ‘,’
        Q += ‘UNIQUE KEY(‘+ ‘,’.join(index)+‘));’    #print Q
    return Q


The above script constructs a create table statement by taking into account the content of passed attributes list. Although, be careful before executing the sql query, check that everything looks fine, the unique key components are there and everything have been assigned the correct data type. Otherwise, you will suffer during the whole process and you will need to perform the whole sequence of steps again before trying to fetch & store your fresh data. In addition, the previous generation function should be supervized and executed only once! After all, your table has been created & set correctly in your database, right? We won’t call the previous call again in our code while fetching new data, it is not needed.

MYSQL insert statement generation
In order to generate the insert statement, we will need the list of the table’s attributes and an additional list of attributes which are actually the unique key or unique key components that are ensuring that each row is unique with respect to the key or combination of keys. The other row attributes can be updated normally, in case an object with the matched key properties is fetched through the SOAP call.
insert_stmnt

OK, we are set. Now let’s pass everything through the following code generation function!

import datetime
import math
def generate_insert_statement_from_dict(d,db_name,db_table,not_on_update=None):
    if not d:
        return 
    print ‘generate insert stmnt from dict’
    keys = d.keys()    Q = ‘INSERT INTO ‘ + db_name + ‘.’ + db_table + ‘ (‘
    PARAMS = ‘ VALUES ( ‘
    for i in xrange(0,len(keys)):
        if i == len(keys)  1:
            Q += keys[i]+‘)’
            PARAMS += ‘%s)’
        else:
            Q += keys[i]+‘,’
            PARAMS += ‘%s,’    if not not_on_update:
        return (Q+PARAMS),tuple(d[keys[i]] for i in xrange(0,len(keys)))
    else:
        ON_DUPLICATE = ” ON DUPLICATE KEY UPDATE “
        for i in xrange(0,len(keys)):
            if keys[i] in not_on_update:
                continue
            if i == len(keys)  1:
                ON_DUPLICATE += keys[i]+‘ = VALUES (‘+keys[i]+‘);’
            else:
                ON_DUPLICATE += keys[i]+‘ = VALUES (‘+keys[i]+‘),’     
         t = list(d[keys[i]] for i in xrange(0,len(keys)))    
        for i in xrange(0,len(t)):
            #print t[i],type(t[i])
            if math.isnan(t[i]) == True:
                t[i] = 0
        t = tuple(t)
        return (Q+PARAMS+ON_DUPLICATE,t)


After receiving the results (the MYSQL insert query), triple check if the keys are there and are not updated. Then pass it to MYSQL through command line to see if the commit was successful. The previous function can be called every time new data of the specified data structure arrives in you data link layer. Otherwise, after the statement generation, you could assign the whole string to a variable, which would be publicly available/global during runtime, allowing you to fill it with the received values and then execute it as a query to the MYSQL database, without having to generate the statement over and over again for every new object of that specific type. In any case, it saved me hours and hours of writing, debugging, trying to parse these huge objects to MYSQL queries and as it seems, it is going to save me additional hours in the future as the demand of rapid data structure analysis & storage grows.

Swans – The Seer (2012)

swans-the-seer
O Michael Gira είναι ένας πολύπλευρος άνθρωπος που ξέρει να εκπλήσσει ευχάριστα. Ο Gira είναι ο mastermind των Swans, μιας μπάντας από τη Νέα Υόρκη, οι οποίοι ήταν ενεργοί από το 1982 έως και το 1997, για να επανασυσταθούν από τον ίδιο τo 2010. Η μουσική τους σε διάφορα sites περιγράφεται ως post rock, new wave, dark wave, no wave, noise rock ή δεν ξέρω και ‘ γω τι άλλο. To σίγουρο είναι πως δεν μπαίνει εύκολα σε κάποια κατηγορία. Η μπάντα έχει κυκλοφορήσει δώδεκα full length L.ps με το ”The Seer” να είναι το δωδέκατο.

Στο ”The Seer” περιέχονται επτά κομμάτια στο πρώτο μέρος, ενώ τέσσερα υπάρχουν στο δεύτερο. Η παραγωγή ανήκει στον Michael Gira. Έχω ακούσει δίσκους των Swans κατά το παρελθόν αλλά το The Seer είναι πραγματικά το κάτι άλλο. Μιλάμε για ένα μεγαλειώδες πόνημα που ίσως άργησε να βγεί, αλλά όποιος το ακούσει είναι σίγουρο ότι θα βυθιστεί στον μοναδικό του κόσμο. Μιά υπέροχη συμφωνία ηχοχρωμάτων ξετυλίγεται από το πρώτο μέχρι και το τελευταίο δευτερόλεπτο. Μιά δουλειά όπου έχει δoθεί βάση και στην τελευταία λεπτομέρεια. Μου είναι εξαιρετικά αδύνατον να ξεχωρίσω κάποιο συγκεκριμένο κομμάτι, καθώς το άλμπουμ αυτό μόνο ως κάτι συνολικό μπορεί να το αντιληφθεί κανείς κατά την άποψη μου. Κάλλιστα το the Seer θα μπορούσα να το φανταστώ σαν ένα soundtack σε κάποιο έργο του Lovecraft ή του Stephen King.

O Michael Gira μας καλεί να εισέλθουμε στον κόσμο του, σαν άλλος φαύνος στον λαβύρινθο του πάνα του Guillermo del Toro. Eίναι ένας πολύ όμορφος κόσμος και μια γοητευτική περιπέτεια. Για μένα το The Seer είναι ίσως το καλύτερο album των Swans. Aναμένω το καινούργιο τους L.p το οποίο αναμένεται να κυκλοφορήσει τον Μάιο του 2014. Έως τότε:

Greekovery, Grexit ή τίποτα από τα δύο ;

Από το 2008 και μετά η Ελληνική Οικονομία έχει μπεί σε φάσης ύφεσης. Το Ελληνικό Α.Ε.Π από το 2008 έχει μειωθεί σχεδόν κατά 25%. Με την κρίση χρέους που ξέπασε στην περιφέρεια της Ευρώπης, πολλές χώρες αντιμετώπισαν προβλήματα. Στην περίπτωση της Ελλάδας ήρθαν στην επιφάνεια οι χρόνιες διαρθρωτικές αδυναμίες της Οικονομίας της. Όλοι οι μεγάλοι Οίκοι Αξιολόγησης (Moody’s, Fith, Standard & Poor’s) υποβάθμισαν σταδιακά την πιστοληπτική ικανότητα της χώρας, με συνέπεια η Ελλάδα να μην μπορεί να εξυπηρετήσει πλέον το χρέος της (βασικά το χρέος της γενικής κυβέρνησης). Η χώρα βρέθηκε σε δεινή θέση και απευθήνθηκε στους Ευρωπαίους εταίρους της για βοήθεια. Συστάθηκε η γνωστή σε όλους ”Τρόικα”, αποτελούμενη από το Διεθνές Νομισματικό Ταμείο, την Ευρωπαϊκή Επιτροπή, και την Ευρωπαϊκή Κεντρική Τράπεζα.

Από το 2008 και μετά έχει περάσει αρκετός καιρός. Η ανεργία πλέον έχει φτάσει το 28%, η μετανάστευση νέων ανθρώπων προς το εξωτερικό έχει αυξηθεί δραματικά. Ενώ το Ελληνικό Δημόσιο Χρέος έχει φτάσει πλέον στο 175% ως ποσοστό του Α.Ε.Π. Τα αποτελέσματα των οικονομικών πολιτικών που εφαρμόστηκαν είχαν εξαιρετικά δραματικά  αποτελέσματα για την πλειοψηφία των πολιτών. Γεγονός είναι πάντως ότι τα δημόσια οικονομικά έχουν γίνει συχνό θέμα συζήτησης σε αρκετό κόσμο. Πολλές φορές η συζήτηση φτάνει στο σημείο κάποιοι να αναρωτιούνται: να μείνουμε στο ευρώ ή να πάμε στη δραχμή; Είναι βιώσιμο το Ελληνικό Δημόσιο Χρέος; Είναι συμφέρουσα η υποτίμηση του νομίσματος; Υπάρχει υπερφορολόγηση στην Ελλάδα; Σε αυτά και σε διάφορα άλλα ερωτήματα θα προσπαθήσουμε να απαντήσουμε μέσω ερωταπαντήσεων.

Να μείνουμε στο ευρώ ή να πάμε πάλι πίσω στη δραχμή;

Η κάθε κατάσταση έχει τα πλεονεκτήματα της αλλά και τα μειονεκτήματα της. Αυτό που θα πρέπει να εφαρμόζει κάθε χώρα είναι μια χρηστή δημοσιονομική πολιτική. Δηλαδή ο κρατικός προϋπολογιμός θα πρέπει να είναι είτε ισοσκελισμένος είτε πλεονασματικός. Ό,τι νόμισμα και αν έχει μια χώρα αν έχει προγραμματίσει δαπάνες μεγαλύτερες από τα έσοδα της τότε αυτό θα δημιουργήσει ελλείμματα. Τα ελλείμματα καλύπτονται με δάνεια. Και τα δάνεια δημιουργούν δημόσιο χρέος.

Έστω ότι γυρνάμε στη δραχμή και γίνεται υποτίμηση του νομίσματος. Αυτό θα βελτιώσει το εμπορικό ισοζύγιο;

Μόνον και εφόσον ικανοποιείται η συνθήκη Marshall Learner. Δηλαδή θα πρέπει το άθροισμα των ελαστικοτήτων εξαγωγών κι εισαγωγών να είναι μεγαλύτερα της μονάδας. Δηλαδή θα πρέπει να ισχύει:

 \eta_{Xe} + \left|\eta_{Qe}\right| > 1

Όπου ελαστικότητα εξαγωγών είναι η ποσοστιαία μεταβολή των εξαγωγών προς την ποσοστιαία μεταβολή της συναλλαγματικής ισοτιμίας. Ενώ η ελαστικότητα εισαγωγών είναι η ποσοστιαία μεταβολή των εισαγωγών προς την ποσοστιαία μεταβολή της συναλλαγματικής ισοτιμίας. Η εμπειρία έχει δείξει όμως ότι αυτή η συνθήκη ισχύει σπανιότατα. Αλλά σε περίπτωση που αποτύχει η υποτίμηση τότε θα δημιουργηθεί πληθωρισμός και σημαντικό μέρος του πληθυσμού θα χάσει μέρος του εισοδήματος του.

Υπάρχει υπερφορολόγηση στην Ελλάδα;


Οι εισπαρακτέοι φόροι ως ποσοστό του Α.Ε.Π είναι μικρότεροι από τον μέσο όρο της Ευρωπαϊκής Ένωσης. Όμως είναι άνισα κατανεμημένα τα φορολογικά βάρη με την υπερφορολόγηση των μισθωτών και των συνταξιούχων.


Μπορεί να αυξηθεί το Α.Ε.Π εάν αυξηθούν οι κρατικές δαπάνες;


Ναι μπορεί να συμβεί αυτό μόνον και εφόσον ισχύει το θεώρημα του ισοσκελισμένου προϋπολογισμού. Δηλαδή αν η μεταβολή των κρατικών δαπανών είναι ίση με τη μεταβολή των κρατικών εσόδων, τότε η μεταβολή των κρατικών δαπανών θα είναι ίση με τη μεταβολή του Α.Ε.Π.

Εάν ΔΤ = ΔG, τότε και ΔG = ΔΥ  (όπου Υ = Α.Ε.Π)

Υπάρχει βέβαια κάποιος περιορισμός που είναι οι περιορισμένες φοροδοτικές ικανότητες των φυσικών προσώπων αλλά και των επιχειρήσεων.

Μπορεί να γίνει βιώσιμο το Ελληνικό Δημόσιο Χρέος;

Ναι μπορεί να γίνει βιώσιμο το Ελληικό Δημόσιο Χρέος. Καταρχάς εάν οι πολιτικοί πετύχουν επιμήκυνση του χρόνου αποπληρωμή των δανείων, και μείωση των επιτοκίων. Έτσι θα απαιτηθούν μικρότερα πρωτογενή πλεονάσματα. Διότι για να πιάσουμε το στόχο του 120% το 2022 θα πρέπει σε αυτό το χρονικό διάστημα να πετυχαίνουμε κατά μέσο όρο πρωτογενή πλεονάσματα της τάξης του 4,5% επί του Α.Ε.Π.

Έχει τίποτε προοπτικές η Ελληνική Οικονομία;

Η αλήθεια είναι πως υπάρχει διχωγνωμία σε αυτό. Γεγονός είναι πως διάφορες δυσοίωνες προβλέψεις που έχουν κάνει άτομα όπως ο γνωστός οικονομολόγος Νουριέλ Ρουμπινί και ο Μοχάμεντ Ελ Εριάν (επικεφαλής της Pimco, επενδυτικό fund που διαχειρίζεται 1 τρίς δολλάρια) έχουν διαψευστεί. Υπάρχουν κάποια σημάδια ανάκαμψης και αποκλιμάκωσης της κρίσης, όπως η μικρότερη ύφεση σε σχέση με τις προβλέψεις της τρόικας, η βελτίωση στον χώρο της οικοδομής, η αύξηση του τζίρου λιανικού εμπορίου που είχε να συμβεί κάμποσα χρόνια, όπως και κάποια αύξηση στην πώληση στον τομέα των αυτοκινήτων, αλλά και τα αυξημένα έσοδα από τον τομέα του τουρισμού. Πολλές ξένες εταιρείες κολοσσοί έχουν ενδιαφερθεί να επενδύσουν στη χώρα αλλά το επενδυτικό περιβάλλον πρέπει να βελτιωθεί ακόμη περισσότερο. Βέβαια η χώρα έχει να αντιμετωπίσει τρομερά προβλήματα όπως είναι η ανεργία της τάξης πλέον του 28%, αλλά και η τεράστια φοροδιαφυγή.

Python source to html translator for WordPress


Yesterday, i was planning to begin writing an article about code generation, more specifically about mysql code generation triggered by trusted input, containing unknown data/data types. Although, in order to present the idea, i needed to show you guys some actual scripts (in python), in order to understand what i am saying. Yeah, i could do that by only showing you some control flows in UML, but fortunately for you, i am a practical guy! I wanted my python code to show nice in HTML, plus i am a bit lazy to do manually all the styling by myself. But wait a minute! My friend here is going to do it for me, allowing me to convert python source code text to nice html, by also taking into account the language’s constructs & special notation.

Here is the script that converts python code to HTML, which spits to a file “out.html”, allowing you to just copy & paste in WordPress or any page and was used to output its own source code that follows.
Le script takes only one argument, the name (absolute path) of the Python source file that you want to convert to HTML (logical :)). 

# -*- coding: utf-8 -*-
from sys import argv
script = “”” ““”
print argv[1]
#exit(1)
try:
    fp = open(argv[1],‘r’)
    lines = fp.readlines()
    fp.close()
    script = .join ( lines)
except Exception as e:
    print repr(e)
    exit(1)
def html_escape(text):
    return “”.join(html_escape_table.get(c,c) for c in text)
#BEGINNING OF THE SCRIPT
simple_keywords = [‘if’,‘else:’,‘not’,‘and’,‘or’,‘return’,‘print’,‘elif’,‘def’,‘for’,‘in’,‘while’,‘do’,
‘continue’,‘as’,‘except’,‘try:’,‘from’,‘import’,‘pass’,‘break’]
string_context = [“‘”,‘”‘]
comment_keywords = [“#”]comment_color = “#8A4B08”;
background_style = [‘<div<b> </b>style=”font-size:<b> </b>9px;background-color:black;color:white;font-family:<b> </b>courier<b> </b>new,<b> </b>courier,<b> </b>monospace;”>’,‘</div>’]
comment_style = [‘<span<b> </b>style=”font-family:<b> </b>courier<b> </b>new,<b> </b>courier,<b> </b>monospace;<b> </b>color:<b> </b>%s”>’ % comment_color,‘</span>’]
keyword_style = [‘<span<b> </b>style=”font-family:<b> </b>courier<b> </b>new,<b> </b>courier,<b> </b>monospace;<b> </b>color:<b> </b>#00BFFF;<b> </b>padding:<b> </b>.667em<b> </b>.917em;”>’,‘</span>’]
function_name_style = [‘<span<b> </b>style=”font-family:<b> </b>courier<b> </b>new,<b> </b>courier,<b> </b>monospace;<b> </b>color:<b> </b>#0000FF;”>’,‘</span>’]
true_false_style = [‘<span<b> </b>style=”font-family:<b> </b>courier<b> </b>new,<b> </b>courier,<b> </b>monospace;<b> </b>color:<b> </b>purple;”>’,‘</span>’]
string_style = [‘<span<b> </b>style=”font-family:<b> </b>courier<b> </b>new,<b> </b>courier,<b> </b>monospace;<b> </b>color:<b> </b>#FF0040;”>’,‘</span>’]
function_sign_style = [‘<span<b> </b>style=”font-family:<b> </b>courier<b> </b>new,<b> </b>courier,<b> </b>monospace;<b> </b>color:<b> </b>#088A4B;”>’,‘</span>’]
function_sign_headers = [,]content = script
buf = 
i = 0
quotes = [“‘”,‘”‘] 

while i < len(content):
    if content[i] == ‘<b> </b>’ and content[i-3:i] == ‘def’ and content[i-4] not in [“‘”,‘”‘] and content[i+1] not in [“‘”,‘”‘] : # Mark function signature start/end 
        for j in xrange(i+1,len(content)):
            if content[j] == ‘(‘:
                injection = function_sign_headers[0] + content[i:j] + function_sign_headers[1]
                buf += injection
                i = j  1
                break
    else:
        buf += content[i]
    i += 1

content = buf
#content = content.replace(‘\t’,’  ‘)
content = content.replace(‘<b> </b>’,‘<b> </b>’)#‘ ‘)
content = content.replace(‘\n’,‘<br/>’)

buf = 
#print content;exit(1)
for sk in simple_keywords:
    buf = 
    i = 0
    t = 
    on_string = False
    
    while i < len(content):
        #if i == 0:
        #    print content[i],on_string,content[i] in quotes;#exit(1)
        if content[i] in quotes and on_string == False: #ENTERS
            t = content[i]
            on_string = True
            buf += content[i]
            i += 1
            continue
        elif content[i] in quotes and on_string == True and content[i] == t: #GOES OUT
            buf += content[i]
            i += 1
            on_string = False
            t = ‘-‘
            continue
        elif content[i] in quotes and on_string == True and content[i] != t: # STILL IN
            buf += content[i]
            i += 1
            continue
       
        elif content[i] not in quotes and on_string == True: # ON STRING
            buf += content[i]
            i += 1
            continue
        else:
            assert(content[i] not in quotes)
            assert(on_string == False)
            
            l = len(sk)
            end = i + l
            if content[i:end] == sk and content[end] in [  ‘&’ , ‘<‘ ]:
                # and content[i-1] not in quotes and content[end+1] not in quotes:
                if i != 0:
                    if content [ i  1 ] != ‘;’ and content [ i  1] != ‘>’:#and content [ end  ] != ‘:’:
                        #print content [ end]
                        buf += content[i]
                        i += 1
                        #print content [i  10 : i + 10] 
                        #print “SK = “,sk,content [ i  1]
                        continue
                buf = buf +  keyword_style[0] +sk+keyword_style[1]
                i += l 
                continue
            else:
                buf += content[i]
        i += 1
    content = buf
    buf =

buf = 

i = 0
on_string = False

while i < len(content) :
    if content[i] == ‘”‘ and on_string == False and content[i-1]  not in [‘=’] and content [i + 1] not in [‘>’]: # String style handling
          buf += string_style[0] + content[i] 
          on_string = True
          #print content[i-2],content[i-1],content[i],content[i+1]
          for j in xrange(i+1,len(content)):
              if content[j] != ‘”‘:
                  buf +=  html_escape ( content[j] )
              else:
                  buf +=   content[j]  + string_style[1]
                  i = j  
                  on_string = False
                  break

    elif content[i] == “‘” and on_string == False  : # String style handling
          buf += string_style[0] + content[i]
          on_string = True
          
          for j in xrange(i+1,len(content)):
              if content[j] !=  “‘”:
                  #buf += content[j] #html_escape ( content[j] )
                  buf += html_escape ( content[j] )

              else:
                  buf += content[j] + string_style[1]
                  i = j 
                  on_string = False
                  break

    elif content[i] == “#” and on_string == False:#and content[i-6:i] == ‘ ‘: # Comment style handling
        k = i
        ok = False
        ok2 = False
        while k >= 0:
            if content[k]  == ‘”‘:
                t = ‘”‘
                break
            if content[k] == “‘”:
                t = “‘” 
                break
            if content[k] in [‘>’]:
                ok = True
                break
            k -= 1
            if k <= 0:
                ok = True
        k = i

        while k < len(content):
            if content[k]  == ‘”‘:
                t2 = ‘”‘
                break
            if content[k] == “‘”:
                t2 = “‘” 
                break
            if content[k] in [‘<‘]:
                ok2 = True
                break
            k += 1
        #print ‘ENTERS’,ok,ok2;exit(1)
        if ok == False or ok2 == False:
            buf += content[i]
            i += 1
            continue
        #print ok,ok2
        b = 
        j = i
        buf += comment_style[0] + content[i]
        j += 1
        while j < len(content):
            if content[j:j+5] == ‘<br/>’:
                buf += comment_style[1]
                i = j  1
                break
            else:
                b += content[j]
                #print b
                if  b.endswith(‘color:’) == True:
                    while content[j] != ‘;’:
                        j += 1
                    buf += ‘:<b> </b>%s’ % comment_color
                    #print ‘YEA’;exit(1)
                buf += content[j]
            j += 1  

    else:
        buf += content[i]
    i += 1

content = buf
#print ‘—>’
content = content.replace(True,true_false_style[0]+True+true_false_style[1]) # True/False style handling
content = content.replace(False,true_false_style[0]+False+true_false_style[1])
content = content.replace(function_sign_headers[0],function_sign_style[0]) #Finish the function signature styling job
content = content.replace(function_sign_headers[1],function_sign_style[1]) 
content = background_style[0]+content+background_style[1] # Finish background styling

fp = open(‘out.html’,‘w+’)
fp.write(‘<html>’)
fp.write(content)
fp.write(‘</html>’)
fp.close()
print ‘the end’
print content


The only thing i failed to convert correctly was the following table:

html_escape_table = {
‘”‘: “&quot;”,
“‘”: “&apos;”,
“>”: “&gt;”,
“<“: “&lt;”}

so add it in the begin of the file manually please.
The most difficult part was of course string handling, and trying to detect if you are inside a ‘”‘ string, “‘” string or inside html code, like the styling information on the top of the script. To escape html chars/or not to escape html chars, to replace whitespaces here,there,why, i am i still inside a python or html string???

STOP THE MADNESS!
Yeah, i could say that the code is totally ninja and is not monkey proofed, but in the end it helped me a lot. So, just take it, share it, improve it, do whatever you like. Check also the comments, it will be helpful. I am going to do the same as long as Tzertzelos’ project is running, sharing with you cool stuff & crazy ideas!
Cheers \m/


ps: I used my tool to pass itself as a parameter to itself, Pap’s paradox is no more!