Nov 19, 2014

Αποστολή γεγονότων (dispatching events) σε πολλαπλά ADF task flow managed beans

Μια πολύ σημαντική αρχή του αντικειμενοστραφούς προγραμματισμού είναι ο περιορισμός του κεντρικού ελέγχου διαδικασιών και η κατανεμημένη διανομή γεγονότων (events) όπου υπάρχει ενδιαφέρον. Στον κόσμο του ADF, ένα αντιπαράδειγμα που  έρχεται στο μυαλό έχει να κάνει με μεγάλους κώδικες που συντηρούνται σε ADF managed beans και που επιτελούν διαφορετικές λειτουργίες, καλύπτοντας πολλαπλές διαφορετικές απαιτήσεις.

Έστω πως θέλουμε να δώσουμε μια κοινή συμπεριφορά στην εφαρμογή μας ώστε με ένα κουμπί να γίνεται αποθήκευση (commit) των αλλαγών. Επιπλέον, θα θέλαμε να εμφανίζεται ένα popup παράθυρο επιβεβαίωσης μετά την οριστικοποίηση. Τέλος με την ολοκλήρωση των αλλαγών θέλουμε να ενημερώνεται η κατάσταση του TabContext αν χρησιμοποιούμε το Dynamic Tabs UI Shell framework. Θα φτιάξουμε σε ένα σημείο μια συγκεντρωτική λειτουργία που θα καλύπτει όλες τις παραπάνω ανάγκες;

Μια προσέγγιση θα μπορούσε να κάνει με την υλοποίηση της διαδικασίας της αποθήκευσης και την ειδοποίηση άλλων ενδιαφερόμενων αντικειμένων για αυτήν την μεταβολή, ώστε να κάνουν αυτά τη δουλειά τους (να προβάλλουν popup, να μεταφέρουν τον χρήστη σε άλλη οθόνη, να ενημερώσουν το UI shell, κλπ) Ευτυχώς μπορούμε να ορίσουμε μια λίστα από κλάσεις που σχετίζονται με ένα ADF managed bean στον ορισμό του task flow, ώστε αυτή η λίστα να ενημερώνεται για μια μεταβολή. Ας κατασκευάσουμε για παράδειγμα ένα Java interface:

public interface CommitListener {
    void afterCommit();
}

και αντίστοιχα δυο κλάσεις που το υλοποιούν: έστω τη JSFCommitListener που εμφανίζει ένα popup και την DynamicTabListener που ενημερώνει το UI Shell. Τις δυο αυτές κλάσεις ας τις ορίσουμε στο task flow μας:
ενώ στην κλάση μας που διαχειρίζεται το κουμπί της αποθήκευσης των αλλαγών (πχ CommitBean), ας δηλώσουμε μια γενική λίστα από κλάσεις που θα πρέπει να ενημερωθούν:

    private List commitListeners;

    public void setCommitListeners(List<CommitListener> observers) {
        this.observers = observers;
    }

    public List getCommitListeners() {
        return observers;
    }

    public void onCommit() {
            for (CommitListener c : getCommitListeners()) {
                c.afterCommit();
            }
    }

Αυτό που μας απομένει είναι να κάνουμε ενσωματώσουμε (inject) τη λίστα των managed beans (listeners) στην κλάση μας CommitBean. Επιστρέφουμε λοιπόν στο task flow μας και γράφουμε τον ακόλουθο κώδικα (μιας και δεν υπάρχει υποστήριξη στον design editor για την παροχή λίστας τιμών):

<managed-bean>
    <managed-bean-name>commitBean</managed-bean-name>
    <managed-bean-class>CommitBean</managed-bean-class>
    <managed-bean-scope>backingBean</managed-bean-scope>
    <managed-property>
      <property-name>commitListeners</property-name>
      <list-entries>
            <value>#{backingBeanScope.dynamictablistener}</value>
            <value>#{backingBeanScope.jsfcommitlistener}</value>
        </list-entries>
    </managed-property>
  </managed-bean>



Oct 26, 2014

Λήψη στιγμιοτύπων οθόνης (screenshots) στο Firefox χωρίς extensions

Ένας γρήγορος τρόπος για να καταγράψουμε τα περιεχόμενα ενός παραθύρου πλοήγησης στο Firefox είναι διαμέσου του Developer toolbar. Η επιλογή βρίσκεται στο μενού Tools-->Web Developer ή ενεργοποιείται με τον συνδυασμό πλήκτρων Shift + F2. Με αυτόν τον τρόπο θα εμφανιστεί μια γραμμή εντολών στο κάτω μέρος του παραθύρου.
Μια εντολή που είναι διαθέσιμη είναι η screenshot που έχει ως ορίσματα την τοποθεσία αποθήκευσης αρχείων. Υπάρχουν όμως και άλλες επιλογές για αυτή τη λειτουργία που μπορούμε να τις μάθουμε στη γραμμή εντολών γράφοντας help screenshot.

Oct 5, 2014

Δυο χαρακτηριστικά του JSF 2 που είναι χρήσιμα στο ADF

Η 12c σειρά του JDeveloper (αλλά και η παλαιότερη 11g R2) υποστηρίζουν το πρότυπο JSF 2. Ανάμεσα στα πολλά νέα χαρακτηριστικά που έχει αυτή η έκδοση, σε σχέση με την 1.2, θα ήθελα να αναφέρω δυο γνωρίσματα που ίσως να φανούν χρήσιμα στους προγραμματιστές του Oracle ADF.

Το πρώτο έχει να κάνει με το ότι οι action μέθοδοι των navigation components (buttons, menus, links) επιδέχονται ορίσματα. Ενώ μέχρι το JSF 1.2 το managed bean action method signature δεν δέχονταν παραμέτρους, στο JSF 2 μπορούν να δεχτούν ορίσματα οποιουδήποτε τύπου. Ένα παράδειγμα χρήσης έχει να κάνει με το πέρασμα ως παραμέτρου της τιμής ενός attribute binding ή selected row(s) για το οποίο θα θέλαμε είτε UI components bindings είτε ADF bindings κώδικα στο managed bean μας. Στο παρακάτω απόσπασμα κώδικα, η managed bean action method χρησιμοποιεί ως παράμετρο την επιλεγμένη εγγραφή του πίνακα.
Ο δε κώδικας του managed bean μοιάζει ως εξής. Οι επιλεγμένες είναι άμεσα διαθέσιμες μέσω της κλάσης RowKeySet.

Το δεύτερο, αφορά την υλοποίηση συμπεριφοράς όταν συμβαίνουν συστεμικές ενέργειες (system events) σε UI components. Τέτοιες ενέργειες μπορούν να περιλαμβάνουν για παράδειγμα την αρχική εμφάνιση ενός στοιχείου (pre-render) σε μια σελίδα (περισσότερες πληροφορίες εδώ) Κάτι τέτοιο μπορεί να μας είναι πολύ χρήσιμο ώστε να υλοποιήσουμε λογικές τύπου "on component ή page load". Μάλιστα υπάρχει ένα παράδειγμα του ADF code corner για την προβολή ενός pop-up με την αρχική εμφάνιση ενός region. Έστω ότι θέλουμε να επηρεάσουμε το αρχικό rendering ενός πίνακα, ώστε εμφανίσουμε εξ ορισμού μια επιλεγμένη εγγραφή. Τότε μπορούμε να χρησιμοποιήσουμε το JSF component f:event, ενσωματωμένο στο component που μας ενδιαφέρει, στην περίπτωση μας ένα af:table.
 
H ιδιότητα listener μας ανοίγει το δρόμο για να προγραμματίσουμε τη συμπεριφορά του pre-render. Έτσι μπορούμε να κάνουμε μια προγραμματιστική αντιμετώπιση του event, χωρίς να καταφύγουμε σε σύνθετους κώδικες και phase listeners όπως συνέβαινε με προηγούμενες εκδόσεις.

    public void preRender(ComponentSystemEvent componentSystemEvent) {
        UIComponent tab = componentSystemEvent.getComponent();
    }

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" κ.α.