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.

Advertisements

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!

Mars Red Sky

mars_red_sky_flyer_illustration_by_mariokempes-d4xtnfh

Τυπικό πρωινό στη δουλειά, έχοντας προμηθευτεί την απαραίτητη δοσολογία καφέ, την βασική & de facto καυστική ύλη & πηγή ενέργειας για τους πανταχού programmers, έκατσα στο γραφείο, τσεκάροντας τη λίστα με τα σημερινά tasks. Κάτι όμως έλειπε…μα μουσική κυρίες & κύριοι, τι άλλο! Έδωσα το μπαλάκι στο κολλητό μου Youtube, μήπως και με διαφωτίσει σχετικά με καμιά προτίμηση σε stoner/psychedelic αν και ψηνόμουν περισσότερο για σκέτο stoner, λόγω των μεγαλύτερων αποθεμάτων ενέργειας. Ναι, όπως και να το κάνουμε, οι ψυχεδέλειες πρωινιάτικα σε χαλαρώνουν περισσότερο παρά σε τσιτώνουν.


To recommendation script του Youtube έφτυσε καμιά 25αριά μπάντες & thumbnails, με ένα από αυτά να μου είναι άγνωστο. Ένα που έδειχνε πολλά κόκκινα particles για την ακρίβεια. Η μπάντα? Mars Red Sky. Και αυτό ήταν, πάτησα κλίκ να τσεκάρω το video του track marble sky από τον πρώτο τους δίσκο. ΩΩΩΩΩΩΩΩΩΩΩΩΩ ΤΕΛΕΙΟ! ΤΙ ΑΝΑΚΑΛΥΨΗ ΕΚΑΝΑ ΠΑΛΙ Ο &!#@(*&!!! Retro ψυχεδελικό video, με στιγμιότυπα από πυρηνικές εκρήξεις, ραδιενεργά ισότοπα, δοσίμετρα έκθεσης ακτίνων Χ, με vintage 70’s animations αλλά με σύγχρονο και άψογο μοντάζ. Όσων αφορά το track, παναγία βοήθα. Ένα από τα τεραστιότατα κομμάτια που έχω ακούσει ever. Τίγκα heavy, μεθυστικό, μαζί και τα 3, stoner/doom/psychedelic, με τη μπάντα να δίνει μαθήματα στο πως πρέπει να γίνεται η δουλειά. Η φωνή και τα samples βγαλμένα από άλλες δεκαετίες, να χρωματίζουν τους πανίσχυρους ηλεκτρικούς όγκους που εκτοξεύονται από τις κιθάρες & το μπάσο, σε αρπάζουν & σε βάζουν στο τριπάκι του video με το που ξεκινήσει το κομμάτι.


Εκείνη η παγωμένη μέρα του Οκτώβρη (και οι επόμενες 23), όπως καταλαβαίνετε, αφιερώθηκε στους γάλλους Mars Red Sky από την Bordeaux. Η μπάντα σχηματίστηκε το 2007 και από τότες έχουν κυκλοφορήσει 1 ομώνυμο LP, 1 single, 1 split με τους Year of No light (ΓΙΕΙΙΙ!) και το πρόσφατο Be My Guide EP, που κυκλοφόρησε πέρσι. Ακούγοντας τη φάση τους, αυτοί που μου ήρθαν στο μυαλό σαν similar artists ήταν οι Naam, οι ολλανδοί Sungrazer, Radar Men From The Moon, The Machine όσων αφορά τα επίπεδα νεο-ψυχεδέλειας στον ήχο τους καθώς και οι Monkey 3 & Glow Sun όσων αφορά τον stoner χαρακτήρα τους. Κάποια αργά σημεία μου θύμισαν τους επίσης ολλανδούς καρα-doom (from the darkets limbo) Toner Low & (πρώιμους) Suma, αλλά μόνο σε μερικά αργά σημεία/περάσματα. Ο ήχος τους τουμπανιάζεται & γίνεται πιο οικείος & φιλικός στον ακροατή με τις μπόλικες blues καταβολές τους. Αγαπημένες στιγμές για μένα εκτός του “marble sky” από τον ομώνυμο πρώτο τους LP είναι τα “strong reflection” & “clean white hands” και το “seen a ghost” από το πρόσφατο Βe My Guide EP, με chorus και το περίεργο Black Sabbath meets Dead Meadow feeling που αποπνέει.


Σε γενικές γραμμές, η μπάντα γαμάει.
Γαμάει άσχημα, και απ’όσο ξέρω θα κάνουν και περατζάδα στην Ελλάδα μέσα στο Φεβρουάριο – Μάρτιο. Σας τους προτείνω ανεπιφύλακτα, μακάρι να πέρναγαν και από τα μέρη μας σε κάποια φάση. Α και μη ξεχνιόμαστε! Το homework σας για αυτό το ΣΚ σας περιμένει από κάτω. Δώστε βάση στα videos, οι τύποι κάνουν τέχνη, όχι μαλακίες.
Να’μαστε καλά να ακούμε τέτοιες μουσικάρες πιο συχνά.

Homeworkx

MARS RED SKY – Marble Sky
MARS RED SKY – Strong reflection
MARS RED SKY – Clean White Hands
MARS RED SKY – MARS RED SKY LP
MARS RED SKY – Be My Guide (EP)
MARS RED SKY in FB
MARS RED SKY in Discogs


Greek Tour Dates (from their FB page)

02/27 LARISSA (Gr) Stage Club
02/28 THESSALONIKI (Gr) Eightball Club
03/01 ATHENES (Gr) Six D.O.G.S

Τι χρώμα έχει το file system μου?


Διαβάζοντας το παραπάνω τίτλο, όλοι θα σκέφτεστε “Τι καμμενιά ερώτηση είναι αυτή?“, και δικαιολογήστε πλήρως. Πέρσι το χειμώνα chat-αρα με ένα φίλο και κάναμε χαλαρό brainstorming γενικής φύσης γύρω από coding & project-άκια. Σε κάποια φάση του λέω, “apth stigmh pou ta panta swzontai apo thn skype-fb ktl, giati na mh kanoume kati to opoio de tha to katalavainei kaneis?” (στο chat πάντα greeklish). Εκείνη την εποχή άκουγα πολύ ψυχεδέλειες και ασχολιόμουν κάπως και με image processing για τη δουλειά και για τη πάρτη μου. Οπότε του λέω “To vrhka! Ta panta (h plhroforia) einai xarakthres, giati na mhn pairnw triades xarakthrwn, na tis metatrepw stis dekadikes times tous, na ta kanw pixel kai na ta swzw se mia megalh photografia?” και μου απαντάει “Ti les?De to piasa!”. Σε αυτό το αρθράκι θα εξηγήσω τι ακριβώς εννοούσα, καθώς και κάποια πολύ cool αποτελέσματα & εφαρμογές.

Παρατηρήσεις

Όλα είναι χαρακτήρες, όλα τα αρχεία, όλα τα προγράμματα, όλες οι εικόνες, τα πάντα είναι χαρακτήρες. Τα πάντα αποτελούνται απο readable & μη-readable χαρακτήρες (π.χ photos/executables). Αν δε με πιστεύετε, ανοίξτε μια φωτογραφία με έναν text editor. Βλέπετε χαρακτήρες? Φυσικά και βλέπετε!


1 char = 1 byte # with integer value between range (0,255)
1 integer = 4 bytes
1 pixel = r,g,b # integers with range (0,255)
1 pixel size depends on img format implementation (jpg,png etc)

Π.χ: το string “abc”(3 bytes) -> (r=97,g=98,b=99) -> 2 bytes per pixel x 1 pixel -> 2 bytes photo
Χμμ, 3 bytes > 2 bytes, άρα μας συμφέρει να βλέπουμε κάθε τριάδα χαρακτήρων σαν ένα pixel.

Aλγόριθμος

Το διάγραμμα δείχνει το control flow της απλοποιημένης μεθόδου:

pixelize

Υποθέσεις – Aπλοποιήσεις

1.Θεωρώ ότι η εξής συνθήκη ισχύει για το μέγεθος των αρχείων που θα δεκτώ σαν input:
( sum(file_size) + file_n*headers_length ) % 3 == 0, ή κοινώς το περιεχόμενο του κάθε αρχείου τοποθετήθηκε ολόκληρο
σε μια output photo και δεν χρειάστηκε να μοιραστεί σε 2 photo (τη παρούσα & την επόμενη).
2. Τα πάντα χωράνε τέλεια σε μια photo με output_file_size == FIXED_SIZE


Επεξηγήσεις

1. Διάβασε όλα τα αρχεία που θες να κομπρεσσάρεις και βάλτα στην c. Επίσης, για κάθε αρχείο, σώσε το όνομα του και το μέγεθος του ( σε bytes) σε ένα dictionary (file_info).
2-6. Κάνε το τεράστιο στρίνγκ τριάδες-pixels και σώστα στην content.
7. Φτιάξε την αρχή & το τέλος του header του κάθε αρχείου. Τo mark για την αρχή θα είναι ” ενώ για το τέλος ”.
8-10. Για κάθε αρχείο σχημάτισε το content του (f_content) ως: start + file_name + ‘,’ + size in bytes + ‘CONTENT->’ + pixels + end
11. Χωράει και άλλο?
12. Εάν όχι γράψτο στο ‘test_’+αριθμός photo που έχεις γράψει ++ + ‘.jpg’

Αποτελέσματα

Το περιεχόμενο του output file (test_0.jpg) θα μοιάζει κάπως έτσι :

actual_file

Όπου τα πάντα είναι pixel (headers + content).


Πειραματάκια

Η πρώτη (από τις 3) εικόνα που παράχθηκε αφού συμπίεσα τις 71 εικόνες του /home/gclkaze/Pictures folder μου.

Όποιος υλοποιήσει τον decryptor τις παίρνει δώρο!

test_0

root@Tzertzelos:/home/gclkaze/Desktop/color/color# ls -loah test*.png pix*
-rw-r–r– 1 gclkaze 7,0M Φεβ 7 23:09 pix.tar.gz
-rw-r–r– 1 gclkaze 6,7M Φεβ 7 23:10 pix.zip
-rw-r–r– 1 root 3,0M Φεβ 8 17:40 test_0.png
-rw-r–r– 1 gclkaze 3,0M Φεβ 8 17:40 test_1.png
-rw-r–r– 1 gclkaze 998K Φεβ 8 17:40 test_2.png


6.7 M (zip) < 6.998 M (size for test_*.png) < 7.0 M (tar.gz)
Για αρχή, δε με χαλάει καθόλου!


Binaries

Τσεκάρετε τη photo του ELF Format και πείτε μου τη βλέπετε στις επόμενες photos…χμμμμ, ενδιαφέρον!

Elf_layout_en

Elf layout


ld

/usr/bin/ld (initial size: 823K, new size:197K, image size: 720×486,compression: ~1/4)

llvm-ld

/usr/lib/llvm-3.0/bin/llvm-ld (initial size: 74K, new size:40K, image size: 160×160,compression: ~1/2)

test_0

gcc-4.7(initial size: 566K, new size:288K, image size: 576×486,compression: ~1/2)

test_0

a.out (initial size: 6.5K, new size:2902 Bytes, image size:75×75,compression: ~1/2) a.out: μια main(int argc,char** argv) που επιστρέφει άσσο και #include <stdio.h>


test_0_with_function
a.out_function_call (initial size: 6.6K, new size:2906 Bytes, image size: 75×75,compression: ~1/2 ) a.out_function_call: μια main(int argc,char** argv) που καλεί τη foo() που επιστρέφει άσσο και #include <stdio.h>


Χμμμ, τα 2 τελευταία κάπως μοιάζουν ε?


Εφαρμογές & tunings

  • Συμπίεση: Υλοποιήστε file size picker κοινώς αλλάξτε το 2. output_file_size = FIXED_SIZE! Γιατί εάν θέλω να συμπιέσω το string “ti leei?” να πρέπει να το βάλω σε μια photo [1024×768] ( == FIXED_SIZE)? Βάλτο σε μια photo [75×75].
  • Κρυπτογράφηση: Ανακατώστε τα αρχεία μεταξύ τους και χώστε τη δομή του γράφου μέσα στη photo (ή photos), το offset να είναι δυναμικό. Πάρτε into account pixel size ανά photo format/implementation. Περάστε το και από κανά cipher ή παίξτε με timestamps/unique key.
  • Ασφάλεια – Pixel sequence detection for binaries: Οι photos διάφορων binaries μπορούν να αποτελούνται από κοινά modules άρα, module/binary signatures. Εάν κάποιος υλοποιούσε έναν high-precision pixel sequence matcher δεδομένου ότι έχει κάνει generate sample photos από πολλά binaries, ίσως να μπορούσε να αναγνωρίσει ήδη γνωστά modules μέσα σε ένα binary. Όχι 100% σίγουρος ότι στέκει αυτό στάνταρντ, αλλά θα το ψάξω.
  • Ψυχεδέλειες: Κάψιμο γέα!


Remarks

Μια εικόνα χίλιες λέξεις! Α, επίσης, κάποιος πρέπει να φτιάξει και τον decryptor για να μπορεί κάπως να αξιοποιήσει την ιδέα σαν compression utility.
Λογικό, απλώς το υπενθυμίζω! 


References

ASCII map
ELF format
Steganography

Autistic Youth – Belgrado – Brat Pack @ OCCII Amsterdam, 04-02-2014

occii-belgrado-brpack-autiyouth-flyer

Καιρό είχα να πάω να περάσω καμιά βόλτα από την OCCII. Η OCCII είναι μια alternative πολιτιστικός χώρος στο Άμστερνταμ, η οποία φιλοξενεί καθημερινά κάθε λογής μουσικά events. Από folk και reggae, μέχρι punk/hxc και experimental doom. Και γαμώ τα μέρη δηλαδή! Τη Δευτέρα με κάλεσε ένας πολύ καλός φίλος μου & συναυλιοκολλητός, πληροφορώντας με για το live της Τρίτης, όπου θα έπαιζε μια πολύ γαμάτη μπάντα από την Ισπανία, οι Belgrado. Μου στέλνει και ένα λίνκ για να τσεκάρω με την ησυχία μου, όντας 100% σίγουρος ότι “Kλάιν μάιν, πάλι τίποτα καζανάκια θα είναι (grindcore-crustcore)…”, πατάω το λίνκ, και ΟΥΑΟΥ!!! Έπαθα τη πλάκα μου με τη μπάντα, μπάντα που ήδη έχει 3 D.I.Y κυκλοφορίες (2xLP και 1×7″ ΕP) και παίζει φανταστικό post-punk. Καπάκια του απαντάω θετικά σε φάση “τα λέμε αύριο στις 21:00 μέσ’την OCCII! Εννοείται πως θα’ρθω!” και έτσι κι έγινε. Την επομένη το απόγευμα, ξεκίνησα για το λάιβ στο οποίο και έφθασα κάπως αργοπορημένα γύρω στις 21:10 (δουλειά & φαί & άραγμα θυσίασαν εύκολα ένα μέρος του λάιβ), χάνοντας τις 2 πρώτες μπάντες που άνοιγαν το λάιβ που απαρτιζόταν από τους Οpen Wounds (NL), Weekend Love (NL), Brat Pack (NL), Belgrado (ES) και Autistic Youth (US). Γύρω στις 21:15, και ίσα που πρόλαβα να πάρω μια μπύρα από το μπάρ, μπήκαν οι Brat Pack.

1

Οι Brat Pack μπήκαν δυνατά στη σκηνή, παίζοντας ταχύτατο punk με thrash καταβολές αλά Toxic Holocaust/Municipal Waste, με αρκετά στακάτα hardcore-άδικα break downs! Η μπάντα φάνηκε να είναι πολύ καλά προβαρισμένη και ορεξάτη. Οι άμεσες επιδράσεις των evil riff τους πάνω στο κοινό φάνηκαν λίγα λεπτά μετά την είσοδο τους στο σανίδι, όπου το κοινό στην αρχή άρχισε με χαλαρό head banging το οποίο εξελίχθηκε σταδιακά σε ελικοπτεράκι! Γαμώ! Μπόλικος χαμός και τζέρτζελος! Πρώτη φορά τους βλέπω σε λάιβ και σχημάτισα πολύ καλές εντυπώσεις, περιμένω πως και πως να τους ξαναπετύχω πουθενά στα πέριξ! Αφού έπαιξαν το 30-λεπτο σέτ τους (6-7 κομμάτια), τα φώτα επανήλθαν και εγώ με το συναυλιοκολλητό πήγαμε στο μπάρ για να προμηθευτούμε καμιά μπύρα ακόμη και να κάνουμε κάνουμε κανά τσιγάρο στο πρώτο όροφο του κτιρίου. Μετά το διάλειμμα, θα ήταν η σειρά των Belgrado να μπουκάρουν στη σκηνή της OCCII.

2

Γύρω στις 22:30, τα φώτα έκλεισαν για να αρχίσει το σέτ των Belgrado (btw Belgrado = Βελιγράδι). Οι Belgrado μπήκαν στη σκηνή και καπάκια, χωρίς δεύτερη σκέψη, εξαπέλυσαν την 80’s post-punk επίθεση τους, με την τραγουδίστρια να τραγουδάει άλλωτε στα ισπανικά, άλλωτε στα αγγλικά και στα σέρβικα, χορεύοντας ασταμάτητα με τις μουσικάρες που έβγαιναν από τα ηχεία. Τραγούδαγε κάνοντας χρήση echo effect, κάνοντας τη μουσική τους ακόμα πιο σκοτεινή και μυστηριακή. Η μπάντα έπαιξε ολόκληρο το καινούργιο της δίσκο Siglo XXI, στον οποίο φαίνονται οι cold wave, post punk και gothic αναζητήσεις της μπάντας. Σε κάποια σημεία δε, μπόρεσα να διακρίνω και κάποιες επιρροές από Amebix, σκοτάδι στις κιθάρες και εμβατηριακά τύμπανα να δημιουργούν μια πολύ βαριά και μυστήρια ατμόσφαιρα. Από το παίξιμο της μπάντας, μπορώ να πω ότι όλοι συμμετέχουν ισοδύναμα στη ποιότητα του ήχου τους. Πρίμο μπάσο τίγκα, κρατάει τη κιθάρα και τα στακάτα τύμπανα μαζί,βουίζοντας ηλεκτρισμό και τσίτες. Μάταιες μελωδίες να ξεγλιστράνε από τις κιθάρες, κάνοντας το σκηνικό νοσηρό και παγωμένο αλά Bauhaus, χρωματιζόντας το όταν πρέπει με πολύ εύστοχες αρμονικές. Ευρηματικά riff που σε κερδίζουν από τη πρώτη ακρόαση στάνταρντ! Τα τύμπανα μου έκαναν τη περισσότερη εντύπωση κατά τη διάρκεια του λαίβ, και αυτό λόγο της συνεχόμενης εναλλαγής του ρυθμού και των γαμάτων γεφυρών μέσα στα κομμάτια του σετ. Πολύ παικτρόνι ο drummer, ο οποίος είχε βαλθεί να κάνει το high-hat να ματώσει με τις παράλληλες μπαγκετιές του, κάνοντας το κοινό να γουστάρει τη ζωή του, χορεύοντας ξέφρενα με τον ρυθμό και το στακάτο και αυστηρό παίξιμο του. Η frontwoman ήταν επίσης εντυπωσιακή, με την εκκεντρική και τίγκα αλληλεπιδραστική με το κοινό παρουσία της. Απλώς μας έκανε ότι ήθελε. Τη μια επιδιδόταν σε τρελούς χορούς και “σπασίματα” του σώματος της, την άλλη έμπαινε μέσ’το κοινό κάνοντας μας από το χορό να γυρίσουμε pongo στα καπάκια (ιδιαίτερο respect στις κοπελιές του live), κάνοντας μας να ηρεμούμε και να υπνοβατούμε στα αιθέρια τραγούδια της, που οι νότες τους δημιουργούσαν αυτή τη φαντασμαγορική και σκοτεινή ατμόσφαιρα. Και γαμώ τις performance οι Belgrado, μας έκαναν το συγκεκριμένο 30-40-λεπτο αξέχαστο και στάνταρντ αναμένω την επόμενη τους κυκλοφορία σα τρελός. Απολαυστικοί!

4

3

5

Τελευταία βόλτα στο μπάρ για γρήγορη & δροσιστική ανασυγκρότηση μετά τους Belgrado. Το σέτ των Αutistic Youth ξεκίνησε στις 23:20, με τη μπάντα να παίζει γρήγορο punk, με τα θέματα της κιθάρας και τη φωνή να μου θυμίζουν έντονα Turbonegro. Γρήγορο και στακάτο παίξιμο στα όργανα, γαμάτα back-vocals στα refrain, η μπάντα μας διασκέδασε για περίπου 25 λεπτά, εκτελώντας 6-7 τσιτάτα κομμάτια, αποχώρησε για άλλα 5 και ξαναεπέστρεψε με encore για άλλα 2 κομμάτια.

6

Πολύ ωραίο κλείσιμο του live και της βραδιάς, όπου αφού τελειώσαμε τη μπύρα & το τσιγάρο, χαζέψαμε για λίγο στα τραπεζάκια του merchandice δίπλα από το μπάρ, ακούσαμε και κανά 2 κομμάτια (το ενα ήταν δε τρελή κομματάρα και δε ξέρω ποιος το λέει!DAMN!) από το σέτ του dj ο οποίος θα κρατούσε μουσική συντροφιά στο κοινό που ήθελε να τη πέσει λίγο παραπάνω στο μπάρ μετά το πέρας του live. Βγήκαμε έξω και πήγαμε να ξεκλειδώσουμε τις κούρσες μας, συνειδητοποιώντας ότι είχε βάλει έναν παντοδύναμο ΝΟΤΙΑ να φυσάει κόντρα για όλη την διαδρομή! Ειδικά στην De Boelelaan, μπροστά από το πανέπι, είχε σηκωθεί σίφουνας που μου’σκαγε μάπες τρελές μέχρι να μπορέσω να χωθώ στα στενά και να του ξεφύγω! Αλλά το ξύλο που έφαγα από τον αέρα για περίπου ενός 30-λεπτου ήταν αμελητέο σε σχέση με την ευχαρίστηση που πήρα βλέποντας τους Belgrado, τους Brat Pack και τους Autistic Youth στην OCCII Τρίτη βράδυ! Και γαμώ τις βραδιές! Α και απο κάτω παίζει τι άλλο παρά HOMEWORK για εσάς! Τι? Έτσι θα σας άφηνα??
Τσεκάρετε Belgrado οπωσδήποτε, και εαν ακούσετε τίποτα, ότι παίζουν στη πόλη σας, μην τυχόν και δε περάσετε να τους δείτε.
Θα χάσετε.

Υ.Γ: H τούρτα στο flier έχει να κάνει με τα γενέθλια της κοπελιάς από την OCCII που διοργανώνει τα punk/hxc events που συνέπιπταν με την ημερομηνία του live.
Υ.Γ 2: Όλες οι photoz τραβήχτηκαν από το super-duper,μπλέ και σχεδόν vintage εργαλείο Canon PowerShot A495!!


Homeworkx

OCCII Amsterdam

Belgrado
Belgrado in FB
Belgrado in Bandcamp
Belgrado – Siglo-xxi-2

Autistic Youth
Autistic Youth in FB
Autistic Youth in Bandcamp
Autistic Youth – Empty Eyes

Brat Pack
Brat Pack in FB
Brat Pack in Bandcamp
Brat Pack – Elections

IMG_1838Σχέδιο στο καπνιστήριο της OCCII, από κάτω έγραφε το εξής url: http://www.dirtroadcotton.com

The man from earth – Θέατρο Αλκμήνη

the-man-from-earth

Πρόκειται για τη μεταφορά της ομώνυμης ταινίας του Jerome Bixby στο θέατρο (μόλις το έμαθα πως είναι και ταινία)και μάλιστα είναι η πρώτη φορά που παρουσιάζεται στην Ελλάδα. Με σκηνοθεσία από την Κωσταντίνα Νικολαΐδη και στη σκηνή γνωστά ονόματα όπως Δημήτρης Αλεξανδρής, Νίκη Παλληκαράκη, Χριστόδουλος Στυλιανού, Ερρίκος Λίτσης, Νίκος Ποριώτης, Γιώργος Κατινάς, Κωνσταντίνα Μαλτέζου και Μαγδαληνή Παλιούρα. Πήγα λοιπόν στο θέατρο Αλκμήνη κοντά στο μετρό Κεραμεικού να δω αυτό το εργάκι (δεν είναι υποτιμητική η λέξη εργάκι). Η αλήθεια είναι ότι το θέατρο με φόβιζε γιατί δεν μου αρέσουν καθόλου ηθοποιοί που υπερβάλλουν στον ρόλο τους με αποτέλεσμα να φαίνεται κάτι τελείως μη φυσιολογικό (όλοι γίναμε κριτικοί ΝΑΙ). Αλλά δεν γαμιέται; Πήγα λοιπόν και εκστασιάστηκα. Όχι μόνο οι ηθοποιοί έπαιξαν πολύ καλά, έτσι κι αλλιώς πρόκειται για επαγγελματίες που βρίσκονται ΠΟΛΛΑ χρόνια στον χώρο του θεάτρου, αλλά και το ίδιο το έργο είχε εξαίρετο σενάριο που θύμιζε πολύ Zeitgeist. Πρόκειται λοιπόν για έναν καθηγητή με το όνομα John Oldman ο οποίος είναι ένα θαύμα πάνω στη γη γιατί είναι 14000 χρόνων (OMG). Πολλούς μπορεί να τους μυρίσει αυτό αλλά η αλήθεια είναι ότι αυτό το στοιχείο με τράβηξε ακόμα περισσότερο στην παράσταση. Έτσι λοιπόν αυτός ο άνθρωπος ζει από την εποχή των παγετώνων και το σώμα του έχει σταματήσει να γερνάει στα 35. Και επειδή γίνεται αυτό ο καθηγητής ανά 10 χρόνια που φίλοι και γνωστοί παρατηρούν πως δεν έχει περάσει μέρα από πάνω του τα παρατάει όλα και ξεκινάει μια καινούργια ζωή κάπου αλλού. Για μία φορά όμως στην τεράστια ζωή του αποφάσισε να πει το μυστικό του στους κοντινούς του φίλους και φυσικό είναι να τον περάσουν για τρελό. Η καύλα της παράστασης είναι ότι όλοι περιμένουμε να δούμε πως θα το αποδείξει αυτό στους υπόλοιπους χαρακτήρες, και σε μας, μιας και όλα αυτά που θυμάται και περιγράφει είναι ήδη γραμμένα σε βιβλία αρχαιολογίας ,ιστορίας και ανθρωπολογίας. Βέβαια ο John Oldman ξέρει για την ανθρωπότητα ακριβώς ότι ξέρουν και οι υπόλοιποι άνθρωποι για τον κόσμο. Εκτός από μερικές “λεπτομέρειες” που θα σας αφήσω να τις ανακαλύψετε μόνοι σας. Ένα πολύ ωραίο έργο που θα σας κάνει να σκεφτείτε και σίγουρα θα σας καθηλώσει.

Υ.Γ. Στην περίοδο των παραστάσεων ο ηθοποιός Γιώργος Κατινάς πέθανε και το σενάριο προσαρμόστηκε χωρίς την παρουσία του χαρακτήρα Χάρι. Ας αναπαυθεί εν ειρήνη. Οι παραστάσεις αφιερώνονται στην μνήμη του σύμφωνα με την ανακοίνωση του θιάσου.

Λινκ την παράσταση στο θέατρο Αλκμήνη

http://bit.ly/LQ7SBw

trailer

http://www.youtube.com/watch?v=l0thQ4UHPB0

πλοκαμάρης (plokamar1)

Forest Swords


Ο Matthew Barnes είναι παραγωγός από ένα μέρος στην Αγγλία που δεν ξέρω που είναι αλλά σίγουρα θα βρέχει και οι τοίχοι θα χουν μούχλα. Στη μουσική σκηνή συστήθηκε σαν Forest Swords το 2009 με το Fjree Feather ep. Ακολούθησε την επόμενη χρονιά το Dagger Paths ep με το οποίο καθιέρωσε ένα συγκεκριμένο στυλ πειραματικής ηλεκτρονικής μουσικής. Μέσα από ένα χάος επιρροών και αναφορών που ξεκινάνε από μελωδίες τύπου Morricone και krautrock και φτάνουν μέχρι το σύγχρονο trip-hop, τον dj Krush και τους 3rd eye foundation (χωρίς τη μανιοκατάθλιψη). Ενδεικτική είναι η καταστροφή διασκευή στο if your girl only knew  της Aaliyah (!!!), όπου ένα γνωστό RnB κομμάτι των 90s μετατρέπεται σε ένα μελαγχολικό μονόλογο με ξεκούρδιστες κιθάρες, τελετουργικά τύμπανα και φωνητικά που θυμίζουν Ian Curtis. Μάιστα…

Και έρχεται η φετινή/περσινή σαιζόν με τη κυκλοφορία του Engravings. Η συνταγή έχει παγιωθεί και εμπλουτισθεί. Μίνιμαλ μπασογραμμές, soundtrack-ικό ύφος, πρωτότυπες loopες, σκανδιναβικές αναφορές στου τίτλους. Ηχογραφημένο σε εξωτερικούς χώρους και μιξαρισμένο σε λαπτοπ, φανερώνει την DIY λογική του Barnes αλλά δίνει και μια απεικόνιση βρετανικού φολκλόρ (μούχλα). Η όλη ακρόαση αφήνει την εντύπωση ενός doom/drone δίσκου: πηχτή ατμόσφαιρά, διακριτική χρήση διαφόρων οργάνων (πχ ξυλόφωνο στο An hour), βαθιά τύμπανα (Irby Tremor – The weight of gold), «ψαγμένα» σκοτεινό artwork (δείτε και το βίντεο για το Thor’s stone).

Πρόπερσι εμφανίστηκε στο Plissken εδώ στην Αθήνα. Δεν το χα πάρει πρέφα. Δεν ξέρω αν εντυπωσιαστήκαν όσοι τον είδαν, αλλά ούτως ή άλλως δεν είναι μουσική για πάρτυ. Πλέον «λέει» εμφανίζονται σαν duo. Οπότε μένει να δούμε αν όταν η αναγνώριση σε αναγκάζει (;) να εγκαταλείψεις το DIY, τότε αυξάνονται και οι δυνατότητες. Οι απαιτήσεις πάντως σίγουρα.

 

http://forestswords.tumblr.com/

https://soundcloud.com/forestswords

http://www.youtube.com/user/redfliess