Showing posts with label Java. Show all posts
Showing posts with label Java. Show all posts

Apr 13, 2019

Προγραμματισμένη (scheduled) κλήση σε JMX bean στο Weblogic

Έστω ότι σε μια legacy εφαρμογή έχει αναπτυχθεί κώδικας σε JMX bean ώστε να διευκολυνθεί η απομακρυσμένη κλήση επιχειρηματικής λογικής. Μέσω του WLST μπορούμε να φτιάξουμε ένα script που θα καλεί το JMX bean, και με τη σειρά του μπορεί να προστεθεί στον χρονοπρογραμματισμό του Linux (πχ cron)

Για το παράδειγμα μας έχουμε ενα JMX bean κάνει bind στο Object Name: "com.example.jmx:type=Integration,name=Export" και έχει γίνει deploy σε έναν managed server (πχ ManagedServer_1) Έχουμε κατασκευάσει μια μέθοδο χωρίς παραμέτρους σε αυτό το bean (πχ startExport), την οποία θέλουμε να καλέσουμε μέσω του δυναμικού προγραμματισμού του cron. Ακολουθεί ένα WLST που υλοποιεί αυτή τη διαδικασία:

# connect to the WebLogic server
#
connect('', '', '')
#
domainCustom();
print ''
print ''
#
# go to custom mbean package/folder
#
cd('com.example.jmx')
#
cd('com.example.jmx:Location=ManagedServer_1,name=Export,type=Integration')
#
# create object name
#
auditJmx=ObjectName('com.example.jmx:Location=ManagedServer_1,name=Export,type=Integration')
print ''
print ''
#
# invoke operation/method form the custom mbean
#
mbs.invoke(auditJmx, 'startExport',None,None)
print ''
print '--------------------------'
disconnect()

Τώρα, αυτό το Jython script μπορούμε να το καλέσουμε μέσω του wlst.sh και έτσι να το χρονοπρογραμματίσουμε κατάλληλα στο crontab.

Apr 1, 2016

Υποστήριξη high dpi από τα Java IDEs σε Windows 10

To Lenovo Yoga 2 Pro είναι ένα ισχυρό και ελαφρύ ultrabook, 13.3 ιντσών με εξαιρετικά υψηλή ανάλυση οθόνης 3200x1800. Κατά αυτόν τον τρόπο εφαρμογές που έχουμε φτιαχτεί με μέριμνα αυτών των πολύ υψηλών dpis εμφανίζονται εκπληκτικά ενώ άλλες λιγότερο ικανοποιητικά, αν όχι απογοητευτικά. Δουλεύοντας με διάφορα Java IDEs, έχουμε τις εξής παρατηρήσεις:
Ο JDeveloper 12c (12.2.1 αλλά και ο 12.1.3) δεν διαθέτει καλή υποστήριξη για high dpi οθόνες. Όταν ξεκινά ο installer εμφανίζεται σε ένα πολύ μικρό παράθυρο που μόλις διακρίνονται τα γράμματα.
Γενικά όλα (fonts, icons, menus, editors) δεν εμφανίζονται σωστά και τακτοποιημένα. Να ένα παράδειγμα για τους declarative editors του ADF.
Υπάρχει ένα επίσης απίστευτο bug που όταν ανοίγει κανείς το JSF visual editor, ο Jdeveloper ελαχιστοποιείται σαν παράθυρο! Παρόλο που μπορεί κάποιος να απενεργοποιήσει το dpi scaling για τον Jdeveloper, πάλι το αποτέλεσμα δεν είναι ικανοποιητικό. Μόνο με την μείωση της ανάλυσης οθόνης είναι εφικτό να δουλεύει κάποιος.
Το Eclipse μέχρι την τωρινή του έκδοση (Mars 4.5.x) δεν διαθέτει ικανοποιητική υποστήριξη dpi αλλά σίγουρα τα πράγματα είναι καλύτερα από τον Jdeveloper. Υπάρχει ένα workaround που περιγράφεται με την δημιουργία ενός manifest file που σίγουρα είναι αποδοτικό αλλά τα fonts εμφανίζονται blurry. Ένας από τους βασικούς στόχους της επόμενης έκδοσης (4.6 Neon) είναι η καλύτερη υποστήριξη dpi, οπότε δεν έχουμε παρά να αναμένουμε.
Τέλος, την πιο ικανοποιητική υποστήριξη την είχε το Android Studio που βασίζεται στο IntelliJ IDEA. Αν και μερικά παράθυρα διαλόγων δεν εμφανίζονται σωστά, η συνολική εμπειρία εμφάνισης είναι πολύ καλή για high dpi οθόνες.



May 14, 2014

Πρώτες εντυπώσεις από το FreeBSD

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

Το τελευταίο χρονικό διάστημα βρήκα την ευκαιρία να ασχοληθώ σε μικρό βαθμό με το BSD. Υπήρξαν διάφοροι λόγοι για την περιέργεια μου. Ένας από αυτούς ήταν η συμπεριφορά του ως λειτουργικό σύστημα, μιας και διαθέτει την φήμη για ένα πολύ σταθερό σύνολο, που εξάλλου χρησιμοποιείται και από το Mac OS. Μια άλλη τεχνολογία που παρουσιάζει ενδιαφέρον είναι αυτή του lightweight virtualization που υλοποιείται με το jails (αντίπαλο δέος του lxc που έχω αναφερθεί στο παρελθόν) Μια τρίτη περιοχή είναι η υποστήριξη της Java και των εργαλείων της. Δεν είχα ιδιαίτερες φιλοδοξίες για το λογισμικό της Oracle, μιας και κανένα προϊόν δεν είναι certified με αυτήν την πλατφόρμα.

Στα πλαίσια μιας δοκιμής μικρής κλίμακας, αποφάσισα να χρησιμοποιήσω ένα έτοιμο virtual machine image του FreeBSD, που ονομάζεται VirtualBSD. Αυτό είναι διαθέσιμο τόσο για VirtualBox όσο και για VMWare και αφορά αρχιτεκτονικές 64-bit. Μέσα σε λίγα λεπτά προέκυψε ένα έτοιμο σύστημα προς χρήση! Να μια φωτογραφία από το web site των δημιουργών του VirtualBSD, έκδοση 10.0. Ένας οδηγός γρήγορης εισαγωγής και μάλιστα στα ελληνικά βρίσκεται εδώ.
Το VirtualBSD έρχεται με ένα μεγάλο πλήθος χρηστικών εφαρμογών (LibreOffice, Skype, Pidgin, VLC, κλπ) Το να αναβαθμίσει κανείς μια εφαρμογή ή να εγκαταστήσει μια καινούργια προκαλεί αρχικά έκπληξη, αφού κατά τον παραδοσιακό τρόπο, χρειάζεται να γίνεται άντληση από το internet του πηγαίου κώδικα της εφαρμογής και να ακολουθήσει compilation με την προτροπή για διάφορα flags. Ίσως με αυτόν τον τρόπο ενθαρρύνεται η σταθερότητα του συστήματος. Από την άλλη, μια νέα έκδοση του LibreOffice θα χρειάζεται τουλάχιστον ένα διώρο compilation με την CPU σε υψηλό φόρτο! Εντύπωση μου έκανε πάντως το package (ή καλύτερα ports) management στο BSD: μπόρεσα από διαφορετικά τερματικά να κάνω εγκατάσταση ταυτόχρονα δυο εφαρμογές. Διαχειριστές πακέτων στο Linux όπως στο Ubuntu (deb) και στο Oracle Linux/RedHat συνήθως βάζουν κλειδώματα στη βάση δεδομένων των εφαρμογών και επιτρέπουν μια ενημέρωση την φορά. Το σύστημα των αρχείων ακολουθεί μια μεγαλύτερη πειθαρχία με τις νέες εφαρμογές να τοποθετούνται στον κατάλογο /usr/local.

Ένα άλλο πολύ θετικό του BSD είναι η χαμηλή κατανάλωση πόρων και ιδίως της μνήμης (RAM), ακόμα και παρακάτω από το Linux. Αυτό σου δίνει την αίσθηση ενός στιβαρού, multitasking UNIX συστήματος.  Επίσης η διαχείριση των εργασιών κατά την εκκίνηση (startup jobs) είναι πολύ απλή, σε αντίθεση με πολύ σοφιστικέ προσεγγίσεις στο Linux (systemd, upstart)

To BSD ενσωματώνει μια τεχνολογία lightweight virtualization που ονομάζεται jails. Αντίστοιχα με το lxc, επιτρέπει να τρέχουν μέσα στον ίδιο kernel προστατευμένα αντίγραφα του λειτουργικού συστήματος. Η υλοποίηση μου άρεσε πάρα πολύ όπως και η ύπαρξη διαφορετικών, ισχυρών εργαλείων διαχείρισης (warden και ezjail) Υπάρχει ακόμα μια υποτυπώδης υποστήριξη για την εκκίνηση Debian μέσα σε ένα τέτοιο περιβάλλον! Όπως και στο lxc, ένας νέος container ξεκινά σε δυο-τρια δευτερόλεπτα.

Ως προς την Java, το VirtualBSD έρχεται με την προεγκατεστημένη έκδοση OpenJDK 1.6.0.32, ενώ στον κατάλογο ports θα βρούμε επίσης τις εκδόσεις OpenJDK 7/8, το NetBeans 8 και το Eclipse Indigo (3.7.1) H εγκατάσταση του OpenJDK8 και του NetBeans 8 ήταν δίχως προβλήματα (αν και πήρε πολύ ώρα λόγω του compilation) Για την ορθή λειτουργία, χρειάστηκε να προστεθεί στο αρχείο etc/netbeans.conf η σωστή αναφορά στο OpenJDK8 home καθώς και η παράμετρος nosplash για την εκκίνηση, δηλαδή:

netbeans_default_options="-J-client ... --nosplash"
netbeans_jdkhome="/usr/local/openjdk8"

Apr 13, 2014

Οδηγός γρήγορης εκκίνησης του SonarQube στο Ubuntu σε 2 λεπτά

Το SonarQube αποτελεί ένα de-facto εργαλείο για την στατική ανάλυση κώδικα και την παρακολούθηση της εξέλιξης, της ποιότητας και της εφαρμογής κανόνων στην ανάπτυξη. Αυτό το διάστημα εξετάζω το SonarQube σε σχέση με το Oracle ADF και κώδικα γραμμένο σε PL/SQL και αυτό το πρώτο σημείωμα στοχεύει στην εγκατάσταση του SonarQube με τον γρηγορότερο δυνατό τρόπο στο Ubuntu.

Συνεπής με τις τεχνολογίες virtualization και για λόγους καλύτερης οργάνωσης, κατασκεύασα μια εικονική μηχανή στο lxc, βασισμένη στην τελευταία έκδοση του Ubuntu με την εντολή:

sudo lxc-create -t ubuntu -n sonar

Άσχετα αν ακολουθήσουμε το lxc, θα χρειαστούμε ένα data repository για το SonarQube. Ας χρησιμοποιήσουμε την MySQL.


sudo apt-get install mysql-server


Ένα script για την κατασκευή του απαραίτητου σχήματος θα βρείτε εδώ. Για την εγκατάσταση του λογισμικού του SonarQube, θα χρειαστούμε την Java (κατά προτίμηση JDK 7) αλλά και το ίδιο το λογισμικό του Sonar. Πολύ εύκολο! Προσθέτουμε δυο εγγραφές στο /etc/apt/sources.list:

deb http://downloads.sourceforge.net/project/sonar-pkg/deb binary/
deb http://ppa.launchpad.net/webupd8team/java/ubuntu saucy main

Και έπειτα εγκαθιστούμε το σχετικό λογισμικό:

sudo apt-get update && sudo apt-get install oracle-java7-installer sonar

Με την προηγούμενη εντολή, θα γίνει εγκατάσταση στην διαδρομή /opt/sonar με τα δικαιώματα ενός ειδικού χρήστη (sonar) Για να συνδέσουμε το Sonar με την MySQL, επεξεργαζόμαστε το αρχείο /opt/sonar/conf/sonar.properties και σχολιάζουμε (comment) την H2 database και κάνουμε uncomment την γραμμή της MySQL.

Τέλος, για την αυτόματη εκκίνηση του SonarQube, μπορούμε να προσθέσουμε την εξής γραμμή στο αρχείο /etc/rc.local.

su - sonar /opt/sonar/bin/linux-x86-64/sonar.sh start

Έτσι, οι αναφορές θα μας περιμένουν στο http://localhost:9000. Περισσότερες πληροφορίες για την εγκατάσταση θα βρείτε εδώ.

Στα επόμενα άρθρα θα αναφερθούμε στην χρήση SonarQube σε ADF εφαρμογές καθώς και στην διασύνδεση με το OJAudit.

Feb 15, 2014

Ubuntu 13.10 και Java

Για πρώτη φορά η αναβάθμιση στο Ubuntu 13.10 64-bit (Saucy Salamander) έχει προκαλέσει διάφορα προβλήματα και παράπονα για εφαρμογές της Java, για τις οποίες φαίνεται πως υπεύθυνες οι νέες βιβλιοθήκες του Unity και του GTK. Το περιβάλλον της Java που χρησιμοποιώ είναι το Oracle JDK 6 που προέρχεται από την ομάδα WebUpd8. Για καλή μου τύχη, ο JDeveloper σε όλες τις 11g R1 εκδόσεις του που διατηρώ δεν παρουσίασε κάποιο πρόβλημα. Το ίδιο όμως δεν ισχύει και με το Eclipse OEPE 11.1.1.8 32-bit (βασισμένο στο Eclipse 3.7.2) που χρειάζεται για την ανάπτυξη στο Oracle Service Bus 11.1.1.6+. Εδώ το περίεργο είναι πως με την σκίαση μιας επιλογής μενού, αυτή γίνεται δυσδιάκριτη λόγω του ότι εμφανίζεται με λευκό χρώμα. Επίσης, γενικά τα GUI controls δεν είναι καλαίσθητα.
Στο δε Spring Source Toolkit 3.4.0 οι επιλογές του οριζόντιου μενού δεν άνοιγαν στο παραμικρό. Το workaround εδώ είναι να ξεκινήσουμε το SST με την εντολή:

env UBUNTU_MENUPROXY=0 STS

Apr 15, 2013

Αλλάζοντας τα περιεχόμενα ενός .ear αρχείου μέσω ANT scripting

Δεν είναι σπάνιες οι περιπτώσεις που έπειτα από μια διαδικασία packaging θα χρειαστεί να αλλάξουμε κάτι στο παραγόμενο .ear αρχείο εφαρμογών μας. Για τους JEE και τους custom descriptors, ο Weblogic υποστηρίζει τα deployment plans (http://docs.oracle.com/cd/E11035_01/wls100/deployment/config.html) Ίσως πάλι να χρειαστεί να αλλάξουμε κάτι περισσότερο "εσωτερικό", πχ κάποιες κλάσεις ή properties αρχεία. Σε μια ανάλογη περίπτωση, χρειάστηκε να χειριστώ ένα .ear αρχείο που προέκυψε από το ojdeploy του JDeveloper. Ένας σύντομος δρόμος επεξεργασίας, προσφέρεται από την ΑΝΤ βιβλιοθήκη GroboUtils (http://groboutils.sourceforge.net/index.html) που προσφέρει υπηρεσίες όπως alterEar, alterWar, κ.ο.κ.

Κατεβάζοντας τους κώδικες του GroboUtils, μεταφέρουμε το αρχείο GroboCodeCoverage-1.1.0-ant.jar στο $ANT_HOME/lib φάκελο μας. Έπειτα, θέλοντας ενδεικτικά να τροποποιήσουμε ένα properties αρχείο στη διαδρομή WEB-INF/classes (που βρίσκεται στο συμπεριλαμβανόμενο .war αρχείο) μπορούμε να έχουμε τους ακόλουθους κώδικες στο ANT script μας:

<taskdef resource="ant-grobocoverage.properties">
  <classpath>
    <pathelement location="/usr/share/java/lib/GroboCodeCoverage-1.1.0-ant.jar"/>
  </classpath>
</taskdef>
    <grobo-rezip>
    <alterEar src="${dist.dir}/ear/myapplication.ear">
        <alterWar src="myapplication_webapp1.war">
            <classes dir="${build.tmp.dir}" includes="**/Application.properties" />
        </alterWar>
    </alterEar>
</grobo-rezip>

Jul 19, 2011

Κάνοντας tag κώδικα Java και PL/SQL στο Subversion

Δεν είναι λίγα τα Java projects που κάνουν ανάπτυξη και σε PL/SQL κώδικα. Ενώ όμως η τήρηση version control είναι εξαιρετικά απλή υπόθεση στον κόσμο της Java (πχ μέσω του Subversion), το ίδιο δεν ισχύει για την PL/SQL μιας και τα εξειδικευμένα SCM συστήματα είναι είτε εξαιρετικά πολύπλοκα είτε ακριβά. Είτε για λόγους καθημερινού backup, είτε για version tagging και releasing, είναι απαραίτητο να κρατάμε συγχρονισμένους τους κώδικες Java και PL/SQL σε ένα κεντρικό σημείο.

Ένα χρήσιμο εργαλείο που επιτρέπει την εξαγωγή metadata από μια Oracle βάση δεδομένων είναι το jipes (http://sourceforge.net/projects/jipes/) Πρόκειται για μια Java εφαρμογή που μπορεί να χρησιμοποιηθεί είτε standalone είτε μέσω ενός ANT task ώστε ρωτώντας το dictionary της Oracle, να μπορεί να αποθηκεύσει όλους τους ορισμούς των αντικειμένων ενός σχήματος (πχ πίνακες, indexes, packages, κλπ) σε μια δομή καταλόγων. Ένα παράδειγμα χρήσης:

java com.jipes.cm.Builder -m export -s jdbc:oracle:thin:@dbserver:1521:ora -sU schema -sP schema_passwd -schema schema

Μετά θα δημιουργηθούν οι εξής κατάλογοι που θα περιέχουν τα metadata της βάσης μας:

index/
package/
package-body/
procedure/
table/

view/

Εξίσου εύκολη και η χρήση του μέσω ANT. Τα αποτελέσματα μπορούν να γίνουν zip και αμέσως μετά commit και tag στο Subversion ώστε να τα σώσουμε μαζί με τους Java κώδικες.

<taskdef name="jipes-cm" classname="com.jipes.cm.ant.BuildTask"> <classpath> <path location="${project.basedir}/jipes-cm-alldep" /> </classpath> </taskdef> <jipes-cm buildMode="export" sourceURL="${datasource.url}" sourceUser="${datasource.user}" sourcePass="${datasource.pass}" directory="${build.sql.dir}/export" schemaFilter="${datasource.user}"> </jipes-cm>

Oct 19, 2010

Ρύθμιση του time sync στο VirtualBox

Ένα από τα πιο ουσιαστικά προγράμματα που έχω ποτέ χρησιμοποιήσει είναι το JProfiler (http://www.ej-technologies.com/products/jprofiler/overview.html) Το έχω εμπιστευτεί ουκ ολίγες φορές για το profiling JEE εφαρμογών, που συνήθως εκτελούνταν στον Oracle Application Server (φυσικά λειτουργεί και με πολλούς άλλους Application Servers) και πραγματικά με έχει εντυπωσιάσει με τις δυνατότητές του και τη λεπτομέρεια των στοιχείων του. Ενώ όμως είναι ένα προϊόν που το έχω συστήσει σε πολλούς οργανισμούς, οι οποίοι τελικά το έχουν αγοράσει, προσωπικά θεωρώ το development license του υψηλό. Κατά αυτόν τον τρόπο βρίσκομαι στο αδιέξοδο μιας trial version που δεν μπορεί να λειτουργήσει ούτε να ανοίξει τα profiling snapshots που μου στέλνουν οι πελάτες μου.
JProfiler license
Εξαιτίας του ότι τρέχω όλο το προγραμματιστικό μου περιβάλλον σε virtual machines του VirtualBox, μπορώ να κάνω ένα τέχνασμα, αλλάζοντας την ημερομηνία του guest vm ώστε να μην διαμαρτύρεται ο JProfiler για την πάροδο της δοκιμαστικής περιόδου. Πιο συγκεκριμένα, έχοντας κλειστό το guest vm, πληκτρολογούμε:

VBoxManage setextradata [VMname] "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" "1"

Έτσι, απορρυθμίζεται το ρολόι του guest από το συγχρονισμό του με τον host. Έπειτα ξεκινούμε το vm μας και αλλάζουμε την ώρα. Ο JProfiler θα εκτελεστεί κανονικά μετά από αυτήν την αλλαγή.
JProfiler memory consumption
Τερματίζουμε το vm μας και για να επιστρέψουμε στο συγχρονισμό ώρας μεταξύ host και guest στο VirtualBox πληκτρολογούμε:

VBoxManage setextradata [VMname] "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" "0"

Oct 7, 2009

XSD validation με τη βοήθεια του Xerces

Επειδή χρειάστηκε πρόσφατα να χρησιμοποιήσω τη βιβλιοθήκη του Xerces (http://xerces.apache.org/xerces-j/ ) για XSD validation ενός XML κειμένου και διαπίστωσα πως υπάρχουν διάφορες, διάσπαρτες προσπάθειες γι' αυτό στο δίκτυο, οπότε ας καταθέσω και το δικό μου παράδειγμα (example):


/**
* Validate a XML document against a XSD using Xerces.
* @param filename is the URI of the document to validate. For instance:
* file:///tmp/td.xml
* @param schemaLocation is the URI of the XSD. For instance file:///tmp/td.xsd
* @throws Exception in case of validation error.
*/
public static void validateDocument(String filename,
String schemaLocation) throws Exception {
/**
* Define an embedded handler for validation errors.
*/
class Validator extends DefaultHandler {
private boolean validationError = false;
private SAXParseException saxParseException = null;

public void error(SAXParseException exception) throws SAXException {
validationError = true;
saxParseException = exception;
}

public void fatalError(SAXParseException exception) throws SAXException {
validationError = true;
saxParseException = exception;
}

public void warning(SAXParseException exception) throws SAXException {
;
}
}

XMLReader parser = XMLReaderFactory.createXMLReader();
parser.setFeature("http://xml.org/sax/features/validation", true);
parser.setFeature("http://apache.org/xml/features/validation/schema",
true);
// Use external-schemaLocation for an XSD defining a namespace or external-noNamespaceSchemaLocation
// for those not defining it.
parser.setProperty("http://apache.org/xml/properties/schema/external-schemaLocation",
schemaLocation);
Validator handler = new Validator();
parser.setErrorHandler(handler);
parser.parse(filename);
System.out.println("VALIDATION ERROR occured: " + handler.validationError);
if (handler.validationError) {
throw handler.saxParseException;
}
}

Dec 14, 2008

Υπογράφοντας XML έγγραφα με το πρότυπο XML Signatures

Για τις ανάγκες του έργου κρυπτογράφησης εγγράφων με τη βοήθεια των καρτών του ΣΥΖΕΥΞΙΣ (http://serafeimk.blogspot.com/2008/11/oracle-xml-parser-xerces-xalan-oracle.html) χρειάστηκε να εξερευνήσω τις διαθέσιμες βιβλιοθήκες, προκειμένου να καταστεί εφικτή η ψηφιακή υπογραφή και επαλήθευση αυτής σε XML κείμενα. Το διαθέσιμο πρότυπο από το W3C είναι το XML Signatures, που περιγράφεται στο http://www.w3.org/Signature/

  1. Μια πρώτη επιλογή αποτελεί το project XML Security του Apache (http://santuario.apache.org/) που προσφέρει την υποστήριξη για το πρότυπο των υπογραφών καθώς και επιπλέον δυνατότητες για κρυπτογράφηση ευαίσθητων τμημάτων ενός εγγράφου XML.
  2. Μια δεύτερη επιλογή αποτελούν Security Developer Tools της Oracle (http://www.oracle.com/technology/products/id_mgmt/osdt/index.html) που απαρτίζουν στην ουσία τις βιβλιοθήκες της Phaos που περιήλθαν στην κατοχή της Oracle έπειτα από την εξαγορά. Οι βιβλιοθήκες της Phaos καλύπτουν διάφορες ανάγκες κρυπτογράφησης αρχείων XML, XML υπογραφών, κρυπτογράφησης ηλεκτρονικού ταχυδρομείου, Web Services, SAML, το Liberty SDK και πολλά άλλα, ενώ ένας εξαιρετικά αναλυτικός κατάλογος παραδειγμάτων (samples) βρίσκεται στο http://www.oracle.com/technology/sample_code/products/id_mgmt/security-developer-tools/index.html Η χρησιμοποίηση των βιβλιοθηκών είναι εύκολη υπόθεση στον JDeveloper και βρίσκονται στον κατάλογο $JDEV_HOME/jlib και ξεκινούν με το πρόθεμα osdt_*

Ως βιβλιοθήκες μου φάνηκαν πιο παραγωγικές και λιγότερο φλύαρες από αυτές του Apache, με μια παρατήρηση: όλες οι βασικές κλάσεις για τα κλειδιά (private/public) ή για τα ηλεκτρονικά πιστοποιητικά (certificates) δεν προέρχονται από τα standard Java πακέτα ή artifacts (π.χ. java.security.PublicKey) αλλά απεναντίας είναι ορισμένες μέσα στο πλαίσιο της Oracle, σε νέες, αυτόνομες κλάσεις. Αυτό έχει σημασία αν χρειαστεί κάποιος να διασυνδέσει τον κώδικα του με κώδικα πιστοποιητικών άλλης υλοποίησης. Προφανώς για να τις χρησιμοποιήσει κάποιος, θα πρέπει να έχει και την αντίστοιχή άδεια κτήσης του Oracle Application Server ή του Oracle Identity Management.
  1. Τέλος, με την έλευση του JDK 6, ανάλογες δυνατότητες έχουν προστεθεί στον πυρήνα της γλώσσας (http://java.sun.com/javase/6/docs/technotes/guides/security/xmldsig/XMLDigitalSignature.html), γεγονός όμως που μας αναγκάζει να έχουμε το περιβάλλον εκτέλεσης σε αυτήν την έκδοση ή ανώτερη.

Jan 4, 2008

Παρακολούθηση (monitoring) ενός JVM

Ένα από τα σχετικά άσημα προγράμματα που περιλαμβάνονται στα JDK 1.5 και 1.6 είναι το JConsole (http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html) που μας παρέχει πληροφορίες σχετικά με την κατανάλωση μνήμης, τις ρυθμίσεις και την εν γένει συμπεριφορά του JVM. Θα μου πείτε που το θυμήθηκα αυτό; Στην νεώτερη έκδοση του OC4J 11g Technology Preview δεν υπάρχει (προς το παρόν) το Application Server Control, μια γραφική δηλαδή διεπαφή παρακολούθησης. Γι αυτό το λόγο, το JConsole μου φάνηκε χρήσιμο για να παίρνω την απολύτως απαραίτητη πληροφορία για την κατάσταση του JVM του OC4J.

Προκειμένου να ενεργοποιήσουμε την παρακολούθηση ενός JVM, αρκεί να το ξεκινήσουμε με την παράμετρο -Dcom.sun.management.jmxremote Πιο συγκεκριμένα, ξεκινώ το OC4J ως εξής:

java -Dcom.sun.management.jmxremote -XX:MaxPermSize=256m -Xms256m -Xmx768m -jar oc4j.jar

Κατόπιν, εκτελούμε το πρόγραμμα JConsole που βρίσκεται στον κατάλογο $JDK_HOME/bin . Η πρώτη οθόνη θα μας ρωτήσει για το ποιο JVM, τοπικό ή απομακρυσμένο, θέλουμε να παρακολουθήσουμε.

Κατόπιν τούτου, η κονσόλα μας παρουσιάζει πολλές και χρήσιμες πληροφορίες σχετικά με την κατάσταση μνήμης, τα active threads και τις φορτωμένες κλάσεις στο σύστημά μας, επιτρέποντας να ενεργοποιήσουμε κατά βούληση τον Garbage Collector. Με αυτόν τον τρόπο, μπορούμε να κάνουμε το πιο απλό profiling μιας εφαρμογής.

Εξαιρετικά χρήσιμο χαρακτηριστικό του JConsole είναι πως μπορεί να αντλήσει πληροφορίες διαχείρισης από το JVM, βασισμένες στην τεχνολογία Java Management Extension (JMX) Έτσι για παράδειγμα, μπορώ να δω ποιες εφαρμογές έχουν γίνει deploy στον OC4J, καθώς και να σταματήσω αν θέλω κάποιες από αυτές ή να επηρεάσω τις ιδιότητές τους.


Mar 18, 2007

Αναζήτηση κειμένου με χρήση regular expressions

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

Για παράδειγμα, τις τελευταίες ημέρες ήρθα αντιμέτωπος με τη συντήρηση ενός κώδικα, όπου στις exception handling περιπτώσεις δεν υπήρχε καθόλου διαχείριση του catch() block, δηλαδή με άλλα λόγια ήταν κενό ({}) και δεν τυπώνονταν καν ένα μήνυμα για το είδος του exception που συνέβηκε στα log files. Είναι δύσκολο να ανιχνευτούν αυτές οι περιπτώσεις από μια τυπική αναζήτηση κειμένου καθώς οι αγκύλες του catch block μπορούν να εκτείνονται σε να βρίσκονται στην ίδια γραμμή ή να εκτείνονται σε πολλαπλές γραμμές. Η λύση τότε είναι να πραγματοποιηθεί η αναζήτηση με την χρήση κανονικών εκφράσεων (regular expressions) στις οποίες θα προσδιοριστεί η μορφή του κειμένου που θέλουμε να βρούμε. Οι κανονικές εκφράσεις μας επιτρέπουν να ψάξουμε ένα κείμενο για την εύρεση στοιχείων που έχουν μια συγκεκριμένη μορφή την οποία ορίζουμε. Θέλοντας για παράδειγμα να βρούμε όλα τα σημεία στον κώδικά μας που περιλαμβάνουν μεταβλητές που ξεκινούν από ένα ή περισσότερα γράμματα και καταλήγουν σε αριθμούς, η κανονική έκφραση θα είναι: [a-z,A-Z]+[0-9]+, δηλαδή που θα διαθέτει γράμματα πεζά ή κεφαλαία του λατινικού αλφαβήτου, ένα ή περισσότερα (αυτό το ρόλο παίζει ο χαρακτήρας '+') και έπονται ένα ή περισσότερα αριθμητικά ψηφία. Για να ενεργοποιήσουμε αυτήν την έκφραση διαλέγουμε την επιλογή "Regular expressions" στην οθόνη αναζήτησης του JDeveloper.


Οι κανονικές εκφράσεις που μπορούν να χρησιμοποιηθούν είναι συμβατές με τη μορφή που ορίζεται στο JDK 1.4, ενώ κατατοπιστικές πληροφορίες βρίσκονται στο: http://www.siteexperts.com/tips/functions/ts23/page1.asp Στην περίπτωση μας, η καρδιά της αναζήτησης έχει να κάνει με την εύρεση αγκυλών (που ως χαρακτήρες με ιδιαίτερη σημασία συμβολίζονται ως \{) που ακολουθούνται από μηδέν ή περισσότερα κενά διαστήματα ή αλλαγές γραμμών (που συμβολίζονται με τον χαρακτήρα \s) Με άλλα λόγια, της μορφής:

\{\s*\}

Έαν προσθέσουμε σε αυτό, και την αναζήτηση του κειμένου Exception νωρίτερα (γιατί η προηγούμενη έκφρασή μας θα μας επιστέψει όλα τα κενά blocks, πχ empty constructors) τότε φθάνουμε στην τελική έκφραση που θα μας εμφανίσει όλα τα κενά catch blocks.

Exception\s[a-z]+\)\s*\{\s*\}