Εμφάνιση αναρτήσεων με ετικέτα Programming. Εμφάνιση όλων των αναρτήσεων
Εμφάνιση αναρτήσεων με ετικέτα Programming. Εμφάνιση όλων των αναρτήσεων

Σάββατο, 9 Δεκεμβρίου 2017

Τι σε τράβηξε στην Πληροφορική;

Διάβασα στο Facebook την ερώτηση που τέθηκε σε ένα community για προγραμματιστές το οποίο παρακολουθώ, τι είναι αυτό που σε τράβηξε στην πληροφορική και τον προγραμματισμό; 

Για μένα η απάντηση είναι η τύχη... 

Μέχρι τα 18 δεν ήξερα να κάνω τίποτε άλλο να κάνω στον υπολογιστή από το να παίζω παιχνίδια και αυτά εξαιρετικά σπάνια καθώς δεν είχα δικό μου υπολογιστή... Η επιλογή μου έγινε σε μια εποχή που η Πληροφορική σαν κλάδος φαινόταν να ανεβαίνει πολύ κι εγώ ήμουν παντελώς αναποφάσιστος για το μέλλον μου, οπότε ήταν μια λογική/συμφεροντολογική επιλογή... Η προσαρμογή μου στον χώρο και ο εγκλιματισμός μου ήταν μακρύς και δύσκολος, ειδικά τα πρώτα μου φοιτητικά χρόνια αλλά τελικά έγινε με αρκετά μεγάλη επιτυχία θα τολμήσω να πω... 

Μετά από τόσο χρόνια στον χώρο της Πληροφορικής, όντας όχι μόνος επαγγελματίας της Πληροφορικής αλλά και χομπίστας πιστεύω ότι αυτό που μου έδωσε πέρα από τα όποια skills και τα λεφτά που έχω κερδίσει είναι η μεθοδικότητα στην αντιμετώπιση προβλημάτων που προκύπτουν κι ένα never give up attitude το οποίο με έχει βοηθήσει γενικά στη ζωή μου...

Σάββατο, 23 Σεπτεμβρίου 2017

QlikView - Tips and Tricks...

Μικρά tips που φάνηκαν χρήσιμα από τη δουλειά της εβδομάδας που πέρασε:

  • Αν προσπαθούμε να φιλτράρουμε τα data που διαβάζουμε στο load script και να κρατήσουμε μόνο τις τιμές εκείνες που περιέχουν αριθμούς μπορούμε να χρησιμοποιήσουμε την function IsNum ... Υπάρχουν όμως και περιπτώσεις που η IsNum θα επιστρέψει TRUE, πχ '3E4', διότι θα το θεωρήσει scientific numeric format, ενώ εμείς δεν θα θέλαμε κάτι τέτοιο... Μια καλή λύση για να αντιμετωπίσεις τέτοιου είδους προβλήματα είναι η παρακάτω γραμμή κώδικα την οποία απλώς προσθέτεις στο where statement:

    Len(Purgechar(Field, '0123456789'))=0

    Links: Len, PurgeChar

  • Θέλουμε να "καθαρίσουμε" το πεδίο που διαβάζουμε το οποίο είναι αριθμητικό αλλά έρχεται από το data source με προπορευόμενα μηδενικά (leading zeros) στα αριστερά της τιμής; Χρησιμοποιούμε το παρακάτω transformation και η δουλειά μας έχει γίνει:

    Replace(Ltrim(Replace(Field, '0', ' ')), ' ', '0')

    Links: Replace, Ltrim

  • Αν φορτώνετε δεδομένα από data sources όπως το SAP που η ονοματοδοσία των πεδίων επιτρέπει το να ξεκινάει το όνομα του πεδίου από αριθμό, θυμηθείτε ότι αν θέλετε να διατηρήσετε αυτή την ονοματοδοσία στο QlikView θα πρέπει να περικλείσετε το όνομα του πεδίου μέσα σε αγκύλες, όπως φαίνεται παρακάτω, αν δεν θέλετε να σας επιστρέφει error το load script...

    [0MATERIAL]

Κυριακή, 2 Απριλίου 2017

Life of a programmer...

Έχασα 3 μέρες από τη ζωή μου δουλεύοντας ατελείωτες ώρες, δούλεψα Σαββάτο και Κυριακή (από το σπίτι) για να ανακαλύψω μόλις πριν μια ώρα ότι ο λόγος που δεν συμφωνούσαν τα νούμερα στο application που φτιάχνω ήταν μια γαμημένη στρογγυλοποίηση στον υπολογισμό του price, κάποια επιπλέον δεκαδικά ψηφία... Δεν ήταν κάποιο λάθος στον κώδικα της εφαρμογής, στα data της βάσης, κάποιο bug του QlikView αλλά μια γαμημένη στρογγυλοποίηση που δεν είχε γίνει...

Τετάρτη, 8 Μαρτίου 2017

QlikView - Δημιουργία calculated dimension με τα 20 πρώτα members σε άθροισμα τιμών...

Ας υποθέσουμε ότι έχουμε ένα dimension που περιέχει τα Materials που εμπορεύεται η εταιρεία μας και ένα measure που απεικονίζει το Revenue... Έστω ότι θέλουμε να κατασκευάσουμε ένα νέο calculated dimension το οποίο θα περιέχει μόνο τα πρώτα 20 Materials σε άθροισμα Revenue είτε για να το χρησιμοποιήσουμε σε ένα chart είτε για να το χρησιμοποιήσουμε σαν φίλτρο σε ένα drop down box...

Η λύση είναι εξαιρετικά απλή και χρειάζεται μόνο η παρακάτω γραμμή κώδικα για να δημιουργήσει το  calculated dimension:


Η μόνη διαφοροποίηση που υπάρχει ανάλογα με το που θα χρησιμοποιηθεί αυτό το calculated dimension είναι ότι όταν το χρησιμοποιήσουμε μέσα σε ένα chart πρέπει οπωσδήποτε να θυμηθούμε να επιλέξουμε την επιλογή "Suppress Null Values" στα dimension settings έτσι ώστε να μην επιστρέψει τιμές για τα nulls...

Κυριακή, 12 Φεβρουαρίου 2017

QlikView - Reusable measures...

Συνήθως, όταν φτιάχνουμε ένα QlikView app, τα measures που χρησιμοποιούμε είναι συγκεκριμένα, αυτό που αλλάζει είναι η απεικόνισή τους είτε σε table like objects είτε σε γραφήματα διαφόρων ειδών, συνδυάζοντάς τα με όσα και όποια dimensions επιθυμούμε... Το best practice υπαγορεύει ότι τα measures πρέπει να φορτώνονται από το script στην τελική τους μορφή και να χρησιμοποιούνται χωρίς να γράφουμε πολύ κώδικα στα expressions των objects στο layout της εφαρμογής όμως δυστυχώς (ή ευτυχώς, δεν έχω αποφασίσει ακόμα) αυτό δεν συμβαίνει πάντα... Όταν το app είναι μικρό και τα objects λίγα, μια πιθανή αλλαγή στο calculation ενός ή περισσότερων από αυτά δεν είναι κάτι σπουδαίο, όταν όμως έχεις να κάνεις με apps τα οποία κουβαλάνε δεκάδες measures σε δεκάδες διαφορετικά objects τότε μια πιθανή αλλαγή του business logic δημιουργεί τεράστιο πονοκέφαλο στον developer...

Το πρόβλημα αυτό αποφεύγεται με τον εξής απλό αλλά έξυπνο τρόπο... Κάθε ένα από τα measures που χρησιμοποιούμε γίνεται ένα variable το οποίο δημιουργούμε στην οθόνη Variable Overview του QlikView (Settings → Variable Overview)

Variable Overview

Όταν θέλουμε να χρησιμοποιήσουμε αυτό το measure σε κάποιο object, κάνουμε reference το σχετικό variable που έχουμε ήδη δημιουργήσει...  Ο τρόπος που χρησιμοποιούμε το variable στο expression box του κάθε object είναι της παρακάτω μορφής χωρίς την χρήση quotes:

=$(vUnitsSold)
Με την χρήση αυτή της τεχνικής ο developer έχει πολύ μεγαλύτερο έλεγχο της εφαρμογής του, διευκολύνεται και επιβεβαιώνεται ευκολότερα η ορθότητα των δεδομένων που απεικονίζονται και καμία αλλαγή στο business logic δεν προκαλεί πονοκεφάλους αφού το κάθε measure αλλάζει μόνο μία φορά σε επίπεδο variable αλλά η αλλαγή έχει ισχύ σε όλο το app άμεσα και αυτό είναι καταπληκτικό από όποια πλευρά και να το δεις, development ή business! 😊

Τετάρτη, 23 Νοεμβρίου 2016

QlikView - Πως να ανοίξεις ένα .qvw αρχείο χωρίς δεδομένα...

Έχουν υπάρξει πολλές φορές που χρειάζεται να ανοίξω ένα Qlik View application χωρίς να θέλω να δω το content του ή το layout, απλά να θέλω να ρίξω μια ματιά στον κώδικα του, για να θυμηθώ ενδεχομένως κάτι που έφτιαξα παλιότερα ή να πάρω κάποια ιδέα για κάτι που αναπτύσσω εκείνη την στιγμή... Κάποια applications μπορεί να είναι τεράστια και να "ζυγίζουν" πολλά Giga Bytes και να μην θέλω ή να μην έχω τον χρόνο να περιμένω το μηχάνημά μου να σηκώσει όλα αυτά τα Giga Bytes στην μνήμη για να τα ανοίξει... Ένας εύκολος τρόπος για να μπορέσεις να ανοίξεις το application χωρίς να περιμένεις όλα τα data να σηκωθούν στην μνήμη και να έχεις πρόσβαση στον κώδικα της εφαρμογής προσφέρεται από το default functionality του Qlik View desktop client... Από την λίστα των recent files, με  δεξί κλικ πάνω στο application που θέλουμε να ανοίξουμε επιλέγουμε την επιλογή "Open <ApplicationName> Without Data"...

Qlik View - Open application without data


Τι γίνεται όμως στην περίπτωση που δεν υπάρχει στην λίστα των recent files το application που θέλουμε να ανοίξουμε χωρίς data; Μήπως δεν υπάρχει άλλη επιλογή από το να περιμένουμε να ανοίξει κανονικά το application φορτώνοντας όλα τα data στην μνήμη;

Η απάντηση είναι όχι....

Σε αυτή την περίπτωση χρησιμοποιούμε το παρακάτω command το οποίο κάνει ακριβώς την ίδια δουλειά με το default functionality...



Αυτό που κάνει αυτή η μια γραμμή κώδικα είναι να χρησιμοποιεί το qv.exe (το path που περιγράφεται στο command είναι το default) για να ανοίξει χωρίς δεδομένα το application του οποίου το path συμπληρώνουμε στο δεύτερο σκέλος του command και... αυτό είναι!!!

Παρασκευή, 21 Οκτωβρίου 2016

QV Document Analyzer, ένα απαραίτητο εργαλείο για την εργαλειοθήκη κάθε QlikView developer...

Το "QV Document Analyzer" είναι ένα απαραίτητο εργαλείο για όποιον κάνει QlikView development, ιδανικό για fine tuning των εφαρμογών... Έχει δημιουργηθεί από τον Rob Wunderlich, έναν από τους πιο καταξιωμένους QlikView developers/consultants παγκοσμίως, και βρίσκεται στην τρίτη του έκδοση... 

Πρόκειται για ένα application το οποίο έχει φτιαχτεί με την τεχνολογία του QlikView και αυτό που κάνει είναι να αναλύει την δομή και να ποσοτικοποιεί το footprint κάθε QlikView application (*.qvw files) σε memory, storage και calculation time ανά πεδίο και object και επίσης διακρίνει ποια πεδία/objects χρησιμοποιούνται και ποια όχι και υποδεικνύει συγκεκριμένες ενέργειες για την βελτιστοποίηση των εφαρμογών... 

Έχει ένα καλαίσθητο και κατανοητό γραφικό περιβάλλον πλοήγησης στα στοιχεία κάθε application και πραγματικά κάνει τη ζωή πιο έυκολη σε κάθε έναν από εμάς που δουλεύουμε με το QlikView και προσπαθούμε να φτιάξουμε όσο γίνεται καλύτερες εφαρμογές... 

Η εφαρμογή διανέμεται δωρεάν από το blog του  Rob Wunderlich στο section των Tools  όπου θα βρείτε και άλλα χρήσιμα, δωρεάν εργαλεία... Ακολουθούν κάποια screenshots της εφαρμογής από το download site:

QV Document Analyzer screenshot 1


QV Document Analyzer screenshot 2

QV Document Analyzer screenshot 3


Τετάρτη, 7 Σεπτεμβρίου 2016

Κατέβασε δωρεάν βιβλία Πληροφορικής από το IT eBooks!

Το μεγαλύτερο όφελος που αποκόμισε η ανθρωπότητα από την ανακάλυψη του internet είναι η απεριόριστη πρόσβαση στη γνώση... Η γνώση δεν είναι προνόμιο λίγων κι εκλεκτών, κάθε άνθρωπος με μια σύνδεση στον internet μπορεί να έχει πρόσβαση σε εκατομμύρια πηγές γνώσης που καλύπτουν κάθε γνωστικό αντικείμενο...

Αν το αντικείμενο της έρευνας για γνώση είναι ο τομέας της Πληροφορικής τότε υπάρχει ένα site που αξίζει να το επισκεφτεί κανείς... Το  IT eBooks είναι ένα site το οποίο διαθέτει μια τεράστια συλλογή από βιβλία Πληροφορικής, κάθε τομέα και ειδικότητας, τα οποία είναι διαθέσιμα για download, σε όλους, δωρεάν!!! Δεν χρειάζεται εγγραφή, δεν σου ζητάει να δώσεις προσωπικά στοιχεία, δεν σου ζητάει να πληρώσεις... Απλά μπαίνεις στο site, κάνεις την αναζήτηση που σε ενδιαφέρει, παίρνεις την σχετική λίστα αποτελεσμάτων με το κάθε ένα να συνοδεύεται από ένα download link και... αυτό είναι, κατέβασες το βιβλίο!!!

Στο IT eBooks θα βρείτε βιβλία πασίγνωστων εκδοτικών οίκων του χώρου της Πληροφορικής, όπως της O' Reilly, της Wrox, της Apress και πολλών άλλων... Όποιο, μα όποιο βιβλίο μπορεί να ψάχνετε θα το βρείτε στο IT eBooks και ακόμα και αν δεν το βρείτε σίγουρα θα βρείτε αξιόλογες εναλλακτικές πάνω στο γνωστικό αντικείμενο που σας ενδιαφέρει... Web development, mobile development, databases, BI, networks, λειτουργικά συστήματα, ότι θέλετε υπάρχει στο IT eBooks και σας περιμένει...

Αξίζει να το επισκεφτείτε...

Τετάρτη, 24 Αυγούστου 2016

Κάνοντας ETL με το QlikView, ένα case study...

Κάθε εργαλείο φτιάχνεται με ένα συγκεκριμένο σκοπό άσχετο με το αν εμείς μπορεί να το χρησιμοποιούμε και κάπως αλλιώς για να καλύψουμε τις ανάγκες μας... Κατά την άποψή μου το QlikView δεν είναι ένα εργαλείο κατάλληλο για να φτιάξεις ETL processes, έλα όμως που πολλές φορές αναγκάζομαι για λόγους που δεν είναι της παρούσης, να το κάνω... Έχω σιχτιρίσει κάθε μια από αυτές, όντας SQL και Data Warehouse oriented, το να κάνω ETL μέσα από το script του QlikView δεν είναι το καλύτερό μου διότι πιστεύω ότι σε πολλές περιπτώσεις αναγκάζεσαι να ανακαλύψεις ξανά τον τροχό για θέματα που είναι από καιρό λυμένα για τα ETL tools και την SQL...

Το συγκεκριμένο case αφορά μια περίπτωση όπου έπρεπε να εντοπίσω ανά πελάτη ποια είναι τα καταστήματα με το μεγαλύτερο μέσο υπόλοιπο και αν είναι περισσότερο από ένα να διαλέξω αυτό στο οποίο έχει ανοιχθεί πιο πρόσφατα λογαριασμός... Με παίδεψε αρκετά καθώς το πρώτο πράγμα που θα έρθει στο μυαλό μου σε αυτές τις περιπτώσεις είναι μια SQL προσέγγιση με τη δημιουργία κάποιων temp tables όπου θα έχω πολλαπλά κλειδιά αν το χρειάζομαι κ.ο.κ., που όμως στην προκειμένη περίπτωση δεν μας κάνει... Κατέληξα σε μια ξεκάθαρα QlikView υλοποίηση η οποία δεν είναι η βέλτιστη καθώς παρουσιάζει αρκετό delay όταν οι όγκοι των δεδομένων αυξάνονται αλλά σε μικρούς και μεσαίους όγκους το performance είναι πολύ καλό...  Το δηλώνω από τώρα ότι δεν πρόκειται να μπω στη διαδικασία να δουλέψω παραπάνω πάνω στο script διότι αφενός δεν το χρειάζομαι πια καθώς έφτιαξα και δεύτερη λύση η οποία είναι πολύ μακροσκελέστερη αλλά με πολύ καλύτερο performance και αφετέρου διότι εξακολουθώ να πιστεύω ότι το QlikView δεν είναι φτιαγμένο για ETL, ο σωστός προγραμματιστής πρέπει να είναι τεμπέλης και να μην γράφει ποτέ περισσότερο κώδικα από όσο είναι απολύτως απαραίτητο... :)  

Σκέφτηκα να βάλω αυτό το script στο Gist διότι σκέφτηκα ότι μπορεί να είναι χρήσιμο για κάποιους καθώς γίνεται ένα πολύ ωραίο loop σε αυτόν τον κώδικα, και για να το θυμάμαι κι εγώ, ποτέ δεν ξέρεις πού θα χρησιμοποιηθεί τελικά...

Παρασκευή, 3 Ιουνίου 2016

R - Πρόσβαση σε μια βάση δεδομένων με το package RODBC ...

Μπορεί δουλεύοντας με την R να χρησιμοποιούμε σε πολύ μεγάλο βαθμό ως data sources διάφορα flat files και γενικότερα αδόμητη πληροφορία αλλά θα έρθει η στιγμή εκείνη που θα χρειαστεί να κάνουμε την R να "μιλήσει" με μια ή περισσότερες βάσεις δεδομένων... Υπάρχουν διάφορα packages που παρέχουν τη διεπαφή μεταξύ της R και μιας συγκεκριμένης βάσης δεδομένων όπως το RMySQL ή το ROracle, υπάρχει όμως ένα package το οποίο δεν database specific αλλά υποστηρίζει τη διεπαφή με όλες τις βάσεις δεδομένων, συμπεριλαμβανομένων του SQL Server και της DB2, αρκεί να υπάρχει ένα σχετικό ODBC connection...

Το package αυτό ονομάζεται RODBC και μπορείτε να το βρείτε και να το εγκαταστήσετε από το CRAN... Είναι πολύ απλό και straightforward στην χρήση του, τα βασικά functions του μπορείτε να τα δείτε κι εδώ... Όπως θα δείτε, δίνει δυνατότητες πλήρους manipulation της βάσης (insert, update, delete) κι όχι μόνο ανάγνωση των δεδομένων... Το χρησιμοποίησα στα πλαίσια ενός project που απαιτούσε την χρήση ενός μεγάλου όγκου δεδομένων τα οποία βρίσκονται σε μια DB2 στημένη πάνω σε ένα σύστημα AS/400 και λειτούργησε άψογα, με πολύ καλό performance... Το script που χρησιμοποίησα ήταν κάπως έτσι:


Για να εξηγήσω λίγο τι έχω κάνει, έχω περάσει τα credentials του χρήστη που χρησιμοποιώ για να συνδεθώ στη βάση σε ένα tab delimited αρχείο με συγκεκριμένη γραμμογράφηση και αφού τα διαβάσω τα περνάω σε variables που χρησιμοποιώ μετά στο connection string... Επίσης, δεν έχω περάσει το SQL query απευθείας στην function sqlQuery, προτίμησα λόγω του μεγέθους του που θα κατέστρεφε την εικόνα του κώδικα και θα τον έκανε πολύ δυσανάγνωστο, να το έχω σε ένα txt αρχείο το οποίο διαβάζω με την readLines και κατόπιν δημιουργώ το query σαν ένα μεγάλο string... Εδώ θα χρειαστεί λίγο προσοχή με τα spaces και τα line breaks στο πως θα περάσετε τον SQL κώδικα στο txt αρχείο, θυμηθείτε ότι δημιουργούμε ένα string που θα πρέπει να μπορεί να το κάνει parse η SQL...

Θυμηθείτε να κλείνετε πάντα το connection όταν τελειώνετε τη δουλειά σας, είναι σημαντικό για να μην προκαλέσετε καθυστερήσεις και προβλήματα στη βάση...

Ελπίζω να βρείτε χρήσιμο το RODBC, καλή δουλειά!

Τετάρτη, 18 Μαΐου 2016

R - Πώς να δημιουργήσεις ένα κενό plot...

Έστω ότι για κάποιο λόγο, προγραμματίζοντας σε R, σε κάποια στιγμή υπάρχει η ανάγκη να δημιουργήσετε ένα κενό plot, κάτι σαν place holder ή για να αποτρέψετε την εφαρμογή σας να δείχνει ασυναρτησίες ή errors στο "κανονικό" σας plot... Σε εμένα η ανάγκη προέκυψε όταν φτιάχνοντας ένα Shiny application, ήθελα ένα συγκεκριμένο plot να μην δείχνει τιμές όταν το input περιλαμβάνει συγκεκριμένες τιμές που δεν θα είχαν έτσι κι αλλιώς νόημα.... 

Μια καλή λύση είναι όταν έρχονται αυτές οι συγκεκριμένες τιμές να μην γίνεται render το "κανονικό" plot αλλά ένα άλλο, κενό που απλά θα καταλαμβάνει τον σχετικό χώρο πάνω στο application...

Η λύση αυτή μπορεί να επιτευχθεί είτε δημιουργώντας ένα κενό plot το οποίο λειτουργεί σαν ένα place holder:


...είτε δημιουργώντας ένα plot χωρίς observations το οποίο όμως γίνεται κανονικά visualized όπως για παράδειγμα υλοποιεί ο παρακάτω κώδικας:


Ενημερωτικά, εγώ χρησιμοποίησα το πρώτο code snippet διότι θεωρώ ότι ταίριαζε καλύτερα σε αυτό που προσπαθούσα να παρουσιάσω... :)

Παρασκευή, 19 Φεβρουαρίου 2016

Outersect(), το αντίστροφο της function intersect() της R...

Πρόσφατα κατά τη διάρκεια μιας ανάλυσης έπρεπε να συγκρίνω δύο data frames για να εξακριβώσω αν υπήρχαν variables που δεν ήταν κοινά και στα δύο... Γνώριζα ότι υπάρχει η intersect() η οποία βρίσκει τα κοινά στοιχεία μεταξύ δυο vectors και η setdiff() η οποία βρίσκει τα μη κοινά στοιχεία ενός vector ως προς ένα άλλο, εγώ όμως ήθελα μια function που να εντοπίζει τα μη κοινά στοιχεία και των δύο vectors... 

"Google is your friend", λένε και η λύση βρέθηκε σε ένα άρθρο που διάβασα στο R - bloggers... Σε αυτό το άρθρο λοιπόν παρουσιάζεται μια custom function η outersect() η οποία χρησιμοποιώντας την sort() και την setdiff() κάνει αυτό ακριβώς που χρειαζόμουν, εντοπίζει τα μη κοινά στοιχεία δυο vectors... Η σύνταξη της είναι πολύ απλή και κατανοητή και η χρήση της πανεύκολη, τρεις γραμμούλες κώδικα που λύνουν τα χέρια...

Τετάρτη, 23 Δεκεμβρίου 2015

T-SQL script για μαζική διαγραφή των table constraints μιας database...

Τις τελευταίες μέρες, όπως φάνηκε και από το προηγούμενο post, η δουλειά τα έφερε έτσι ώστε να ξοδέψω τον περισσότερο μου χρόνο στο γραφείο δουλεύοντας με τον SQL Server... Ανέκαθεν τον θεωρούσα το καλύτερο από τα σχετικά προϊόντα διότι κατά τη γνώμη μου έχει το υψηλότερο μέσο όρο όσον αφορά τις επιδόσεις των χαρακτηριστικών του, μπορεί να μην είναι ο καλύτερος συγκριτικά με άλλες databases σε επί μέρους χαρακτηριστικά αλλά συνολικά είναι (για μένα) η καλύτερη database ...

Δουλεύοντας λοιπόν, χρειάστηκε σε κάποιο σημείο να διαγράψω κάποια tables από μια development database τα οποία όμως είχαν διάφορα foreign keys που με την σειρά τους εμπόδιζαν τη διαγραφή των tables, οπότε έπρεπε να διαγραφούν πρώτα τα foreign keys και σίγουρα δεν ήθελα να το κάνω manually από το gui του Management Studio, ψάχνοντας και σβήνοντας τα ένα ένα ...

Το παρακάτω script ήταν μια ευκαιρία να πετύχω αυτό που ήθελα και να ξεσκονίσω λίγο την T-SQL μου και πολύ το χάρηκα.... Εδώ οφείλω να πω ότι οποιοσδήποτε θέλει να το χρησιμοποιήσει ή να το τροποποιήσει πρέπει να είναι  εξαιρετικά προσεκτικός και να γνωρίζει με σιγουριά τι θέλει να κάνει και τι αποτελέσματα θα έχει αυτό που θα κάνει διότι οποιοδήποτε λάθος ή παράλειψη όταν "παίζουμε" με τα system tables του SQL Server μπορεί να έχει πολύ άσχημα αποτελέσματα για τη database...

Κατά τ' άλλα, χρησιμοποιήστε το κατά βούληση... :)

Δευτέρα, 14 Δεκεμβρίου 2015

Agile Scrum Master: A Practical Approach (10/12 - 11/12 @ HP Enterprise Athens)...

Την Πέμπτη και την Παρασκευή που μας πέρασε είχα την τύχη να παρακολουθήσω το πολύ ενδιαφέρον σεμινάριο Agile Scrum Master: A Practical Approach στο εκπαιδευτικό κέντρο της HP Enterprise στο Χαλάνδρι... Εισηγητής ήταν ο Δημήτρης Δημητρέλος, ένα από τα πλέον δραστήρια και καταρτισμένα μέλη της εν Ελλάδι Agile κοινότητας, τον οποίο τυγχάνει να γνωρίζω και από τον χώρο εργασίας μου... Θέμα του σεμιναρίου ήταν αυτό που λέει το όνομά του, μια πρακτική προσέγγιση της μεθοδολογίας του Agile, με έμφαση στο Scrum, μέσα από ένα διαδραστικό πρόγραμμα, με συζητήσεις, ομαδικές και ατομικές εργασίες προβολές βίντεο και πολύ πολύ συμμετοχή...

Το Agile όπως διαβάζουμε στη wikipedia είναι:

Agile Software Development is a set of software development methods in which requirements and solutions evolve through collaboration between self-organizing, cross-functional teams. It promotes adaptive planning, evolutionary development, early delivery, continuous improvement, and encourages rapid and flexible response to change

ενώ το Scrum (πάλι σύμφωνα με τη wikipedia) είναι:

Scrum is an iterative and incremental agile software development methodology for managing product development. It defines "a flexible, holistic product development strategy where a development team works as a unit to reach a common goal"[this quote needs a citation], challenges assumptions of the "traditional, sequential approach" to product development, and enables teams to self-organize by encouraging physical co-location or close online collaboration of all team members, as well as daily face-to-face communication among all team members and disciplines in the project.
Η κεντρική ιδέα του Scrum είναι ότι το software development γίνεται σε μικρούς επαναληπτικούς κύκλους, υλοποιώντας μικρά κομμάτια του τελικού έργου από το επίπεδο της ανάλυσης μέχρι το επίπεδο της υλοποίησης, του unit test και του acceptanse test, ως το τελικό release... Κάθε κύκλος του Scrum με την επιτυχή του ολοκλήρωσή του έχει να παρουσιάσει ένα παραδοτέο, υποσύνολο του τελικού στόχου, με διακριτό business value... Το Scrum δεν φοβάται τις αλλαγές στις προδιαγραφές, λόγω των μικρών κύκλων ανάπτυξης είναι ευέλικτο... Βάζει στο κέντρο της προσοχής την ομάδα υλοποίησης, ποντάρει στην καλή συνεργασία των μελών της, στην μεταξύ τους συνεννόηση, στην προσωπική ηρεμία και ανάπτυξη η οποία μεσομακροπρόθεσμα ωφελεί την ομάδα, την καλή λειτουργία και την αποδοτικότητά της... Για το Scrum ο developer είναι ο πρωταγονιστής σε ένα έργο software development, όλοι οι υπόλοιποι εμπλεκόμενοι, ακόμα και το management, έχουν ρόλο υποστηρικτικό έτσι ώστε το development team να κάνει τη δουλειά του με όσο λιγότερα προβλήματα γίνεται...

Στην υπερδεκαετή καριέρα μου και έχοντας δουλέψει κατά κύριο λόγο σε έργα λογισμικού τα οποία "τρέξανε" με κλασσικότερες μεθοδολογίες (κατά κύριο λόγο Waterfall) ξέρω αρκετά καλά ποια είναι τα υπέρ και τα κατά τους... Η λογική του Scrum μου φαίνεται πολύ πιο αποδοτική και developer friendly, συνδυάζει την ποιότητα του παραγόμενου προϊόντος και την καλή λειτουργία και καλή ψυχική και σωματική κατάσταση της ομάδας ανάπτυξης... Επίσης, έχοντας την  τύχη να δουλέψω σε πολύ δεμένες ομάδες στην καριέρα μου, ξέρω ότι το Scrum έχει απόλυτο δίκιο όταν δίνει τόση σημασία στην καλή  ψυχική και σωματική κατάσταση της ομάδας ανάπτυξης και τις καλές σχέσεις μεταξύ των μελών της... Όταν ισχύουν αυτές οι προϋποθέσεις το προϊόν είναι πάντα καλύτερο, η δουλειά δεν είναι απλά ένα οχτάωρο αναγκαστικής παραμονής σε ένα χώρο...

Αν θέλετε να μάθετε περισσότερα για το Agile και το Scrum, τα παρακάτω links θα σας φανούν χρήσιμα:

Τρίτη, 24 Νοεμβρίου 2015

Χρήση variables για την περιγραφή των qvd path names - QlikView...

Ένα κοινό "πρόβλημα" στο QlikView development είναι όταν θέλεις να δοκιμάσεις την εφαρμογή σου σε κάποιο άλλο περιβάλλον, test ή live... Λόγω της φύσης του QlikView το να αλλάξεις απλά το connection string στη βάση που διαβάζεις δεν είναι αρκετό διότι θα πρέπει να ορίσεις ξανά το path για όλα τα qvds που φορτώνονται στην εφαρμογή, ένα ένα... Κάτι τέτοιο είναι χρονοβόρο και μη αποδοτικό και αυξάνει τις πιθανότητες λάθους... Η χρήση της επιλογής των Relative Paths δεν λύνει το πρόβλημα διότι προϋποθέτει ότι η εφαρμογή και τα qvds βρίσκονται στο ίδιο folder ή έστω διαφέρουν κατά ένα level κάτι το οποίο προσωπικά θεωρώ αρχιτεκτονικό λάθος... 

Μια πολύ καλή λύση για να αντιμετωπιστεί μια τέτοια κατάσταση είναι η χρήση local variables για την αποθήκευση των path names των διαφόρων qvds... Αυτό γίνεται δηλώνοντας μια μεταβλητή vPathName αμέσως μετά τα αρχικά set statements στο Main tab του script editor η οποία περιέχει το full path προς το qvd repository το οποίο θέλουμε να χρησιμοποιήσουμε... Κατόπιν σε κάθε LOAD statement  αντικαθιστούμε το full path name του qvd με την μεταβλητή συν το όνομα του qvd, όπως φαίνεται στο παρακάτω script:


Με την μέθοδο αυτή μπορούμε να κάνουμε αλλαγή του path των qvds που διαβάζει η εφαρμογή μας αλλάζοντας μόνο μια γραμμή κώδικα...  Έτσι κερδίζουμε χρόνο, ελαττώνουμε τις πιθανότητες λάθους και κάνουμε τις εφαρμογές πιο portable... Η μέθοδος αυτή μπορεί να χρησιμοποιηθεί και για παραπάνω από ένα repositories, δημιουργούμε απλά μια δεύτερη μεταβλητή που να υποδεικνύει στο δεύτερο repository και την χρησιμοποιούμε όπου είναι απαραίτητο...

Παρασκευή, 20 Νοεμβρίου 2015

QlikView variable ως παράμετρος σε SQL query...

Το σημερινό tip είναι κάτι που έφτιαξα πριν περίπου 2 χρόνια, στην αρχή της ενασχόλησής μου με το QlikView, και προέκυψε από την ανάγκη να διαβάσω μια λίστα πελατών από ένα data source και μετά να περάσω αυτή την λίστα σαν παράμετρο σε ένα άλλο data source, μια βάση δεδομένων, για να συλλέξω όλη την πληροφορία που αφορούσε τους πελάτες αυτούς... Μετά από 2 χρόνια εντατικής δουλειάς και εμπειρίας ξέρω ότι υπάρχουν κι άλλοι τρόποι, να κάνεις την ίδια δουλειά, η συγκεκριμένη υλοποίηση όμως είναι ενδιαφέρουσα ως προς την χρήση των variables μέσα στο QlikView script σε συνδυασμό με SQL queries...

Έστω λοιπόν ότι το πρώτο data source είναι ένα Excel αρχείο στο οποίο περιέχονται κωδικοί πελατών τους οποίους θέλουμε να διαβάσουμε και να αναζητήσουμε σε ένα άλλο data source, μια βάση δεδομένων... Για να το καταφέρουμε αυτό θα δημιουργήσουμε μια μεταβλητή η οποία θα περιέχει σαν ένα μεγάλο string, όλους τους κωδικούς πελατών (χωρισμένους με κόμματα και κλεισμένους μέσα σε "αυτάκια") και θα την θέσουμε σαν παράμετρο του WHERE statement του query με το οποίοι θα διαβάσουμε τη βάση... 

Αυτό επιτυγχάνεται, όπως θα δείτε στο πρώτο script πιο κάτω, δημιουργώντας μια μεταβλητή (vNoOfRows) που θα περιέχει τον αριθμό των κωδικών πελατών που φορτώσαμε στο QlikView και τρέχοντας ένα for loop για κάθε ένα CustomerID που βρίσκει, μέχρι τον αριθμό του vNoOfRows ...Σε κάθε λούπα προσθέτουμε το CustomerID στην μεταβλητή vCus η οποία θα περιέχει στο τέλος όλη την λίστα των CustomerIDs χωρισμένων με κόμματα σε μορφή τέτοια ώστε να μπορέσουμε να την ενσωματώσουμε σε ένα SQL Query...



Από αυτό το σημείο και μετά τα πράγματα είναι πολύ απλά... Απλά τρέχουμε το query μας με παράμετρο την μεταβλητή vCus και φορτώνουμε στο QlikView τα στοιχεία μόνο εκείνων των πελατών που μας αφορούν...

Δευτέρα, 9 Νοεμβρίου 2015

Πώς να καθαρίσουμε το workspace με ένα μόνο command - R...

Θα υπάρξουν φορές δουλεύοντας με την R που θα βρεθείτε με ένα workspace γεμάτο variables τις οποίες δεν χρειάζεστε αλλά θέλετε να συνεχίσετε τη δουλειά σας με ένα άδειο workspace... 

Υπάρχουν δυο τρόποι να το κάνετε αυτό...

Ο πρώτος είναι να κλείσετε το session που δουλεύετε χωρίς να σώσετε τα περιεχόμενα του workspace στο .RData file... Ο τρόπος αυτός όμως έχει τα μειονεκτήματα ότι πρέπει να ξαναφορτώσετε από την αρχή όλα τα packages τα οποία είναι απαραίτητα για την ανάλυσή σας και ότι πρέπει να ξαναδηλώσετε το working directory...

Ο δεύτερος τρόπος είναι πιο απλός και σύντομος και περιλαμβάνει μόνο το παρακάτω command:


Το command αυτό διαγράφει μόνο τα variables που περιέχει το workspace αφήνοντας το απολύτως κενό χωρίς όμως να επηρεάζει τα loaded packages ή άλλα preferences που σχετίζονται με το current session θέλει όμως προσοχή στην χρήση του καθώς όπως είπαμε διαγράφει πλήρως το workspace...

Δευτέρα, 2 Νοεμβρίου 2015

Υπολογισμός ελληνικών εργάσιμων ημερών με SQL...

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

Ένας εύκολος τρόπος να υπολογιστούν οι εργάσιμες μέρες του ελληνικού εορτολογίου είναι το παρακάτω T-SQL script το οποίο αφού τρέξετε σε κάποιο SQL Server instance, παράγει για το διάστημα το οποίο έχετε ορίσει, ένα table το οποίο περιέχει ανά ημερομηνία, τον μήνα και το έτος που ανήκει αυτή, την ονομασία της ημέρας, ένδειξη αν είναι εργάσιμη ή όχι και ένδειξη αν είναι η τελευταία εργάσιμη κάθε μήνα ή όχι.... Το script αυτό μπορείτε να το χρησιμοποιείτε είτε σε stored procedures ή common table expressions για πιο ad hoc χρήση, είτε one off υπολογίζοντας τις εργάσιμες μέρες για ένα μεγάλο χρονικό διάστημα και αποθηκεύοντας το table είτε στη βάση είτε σε κάποιο άλλο αρχείο για μελλοντική χρήση, όπως έχω κάνει εγώ... 

Η επιλογή δικής σας...

Δευτέρα, 26 Οκτωβρίου 2015

Data manipulation χρησιμοποιώντας SQL statements στην R - sqldf...

Το να μάθεις μια καινούργια γλώσσα προγραμματισμού ή ένα καινούργιο framework, σημαίνει κάποιες φορές ότι πρέπει να μάθεις να σκέφτεσαι με διαφορετικό τρόπο από αυτόν που έχεις συνηθίσει να σκέφτεσαι μέχρι τώρα... H απόφαση μου να μάθω R και να μπω στον κόσμο του statistical programming σήμαινε ότι έπρεπε να βγω από το comfort zone που βρισκόμουν τόσα χρόνια και να μάθω καινούργια κόλπα... Για εμένα και πολλούς άλλους που προερχόμαστε από ένα κόσμο γεμάτο databases και data warehouses το να γράψουμε ένα SQL script ή κάποια prodecure για να διαχειριστούμε τα δεδομένα μας είναι πολύ απλό, όταν όμως προσπαθείς να κάνεις κάτι τέτοιο μέσα από την R, τότε πρέπει να σκεφτείς και να πράξεις με διαφορετικό τρόπο... Υπάρχουν όμως στιγμές που θες να κάνεις κάτι γρήγορα και δεν έχεις χρόνο για να εκπαιδεύσεις τον εαυτό σου να σκέφτεται με R τρόπο και ίσως δεν θέλεις κιόλας να το κάνεις διότι θεωρείς ότι ο R τρόπος δεν είναι ούτε γρήγορος, ούτε αποδοτικός... Ευτυχώς υπάρχει το sqldf  που μας λύνει τα χέρια...

Το sqldf  όπως λέει και τo Introduction του πακέτου στο GitHub είναι:
...sqldf is an R package for runing SQL statements on R data frames, optimized for convenience. The user simply specifies an SQL statement in R using data frame names in place of table names and a database with appropriate table layouts/schema is automatically created, the data frames are automatically loaded into the database, the specified SQL statement is performed, the result is read back into R and the database is deleted all automatically behind the scenes making the database's existence transparent to the user who only specifies the SQL statement...
Με λίγα λόγια, το sqldf μας δίνει τη δυνατότητα να χειριστούμε τα data frames μας σαν πίνακες μιας σχεσιακής βάσης δεδομένων και να τους προσπελάσουμε γράφοντας κλασσικά και αγαπημένα SQL queries...

Ένα μικρό παράδειγμα είναι το παρακάτω...

Έστω ότι θέλουμε να προσθέσουμε μια επιπλέον κολόνα στο data frame που δουλεύουμε για να χαρακτηρίσουμε κάθε observation ανάλογα με το περιεχόμενο μιας συγκεκριμένης variable...

Χρησιμοποιώντας την R, χωρίς κάποιο πρόσθετο package, θα μπορούσαμε να το κάνουμε κάπως έτσι:



Χρησιμοποιώντας το sqldf  θα μπορούσαμε να το κάνουμε έτσι:


Το πώς θα δουλέψει τελικά ο καθένας είναι θέμα γούστου και εξοικείωσης...

Αν θέλετε λεπτομέρειες, documentation και source κώδικα θα βρείτε το sqldf  τόσο στο GitHub όσο και στο CRAN...