Sep 15, 2014

Αυτοματοποίηση ελέγχου (testing) του Oracle Database με το Robot σε Ubuntu

Έχουμε αναφερθεί στο παρελθόν στο Robot framework για την κατάρτιση αυτοματοποιημένων σεναρίων ελέγχου (test cases) Η απλότητα στη δήλωση των βημάτων ενός σεναρίου και οι πολλές του βιβλιοθήκες το καθιστούν μια πολύ αξιόπιστη λύση για την αυτοματοποίηση και σε προϊόντα της Oracle, όπως για παράδειγμα το SOA Suite ή τον Weblogic Server. Σε αυτό το άρθρο θα σας παρουσιάσω πως μπορούμε να κατασκευάσουμε σενάρια στο Robot που θα αφορούν την Oracle βάση δεδομένων. Ως λειτουργικό σύστημα αναφοράς θα χρησιμοποιήσουμε το Ubuntu 14.04 (Trusty Tahr) ενώ η αρμόδια βιβλιοθήκη του Robot είναι η "Database Library (python)" που υποστηρίζει μέχρι την έκδοση 12c.
 1) Αρχικά, θα κατεβάσουμε τον instant client της Oracle καθώς και το SDK. Για το Ubuntu θα χρειαστούμε τις .zip εκδόσεις.

2) Αφού κάνουμε unzip τα αρχεία πχ στον κατάλογο $HOME/instantclient_12_1, ορίζουμε στο αρχείο .bashrc του χρήστη που θα χρησιμοποιήσει το Robot τα εξής:
export ORACLE_HOME=$HOME/instantclient_12_1
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME:$PATH

και μετά:
ln -s $ORACLE_HOME/libclntsh.so.12.1 $ORACLE_HOME/libclntsh.so

3) Ως root δημιουργούμε το αρχείο /etc/ld.so.conf.d/oracle.conf με τα ακόλουθα περιεχόμενα, που δείχνουν στον κατάλογο του instant client:

/home/robot/instantclient_12_1

και τρέχουμε την εντολή:

#> ldconfig

4) Προετοιμάζουμε το Ubuntu για την εγκατάσταση με τις εντολές:

sudo apt-get install python-pip python-dev python-wxgtk2.8 libaio1
sudo pip install robotframework
sudo pip install robotframework-ride
sudo pip install robotframework-databaselibrary


5) Τέλος, συνδεόμαστε ως ο χρήστης που θα τρέξει το Robot και εκτελούμε τις εντολές:
sudo bash
#> pip install cx_Oracle

Έχουμε τελειώσει με τις εγκαταστάσεις. Μπορούμε να φτιάξουμε το πρώτο μας σενάριο. Η βιβλιοθήκη Database Library υποστηρίζει εντολές όπως Connect to Database, Query, Execute SQL script, Check If Exists In Database, κ.α. Δυστυχώς οι σχετικές row assertion εντολές όπως οι Row Count δεν δουλεύουν για την Oracle. Έτσι μπορούμε να φτιάξουμε σενάρια που εκτελούν μια SQL εντολή, μια stored procedure ή ένα script, ελέγχουν την ύπαρξη αποτελεσμάτων, κτλ.

Aug 25, 2014

Άμεση δοκιμή Web Services στον JDeveloper

Ο JDeveloper διαθέτει εδώ και πολύ καιρό ισχυρές δυνατότητες για την δημιουργία clients σε SOAP Web Services και από την έκδοση 12c και για REST. Μια άγνωστη, μικρή λειτουργία είναι το ότι μπορούμε άμεσα να ελέγξουμε ένα SOAP, REST ή HTTP Web Service, χωρίς να έχουμε κατασκευάσει ένα proxy client, κάτι που φυσικά κάνουν και πιο οργανωμένα εργαλεία όπως το SoapUI.

Αν ανατρέξουμε στο μενού Tools-->HTTP Analyzer, μπορούμε να δημιουργήσουμε μια νέα αίτηση για το είδος του Web Service που μας ενδιαφέρει.
O JDeveloper θα αναλάβει να διαβάσει το σχήμα των δεδομένων (WSDL, WADL) που θα του προσδιορίσουμε και έτσι θα προκατασκευάσει ένα δοκιμαστικό μήνυμα.
Φυσικά παρέχεται full trace για το μήνυμα που στάλθηκε καθώς και επηρεασμός HTTP headers, security credentials, κλπ, πράγμα που είναι πολύ χρήσιμο για έναν γρήγορο έλεγχο μιας υπηρεσίας είτε ενός SOA composite.

Aug 13, 2014

lxc virtualization και docker practices

Έχει περάσει ακριβώς ένας χρόνος από το πρώτο μου άρθρο για τους Linux containers και στο διάστημα που έχει μεσολαβήσει αυτή η λύση για lightweight virtualization έχει γίνει πιο ώριμη και εγώ ταυτόχρονα έχω αποκτήσει περισσότερη εμπειρία στην χρήση του. Το lxc:

  • έχει φθάσει αισίως σε μια σταθερή έκδοση (1.0.5 αυτή την στιγμή στο Ubuntu 14.04)
  • απαιτεί λιγότερες ρυθμίσεις σε σχέση με έναν χρόνο πίσω ενώ υποστηρίζει και containers χωρίς root δικαιώματα (unprivileged)
  • εξακολουθεί να τρέχει δίχως πρόβλημα τα βασικά προϊόντα τεχνολογίας της Oracle (όπως Database XE/11g/12c, SOA Suite 11g/12c) διαμέσου του πιστοποιημένου Oracle Enterprise Linux (OEL - ως virtual machine template)
  • αποτελεί την βάση της τεχνολογίας για το αναδυόμενο προϊόν του docker που προσπαθεί να οδηγήσει σε τυποποίηση την κατασκευή, παράδοση και συντήρηση lightweight virtual machines
Είχα την ευκαιρία να δουλέψω λίγο το docker και είναι πολύ ενθαρρυντικός ο αριθμός των δυνατοτήτων που ενσωματώνονται πολύ γρήγορα σε αυτό. Ωστόσο, από άποψη παραμετροποίησης το lxc, κατά την γνώμη μου, διαθέτει εκ φύσεως περισσότερες δυνατότητες (πχ διαμοιρασμός συστήματος αρχείων, port forwarding, κ.α.) Επιπλέον, το docker δεν υποστηρίζει ακόμα δυναμικές μνήμες (file system /dev/shm) που είναι προαπαιτούμενο για την εγκατάσταση του Oracle Database Server, αλλά ούτε υπάρχει το Oracle Enterprise Linux στα αποθετήρια του (αν και ένα κόλπο είναι να μετατρέψουμε ένα CentOS σε OEL)

Από την άλλη μεριά, υπάρχει πλήθος από εξαιρετικές ιδέες στο docker, που είναι άμεσα εφαρμόσιμες σε μια τυπική εγκατάσταση lxc. Μια από αυτές είναι η χρήση ενός layered file system. Έτσι μπορούμε να χρησιμοποιήσουμε ένα base template image (πχ OEL 6.5) στο οποίο θα προσθέσουμε τα πακέτα που μας ενδιαφέρουν, και το οποίο στην συνέχεια θα χρησιμοποιήσουμε ως βάση για την παραγωγή virtual machines, που όμως θα περιλαμβάνουν μόνο τις διαφορές (σε επίπεδο αρχείων) από το template image. Η υποδομή που υλοποιείται αυτή η ιδέα στο docker βρίσκεται στο file system aufs και την ίδια θα χρησιμοποιήσω και στο lxc για την κατασκευή ενός template image βασισμένο στο OEL 6.5. Έπειτα, σύμφωνα με τις ανάγκες, μπορώ να φτιάξω ακαριαία, μια καινούργια εικονική μηχανή βασισμένη στο template. Τα δεδομένα και οι παραμετροποιήσεις της νέας μηχανής αποθηκεύονται σε ξεχωριστό αποθηκευτικό χώρο. Οποιεσδήποτε αλλαγές στο template (πχ προσθήκη νέων προγραμμάτων) είναι αυτόματα ορατές και σε όλα τα virtual machines που το χρησιμοποιούν. Η ιδέα για την εφαρμογή αυτής της υλοποίησης προήλθε από αυτό το post και συμπυκνώνεται στην εικόνα:

Ας φτιάξουμε λοιπόν μια νέα μηχανή βασισμένη στο Oracle Enterprise Linux (πχ orabase):

sudo lxc-create -n orabase -t oracle

Μόλις τελειώσει αυτή η διαδικασία, πρέπει να εγκαταστήσουμε όλα τα πακέτα που χρειάζεται ο Oracle Database Server 11g/12c, που καλύπτουν και τις ανάγκες του Oracle Fusion Middleware. H λίστα αυτών των πακέτων προκύπτει από αυτήν την εντολή (το lxc δεν επιτρέπει την εγκατάσταση του Oracle unbreakable kernel, οπότε θα χρησιμοποιήσουμε την ακόλουθη εντολή για να πάρουμε απλά την λίστα των προγραμμάτων):

yum install oracle-rdbms-server-11gR2-preinstall --skip-broken

Σε αυτό το oracle base template, θα προσθέσουμε και μερικά πολύ βασικά εργαλεία διαχείριση και δυνατότητες ssh και X, απλά με μια εντολή:

yum install xauth bc unzip libXtst.* xdpyinfo openssh-clients libXext.i686 mlocate tar gcc kernel-devel make ncurses-devel wget telnet perl sudo

Ο χρήστης της εγκατάστασης όλου του λογισμικού της Oracle θα είναι ο "oracle" οπότε ας τον προετοιμάσουμε στο template για όλες τις μετέπειτα μηχανές:

/usr/sbin/groupadd dba
/usr/sbin/groupadd oinstall
/usr/sbin/useradd -g oinstall -G dba oracle
Έχουμε τελειώσει με το base image! Ας δούμε τώρα πώς θα φτιάξουμε τις επόμενες μηχανές. Ο κατάλογος που βρίσκονται οι containers στο Ubuntu είναι ο /var/lib/lxc.  Για να φτιάξουμε έναν νέο container (πχ oradb) θα του υποδείξουμε έναν κατάλογο όπου θα αποθηκεύονται τα ιδιωτικά του αρχεία (πχ /var/lib/lxc/oradb) που θα συγχωνεύονται μέσω του aufs με το template σε ένα άλλο σημείο (πχ /var/lib/lxc/oradb-aufs) που θα έχει την ολιστική εικόνα για το file system.

sudo mkdir -p /var/lib/lxc/oradb/rootfs /var/lib/lxc/oradb-aufs
sudo mount -t aufs -o br=/var/lib/lxc/oradb/rootfs:/var/lib/lxc/orabase/rootfs none /var/lib/lxc/oradb-aufs
sudo cp /var/lib/lxc/orabase/config /var/lib/lxc/oradb

Κάνουμε τώρα επεξεργασία το config αρχείου της εικονικής μας μηχανής oradb (/var/lib/lxc/oradb/config) ώστε να διαβάζει από το ενοποιημένο σύστημα αρχείων και να έχει αλλαγμένο όνομα:

lxc.rootfs = /var/lib/lxc/oradb-aufs
lxc.utsname = oradb

Αυτό ήταν. Μόλις ξεκινήσουμε την εικονική μηχανή μας (oradb) θα διαβάσει το λειτουργικό σύστημα από το template ενώ οποιοδήποτε αρχείο αλλάξουμε, θα αποθηκευτεί στο δικό της κατάλογο. Για παράδειγμα, αν θέλουμε να ορίσουμε μια στατική διεύθυνση για την νέα μας μηχανή, θα κάνουμε τις εξής ενέργειες:

1) Επεξεργασία του /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=oradb
GATEWAY=10.0.3.1

2) Επεξεργασία του /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=10.0.3.12
NETMASK=255.255.255.0
DHCPCLASS=
ONBOOT=yes

3) Αλλαγή του /etc/hosts
127.0.0.1 localhost oradb

Αν δούμε τώρα τα περιεχόμενα του καταλόγου /var/lib/lxc/oradb θα μοιάζουν ως εξής. Θα περιλαμβάνονται μόνο τα νέα ή αλλαγμένα αρχεία σε σχέση με το template.

Aug 8, 2014

Μετατροπή αρχείων video μέσω του Firefox

Πριν λίγο καιρό χρειάστηκε να αποθηκεύσω και να παρακολουθήσω ένα video, κωδικοποιημένο σε μορφή .mov. Το μέγεθος του αρχείου για 30 λεπτά ήταν υπέρμετρα μεγάλο (=~ 1GB) οπότε χρειάστηκε κάποια μορφής συμπίεση. Αν και υπάρχουν διάφορα εργαλεία στο Linux για αυτήν την δουλειά, τελικά προτίμησα ένα plugin του Firefox, ονόματι Firefogg  που αναλαμβάνει να μετατρέψει βίντεο σε ανοικτά web πρότυπα, όπως WebM και Ogg. Ως plugin, το Firefogg είναι εξαιρετικά εύκολο στην χρήση του. Απλά επιλέγουμε το αρχείο από τον δίσκο μας και έπειτα το format που θα καταλήξει το αρχείο.
Το αποτέλεσμα ήταν εντυπωσιακό: τα αρχεία περιορίστηκαν στο 1/10 του αρχικού τους μεγέθους (εξοικονόμηση 90%)

Jul 27, 2014

Glossy displays και συχνές μετακινήσεις

Αν και δεν έχω κάνει ακόμα στο blog ένα επίσημο review, εδώ και περίπου ενάμιση χρόνο έχω αντικαταστήσει το Thinkpad T400 με το Sony VAIO SVE14A27CXH ως βασικό επαγγελματικό μου εργαλείο. Ευτυχώς η σειρά E των VAIO αποδείχτηκε πολύ φιλική με το Linux, με καλή ποιότητα και βάρος κατασκευής, γρήγορες αποδόσεις και επεκτασιμότητα, χωρίς να ξεφεύγει οικονομικά σε σχέση με άλλες πιο "επαγγελματικές" λύσεις. Θυμάμαι πως όταν ξεδίπλωσα την συσκευασία και έβαλα τον υπολογιστή στο γραφείο, μου έκανε ιδιαίτερη εντύπωση οι αντανακλάσεις που είχε η οθόνη. Η οθόνη λοιπόν ήταν τεχνολογίας "glossy" (glare), που πρακτικά όταν είναι σβηστή λειτουργούσε ως μαύρος καθρέφτης, ενώ σε λειτουργία επέτρεπε και τις αντανακλάσεις από ισχυρές πηγές φωτός.

 Αν και τα χρώματα της οθόνης είναι πραγματικά εξαιρετικά, αυτή η συμπεριφορά άρχισε να με κουράζει όταν χρειάστηκε να δουλεύω καθημερινά σε διαφορετικούς πελάτες (βλέπε consultant) , ειδικά σε γραφεία που βρίσκονταν κοντά σε παράθυρα. Οι αντανακλάσεις του φωτός σε κουράζουν και μειώνουν την αναγνωσιμότητα της οθόνης. Το ίδιο φυσικά συνέβη και δουλεύοντας τώρα το καλοκαίρι σε εξωτερικούς χώρους. Τελικά το πήρα απόφαση και αγόρασα μια anti-glare μεμβράνη με 10 ευρώ. Η εφαρμογή της θέλει προσοχή ώστε να μην προκύπτουν κενά αέρος.
Το αποτέλεσμα ήταν πραγματικά πολύ καλό. Αν και τα χρώματα στην οθόνη εμφανίζονται με μικρότερη ζωηρότητα, εξακολουθούν και είναι φωτεινά και ευδιάκριτα. Και έχοντας πια αρκετές επισκέψεις σε γραφεία συνεργατών αλλά και σε εξωτερικούς χώρους, είναι σαφέστατα πολύ πιο ξεκούραστη η εργασία. Παρατηρείστε στην ακόλουθη φωτογραφία την διαφορά αντανάκλασης ανάμεσα στο περίβλημα του laptop (πολύ ισχυρή) και στην οθόνη του που έχει το anti-glare περίβλημα.

Jul 19, 2014

Νέο χαρακτηριστικό: Weblogic logs στον JDeveloper 12.1.3

Η ανακοίνωση της έκδοσης 12c για το JDeveloper, ADF, Weblogic και την οικογένεια SOA/BPM/OSB στα τέλη του Ιουνίου, θα αναγκάσει μερικούς από εμάς να περάσουμε (άλλο) ένα καλοκαίρι διαβάζοντας αλλά και δοκιμάζοντας νέα χαρακτηριστικά. Σίγουρα ένα από τα πιο "τρανταχτά" γνωρίσματα αποτελεί η δυνατότητα εκτέλεσης και αποσφαλμάτωσης SOA, BPM και OSB ροών απευθείας στον JDeveloper. Κάτι λιγότερο σημαντικό είναι πως πια ο Application Server Navigator του JDeveloper μας προσφέρει τη δυνατότητα απευθείας εμφάνισης των log files ενός Weblogic domain (για την ακρίβεια του Administration Server), κάτι πολύ χρήσιμο όταν κάνουμε development.
Αν επιλέξουμε ένα αρχείο του Weblogic και διαλέξουμε στο δεξί κλικ την επιλογή "View", θα εμφανιστούν τα περιεχόμενα του log file, δυστυχώς χωρίς δυνατότητα αυτόματης ανανέωσης.

Jul 1, 2014

10$ κάθε βιβλίο της Packt ως τις 5 Ιουλίου !

Ο εκδοτικός οίκος της Packt έχει ήδη συμπληρώσει 10 χρόνια ζωής, έχοντας αμέτρητα τεχνικά βιβλία. Στα πλαίσια του εορτασμού, έως την 5η Ιουλίου προσφέρονται όλα τα βιβλία στην τιμή των 10$ το καθένα!

Περισσότερες πληροφορίες για την προσφορά θα βρείτε εδώ.

Ανάμεσα στους πιο πρόσφατους τίτλους, ξεχωρίζουν hot topics όπως "Mastering Java Server Faces 2.2", "Extending Puppet", "Mastering AngularJS Directives", "Node.js Blueprints", "Mastering Clojure Data Analysis", "Application Development in iOS 7", "Scala for Java Developers" κ.α.

Jun 29, 2014

Disaster-Recovery Weblogic Servers διαμέσου του LXC

Σε περίπτωση που θέλουμε να σχεδιάσουμε μια αρχιτεκτονική υψηλής διαθεσιμότητας, βασισμένη στον Oracle Weblogic Server, σε ένα δευτερεύον σημείο πρόσβασης (disaster-recovery site) το πρώτο που θα κάνουμε είναι να διαβάσουμε την επίσημη τεκμηρίωση. Εκεί περιγράφεται κατά κύριο λόγο μια συμμετρική αρχιτεκτονική, όπου η ενημέρωση του μεσαίου επιπέδου (middleware) πραγματοποιείται με disc replication ή αλλιώς με τον συγχρονισμό των shared storages μεταξύ των δυο sites (production και disaster-recovery) που περιλαμβάνει τα Weblogic domains, εφαρμογές, κλπ.
Προκειμένου να επιβεβαιώσουμε μια τέτοιου είδους αρχιτεκτονική, μπορούμε είτε να την εφαρμόσουμε απευθείας σε ένα σύστημα (πχ με την χρήση virtualization software OVM ή VMWare) είτε με έναν πιο απλό τρόπο που είναι το lxc. Για παράδειγμα, έχω κατασκευάσει έναν Oracle Linux-based container (με το όνομα orasoa) στον οποίον εγκαθίσταται ένας Weblogic Server και γίνονται deployments εφαρμογών. Ας υποθέσουμε πως πρόκειται για τον production server. Η δημιουργία ενός αντιγράφου (clone)  είναι απλή υπόθεση για το lxc, απλά χρησιμοποιούμε την εντολή lxc-clone. Έτσι δημιουργείται μια δεύτερη μηχανή (πχ orasoaclone), με τα ίδια ακριβώς χαρακτηριστικά όπως στο production.
Τελικά, για να ελέγξουμε την τακτική ενημέρωση ενός DR site, ας προσομοιάσουμε την αντιγραφή των περιοχών shared storages ανάμεσα στα δυο sites, με την αντιγραφή σε επίπεδο host OS που φιλοξενεί τα lxc containers. Αν λοιπόν, όλοι μας οι containers βρίσκονται στην διαδρομή /var/lib/lxc (default για το Ubuntu) τότε απλά αρκούν εντολές σαν αυτές:

rsync -azv orasoa/rootfs/home/oracle/user_projects/prod_domain/servers/AdminServer/ orasoaclone/rootfs/home/oracle/user_projects/prod_domain/servers/AdminServer
rsync -azv orasoa/rootfs/home/oracle/user_projects/prod_domain/config/ orasoaclone/rootfs/home/oracle/user_projects/prod_domain/config

ώστε να μεταφερθούν καινούργιες εκδόσεις των εφαρμογών αλλά και εν γένει των Weblogic domains στο δευτερεύον site. Φυσικά, όπως αναφέρει και το documentation της Oracle, το δευτερεύον site δεν είναι ενεργό παρά μόνο για τις ανάγκες του switchover. Ωστόσο, το shared storage του DR θα πρέπει να είναι προσβάσιμο από το παραγωγικό σύστημα για τις ανάγκες του συγχρονισμού.

Jun 22, 2014

Keyboard shortcuts στον JDeveloper


Τις προάλλες ο καλός συνάδελφος Θανάσης Σακελαρίου, μου έδειξε ένα φοβερό keyboard shortcut στο JDeveloper. Εφόσον έχει συμπληρωθεί ήδη μια έκφραση, πατώντας Ctrl+Alt+v γίνεται η ανάθεση της σε μια μεταβλητή, όπως για παράδειγμα φαίνεται στην παρακάτω έκφραση getAttribute(). Αυτή η συντόμευση είναι αντιστοιχίζεται στο μενού Refactor-->Introduce Variable
Ένας κατάλογος για γενικές συντομεύσεις του περιβάλλοντος του JDeveloper βρίσκεται εδώ, ενώ ειδικά για την επεξεργασία Java κώδικα περισσότερες πληροφορίες εδώ. Υπάρχει επίσης ένας χρήσιμος οδηγός για τις 30 πιο συνηθισμένες συντομεύσεις πληκτρολογίου σε αυτό το σημείο.

Τέλος, χρήσιμη και παραμετροποιήσιμη δυνατότητα του JDeveloper είναι και τα code templates που αυτόματα συμπληρώνουν ένα κομμάτι κώδικα μετά από έναν συνδυασμό πλήκτρων.

Jun 4, 2014

Σύντομος και ασφαλής υπολογισμός ενός inline if της Groovy στο ADF

Στο ADF μπορούμε σε πολλαπλά σημεία να χρησιμοποιήσουμε εκφράσεις της Groovy για διάφορες λειτουργίες. Ειδικά ως προς τους υπολογισμούς συχνά πρέπει να ελέγχουμε αν υπάρχει σωστή αρχικοποίηση τιμών ώστε να αποφύγουμε τιμές όπως null. Ευτυχώς στην Groovy υπάρχει μια βελτίωση του inline if ώστε να καλύπτεται με συντομία και ασφάλεια η απουσία τιμής. Για παράδειγμα στο σχήμα fod, ο υπολογισμός ενός πεδίου LineTotal που προκύπτει από δυο άλλα (UnitPrice και Quanity) μπορεί να οριστεί ως:

(Quantity ?: 0) * (UnitPrice ?: 0)