<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-20568265</id><updated>2012-01-30T11:31:08.881+02:00</updated><category term='openSuSE'/><category term='virtualbox'/><category term='libreoffice'/><category term='Oracle SOA Suite'/><category term='books'/><category term='Migration'/><category term='webcenter'/><category term='Oracle Application Server'/><category term='OpenOffice'/><category term='eclipselink'/><category term='XML'/><category term='BPM'/><category term='events'/><category term='Oracle'/><category term='Java'/><category term='web services'/><category term='Oracle BI'/><category term='BPEL'/><category term='Oracle DB'/><category term='ADF'/><category term='misc'/><category term='firefox'/><category term='jdeveloper'/><category term='thinkpad'/><category term='jheadstart'/><category term='SLED'/><category term='Linux'/><category term='SQL Developer'/><category term='Solaris'/><category term='weblogic'/><category term='windows'/><category term='JSF'/><category term='ubuntu'/><category term='Blog'/><category term='subversion'/><title type='text'>Serafeim Karapatis Blog</title><subtitle type='html'>Programming hints and trips about Oracle and Linux</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default?start-index=101&amp;max-results=100'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>263</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-20568265.post-7957186245814710485</id><published>2012-01-30T11:09:00.000+02:00</published><updated>2012-01-30T11:11:13.614+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle SOA Suite'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Ένα νέο βιβλίο για την αρχιτεκτονική SOA: Do more with SOA Integration - Best of Packt</title><content type='html'>Ένα νέο βιβλίο που έτυχε της προσοχής μου είναι o πρόσφατος τίτλος της Packt Publishing που αφορά το SOA: &lt;a href="http://www.packtpub.com/soa-integration-automation-business-processes-books-best-of-packt/book"&gt;Do more with SOA Integration - Best of Packt&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-tdckx-uf03k/TyZeewv0w7I/AAAAAAAABeQ/gOXVhpapaT8/s1600/5726EN_Do%2Bmore%2Bwith%2BSOA%2BIntegration%2BBest%2Bof%2BPackt.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 259px; height: 320px;" src="http://4.bp.blogspot.com/-tdckx-uf03k/TyZeewv0w7I/AAAAAAAABeQ/gOXVhpapaT8/s320/5726EN_Do%2Bmore%2Bwith%2BSOA%2BIntegration%2BBest%2Bof%2BPackt.jpg" alt="" id="BLOGGER_PHOTO_ID_5703349860685890482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Εν συντομία, συνιστά ένα απάνθισμα από διάφορα βιβλία της Packt που αφορούν την περιοχή του SOA. Το βιβλίο καλύπτει:&lt;br /&gt; &lt;ul&gt;&lt;li&gt;βασικά patterns του integration καθώς και SOA best practices&lt;/li&gt;&lt;li&gt;μια καλή εισαγωγή στην XML και στα Web Services καθώς και στα σχετικά πρότυπα προσφέροντας πραγματικά παραδείγματα&lt;br /&gt;  &lt;/li&gt;&lt;li&gt;βασικές τεχνολογίες και πρότυπα όπως το JBI (Java Business  Integration), το SCA (Service Component Architecture), το ESB  (Enterprise Service Bus και ειδικά το Oracle ESB), το BPEL (Business  Process Execution Language και ειδικά το Oracle BPEL) και BPM (Business  Process Monitoring και ειδικά το Oracle BPEL) αφιερώνοντας ένα ξεχωριστό  κεφάλαιο σε κάθε ένα από αυτά, επιλύοντας ένα enterprise case-study&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Πρόκειται για ένα βιβλίο που δεν καλύπτει αποκλειστικά τεχνολογίες  της Oracle (δηλαδή του Oracle SOA Suite) αλλά επεκτείνεται και σε  εναλλακτικές προτάσεις όπως το JBI σε σχέση με το NetBeans. Εν ολίγοις,  πρόκειται για ένα πολύ καλό τίτλο, απευθυνόμενο σε architects και SOA  developers ώστε να αποκτήσουν τη βασική γνώση και τις βάσεις για μια  μεθοδολογία για ένα SOA project. Για περισσότερες όμως πληροφορίες  σχετικά με τα προϊόντα που θα χρησιμοποιήσουν υπάρχουν βέβαια πιο  εξειδικευμένα βιβλία (πχ &lt;a href="http://www.packtpub.com/books/soa"&gt;εδώ&lt;/a&gt;)&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Στις επόμενες ημέρες, θα προσπαθήσω να δώσω περισσότερες λεπτομέρειες για την ύλη του βιβλίου.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-7957186245814710485?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/7957186245814710485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=7957186245814710485' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7957186245814710485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7957186245814710485'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2012/01/soa-do-more-with-soa-integration-best.html' title='Ένα νέο βιβλίο για την αρχιτεκτονική SOA: Do more with SOA Integration - Best of Packt'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-tdckx-uf03k/TyZeewv0w7I/AAAAAAAABeQ/gOXVhpapaT8/s72-c/5726EN_Do%2Bmore%2Bwith%2BSOA%2BIntegration%2BBest%2Bof%2BPackt.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-8616146519204161249</id><published>2012-01-20T14:30:00.001+02:00</published><updated>2012-01-20T14:31:57.444+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle DB'/><title type='text'>To Oracle XML DB repository (μέρος 4ο)</title><content type='html'>Στο τελευταίο άρθρο (&lt;a href="http://serafeimk.blogspot.com/2012/01/to-oracle-xml-db-repository-3.html"&gt;http://serafeimk.blogspot.com/2012/01/to-oracle-xml-db-repository-3.html&lt;/a&gt;)       είδαμε πως μπορούμε να διαχειριστούμε προγραμματιστικά στοιχεία       του XML DB repository, τη στιγμή που συμβαίνουν διάφορα συμβάντα,       όπως εισαγωγή, μεταβολή ή ανανέωση περιεχομένου. Φυσικά είναι       δυνατόν να έχουμε ανά πάσα στιγμή να αντλήσουμε πληροφορία από το       repository: σύμμαχος μας είναι το PL/SQL package &lt;span style="font-weight: bold;"&gt;DBMS_XDB&lt;/span&gt;. Μερικές από τις       συναρτήσεις που παρουσιάζουν ενδιαφέρον είναι οι:&lt;br /&gt;&lt;p&gt;    &lt;br /&gt;     &lt;span style="font-family:monospace;"&gt;CFG_GET&lt;/span&gt;: που       επιστρέφει σε μορφή XML τις λεπτομέρειες διαμόρφωσης του XML       repository&lt;br /&gt;     &lt;span style="font-family:monospace;"&gt;CHANGEOWNER&lt;/span&gt;:       μεταβάλλει τον ιδιοκτήτη ενός πόρου (αρχείου ή καταλόγου)&lt;br /&gt;     &lt;span style="font-family:monospace;"&gt;CREATEFOLDER&lt;/span&gt;:       δημιουργεί έναν νέο κατάλογο&lt;br /&gt;     &lt;span style="font-family:monospace;"&gt;CREATERESOURCE&lt;/span&gt;:       δημιουργεί ένα νέο αρχείο με παράμετρο τα περιεχόμενά του σε μορφή       VARCHAR2, XMLTYPE, BFILE ή BLOB&lt;br /&gt;     &lt;span style="font-family:monospace;"&gt;GETCONTENTBLOB&lt;/span&gt;:       επιστρέφει τα περιεχόμενα ενός αρχείου του repository σε μορφή       BLOB&lt;br /&gt;     &lt;span style="font-family:monospace;"&gt;GETCONTENTCLOB&lt;/span&gt;:       επιστρέφει τα περιεχόμενα ενός αρχείου του repository σε μορφή       CLOB&lt;br /&gt;     &lt;span style="font-family:monospace;"&gt;GETCONTENTXMLTYPE&lt;/span&gt;:       επιστρέφει τα περιεχόμενα ενός αρχείου του repository σε μορφή       SYS.XMLTYPE&lt;br /&gt;     &lt;span style="font-family:monospace;"&gt;ISFOLDER&lt;/span&gt;: υποδεικνύει       αν το όρισμα της διαδρομής είναι κατάλογος ή όχι&lt;br /&gt;     &lt;span style="font-family:monospace;"&gt;LINK&lt;/span&gt;: δημιουργεί weak       ή hard link σε ένα άλλο resource&lt;br /&gt;     &lt;span style="font-family:monospace;"&gt;SETACL&lt;/span&gt;: ορίζει τα       δικαιώματα πρόσβασης σε ένα resource&lt;br /&gt;   &lt;/p&gt;     &lt;p&gt;&lt;br /&gt;     Συμπληρωματικά, για τις λειτουργίες versioning (version, check-in,       check-out, κλπ) υπάρχει το ειδικό πακέτο &lt;span style="font-family:monospace;"&gt;DBMS_XDB_VERSION&lt;/span&gt;.&lt;br /&gt;   &lt;/p&gt;     &lt;p&gt;&lt;br /&gt;     Πολλές από τις υπηρεσίες αυτών των πακέτων περιμένουν ως όρισμα τη       διαδρομή του αρχείου ή του φακέλου που μας ενδιαφέρει.Γι αυτό το       λόγο, μπορούμε να χρησιμοποιήσουμε το database view &lt;span style="font-weight: bold;"&gt;         RESOURCE_VIEW&lt;/span&gt; και τις κατάλληλες συναρτήσεις ώστε να       προσδιορίζουμε τα περιεχόμενα ενός καταλόγου ή την πλήρη διαδρομή       ενός αρχείου. Για παράδειγμα η εντολή:&lt;br /&gt;   &lt;/p&gt;     &lt;p&gt;&lt;span style="font-family:monospace;"&gt;SELECT any_path as         full_path, path(1) as relative_path FROM RESOURCE_VIEW WHERE         under_path(RES, '/', 1) = 1;&lt;/span&gt;&lt;br /&gt;   &lt;/p&gt;     &lt;p&gt;μας επιστρέφει όλα τα περιεχόμενα του πατρικού (root) καταλόγου       του repository.&lt;/p&gt;&lt;p&gt;&lt;a href="http://3.bp.blogspot.com/-mpjnX64CTpo/TxlemtgBUHI/AAAAAAAABeE/Bn8mov9TM7c/s1600/Screenshot-Oracle%2BSQL%2BDeveloper%2B%253A%2BIntralot_SWBINARIES_XMLDB.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://3.bp.blogspot.com/-mpjnX64CTpo/TxlemtgBUHI/AAAAAAAABeE/Bn8mov9TM7c/s320/Screenshot-Oracle%2BSQL%2BDeveloper%2B%253A%2BIntralot_SWBINARIES_XMLDB.png" alt="" id="BLOGGER_PHOTO_ID_5699690822556012658" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Κάτι που επίσης πρέπει να γνωρίζουμε είναι το που βρίσκονται τα έγγραφά  μας αποθηκευμένα. Έπειτα από μια τυπική εγκατάσταση, έχει δημιουργηθεί  (και είναι locked) το σχήμα XDB που διαχειρίζεται όλο το XML DB  repository. Το tablespace που βρίσκεται αυτό το σχήμα είναι το SYSAUX.  Αν αυτό δεν μας ικανοποιεί, τότε μπορούμε να χρησιμοποιήσουμε την κλήση &lt;span style="font-family: monospace;"&gt;dbms_xdb_admin.moveXDB_Tablespace&lt;/span&gt; ώστε να το μεταφέρουμε σε ένα άλλο tablespace της επιλογής μας (η εντολή αφορά την έκδοση 11.2.0.3) ή με την &lt;span style="font-family: monospace;"&gt;DBMS_XDB.MOVEXDB_TABLESPACE&lt;/span&gt; για την 11.2.0.1. Εναλλακτικά, μπορούμε να φτιάξουμε μια βάση χωρίς την επιλογή της XML DB που θα την προσθέσουμε αργότερα (&lt;a href="http://docs.oracle.com/cd/B28359_01/appdev.111/b28369/appaman.htm#i638485"&gt;http://docs.oracle.com/cd/B28359_01/appdev.111/b28369/appaman.htm#i638485&lt;/a&gt;)  Τέλος, ένα άλλο ειδικό χαρακτηριστικό της XML DB έχει να κάνει με το  backup: με ένα λογικό export (expdp) δεν τηρείται η δομή των καταλόγων  που έχουμε φτιάξει. Θα χρειαστούμε ένα RMAN backup ώστε να μεταφέρουμε  επιτυχώς ένα XML DB repository.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-8616146519204161249?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/8616146519204161249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=8616146519204161249' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/8616146519204161249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/8616146519204161249'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2012/01/to-oracle-xml-db-repository-4.html' title='To Oracle XML DB repository (μέρος 4ο)'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-mpjnX64CTpo/TxlemtgBUHI/AAAAAAAABeE/Bn8mov9TM7c/s72-c/Screenshot-Oracle%2BSQL%2BDeveloper%2B%253A%2BIntralot_SWBINARIES_XMLDB.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-4609009848358160175</id><published>2012-01-17T13:12:00.003+02:00</published><updated>2012-01-17T13:18:44.206+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle DB'/><title type='text'>To Oracle XML DB repository (μέρος 3ο)</title><content type='html'>Στα προηγούμενα δυο άρθρα δημιουργήσαμε δυο χρήστες, με σαφώς  καθορισμένα δικαιώματα, που πρόκειται να προσθέτουν περιεχόμενο σε έναν  δεδομένο κατάλογο. Η δημιουργία περιεχομένου είναι κάτι που μας  ενδιαφέρει πολύ, καθώς μπορεί να εκκινεί διαδικασίες περαιτέρω  επεξεργασίας των άρτι αφιχθέντων εγγράφων. Το XML DB παρέχει τη  δυνατότητα διαχείρισης των γεγονότων (events) που συμβαίνουν στο  repository, όπως η δημιουργία, η μεταβολή ή η διαγραφή στοιχείων  (περισσότερες πληροφορίες &lt;a href="http://docs.oracle.com/cd/E11882_01/appdev.112/e23094/xdb_repos_events.htm"&gt;εδώ&lt;/a&gt;)  Δεν έχουμε παρά να γράψουμε ένα PL/SQL package που θα διαχειρίζεται τα  συμβάντα του ενδιαφέροντος μας. Για παράδειγμα το specification ενός  τέτοιου PL/SQL package, που θα ανήκει στον υπερδιαχειριστή του XML DB  (λογαριασμός xmlrepos1 που δημιουργήσαμε νωρίτερα):&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:monospace;"&gt;create or replace&lt;/span&gt;&lt;span style="font-weight: bold; font-family:monospace;" &gt; &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;package xml_event_pkg as &lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;   /**&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;     * Handle the event of adding new content into the repository.&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;     */&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;   PROCEDURE handlePostLinkTo (eventObject DBMS_XEVENT.XDBRepositoryEvent);&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;   /**&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;     * Handle the event of updating content on the repository.&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;     */&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;   PROCEDURE handlePreUpdate (eventObject DBMS_XEVENT.XDBRepositoryEvent);&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;   /**&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;     * Handle the event of removing content from the repository.&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;     */&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;   PROCEDURE handlePreDelete (eventObject DBMS_XEVENT.XDBRepositoryEvent);&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;end xml_event_pkg;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;με μια ενδεικτική υλοποίηση:&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:monospace;"&gt; PROCEDURE handlePostLinkTo (eventObject DBMS_XEVENT.XDBRepositoryEvent) as&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;    XDBPathobj     DBMS_XEVENT.XDBPath;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;    ResPath        VARCHAR2(1000);&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;    XDBResourceObj DBMS_XDBRESOURCE.XDBResource;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;    ResDisplayName VARCHAR2(100); &lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;  BEGIN&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;          XDBResourceObj := DBMS_XEVENT.getResource(eventObject);&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;          XDBPathobj     := DBMS_XEVENT.getPath(eventObject);&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;          ResDisplayName := DBMS_XDBRESOURCE.getDisplayName(XDBResourceObj);&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;          ResPath        := DBMS_XEVENT.getName(XDBPathObj);&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;το πακέτο DBMS_XDB παρέχει διάφορες συναρτήσεις και διαδικασίες που  μπορούμε να αξιοποιήσουμε για το περιεχόμενο μας, να το λάβουμε σε μορφή  BLOB, CLOB, XML, να διαβάσουμε metadata του, κτλ. Προκειμένου να  ενεργοποιήσουμε σε έναν δεδομένο κατάλογο τον event listener που μόλις  φτιάξαμε, κατασκευάζουμε ένα XML έγγραφο παραμετροποίησης και εκτελούμε  τον εξής κώδικα:&lt;br /&gt;&lt;/p&gt; &lt;p style="font-family: monospace;"&gt;DECLARE&lt;br /&gt;b BOOLEAN := FALSE;&lt;br /&gt;BEGIN&lt;br /&gt;b:= DBMS_XDB.createFolder('/public/resconfig');&lt;br /&gt;COMMIT;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:monospace;"&gt;   b := DBMS_XDB.createResource(&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;         '/public/resconfig/appfilelistener-uploadFolder.xml',&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;         '&amp;lt;ResConfig xmlns="http://xmlns.oracle.com/xdb/XDBResConfig.xsd"&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;                     xsi:schemaLocation="http://xmlns.oracle.com/xdb/XDBResConfig.xsd&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;                                         http://xmlns.oracle.com/xdb/XDBResConfig.xsd"&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;            &amp;lt;event-listeners set-invoker="false"&lt;span style="font-family:Georgia,serif;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;              &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;listener&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;                &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;description&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;File listener&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;/description&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;                &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;schema&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;XMLREPOS1&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;/schema&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;                &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;source&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;XML_EVENT_USER_EVT_PKG&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;/source&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;                &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;language&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;PL/SQL&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;/language&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;                &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;events&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;                  &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;Post-LinkTo/&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;                 &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;Pre-Update/&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;                  &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;Pre-Delete /&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;                &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;/events&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;              &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;/listener&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;            &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;/event-listeners&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;            &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;defaultChildConfig&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;              &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;configuration&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;                &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;path&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;/public/resconfig/appfilelistener-uploadFolder.xml&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;/path&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;              &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;/configuration&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;            &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;/defaultChildConfig&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;          &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;/ResConfig&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;',&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;         'http://xmlns.oracle.com/xdb/XDBResConfig.xsd',&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;         'ResConfig');&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;  DBMS_RESCONFIG.appendResConfig('/uploadFolder', &lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;                                 '/public/resconfig/appfilelistener-uploadFolder.xml',&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;                                 DBMS_RESCONFIG.APPEND_RECURSIVE);&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;   commit;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;END;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Έχουμε σχεδόν τελειώσει με την παραμετροποίηση του DB repository μας.  Ας ανοίξουμε τα κανάλια διάθεσης περιεχομένου στους τελικούς μας  χρήστες, ενεργοποιώντας τους FTP και WebDAV listeners της βάσης:&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;begin&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;DBMS_XDB.setFTPPort(2100);&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;DBMS_XDB.setHTTPPort(8080);&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;end;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://1.bp.blogspot.com/-ZEaTlBDA5f8/TxVYoP9djmI/AAAAAAAABds/o88B79cJYnI/s1600/Screenshot-gFTP%2B2.0.19.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 220px;" src="http://1.bp.blogspot.com/-ZEaTlBDA5f8/TxVYoP9djmI/AAAAAAAABds/o88B79cJYnI/s320/Screenshot-gFTP%2B2.0.19.png" alt="" id="BLOGGER_PHOTO_ID_5698558352009563746" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/-8VxVozOyzPo/TxVYvr0q4KI/AAAAAAAABd4/ydVP5CEOtzY/s1600/webdav.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-8VxVozOyzPo/TxVYvr0q4KI/AAAAAAAABd4/ydVP5CEOtzY/s320/webdav.png" alt="" id="BLOGGER_PHOTO_ID_5698558479747965090" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Τώρα οι χρήστες μας είναι σε θέση να προσθέσουν περιεχόμενο, να  διαχειριστούν φακέλους και αρχεία, όπως σε ένα τυπικό σύστημα αρχείων.  Στο επόμενο άρθρο θα εστιάσουμε στις ευκολίες προγραμματισμού και στο  περιβάλλον διαχείρισης του XML DB.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-4609009848358160175?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/4609009848358160175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=4609009848358160175' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4609009848358160175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4609009848358160175'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2012/01/to-oracle-xml-db-repository-3.html' title='To Oracle XML DB repository (μέρος 3ο)'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-ZEaTlBDA5f8/TxVYoP9djmI/AAAAAAAABds/o88B79cJYnI/s72-c/Screenshot-gFTP%2B2.0.19.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-3121912627099135456</id><published>2012-01-09T17:00:00.003+02:00</published><updated>2012-01-09T17:06:14.362+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle DB'/><title type='text'>To Oracle XML DB repository (μέρος 2ο)</title><content type='html'>&lt;p&gt;Ας ξεκινήσουμε από μια λειτουργική περιγραφή του XML DB, έχοντας ως  σενάριο εργασίας δυο λογαριασμούς χρηστών (πχ xml1 και xml2) που  πρόκειται να προσθέτουν αρχεία στο repository, μέσω γνώριμων και φιλικών  διεπαφών, όπως το FTP ή το WebDAV (πχ από το Windows Explorer τους) σε  ένα συγκεκριμένο κατάλογο. Τα αρχεία αυτά, με το που ανεβαίνουν στο  repository, πρόκειται να υποστούν κάποια επεξεργασία (πχ. προώθηση στο  κύκλωμα παραγγελιών, αποθήκευση ή και επεξεργασία ψηφιακού περιεχομένου  κλπ) H διαχείριση και παραμετροποίηση του XML DB repository θα  πραγματοποιείται από έναν ειδικό λογαριασμό χρήστη (πχ xmlrepos1) που θα ορίσουμε σε αρχικό στάδιο.&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Ως system λοιπόν φτιάχνουμε τους χρήστες:&lt;/p&gt; &lt;p style="font-family: monospace;"&gt;create user xmlrepos1 identified by ###;&lt;br /&gt;grant connect, resource, xdbadmin to xmlrepos1;&lt;br /&gt;&lt;/p&gt; &lt;p style="font-family: monospace;"&gt;create user xml1 identified by ###;&lt;br /&gt;grant connect to xml1;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:monospace;"&gt;create user xml2 identified by ###;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;  grant connect to xml2;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;Ως χρήστης xmlrepos1, μπορούμε να δημιουργήσουμε τώρα τον φάκελο των εισερχομένων εγγράφων, έστω &lt;span style="font-family:monospace;"&gt;/uploadFolder&lt;/span&gt;, ορίζοντας επί της ουσίας την δενδροειδή δομή που μας ενδιαφέρει:&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:monospace;"&gt;declare &lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;  r BOOLEAN;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;begin&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;  r:=DBMS_XDB.createFolder('/uploadFolder');&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;  commit;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;end;&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt; &lt;br /&gt;Έπειτα, ο xmlrepos1 θα αποδώσει τα κατάλληλα δικαιώματα διαχείρισης  περιεχομένου στους δυο τελικούς μας χρήστες. Το XML DB κάνει χρήση ACLs  (access control lists) που περιγράφονται σε μορφή XML για τη διαχείριση  ασφάλειας. Ας φτιάξουμε λοιπόν ένα αρχείο περιγραφής της πολιτικής  ασφάλειας. Το υπερ-δικαίωμα dav:all σηματοδοτεί την απόλυτη  εξουσιοδότηση σε ένα πόρο (αρχείο ή φάκελο)&lt;br /&gt;&lt;/p&gt; &lt;p style="font-family: monospace;"&gt;declare&lt;br /&gt;  b BOOLEAN;&lt;br /&gt;begin&lt;br /&gt;  b := DBMS_XDB.createResource(&lt;br /&gt;         '/public/acls/acl_uploadFolder.xml',&lt;br /&gt;         '&amp;lt;acl description="myacl"&lt;br /&gt;               xmlns="http://xmlns.oracle.com/xdb/acl.xsd"&lt;br /&gt;               xmlns:dav="DAV:"&lt;br /&gt;               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;               xsi:schemaLocation="http://xmlns.oracle.com/xdb/acl.xsd&lt;br /&gt;                                   http://xmlns.oracle.com/xdb/acl.xsd"&amp;gt;&lt;br /&gt;            &amp;lt;ace&amp;gt;&lt;br /&gt;              &amp;lt;grant&amp;gt;true&amp;lt;/grant&amp;gt;&lt;br /&gt;              &amp;lt;principal&amp;gt;xml1&amp;lt;/principal&amp;gt;&lt;br /&gt;              &amp;lt;privilege&amp;gt;&lt;br /&gt;                &amp;lt;dav:all/&amp;gt;&lt;br /&gt;              &amp;lt;/privilege&amp;gt;&lt;br /&gt;            &amp;lt;/ace&amp;gt;&lt;br /&gt;            &amp;lt;ace&amp;gt;&lt;br /&gt;              &amp;lt;grant&amp;gt;true&amp;lt;/grant&amp;gt;&lt;br /&gt;              &amp;lt;principal&amp;gt;xml2&amp;lt;/principal&amp;gt;&lt;br /&gt;              &amp;lt;privilege&amp;gt;&lt;br /&gt;                &amp;lt;dav:all/&amp;gt;&lt;br /&gt;              &amp;lt;/privilege&amp;gt;&lt;br /&gt;            &amp;lt;/ace&amp;gt;&lt;br /&gt;          &amp;lt;/acl&amp;gt;',&lt;br /&gt;         'http://xmlns.oracle.com/xdb/acl.xsd',&lt;br /&gt;         'acl');&lt;br /&gt;         commit;&lt;br /&gt;end;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;Τέλος, ας αποδώσουμε τα ACLs που μόλις δημιουργήσαμε, στον φάκελό μας:&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:monospace;"&gt;begin&lt;/span&gt;&lt;br  style="font-family:monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;  dbms_xdb.setacl('/uploadFolder', '/public/acls/acl_uploadFolder.xml');&lt;/span&gt;&lt;br face="monospace"&gt;   &lt;span style="font-family:monospace;"&gt;  commit;&lt;/span&gt;&lt;br style="font-family: monospace;"&gt;   &lt;span style="font-family:monospace;"&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;Έχουμε τελειώσει με τον ορισμό της ασφάλειας! Αυτό που απομένει είναι να  ενεργοποιήσουμε τα κανάλια πρόσβασης (FTP και WebDAV) στους τελικούς  μας χρήστες και να ορίσουμε την πολιτική διαχείρισης του νέου  περιεχομένου. Όλα αυτά στο επόμενο άρθρο. Όπως πάντα, περισσότερες  πληροφορίες στο &lt;a href="http://docs.oracle.com/cd/E11882_01/appdev.112/e23094/xdb16fol.htm"&gt;documentation&lt;/a&gt; της Oracle.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-3121912627099135456?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/3121912627099135456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=3121912627099135456' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3121912627099135456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3121912627099135456'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2012/01/to-oracle-xml-db-repository-2.html' title='To Oracle XML DB repository (μέρος 2ο)'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-3751890242217600130</id><published>2012-01-05T16:20:00.004+02:00</published><updated>2012-01-09T17:06:14.363+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle DB'/><title type='text'>To Oracle XML DB repository (μέρος 1ο)</title><content type='html'>Εδώ και αρκετά χρόνια έχω δουλέψει αρκετά με την Oracle XML DB. Αρχικά  για την αποθήκευση XML εγγράφων. Έπειτα για τις ανάγκες παραγωγής και  μετασχηματισμού περιεχομένου XML. Επίσης με το XQuery. Συμμετείχα σε ένα  μεγάλο έργο μετάπτωσης (migration) της Oracle XML DΒ σε σχεσιακές  δομές. Σε όλες τις περιπτώσεις, είχα εντυπωσιαστεί από το βάθος της  υποστήριξης της XML, από τους "σοφιστικέ" τρόπους ενσωμάτωσης της και  ενίοτε από τις εντολές-σπαζοκεφαλιές που προστίθενται στην Oracle SQL.  Ένα χαρακτηριστικό με το οποίο μέχρι πρότινος δεν είχα προηγούμενη  εμπειρία είναι το Oracle XML DB repository. Πρόκειται για τη δυνατότητα  αποθήκευσης εγγράφων (είτε σε μορφή XML είτε όχι) στον Oracle Server σε  ιεραρχική δομή σε αντίθεση με την τυπική αποθήκευση σε ένα σχεσιακό  σχήμα. Και όλα αυτά μέσα από γνώριμα user interfaces, όπως FTP και  HTTP/WebDAV που παρουσιάζουν σε δενδροειδή δομή τα περιεχόμενα . Η  δυνατότητα αυτή αποκτά ενδιαφέρον όταν υπάρχει ανάγκη για μαζική,  ολοκληρωμένη αποθήκευση και επεξεργασία εγγράφων, με ενδεχόμενη χαλαρή  συσχέτιση με σχεσιακά δεδομένα, από απλά περιβάλλοντα χρήσης και  τελικούς χρήστες. Ταυτόχρονα, οι πονοκέφαλοι του τύπου της αποθήκευσης  (πχ CLOB, BLOB) ή της αναζήτησης περιεχομένου ή του τρόπου οργάνωσης  κρύβονται επιμελώς από την τεχνολογία ώστε πραγματικά να εστιάσουμε στο  ζητούμενο μας. Αν μάλιστα προσθέσουμε πως τυπικές λειτουργίες όπως  συντομεύσεις (shortcuts-links), κανόνες ασφάλειας (ACLs) και event-based  triggers προσφέρονται με ευκολία, τότε ελπίζω να σας έχω κεντρίσει το  ενδιαφέρον, όπως ακριβώς συνέβη και με εμένα.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-IqeCSIy0KJA/TwWyi0rTTjI/AAAAAAAABdc/YBetolPJCME/s1600/adxdb004.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 257px;" src="http://2.bp.blogspot.com/-IqeCSIy0KJA/TwWyi0rTTjI/AAAAAAAABdc/YBetolPJCME/s320/adxdb004.gif" alt="" id="BLOGGER_PHOTO_ID_5694153615205420594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Στα επόμενα άρθρα, θα προσπαθήσω να σκιαγραφήσω διάφορες πλευρές του XML  DB repository, ώστε να φωτιστούν διάφορες διαστάσεις του. Περισσότερες  πληροφορίες βρίσκονται στο &lt;a href="http://docs.oracle.com/cd/E11882_01/appdev.112/e23094/xdb16fol.htm"&gt;Oracle documentation&lt;/a&gt; καθώς επίσης υπάρχει και ένα βιβλίο της Oracle Press με τίτλο "&lt;a href="http://www.amazon.com/Oracle-Database-Building-Applications-Press/dp/0071751297"&gt;Oracle Database 11g: Building Oracle XML DB Applications&lt;/a&gt;"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-3751890242217600130?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/3751890242217600130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=3751890242217600130' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3751890242217600130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3751890242217600130'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2012/01/to-oracle-xml-db-repository-1.html' title='To Oracle XML DB repository (μέρος 1ο)'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-IqeCSIy0KJA/TwWyi0rTTjI/AAAAAAAABdc/YBetolPJCME/s72-c/adxdb004.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-157028248271463490</id><published>2012-01-02T17:11:00.003+02:00</published><updated>2012-01-02T17:14:49.056+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blog'/><title type='text'>Blog ανασκόπηση και στατιστικά (statistics) για το 2011</title><content type='html'>Καλή χρονιά σε όλους! Μόλις έφυγε μια χρονιά που ανάμεσα στα άλλα μου  έδωσε την ευκαιρία για περισσότερα άρθρα, με μεγαλύτερο κέφι, φθάνοντας  πια στα έξι χρόνια λειτουργίας του blog serafeimk.blogspot.com. Ας  εξετάσουμε το τι συνέβη πέρσι σε αυτό το site, τόσο ως προς τη  δημοσίευση του περιεχομένου όσο προς τα στατιστικά χρήσης.&lt;br /&gt;&lt;br /&gt;Ο συνολικός αριθμός των άρθρων ήταν 62, υψηλότερος από κάθε άλλη χρονιά,  ξεπερνώντας τον αρχικό στόχο για τέσσερα άρθρα τον μήνα. Σε αυτό  συνέβαλλαν αρκετοί παράγοντες, όπως:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;η δέσμευσή ενός μικρού κομματιού της ημέρας ώστε να ασχολούμαι με το blogging&lt;/li&gt;&lt;li&gt;το συχνό γράψιμο αναφορικά με θέματα της άμεσης εργασιακής εμπειρίας, την στιγμή που συμβαίνουν&lt;/li&gt;&lt;li&gt;το πιο ευέλικτο περιβάλλον εργασίας&lt;/li&gt;&lt;li&gt;η αποτροπή ώστε να γράφω το σαββατοκύριακο, περιμένοντας το&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://1.bp.blogspot.com/-sJlqBuyY4qk/TwHJSEJdaHI/AAAAAAAABcs/KrMuLoLzcJk/s1600/blog_posts.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 215px;" src="http://1.bp.blogspot.com/-sJlqBuyY4qk/TwHJSEJdaHI/AAAAAAAABcs/KrMuLoLzcJk/s320/blog_posts.png" alt="" id="BLOGGER_PHOTO_ID_5693052716161263730" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Ως προς το περιεχόμενο, το blogger.com μας προσφέρει τη δυνατότητα να κάνουμε διάφορα HTTP ερωτήματα στα άρθρα που έχουμε αναρτήσει, όπως για παράδειγμα με βάση την ημερομηνία δημοσίευσης. Έτσι, μπόρεσα να πάρω όλα τα άρθρα της χρονιάς χρησιμοποιώντας το wget:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;wget -O blog2011.xml "http://www.blogger.com/feeds/&lt;/span&gt;&lt;span style="font-weight: bold; font-family:monospace;" &gt;&lt;blog_id&gt;&lt;/blog_id&gt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;/posts/default?published-min=2011-01-01T00:00:00&amp;amp;published-max=2011-12-31T23:59:59&amp;amp;max-results=100"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Έπειτα, μορφοποίησα κατάλληλα το xml αρχείο ώστε να περιέχει αλλαγές γραμμών:&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;tidy -mi -utf8 -xml blog2011.xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;και τέλος πήρα τις κατηγορίες (labels) των άρθρων που δημοσιεύτηκαν:&lt;br /&gt;&lt;br  style="font-family:monospace;"&gt; &lt;span style="font-family:monospace;"&gt;cat blog2011.xml | grep "term='" | grep -v "category"  |cut -d\' -f2|sort|uniq -c|sort -nr&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/-GbfR_NHb2sQ/TwHJcG-IXQI/AAAAAAAABc4/v7GMymhyZYM/s1600/blog_cat.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 226px;" src="http://4.bp.blogspot.com/-GbfR_NHb2sQ/TwHJcG-IXQI/AAAAAAAABc4/v7GMymhyZYM/s320/blog_cat.jpg" alt="" id="BLOGGER_PHOTO_ID_5693052888717745410" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Προέκυψαν 26 κατηγορίες θεμάτων, πολύ περισσότερες από άλλες χρονιές.  Παραδοσιακά, θέματα σχετικά με το Linux, το ADF, την Oracle και το  JDeveloper βρίσκονται στην κορυφή της λίστας, ενώ από κοντά ακολουθούν  δυο προϊόντα που έχω επενδύσει αρκετό χρόνο το 2011 όπως το Oracle SOA  Suite και ο Oracle Weblogic.&lt;br /&gt;&lt;br /&gt;Στο τομέα των στατιστικών χρήσης, τα στοιχεία ελήφθησαν από το Google analytics (&lt;a href="http://www.google.com/analytics"&gt;http://www.google.com/analytics&lt;/a&gt;) και δείχνουν μια κάμψη 9% σε σχέση με το προηγούμενο έτος σε σχέση με τις επισκέψεις, παρόλο που προσφέρθηκε περισσότερο νέο περιεχόμενο. Αυτή την κάμψη θα μπορούσα να την αποδώσω σε:&lt;br /&gt;- πτώση των projects σχετικών με την Oracle λόγω της κρίσης&lt;br /&gt;- στην επιμονή μου για την χρήση της ελληνικής γλώσσας στο blog&lt;br /&gt;- σε αδυναμία καλύτερης προώθησης του blog διαμέσου κοινωνικών δικτύων ή γνωριμιών&lt;/p&gt;&lt;p&gt;&lt;a href="http://1.bp.blogspot.com/-G77kUEI-dVg/TwHJm5WeC9I/AAAAAAAABdE/eKIylTyd3vM/s1600/Screenshot-Dashboard%2B-%2BGoogle%2BAnalytics%2B-%2BMozilla%2BFirefox.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 100px;" src="http://1.bp.blogspot.com/-G77kUEI-dVg/TwHJm5WeC9I/AAAAAAAABdE/eKIylTyd3vM/s320/Screenshot-Dashboard%2B-%2BGoogle%2BAnalytics%2B-%2BMozilla%2BFirefox.png" alt="" id="BLOGGER_PHOTO_ID_5693053074040294354" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Τα πιο δημοφιλή άρθρα του 2011 ήταν τα ακόλουθα:&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/-NOCc7Sjcrm8/TwHJuXoz6TI/AAAAAAAABdQ/cb0jBuZc4_w/s1600/Screenshot-Content%2Bby%2BTitle%2B-%2BGoogle%2BAnalytics%2B-%2BMozilla%2BFirefox.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 292px;" src="http://4.bp.blogspot.com/-NOCc7Sjcrm8/TwHJuXoz6TI/AAAAAAAABdQ/cb0jBuZc4_w/s320/Screenshot-Content%2Bby%2BTitle%2B-%2BGoogle%2BAnalytics%2B-%2BMozilla%2BFirefox.png" alt="" id="BLOGGER_PHOTO_ID_5693053202429372722" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Στις πρώτη θέση, και με μεγάλη διαφορά, φιγουράρει ένα άρθρο του 2010  σχετικά με την ρύθμιση του ZTE MF 110 usb modem στο Ubuntu, ένα θέμα που  φαίνεται ενδιαφέρει κάμποσους και το οποίο έχει γίνει παραπομπή σε  διάφορα άλλα blogs/sites. Τα πιο δημοφιλή άρθρα του 2011 έχουν να  κάνουμε το discosureListener του ADF και με την ανατομία ενός Lenovo  Thinkpad.&lt;br /&gt;&lt;br /&gt;Ας είμαστε καλά να συνεχίσουμε και το 2012 !&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-157028248271463490?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/157028248271463490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=157028248271463490' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/157028248271463490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/157028248271463490'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2012/01/blog-statistics-2011.html' title='Blog ανασκόπηση και στατιστικά (statistics) για το 2011'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-sJlqBuyY4qk/TwHJSEJdaHI/AAAAAAAABcs/KrMuLoLzcJk/s72-c/blog_posts.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-2065121096269242515</id><published>2011-12-27T12:31:00.000+02:00</published><updated>2011-12-27T12:32:02.920+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='jdeveloper'/><category scheme='http://www.blogger.com/atom/ns#' term='weblogic'/><title type='text'>Μερικά tweaks για το JDeveloper και το Weblogic στο Linux</title><content type='html'>Δυο μικρές συμβουλές που όμως κάνουν σημαντική διαφορά στην ταχύτητα  εκτέλεσης του embedded Weblogic στον JDeveloper αλλά και αυτόνομα στο  περιβάλλον Linux. Οι δοκιμές μου περιλαμβάνουν το Oracle JDK 1.6.0.26  64-bit στο λειτουργικό σύστημα Ubuntu 10.10 (Maverick Meerkat) για  αρχιτεκτονική amd64. Η έκδοση του JDeveloper είναι η 11g R1 (11.1.1.4.0)  που έχει εγκατασταθεί με τον generic installer, ώστε να επιλέξουμε κατά  τη διάρκεια της εγκατάστασης το προαναφερόμενο 64-bit JDK τόσο για την  εκτέλεση του JDeveloper όσο και για τον embedded Weblogic Server.&lt;br /&gt;&lt;br /&gt;Ένα από τα θέματα που προκύπτουν όταν χρησιμοποιούμε εξωτερικό JDK στον JDeveloper έχει να κάνει με το native I/O (&lt;a href="http://docs.oracle.com/cd/E12839_01/web.1111/e13814/wls_tuning.htm#i1151673"&gt;http://docs.oracle.com/cd/E12839_01/web.1111/e13814/wls_tuning.htm#i1151673&lt;/a&gt;)  που επιτρέπει την εγγενή (native) διασύνδεση με τα sockets του  λειτουργικού συστήματος. Διαφορετικά παρόλου που το native Ι/Ο είναι  ενεργοποιημένο, θα γίνει χρήση των java βιβλιοθηκών, γεγονός που  επιβραδύνει την απόδοση του server. Ξεκινώντας τον Weblogic, βλέπει  κανείς διάφορα διαγνωστικά μηνύματα όπως:&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;Native I/O disabled&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;There are: 5 active sockets, but  the maximum number of socket reader threads allowed by the configuration  is: 4. You may want to alter your configuration.&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;όλα αυτά προκύπτουν γιατί οι native βιβλιοθήκες δεν είναι διαθέσιμες στο  εξωτερικό JDK. Δεν έχουμε λοιπόν παρά να αντιγράψουμε το αρχείο &lt;span style="font-family: monospace;"&gt;libmuxer.so&lt;/span&gt; από τον κατάλογο&lt;span style="font-family: monospace;"&gt; $MIDDLEWARE_HOME/wlserver_10.3/server/native/linux/x86_64&lt;/span&gt; στο native library path του JDK μας, για παράδειγμα στο &lt;span style="font-family: monospace;"&gt;$JAVA_HOME/jre/lib/amd64&lt;/span&gt;. Τα μηνύματα θα εξαφανιστούν και θα έχουμε εμφανώς βελτιωμένο I/O.&lt;br /&gt;&lt;br /&gt;Μια δεύτερη συμβουλή έχει να κάνει με την απόκριση του Weblogic  Administration console και αφορά τον random generator σε Linux  συστήματα. Πληροφορίες για αυτή την αλλαγή βρίσκονται &lt;a href="http://www.itonguard.com/20090313/weblogic-starts-slow/"&gt;εδώ&lt;/a&gt;.  Ομολογώ πως έπειτα από αυτή τη ρύθμιση το login στο Weblogic console  γίνεται σε κλάσματα δευτερολέπτου ! Περισσότερα συμβουλές για τον  Weblogic και τον JDeveloper θα βρείτε σε παλαιότερο &lt;a href="http://serafeimk.blogspot.com/2011/06/embedded-weblogic-server-jdeveloper.html"&gt;post&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-2065121096269242515?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/2065121096269242515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=2065121096269242515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/2065121096269242515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/2065121096269242515'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/12/tweaks-jdeveloper-weblogic-linux.html' title='Μερικά tweaks για το JDeveloper και το Weblogic στο Linux'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-1647644307371063659</id><published>2011-12-23T13:26:00.001+02:00</published><updated>2011-12-23T13:39:08.274+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='events'/><title type='text'>Oracle Developer Day - Αθήνα Δεκέμβριος 2011 εντυπώσεις</title><content type='html'>Είχα κατά νου να γράψω αυτό το άρθρο εδώ και ημέρες, αλλά μόλις σήμερα  βρήκα λίγο χρόνο. Αφορά το Oracle Developer Day που διεξήχθη το διήμερο  6-7 Δεκεμβρίου στο ξενοδοχείο Royal Olympic. Στο παρελθόν έχω καταγράψει  (το &lt;a href="http://serafeimk.blogspot.com/2007/06/oracle-develop-2007-in-prague.html"&gt;2007&lt;/a&gt; και το &lt;a href="http://serafeimk.blogspot.com/2009/02/oracle-develop-2009.html"&gt;2009&lt;/a&gt;)  τις εντυπώσεις μου από τα Oracle Develop Days ανά την Ευρώπη. Από ότι  φαίνεται τα τελευταία χρόνια, αυτό το roadshow έχει ατονίσει οργανωτικά  σε ευρωπαϊκό ή παγκόσμιο επίπεδο, με αποτέλεσμα να αποκτήσουν  περισσότερη δύναμη οι τοπικές προσπάθειες των κατά τόπους παραρτημάτων  της Oracle αλλά φυσικά και τα virtual developer days. Σε διαφορά με τα events που είχα παρακολουθήσει στο  εξωτερικό, δεν υπήρχε χρέωση για τη συμμετοχή στο διήμερο (gratis) ενώ  και τα τεχνικά sessions ήταν πιο περιορισμένα στη θεματολογία. Από την  άλλη μεριά, τόσο η πρακτική προσέγγιση των πραγμάτων, το κέφι των  διοργανωτών καθώς και το επίπεδο των εισηγητών παρέμειναν σε υψηλό  επίπεδο. Για τα δε τεχνικά sessions ήταν απαραίτητο να έχει μαζί του ο  κάθε ένας ενδιαφερόμενος ένα laptop  ώστε να εκτελέσει το υλικό των  ενδεικτικών ασκήσεων.&lt;br /&gt;&lt;br /&gt;Λόγω ασφυκτικού προγράμματος, κατάφερα να παρευρεθώ στην πρώτη ημέρα που  είχε να κάνει με παρουσιάσεις και hands-on sessions για το ADF και το  JEE 6. Η δεύτερη ημέρα ήταν αφιερωμένη στο Oracle BPM και την παρουσίαση  του ADF από την σκοπιά των .NET developers (το πλήρες πρόγραμμα  βρίσκεται &lt;a href="http://www.oracle.com/webapps/events/ns/EventsDetail.jsp?p_eventId=135305&amp;amp;src=7307403&amp;amp;src=7307403&amp;amp;Act=53"&gt;εδώ&lt;/a&gt;)  Ο χώρος διοργάνωσης (Hotel Royal Olympic) ήταν εύκολα προσβάσιμος από  το μετρό, πολύ φιλόξενος, πλούσιος και ενδεικνυόμενος για τέτοιου είδους  εκδηλώσεις.&lt;br /&gt;&lt;br /&gt;Το keynote δόθηκε από τον Dana Singleterry, Principal Product Manager  για τα JDeveloper/ADF και επικεντρώθηκε στην στρατηγική, στην  υποστήριξη, στα χαρακτηριστικά και στο μέλλον των τριών πια εργαλείων  ανάπτυξης της Oracle για Java (JDeveloper, Eclipse, Netbeans) και των  δυο Application Servers (Weblogic και GlassFish) Ενώ ο συνδιασμός  JDeveloper/Eclipse + Weblogic προορίζεται για enterprise πελάτες, το  δίδυμο NetBeans + GlassFish απευθύνεται στο community και σε όσους  θέλουν να έχουν πρόσβαση στα καινούργια χαρακτηριστικά του JDK και του  JEE (επωμιζόμενοι το βάρος του early adopter, θα πρόσθετα, προτού  καταλήξουν σε enterprise χαρακτηριστικά) Αν και έχω πολύ καιρό να  προγραμματίσω σε Eclipse, φαίνεται πως γίνεται σοβαρή επένδυση στο  Oracle Enterprise Pack for Eclipse (&lt;a href="http://www.oracle.com/technetwork/developer-tools/eclipse/overview/index.html"&gt;OEPE&lt;/a&gt;)  που ενσωματώνει ωραία καλούδια διαχείρισης του Weblogic, του JPA, του  Maven και σταδιακά των ADF (ξεκινώντας από τον Controller και τα Faces) Η  ενότητα αυτή έκλεισε με ένα μικρό αλλά ουσιαστικό demo για την εμπειρία  χρήσης και παραγωγικότητας με το στρατηγικό πλαίσιο ανάπτυξης της  Oracle, το ADF.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-EK0NJGoWJ50/TvRllTKi2QI/AAAAAAAABcg/VxlpWV8bxe4/s1600/DSC00179.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-EK0NJGoWJ50/TvRllTKi2QI/AAAAAAAABcg/VxlpWV8bxe4/s320/DSC00179.JPG" alt="" id="BLOGGER_PHOTO_ID_5689283920749844738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Έπειτα από ένα μικρό διάλλειμμα, ακολούθησαν δυο παράλληλα τεχνικά  sessions, ένα για το ADF και ένα δεύτερο για το JEE 6, το οποίο και  παρακολούθησα. Ξεκίνησε λοιπόν μια εκτενής (και ολίγον κουραστική...)  παρουσίαση των καινοτομιών και χαρακτηριστικών του JEE 6 ενώ μας  μοιράστηκε ένα VirtualBox image ενός Oracle Enterprise Linux που  περιελέμβανε μια Oracle XE, τον Weblogic 11g (αφού δεν είχε κυκλοφορήσει  ακόμα το 12c), το NetBeans 7.0 και το Eclipse OEPE 11.1.1.7.3. Μου  άρεσε πολύ που χρησιμοποιώντας έναν αναλυτικό οδηγό ασκήσεων είχα ένα  εκτενές hands-on σε αυτό το virtual machine image, της διάρκειας των  τεσσάρων ωρών, με αντικείμενα όπως:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Maven + Weblogic&lt;/li&gt;&lt;li&gt;Maven + OEPE + Weblogic&lt;/li&gt;&lt;li&gt;Maven + Hudson&lt;/li&gt;&lt;li&gt;NetBeans + JPA (και deploy στον embedded GlassFish)&lt;br /&gt; &lt;/li&gt;&lt;li&gt;NetBeans + Servlets + Facelets&lt;/li&gt;&lt;li&gt;NetBeans + REST (JAX-RS)&lt;br /&gt; &lt;/li&gt;&lt;/ul&gt; Κατά τη γνώμη μου, η αξία αυτών των εκδηλώσεων είναι ανεκτίμητη όταν  συνδυάζεται με πρακτικό προσανατολισμό, δίνοντας γρήγορη, συγκεντρωμένη,  άμεση πρόσβαση και εμπειρία σε πλήθος τεχνολογίες στη διάρκεια της μιας  ημέρας. Με μεγάλη ανυπομονησία, περιμένω ανάλογες εκδηλώσεις και στο  2012.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-1647644307371063659?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/1647644307371063659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=1647644307371063659' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/1647644307371063659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/1647644307371063659'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/12/oracle-developer-day-2011.html' title='Oracle Developer Day - Αθήνα Δεκέμβριος 2011 εντυπώσεις'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-EK0NJGoWJ50/TvRllTKi2QI/AAAAAAAABcg/VxlpWV8bxe4/s72-c/DSC00179.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-2819800326411893845</id><published>2011-12-16T17:20:00.001+02:00</published><updated>2011-12-16T17:20:53.952+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>File triggers στο Linux</title><content type='html'>Σήμερα βρέθηκα αντιμέτωπος με την εξής απαίτηση: αρχεία που γίνονται  upload μέσω FTP service σε ένα NFS drive, απαγορεύεται να γίνουν delete ή  overwrite. Ενώ μπορούμε να απαγορεύσουμε τη δυνατότητα διαγραφής από  ένα FTP service, το ίδιο δεν ισχύει με την επανεγγραφή (overwrite) ενός  αρχείου. Στην πραγματικότητα, στο Linux έχουμε διάφορες δυνατότητες για  να περιορίσουμε την εγγραφή σε ένα αρχείο (πχ δικαιώματα, extended  attributes με την εντολή chattr, κλπ) Το να αλλάξουμε αυτά τα δικαιώματα  έπειτα από την προσθήκη του αρχείου σε έναν κατάλογο αποτελεί πρόκληση  και θυμίζει τη συμπεριφορά ενός trigger. Για καλή μας τύχη, υπάρχει μια  σειρά από εργαλεία, που ονομάζεται &lt;span style="font-weight: bold;"&gt;inotify-tools&lt;/span&gt; (&lt;a href="https://github.com/rvoicilas/inotify-tools/wiki/"&gt;https://github.com/rvoicilas/inotify-tools/wiki/&lt;/a&gt;),  που μας επιτρέπουν να διαχειριστούμε προγραμματιστικά τα συμβάντα που  συμβαίνουν σε έναν κατάλογο, όπως αυτό της προσθήκης, μετακίνησης ή  διαγραφής αρχείων.&lt;br /&gt;&lt;br /&gt;Μόλις εγκαταστήσουμε αυτά τα εργαλεία, μπορούμε να φτιάξουμε το δικό μας  script που αλλάζει δικαιώματα σε ένα αρχείο, αμέσως μετά τη δημιουργία  του. Θα χρησιμοποιήσουμε λοιπόν το πρόγραμμα inotifywait γι' αυτό το  λόγο.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;#!/bin/bash&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;STAGING_DIR=/staging&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;inotifywait -e create \&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;    -mrq /binaries | while read line; do&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;     chmod -R u-w $STAGING_DIR/`echo "$file" | cut -f3-`&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;done&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Επιπλέον πληροφορίες στο &lt;a href="http://www.server-world.info/en/note?os=CentOS_5&amp;amp;p=inotify"&gt;http://www.server-world.info/en/note?os=CentOS_5&amp;amp;p=inotify&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-2819800326411893845?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/2819800326411893845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=2819800326411893845' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/2819800326411893845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/2819800326411893845'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/12/file-triggers-linux.html' title='File triggers στο Linux'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-3918646587888294902</id><published>2011-12-08T09:39:00.002+02:00</published><updated>2011-12-08T09:42:00.900+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle Application Server'/><title type='text'>Ρύθμιση της Web Cache στο port 80 για Linux</title><content type='html'>Οι οδηγίες που ακολουθούν περιγράφουν τη ρύθμιση 11g Web Cache, τμήμα  του Oracle Fusion Middleware Web Tier, ώστε να απαντά σε κλήσεις στο  port 80. Εξ ορισμού αυτό το port χρειάζεται root access, οπότε μετά την  εγκατάσταση θα χρειαστεί να κάνουμε μια μικρή ρύθμιση.&lt;br /&gt;&lt;br /&gt;Αρχικά, ορίζουμε ως listening port το 80 και έπειτα επικυρώνουμε τις αλλαγές (apply changes) και σταματάμε την WebCache.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-mRtDD34DUik/TuBpymhYKEI/AAAAAAAABcQ/q3QjUZ09tmc/s1600/Screenshot-Edit-Add%2BListen%2BPort%2B-%2BMozilla%2BFirefox.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 255px; height: 320px;" src="http://1.bp.blogspot.com/-mRtDD34DUik/TuBpymhYKEI/AAAAAAAABcQ/q3QjUZ09tmc/s320/Screenshot-Edit-Add%2BListen%2BPort%2B-%2BMozilla%2BFirefox.png" alt="" id="BLOGGER_PHOTO_ID_5683659047796484162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Τώρα από command-line ανατρέχουμε στο directory &lt;span style="font-family:monospace;"&gt;&amp;lt;WEB_TIER_HOME&amp;gt;/webcache/bin&lt;/span&gt; και ως root τρέχουμε το script:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;./webcache_setuser.sh setroot &amp;lt;webtier_installation_user&amp;gt;&lt;span style="font-family:Georgia,serif;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Με αυτόν τον τρόπο, αλλάζει ο owner του executable &lt;span style="font-family:monospace;"&gt;webcached&lt;/span&gt;  και τίθεται το SUID ώστε ο installation user να μπορεί να εκτελέσει την  webcache με δικαιώματα υπερχρήστη και να καταλάβει τελικά το port 80.  Ξεκινάμε τη webcache ώστε να δούμε τις αλλαγές.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-3918646587888294902?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/3918646587888294902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=3918646587888294902' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3918646587888294902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3918646587888294902'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/12/web-cache-port-80-linux.html' title='Ρύθμιση της Web Cache στο port 80 για Linux'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-mRtDD34DUik/TuBpymhYKEI/AAAAAAAABcQ/q3QjUZ09tmc/s72-c/Screenshot-Edit-Add%2BListen%2BPort%2B-%2BMozilla%2BFirefox.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-279373624593552510</id><published>2011-12-05T09:27:00.001+02:00</published><updated>2012-01-05T15:50:25.968+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle DB'/><title type='text'>Αλλαγή tablespace σε αντικείμενα LOBs και Oracle Intermedia</title><content type='html'>Προκειμένου να μεταφέρουμε LOBs (CLOB, BLOB) σε ένα νέο tablespace, δεν έχουμε παρά να ακολουθήσουμε την σύνταξη της εντολής:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;alter table &amp;lt;TABLE_NAME&amp;gt; move LOB(&amp;lt;Column blob,clob name&amp;gt;) store as ( TABLESPACE &amp;lt;New tablespace name&amp;gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;για παράδειγμα σε έναν πίνακα ονόματι &lt;span style="font-family: monospace;"&gt;test_lobtable&lt;/span&gt; με μια κολόνα &lt;span style="font-family: monospace;"&gt;xml_file&lt;/span&gt; τύπου CLOB:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;ALTER TABLE test_lobtable&lt;/span&gt;&lt;span style="font-family: monospace;"&gt; MOVE &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;LOB (xml_file) STORE AS (&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;TABLESPACE lob_data2&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;);&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Μια ειδική περίπτωση είναι οι τύποι (datatypes) της βιβλιοθήκης  Intermedia που έχουν να κάνουν με χειρισμό εγγράφων, φωτογραφιών, video  κλπ. Σε περίπτωση που αποφασίζουμε να αποθηκεύσουμε τα αρχεία μας μέσα  στη βάση δεδομένων, τότε οι εντολές που θα χρειαστούμε είναι ενδεικτικά  για μια κολόνα &lt;span style="font-family: monospace;"&gt;MYDOC&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;alter table &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;test_lobtable&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt; move lob ("MYDOC"."SOURCE"."LOCALDATA") store as (tablespace &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;lob_data2&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;alter table &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;test_lobtable&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt; move lob ("MYDOC"."COMMENTS") store as (tablespace &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;lob_data2&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;);       &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Περισσότερες πληροφορίες για τα LOBs και τα data dictionary views που αποκαλύπτουν την διαχείριση τους, θα βρείτε στο: &lt;a href="http://www.idevelopment.info/data/Oracle/DBA_tips/LOBs/LOBS_2.shtml"&gt;http://www.idevelopment.info/data/Oracle/DBA_tips/LOBs/LOBS_2.shtml&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-279373624593552510?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/279373624593552510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=279373624593552510' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/279373624593552510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/279373624593552510'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/12/tablespace-lobs-oracle-intermedia.html' title='Αλλαγή tablespace σε αντικείμενα LOBs και Oracle Intermedia'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-7168046163369608453</id><published>2011-11-25T15:53:00.002+02:00</published><updated>2011-11-25T15:55:39.748+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle SOA Suite'/><category scheme='http://www.blogger.com/atom/ns#' term='weblogic'/><title type='text'>Αναζητώντας βοήθεια στο Weblogic scripting (WLST)</title><content type='html'>Το WLST είναι ένα περιβάλλον που μπορούμε να το λειτουργήσουμε και σε  interactive mode (αντί του scripting) ώστε να εκτελέσουμε άμεσα κάποιες  εντολές. Όπως σε οποιοδήποτε περίπτωση, πολύ συχνά θα χρειαστούμε  βοήθεια για τη σύνταξη μιας εντολής. Δεν έχουμε λοιπόν παρά να  πληκτρολογήσουμε:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;help()&lt;br /&gt;&lt;/span&gt;&lt;a href="http://3.bp.blogspot.com/-_1E5BNIUnFU/Ts-eDiVrE3I/AAAAAAAABbs/XetJIAKNYEc/s1600/Screenshot-oracle%2540oraclesoa%253A%257E-Oracle-Middleware-Oracle_SOA1-common-bin.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 276px;" src="http://3.bp.blogspot.com/-_1E5BNIUnFU/Ts-eDiVrE3I/AAAAAAAABbs/XetJIAKNYEc/s320/Screenshot-oracle%2540oraclesoa%253A%257E-Oracle-Middleware-Oracle_SOA1-common-bin.png" alt="" id="BLOGGER_PHOTO_ID_5678931438731989874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;και θα μας εμφανιστούν όλες οι κατηγορίες των θεμάτων για βοήθεια. Για  παράδειγμα, τρέχοντας το wlst από ένα SOA instance την ακόλουθη εντολή  για την κατηγορία soa, θα πάρουμε πληροφορίες για όλες τις εντολές αυτής  της κατηγορίας.&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;help('soa')&lt;br /&gt;&lt;/span&gt;&lt;a href="http://1.bp.blogspot.com/-7oQCE6OG-3k/Ts-eKb-St6I/AAAAAAAABb4/1Up6akyFUu0/s1600/Screenshot-oracle%2540oraclesoa%253A%257E-Oracle-Middleware-Oracle_SOA1-common-bin-1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 202px;" src="http://1.bp.blogspot.com/-7oQCE6OG-3k/Ts-eKb-St6I/AAAAAAAABb4/1Up6akyFUu0/s320/Screenshot-oracle%2540oraclesoa%253A%257E-Oracle-Middleware-Oracle_SOA1-common-bin-1.png" alt="" id="BLOGGER_PHOTO_ID_5678931557282396066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;έχει επίσης ενδιαφέρον να ξέρουμε πως το help δέχεται wildcards. Να για  παράδειγμα αναλυτικές πληροφορίες για τις συναρτήσεις SCA από την εντολή  &lt;span style="font-family:monospace;"&gt;help('sca*')&lt;br /&gt;&lt;/span&gt;&lt;a href="http://3.bp.blogspot.com/-y0hDPRCqROU/Ts-eSccUaiI/AAAAAAAABcE/5j8nIbcSVmI/s1600/Screenshot-oracle%2540oraclesoa%253A%257E-Oracle-Middleware-Oracle_SOA1-common-bin-2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 234px;" src="http://3.bp.blogspot.com/-y0hDPRCqROU/Ts-eSccUaiI/AAAAAAAABcE/5j8nIbcSVmI/s320/Screenshot-oracle%2540oraclesoa%253A%257E-Oracle-Middleware-Oracle_SOA1-common-bin-2.png" alt="" id="BLOGGER_PHOTO_ID_5678931694847289890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-7168046163369608453?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/7168046163369608453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=7168046163369608453' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7168046163369608453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7168046163369608453'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/11/weblogic-scripting-wlst.html' title='Αναζητώντας βοήθεια στο Weblogic scripting (WLST)'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-_1E5BNIUnFU/Ts-eDiVrE3I/AAAAAAAABbs/XetJIAKNYEc/s72-c/Screenshot-oracle%2540oraclesoa%253A%257E-Oracle-Middleware-Oracle_SOA1-common-bin.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-251311281995864376</id><published>2011-11-23T14:37:00.001+02:00</published><updated>2012-01-05T15:50:25.969+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle DB'/><title type='text'>Πώς να βρούμε ονόματα αντικειμένων στην Oracle που δεν είναι γραμμένα στα αγγλικά</title><content type='html'>Είτε χρησιμοποιώντας ένα εργαλείο μοντελοποίησης της Oracle βάσης  δεδομένων, είτε απευθείας γράφοντας DDL scripts, είτε χρησιμοποιώντας  ένα PL/SQL IDE, είναι δυνατόν να μας ξεφύγει στην πληκτρολόγηση ένας  ελληνικός χαρακτήρας (ή όχι τουλάχιστον αγγλικός) από την εναλλαγή  γλώσσας (language switch) στην ονομασία κάποιου αντικειμένου της βάσης.  Σε μια τέτοια θέση βρέθηκα με την ονοματοδοσία ενός foreign key σε μια  UTF8 βάση: το ADF έκανε reverse engineer το κλειδί και έφτιαξε ένα  association που περιείχε το ελληνικούς χαρακτήρες. Με τη σειρά του o  JHeadstart, με βάση τα associations, κατασκευάζει φιλικά μηνύματα του  στυλ:&lt;br /&gt; &lt;span style="font-family:monospace;"&gt;Cannot delete ΧΧΧ while dependent ΥΥΥ exists&lt;/span&gt;&lt;br /&gt;που όμως κατά διάρκεια του generation γίνονται ακαταλαβίστικα  (σε αυτό  φταίει μάλλον ένα bug) και μάλιστα προοδευτικά, έπειτα από πολλαπλά  generations, δημιουργούν property files αρκετών MBytes !&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-UvAUGhuEb90/TszpPArN5HI/AAAAAAAABbg/m18cxz0z4aM/s1600/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BERSSalesApp.jws%2B%253A%2BViewController.jpr%2B%253A%2B-home-spk-Projects-workdir-ers-trunk-ERSSalesApp-ViewController-src-gr-realconsulting-ers-sales-view-ApplicationResources_el.properties.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 26px;" src="http://4.bp.blogspot.com/-UvAUGhuEb90/TszpPArN5HI/AAAAAAAABbg/m18cxz0z4aM/s320/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BERSSalesApp.jws%2B%253A%2BViewController.jpr%2B%253A%2B-home-spk-Projects-workdir-ers-trunk-ERSSalesApp-ViewController-src-gr-realconsulting-ers-sales-view-ApplicationResources_el.properties.png" alt="" id="BLOGGER_PHOTO_ID_5678169674295927922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Για να βρω αυτές τις περιπτώσεις, χρησιμοποίησα τη συνάρτηση &lt;span style="font-weight: bold;"&gt;asciistr&lt;/span&gt;(&lt;a href="http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions006.htm"&gt;http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions006.htm&lt;/a&gt;) που μετατρέπει σε ASCII μορφή το όρισμα της, ώστε να μπορούμε να βρούμε χαρακτήρες που δεν εμπίπτουν μέσα στο ASCII αλφάβητο.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;select constraint_name, asciistr(constraint_name) from user_constraints where asciistr(constraint_name) like '%\%';&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;το αποτέλεσμα μου έδειξε το ένοχο constraint, με τον ελληνικό χαρακτήρα 'N':&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;FK_TRNSPES_TRΝSPE_SP_SPECIES FK_TRNSPES_TR&lt;/span&gt;&lt;span style="font-weight: bold; font-family: monospace;"&gt;\039D&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;SPE_SP_SPECIES&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-251311281995864376?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/251311281995864376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=251311281995864376' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/251311281995864376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/251311281995864376'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/11/oracle.html' title='Πώς να βρούμε ονόματα αντικειμένων στην Oracle που δεν είναι γραμμένα στα αγγλικά'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-UvAUGhuEb90/TszpPArN5HI/AAAAAAAABbg/m18cxz0z4aM/s72-c/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BERSSalesApp.jws%2B%253A%2BViewController.jpr%2B%253A%2B-home-spk-Projects-workdir-ers-trunk-ERSSalesApp-ViewController-src-gr-realconsulting-ers-sales-view-ApplicationResources_el.properties.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-2233699302588774397</id><published>2011-11-15T17:02:00.002+02:00</published><updated>2011-11-15T17:05:51.401+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='weblogic'/><title type='text'>Αυτόματη εκκίνηση Node Manager, Administrator Server και Managed Server στο Linux</title><content type='html'>Ας καταγράψουμε ένα παράδειγμα αυτόματου (automatic) startup script για  μια τοπολογία Weblogic με Node Manager, έναν Managed Server και έναν  Administrator Server. To περιβάλλον είναι βασισμένο σε Oracle Enterprise  Linux 5 (5.6) ενώ το Weblogic domain είναι ρυθμισμένο σε production  mode. Προτού ξεκινήσουμε φροντίζουμε να αποθηκεύσουμε για τον  Administrator Server μας τα security credentials στο περιβόητο &lt;span style="font-family: monospace;"&gt;AdminServer/security/boot.properties&lt;/span&gt; αρχείο με την δομή:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;username=&amp;lt;username&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;password=&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;password&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Έπειτα δημιουργούμε το αρχείο &lt;span style="font-family: monospace;"&gt;/etc/init.d/weblogic&lt;/span&gt; που θα αναλάβει την αυτόματη εκκίνηση των στοιχείων του domain μας. Ενδεικτικά τα περιεχόμενα του έχουν ως εξής:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;#! /bin/bash&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;#&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;# Automatic start of Weblogic services&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;#&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;# chkconfig: 345 20 80&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;# description: Starts and stops the Oracle Weblogic&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;#&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;# /etc/rc.d/init.d/oracle&lt;br /&gt;MIDDLEWARE_HOME=&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/opt/app/Oracle/Middleware&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;DOMAIN_HOME=$MIDDLEWARE_HOME/user_projects/domains/my_domain&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: monospace;"&gt;start() {&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;echo -n $"Starting Oracle Weblogic: "&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;# Start Admin Server&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;/bin/su - weblogic -c "nohup $DOMAIN_HOME/startWebLogic.sh &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt; &lt;/span&gt;/dev/null &amp;amp;" &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;# Start Node Manager&lt;br /&gt;/bin/su - weblogic -c "nohup $MIDDLEWARE_HOME/wlserver_10.3/server/bin/startNodeManager.sh &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt; /dev/null &amp;amp;" &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;# Start Managed Server&lt;br /&gt;/bin/su - weblogic -c "nohup $DOMAIN_HOME/bin/startManagedWebLogic.sh managed_server &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt; &lt;span style="font-family: monospace;"&gt;/dev/null &amp;amp;"&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: monospace;"&gt;stop() {&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;echo -n $"Stopping Oracle Weblogic: "&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;# Stop node manager&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;ps -ef|grep -i NodeManager|grep java |grep -v grep|awk '{print $2}'|xargs kill -9 &amp;amp;&amp;amp; sleep 5&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;# Stop managed server&lt;br /&gt;/bin/su - weblogic -c "nohup $DOMAIN_HOME/bin/stopManagedWebLogic.sh managed_server &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt; &lt;/span&gt;/dev/null &amp;amp;"&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;sleep 15&lt;br /&gt;# Stop admin server&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/bin/su - weblogic -c "nohup $DOMAIN_HOME/bin/stopManagedWebLogic.sh AdminServer &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt; &lt;/span&gt;/dev/null &amp;amp;"&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: monospace;"&gt;status() {&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;    STATUS=`ps -ef|grep -i weblogic|grep java |wc -l`&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;    echo "Number of weblogic processes running:$STATUS"&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: monospace;"&gt;case $1 in&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;    start)&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        start&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        ;;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;    stop)&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        stop&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        ;;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;    status)&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        status&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        ;;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;    *)&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        echo "Usage $0 {start|stop|status}" &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;amp;2&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        exit 1&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        ;;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;esac&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: monospace;"&gt;exit 0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ορίζουμε το script μας ως job της εκκίνησης:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;chmod +x /etc/init.d/weblogic&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;/sbin/chkconfig --add weblogic&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Περισσότερες πληροφορίες ή προσεγγίσεις για την αυτόματη εκκίνηση υπηρεσιών του weblogic θα βρείτε &lt;a href="http://onlineappsdba.com/index.php/2010/08/21/weblogic-startup-prompting-from-username-password-bootproperties/"&gt;εδώ&lt;/a&gt; και &lt;a href="http://www.bushlife.com.au/knowledge/oracle/startNodeManager.html"&gt;εδώ&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-2233699302588774397?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/2233699302588774397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=2233699302588774397' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/2233699302588774397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/2233699302588774397'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/11/node-manager-administrator-server.html' title='Αυτόματη εκκίνηση Node Manager, Administrator Server και Managed Server στο Linux'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-4031566443201145051</id><published>2011-11-11T12:01:00.002+02:00</published><updated>2011-11-11T12:06:58.566+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jheadstart'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>Locale switching στο JHeadstart και στο ADF</title><content type='html'>Μια συνηθισμένη απαίτηση έχει να κάνει με τη δυνατότητα επιλογής  γλωσσικού περιβάλλοντος (locale) σε μια ADF εφαρμογή. Μια τέτοια  ενέργεια θα έχει ως αποτέλεσμα την κατάλληλη διαμόρφωση των λεκτικών  στοιχείων (labels), ημερομηνιών, αριθμών και ενδεχομένως και δεδομένων  (πχ λίστες τιμών) στο περιβάλλον επιλογής του χρήστη. Μου αρέσει πολύ η  υποστήριξη αυτής της δυνατότητας από το JHeadstart δίχως να χρειαστεί να  γράψουμε γραμμή κώδικα και πρόκειται να την παρουσιάσω καθώς είναι  εξαιρετικά χρήσιμη και σε καθαρά ADF projects, αν απλά ανατρέξουμε στον  πηγαίο κώδικα της υλοποίησης.&lt;br /&gt;&lt;br /&gt;Πρώτα από όλα, την δυνατότητα επιλογής γλώσσας θα τη δίνουμε στους  χρήστες μας κατά τη διάρκεια του login. Διαφορετικά μπλέκουμε σε  καταστάσεις cancel edit και requery objects αν αυτοί βρίσκονται ήδη σε  μια σελίδα με αλλαγές ή που παρουσιάζονται δεδομένα από φιλτραρισμένες  λίστες με βάση το locale. Στη &lt;span style="font-family:monospace;"&gt;login.jspx&lt;/span&gt;, αντιγράφουμε κάτω από το πεδία username και password τον παρακάτω κώδικα από το &lt;span style="font-family:monospace;"&gt;templates/default/misc/file/menuGlobal.vm&lt;/span&gt; ώστε να προκύψει και ένα choice list για την επιλογή της γλώσσας. Διορθώνουμε μόνο την ιδιότητα &lt;span style="font-style: italic;"&gt;labelAndAccessKey&lt;/span&gt; ώστε να ανταποκρίνεται στο λεκτικό της επιλογής μας:&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;span style="font-family: monospace;"&gt;af:selectOneChoice id="localeSwitcher" immediate="true" autoSubmit="true"&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;   labelAndAccessKey="${JHS.nls('Language','LANGUAGE_SELECTOR_LABEL')}"&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;   valueChangeListener="#{jhsLocaleManager.changeLocale}"&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;   value="#{jhsLocaleManager.currentLocale}"&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;   &lt;/span&gt;&amp;lt;&lt;span style="font-family: monospace;"&gt;af:forEach items="#{jhsLocaleManager.supportedLocales}" var="row"&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;     &lt;/span&gt;&amp;lt;&lt;span style="font-family: monospace;"&gt;af:selectItem value="#{row.locale}" label="#{row.description}"/&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;   &lt;/span&gt;&amp;lt;&lt;span style="font-family: monospace;"&gt;/af:forEach&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;&lt;span style="font-family: monospace;"&gt;/af:selectOneChoice&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Τώρα, ας ορίσουμε τις υποστηριζόμενες γλώσσες. Στο definition file του  JHeadstart υπάρχουν οι ανάλογες ρυθμίσεις για το default locale, τα  υπόλοιπα υποστηριζόμενα καθώς και τον τρόπο επιλογής του αρχικού.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-028hFFrVNK0/TrzywKEWMFI/AAAAAAAABa8/Qc48I66TNzY/s1600/Screenshot-ErsSalesApp%2B-%2BApplication%2BDefinition%2BEditor.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 49px;" src="http://1.bp.blogspot.com/-028hFFrVNK0/TrzywKEWMFI/AAAAAAAABa8/Qc48I66TNzY/s320/Screenshot-ErsSalesApp%2B-%2BApplication%2BDefinition%2BEditor.png" alt="" id="BLOGGER_PHOTO_ID_5673676539730210898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Παράγοντας τις σελίδες, θα εμφανιστεί στο login και ο επιλογέας γλώσσας  με εξ ορισμού τιμή αυτήν του browser μας. Ανάλογα με την επιλογή της  γλώσσας, από εδώ και στο εξής στην πλοήγηση μας στην εφαρμογή θα  εμφανίζονται τα αντίστοιχα μεταφρασμένα μηνύματα.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-1R8v8Vhp_iE/Trzy2XxUOdI/AAAAAAAABbI/p5jtbIBusQE/s1600/Screenshot-ERS%2BSales%2B-%2BMozilla%2BFirefox.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 277px; height: 171px;" src="http://4.bp.blogspot.com/-1R8v8Vhp_iE/Trzy2XxUOdI/AAAAAAAABbI/p5jtbIBusQE/s320/Screenshot-ERS%2BSales%2B-%2BMozilla%2BFirefox.png" alt="" id="BLOGGER_PHOTO_ID_5673676646487701970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Αν θέλουμε επιπλέον να μεταφράσουμε και δεδομένα όπως λίστες τιμών που  φιλτράρονται σύμφωνα με τη γλώσσα επιλογής, τότε θα χρειαστεί να δούμε  λίγο τα ενδότερα του JHeadstart. Πιο συγκεκριμένα, στοιχεία του  συνδεδεμένου χρήστη αποθηκεύονται σε μια session μεταβλητή ονόματι  jhsUser (και τύπου: &lt;span style="font-family: monospace;"&gt;oracle.jheadstart.model.JhsUser&lt;/span&gt;)  που περιλαμβάνει το πεδίο locale που παίρνει τιμές κατά το login μας  (στο παράδειγμα μας 'en' ή 'el') Άρα μπορούμε να το χρησιμοποιήσουμε ως  bind variable για φιλτράρισμα με expression της μορφής: &lt;span style="font-family: monospace;"&gt;adf.userSession.userData.jhsUser.locale&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-4031566443201145051?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/4031566443201145051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=4031566443201145051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4031566443201145051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4031566443201145051'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/11/locale-switching-jheadstart-adf.html' title='Locale switching στο JHeadstart και στο ADF'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-028hFFrVNK0/TrzywKEWMFI/AAAAAAAABa8/Qc48I66TNzY/s72-c/Screenshot-ErsSalesApp%2B-%2BApplication%2BDefinition%2BEditor.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-6243778023363190824</id><published>2011-11-03T16:37:00.005+02:00</published><updated>2011-11-03T16:45:48.825+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jheadstart'/><title type='text'>Πώς να κάνουμε αναζήτηση σε πεδίο πολλαπλών επιλογών στο JHeadstart 11g</title><content type='html'>Το παράδειγμα που πρόκειται να περιγράψω αφορά τη ρύθμιση ενός πεδίου  ώστε να γίνεται σε αυτό προχωρημένη αναζήτηση (advanced search) ενώ ο  χρήστης έχει ορίσει σε αυτό πολλαπλές τιμές (multiple values) ως  κριτήρια. Τα βήματα αφορούν την τελευταία παραγωγική έκδοση του  JHeadstart (11.1.1.3) ενώ πληροφορίες για κάτι ανάλογο στην έκδοση 10g  θα βρείτε &lt;a href="http://technology.amis.nl/blog/1412/using-a-selectmany-component-in-a-jheadstart-advanced-search-form-search-for-all-clerks-salesmen"&gt;εδώ&lt;/a&gt;.  Τα πράγματα μάλιστα περιπλέκονται λίγο παραπάνω καθώς το πεδίο προς  αναζήτηση δεν θα αποτελεί attribute του view object αλλά θα  χρησιμοποιείται απλά ως bind variable.&lt;br /&gt;&lt;br /&gt;Η προσέγγιση που θα ακολουθήσουμε αφορά την κατασκευή ενός κατάλληλου  where clause στο View Object μας, ώστε το bind variable μας να  περιλαμβάνει πολλαπλές τιμές. Γι' αυτό το λόγο, θα χρησιμοποιήσουμε την  συνάρτηση &lt;span style="font-weight: bold;"&gt;regexpr_like&lt;/span&gt; της  Oracle (αντί ενδεχόμενα του τελεστή IN) ώστε να κάνουμε σύγκριση με τις  πολλαπλές καταχωρήσεις του χρήστη. Φτιάχνουμε λοιπόν μια έκφραση του  στυλ:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;WHERE regexpr_like(table_column, :bind_variable)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;όπου ο τύπος της bind variable είναι &lt;span style="font-family:monospace;"&gt;java.lang.String&lt;/span&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-gOoIXvA1LVg/TrKnOvuaZrI/AAAAAAAABaM/Zo604SgCGVM/s1600/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BERSSalesApp.jws%2B%253A%2BModel.jpr%2B%253A%2B-home-spk-Projects-workdir-ers-trunk-ERSSalesApp-Model-src-gr-realconsulting-ers-sales-model-salesnote-queries-Sals.xml.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 175px;" src="http://1.bp.blogspot.com/-gOoIXvA1LVg/TrKnOvuaZrI/AAAAAAAABaM/Zo604SgCGVM/s320/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BERSSalesApp.jws%2B%253A%2BModel.jpr%2B%253A%2B-home-spk-Projects-workdir-ers-trunk-ERSSalesApp-Model-src-gr-realconsulting-ers-sales-model-salesnote-queries-Sals.xml.png" alt="" id="BLOGGER_PHOTO_ID_5670778752584017586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Για να υποστηριχθεί αυτή η έκφραση από τον εσωτερικό μηχανισμό αναζήτησης του JHeadstart, χρειάζεται να κάνουμε override το &lt;span style="font-family:monospace;"&gt;JhsApplicationModuleImpl&lt;/span&gt; και ειδικά να ξαναγράψουμε (copy-paste) τη συνάρτηση &lt;span style="font-weight: bold;"&gt;advancedSearch() &lt;/span&gt;ώστε  στο κομμάτι που γίνεται ο υπολογισμός των bind variables, να περάσουμε  τη λογική του regular expression.Πιο συγκεριμένα, ακολουθούν τονισμένες  οι γραμμές της αλλαγής, που διαχειρίζονται τις πολλαπλές τιμές:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;if (isBindParam) {&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;// work around for bug 4714529&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; font-family: monospace;"&gt;if (!value.startsWith("[")) { // Array container as parameter.&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        vo.ensureVariableManager().setVariableValue(attribute,&lt;/span&gt; &lt;span style="font-family: monospace;"&gt;value);&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        vo.ensureVariableManager().setVariableValue(attribute,&lt;/span&gt; &lt;span style="font-family: monospace;"&gt;value);&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        vo.setNamedWhereClauseParam(attribute, value);&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        sLog.info("Search item matches query bind param " +&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;                              attribute + ", value set to " + value);&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; font-family: monospace;"&gt;} else { // Array container.&lt;/span&gt;&lt;br /&gt; &lt;span style="font-weight: bold; font-family: monospace;"&gt;        sLog.info("=Array container for search found...." +&lt;/span&gt;&lt;span style="font-weight: bold; font-family: monospace;"&gt; value);&lt;/span&gt;&lt;br /&gt; &lt;span style="font-weight: bold; font-family: monospace;"&gt;        String  attrValue = "^".concat(value.substring(1, value.length() -  1).replaceAll(",", "\\$\\|\\^").replaceAll(" ", "") + "$");&lt;/span&gt;&lt;br /&gt; &lt;span style="font-weight: bold; font-family: monospace;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-family: monospace;"&gt;        vo.ensureVariableManager().setVariableValue(attribute,&lt;/span&gt;&lt;span style="font-weight: bold; font-family: monospace;"&gt; attrValue);&lt;/span&gt;&lt;br /&gt; &lt;span style="font-weight: bold; font-family: monospace;"&gt;        vo.ensureVariableManager().setVariableValue(attribute,&lt;/span&gt;&lt;span style="font-weight: bold; font-family: monospace;"&gt; attrValue);&lt;/span&gt;&lt;br /&gt; &lt;span style="font-weight: bold; font-family: monospace;"&gt;        vo.setNamedWhereClauseParam(attribute, attrValue);&lt;/span&gt;&lt;br /&gt; &lt;span style="font-weight: bold; font-family: monospace;"&gt;    }&lt;/span&gt;&lt;br /&gt;Πρακτικά αυτό που συμβαίνει είναι πως το array container της μορφής:  "[10, 46]" που περιγράφει τα κλειδιά των στοιχείων που έχει επιλέξει ο  χρήστης μετασχηματίζεται σε regular expression ως εξής: "^10$|^46$" ώστε  να περάσει ως τιμή στην bind variable μας. Δεν ξεχνάμε να ορίσουμε πως  το Application Module μας κληρονομεί από την κλάση που μόλις φτιάξαμε.&lt;br /&gt;&lt;br /&gt;Τώρα, στο επίπεδο του JHeadstart, ορίζουμε ένα unbounded πεδίο με Java  type String, τύπο εμφάνισης list και φυσικά το αντίστοιχο Domain όπως  περιγράφεται και στο JHS Developer's Guide (7.1.7 Using Query Bind  Variables in JHeadstart Quick or Advanced Search)&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-S0if0kfENHs/TrKngspuBAI/AAAAAAAABaY/CRQrLSzdenU/s1600/Screenshot-ErsSalesApp%2B-%2BApplication%2BDefinition%2BEditor.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 130px;" src="http://1.bp.blogspot.com/-S0if0kfENHs/TrKngspuBAI/AAAAAAAABaY/CRQrLSzdenU/s320/Screenshot-ErsSalesApp%2B-%2BApplication%2BDefinition%2BEditor.png" alt="" id="BLOGGER_PHOTO_ID_5670779060996670466" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;To template του display type "list" του JHeadstart είναι βασισμένο στο  af:selectOneListbox component, οπότε το αλλάζουμε σε selectManyListbox  για το πεδίο του ενδιαφέροντός μας.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-yYe5GW9LwLo/TrKnsi37ZKI/AAAAAAAABak/JfaECgbQAwE/s1600/Screenshot-ErsSalesApp%2B-%2BApplication%2BDefinition%2BEditor2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 110px;" src="http://2.bp.blogspot.com/-yYe5GW9LwLo/TrKnsi37ZKI/AAAAAAAABak/JfaECgbQAwE/s320/Screenshot-ErsSalesApp%2B-%2BApplication%2BDefinition%2BEditor2.png" alt="" id="BLOGGER_PHOTO_ID_5670779264530343074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Έχουμε σχεδόν τελειώσει μιας και μπορούμε να κάνουμε αναζήτηση με  πολλαπλές επιλογές. Αυτές μεταφέρονται ως java.lang.String array format  στο ADF BC και εμείς εφαρμόζουμε τον regular expression μετασχηματισμό  μας.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-74HSiR5gvXc/TrKn0BsiFlI/AAAAAAAABaw/cujKUiVXRHQ/s1600/Screenshot-ERS%2BSales%2B-%2BMozilla%2BFirefox.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 194px;" src="http://3.bp.blogspot.com/-74HSiR5gvXc/TrKn0BsiFlI/AAAAAAAABaw/cujKUiVXRHQ/s320/Screenshot-ERS%2BSales%2B-%2BMozilla%2BFirefox.png" alt="" id="BLOGGER_PHOTO_ID_5670779393063130706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Κάτι τελευταίο έχει να κάνει με τη συμπεριφορά του Reset query button.  Για να πάνε όλα σωστά, θα πρέπει να φτιάξουμε το δικό μας JHS Search  bean (κληρονομώντας από το JhsSearchBean) με μια μόνη μέθοδο που θα  καθαρίζει τα κριτήρια μας και ειδικά τη bind variable μας, πχ:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;    public void clearSearchCriteria(ActionEvent event) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt; &lt;span style="font-weight: bold;"&gt;       getIterBinding().getViewObject().setNamedWhereClauseParam("SalsSndId", null);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;        super.clearSearchCriteria(event);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;    }&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-6243778023363190824?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/6243778023363190824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=6243778023363190824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/6243778023363190824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/6243778023363190824'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/11/jheadstart-11g.html' title='Πώς να κάνουμε αναζήτηση σε πεδίο πολλαπλών επιλογών στο JHeadstart 11g'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-gOoIXvA1LVg/TrKnOvuaZrI/AAAAAAAABaM/Zo604SgCGVM/s72-c/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BERSSalesApp.jws%2B%253A%2BModel.jpr%2B%253A%2B-home-spk-Projects-workdir-ers-trunk-ERSSalesApp-Model-src-gr-realconsulting-ers-sales-model-salesnote-queries-Sals.xml.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-8328452175135978978</id><published>2011-11-01T14:22:00.000+02:00</published><updated>2011-11-01T14:23:06.827+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jheadstart'/><title type='text'>Πώς να συμμαζέψουμε (clean up) ένα JHeadstart project</title><content type='html'>Αυτό το χρονικό διάστημα αισθάνομαι πολύ τυχερός γιατί ένα καινούργιο  project ξεκίνησε βασισμένο στον JHeadstart 11g. Είχα αναφερθεί και στο  παρελθόν για την έκδοση JHS 10g ως απαραίτητο συμπλήρωμα ανάπτυξης στο  ADF. Στην τελευταία έκδοση (11g) τα πράγματα είναι πιο μπλεγμένα: το ADF  έχει γίνει πιο παραγωγικό πλαίσιο παρέχοντας με ευκολία βασικές αλλά  και προηγμένες δυνατότητες στο web development. Από την άλλη, υπάρχει  ακόμα περιθώριο για αυτοματισμούς και πειθαρχία όπως επιβάλλει το code  generation του JHeadstart. Ίσως η συμβολή του να μην είναι τόσο  καθοριστική όπως στην έκδοση 10g, αλλά εξακολουθεί να δίνει μεγάλη  ευελιξία στις ομάδες ανάπτυξης, ιδίως σε αυτές που κάνουν τα πρώτα τους  βήματα σε ADF.&lt;br /&gt;&lt;br /&gt;Ένα από τα "παράπονα" που είχα και από την έκδοση 10g είχε να κάνει με  τα κατάλοιπα του code generation που πια δεν χρησιμοποιούνται. Για  παράδειγμα, στην εξέλιξη του project μας φτιάχνουμε ένα JHeadstart Lov,  που έπειτα το εγκαταλείπουμε. Ή φτιάχνουμε μερικές σελίδες πάνω σε  κάποια view objects που τελικά δεν χρησιμοποιούμε. Πώς μπορούμε να  εντοπίσουμε τέτοια άχρηστα; Πώς μπορούμε να τακτοποιήσουμε τα generated  artifacts (pages, task flows) του JHeadstart που είναι ανενεργά;&lt;br /&gt;&lt;br /&gt;Μια προσέγγιση είναι να μην κρατάμε τα αρχεία που παράγονται από το  JHeadstart σε ένα versioning σύστημα, ώστε να μπορούμε ανά πάσα ώρα και  στιγμή να κάνουμε ένα project checkout και ένα καθαρό code generation  ολόκληρης της εφαρμογής.Υπάρχουν μειονεκτήματα σε αυτό, καθώς είναι  ενάντιο στα best practices. Συχνά επίσης κρατάμε σελίδες που έτσι και  αλλιώς έχουμε "παγώσει" από το generation. Αυτόματο build και deployment  δεν είναι εφικτό. Έχουμε να κάνουμε με μεγάλο αριθμό αρχείων που δεν  γίνονται version και αυτό μπορεί να προκαλέσει σύγχυση. Μια εναλλακτική,  είναι να προκαλέσουμε ένα code generation, και να δούμε το timestamp  των αρχείων που δεν έχουν μεταβληθεί στο αμέσως προηγούμενο χρονικό  διάστημα. Αυτό θα μας οδηγήσει στην ανίχνευση παλαιών σελίδων, task  flows ή κώδικα που δεν είναι πια απαραίτητος και δεν παράγεται εκ νέου.&lt;br /&gt;&lt;br /&gt;Πηγαίνοντας λοιπόν από command line στο ViewController project μας (που  λειτουργεί ο JHS) υπάρχουν δυο βασικοί κατάλογοι που γράφει το  JHeadstart: ο public_html και ο adfmsrc (για τα page definitions): Για  τον μεν πρώτο, μπορούμε να βρούμε τα αρχεία που δεν έχουν αλλάξει τα  τελευταία πέντε λεπτά:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;cd public_html &amp;amp;&amp;amp; find . ! -mmin -5 | grep -v "jheadstart/"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ενώ για τον δεύτερο η εντολή είναι:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;cd adfmsrc &amp;amp;&amp;amp; find . ! -mmin -30&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Έτσι μπορούμε να δούμε τα αρχεία που δεν έχουν μεταβληθεί, να τα  εξετάσουμε και ενδεχόμενα να τα διαγράψουμε αν δεν μας είναι πια  απαραίτητα.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-8328452175135978978?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/8328452175135978978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=8328452175135978978' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/8328452175135978978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/8328452175135978978'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/11/clean-up-jheadstart-project.html' title='Πώς να συμμαζέψουμε (clean up) ένα JHeadstart project'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-7685491475978219209</id><published>2011-10-27T21:53:00.001+03:00</published><updated>2011-10-27T21:54:50.694+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtualbox'/><title type='text'>Port forwarding στο VirtualBox 4</title><content type='html'>Είχαμε αναφερθεί στο παρελθόν (&lt;a href="http://serafeimk.blogspot.com/2009/09/port-forwarding-virtualbox.html"&gt;http://serafeimk.blogspot.com/2009/09/port-forwarding-virtualbox.html&lt;/a&gt;)  στη δυνατότητα του VirtualBox να προωθεί TCP αιτήματα εξυπηρέτησης από  το host σύστημα στα guests. Στα δυο χρόνια που μεσολάβησαν από εκείνο το  άρθρο, τα πράγματα απλοποιήθηκαν αφάνταστα και πια αυτή η δυνατότητα  προσφέρεται από το GUI, χωρίς να χρειάζεται να καταφύγουμε σε CLI. Πιο  συγκεκριμένα στην NAT σύνδεσή μας έχει προστεθεί ένα κουμπί για το port  forwarding.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-rmCYNeAQKd8/Tqmow7ZKNyI/AAAAAAAABZw/aDd9Nj9ZxqQ/s1600/Screenshot-SOABPM%2B-%2BSettings.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 260px;" src="http://1.bp.blogspot.com/-rmCYNeAQKd8/Tqmow7ZKNyI/AAAAAAAABZw/aDd9Nj9ZxqQ/s320/Screenshot-SOABPM%2B-%2BSettings.png" alt="" id="BLOGGER_PHOTO_ID_5668247164552886050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Έπειτα, μπορούμε να ορίσουμε την εξωτερική διεύθυνση του host μας που θα  δέχεται αιτήσεις, το port το οποίο θα αφορούν καθώς και το port που θα  καταλήγουν στο guest σύστημα.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-ev8Y_4ihfOc/Tqmo3nGCWvI/AAAAAAAABZ8/k008usi7Ci0/s1600/Screenshot-1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 117px;" src="http://4.bp.blogspot.com/-ev8Y_4ihfOc/Tqmo3nGCWvI/AAAAAAAABZ8/k008usi7Ci0/s320/Screenshot-1.png" alt="" id="BLOGGER_PHOTO_ID_5668247279363054322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Το παράδειγμα που παραθέτω αφορά HTTP port forwarding για τον Weblogic Server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-7685491475978219209?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/7685491475978219209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=7685491475978219209' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7685491475978219209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7685491475978219209'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/10/port-forwarding-virtualbox-4.html' title='Port forwarding στο VirtualBox 4'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-rmCYNeAQKd8/Tqmow7ZKNyI/AAAAAAAABZw/aDd9Nj9ZxqQ/s72-c/Screenshot-SOABPM%2B-%2BSettings.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-4879363195546154568</id><published>2011-10-21T11:49:00.000+03:00</published><updated>2011-10-21T11:50:03.351+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipselink'/><title type='text'>Πώς να κάνουμε κλήση Oracle PL/SQL procedure από το EclipseLink</title><content type='html'>Πέρα από τον προγραμματισμό σε ADF και BPM, αυτόν τον καιρό συμμετέχω  και σε ένα άλλο έργο που ανάμεσα στα άλλα χρειάζεται και ένα lightweight  persistence των δεδομένων ενός web service. Είχα πολύ καιρό να ασχοληθώ  με EJB 3, οπότε ήταν μια θαυμάσια ευκαιρία να επιλέξω αυτή την  τεχνολογία, και πιο συγκεκριμένα την JPA υλοποίηση του EclipseLink, που  έτσι και αλλιώς παρέχεται out of the box από τον JDeveloper. Αν και  συνηθισμένος στα declarative χαρακτηριστικά του ADF, βρήκα εξίσου  ενδιαφέρον και ευέλικτο το EclipseLink (&lt;a href="http://www.eclipse.org/eclipselink/"&gt;http://www.eclipse.org/eclipselink/&lt;/a&gt;)  που έτσι και αλλιώς λόγω των TopLink καταβολών του, δένει αρκετά καλά  με την Oracle database. Ακολουθεί ένα παράδειγμα κλήσης μιας Oracle  PL/SQL procedure που έχει ως είσοδο μια παράμετρο τύπου String.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;    public final static void process(EntityManager em, String message) {&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        JpaEntityManager jpaEntityManager = JpaHelper.getEntityManager(em);&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        Session session = jpaEntityManager.getActiveSession();&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        StoredProcedureCall call = new StoredProcedureCall();&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        call.setProcedureName("GENERAL_PCK.PROCESS");&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        call.addUnamedArgumentValue(message);&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        session.executeNonSelectingCall(call);&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;    }&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-4879363195546154568?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/4879363195546154568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=4879363195546154568' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4879363195546154568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4879363195546154568'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/10/oracle-plsql-procedure-eclipselink.html' title='Πώς να κάνουμε κλήση Oracle PL/SQL procedure από το EclipseLink'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-5061045870513680561</id><published>2011-10-20T11:48:00.000+03:00</published><updated>2011-10-20T11:49:29.944+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualbox'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Βελτίωση της απόδοσης μνήμης swap στο Linux</title><content type='html'>Αν και το laptop μου διαθέτει 8 GB RAM, o προγραμματισμός στα εργαλεία  ανάπτυξης της Oracle παραμένει πολύ απαιτητικός από την άποψη πόρων. Ένα  virtual machine που τρέχει το Oracle SOA/BPM Suite καταναλώνει 2 GB  μνήμης. O JDeveloper 1G και άλλο ένα 1G ο embedded Weblogic. Firefox,  SQL Developer, ANT build scripts ή η εκκίνηση άλλων VMs για διαφορετικά  projects και δεν αργούμε να φθάσουμε κάποιες φορές στο swapping της  μνήμης. Όταν μάλιστα συμβαίνει αυτό, το σύστημα επιβραδύνει δραματικά τη  λειτουργία του, ο δίσκος (ακόμα και ο solid state) καθυστερεί με πολλές  εγγραφές και αναγνώσεις ενώ μου έχει συμβεί να κάνει abrupt shutdown  και κάποιο virtual machine του VirtualBox μέσα σε αυτήν την κατάσταση.&lt;br /&gt;&lt;br /&gt;Ένας ανεκτίμητος βοηθός είναι το kernel module &lt;span style="font-weight: bold;"&gt;zram&lt;/span&gt; (&lt;a href="http://compcache.googlecode.com/hg/README"&gt;http://compcache.googlecode.com/hg/README&lt;/a&gt;  - πρώην compcache) που αναλαμβάνει να κάνει συμπίεση στην RAM των  περιεχομένων του swap αυξάνοντας έτσι την απόκριση του συστήματος σε  τέτοιες ειδικές συνθήκες. Το module έχει ενσωματωθεί στον πυρήνα από την  έκδοση 2.6.37 rc 1 και μπόρεσα να το εκμεταλλευτώ στο Ubuntu Maverick  Meerkat (10.10) από το PPA mainline kernel repository. Μπορούμε μάλιστα  να ορίσουμε ποιο είναι το μέγεθος της συμπιεσμένης μνήμης που θα  χρησιμοποιηθεί (o υπολογισμός στην περίπτωση μου έδινε αρχικά άλλα 8GB  κατανεμημένα στους δυο επεξεργαστές του Core Duo 2 μου, ενώ αποφάσισα  πως 1 GB είναι αρκετό) Εντυπώσεις; Όταν θα ξεκινήσει το swapping, θα  προκύψει κάποια μικρή στιγμή παγώματος, αλλά αμέσως μετά το σύστημα θα  συμπεριφερθεί δίχως καθυστερήσεις, λειτουργώντας απρόσκοπτα, χωρίς να  γίνεται αντιληπτό πως γίνεται υπέρβαση μνήμης. Πραγματικά αξίζει τον  κόπο!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-5061045870513680561?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/5061045870513680561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=5061045870513680561' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5061045870513680561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5061045870513680561'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/10/swap-linux.html' title='Βελτίωση της απόδοσης μνήμης swap στο Linux'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-4441956060339546863</id><published>2011-10-06T15:08:00.002+03:00</published><updated>2011-10-06T15:09:57.477+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='jdeveloper'/><title type='text'>Καθαρίζοντας (clean) σκουπίδια στο jazn-data.xml</title><content type='html'>Κατά τη διάρκεια της ανάπτυξης μιας ADF εφαρμογής, οι προγραμματιστές  φτιάχνουν και αφαιρούν task flows. Ίχνη αυτής της εξέλιξης βρίσκονται  στο &lt;span style="font-family:monospace;"&gt;jazn-data.xml&lt;/span&gt; εφόσον τα  task flows συνδέονται με security (γεγονός που ισχύει σχεδόν πάντα)  Ωστόσο, ο JDeveloper και ειδικά ο security configuration editor για το  ADF, ποτέ δεν πρόκειται να μας επισημάνει πως κάποιες εγγραφές στο  jazn-data.xml δεν ισχύουν, αφού πια δεν υπάρχουν τα pages, task flows ή  regions στα οποία αναφέρονται. Σε ένα έργο που απουσιάζει αυτός ο  έλεγχος, δεν θα αργήσει να καταλήξουμε σε ένα τεράστιο jazn-data.xml  αρχείο με πολλά στοιχεία του ανενεργά ή λανθασμένα.&lt;br /&gt;&lt;br /&gt;Δεν υπάρχει ένας τυποποιημένος και απλός τρόπος να κάνουμε το  housekeeping του jazn-data.xml. H μέθοδος που ακολουθώ, στηρίζεται στα  εξής βήματα:&lt;br /&gt;&lt;br /&gt;1. Από το υπάρχον jazn-data.xml βρίσκουμε όλες τις αναφορές που  αναφέρονται σε task flows. Μπορούμε να χρησιμοποιήσουμε το XPath Search  για να ανακτήσουμε όλη τη λίστα των task flows, pages ή regions που  είναι αντικείμενα security permissions. Η έκφραση που αναζητώ είναι η "&lt;span style="font-family:monospace;"&gt;//permission/name/text()&lt;/span&gt;". Τον πίνακα των αποτελεσμάτων τον κάνω copy-paste σε ένα αρχείο.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-iuSox85iM7I/To2aWphnJrI/AAAAAAAABZk/w7-zRqWBW9o/s1600/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BBuildScripts.jws%2B%253A%2BBuildScripts.jpr.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 249px; height: 320px;" src="http://1.bp.blogspot.com/-iuSox85iM7I/To2aWphnJrI/AAAAAAAABZk/w7-zRqWBW9o/s320/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BBuildScripts.jws%2B%253A%2BBuildScripts.jpr.png" alt="" id="BLOGGER_PHOTO_ID_5660350020569212594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. Ως προς τη λίστα των ενεργών task flows, με βοήθησαν τα custom build  scripts (προσοχή: καμία σχέση με JDeveloper ή ojdeploy) που  συγκεντρώνουν σε έναν κατάλογο όλα τα task flows. Με Linux scripting  μπορώ να πάρω όλα τα ονόματα των αρχείων, ή καλύτερα των task flows  files αν προτιμάτε και να την αποθηκεύσω σε ένα δεύτερο αρχείο.&lt;br /&gt;&lt;br /&gt;3. Συγκρίνοντας τα δυο αρχεία, εντοπίζουμε τις διαφορές και τελικά  διορθώνουμε το αρχικό μας jazn-data.xml ώστε να περιλαμβάνει μόνο  έγκυρες και ισχύουσες εγγραφές.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-4441956060339546863?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/4441956060339546863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=4441956060339546863' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4441956060339546863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4441956060339546863'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/10/clean-jazn-dataxml.html' title='Καθαρίζοντας (clean) σκουπίδια στο jazn-data.xml'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-iuSox85iM7I/To2aWphnJrI/AAAAAAAABZk/w7-zRqWBW9o/s72-c/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BBuildScripts.jws%2B%253A%2BBuildScripts.jpr.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-8645989878439406479</id><published>2011-10-05T16:37:00.001+03:00</published><updated>2012-01-05T15:51:24.757+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle SOA Suite'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle DB'/><title type='text'>Εξοικονόμηση αποθηκευτικού χώρου στην Oracle για development environment</title><content type='html'>Δεν είναι λίγες οι περιπτώσεις που μια ομάδα ανάπτυξης διαπιστώνει πως ο  database server που χρησιμοποιεί "ξεμένει" από χώρο. Το ίδιο μπορεί  επίσης να συμβεί και στο ατομικό μας development environment. Αν και σε  φυσιολογικές συνθήκες θα πρέπει να υπάρχει ένας DBA που παρακολουθεί  τέτοιου είδους καταστάσεις, υπάρχουν μερικές συμβουλές που μπορούμε να  ακολουθήσουμε ώστε να εξοικονομήσουμε χώρο και απόδοση σε μια Oracle  βάση δεδομένων.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.&lt;/span&gt; Για παράδειγμα, στην ομάδα  που συνεργάζομαι και ο καθένας προγραμματιστής τρέχει το δικό του  instance του SOA Suite (επομένως υπάρχει ξεχωριστό repository - σχήμα  ανά developer), παρατήρησα πως υπάρχουν συχνά audit logs για την  αποσύνδεση από τη βάση, που μάλιστα φθάνουν στα 10ΜΒ σε ημερήσια βάση.  Εξ ορισμού, τα audit logs βρίσκονται στον κατάλογο &lt;span style="font-family: monospace;"&gt;adump&lt;/span&gt; και έχουν την επέκταση .&lt;span style="font-family: monospace;"&gt;aud&lt;/span&gt;. Στην περίπτωσή μου, υπήρχαν auditing εγγραφές του τύπου:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;SESSIONID:[7] "1639115"  ENTRYID:[1] "1" USERID:[9] "DEV02_MDS" ACTION:[3] "102" RETURNCODE:[1]  "0" LOGOFF$PREAD:[1] "0" LOGOFF$LREAD:[3] "138" LOGOFF$LWRITE:[1] "4"  LOGOFF$DEAD:[1] "0" DBID:[10] "1345676453" SESSIONCPU:[1] "1"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Για τις ανάγκες του development, είναι ασφαλές, κατά περίπτωση, να απενεργοποιήσουμε το auditing της βάσης ως εξής:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;alter system set audit_trail=NONE scope=spfile;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;και η αλλαγή μας θα γίνει ορατή με το επόμενο restart. Διαφορετικά, αν  θέλουμε να κρατήσουμε το auditing, μπορούμε να τρέχουμε ένα cron job για  το clean up, καθαρίζοντας αρχεία αρχαιότερα των 10 ημερών με την Linux  εντολή:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;find /path_audit_logs -mtime +10 -exec rm {} \;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2.&lt;/span&gt; Μια άλλη πηγή παραγωγής πολλών MB είναι τα trace files. Μπορούμε εξίσου να καταργήσουμε το tracing με την εντολή:&lt;br /&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;alter system set trace_enabled=FALSE scope=both;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ή απλά να καθαρίζουμε τα αρχεία σε τακτά χρονικά διαστήματα με την μέθοδο που ήδη περιγράψαμε.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3.&lt;/span&gt; Ένα αρχείο που επίσης συχνά έχει μεγάλο μέγεθος είναι το &lt;span style="font-family: monospace;"&gt;listener.log&lt;/span&gt;  αφού καταγράφει κάθε προσπάθεια εισόδου στην βάση. Σε περιβάλλον  connection pooling και πολλών προγραμματιστών, γρήγορα αυτό το αρχείο  "φουσκώνει". Μπορούμε να  απενεργοποιήσουμε την λεπτομερή καταγραφή  προσθέτοντας στο&lt;span style="font-family: monospace;"&gt; listener.ora&lt;/span&gt; την ακόλουθη γραμμή και να επανεκκινήσουμε τον listener:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;LOGGING_LISTENER = OFF&lt;br /&gt; &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4.&lt;/span&gt; Τέλος, θα μπορούσαμε να απενεργοποιήσουμε και το flashback χαρακτηριστικό της Oracle (&lt;a href="http://www.dba-oracle.com/t_disable_flashback.htm"&gt;http://www.dba-oracle.com/t_disable_flashback.htm&lt;/a&gt;) ή/και προφανώς το log archiving (που δεν είναι εξ ορισμού επιλεγμένο) ή ακόμα και το recycle bin (&lt;a href="http://babudba.blogspot.com/2008/06/how-to-disable-recyclebin-in-oracle-10g.html"&gt;http://babudba.blogspot.com/2008/06/how-to-disable-recyclebin-in-oracle-10g.html&lt;/a&gt;) ώστε να μειώσουμε τις εγγραφές στον δίσκο.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-8645989878439406479?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/8645989878439406479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=8645989878439406479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/8645989878439406479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/8645989878439406479'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/10/oracle-development-environment.html' title='Εξοικονόμηση αποθηκευτικού χώρου στην Oracle για development environment'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-1949115116100042133</id><published>2011-09-28T15:00:00.000+03:00</published><updated>2011-09-28T15:01:44.766+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='jdeveloper'/><title type='text'>Παίρνοντας backup projects του JDeveloper</title><content type='html'>Έχω φτιάξει ένα cron job, που στο τέλος κάθε εβδομάδας, παίρνει ανάμεσα  στα άλλα και backup τον κατάλογο με τα JDeveloper projects μου. Μάλιστα  αυτό το backup είναι "έξυπνο" ώστε να μεταφέρονται οι νεώτερες εκδόσεις  των αρχείων με την βοήθεια του εργαλείου &lt;span style="font-weight: bold;"&gt;rsync&lt;/span&gt;. Η εντολή μοιάζει με την ακόλουθη:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;rsync -azvr --exclude=.svn/ --exclude=classes/ --exclude=deploy/ &amp;lt;my_workdir&amp;gt; &amp;lt;backup_folder&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Επί της ουσίας, δεν αντιγράφονται τα μετα-δεδομένα του Subversion, τα  compiled classes καθώς τα deployment units (πχ WARs, EARs, κλπ) Είναι  εξαιρετικό το πόσο γρήγορα εκτελείται αυτή η εντολή και συγχρονίζονται  οι κατάλογοι !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-1949115116100042133?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/1949115116100042133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=1949115116100042133' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/1949115116100042133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/1949115116100042133'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/09/backup-projects-jdeveloper.html' title='Παίρνοντας backup projects του JDeveloper'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-5358598881801805853</id><published>2011-09-26T12:14:00.000+03:00</published><updated>2011-09-26T12:15:21.277+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtualbox'/><title type='text'>Βλέποντας τις ιδιότητες ενός guest machine στο VirtualBox</title><content type='html'>To VirtualBox διαθέτει ένα γραφικό περιβάλλον στο οποίο μπορούμε να  επηρεάσουμε παραμέτρους σχετικά με την συμπεριφορά ενός virtual machine  (πχ μνήμη, δίσκους, κλπ) Πέρα από το γραφικό, υπάρχει όμως και μια  ισχυρή γραμμή εντολών με την εντολή &lt;span style="font-family:monospace;"&gt;VBoxManage modifyvm&lt;/span&gt;  που μας επιτρέπει να ορίσουμε ακόμα περισσότερες παραμέτρους, πολλές  από τις οποίες δεν εμφανίζονται καν στην γραφική κονσόλα. Προκειμένου να  δούμε όλη τη λίστα της παραμετροποίησης μιας εικονικής μηχανής, αρκεί  να πληκτρολογήσουμε:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;VBoxManage showvminfo &amp;lt;VM identifier&amp;gt;&lt;vm identifier=""&gt;&lt;br /&gt;&lt;/vm&gt;&lt;/span&gt;&lt;a href="http://1.bp.blogspot.com/-AH5UlsYBXJQ/ToBCiuwE0OI/AAAAAAAABZc/Tv7L8oRVPZo/s1600/Screenshot-spk%2540spk-laptop%253A%2B%257E.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://1.bp.blogspot.com/-AH5UlsYBXJQ/ToBCiuwE0OI/AAAAAAAABZc/Tv7L8oRVPZo/s320/Screenshot-spk%2540spk-laptop%253A%2B%257E.png" alt="" id="BLOGGER_PHOTO_ID_5656594296410001634" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-5358598881801805853?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/5358598881801805853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=5358598881801805853' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5358598881801805853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5358598881801805853'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/09/guest-machine-virtualbox.html' title='Βλέποντας τις ιδιότητες ενός guest machine στο VirtualBox'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-AH5UlsYBXJQ/ToBCiuwE0OI/AAAAAAAABZc/Tv7L8oRVPZo/s72-c/Screenshot-spk%2540spk-laptop%253A%2B%257E.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-7270963158436220222</id><published>2011-09-22T09:13:00.002+03:00</published><updated>2011-09-22T09:15:11.964+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BPM'/><title type='text'>Parallel branches σε array payload στο Oracle BPM</title><content type='html'>Δεν είναι σπάνιες οι περιπτώσεις στο Oracle BPM, που έχουμε στη     διάθεσή μας ένα payload που περιλαμβάνει πολλές εγγραφές μιας δομής     (πίνακα-array ή collection), που όμως διακρίνονται μοναδικά από ένα     συγκεκριμένο πεδίο (πχ type), και για τις οποίες θέλουμε να κάνουμε     μια παράλληλη επεξεργασία χρησιμοποιώντας ως κριτήριο το μοναδικό πεδίο. Για παράδειγμα, αντλούμε μια σειρά από     παραγγελίες και θέλουμε ανάλογα με τον τύπο τους να καλέσουμε κάποια     εξειδικευμένα BPEL processes.&lt;br /&gt;&lt;br /&gt; Αρχικά λοιπόν, κάνουμε drag-and-drop ένα parallel gateway και για τις     περιπτώσεις (cases) που μας ενδιαφέρουν, προσθέτουμε τον ανάλογο     αριθμό από exclusive gateways. Αυτά θα παίξουν των κόμβων απόφασης, για το αν θα     εκτελεστεί αυτό το κλαδί (branch) του parallel gateway ή όχι.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-p6vgo3SCGsc/TnrSIlXfHhI/AAAAAAAABZE/M2SIcA0r6oI/s1600/Screenshot.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 113px;" src="http://2.bp.blogspot.com/-p6vgo3SCGsc/TnrSIlXfHhI/AAAAAAAABZE/M2SIcA0r6oI/s320/Screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5655063327028485650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Έπειτα, σε κάθε exclusive gateway θα δημιουργήσουμε μια συνθήκη  (condition) που     θα περιγράφει για το αν θα εκτελεστεί μια διαδικασία (με βάση τα     περιεχόμενα του payload) ή θα πάμε απευθείας στο τέλος (εφόσον δεν  υπάρχει αντικείμενο ενδιαφέροντος στο αρχικό μήνυμα). Εδώ έχουμε     τη βοήθεια του XPath που μας επιτρέπει να ορίσουμε συνθήκες για τα     περιεχόμενα του payload. Στο παράδειγμα που ακολουθεί, από το array     των εγγραφών, επιλέγω μόνο αυτήν που έχει την ιδιότητα emsFileTypeid     στην τιμή 7 ώστε στο επόμενο βήμα να διαχειριστώ αυτόν τον τύπο.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-zEmEdb3TB50/TnrSQPlQJJI/AAAAAAAABZM/CYRgtj6BEqM/s1600/Screenshot2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 274px;" src="http://1.bp.blogspot.com/-zEmEdb3TB50/TnrSQPlQJJI/AAAAAAAABZM/CYRgtj6BEqM/s320/Screenshot2.png" alt="" id="BLOGGER_PHOTO_ID_5655063458619597970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ένα πλήρες διάγραμμα, μπορεί να δείχνει όπως το παρακάτω: Οι συνθήκες  βρίσκονται στα exclusive gateways που έχουν ως default διαδρομή το τέλος  της παράλληλης διαδικασίας. Αν όμως ισχύει κάποια συνθήκη (ή πολλές  ταυτόχρονα) τότε θα ακολουθήσει η επεξεργασία στα βήματα PrepareTypeX,  InvokeTypeX, για όσους τύπους είναι παρόντες στο αρχικό μήνυμα,  ταυτόχρονα.&lt;br /&gt;  &lt;a href="http://3.bp.blogspot.com/-gw9hyoQMzuI/TnrSXwojtwI/AAAAAAAABZU/kppnourOdxo/s1600/Screenshot3.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 147px;" src="http://3.bp.blogspot.com/-gw9hyoQMzuI/TnrSXwojtwI/AAAAAAAABZU/kppnourOdxo/s320/Screenshot3.png" alt="" id="BLOGGER_PHOTO_ID_5655063587750917890" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-7270963158436220222?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/7270963158436220222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=7270963158436220222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7270963158436220222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7270963158436220222'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/09/parallel-branches-array-payload-oracle.html' title='Parallel branches σε array payload στο Oracle BPM'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-p6vgo3SCGsc/TnrSIlXfHhI/AAAAAAAABZE/M2SIcA0r6oI/s72-c/Screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-5487034454400093769</id><published>2011-09-20T23:02:00.002+03:00</published><updated>2011-09-22T09:16:37.235+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webcenter'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Βιβλίο για το Oracle WebCenter</title><content type='html'>Η Packt Publishing (&lt;a href="http://www.packtpub.com/"&gt;http://www.packtpub.com/&lt;/a&gt;)  έχει βαλθεί να καλύψει με τους τίτλους της όλα τα τεχνολογικά προϊόντα  της Oracle. Η τελευταία κυκλοφορία αφορά το Oracle WebCenter 11g (&lt;a class="moz-txt-link-freetext" href="http://www.packtpub.com/oracle-webcenter-11g-ps3-administration-cookbook/book"&gt;http://www.packtpub.com/oracle-webcenter-11g-ps3-administration-cookbook/book&lt;/a&gt;  ) και είναι εξαιρετικά ενδιαφέρουσα καθώς καλύπτει την πιο πρόσφατη  διαθέσιμη έκδοση (11g R1 PS3) και περιγράφει με αναλυτικό τρόπο τη  δόμηση, λειτουργία και διαχείριση ενός σύγχρονου Portal. Περισσότερες  πληροφορίες για το βιβλίο στις επόμενες ημέρες.&lt;br /&gt;&lt;a href="https://www.packtpub.com/sites/default/files/imagecache/productview/2282EN_Oracle%20WebCenter%2011gPS%20Administration%20Cookbookcov.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 125px; height: 152px;" src="https://www.packtpub.com/sites/default/files/imagecache/productview/2282EN_Oracle%20WebCenter%2011gPS%20Administration%20Cookbookcov.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-5487034454400093769?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/5487034454400093769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=5487034454400093769' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5487034454400093769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5487034454400093769'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/09/oracle-webcenter.html' title='Βιβλίο για το Oracle WebCenter'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-251970885047631597</id><published>2011-09-09T16:26:00.000+03:00</published><updated>2011-09-09T16:27:03.232+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>Πώς να συγχρονίσουμε τις αλλαγές που έχουν συμβεί σε ένα Application Module προτού καλέσουμε μια PL/SQL procedure</title><content type='html'>Το παράδειγμα είναι συγκεκριμένο: έχουν συμβεί διάφορες αλλαγές σε     ένα ApplicationModule (ή/και σε nested application modules αυτού)     και προτού καλέσουμε μια PL/SQL procedure που θα επεξεργαστεί τα     δεδομένα που έχουν αλλαχτεί, θέλουμε να διασφαλίσουμε πως αυτά είναι     διαθέσιμα στο επίπεδο της βάσης. O συγχρονισμός αυτός επιτυγχάνεται     σε επίπεδο application module με την κλήση:&lt;br /&gt;   &lt;br /&gt;    &lt;span style="font-family: monospace;"&gt;am.postChanges();&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-251970885047631597?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/251970885047631597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=251970885047631597' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/251970885047631597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/251970885047631597'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/09/application-module-plsql-procedure.html' title='Πώς να συγχρονίσουμε τις αλλαγές που έχουν συμβεί σε ένα Application Module προτού καλέσουμε μια PL/SQL procedure'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-5549402725781505933</id><published>2011-09-02T17:27:00.002+03:00</published><updated>2011-09-02T17:30:53.675+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualbox'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Οπτικοποίηση (visualization) εξέλιξης έργου στο Subversion με το gource</title><content type='html'>Είχαμε αναφερθεί σε προηγούμενο άρθρο για την άντληση στατιστικών στοιχείων σχετικά με τα commits στο Subversion (&lt;a href="http://serafeimk.blogspot.com/2011/06/subversion.html"&gt;http://serafeimk.blogspot.com/2011/06/subversion.html&lt;/a&gt;) Τώρα θα αναφερθούμε στο εξαιρετικό πρόγραμμα &lt;span style="font-weight: bold;"&gt;gource&lt;/span&gt; (&lt;a href="http://code.google.com/p/gource"&gt;http://code.google.com/p/gource&lt;/a&gt;)  που οπιτκοποιεί με χρήση OpenGL την εξέλιξη των commits στο Subversion.  Ως περιβάλλον πειραματισμού χρησιμοποιώ το Ubuntu 10.10 (Maverick  Meerkat) που τρέχει ως virtual machine στο VirtualBox.&lt;br /&gt;&lt;br /&gt;Αρχικά, κατεβάζουμε τον πηγαίο κώδικα σε μορφή tar.gz από το &lt;a href="http://code.google.com/p/gource/downloads/list"&gt;http://code.google.com/p/gource/downloads/list&lt;/a&gt;.  Έπειτα αφού κάνουμε αποσυμπιέσουμε το αρχείο, φροντίζουμε στο Ubuntu  μας να είναι εγκατεστημένα τα πακέτα (που βρίσκονται ήδη στα Ubuntu  αποθετήρια):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;subversion&lt;/li&gt;&lt;li&gt;g++&lt;/li&gt;&lt;li&gt;libsdl1.2-dev&lt;/li&gt;&lt;li&gt;libsdl-image1.2-dev&lt;/li&gt;&lt;li&gt;libpcre3-dev&lt;/li&gt;&lt;li&gt;libfreetype6-dev&lt;/li&gt;&lt;li&gt;libglew1.5-dev&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Με την γνωστή διαδικασία configure-make-make install εγκαθιστούμε την  εφαρμογή. Επειδή το gource στηρίζεται στην OpenGL. έχουμε φροντίσει να  δώσουμε δυνατότητες 3D στο virtual machine μας.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-PXsanRGbZNY/TmDoUF78Z9I/AAAAAAAABYs/v6cQvWt48WU/s1600/Screenshot2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 194px;" src="http://3.bp.blogspot.com/-PXsanRGbZNY/TmDoUF78Z9I/AAAAAAAABYs/v6cQvWt48WU/s320/Screenshot2.png" alt="" id="BLOGGER_PHOTO_ID_5647769364611229650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Τώρα, εκτελούμε το gource με παράμετρο τον κατάλογο που βρίσκεται ο κώδικας μας (που τηρείται στο subversion) Για παράδειγμα:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;gource ~/Projects/myproject&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Το gource θα μας εμφανίσει ένα video που δείχνει σε εντυπωσιακή μορφή  την εξέλιξη των commits στους κώδικες καθώς και τους commiters.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-sKOJz106FGM/TmDocJOWFFI/AAAAAAAABY0/gfAgpDsF9mM/s1600/Screenshot.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 247px;" src="http://1.bp.blogspot.com/-sKOJz106FGM/TmDocJOWFFI/AAAAAAAABY0/gfAgpDsF9mM/s320/Screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5647769502932669522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-5549402725781505933?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/5549402725781505933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=5549402725781505933' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5549402725781505933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5549402725781505933'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/09/visualization-subversion-gource.html' title='Οπτικοποίηση (visualization) εξέλιξης έργου στο Subversion με το gource'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-PXsanRGbZNY/TmDoUF78Z9I/AAAAAAAABYs/v6cQvWt48WU/s72-c/Screenshot2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-8307657223840671613</id><published>2011-08-25T16:01:00.001+03:00</published><updated>2011-08-25T16:01:56.813+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>Μετατροπές του ADF ClobDomain σε java.lang.String</title><content type='html'>Σε περίπτωση που θέλουμε να χειριστούμε αντικείμενα τύπου&lt;span style="font-family: monospace;"&gt; oracle.jbo.domain.ClobDomain&lt;/span&gt; στο επίπεδο του ADF BC ώστε να μετατρέψουμε από ή σε τύπο &lt;span style="font-family: monospace;"&gt;java.lang.String&lt;/span&gt;, τα πράγματα έχουν ως εξής:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;αρχικοποίηση ClobDomain από String: &lt;span style="font-family: monospace;"&gt;ClobDomain c = new ClobDomain("string");&lt;/span&gt;&lt;/li&gt;&lt;li&gt;αποθήκευση ClobDomain σε μορφή String: &lt;span style="font-family: monospace;"&gt;String s = c.toString();&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Για την απεικόνιση σε μια σελίδα ADF μπορείτε να ανατρέξετε στο: &lt;a href="http://jobinesh.blogspot.com/2011/04/converter-for-clobdomain.html"&gt;http://jobinesh.blogspot.com/2011/04/converter-for-clobdomain.html&lt;/a&gt;&lt;a href="http://jobinesh.blogspot.com/2011/04/converter-for-clobdomain.html"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-8307657223840671613?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/8307657223840671613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=8307657223840671613' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/8307657223840671613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/8307657223840671613'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/08/adf-clobdomain-javalangstring.html' title='Μετατροπές του ADF ClobDomain σε java.lang.String'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-8007660988908618849</id><published>2011-08-19T16:09:00.000+03:00</published><updated>2012-01-05T15:51:24.758+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle DB'/><title type='text'>Εκτέλεση εντολών της SQL*Plus από Linux shell</title><content type='html'>Ο πιο συνηθισμένος τρόπος να τρέχουμε εντολές της SQL*Plus μέσα από     ένα Linux script είναι να τις συμπεριλάβουμε σε ένα αρχείο, το οποίο     θα περάσουμε ως παράμετρο εκτέλεσης του προγράμματος sqlplus. Για     παράδειγμα:&lt;br /&gt;   &lt;br /&gt;    &lt;span style="font-family: monospace;"&gt;sqlplus userid/pwd       @myscript.sql&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;    όπως άλλωστε αναφέρεται &lt;a href="http://download.oracle.com/docs/cd/B14117_01/server.101/b12170/ch6.htm"&gt;εδώ&lt;/a&gt;.     Ίσως η δημιουργία ενός sql script αρχείου είναι καλή αν έχουμε να     κάνουμε με ένα μεγάλο σύνολο εντολών, αλλά εξίσου ελκυστική είναι η     ιδέα της απευθείας παράθεσης των SQL εντολών που θα εκτελεστούν μέσα     από μια ανακατεύθυνση εισόδου στο Linux shell. Για παράδειγμα:&lt;br /&gt;   &lt;br /&gt;    &lt;span style="font-family: monospace;"&gt;sqlplus userid/pwd &amp;lt;&amp;lt;       SCRIPT&lt;/span&gt;&lt;br /&gt;     &lt;span style="font-family: monospace;"&gt;whenever sqlerror exit       SQL.SQLCODE;&lt;/span&gt;&lt;br /&gt;     &lt;span style="font-family: monospace;"&gt;drop user dummy_user;&lt;/span&gt;&lt;br /&gt;     &lt;span style="font-family: monospace;"&gt;create table ... ;&lt;/span&gt;&lt;br /&gt;     &lt;span style="font-family: monospace;"&gt;SCRIPT&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;    H έκφραση SCRIPT ορίζει μια ανακατεύθυνση εισόδου που θα επεκταθεί     σε πολλαπλές γραμμές ή αλλιώς σε πολλαπλές SQL εντολές στην     περίπτωσή μας.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-8007660988908618849?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/8007660988908618849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=8007660988908618849' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/8007660988908618849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/8007660988908618849'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/08/sqlplus-linux-shell.html' title='Εκτέλεση εντολών της SQL*Plus από Linux shell'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-3110374415685688290</id><published>2011-08-17T16:44:00.001+03:00</published><updated>2011-08-18T10:51:28.486+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Developer'/><title type='text'>Τρέχοντας scripts στον SQL Developer χωρίς προβλήματα με ampersand (&amp;)</title><content type='html'>Αν δοκιμάσουμε να τρέξουμε ένα script ή μια SQL εντολή στον SQL  Developer που όμως περιέχει τον χαρακτήρα ampersand ('&amp;amp;'), θα  βρεθούμε αντιμέτωποι με το ακόλουθο μήνυμα :&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-DHDUOHcq75E/TkvFxqO1SkI/AAAAAAAABYk/_WZjXtYBBao/s1600/Screenshot-Enter%2BSubstitution%2BVariable.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 278px; height: 144px;" src="http://1.bp.blogspot.com/-DHDUOHcq75E/TkvFxqO1SkI/AAAAAAAABYk/_WZjXtYBBao/s320/Screenshot-Enter%2BSubstitution%2BVariable.png" alt="" id="BLOGGER_PHOTO_ID_5641820415152441922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Αυτό προκύπτει από το γεγονός πως η εντολή ερμηνεύτηκε πως περιέχει μια  μεταβλητή προς αντικατάσταση, οπότε ο SQL Developer μας ζητά την τιμή  της. Προκειμένου να αποφύγουμε αυτή τη συμπεριφορά, μπορούμε να  χρησιμοποιήσουμε μια από τις set εντολές της SQL*Plus (&lt;a href="http://ss64.com/ora/syntax-sqlplus-set.html"&gt;http://ss64.com/ora/syntax-sqlplus-set.html&lt;/a&gt;), που επίσης είναι εφαρμόσιμες στον SQL Developer:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;set scan off&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ώστε ο χαρακτήρας να ερμηνευτεί σωστά ως έχει και να μην αντικατασταθεί.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-3110374415685688290?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/3110374415685688290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=3110374415685688290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3110374415685688290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3110374415685688290'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/08/scripts-sql-developer-ampersand.html' title='Τρέχοντας scripts στον SQL Developer χωρίς προβλήματα με ampersand (&amp;)'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-DHDUOHcq75E/TkvFxqO1SkI/AAAAAAAABYk/_WZjXtYBBao/s72-c/Screenshot-Enter%2BSubstitution%2BVariable.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-4738095980123873146</id><published>2011-08-16T15:52:00.003+03:00</published><updated>2011-08-19T15:03:28.040+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='openSuSE'/><title type='text'>Εφαρμογή των τελευταίων εκδόσεων Firefox, Adobe Flash, Seamonkey και LibreOffice στο openSuSE 11.2</title><content type='html'>Στο παρελθόν είχαμε μιλήσει για την εγκατάσταση του LibreOffice στο     openSuSE 11.2 (&lt;a href="http://serafeimk.blogspot.com/2011/05/libreoffice-opensuse-112.html"&gt;http://serafeimk.blogspot.com/2011/05/libreoffice-opensuse-112.html&lt;/a&gt;)     για το οποίο η επίσημη υποστήριξη για αναβαθμίσεις έχει λήξει στις     12 Μαΐου του 2011. Παρόλο που από συστημική άποψη το project &lt;a href="http://en.opensuse.org/openSUSE:Evergreen"&gt;Evergreen&lt;/a&gt;     προσπαθεί να διατηρήσει το λειτουργικό σύστημα ενημερωμένο σύμφωνα     με τα τελευταία σημαντικά patches ή προγράμματα, το ίδιο δεν     συμβαίνει με νεώτερες εκδοχές εφαρμογών τρίτων κατασκευαστών, όπως     για παράδειγμα της Mozilla ή του LibreOffice. Σε αυτό το άρθρο θα     περιγράψω τις ενέργειες που χρειάζονται ώστε να ενημερωθεί το     σύστημα για να κάνει χρήση των τελευταίων εκδόσεων των εφαρμογών     αυτών, ειδικά για 64-bit αρχιτεκτονικές. Η προσέγγιση που έχω     ακολουθήσει είναι συνδυαστική της χρήσης YUM repositories και     απευθείας download από τα sites των επιμέρους εφαρμογών. Έχω     διαπιστώσει πως σε μερικές περιπτώσεις τα repositories μπορούν να     προκαλέσουν προβλήματα στο σύστημα, οπότε προκρίνεται η λύση του     απευθείας download και install.&lt;br /&gt;&lt;br /&gt;  &lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Αναβάθμιση σε Firefox 5.0.1&lt;/span&gt;         ενώ η επίσημη έκδοση στο openSuSE 11.2 είναι η σειρά 3.6.*.         Κατεβάζουμε το κατάλληλο αρχείο από το server του Mozilla για         την αρχιτεκτονική μας. Για παράδειγμα από εδώ: &lt;a href="http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-5.0/linux-x86_64/"&gt;http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-5.0/linux-x86_64/&lt;/a&gt;         To κάνουμε unzip σε ένα δικό μας directory (πχ κάτω από το &lt;span style="font-family:monospace;"&gt;/opt&lt;/span&gt;) Έπειτα,         φτιάχνουμε ένα link για τα υφιστάμενα plugin-ins του συστήματός         μας:&lt;/li&gt;&lt;/ul&gt;     &lt;span style="font-family:monospace;"&gt;ln -s       /usr/lib64/browser-plugins /opt/firefox/plugins&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  με αυτόν τον τρόπο τα βασικά plugins (Java, Adobe Flash) λειτουργούν     και στην νέα μας έκδοση. Τέλος, φτιάχνουμε και το link στο     executable του Firefox:&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-family:monospace;"&gt;unlink /usr/bin/firefox&lt;/span&gt;&lt;br /&gt;    &lt;span style="font-family:monospace;"&gt;ln -s /opt/firefox/firefox       /usr/bin/firefox&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Εφαρμογή του τελευταίου Adobe           Flash plugin (πχ 11 Beta για Linux 64)&lt;/span&gt; Καταρχήν το         κατεβάζουμε από την διεύθυνση&lt;a href="http://labs.adobe.com/downloads/flashplayer11.html"&gt;           http://labs.adobe.com/downloads/flashplayer11.html&lt;/a&gt;.         Κάνουμε unzip το αρχείο σε ένα φάκελο της επιλογής μας και         αντιγράφουμε το &lt;span style="font-family:monospace;"&gt;libflashplayer.so&lt;/span&gt;         στον κατάλογο &lt;span style="font-family:monospace;"&gt;/usr/lib64/browser-plugins&lt;/span&gt;.         Ξεκινούμε τον Firefox και απενεργοποιούμε το παλαιό (10.3)         plugin και ενεργοποιούμε το νεώτερο.&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://1.bp.blogspot.com/-yVaMILL57Vc/TkpoMnXWWuI/AAAAAAAABYc/wIENdfkWv8s/s1600/Screenshot-2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 113px;" src="http://1.bp.blogspot.com/-yVaMILL57Vc/TkpoMnXWWuI/AAAAAAAABYc/wIENdfkWv8s/s320/Screenshot-2.png" alt="" id="BLOGGER_PHOTO_ID_5641436049169603298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Αναβάθμιση του Seamonkey από           την βασική έκδοση 2.0.14&lt;/span&gt; (το οποίο χρησιμοποιώ για την         email αλληλογραφία και τον απλό HTML editor του). Αντίστοιχα με         τον Firefox, κατεβάζουμε την τελευταία έκδοση από το &lt;a href="http://www.seamonkey-project.org/releases/"&gt;http://www.seamonkey-project.org/releases/&lt;/a&gt;.         Στο κάτω μέρος της σελίδας υπάρχει link για την αρχιτεκτονική         των 64-bit. Παρομοίως, το κάνουμε unzip στον κατάλογο &lt;span style="font-family:monospace;"&gt;/opt&lt;/span&gt; και επίσης         ανανεώνουμε το symbolic link.&lt;/li&gt;&lt;/ul&gt;     &lt;span style="font-family:monospace;"&gt;unlink /usr/bin/seamonkey&lt;/span&gt;&lt;br /&gt;    &lt;span style="font-family: monospace;"&gt;ln -s /opt/seamonkey/seamonkey       /usr/bin/seamonkey&lt;br /&gt;   &lt;br /&gt;&lt;/span&gt;     &lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Αναβάθμιση στην τελευταία           έκδοση του LibreOffice&lt;/span&gt;. Εδώ είμαστε τυχεροί, μιας και         υπάρχει ένα unstable repository για το 11.2 στην τοποθεσία &lt;a href="http://download.opensuse.org/repositories/LibreOffice:/Unstable/openSUSE_Evergreen_11.2/"&gt;http://download.opensuse.org/repositories/LibreOffice:/Unstable/openSUSE_Evergreen_11.2/&lt;/a&gt;         που σήμερα περιλαμβάνει την έκδοση 3.4.2. Επιλέγουμε λοιπόν τα         κατάλληλα πακέτα για αναβάθμιση.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-4738095980123873146?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/4738095980123873146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=4738095980123873146' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4738095980123873146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4738095980123873146'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/08/firefox-adobe-flash-seamonkey.html' title='Εφαρμογή των τελευταίων εκδόσεων Firefox, Adobe Flash, Seamonkey και LibreOffice στο openSuSE 11.2'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-yVaMILL57Vc/TkpoMnXWWuI/AAAAAAAABYc/wIENdfkWv8s/s72-c/Screenshot-2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-7374486485851192549</id><published>2011-08-12T00:01:00.001+03:00</published><updated>2012-01-05T15:51:24.758+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle SOA Suite'/><category scheme='http://www.blogger.com/atom/ns#' term='weblogic'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle DB'/><title type='text'>Συνεργασία ομάδων (teamwork) στο Oracle SOA</title><content type='html'>Στο έργο που ασχολούμαι αυτόν τον καιρό, η επικοινωνία μεταξύ Oracle ADF (επίπεδο εφαρμογής) και Oracle SOA/BPM Suite (επίπεδο ροών εργασίας και διασύνδεσης) γίνεται διαμέσου business events και του Event Delivery Network (EDN). Παρόλο που το ADF το ίδιο παρέχει άμεση συνδεσιμότητα με τα business events, η υλοποίηση που έχουμε ακολουθήσει ξεκινάει τα γεγονότα από PL/SQL packages. Υπάρχουν διάφορα πλεονεκτήματα σε αυτό:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Τα business events στο ADF προέρχονται αποκλειστικά από entities&lt;br /&gt; &lt;/li&gt;&lt;li&gt;Ως συνέπεια του παραπάνω είναι δύσκολο να "κουβαλήσουν" συνδυαστικά attributes, υπολογιζόμενα ή από άλλες οντότητες&lt;/li&gt;&lt;li&gt;Τα namespaces των business events είναι άμεσα συνδεδεμένα με το packaging των ADF entities, γεγονός που δεν είναι πολύ κομψό είτε για λόγους refactoring είτε για reusability από άλλες πηγές πληροφορίας&lt;/li&gt;&lt;li&gt;Ενεργοποιώντας τα business events σε PL/SQL, μπορούμε να ξεκινήσουμε ροές απευθείας από τον embedded Weblogic του JDeveloper, διαφορετικά θα χρειαστεί να "πειράξουμε" τον embedded Weblogic ώστε να περιλαμβάνει τις SOA βιβλιοθήκες&lt;/li&gt;&lt;/ul&gt; Έχουμε αναφέρει στο παρελθόν (&lt;a href="http://serafeimk.blogspot.com/2011/03/testing-business-events-oracle-soa.html"&gt;http://serafeimk.blogspot.com/2011/03/testing-business-events-oracle-soa.html&lt;/a&gt;) το πώς μπορούμε να ξεκινήσουμε ένα business event από PL/SQL. Στις διαστάσεις ενός ομαδικού development, όπου ο καθένας προγραμματιστής διαθέτει τον δικό του SOA Server ώστε να κάνει έλεγχο των ροών, αλλά από την άλλη μοιράζεται ένα κοινό σχήμα βάσης δεδομένων για τα στοιχεία της εφαρμογής, αυτό αποτελεί πρόκληση: η συνάρτηση &lt;span style="font-family:monospace;"&gt;edn_publish_event() &lt;/span&gt;βρίσκεται σε κάθε ένα SOAINFRA σχήμα και θα πρέπει να καλεστεί κατάλληλα (ανάλογα με την ταυτότητα του ενεργού χρήστη/προγραμματιστή) από το μοναδικό, ενιαίο σχεσιακό σχήμα της εφαρμογής. Για να αντιμετωπίσουμε αυτό το ζήτημα θα χρειαστούμε μερικές ρυθμίσεις στην PL/SQL καθώς και στον Weblogic.&lt;br /&gt;&lt;br /&gt;Από την πλευρά της PL/SQL θα πρέπει τα διάφορα SOAINFRA σχήματα να επιτρέψουν την εκτέλεση της συνάρτησης &lt;span style="font-family:monospace;"&gt;edn_publish_event()&lt;/span&gt; στο κύριο σχήμα της εφαρμογής (πχ app_schema)&lt;br /&gt; &lt;span style="font-family:monospace;"&gt;grant execute on edn_publish_event to app_schema;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Έπειτα στο σχεσιακό μας σχήμα και στην PL/SQL που θα ξεκινήσει το business event, θα γράψουμε μια δυναμική SQL ώστε να προσδιορίσουμε το SOA σχήμα στο οποίο θα καταλήξει το event. Για να διακρίνουμε τους χρήστες/προγραμματιστές μας ως προς τα σχήματα που χρησιμοποιούν θα χρησιμοποιήσουμε το package &lt;span style="font-weight: bold;"&gt;DBMS_APPLICATION_INFO&lt;/span&gt; (&lt;a href="http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_appinf.htm"&gt;http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_appinf.htm&lt;/a&gt;) το οποίο μπορεί να κουβαλήσει σε κάθε session μια εξτρα πληροφορία, ορατή από το v$session, που μπορούμε αυθαίρετα να ορίσουμε. Έτσι λοιπόν, μπορούμε να γράψουμε κάτι σαν το εξής:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;l_soa_schema VARCHAR2(32);&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;...&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;dbms_application_info.read_client_info(l_soa_schema);&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;execute immediate 'begin ' || l_soa_schema || '.edn_publish_event(...';&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Αυτό που απομένει είναι τώρα η αρχικοποίηση του client info. Έχοντας την αντιστοίχηση του κάθε ενός προγραμματιστή με ένα SOA σχήμα, μπορούμε να χρησιμοποιήσουμε τη δυνατότητα εκτέλεσης μιας εντολής SQL σε κάθε άνοιγμα νεάς σύνδεσης στο Weblogic. Έτσι, για παράδειγμα μπορούμε να ορίσουμε ως SQL την αρχικοποίηση του session metadata για το τρίτο σχήμα του SOA.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;SQL BEGIN DBMS_APPLICATION_INFO.SET_CLIENT_INFO('DEV03_SOAINFRA'); END;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://4.bp.blogspot.com/-MprLW2VYk78/TkRDbPONW6I/AAAAAAAABXI/ZIDiqJhYyhs/s1600/Screenshot-Settings%2Bfor%2Bigp%2B-%2Bintralot_domain%2B-%2BWLS%2BConsole%2B-%2BMozilla%2BFirefox.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/-MprLW2VYk78/TkRDbPONW6I/AAAAAAAABXI/ZIDiqJhYyhs/s320/Screenshot-Settings%2Bfor%2Bigp%2B-%2Bintralot_domain%2B-%2BWLS%2BConsole%2B-%2BMozilla%2BFirefox.png" alt="" id="BLOGGER_PHOTO_ID_5639706768596360098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Συνεπώς οποιαδήποτε νέα σύνδεση που ξεκινά από αυτό το connection pool θα έχει το αναγνωριστικό 'DEV03_SOAINFRA' που θα αξιοποιηθεί από την PL/SQL για την εκκίνηση του business event στον κατάλληλο SOA Server.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-7374486485851192549?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/7374486485851192549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=7374486485851192549' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7374486485851192549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7374486485851192549'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/08/teamwork-oracle-soa.html' title='Συνεργασία ομάδων (teamwork) στο Oracle SOA'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-MprLW2VYk78/TkRDbPONW6I/AAAAAAAABXI/ZIDiqJhYyhs/s72-c/Screenshot-Settings%2Bfor%2Bigp%2B-%2Bintralot_domain%2B-%2BWLS%2BConsole%2B-%2BMozilla%2BFirefox.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-7944567649448004483</id><published>2011-08-05T16:27:00.002+03:00</published><updated>2011-08-05T16:30:44.368+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>Ανάλυση XML αρχείων στο Linux</title><content type='html'>Είχα αναφερθεί στο παρελθόν (&lt;a href="http://serafeimk.blogspot.com/2010/12/xml-metadata-adf.html"&gt;http://serafeimk.blogspot.com/2010/12/xml-metadata-adf.html&lt;/a&gt;) στην κατασκευή ενός database repository που θα αποθηκεύει τη δομή μιας ADF εφαρμογής (entities, view object XMLs, σελίδες JSPX, κοκ) ώστε να γίνει αντικείμενο ανάλυσης με κατάλληλα σχεσιακά SQL ερωτήματα. Μια άλλη προσέγγιση (πιο απλή αλλά και κατά περίπτωση πιο περιοριστική) στο ίδιο αντικείμενο έχει να κάνει με απευθείας πρόσβαση στα XML αρχεία μέσα από το σύστημα αρχείων και άμεση επεξεργασία τους. Με μεγάλη μου χαρά διαπίστωσα πως το Linux υπάρχουν διάφορα command-line εργαλεία που επεξεργάζονται αποτελεσματικά την XML. Όλα αυτά μου φέρνουν στο μυαλό το κεφάλαιο του &lt;a href="http://www.spinellis.gr/"&gt;Διομήδη Σπινέλλη&lt;/a&gt; με τίτλο "The UNIX Tools Are Your Friends" στο βιβλίο &lt;a href="http://programmer.97things.oreilly.com/wiki/index.php/97_Things_Every_Programmer_Should_Know"&gt;"97 Things  Every Programmer Should Know"&lt;/a&gt; της O' Reilly, άποψη που φυσικά με βρίσκει απόλυτα σύμφωνο.&lt;br /&gt;&lt;br /&gt;Ένα από αυτά τα εργαλεία που χρησιμοποίησα λοιπόν είναι το XMLStarlet (&lt;a href="http://xmlstar.sourceforge.net/"&gt;http://xmlstar.sourceforge.net/&lt;/a&gt;) που επιτρέπει την κατασκευή, διόρθωση, επικύρωση ή αναζήτηση κειμένου σε XML αρχεία και που βρίσκεται στα αποθετήρια τόσο του Ubuntu όσο και του openSuSE. Για παράδειγμα, έστω πως όλα τα command toolbar button μας υποχρεωτικά έχουν εικονίδιο (icon) Θέλοντας να βρούμε τις σελίδες ADF στις οποίες παραβιάζεται αυτός ο κανόνας, αρκεί να γράψουμε:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;find . -type f -name "*.js??"| xargs xmlstarlet sel -N af="http://xmlns.oracle.com/adf/faces/rich" -t -m "//af:commandToolbarButton[not(@icon)]" -n -f | sort | uniq&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Τέτοιου είδους ερωτήματα μπορούν να φτιαχτούν πολύ εύκολα με τη βοήθεια του XMLStarlet και να αποτελέσουν αντικείμενο ανάλυσης ή αυτοματοποιημένης εκτέλεσης μέσω build scripts. Ενδιαφέρον επίσης εργαλείο είναι το xmllint (&lt;a href="http://xmlsoft.org/xmllint.html"&gt;http://xmlsoft.org/xmllint.html&lt;/a&gt;) που διαθέτει και ένα interactive shell ώστε να επεξεργαστούμε τα αρχεία μας.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-7944567649448004483?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/7944567649448004483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=7944567649448004483' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7944567649448004483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7944567649448004483'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/08/xml-linux.html' title='Ανάλυση XML αρχείων στο Linux'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-3191643382397886443</id><published>2011-08-03T23:00:00.001+03:00</published><updated>2011-08-03T23:01:59.901+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><title type='text'>Blocking του Flash στον Firefox</title><content type='html'>Πολλά έχουν γραφεί για την υποστήριξη του Flash στο Linux και ειδικά στα 64-bit συστήματα. Η αλήθεια είναι πως ακόμα και σήμερα η υποστήριξη που προσφέρει η Adobe απέχει από το να είναι ικανοποιητική ενώ υπάρχουν φορές (αν και σπάνιες) που ο Firefox μου κόλλαγε στις σελίδες με έντονο Flash με αποτέλεσμα να "παγώνει" συνολικά το σύστημα.&lt;br /&gt;&lt;br /&gt;Πρόσφατα πήρα την απόφαση να εμποδίσω την αυτόματη εκτέλεση του Flash στις σελίδες που επισκέπτομαι με τον Firefox. Γι' αυτό το λόγο υπάρχει ένα ειδικό πρόσθετο, το Flashblock (&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/flashblock/"&gt;https://addons.mozilla.org/en-US/firefox/addon/flashblock/&lt;/a&gt;) που αποτρέπει την εκτέλεση στοιχείων Flash σε μια σελίδα, παρουσιάζοντας μας ενδείξεις για αυτά τα στοιχεία, ώστε να τα ενεργοποιήσουμε επιλεκτικά.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-5lYIfN5kMqw/TjmpCDNsFEI/AAAAAAAABW4/FuxogNLXIM0/s1600/flashblock2.png"&gt;&lt;img style="cursor: pointer; width: 201px; height: 164px;" src="http://4.bp.blogspot.com/-5lYIfN5kMqw/TjmpCDNsFEI/AAAAAAAABW4/FuxogNLXIM0/s320/flashblock2.png" alt="" id="BLOGGER_PHOTO_ID_5636722261318440002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Η επιτάχυνση της περιήγησης στο Web είναι κάτι παραπάνω από εμφανής. Υπάρχουν όμως και sites, όπως για παράδειγμα το Oracle Metalink, που απαιτούν την παρουσία Flash προκειμένου να τα χρησιμοποιήσουμε. Το Flashblock διαθέτει την κατάλληλη επιλογή ώστε να μην είναι ενεργό σε τέτοιου είδους περιπτώσεις.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-z45iR83_4YQ/TjmpIycrG3I/AAAAAAAABXA/mUmfEzbn8nU/s1600/Screenshot-Flashblock%2BOptions.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 268px;" src="http://2.bp.blogspot.com/-z45iR83_4YQ/TjmpIycrG3I/AAAAAAAABXA/mUmfEzbn8nU/s320/Screenshot-Flashblock%2BOptions.png" alt="" id="BLOGGER_PHOTO_ID_5636722377076972402" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-3191643382397886443?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/3191643382397886443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=3191643382397886443' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3191643382397886443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3191643382397886443'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/08/blocking-flash-firefox.html' title='Blocking του Flash στον Firefox'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-5lYIfN5kMqw/TjmpCDNsFEI/AAAAAAAABW4/FuxogNLXIM0/s72-c/flashblock2.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-1567537102677615062</id><published>2011-07-30T15:44:00.002+03:00</published><updated>2011-07-30T15:50:22.191+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>ADF ΑΝΤ scripts και MDS</title><content type='html'>Σε αυτό το άρθρο θα περιγράψω τα απαραίτητα βήματα προκειμένου να γίνει το deploy μιας ADF εφαρμογής, διαμέσου ANT scripts, ώστε παράλληλα να υπάρξει εκμετάλλευση του MDS για την καλύτερη εξατομίκευση (personalization) της εμπειρίας των χρηστών. Υπάρχουν διάφορα σημεία που περιγράφουν το MDS καθώς και οδηγίες ως προς το JDeveloper και το deployment του (&lt;a href="http://download.oracle.com/docs/cd/E21764_01/web.1111/b31974/ad_persist.htm#CIHHEHCF"&gt;http://download.oracle.com/docs/cd/E21764_01/web.1111/b31974/ad_persist.htm#CIHHEHCF&lt;/a&gt;) αλλά όχι από την σκοπιά  customized ΑΝΤ scripts. Τα παρακάτω βήματα έχουν δοκιμαστεί στην έκδοση 11.1.1.4 του ADF.&lt;br /&gt;&lt;br /&gt;Στο &lt;span style="font-family: monospace;"&gt;web.xml&lt;/span&gt; του deployment unit μας θα χρειαστεί να έχουμε τις ακόλουθες γραμμές:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&amp;lt;context-param&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;param-name&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;org.apache.myfaces.trinidad.CHANGE_PERSISTENCE&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/param-name&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;param-value&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;oracle.adf.view.rich.change.FilteredPersistenceChangeManager&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/param-value&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/context-param&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;context-param&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;param-name&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;oracle.adf.jsp.provider.0&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/param-name&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;param-value&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;oracle.mds.jsp.MDSJSPProviderHelper&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/param-value&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/context-param&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ενώ στο &lt;span style="font-family: monospace;"&gt;adf-config.xml&lt;/span&gt; επισυνάπτουμε κάτι σαν το ακόλουθο (τα πιο σημαντικά σημεία είναι σε &lt;span style="font-weight: bold;"&gt;έντονη&lt;/span&gt; γραφή):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;  &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;adf-faces-config xmlns="http://xmlns.oracle.com/adf/faces/config"&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;      &lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-weight: bold;"&gt;persistent-change-manager&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace; font-weight: bold;"&gt;      &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace; font-weight: bold;"&gt;persistent-change-manager-class&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace; font-weight: bold;"&gt;        oracle.adf.view.rich.change.MDSDocumentChangeManager&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace; font-weight: bold;"&gt;      &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace; font-weight: bold;"&gt;/persistent-change-manager-class&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace; font-weight: bold;"&gt;    &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace; font-weight: bold;"&gt;/persistent-change-manager&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;    &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;taglib-config&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;      &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;taglib uri="http://xmlns.oracle.com/adf/faces/rich"&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;tag name="column"&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;          &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;attribute name="displayIndex"&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;            &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;persist-changes&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;              true&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;            &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/persist-changes&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;          &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/attribute&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;          &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;attribute name="visible"&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;            &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;persist-changes&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;              true&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;            &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/persist-changes&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;          &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/attribute&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;          &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;attribute name="width"&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;            &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;persist-changes&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;              true&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;            &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/persist-changes&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;          &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/attribute&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/tag&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;      &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/taglib&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;    &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/taglib-config&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;  &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/adf-faces-config&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;  &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;adf-mds-config xmlns="http://xmlns.oracle.com/adf/mds/config"&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;    &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;mds-config xmlns="http://xmlns.oracle.com/mds/config" version="11.1.1.000"&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;      &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;cust-config&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;match path="/"&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt; &lt;span style="font-weight: bold;"&gt;         &lt;/span&gt;&lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-weight: bold;"&gt;customization-class name="oracle.adf.share.config.ADFUserCC"/&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/match&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;      &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/cust-config&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;      &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;persistence-config&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;metadata-namespaces&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;          &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;namespace metadata-store-usage="mdsstore" path="/persdef"/&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/metadata-namespaces&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;metadata-store-usages&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace; font-weight: bold;"&gt;          &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace; font-weight: bold;"&gt;metadata-store-usage id="mdsstore" default-cust-store="true" deploy-target="true"&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace; font-weight: bold;"&gt;            &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace; font-weight: bold;"&gt;metadata-store class-name="oracle.mds.persistence.stores.db.DBMetadataStore"&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace; font-weight: bold;"&gt;              &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace; font-weight: bold;"&gt;property name="repository-name" value="@mds.repository@" /&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace; font-weight: bold;"&gt;              &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace; font-weight: bold;"&gt;property name="jndi-datasource" value="@mds.ds@" /&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace; font-weight: bold;"&gt;              &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace; font-weight: bold;"&gt;property name="partition-name" value="@mds.partition@" /&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace; font-weight: bold;"&gt;            &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace; font-weight: bold;"&gt;/metadata-store&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace; font-weight: bold;"&gt;          &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace; font-weight: bold;"&gt;/metadata-store-usage&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/metadata-store-usages&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;      &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/persistence-config&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;    &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/mds-config&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;  &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/adf-mds-config&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Έτσι ορίζουμε για ποια components θα χρειαστούμε τις υπηρεσίες του MDS (πχ για το column στο συγκεκριμένο παράδειγμα) Λίγο παρακάτω, προσδιορίζουμε τις πληροφορίες σύνδεσης με το MDS repository, το οποίο φυσικά ήδη έχουμε κάνει register στον Weblogic Server με κάποιο όνομα (repository-name) και με κάποιο jndi datasource. Το partition-name μπορεί να είναι κάτι αυθαίρετο, που θα κατασκευαστεί πρώτη φορά με το deployment της εφαρμογής. Αν πρόκειται να χρησιμοποιήσουμε ένα file-based repository τότε θα έπρεπε να ορίσουμε τις αντίστοιχες γραμμές ως εξής:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;            &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;metadata-store class-name="oracle.mds.persistence.stores.file.FileMetadataStore"&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;              &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;property name="repository-name" value="@mds.repository@" /&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;              &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;property name="partition-name" value="@mds.partition@" /&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;              &lt;/span&gt; &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;property name="metadata-path" value="@mds.directory@" /&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Τα ANT scripts που έχω κατασκευάσει, φροντίζουν να περάσουν όλες τις κατάλληλες παραμέτρους στο mds.repository, mds.ds και mds.partition σύμφωνα με το περιβάλλον προορισμού (πχ development, staging, production)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-1567537102677615062?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/1567537102677615062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=1567537102677615062' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/1567537102677615062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/1567537102677615062'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/07/adf-scripts-mds.html' title='ADF ΑΝΤ scripts και MDS'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-494693092017472256</id><published>2011-07-25T17:00:00.004+03:00</published><updated>2011-07-25T17:03:47.240+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thinkpad'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Κολλήματα στο Thinkpad και η λύση του SysRq</title><content type='html'>Παρόλο που το Linux θεωρείται (και στην πραγματικότητα είναι) αρκετό σταθερό και στιβαρό λειτουργικό, δεν λείπουν οι φορές που το σύστημα κολλάει εντελώς και χρειάζεται reboot. Τέτοιου είδους συμπεριφορά, αν και σπάνια, έχω παρατηρήσει με την αναπαραγωγή Flash video στον Firefox, ή απλά με την αναπαραγωγή videο εν γένει. Παρόλο που το ext4 φροντίζει ώστε να υπάρχει αξιοπιστία στο σύστημα αρχείων μας, ποτέ δεν είναι ευχάριστο να χρειαστεί να πατήσεις το Power button ώστε να ξεκολλήσει το laptop σου.&lt;br /&gt;&lt;br /&gt;Μια πιο "κόσμια" λύση σε αυτές τις ακραίες περιπτώσεις είναι αυτή του kernel interrupt διαμέσου του πλήκτρου SysRq (&lt;a href="http://en.wikipedia.org/wiki/Magic_SysRq_key"&gt;http://en.wikipedia.org/wiki/Magic_SysRq_key&lt;/a&gt;): διαμέσου ενός συνδυασμού πλήκτρων μπορούμε να επανεκκινήσουμε με ασφάλεια το σύστημά μας.  Στο Ubuntu 10.10 (Maverick Meerkat) που χρησιμοποιώ, χρειάστηκε να ακολουθήσω τα ακόλουθα βήματα:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Να προσθέσω την ακόλουθη γραμμή στο αρχείο &lt;span style="font-family:monospace;"&gt;/etc/sysctl.conf&lt;/span&gt;:&lt;/li&gt;&lt;/ol&gt; &lt;span style="font-family:monospace;"&gt;kernel.sysrq = 1&lt;/span&gt;&lt;br /&gt;&lt;ol start="2"&gt;&lt;li&gt;Να αλλάξω το keyboard shortcut για τη λήψη φωτογραφιών (screenshots) σε ένα νέο συνδιασμό πλήκτρων, πχ Ctrl + PrintScreen, ώστε να μην έρχεται σε σύγκρουση με τη λειτουργία του SysRq&lt;/li&gt;&lt;/ol&gt;&lt;a href="http://3.bp.blogspot.com/-sfiv1HQUL_I/Ti13LDl3daI/AAAAAAAABWo/90eVQbHarYQ/s1600/Screenshot-Keyboard%2BShortcuts.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 195px;" src="http://3.bp.blogspot.com/-sfiv1HQUL_I/Ti13LDl3daI/AAAAAAAABWo/90eVQbHarYQ/s320/Screenshot-Keyboard%2BShortcuts.png" alt="" id="BLOGGER_PHOTO_ID_5633289740736755106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;3. Για να ενεργοποιηθεί ο μηχανισμός στο Thinkpad μου, κρατάμε πατημένα τα πλήκτρα Alt + SysRq / PrintScreen, και έπειτα ακολουθούμε την αλληλουχία των πλήκτρων - συμβάντων (πχ R-E-I-S-U-B) που θέλουμε.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-uSLQX9Rxyno/Ti13Ze4FcTI/AAAAAAAABWw/KQdbFMd6fXw/s1600/keyboard.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 220px;" src="http://2.bp.blogspot.com/-uSLQX9Rxyno/Ti13Ze4FcTI/AAAAAAAABWw/KQdbFMd6fXw/s320/keyboard.jpg" alt="" id="BLOGGER_PHOTO_ID_5633289988579094834" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-494693092017472256?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/494693092017472256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=494693092017472256' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/494693092017472256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/494693092017472256'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/07/thinkpad-sysrq.html' title='Κολλήματα στο Thinkpad και η λύση του SysRq'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-sfiv1HQUL_I/Ti13LDl3daI/AAAAAAAABWo/90eVQbHarYQ/s72-c/Screenshot-Keyboard%2BShortcuts.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-4613782325994544374</id><published>2011-07-23T00:30:00.000+03:00</published><updated>2011-09-22T09:17:55.506+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Βιβλία για την Oracle</title><content type='html'>Ένας πρόχειρος κατάλογος βιβλίων σχετικών με τα προϊόντα της Oracle βρίσκεται &lt;a href="http://www.oracle.com/technetwork/community/bookstore/index.html"&gt;εδώ&lt;/a&gt;. Ενώ παλαιότερα υπήρχε μόνο ο εκδοτικός οίκος του &lt;a href="http://community.oraclepressbooks.com/"&gt;Oracle Press&lt;/a&gt; τα τελευταία χρόνια έχουν αναπτύξει δυναμική και άλλες εκδόσεις. Αναμφίβολα ο πιο δραστήριος είναι αυτός της &lt;a href="http://www.packtpub.com/"&gt;Packt Publishing&lt;/a&gt; που προσφέρει ήδη πάνω από 50 τίτλους σε θέματα της Oracle για τους οποίους έχω γράψει συχνά κριτικές. Μάλιστα αυτό τον καιρό τρέχει μια ενδιαφέρουσα εκπτωτική καμπάνια (&lt;span style="font-family:Calibri;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Calibri;"&gt;&lt;a send="true" target="_blank" href="http://www.packtpub.com/article/50th-oracle-book-offer"&gt;http://www.packtpub.com/article/50th-oracle-book-offer&lt;/a&gt;&lt;/span&gt;) για όλους αυτούς τους τίτλους.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-4613782325994544374?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/4613782325994544374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=4613782325994544374' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4613782325994544374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4613782325994544374'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/07/oracle.html' title='Βιβλία για την Oracle'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-361578080837593346</id><published>2011-07-19T17:20:00.004+03:00</published><updated>2012-01-05T15:52:04.119+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle DB'/><title type='text'>Κάνοντας tag κώδικα Java και PL/SQL στο Subversion</title><content type='html'>Δεν είναι λίγα τα Java projects που κάνουν ανάπτυξη και σε PL/SQL κώδικα. Ενώ όμως η τήρηση version control είναι εξαιρετικά απλή υπόθεση στον κόσμο της Java (πχ μέσω του Subversion), το ίδιο δεν ισχύει για την PL/SQL μιας και τα εξειδικευμένα SCM συστήματα είναι είτε εξαιρετικά πολύπλοκα είτε ακριβά. Είτε για λόγους καθημερινού backup, είτε για version tagging και releasing, είναι απαραίτητο να κρατάμε συγχρονισμένους τους κώδικες Java και PL/SQL σε ένα κεντρικό σημείο.&lt;br /&gt;&lt;br /&gt;Ένα χρήσιμο εργαλείο που επιτρέπει την εξαγωγή metadata από μια Oracle βάση δεδομένων είναι το jipes (&lt;a href="http://sourceforge.net/projects/jipes/"&gt;http://sourceforge.net/projects/jipes/&lt;/a&gt;) Πρόκειται για μια Java εφαρμογή που μπορεί να χρησιμοποιηθεί είτε standalone είτε μέσω ενός ANT task ώστε ρωτώντας το dictionary της Oracle, να μπορεί να αποθηκεύσει όλους τους ορισμούς των αντικειμένων ενός σχήματος (πχ πίνακες, indexes, packages, κλπ) σε μια δομή καταλόγων. Ένα παράδειγμα χρήσης:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;java com.jipes.cm.Builder -m export -s jdbc:oracle:thin:@dbserver:1521:ora -sU schema -sP schema_passwd -schema schema&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Μετά θα δημιουργηθούν οι εξής κατάλογοι που θα περιέχουν τα metadata της βάσης μας:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;index/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;package/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;package-body/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;procedure/&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;&lt;br /&gt;table/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;view/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Εξίσου εύκολη και η χρήση του μέσω ANT. Τα αποτελέσματα μπορούν να γίνουν zip και αμέσως μετά commit και tag στο Subversion ώστε να τα σώσουμε μαζί με τους Java κώδικες.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;    &amp;lt;taskdef name="jipes-cm" classname="com.jipes.cm.ant.BuildTask"&amp;gt;&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;      &amp;lt;classpath&amp;gt;&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;        &amp;lt;path location="${project.basedir}/jipes-cm-alldep" /&amp;gt;&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;      &amp;lt;/classpath&amp;gt;&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;    &amp;lt;/taskdef&amp;gt;&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;    &lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;    &amp;lt;jipes-cm buildMode="export" sourceURL="${datasource.url}" sourceUser="${datasource.user}" &lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;        sourcePass="${datasource.pass}" directory="${build.sql.dir}/export" schemaFilter="${datasource.user}"&amp;gt;&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;    &amp;lt;/jipes-cm&amp;gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-361578080837593346?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/361578080837593346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=361578080837593346' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/361578080837593346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/361578080837593346'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/07/tag-java-plsql-subversion.html' title='Κάνοντας tag κώδικα Java και PL/SQL στο Subversion'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-9143060234478453757</id><published>2011-07-13T15:36:00.001+03:00</published><updated>2011-07-13T15:38:29.190+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='weblogic'/><title type='text'>Δημιουργώντας μια shared library που περιλαμβάνει πολλά JARs στον Weblogic</title><content type='html'>Καθώς η ανάπτυξη ενός έργου προχωράει και αντίστοιχα αυξάνεται ο όγκος του, γίνεται πιο επιτακτική η ανάγκη για καλύτερο έλεγχο του deployment process καθώς του κόστους στην απόδοση και την εν γένει λειτουργία των εφαρμογών. Πρόσφατα, για να υποστηρίξουμε μια καινούργια λειτουργικότητα, χρειάστηκε να χρησιμοποιήσουμε αρκετές νέες βιβλιοθήκες, πολλών mega bytes. Προκειμένου να αποφύγουμε ένα πιο αργό deployment, οι νέες βιβλιοθήκες οργανώθηκαν σε ένα Weblogic shared library που βρίσκεται μονίμως εγκατεστημένο στον server, ενώ το footprint της εφαρμογής ως deployment unit παρέμεινε μικρό. Για να το καταφέρουμε αυτό απλά δημιουργούμε την δομή ενός καταλόγου (folder) με τα εξής περιεχόμενα:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;WEB-INF/&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;   &lt;br /&gt;lib/&lt;/span&gt; (εδώ αντιγράφουμε τα JARs που χρειαζόμαστε)&lt;br /&gt;&lt;br /&gt;Έπειτα δημιουργούμε ένα WAR (πχ mylib.war) από αυτά τα στοιχεία:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;jar cvf mylib.war &amp;lt;τοποθεσία καταλόγου&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Όταν θα κάνουμε deployment αυτό το αρχείο στον Weblogic, θα πρέπει να φροντίσουμε να το δηλώσουμε ως library.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-WABAsUSIV-k/Th2Riwe8TVI/AAAAAAAABWM/-4kL0Yd5dSg/s1600/Screenshot-Install%2BApplication%2BAssistant%2B-%2Bintralot_domain%2B-%2BWLS%2BConsole%2B-%2BMozilla%2BFirefox.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 84px;" src="http://3.bp.blogspot.com/-WABAsUSIV-k/Th2Riwe8TVI/AAAAAAAABWM/-4kL0Yd5dSg/s320/Screenshot-Install%2BApplication%2BAssistant%2B-%2Bintralot_domain%2B-%2BWLS%2BConsole%2B-%2BMozilla%2BFirefox.png" alt="" id="BLOGGER_PHOTO_ID_5628815135599250770" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Από εκεί και πέρα, στις εφαρμογές μας, και πιο συγκεκριμένα στους deployment descriptors (&lt;span style="font-family:monospace;"&gt;weblogic.xml&lt;/span&gt; ή &lt;span style="font-family:monospace;"&gt;weblogic-application.xml&lt;/span&gt; αναλόγως) δηλώνουμε τη συσχέτιση με την νέα μας βιβλιοθήκη:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;library-ref&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;    &amp;lt;library-name&amp;gt;mylib&amp;gt;/library-name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;/library-ref&amp;gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-9143060234478453757?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/9143060234478453757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=9143060234478453757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/9143060234478453757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/9143060234478453757'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/07/shared-library-jars-weblogic.html' title='Δημιουργώντας μια shared library που περιλαμβάνει πολλά JARs στον Weblogic'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-WABAsUSIV-k/Th2Riwe8TVI/AAAAAAAABWM/-4kL0Yd5dSg/s72-c/Screenshot-Install%2BApplication%2BAssistant%2B-%2Bintralot_domain%2B-%2BWLS%2BConsole%2B-%2BMozilla%2BFirefox.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-4646806231119764801</id><published>2011-07-07T12:16:00.001+03:00</published><updated>2011-07-07T15:31:32.522+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jdeveloper'/><title type='text'>Ένα μικρό tip για editing Java αρχείων στο JDeveloper</title><content type='html'>Όταν επεξεργαζόμαστε μια Java κλάση στον JDeveloper και βρισκόμαστε στην αρχή ή στο τέλος ενός block εντολών που χρησιμοποιούν αγκύλες ({}), τότε μπορούμε με την συντόμευση πληκτρολογίου (keyboard shortcut) "Alt + [" και "Alt + ]" να μεταφερθούμε στην αρχή ή το τέλος του block αντίστοιχα. Μια τέτοια λειτουργία είναι πολύ χρήσιμη σε πολύπλοκες ή εκτενείς δομές διάρθωσης κώδικα. Δυστυχώς, κάτι ανάλογα απουσιάζει στις JSP σελίδες ώστε να μεταφερόμαστε γρήγορα στο starting και το closing tag.&lt;br /&gt;&lt;br /&gt;Πολλά ευχαριστώ στον Γιάννη (&lt;a href="http://www.tses.gr"&gt;http://www.tses.gr&lt;/a&gt;) για την υπόδειξη.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-4646806231119764801?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/4646806231119764801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=4646806231119764801' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4646806231119764801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4646806231119764801'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/07/tip-editing-java-jdeveloper.html' title='Ένα μικρό tip για editing Java αρχείων στο JDeveloper'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-1788050582000103860</id><published>2011-07-04T11:38:00.002+03:00</published><updated>2011-09-22T09:17:55.507+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>Νέο βιβλίο για τη μεθοδολογία ανάπτυξης σε ADF</title><content type='html'>Πολύ πρόσφατα κυκλοφόρησε ένας νέος τίτλος για το ADF, το "&lt;span style="font-weight: bold;"&gt;Oracle ADF Enterprise Application Development made simple&lt;/span&gt;", του Sten Vesterli από την Packt Publishing (&lt;a href="http://link.packtpub.com/jApqTb"&gt;http://link.packtpub.com/jApqTb&lt;/a&gt;) Παρόλο που είναι εύκολο να διαφωνήσει κανείς για το αν η ανάπτυξη στο ADF είναι απλή υπόθεση (απεναντίας θα έλεγα πως μια ομάδα που ξεκινά το πρώτο της έργο σε ADF, θα χρειαστεί τουλάχιστον 6 μήνες προκειμένου να φθάσει σε ένα επίπεδο ωριμότητας και παραγωγικότητας) ωστόσο αυτό που διακρίνει το βιβλίο σε σχέση με άλλα, είναι η οριοθέτηση όχι της τεχνολογίας αλλά των δεξιοτήτων, των συνοδευτικών εργαλείων και των φάσεων που θα χρειαστεί ένα έργο βασισμένο στο Oracle ADF. Γι' αυτό το λόγο απευθύνεται περισσότερο θα έλεγα σε architects και project managers και λιγότερο σε τεχνικούς που θέλουν απαντήσεις σε άμεσα, καθημερινά τους θέματα. Για την επίτευξη μιας πληρέστερης γνώμης για το βιβλίο, είναι διαθέσιμο ένα &lt;a href="http://www.packtpub.com/sites/default/files/1889EN-Chapter-1-The-ADF-Proof-of-Concept.pdf?utm_source=packtpub&amp;amp;utm_medium=free&amp;amp;utm_campaign=pdf"&gt;sample κεφάλαιο για download&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-sDq0LklU-tc/ThF8DimLamI/AAAAAAAABWA/mynBX83r3Ok/s1600/1889EN%2BOracle%2BADF%2BEnterprise%2BApplication%2BDevelopment-Made%2BSimple.jpg.png"&gt;&lt;img style="cursor: pointer; width: 125px; height: 152px;" src="http://1.bp.blogspot.com/-sDq0LklU-tc/ThF8DimLamI/AAAAAAAABWA/mynBX83r3Ok/s320/1889EN%2BOracle%2BADF%2BEnterprise%2BApplication%2BDevelopment-Made%2BSimple.jpg.png" alt="" id="BLOGGER_PHOTO_ID_5625413809830849122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Πιο αναλυτικά, το βιβλίο διαθέτει τα ακόλουθα κεφάλαια ενώ ο πίνακας περιεχομένων είναι &lt;a href="http://www.packtpub.com/toc/oracle-adf-enterprise-application-development%E2%80%94made-simple-table-contents"&gt;εδώ&lt;/a&gt;:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;The ADF Proof of Concept&lt;/span&gt;, όπου περιγράφεται το case study καθώς και η γενική περιγραφή της υλοποίησής του ως προς τα συστατικά στοιχεία (entities, lovs, task flows κ.α)&lt;br /&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Estimating the Effort&lt;/span&gt;, ένα άκρως ενδιαφέρον κεφάλαιο που αφορά την καταγραφή της πολυπλοκότητας ενός use case και την αντιστοίχηση και αποτύπωσή του σε χρονικές εκτιμήσεις για το ADF.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Getting Organized&lt;/span&gt;, που αφορά την κατανομή ρόλων και δεξιοτήτων καθώς και τη στελέχωση που είναι απαραίτητη για ένα ADF έργο. Επίσης δίνεται ενδεικτική λίστα των περιφερειακών εργαλειών που θα χρειαστούν στον κύκλο της ανάπτυξης και δοκιμών, naming conventions, δομή οργάνωσης projects και workspaces. Πρόκειται για το πιο πλήρες και σημαντικό τμήμα του βιβλίου.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Productive Teamwork&lt;/span&gt;, που περιγράφει συνοπτικά το Subversion και το Oracle Team Productivity Center για διασύνδεση με issue tracking συστήματα (πχ JIRA)&lt;br /&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Prepare to Build&lt;/span&gt;, που αφορά την κατασκευή templates για task flows και σελίδες καθώς και των framework extension classes, προτού αρχίσει η μαζική διαδικασία παραγωγής. Ίσως εδώ να χρειαζόταν μια πιο ισχυρή επιχειρηματολογία γιατί ένα project πρέπει να ξεκινήσει από αυτούς τους πυλώνες, και τι είδους λειτουργικότητα μπορούμε να αποδώσουμε με αυτά τα στοιχεία.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Building the Enterprise Application&lt;/span&gt;, που επιχειρεί να δώσει μια αίσθηση end-to-end ανάπτυξης με το ADF για το case study, από τα ADF BC ως το επίπεδο της σελίδας, βασισμένο στις προηγούμενες αρχές και με την επιπρόσθετη μνεία στα dynamic regions. Κρίμα που δεν δίνεται ο πηγαίος κώδικας (source code) αυτής της εφαρμογής γιατί θα ήταν πραγματικά ανεκτίμητη πηγή αναφοράς !&lt;br /&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Testing your Application&lt;/span&gt;, που αφορά την χρήση JUnit, Selenium και JMeter για τις δοκιμές της ADF εφαρμογής από διάφορες οπτικές γωνίες.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Look and Feel&lt;/span&gt;, που αφορά την χρήση skins και CSS.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Customizing the Functionality&lt;/span&gt;, το οποίο έχει να κάνει με το MDS και την παραμετροποίηση της εφαρμογής, κάτι που πραγματικά απουσίαζε από άλλα βιβλία.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Securing your ADF Application&lt;/span&gt;, που περιγράφει συνοπτικά το ADF Security.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Package and Deliver&lt;/span&gt;, που αναφέρεται στο deployment είτε μέσω JDeveloper ή ANT script (ojdeploy based)&lt;br /&gt; &lt;/li&gt;&lt;li&gt;Internationalization, δηλαδή διάθεση της εφαρμογής μας σε διάφορα πολυγλωσσικά περιβάλλοντα.&lt;br /&gt; &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Σε γενικές γραμμές θα έλεγα πως αυτό το βιβλίο περιέχει το καταστάλαγμα από best practices και consulting expertise που είναι απολύτως απαραίτητο για τις ομάδες που σκέπτονται να προχωρήσουν στο ADF καθώς θα τους βοηθήσει να πάρουν κάποιες αποφάσεις που αφορούν την οργάνωση του έργου, τον χρονοπρογραμματισμό του και να ακολουθήσουν κάποια ασφαλή μονοπάτια στην ανάπτυξη ώστε να αποφύγουν σημαντικούς κινδύνους.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-1788050582000103860?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/1788050582000103860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=1788050582000103860' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/1788050582000103860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/1788050582000103860'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/07/adf.html' title='Νέο βιβλίο για τη μεθοδολογία ανάπτυξης σε ADF'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-sDq0LklU-tc/ThF8DimLamI/AAAAAAAABWA/mynBX83r3Ok/s72-c/1889EN%2BOracle%2BADF%2BEnterprise%2BApplication%2BDevelopment-Made%2BSimple.jpg.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-7688733309477377996</id><published>2011-06-24T11:47:00.000+03:00</published><updated>2011-06-24T11:49:00.981+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>Declarative filtering σε ADF table</title><content type='html'>Υπάρχουν πολλαπλά σημεία στο ADF για να φιλτράρουμε εγγραφές: με χρήση view criteria, προγραμματιστικά, επιτρέποντας στους χρήστες μας να χρησιμοποιήσουν filters στα rich tables, σε query listeners, κλπ. Στο επίπεδο του binding υπάρχει μια κρυμμένη δυνατότητα να φιλτράρουμε με δηλωτικό τρόπο τα αποτελέσματα που θα εμφανιστούν σε έναν ADF πίνακα. Ανατρέχουμε λοιπόν στο tree binding του πίνακά μας και ενεργοποιούμε την επιλογή του filtering σύμφωνα με μια δεδομένη κολόνα.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-LGbvCdOSEAU/TgRPZpcHPwI/AAAAAAAABV4/5wqkh-ZJeBg/s1600/Screenshot-Edit%2BTree%2BBinding.png"&gt;&lt;img style="cursor: pointer; width: 281px; height: 320px;" src="http://4.bp.blogspot.com/-LGbvCdOSEAU/TgRPZpcHPwI/AAAAAAAABV4/5wqkh-ZJeBg/s320/Screenshot-Edit%2BTree%2BBinding.png" alt="" id="BLOGGER_PHOTO_ID_5621705536904314626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Στην έκδοση που το δοκίμασα (11.1.1.4) η τιμή του filter value δεν επιδέχεται εκφράσεις (πχ or, and) αλλά ρητά μια τιμή. Κατά αυτόν τον τρόπο, θα ζωγραφιστεί ο πίνακας έχοντας φιλτράρει ή αποκρύψει (hide) συγκεκριμένες εγγραφές.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-7688733309477377996?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/7688733309477377996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=7688733309477377996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7688733309477377996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7688733309477377996'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/06/declarative-filtering-adf-table.html' title='Declarative filtering σε ADF table'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-LGbvCdOSEAU/TgRPZpcHPwI/AAAAAAAABV4/5wqkh-ZJeBg/s72-c/Screenshot-Edit%2BTree%2BBinding.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-7266411993065800595</id><published>2011-06-21T15:35:00.001+03:00</published><updated>2011-06-21T15:38:16.001+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='jdeveloper'/><category scheme='http://www.blogger.com/atom/ns#' term='weblogic'/><title type='text'>Επιταχύνοντας την απόδοση του embedded Weblogic Server με τον JDeveloper</title><content type='html'>Ένας πιο σύντομος και αποδοτικός κύκλος προγραμματισμού είναι πάντα το ζητούμενο και μάλιστα σε σχέση με τα εργαλεία ανάπτυξης. Η περίπτωση του ενσωματωμένου Weblogic στον JDeveloper δεν αποτελεί εξαίρεση: ως οποιοσδήποτε Java Server επιδέχεται διάφορες παραμετροποιήσεις, ενώ μπορούμε και εμείς να βοηθήσουμε τα πράγματα στον τομέα της απόδοσης (performance) με διάφορους τρόπους, όπως:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Με την χρησιμοποίηση ενός solid state δίσκου. Όταν ξεκινά το JVM διαβάζει πολλά JAR αρχεία και πραγματικά έχω δει μεγάλη βελτίωση της ταχύτητας τόσο της εκκίνησης του JDeveloper όσο και του Weblogic όταν βρίσκονται σε τέτοιου είδους αποθηκευτικό μέσο. Η αγορά ενός μικρού SSD (πχ 40GB) δεν είναι δυσβάστακτη ενώ πέρα από τα workstations, υπάρχουν και διάφορα laptops (πχ τα Thinkpad) που επιτρέπουν να χρησιμοποιείτε δυο δίσκους ταυτόχρονα.&lt;/li&gt;&lt;li&gt;Κατά δεύτερο λόγο θα έλεγα πως το development μηχάνημα να έχει επαρκή μνήμη (μεγαλύτερη των 3.5GB) και να τρέχει ένα 64-bit Linux με το ανάλογο 64-bit JDK, τόσο για τον JDeveloper όσο και για το Weblogic&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Αρκετός χρόνος στην εκκίνηση του deployment μιας εφαρμογής δαπανιέται είτε στην αρχικοποίηση του security ή στο ανέβασμα και άνοιγμα των data source connections. Αν η εφαρμογή σας δεν αλλάζει κάθε τρεις και λίγο ρόλους, τότε θα πρότεινα να απενεργοποιήσετε την μεταφορά των πληροφοριών του security, αφού προηγηθεί το πρώτο ανέβασμα. Σε οποιαδήποτε περίπτωση αλλαγής της ασφάλειας, ανεβάστε τις νέες ρυθμίσεις. Παρόμοια, χρησιμοποιείτε ένα δηλωμένο data source στο Weblogic server σας και όχι application-wide γεγονός που επιβαρύνει το άνοιγμα/κλείσιμο συνδέσεων κατά τη διάρκεια του (un)deployment.&lt;/li&gt;&lt;/ol&gt;&lt;a href="http://4.bp.blogspot.com/-QiLxCv7RfI4/TgCQX8_OCCI/AAAAAAAABVo/Jveff3ecJ9I/s1600/Screenshot-Application%2BProperties%2B-%2B-home-spk-Projects-workdir-igp-DEVELOPMENT-WorklistUI-WorklistUI.jws.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 110px;" src="http://4.bp.blogspot.com/-QiLxCv7RfI4/TgCQX8_OCCI/AAAAAAAABVo/Jveff3ecJ9I/s320/Screenshot-Application%2BProperties%2B-%2B-home-spk-Projects-workdir-igp-DEVELOPMENT-WorklistUI-WorklistUI.jws.png" alt="" id="BLOGGER_PHOTO_ID_5620651076141058082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ol start="4"&gt;&lt;li&gt;Ειδικά για τα datasource, θα πρότεινα να ορίσετε σχετικά μικρά μεγέθη για το connection pool, για παράδειγμα 0..5 ώστε να έχετε επαναχρησιμοποίηση πόρων και γρήγορο deployment της εφαρμογής.&lt;/li&gt;&lt;li&gt;Υπάρχουν διάφορα αρχεία που γράφονται όταν βρίσκεται σε λετουργία ο Weblogic ή όταν γίνεται deployment: για παράδειγμα temporary files, log files (του συστήματος ή της εφαρμογής), deployment αρχείων κλπ. Σε σχέση με την εκμετάλλευση του SSD και του Linux, μπορείτε να κάνετε mount επιλεγμένα σημεία (πχ το /tmp, το drs/ ή τα log directories) στο σύστημα αρχείων tmpfs ώστε πρακτικά να γράφονται στην μνήμη και όχι στο δίσκο.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;Στο ίδιο μήκος κύματος, μπορείτε να απενεργοποιήσετε το domain log broadcaster του Weblogic μιας και το domain είναι ο server σας.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;Το domain που κατασκευάζει o Weblogic περιλαμβάνει διάφορες βιβλιοθήκες. Σύμφωνα με το JConsole, όταν ξεκινά ο Weblogic μου (στην έκδοση 11.1.1.3.0) καταλαμβάνει περί τα 90MB μνήμης. Μπαίνοντας στο Weblogic console, υπάρχουν μια σειρά από βιβλιοθήκες (deployments) που ενδεχομένως δεν χρειάζεστε, όπως wsil-wls.wsm-pm, κλπ Απλά δεν τις κάνουμε target στον Default Server. Με κατάλληλες δοκιμές και tuning, μπορούμε να ξεκινήσουμε το server μας με τουλάχιστον 30% λιγότερη μνήμη.&lt;/li&gt;&lt;/ol&gt;&lt;a href="http://3.bp.blogspot.com/-ua7G8bTDpSk/TgCQfl2-CJI/AAAAAAAABVw/fkaPcXB7SHI/s1600/Screenshot-Summary%2Bof%2BDeployments%2B-%2BDefaultDomain%2B-%2BWLS%2BConsole%2B-%2BMozilla%2BFirefox.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 73px;" src="http://3.bp.blogspot.com/-ua7G8bTDpSk/TgCQfl2-CJI/AAAAAAAABVw/fkaPcXB7SHI/s320/Screenshot-Summary%2Bof%2BDeployments%2B-%2BDefaultDomain%2B-%2BWLS%2BConsole%2B-%2BMozilla%2BFirefox.png" alt="" id="BLOGGER_PHOTO_ID_5620651207371393170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ol start="8"&gt;&lt;li&gt;Και μια που μιλάμε για θέματα μνήμης: αν κάνουμε ένα κατάλληλο profiling του Weblogic μπορούμε να δούμε που κινείται έπειτα από 2-3 deployments ώστε να διαμορφώσουμε κατάλληλα και με μεγαλύτερη ακρίβεια τα μεγέθη στο &lt;span style="font-family: monospace;"&gt;setDomainEnv.sh &lt;/span&gt;(&lt;a href="http://adfhowto.blogspot.com/2010/10/increasing-memory-of-embedded-weblogic.html"&gt;http://adfhowto.blogspot.com/2010/10/increasing-memory-of-embedded-weblogic.html&lt;/a&gt;)   &lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-7266411993065800595?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/7266411993065800595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=7266411993065800595' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7266411993065800595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7266411993065800595'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/06/embedded-weblogic-server-jdeveloper.html' title='Επιταχύνοντας την απόδοση του embedded Weblogic Server με τον JDeveloper'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-QiLxCv7RfI4/TgCQX8_OCCI/AAAAAAAABVo/Jveff3ecJ9I/s72-c/Screenshot-Application%2BProperties%2B-%2B-home-spk-Projects-workdir-igp-DEVELOPMENT-WorklistUI-WorklistUI.jws.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-4273482393928920660</id><published>2011-06-14T11:56:00.005+03:00</published><updated>2011-06-14T12:02:58.231+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle SOA Suite'/><title type='text'>Χρησιμοποιώντας τον DbAdapter σε PL/SQL packages στο Oracle SOA Suite</title><content type='html'>Το Oracle SOA Suite μας επιτρέπει να προσθέσουμε ως συστατικά στοιχεία των ροών μας (composites) και στοιχεία που βρίσκονται σε μια βάση, όπως για παράδειγμα την κλήση μιας PL/SQL procedure ή function.&lt;br /&gt;&lt;br /&gt;Δυστυχώς δεν υπάρχει τρόπος (τουλάχιστον μέχρι την έκδοση 11.1.1.5) ώστε να κατασκευαστούν μαζικά endpoints για όλες τις συναρτήσεις/διαδικασίες ενός database package ή έστω κατόπιν επιλογής. Απεναντίας πρέπει να επαναλάβουμε πολλές φορές τα βήματα.της δημιουργίας ενός database adapter για κάθε συνάρτηση του ενδιαφέροντός μας. Μια καλή προσέγγιση θα ήταν να δημιουργήσουμε ένα ξεχωριστό SCA (composite) που θα ομαδοποιεί όλες τις database procedures που ανήκουν σε ένα PL/SQL package ώστε να λειτουργεί ως wrapper κατά κάποιο τρόπο. Θα χρειαστούμε μια μικρή επεξεργασία σε WSDL ώστε να φθάσουμε στο επιθυμητό αποτέλεσμα.&lt;br /&gt;&lt;br /&gt;Ξεκινάμε λοιπόν ένα καινούργιο &lt;span style="font-style: italic;"&gt;empty composite&lt;/span&gt; και προσθέτουμε προοδευτικά όλα τις procedures που μας ενδιαφέρουν (οι οποίες ενδεχόμενα ανήκουν στο ίδιο PL/SQL package) με την βοήθεια του database adapter.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-bHiVinaMNzY/Tfcip1d910I/AAAAAAAABUw/3xvbEvOcfU0/s1600/Screenshot-Adapter%2BConfiguration%2BWizard%2B-%2BStep%2B4%2Bof%2B5.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 251px;" src="http://2.bp.blogspot.com/-bHiVinaMNzY/Tfcip1d910I/AAAAAAAABUw/3xvbEvOcfU0/s320/Screenshot-Adapter%2BConfiguration%2BWizard%2B-%2BStep%2B4%2Bof%2B5.png" alt="" id="BLOGGER_PHOTO_ID_5617997162290730818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Αφότου έχουμε προσθέσει δυο συναρτήσεις (πχ Procedure1 και Procedure2) το αποτέλεσμα δείχνει ως εξής στον composite editor μας. Έχουν αντίστοιχα δημιουργηθεί τα wsdl για τις PL/SQL procedures και φυσικά τα συνεπαγόμενα xsd.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-5aQzNKsd_yk/TfcizaLPFFI/AAAAAAAABU4/zQx1D5m3NI4/s1600/Screenshot-1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 138px;" src="http://2.bp.blogspot.com/-5aQzNKsd_yk/TfcizaLPFFI/AAAAAAAABU4/zQx1D5m3NI4/s320/Screenshot-1.png" alt="" id="BLOGGER_PHOTO_ID_5617997326763103314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Στη συνέχεια δημιουργούμε ένα νέο WSDL document, για παράδειγμα το DBWrapperService. Σαν τοποθεσία αυτού του αρχείου δεν προτιμούμε τον κατάλογο &lt;span style="font-family:monospace;"&gt;WEB-INF/wsdl&lt;/span&gt; αλλά αυτόν που βρίσκεται ήδη το &lt;span style="font-family:monospace;"&gt;composite.xml&lt;/span&gt; και τα υπόλοιπα WSDL του DBAdapter. Αυτό το αρχείο θα αποτελέσει την περιγραφή της υπηρεσίας μας που θα συγκεντρώνει όλες τις PL/SQL μεθόδους και θα αντιπροσωπεύεται από έναν Mediator.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-ax4gqUReTEM/TfcjDCiy06I/AAAAAAAABVA/5aY7yF90NSs/s1600/Screenshot-Create%2BWSDL%2BDocument.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 241px;" src="http://4.bp.blogspot.com/-ax4gqUReTEM/TfcjDCiy06I/AAAAAAAABVA/5aY7yF90NSs/s320/Screenshot-Create%2BWSDL%2BDocument.png" alt="" id="BLOGGER_PHOTO_ID_5617997595297371042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Τώρα θα χρειαστεί να καταφύγουμε στην επεξεργασία του WSDL, ώστε να συμπεριλάβουμε τα external references του Database Adapter που κατασκευάσαμε. Ανοίγουμε λοιπόν το WSDL της πρώτης υπηρεσίας (Procedure1) και ανατρέχουμε στον κώδικά της ώστε να αντιγράψουμε συγκεκριμένες ενότητες στο DBWrapperService WSDL. Αυτά που μας ενδιαφέρουν είναι η δήλωση του namespace, του import του xsd καθώς και αυτή του message type και του operation.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-s0Nz9YXUFZM/TfcjSLbC4BI/AAAAAAAABVI/_sYty0xKX-4/s1600/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BPLSQLPackage.jws%2B%253A%2BDBAdapter.jpr%2B%253A%2B-home-spk-Projects-workdir-PLSQLPackage-DBAdapter-Procedure1.wsdl.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 158px;" src="http://4.bp.blogspot.com/-s0Nz9YXUFZM/TfcjSLbC4BI/AAAAAAAABVI/_sYty0xKX-4/s320/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BPLSQLPackage.jws%2B%253A%2BDBAdapter.jpr%2B%253A%2B-home-spk-Projects-workdir-PLSQLPackage-DBAdapter-Procedure1.wsdl.png" alt="" id="BLOGGER_PHOTO_ID_5617997855378825234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Επαναλαμβάνουμε τη διαδικασία και για τη δεύτερη υπηρεσία μας και το τελικό WSDL πια μοιάζει ως εξής:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-B2k1bYYq25E/TfcjZbH77II/AAAAAAAABVQ/uXMlzhWou84/s1600/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BPLSQLPackage.jws%2B%253A%2BDBAdapter.jpr%2B%253A%2B-home-spk-Projects-workdir-PLSQLPackage-DBAdapter-DBWrapperService.wsdl.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 188px;" src="http://2.bp.blogspot.com/-B2k1bYYq25E/TfcjZbH77II/AAAAAAAABVQ/uXMlzhWou84/s320/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BPLSQLPackage.jws%2B%253A%2BDBAdapter.jpr%2B%253A%2B-home-spk-Projects-workdir-PLSQLPackage-DBAdapter-DBWrapperService.wsdl.png" alt="" id="BLOGGER_PHOTO_ID_5617997979852729474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Προσθέτουμε στο composite μας ένα Mediator που θα βασίζεται στο WSDL που μόλις διαμορφώσαμε.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-lO1rbDNCTok/TfcjjGRPU4I/AAAAAAAABVY/hDJEfqm02kk/s1600/Screenshot-Create%2BMediator.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 220px;" src="http://1.bp.blogspot.com/-lO1rbDNCTok/TfcjjGRPU4I/AAAAAAAABVY/hDJEfqm02kk/s320/Screenshot-Create%2BMediator.png" alt="" id="BLOGGER_PHOTO_ID_5617998146053297026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Συνδέουμε το mediator με τα services και έχουμε ένα πλήρη διάγραμμα. Το Mediator έχει εξάγει τις δυο μεθόδους από τον DBAdapter σε ένα service, φυσικά διατηρώντας οποιαδήποτε transaction χαρακτηριστικά.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-nayodjp4RWQ/TfcjqHM0KyI/AAAAAAAABVg/k_nhGT0W1qc/s1600/completed.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 95px;" src="http://2.bp.blogspot.com/-nayodjp4RWQ/TfcjqHM0KyI/AAAAAAAABVg/k_nhGT0W1qc/s320/completed.png" alt="" id="BLOGGER_PHOTO_ID_5617998266562259746" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-4273482393928920660?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/4273482393928920660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=4273482393928920660' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4273482393928920660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4273482393928920660'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/06/dbadapter-plsql-packages-oracle-soa.html' title='Χρησιμοποιώντας τον DbAdapter σε PL/SQL packages στο Oracle SOA Suite'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-bHiVinaMNzY/Tfcip1d910I/AAAAAAAABUw/3xvbEvOcfU0/s72-c/Screenshot-Adapter%2BConfiguration%2BWizard%2B-%2BStep%2B4%2Bof%2B5.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-3136710226050927141</id><published>2011-06-10T11:29:00.003+03:00</published><updated>2011-06-10T11:30:46.001+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>Refresh ενός ADF region όταν αλλάζουν οι παράμετροι εισόδου (input parameters)</title><content type='html'>Σύμφωνα με το documentation (&lt;a href="http://download.oracle.com/docs/cd/E16162_01/web.1112/e16182/taskflows_regions.htm#CHDEIFBB"&gt;http://download.oracle.com/docs/cd/E16162_01/web.1112/e16182/taskflows_regions.htm#CHDEIFBB&lt;/a&gt;) όταν χρησιμοποιούμε task flows σε regions, έχουμε διάφορες επιλογές με τις οποίες το task flow μας θα ξανα-εκτελεστεί (refreshed) Η πιο συνηθισμένη και πιο ασφαλής είναι να ορίσουμε στο binding layer την επιλογή Refresh με την τιμή &lt;span style="font-style: italic;"&gt;ifNeeded&lt;/span&gt;: κατά αυτόν τον τρόπο, οποιαδήποτε αλλαγή των παραμέτρων εισόδου θα οδηγήσει στην εκκίνηση του task flow. Σε μια περίπτωση, χρειάστηκε να ξεκινήσω το task flow κάθε φορά, ανεξάρτητα από το αν έχουν αλλάξει οι παράμετροι εισόδου. Γι' αυτό το λόγο, χρειάστηκε ένα μικρό τρικ: αρχικά όρισα μια νέα παράμετρο στο taskflow, πχ με το όνομα inRefreshMe. Αυτή η παράμετρος είναι προαιρετική και θα συνοδεύει τις υπόλοιπες παραμέτρους του task flow.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-_Z2EOz5arXw/TfHV8A0ueJI/AAAAAAAABUQ/k01czJa4aCk/s1600/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BWorklistUI.jws%2B%253A%2BViewController.jpr.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 80px;" src="http://2.bp.blogspot.com/-_Z2EOz5arXw/TfHV8A0ueJI/AAAAAAAABUQ/k01czJa4aCk/s320/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BWorklistUI.jws%2B%253A%2BViewController.jpr.png" alt="" id="BLOGGER_PHOTO_ID_5616505437297735826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Έπειτα σε ένα backing bean, ορισμένο σε request scope, ορίζουμε μια μέθοδο που επιστρέφει ένα random string που τελικά θα ανατεθεί στην input parameter του task flow που μόλις προσθέσαμε.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;   &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;public String getRandomString() {&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;        return UUID.randomUUID().toString();&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Τέλος, στο binding layer (page definition file) αναθέτουμε στην task flow παράμετρο την τιμή από το managed bean.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-ijV0ycS-5tk/TfHWD_H0hSI/AAAAAAAABUY/3PucL_B4oms/s1600/Screenshot-Edit%2BTask%2BFlow%2BBinding.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 178px;" src="http://3.bp.blogspot.com/-ijV0ycS-5tk/TfHWD_H0hSI/AAAAAAAABUY/3PucL_B4oms/s320/Screenshot-Edit%2BTask%2BFlow%2BBinding.png" alt="" id="BLOGGER_PHOTO_ID_5616505574279906594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Έτσι, κάθε φορά που θα γίνεται κλήση στο region μας, θα εκκινεί το task flow μιας και μια από τις παραμέτρους εισόδου του θα έχει αλλάξει.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-3136710226050927141?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/3136710226050927141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=3136710226050927141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3136710226050927141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3136710226050927141'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/06/refresh-adf-region-input-parameters.html' title='Refresh ενός ADF region όταν αλλάζουν οι παράμετροι εισόδου (input parameters)'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-_Z2EOz5arXw/TfHV8A0ueJI/AAAAAAAABUQ/k01czJa4aCk/s72-c/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BWorklistUI.jws%2B%253A%2BViewController.jpr.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-6001996172877546582</id><published>2011-06-08T12:09:00.004+03:00</published><updated>2011-09-02T17:33:24.338+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Στατιστικά χρήσης του Subversion</title><content type='html'>Υπάρχουν διάφορα βοηθήματα για να αντλήσουμε πληροφορίες χρήσης του Subversion στα έργα μας και πρόσφατα χρησιμοποίησα δυο από αυτά. Το πρώτο είναι το mpy-svn-stats (&lt;a href="http://mpy-svn-stats.berlios.de/"&gt;http://mpy-svn-stats.berlios.de/&lt;/a&gt;) που μάλιστα βρίσκεται και στα αποθετήρια του Ubuntu. Ο τρόπος χρήσης του είναι εξαιρετικά εύκολος:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;mpy-svn-stats -o &lt;/span&gt;&lt;span style="font-style: italic;font-family:monospace;" &gt;output-directory&lt;/span&gt;&lt;span style="font-family:monospace;"&gt; &lt;/span&gt;&lt;span style="font-style: italic;font-family:monospace;" &gt;svn-url&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To πρόγραμμα αυτό κατασκευάζει μια σειρά από γραφήματα και πίνακες που παρουσιάζονται σε μια html σελίδα. Αφορούν τους πιο ενεργούς commiters σε διάφορες διαστάσεις του χρόνου.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-uTy9-eFBNyY/Te88-X4wn_I/AAAAAAAABT4/2-0fWFAWZjM/s1600/Screenshot-mpy-svn-stats%2B-%2BMozilla%2BFirefox.png"&gt;&lt;img style="cursor: pointer; width: 319px; height: 320px;" src="http://3.bp.blogspot.com/-uTy9-eFBNyY/Te88-X4wn_I/AAAAAAAABT4/2-0fWFAWZjM/s320/Screenshot-mpy-svn-stats%2B-%2BMozilla%2BFirefox.png" alt="" id="BLOGGER_PHOTO_ID_5615774302615937010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Πιο ευέλικτο είναι το SVNPlot (&lt;a href="http://code.google.com/p/svnplot/"&gt;http://code.google.com/p/svnplot/&lt;/a&gt;) καθώς αποθηκεύει τα μεταδεδομένα του repository σε μια βάση δεδομένων (sqlite στην περίπτωσή μας ή αν προτιμάτε sqlite3 πακέτο στο Ubuntu) ώστε να κατασκευάσουμε κατά βούληση επιπλέον reports που μας ενδιαφέρουν. Το χρησιμοποιούμε ως εξής:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;python svnlog2sqlite.py -v &lt;/span&gt;&lt;span style="font-style: italic;font-family:monospace;" &gt;svn-url&lt;/span&gt;&lt;span style="font-family:monospace;"&gt; svn.db&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Η διαδικασία γεμίσματος της βάσης θα διαρκέσει αρκετή ώρα, ανάλογα με το μέγεθος του SVN repository. Έπειτα από αυτό, μπορούμε είτε να προχωρήσουμε στην κατασκευή κάποιων βασικών γραφημάτων:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;python svnplot.py svn.db &lt;/span&gt;&lt;span style="font-style: italic;font-family:monospace;" &gt;output-directory&lt;br /&gt;&lt;/span&gt;&lt;a href="http://4.bp.blogspot.com/--ZoRQwWbXNE/Te89FnXURZI/AAAAAAAABUA/Dis6wGOoVkg/s1600/Screenshot-Subversion%2BStats%2BPlot%2Bfor%2BNone%2B-%2BChromium.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 218px;" src="http://4.bp.blogspot.com/--ZoRQwWbXNE/Te89FnXURZI/AAAAAAAABUA/Dis6wGOoVkg/s320/Screenshot-Subversion%2BStats%2BPlot%2Bfor%2BNone%2B-%2BChromium.png" alt="" id="BLOGGER_PHOTO_ID_5615774427029718418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Αν μάλιστα έχουμε εγκαταστήσει και τον sqlitebrowser (που επίσης παρέχεται με το Ubuntu) μπορούμε να δούμε τη βάση δεδομένων και να φτιάξουμε τα δικά μας queries στο SVN repository.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-_cNyEHGIbRc/Te89RQbabNI/AAAAAAAABUI/bKJgeysHtnU/s1600/Screenshot-SQLite%2BDatabase%2BBrowser%2B-%2B-home-spk-dbin-SVNPlot-0.7.4-svnplot-mylocal.db.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 162px;" src="http://1.bp.blogspot.com/-_cNyEHGIbRc/Te89RQbabNI/AAAAAAAABUI/bKJgeysHtnU/s320/Screenshot-SQLite%2BDatabase%2BBrowser%2B-%2B-home-spk-dbin-SVNPlot-0.7.4-svnplot-mylocal.db.png" alt="" id="BLOGGER_PHOTO_ID_5615774627031313618" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-6001996172877546582?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/6001996172877546582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=6001996172877546582' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/6001996172877546582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/6001996172877546582'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/06/subversion.html' title='Στατιστικά χρήσης του Subversion'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-uTy9-eFBNyY/Te88-X4wn_I/AAAAAAAABT4/2-0fWFAWZjM/s72-c/Screenshot-mpy-svn-stats%2B-%2BMozilla%2BFirefox.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-6411800751659597185</id><published>2011-05-30T23:30:00.001+03:00</published><updated>2011-05-30T23:33:06.259+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle SOA Suite'/><category scheme='http://www.blogger.com/atom/ns#' term='jdeveloper'/><title type='text'>JDeveloper και SOA projects που χρησιμοποιούν το MDS</title><content type='html'>Μια από τις προσεγγίσεις που προτείνεται από την Oracle για την διασύνδεση ροών εργασίας του SOA ή του BPM Suite με υφιστάμενα web services, είναι αυτή του abstract WSDL με την χρήση MDS: αντί να κάνουμε αναφορά σε εξωτερικά web services με την απευθείας χρήση του τελικού WSDL (concrete WSDL) χρησιμοποιούμε ένα αντίγραφό του που μας αποκρύπτει τις πληροφορίες του server που εκτελεί το service. Το WSDL αυτού του τύπου αποθηκεύεται στο MDS και μέσω αυτής της πηγής γίνεται η διασύνδεσή του με τα composites μας. Την ώρα του deployment, απομένει να ορίσουμε την πραγματική τοποθεσία του web service μας. Κατά αυτόν τον τρόπο, μπορούμε να δουλέψουμε σχεδιαστικά χωρίς να διαμαρτύρεται ο JDeveloper για την σύνδεση στον πάροχο (producer) του web service ενώ στο runtime είναι δουλειά μας να ορίσουμε το τελικό περιβάλλον εκτέλεσης της εξωτερικής υπηρεσίας. Περισσότερες πληροφορίες για αυτήν την πρακτική στο: &lt;a href="http://blogs.oracle.com/aia/entry/aia_11g_best_practices_for_dec"&gt;http://blogs.oracle.com/aia/entry/aia_11g_best_practices_for_dec&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Όταν δουλεύουμε με το MDS, πρακτικά συντηρείται ένα αρχείο ορισμών, το &lt;span style="font-family:monospace;"&gt;adf-config.xml&lt;/span&gt; που δηλώνει το MDS repository (σύστημα αρχείων ή βάση δεδομένων) Όταν δουλεύουμε  διάφορα projects στον JDeveloper 11.1.1.4 και κάποια από αυτά έχουν να κάνουν με το MDS είναι εξαιρετικά ενδιαφέρον, πως όταν ξεκινά ο JDeveloper 11.1.1.4 προσπαθεί να συνδεθεί, με βάση το adf-config.xml στο MDS repository. Και εδώ συμβαίνει το εξής παράδοξο: αν το ενεργό project μας κατά την εκκίνηση του JDeveloper χρησιμοποιεί το MDS, τότε δεν υπάρχει κανένα απολύτως πρόβλημα, διαφορετικά εμφανίζονται τυπικά λάθη σαν το ακόλουθο στο message log:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;Unable to open an input stream for ORAMDS URL "/soa/shared/workflow/WorkflowTask.xsd".&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;Unable to open an input stream for ORAMDS URL "/soa/shared/workflow/WorkflowCommon.xsd".&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;Unable to open an input stream for ORAMDS URL "/soa/shared/workflow/TaskEvidenceService.xsd".&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;Unable to open an input stream for ORAMDS URL "..".&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Έπειτα, αν δοκιμάσουμε να ανοίξουμε μια ροή που χρησιμοποιεί MDS τότε αυτή παρουσιάζεται ως εσφαλμένη.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-IgEB2clOZjo/TeP-4RkirZI/AAAAAAAABTs/bNtjeoTkNkk/s1600/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BLFProcesses.jws%2B%253A%2BLF0201Process.jpr.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 206px;" src="http://1.bp.blogspot.com/-IgEB2clOZjo/TeP-4RkirZI/AAAAAAAABTs/bNtjeoTkNkk/s320/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BLFProcesses.jws%2B%253A%2BLF0201Process.jpr.png" alt="" id="BLOGGER_PHOTO_ID_5612609803376569746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;O μοναδικός τρόπος για να αποφύγουμε τέτοιου είδους λάθη είναι να ξεκινάμε το JDeveloper μας, έχοντας ως αρχικά ενεργό project, αυτό που χρησιμοποιεί το MDS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-6411800751659597185?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/6411800751659597185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=6411800751659597185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/6411800751659597185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/6411800751659597185'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/05/jdeveloper-soa-projects-mds.html' title='JDeveloper και SOA projects που χρησιμοποιούν το MDS'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-IgEB2clOZjo/TeP-4RkirZI/AAAAAAAABTs/bNtjeoTkNkk/s72-c/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BLFProcesses.jws%2B%253A%2BLF0201Process.jpr.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-1865233297627413859</id><published>2011-05-24T23:43:00.001+03:00</published><updated>2011-05-24T23:43:53.874+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>Ενεργοποίηση του disclosureListener σε showDetailItem</title><content type='html'>Αφορμή για το άρθρο ήταν η παρατήρηση της συμπεριφοράς πως οι disclosureListeners που είχα σε δυο tabs σε μια σελίδα ADF ενεργοποιούνταν ταυτόχρονα, ανεξάρτητα σε ποιο tab είχε γίνει click. Όπως αναγράφει και το documentation του showDetailItem για το τι συμβαίνει onClick στην πλευρά του server:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"On server: the server disclosure event is kicked off to set disclosed to true on item 2 if this first server event is not canceled, another server disclosure event gets kicked off to set disclosed to false for item 1 if neither server event is canceled, the new states get rendered and the user will see the newly disclosed states on the client otherwise, the client looks the same as it was before"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Συνεπώς και δυο disclosureListeners (ενεργό και ανενεργό tab) εκτελούνται. Η λύση; H διευκρίνηση στο backing bean method για το αν ενεργοποιείται το tab, με την μέθοδο &lt;span style="font-family: monospace;"&gt;isExpanded()&lt;/span&gt; ώστε να εκτελεστεί η κατάλληλη business function.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;    public void prepareSomething(DisclosureEvent disclosureEvent) {&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        if (disclosureEvent.isExpanded()) {&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;          ...&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;        }   &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;    }&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-1865233297627413859?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/1865233297627413859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=1865233297627413859' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/1865233297627413859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/1865233297627413859'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/05/disclosurelistener-showdetailitem.html' title='Ενεργοποίηση του disclosureListener σε showDetailItem'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-3478135209959527890</id><published>2011-05-21T23:46:00.002+03:00</published><updated>2011-05-21T23:49:21.692+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='openSuSE'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Βρίσκοντας την ημερομηνία εγκατάστασης ενός Linux συστήματος</title><content type='html'>Διαθέτοντας ένα μεγάλο αριθμό από virtual machines βασισμένα στο Linux, μου προέκυψε η απορία για το πότε έκανα την εγκατάστασή τους. Διαπίστωσα πως αυτή η πληροφορία (installation date) διαφέρει από διανομή σε διανομή. Πιο συγκεκριμένα για το &lt;span style="font-weight: bold;"&gt;Ubuntu&lt;/span&gt; ανατρέξτε στον κατάλογο &lt;span style="font-family:monospace;"&gt;/var/log/installer&lt;/span&gt; ώστε να δείτε το πότε στήσατε το μηχάνημα σας.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-K2m4MDTAEWM/Tdgk5QBwTsI/AAAAAAAABTY/02QGCVTfFX8/s1600/Screenshot-spk%2540spk-laptop%253A%2B-var-log-installer.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 213px;" src="http://4.bp.blogspot.com/-K2m4MDTAEWM/Tdgk5QBwTsI/AAAAAAAABTY/02QGCVTfFX8/s320/Screenshot-spk%2540spk-laptop%253A%2B-var-log-installer.png" alt="" id="BLOGGER_PHOTO_ID_5609273901863423682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Τρέχοντας την έκδοση 10.10, επιβεβαιώνω πως η ημερομηνία εγκατάστασης είναι η 16η Οκτωβρίου 2010 (λίγες μέρες δηλαδή μετά την κυκλοφορία)&lt;br /&gt;&lt;br /&gt;Για την περίπτωση του &lt;span style="font-weight: bold;"&gt;openSuSE, &lt;/span&gt;βλέπουμε τις πρώτες γραμμές του αρχείου /var/log/zypper.log&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;2009-11-16 23:45:13 &amp;lt;1&amp;gt; linux-spk(3209) [zypper] main.cc(main):75 ===== Hi, me zypper 1.2.8 built Nov  2 2009 17:44:30 =====&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;2009-11-16 23:45:13 &amp;lt;1&amp;gt; linux-spk(3209) [zconfig] ZConfig.cc(_autodetectSystemArchitecture):57 Uname architecture is 'x86_64'&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;2009-11-16 23:45:13 &amp;lt;1&amp;gt; linux-spk(3209) [zconfig] ZConfig.cc(_autodetectTextLocale):121 Found LANG=en_US.UTF-8&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;2009-11-16 23:45:13 &amp;lt;1&amp;gt; linux-spk(3209) [zconfig] ZConfig.cc(_autodetectTextLocale):128 Default text locale is 'en_US'&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;2009-11-16 23:45:13 &amp;lt;1&amp;gt; linux-spk(3209) [zconfig] ZConfig.cc(Impl):234 libzypp: 6.21.2 built Nov  2 2009 17:29:51&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;2009-11-16 23:45:13 &amp;lt;1&amp;gt; linux-spk(3209) [zypp] IniParser.cc(parse):69 Start parsing /etc/zypp/zypp.conf[g___]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Συνεπώς το openSuSE 11.2 μου το ξεκίνησα στις 16 Νοεμβρίου 2009.&lt;br /&gt;&lt;br /&gt;Τέλος για την περίπτωση του &lt;span style="font-weight: bold;"&gt;CentOS&lt;/span&gt; εμπιστευτείτε το timestamp του &lt;span style="font-family:monospace;"&gt;/root/install.log&lt;/span&gt; (17 Ιουλίου 2009 στην περίπτωσή μου)&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-RntrGuYGoxA/TdglEDWRXrI/AAAAAAAABTg/0a4xuaR595k/s1600/Screenshot-1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 213px;" src="http://4.bp.blogspot.com/-RntrGuYGoxA/TdglEDWRXrI/AAAAAAAABTg/0a4xuaR595k/s320/Screenshot-1.png" alt="" id="BLOGGER_PHOTO_ID_5609274087438376626" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-3478135209959527890?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/3478135209959527890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=3478135209959527890' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3478135209959527890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3478135209959527890'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/05/linux.html' title='Βρίσκοντας την ημερομηνία εγκατάστασης ενός Linux συστήματος'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-K2m4MDTAEWM/Tdgk5QBwTsI/AAAAAAAABTY/02QGCVTfFX8/s72-c/Screenshot-spk%2540spk-laptop%253A%2B-var-log-installer.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-6665434999855783934</id><published>2011-05-19T17:54:00.002+03:00</published><updated>2011-05-19T17:57:02.543+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle SOA Suite'/><title type='text'>Localization των μηνυμάτων των human tasks του Oracle SOA Suite</title><content type='html'>Δουλεύοντας σε μια εφαρμογή που χρησιμοποιεί ένα custom worklist application, προέκυψε ένα θέμα με την εμφάνιση των κουμπιών των custom workflow actions. Για παράδειγμα, ένα human task ορίζει ως custom outcomes τις ενέργειες: COMPLETE-INCOMPLETE.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-4AvqLdtXxko/TdUvcE3i8PI/AAAAAAAABSw/TcvG8QSA3j4/s1600/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BLFProcesses.jws%2B%253A%2BLF0201Process.jpr%2B%253A%2B-home-spk-Projects-workdir-igp-artifacts-LFProcesses-LF0201Process-CheckWork.task.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 147px;" src="http://2.bp.blogspot.com/-4AvqLdtXxko/TdUvcE3i8PI/AAAAAAAABSw/TcvG8QSA3j4/s320/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BLFProcesses.jws%2B%253A%2BLF0201Process.jpr%2B%253A%2B-home-spk-Projects-workdir-igp-artifacts-LFProcesses-LF0201Process-CheckWork.task.png" alt="" id="BLOGGER_PHOTO_ID_5608441070349381874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Εμφανίζοντας ένα human task notification αυτού του είδους είτε στο default worklist application είτε σε μια custom εφαρμογή, αφενός οι ενέργειες δεν μπορούν να εξατομικευτούν σύμφωνα με το γλωσσικό περιβάλλον του χρήστη και αφετέρου εμφανίζονται όπως ακριβώς τις έχουμε δηλώσει (πχ με κεφαλαία γράμματα)&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-rv9BaUdSKYc/TdUviowLeaI/AAAAAAAABS4/4Kc3a3ly7kM/s1600/Screenshot-IGP%2B-%2BMozilla%2BFirefox-1.png"&gt;&lt;img style="cursor: pointer; width: 116px; height: 46px;" src="http://1.bp.blogspot.com/-rv9BaUdSKYc/TdUviowLeaI/AAAAAAAABS4/4Kc3a3ly7kM/s320/Screenshot-IGP%2B-%2BMozilla%2BFirefox-1.png" alt="" id="BLOGGER_PHOTO_ID_5608441183061375394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Η λύση για το customization ή το localization αν προτιμάτε των workflow actions ή εν γένει των workflow labels βρίσκεται στο sample της Oracle &lt;a href="https://soasamples.samplecode.oracle.com/files/documents/660/886/workflow-110-workflowCustomizations.zip"&gt;https://soasamples.samplecode.oracle.com/files/documents/660/886/workflow-110-workflowCustomizations.zip&lt;/a&gt; Βασικά, με αυτόν τον τρόπο παρέχεται πρόσβαση στα resource bundles που χρησιμοποιούνται από το σύστημα. Δεν έχουμε παρά να τα τροποποιήσουμε κατά το δοκούν και να φτιάξουμε ένα JAR από αυτό, που στο τέλος θα πρέπει να το δηλώσουμε στον Enterprise Manager. To αποτέλεσμα (σε αγγλικό περιβάλλον εκτέλεσης):&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-vPxiVAYfM40/TdUvq1FQNgI/AAAAAAAABTA/F5ZM4vybFZk/s1600/Screenshot-IGP%2B-%2BMozilla%2BFirefox.png"&gt;&lt;img style="cursor: pointer; width: 263px; height: 57px;" src="http://3.bp.blogspot.com/-vPxiVAYfM40/TdUvq1FQNgI/AAAAAAAABTA/F5ZM4vybFZk/s320/Screenshot-IGP%2B-%2BMozilla%2BFirefox.png" alt="" id="BLOGGER_PHOTO_ID_5608441323809945090" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-6665434999855783934?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/6665434999855783934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=6665434999855783934' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/6665434999855783934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/6665434999855783934'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/05/localization-human-tasks-oracle-soa.html' title='Localization των μηνυμάτων των human tasks του Oracle SOA Suite'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-4AvqLdtXxko/TdUvcE3i8PI/AAAAAAAABSw/TcvG8QSA3j4/s72-c/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BLFProcesses.jws%2B%253A%2BLF0201Process.jpr%2B%253A%2B-home-spk-Projects-workdir-igp-artifacts-LFProcesses-LF0201Process-CheckWork.task.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-5538166464102542129</id><published>2011-05-14T00:37:00.001+03:00</published><updated>2011-05-14T00:39:12.968+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle SOA Suite'/><title type='text'>Πώς μπορούμε να αλλάξουμε προγραμματιστικά το payload ενός human task notification</title><content type='html'>Κάτι χρήσιμο, ιδιαίτερα αν κατασκευάζουμε ένα custom worklist για το Oracle SOA Suite, είναι η αλλαγή του payload ενός human task notification. Όταν δηλώνουμε το data μοντέλο ενός human task, φροντίζουμε να προσδιορίσουμε ως editable τις μεταβλητές που μας ενδιαφέρουν.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-wycB_4bbvO4/Tc2k4slX-PI/AAAAAAAABSo/BoNzTtfA8ow/s1600/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BTestPayloadUpdate.jws%2B%253A%2BTestPayloadUpdate.jpr%2B%253A%2B-home-spk-Projects-workdir-TestPayloadUpdate-TestPayloadUpdate-Humantask1.task.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 103px;" src="http://1.bp.blogspot.com/-wycB_4bbvO4/Tc2k4slX-PI/AAAAAAAABSo/BoNzTtfA8ow/s320/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BTestPayloadUpdate.jws%2B%253A%2BTestPayloadUpdate.jpr%2B%253A%2B-home-spk-Projects-workdir-TestPayloadUpdate-TestPayloadUpdate-Humantask1.task.png" alt="" id="BLOGGER_PHOTO_ID_5606318405093685490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Μετά, με την χρήση του workflow API (&lt;a href="http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10660/toc.htm"&gt;http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10660/toc.htm&lt;/a&gt;) μπορούμε να χειριστούμε το payload ως στιγμιότυπο της κλάσης &lt;span style="font-family: monospace;"&gt;org.w3c.Document&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;            //Get the task query service&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;            ITaskQueryService querySvc = wfSvcClient.getTaskQueryService();&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;            Task task = querySvc.getTaskDetailsById(ctx, taskId);&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;            Element elPayload = task.getPayloadAsElement();&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;            if (elPayload != null &amp;amp;&amp;amp; elPayload.getOwnerDocument() != null) {&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;              Document myDoc = elPayload.getOwnerDocument();&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;              Node currentPayload = myDoc.getElementsByTagName("payload").item(0);&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;            }&lt;/span&gt;&lt;br /&gt;Για να αλλάξουμε μια μεταβλητή δεν έχουμε παρά να κάνουμε τον κατάλληλο χειρισμό της XML, πχ για ένα string attribute:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;                  Node newParam = myDoc.getElementsByTagName("attributeName");&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;                  newParam.setTextContent("newValue");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;H τελική αποθήκευση του payload απαιτεί την κλήση στη μέθοδο&lt;span style="font-family: monospace;"&gt; setPayloadAsElement()&lt;/span&gt; καθώς και την ενημέρωση της κατάστασης του human task (πχ "APPROVE", "REJECT")&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;            task.setPayloadAsElement((Element)currentPayload);&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;            ITaskService taskSvc = wfSvcClient.getTaskService();&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;            taskSvc.updateTaskOutcome(ctx, task, action);&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-5538166464102542129?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/5538166464102542129/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=5538166464102542129' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5538166464102542129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5538166464102542129'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/05/payload-human-task-notification.html' title='Πώς μπορούμε να αλλάξουμε προγραμματιστικά το payload ενός human task notification'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-wycB_4bbvO4/Tc2k4slX-PI/AAAAAAAABSo/BoNzTtfA8ow/s72-c/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BTestPayloadUpdate.jws%2B%253A%2BTestPayloadUpdate.jpr%2B%253A%2B-home-spk-Projects-workdir-TestPayloadUpdate-TestPayloadUpdate-Humantask1.task.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-762317127743791603</id><published>2011-05-03T22:47:00.000+03:00</published><updated>2011-05-03T22:48:12.061+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libreoffice'/><category scheme='http://www.blogger.com/atom/ns#' term='openSuSE'/><title type='text'>LibreOffice και openSuSE 11.2</title><content type='html'>Ανήκω σε αυτούς που πιστεύουν πως το openSuSE είναι από τις πιο στιβαρές, σταθερές και πλούσιες πλατφόρμες για development. Γι' αυτό το λόγο, μόλις ρυθμιστεί κατάλληλα ένα openSuSE σύστημα είναι δύσκολο να το εγκαταλείψεις για κάτι νεώτερο (ενώ το αυτόματο upgrade που επαγγέλλονται όλες οι διανομές μου αποδειχθεί επανειλημμένα ουτοπία). Στα τελευταία 4 χρόνια που τρέχω όλο μου το business σε Linux, έχω αλλάξει μόνο δυο εκδόσεις: τη SLED 10 και το openSuSE 11.2.&lt;br /&gt;&lt;br /&gt;Από την άλλη μεριά, υπάρχουν αρκετές μεταβολές στις οποίες πρέπει να προσαρμοστούμε και ανάμεσα σε αυτές είναι η ανάδειξη του LibreOffice ως παράγωγο του OpenOffice που αρχικά ερχόταν εγκατεστημένο με το openSuSE 11.2. Ευτυχώς υπάρχει λύση ως προς αυτό, αφού διατίθεται αποθετήριο με την τελευταία έκδοση του LibreOffice για το 11.2 με αναλυτικές οδηγιές στο &lt;a href="http://anl4u.com/how-to-install-libreoffice-in-opensuse.html"&gt;http://anl4u.com/how-to-install-libreoffice-in-opensuse.html&lt;/a&gt; Μόλις μάλιστα τελειώσουμε με τα βήματα της εγκατάστασης, ας προσθέσουμε από το Yast τα Writer και Draw extensions ώστε να εγκατασταθούν τα πρόσθετα του PDF import και του Google Docs.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/--_3K0-JepLE/TcBb6kR_DiI/AAAAAAAABSg/zZEceLAMjCE/s1600/Screenshot-Software%2BManager%2B-%2BYaST.png"&gt;&lt;img style="cursor: pointer; width: 269px; height: 320px;" src="http://4.bp.blogspot.com/--_3K0-JepLE/TcBb6kR_DiI/AAAAAAAABSg/zZEceLAMjCE/s320/Screenshot-Software%2BManager%2B-%2BYaST.png" alt="" id="BLOGGER_PHOTO_ID_5602578998178549282" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-762317127743791603?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/762317127743791603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=762317127743791603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/762317127743791603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/762317127743791603'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/05/libreoffice-opensuse-112.html' title='LibreOffice και openSuSE 11.2'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/--_3K0-JepLE/TcBb6kR_DiI/AAAAAAAABSg/zZEceLAMjCE/s72-c/Screenshot-Software%2BManager%2B-%2BYaST.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-2944315097265120737</id><published>2011-04-29T16:26:00.003+03:00</published><updated>2011-04-29T16:29:30.749+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><title type='text'>Πιο άνετη ανάγνωση σελίδων με το readability Firefox extension</title><content type='html'>Καθημερινά μπορεί να βρισκόμαστε αντιμέτωποι με το διάβασμα αρκετών σελίδων. Ένα χρήσιμο πρόσθετο (add-on) του Firefox είναι το readability (&lt;a href="https://addons.mozilla.org/en-us/firefox/addon/readability/"&gt;https://addons.mozilla.org/en-us/firefox/addon/readability/&lt;/a&gt;) που φροντίζει να κάνει τη διαδικασία του διαβάσματος μιας σελίδας πιο άνετη, αφαιρώντας πλαίσια (frames) ή άλλα διακοσμητικά ή διαφημιστικά στοιχεία, προβάλλοντας τη σελίδα μας σε λευκό καμβά, με μεγάλα ευανάγνωστα γράμματα. Μια ενδεικτική αναφορά του πρόσθετου σε μια σελίδα ακολουθεί:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-udQDWICkr9I/Tbq8yTp7kLI/AAAAAAAABSM/E_CCnPmZr7s/s1600/Screenshot-How%2Bto%2BMultitask%2Bat%2Bthe%2BLinux%2BCommand%2BLine%2Bwith%2BScreen%2B-%2BMozilla%2BFirefox.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 280px;" src="http://1.bp.blogspot.com/-udQDWICkr9I/Tbq8yTp7kLI/AAAAAAAABSM/E_CCnPmZr7s/s320/Screenshot-How%2Bto%2BMultitask%2Bat%2Bthe%2BLinux%2BCommand%2BLine%2Bwith%2BScreen%2B-%2BMozilla%2BFirefox.png" alt="" id="BLOGGER_PHOTO_ID_5600996659044257970" border="0" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-rx2ghhqcUhs/Tbq9F-MHzdI/AAAAAAAABSU/_qdXx1WQQMk/s1600/Screenshot-How%2Bto%2BMultitask%2Bat%2Bthe%2BLinux%2BCommand%2BLine%2Bwith%2BScreen%2B%257C%2Bmaketecheasier.com%2B%257C%2BReadability%2B-%2BMozilla%2BFirefox.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 280px;" src="http://3.bp.blogspot.com/-rx2ghhqcUhs/Tbq9F-MHzdI/AAAAAAAABSU/_qdXx1WQQMk/s320/Screenshot-How%2Bto%2BMultitask%2Bat%2Bthe%2BLinux%2BCommand%2BLine%2Bwith%2BScreen%2B%257C%2Bmaketecheasier.com%2B%257C%2BReadability%2B-%2BMozilla%2BFirefox.png" alt="" id="BLOGGER_PHOTO_ID_5600996996879470034" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-2944315097265120737?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/2944315097265120737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=2944315097265120737' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/2944315097265120737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/2944315097265120737'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/04/readability-firefox-extension.html' title='Πιο άνετη ανάγνωση σελίδων με το readability Firefox extension'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-udQDWICkr9I/Tbq8yTp7kLI/AAAAAAAABSM/E_CCnPmZr7s/s72-c/Screenshot-How%2Bto%2BMultitask%2Bat%2Bthe%2BLinux%2BCommand%2BLine%2Bwith%2BScreen%2B-%2BMozilla%2BFirefox.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-1477736190850725499</id><published>2011-04-22T15:29:00.000+03:00</published><updated>2011-04-22T15:31:03.423+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualbox'/><title type='text'>Μειώνοντας σε μέγεθος (compact) ένα Linux δυναμικό image του VirtualBox</title><content type='html'>Το να δημιουργήσουμε ένα dynamic expanded virtual disk στο VirtualBox είναι μια πολύ καλή επιλογή, ιδίως όταν οι απαιτήσεις μας σε αποθηκευτικό χώρο δεν είναι εκ των προτέρων γνωστές ή όταν θέλουμε να εξοικονομήσουμε αποθηκευτικό χώρο. Καθώς περνά ο χρόνος, ο εικονικός μας δίσκος και το αντίστοιχο φυσικό αρχείο στο δίσκο, προεκτείνεται όταν γεμίζει δεδομένα και διαγράφουμε αρχεία. Αποτέλεσμα: το φυσικό αρχείο στο δίσκο μας να είναι πολύ μεγαλύτερο της ουσιαστικής ανάγκης μας για αποθήκευση. Το VirtualBox μας δίνει την δυνατότητα να κάνουμε συμπαγή (compact) τον εικονικό μας δίσκο και αυτό το θέμα θα ήθελα να περιγράψω για το περιβάλλον του Linux. Για τα Windows υπάρχουν αντίστοιχες λύσεις (&lt;a href="http://forums.virtualbox.org/viewtopic.php?t=2507"&gt;http://forums.virtualbox.org/viewtopic.php?t=2507&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Προτού ξεκινήσουμε τη διαδικασία αυτή, είναι πολύ χρήσιμο να απαλλαγούμε από άχρηστα αρχεία στον δίσκο μας. Ένα εξαιρετικό εργαλείο είναι το JDiskReport (&lt;a href="http://www.jgoodies.com/freeware/jdiskreport/"&gt;http://www.jgoodies.com/freeware/jdiskreport/&lt;/a&gt;) που κάνει ανάλυση στα περιεχόμενα του δίσκου μας και παράγει ενδιαφέρουσες αναφορές, όπως για παράδειγμα για τα μεγαλύτερα αρχεία συνολικά ή ανά κατάλογο.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-m9mhNHW69nI/TbF0yxROZNI/AAAAAAAABR8/dvTZUTMbQ5E/s1600/Screenshot--%2B-%2BJDiskReport-4.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 194px;" src="http://1.bp.blogspot.com/-m9mhNHW69nI/TbF0yxROZNI/AAAAAAAABR8/dvTZUTMbQ5E/s320/Screenshot--%2B-%2BJDiskReport-4.png" alt="" id="BLOGGER_PHOTO_ID_5598384227366102226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-uLdzEwQboMM/TbF04JlKLQI/AAAAAAAABSE/qPk78G7tePQ/s1600/Screenshot--%2B-%2BJDiskReport-1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 194px;" src="http://2.bp.blogspot.com/-uLdzEwQboMM/TbF04JlKLQI/AAAAAAAABSE/qPk78G7tePQ/s320/Screenshot--%2B-%2BJDiskReport-1.png" alt="" id="BLOGGER_PHOTO_ID_5598384319791508738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;To JDiskReport είναι γραμμένο σε Java και μπορούμε να το εκτελέσουμε (ως root) ως εξής για να σαρώσουμε όλο το δίσκο μας.&lt;br /&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;java -Xmx1024m -jar jdiskreport-1.3.2.jar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Με τη βοήθεια των αναφορών, μπορούμε να διαγράψουμε άχρηστα αρχεία ή καταλόγους. Συμπληρωματικά μπορούμε να χρησιμοποιήσουμε ένα πρόγραμμα ανίχνευσης πολλαπλών αντιγραφών ενός αρχείου (πχ &lt;a href="http://freshmeat.net/projects/finddup"&gt;finddup&lt;/a&gt;, &lt;a href="http://www.pixelbeat.org/fslint/"&gt;FSlint&lt;/a&gt;) ώστε να ελευθερώσουμε ακόμα περισσότερο χώρο.&lt;br /&gt;&lt;br /&gt;Μετά από όλα αυτά, κάνουμε boot του λειτουργικού σε console (για παράδειγμα περνάμε την παράμετρο&lt;span style="font-family: monospace;"&gt; init 3 &lt;/span&gt;στο grub) και μπαίνουμε ως root. &lt;span style="font-style: italic;"&gt;Για κάθε ένα&lt;/span&gt; mount partition του δίσκου μας (πχ /, /home) που αντιστοιχεί σε διαφορετικό εικονικό δίσκο (πχ sda1, sda3) κάνουμε τα εξής:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;cd partition (πχ cd /)&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;dd if=/dev/zero of=EMPTY bs=1M&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Κατά την εκτέλεση της παραπάνω εντολής, ο δίσκος στο τρέχον partition θα γεμίσει στο 100%, οπότε θα εμφανιστεί και το μήνυμα, που θα αγνοήσουμε.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;dd: writing 'EMPTY': No space left on device&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Μετά από αυτό σβήνουμε το αρχείο:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;rm -rf EMPTY&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Και κάνουμε shutdown το virtual machine μας. Είμαστε έτοιμοι να κάνουμε compact το VirtualBox image μας (πχ linuxvm) ως εξής:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;VBoxManage modifyhd --compact linuxvm.vdi&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-1477736190850725499?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/1477736190850725499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=1477736190850725499' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/1477736190850725499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/1477736190850725499'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/04/compact-linux-image-virtualbox.html' title='Μειώνοντας σε μέγεθος (compact) ένα Linux δυναμικό image του VirtualBox'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-m9mhNHW69nI/TbF0yxROZNI/AAAAAAAABR8/dvTZUTMbQ5E/s72-c/Screenshot--%2B-%2BJDiskReport-4.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-8042346652898202395</id><published>2011-04-15T14:53:00.004+03:00</published><updated>2011-04-15T15:00:59.291+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='weblogic'/><title type='text'>Κλήση WLST script από ANT</title><content type='html'>Για να κάνουμε κλήση ενός WLST scipt από ANT, ας ορίσουμε στο property αρχείο μας την μεταβλητή &lt;span style="font-weight: bold;"&gt;weblogic.lib.dir&lt;/span&gt; ως εξής:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;weblogic.home.dir={weblogic installation directory}/wlserver_10.3&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;weblogic.lib.dir=${weblogic.home.dir}/server/lib&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Έπειτα, στο target μας ας κάνουμε τα ακόλουθα για να καλέσουμε ένα script (πχ myscript.py)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;taskdef name="wlst"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;      classname="weblogic.ant.taskdefs.management.WLSTTask"&lt;span style="font-family:Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;        &amp;lt;classpath&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;        &amp;lt;pathelement location="${weblogic.lib.dir}/weblogic.jar"/&lt;span style="font-family:Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;        &amp;lt;/classpath&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;      &amp;lt;/taskdef&lt;span style="font-family:Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;     &amp;lt;wlst debug="true" failOnError="true" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;            filename="myscript.py"&amp;gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;          &amp;lt;classpath&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;            &amp;lt;pathelement location="${weblogic.lib.dir}/weblogic.jar"/&lt;span style="font-family:Georgia,serif;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;           &amp;lt;/classpath&amp;gt;           &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;        &amp;lt;/wlst&amp;gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-8042346652898202395?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/8042346652898202395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=8042346652898202395' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/8042346652898202395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/8042346652898202395'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/04/wlst-script-ant.html' title='Κλήση WLST script από ANT'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-1050448836031632714</id><published>2011-04-13T23:11:00.001+03:00</published><updated>2011-04-13T23:13:23.029+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='weblogic'/><title type='text'>Κάνοντας τα πρώτα βήματα στα Weblogic scripts</title><content type='html'>To scripting στο Weblogic (WLST) είναι ένα πανίσχυρο εργαλείο διαχείρισης. Από την άλλη όμως, η εκμάθηση του είναι μάλλον δύσκολη υπόθεση (τουλάχιστον στην αρχή) μιας και είναι βασισμένο αφενός στην Jython και αφετέρου πρέπει να διαθέτουμε ειδικές γνώσεις ως προς τις δομές του Weblogic. Για να διευκολύνουμε τη διαδικασία εξοικείωσης με το WLST, μπορούμε να καταγράφουμε ως script, τις ενέργειες που κάνουμε στο Administration Console ώστε να το επεκτείνουμε κατά το δοκούν. H διαδικασία είναι εξαιρετικά απλή: κάνουμε click στο εικονίδιο Record στο πάνω μέρος της Administration Console. To σύστημα μας ειδοποιεί για το προορισμό του αρχείου που θα περιέχει σε μορφή script τις ενέργειες που θα ακολουθήσουν.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-HHW0E89pJak/TaYDkcMg2eI/AAAAAAAABRQ/uhMrq87I4U8/s1600/start_session.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 39px;" src="http://2.bp.blogspot.com/-HHW0E89pJak/TaYDkcMg2eI/AAAAAAAABRQ/uhMrq87I4U8/s320/start_session.png" alt="" id="BLOGGER_PHOTO_ID_5595163511633271266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Όταν θελήσουμε να δούμε τι καταγράφηκε ως script, θα ξαναπατήσουμε το εικονίδιο Record που θα μας ενημερώσει ξανά για το που βρίσκεται το script αρχείο.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-SExSrC0Pm8c/TaYDqTMIbpI/AAAAAAAABRY/zowGhMkPNBs/s1600/end_session.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 50px;" src="http://2.bp.blogspot.com/-SExSrC0Pm8c/TaYDqTMIbpI/AAAAAAAABRY/zowGhMkPNBs/s320/end_session.png" alt="" id="BLOGGER_PHOTO_ID_5595163612294966930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ο προορισμός του αρχείου είναι στον Weblogic Server, οπότε μπορούμε να το αντιγράψουμε από εκεί. Εναλλακτικά, και ιδίως αν δεν υπάρχει πρόσβαση αρχείων στον Weblogic Server, μπορούμε να κάνουμε click στο μενού Preferences-&amp;gt;WLST Script Recording-&amp;gt;Control, οπότε θα δούμε το script που μόλις δημιουργήθηκε.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-tlylGMREHMw/TaYDyHi9lwI/AAAAAAAABRg/Mq0Ex3oy-jo/s1600/recorded.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 226px;" src="http://2.bp.blogspot.com/-tlylGMREHMw/TaYDyHi9lwI/AAAAAAAABRg/Mq0Ex3oy-jo/s320/recorded.png" alt="" id="BLOGGER_PHOTO_ID_5595163746608453378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Από εκεί και πέρα, κάθε installation του Weblogic περιλαμβάνει Jython scripts για διάφορες διαχειριστικές λειτουργίες, άρα μπορούμε να αντλήσουμε και έτσι χρήσιμα παραδείγματα, ιδίως αν κάνουμε εγκατάσταση και τα examples. Τέλος κάποιες χρήσιμες αναφορές:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Oracle documentation: &lt;a href="http://download.oracle.com/docs/cd/E17904_01/web.1111/e13715/toc.htm"&gt;http://download.oracle.com/docs/cd/E17904_01/web.1111/e13715/toc.htm&lt;/a&gt;&lt;br /&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://wlstbyexamples.blogspot.com/"&gt;http://wlstbyexamples.blogspot.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://middlewaremagic.com/weblogic/?page_id=1492"&gt;http://middlewaremagic.com/weblogic/?page_id=1492&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-1050448836031632714?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/1050448836031632714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=1050448836031632714' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/1050448836031632714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/1050448836031632714'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/04/weblogic-scripts.html' title='Κάνοντας τα πρώτα βήματα στα Weblogic scripts'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-HHW0E89pJak/TaYDkcMg2eI/AAAAAAAABRQ/uhMrq87I4U8/s72-c/start_session.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-3969679870282865885</id><published>2011-03-28T22:40:00.003+03:00</published><updated>2011-03-28T22:43:05.354+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle SOA Suite'/><title type='text'>Κάνοντας testing σε business events του Oracle SOA Suite</title><content type='html'>Αναμφίβολα ένα από τα κυριότερα χαρακτηριστικά του Oracle SOA Suite 11g είναι η εκκίνηση και κατανάλωση business events (&lt;a href="http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10224/obe_intro.htm#CHDIBHBE"&gt;http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10224/obe_intro.htm#CHDIBHBE&lt;/a&gt;) από διάφορα στοιχεία της πλατφόρμας όπως ADF BC, BPEL, BPM και η διακίνησή τους διαμέσου του EDN (Event Delivery Network) Πώς μπορούμε όμως να δοκιμάσουμε, με αυτοματοποιημένο, επαναληπτικό τρόπο ένα business event;&lt;br /&gt;&lt;br /&gt;Αν συνδεθούμε στον Enterprise Manager και ανατρέξουμε στα business events που τρέχουν, τότε επιλέγοντας ένα από αυτά, παρουσιάζεται η επιλογή Test.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-UkW2C370icQ/TZDkWHa31WI/AAAAAAAABQ4/RtMaLqpw4WI/s1600/test_edn_1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 190px;" src="http://2.bp.blogspot.com/-UkW2C370icQ/TZDkWHa31WI/AAAAAAAABQ4/RtMaLqpw4WI/s320/test_edn_1.png" alt="" id="BLOGGER_PHOTO_ID_5589218206166799714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Πατώντας αυτό το κουμπί, βρισκόμαστε αντιμέτωποι με μια οθόνη που θα πρέπει να συμπληρώσουμε το payload του business event. Προτού αναφερθούμε στο τι θα πληκτρολογήσουμε σε αυτήν την περιοχή, ας συγκρατήσουμε δυο πληροφορίες: το όνομα του event και το namespace στο οποίο ανήκει.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-f2U4EGbF8bM/TZDkc62_rpI/AAAAAAAABRA/3m8Xl1FM6Ng/s1600/test_edn_2.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 231px;" src="http://1.bp.blogspot.com/-f2U4EGbF8bM/TZDkc62_rpI/AAAAAAAABRA/3m8Xl1FM6Ng/s320/test_edn_2.png" alt="" id="BLOGGER_PHOTO_ID_5589218323054177938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Τώρα προκειμένου να μάθουμε τι μορφή του XML payload που προκύπτει από ένα business event, δεν έχουμε παρά να ενεργοποιήσουμε το business event logging (&lt;a href="http://www.xenta.nl/blog/2010/05/09/oracle-soa-suite-11g-enable-logging-for-edn-events/"&gt;http://www.xenta.nl/blog/2010/05/09/oracle-soa-suite-11g-enable-logging-for-edn-events/&lt;/a&gt;) και να παράγουμε ένα δοκιμαστικό μήνυμα ώστε να μπορούμε να το αναπαράγουμε στην συνέχεια. O πίνακας που κρατάει το logging του EDN είναι ο&lt;span style="font-family:monospace;"&gt; edn_log_messages&lt;/span&gt; και βρίσκεται στο SOAINFRA σχήμα.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-TBvcMtsG-iA/TZDklOHsLgI/AAAAAAAABRI/kb6DPl1WewA/s1600/test_edn_3.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 176px;" src="http://3.bp.blogspot.com/-TBvcMtsG-iA/TZDklOHsLgI/AAAAAAAABRI/kb6DPl1WewA/s320/test_edn_3.png" alt="" id="BLOGGER_PHOTO_ID_5589218465663430146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Έχοντας και αυτή την πληροφορία στα χέρια μας, μπορούμε να συμπληρώσουμε το XML payload στον Enterprise Manager αλλάζοντας απλά το id του μηνύματος (ώστε να διατηρήσουμε την μοναδικότητα των μηνυμάτων) και να πατήσουμε το κουμπί Publish. Επιπρόσθετα, για να κάνουμε έναν αυτοματισμό του testing μας, μπορούμε να στείλουμε απευθείας το XML payload στο message queue που τα διαχειρίζεται με την βοήθεια PL/SQL. Αναλυτικότερα, η PL/SQL procedure του SOAINFRA σχήματος με το signature:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;procedure edn_publish_event(namespace in varchar2, local_name in varchar2, payload in clob, priority in binary_integer default 5)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;είναι αυτό ακριβώς που ψάχνουμε. Γνωρίζοντας το namespace και το local name του event (που τα "ανακαλύψαμε" στον Enterprise Manager) καθώς και το XML payload, μπορούμε να καλέσουμε την procedure, κάνοντας commit στο τέλος. Το business event θα ξεκινήσει χωρίς να χρειαστεί να έχουμε στη διάθεση μας ένα user interface.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-3969679870282865885?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/3969679870282865885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=3969679870282865885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3969679870282865885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3969679870282865885'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/03/testing-business-events-oracle-soa.html' title='Κάνοντας testing σε business events του Oracle SOA Suite'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-UkW2C370icQ/TZDkWHa31WI/AAAAAAAABQ4/RtMaLqpw4WI/s72-c/test_edn_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-6572240913345600737</id><published>2011-03-16T23:58:00.001+02:00</published><updated>2011-03-17T00:01:03.660+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='openSuSE'/><title type='text'>Μετάβαση (migration) από το Evolution στο Seamonkey Mail</title><content type='html'>Ως χρήστης του openSuSE 11.2, μέχρι πρόσφατα χρησιμοποιούσα το Gnome Evolution 2.28 για την αλληλογραφία μου. Αν και σε γενικές γραμμές ήμουν ευχαριστημένος, δεν άργησαν να γίνονται ενοχλητικά μερικά προβλήματα. Για παράδειγμα η απόδοση (rendering) HTML μηνυμάτων κάποιες φορές δεν τα κατάφερνε καθόλου καλά. Επίσης το φόρτωμα της αλληλογραφίας άρχισε να καθυστερεί χαρακτηριστικά γράφοντας το μήνυμα "Storing folder" για αρκετά δευτερόλεπτα.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-tZIj2uty-ZI/TYEy6cNXudI/AAAAAAAABQw/Uqj89sKyOq4/s1600/storing.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 6px;" src="http://4.bp.blogspot.com/-tZIj2uty-ZI/TYEy6cNXudI/AAAAAAAABQw/Uqj89sKyOq4/s320/storing.png" alt="" id="BLOGGER_PHOTO_ID_5584800992502200786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Η αναβάθμιση σε μια επόμενη έκδοση του openSuSE δεν αποτελεί (προς το παρόν) επιλογή μιας και έχω φτιάξει ένα πολύ σταθερό περιβάλλον εργασίας με αρκετές παραμετροποιήσεις. Οπότε, θέλοντας να αλλάξω τον Linux email client κατέληξα στη σουίτα του Seamonkey (&lt;a href="http://www.seamonkey-project.org/"&gt;http://www.seamonkey-project.org/&lt;/a&gt;) που έτσι και αλλιώς χρησιμοποιούσα πριν κάποια χρόνια ως Netscape Communicator.&lt;br /&gt;&lt;br /&gt;Η μεταφορά των αρχείων μου από το Evolution ήταν μια ευχάριστη έκπληξη γιατί ολοκληρώθηκε δίχως προβλήματα:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;για την μεν μεταφορά του email υπάρχει το ειδικό extension ImportExportTools (&lt;a href="https://nic-nac-project.org/%7Ekaosmos/index-en.html"&gt;https://nic-nac-project.org/~kaosmos/index-en.html&lt;/a&gt;) που διαβάζει τα mbox αρχεία του Evolution&lt;/li&gt;&lt;li&gt;ως προς την μεταφορά των contacts, το Evolution επιτρέπει την μαζική αποθήκευση τους σε μορφή vCard (vcf) Υπάρχουν πολλά εργαλεία, όπως για παράδειγμα αυτός ο online μετατροπέας (&lt;a href="http://labs.brotherli.ch/vcfconvert/"&gt;http://labs.brotherli.ch/vcfconvert/&lt;/a&gt;) για την αντιστοίχηση από μορφή vcf σε ldif ώστε να εισαχθεί (import) τελικά στο Seamonkey. &lt;/li&gt;&lt;/ul&gt; Ένα ακόμα χρήσιμο extension είναι το launchy (&lt;a href="http://gemal.dk/mozilla/launchy.html"&gt;http://gemal.dk/mozilla/launchy.html&lt;/a&gt;) που μας επιτρέπει να ανοίξουμε ένα link που περιλαμβάνεται σε ένα email, σε browser (πχ Firefox) πλην του default Seamonkey. &lt;br /&gt;&lt;br /&gt;Μια εβδομάδα ύστερα από την μετάπτωση είμαι πραγματικά πολύ ικανοποιημένος από την ταχύτητα, τις ρυθμίσεις αναζήτησης και ταξινόμησης και την εν γένει λειτουργικότητα του Seamonkey email.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-6572240913345600737?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/6572240913345600737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=6572240913345600737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/6572240913345600737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/6572240913345600737'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/03/migration-evolution-seamonkey-mail.html' title='Μετάβαση (migration) από το Evolution στο Seamonkey Mail'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-tZIj2uty-ZI/TYEy6cNXudI/AAAAAAAABQw/Uqj89sKyOq4/s72-c/storing.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-6996568518406413726</id><published>2011-03-08T17:02:00.001+02:00</published><updated>2011-03-08T17:02:44.049+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle Application Server'/><title type='text'>Αποτρέποντας χρήστες μας από το να συνδεθούν σε εφαρμογές του Oracle Application Server</title><content type='html'>Δυστυχώς ο Oracle Application Server (OAS) δεν διαθέτει τη δυνατότητα να ξεκινήσουμε τις εφαρμογές μας σε Administration mode (όπως κάνει ο Weblogic) ώστε να μην μπορούν να συνδεθούν οι χρήστες μας, αλλά παράλληλα ως διαχειριστές να κάνουμε διάφορες δουλειές. Το μόνο που μπορούμε να κάνουμε είναι να σταματήσουμε την εξυπηρέτηση για συγκεκριμένες εφαρμογές εξ ολοκλήρου, με την εξής σύνταξη:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;opmnctl stopproc application=app1 application=app2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Έτσι, παρόλο που το OC4J group μας είναι active, οι χρήστες δεν μπορούν να συνδεθούν στις εφαρμογές app1, app2. Αντίστοιχα, για να ξεκινήσουμε τις εφαρμογές τις οποίες διακόψαμε:&lt;br /&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;opmnctl startproc application=app1 application=app2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Σε περίπτωση που δουλεύουμε σε cluster, θα χρησιμοποιήσουμε την κατάλληλη σύνταξη:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;opmnctl @cluster stopproc application=app1 application=app2&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-6996568518406413726?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/6996568518406413726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=6996568518406413726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/6996568518406413726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/6996568518406413726'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/03/oracle-application-server.html' title='Αποτρέποντας χρήστες μας από το να συνδεθούν σε εφαρμογές του Oracle Application Server'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-5292781864722867776</id><published>2011-02-27T12:04:00.000+02:00</published><updated>2011-02-27T12:05:16.585+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualbox'/><title type='text'>Πόσο χρόνο είναι σε λειτουργία το virtual machine μου;</title><content type='html'>Χρησιμοποιώ κατά κόρον virtual machines βασισμένα στο VirtualBox για την ανάπτυξη στα προϊόντα της Oracle. Ανάμεσα σε άλλα, έχω φτιάξει ένα virtual machine που τρέχει CentOS και λειτουργεί ως database server. Πρόκειται για μια εικονική μηχανή που χρησιμοποιώ διαρκώς για πολλά έργα και πρακτικά δεν την κάνω reboot ή shutdown συχνά: όταν τελειώνω με την εργασία μου αποθηκεύω την κατάσταση της μηχανής (save machine state) ώστε γρήγορα να κάνω ανάκτηση (restore) την επόμενη φορά.&lt;br /&gt;&lt;br /&gt;Αλήθεια, πόσο χρόνο έχει uptime ένα virtual machine; Εκδίδοντας την εντολή &lt;span style="font-weight: bold;"&gt;uptime&lt;/span&gt;, λαμβάνουμε ένα παραπλανητικό μήνυμα όσον αφορά τη διάρκεια, όπως στην περίπτωσή μου:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; 11:50:22 up 20:41,  2 users,  load average: 0.02, 0.01, 0.00&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Οι 20 ώρες ανταποκρίνονται στην "πραγματική" λειτουργία της μηχανής, αθροίζοντας τις ώρες μετά από κάθε restore state μέχρι το επόμενο save state. Για να δούμε την ώρα του τελευταίου reboot, πληκτρολογούμε την εντολή:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace; font-weight: bold;"&gt;last -1 reboot&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: monospace;"&gt;reboot   system boot  2.6.18-194.26.1. Tue Feb 12 16:11         (4+19:44)   &lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: monospace;"&gt;wtmp begins Wed Mar 24 17:58:33 2010&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Έτσι μαθαίνουμε πως η μηχανή είναι σε λειτουργία από τις 12 Φλεβάρη 2011.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-5292781864722867776?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/5292781864722867776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=5292781864722867776' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5292781864722867776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5292781864722867776'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/02/virtual-machine.html' title='Πόσο χρόνο είναι σε λειτουργία το virtual machine μου;'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-5786476615498514681</id><published>2011-02-16T14:00:00.000+02:00</published><updated>2011-02-16T14:01:24.514+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>Άντληση πληροφοριών για το περιβάλλον εκτέλεσης μιας ADF εφαρμογής</title><content type='html'>Διάφορες, πολύ σημαντικές πληροφορίες σχετικά με το περιβάλλον εκτέλεσης (runtime) και το πλαίσιο (context) λειτουργίας μιας ADF εφαρμογής, βρίσκονται στην κλάση &lt;code&gt;oracle.adf.share.ADFContext&lt;/code&gt;.&lt;br /&gt;(το JavaDoc βρίσκεται &lt;a href="http://download.oracle.com/docs/cd/E15523_01/apirefs.1111/e10686/oracle/adf/share/ADFContext.html"&gt;εδώ&lt;/a&gt;) Σε αυτήν την κλάση θα βρούμε διάφορες μεθόδους που μπορούμε άμεσα να εκμεταλλευτούμε από τα ADF BC (Application Modules, View Objects, Entities), όπως για παράδειγμα:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;getCurrent(): αντλεί το ADF Context για το ενεργό thread&lt;br /&gt;  &lt;/li&gt;&lt;li&gt;isHttpContext(): μας δίνει την πληροφορία για το αν τα ADF components μας τρέχουν ως μέρος μιας web εφαρμογής&lt;/li&gt;&lt;li&gt;getSecurityContext(): ώστε να αντλήσουμε πληροφορία σχετικά με το περιβάλλον ασφάλειας της εφαρμογής (πχ. logged-in χρήστης, ρόλους και ομάδες στις οποίες ανήκει, κλπ)&lt;br /&gt;  &lt;/li&gt;&lt;li&gt;getEnvironment(): σε περίπτωση που το περιβάλλον εκτέλεσης είναι μια web εφαρμογή, τότε αποκτούμε πρόσβαση στα request, session και response objects του servlet/faces runtime context από τα ADF business components. Αν και ακούγεται εξαιρετικά επικίνδυνο, άκομψο και εν γένει bad-practice, αυτή η κλήση μου φάνηκε εξαιρετικά χρήσιμη ώστε να γίνει initialize το workflow context του Oracle BPM, για τον logged-in χρήστη, αφού μπορεί να αρχικοποιηθεί με βάση ένα ενεργό web authenticated session. &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-5786476615498514681?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/5786476615498514681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=5786476615498514681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5786476615498514681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5786476615498514681'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/02/adf.html' title='Άντληση πληροφοριών για το περιβάλλον εκτέλεσης μιας ADF εφαρμογής'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-7121941039471341114</id><published>2011-02-14T00:47:00.004+02:00</published><updated>2011-06-21T15:42:36.979+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libreoffice'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenOffice'/><title type='text'>Αναιρώντας το master template από μια διαφάνεια του OpenOffice Impress</title><content type='html'>Σε μια παρουσίαση που φτιάχνουμε στο OpenOffice Impress, μπορεί να παρουσιαστεί η ανάγκη να εμφανίσουμε μια εικόνα που το μέγεθος καταλαμβάνει μεγάλο κομμάτι της διαφάνειας, καταστρέφοντας ενδεχομένως το βασικό μας layout στο Slide master. Ακολουθεί ένα τέτοιο παράδειγμα, όπου το πάνω πλαίσιο του slide master layout έχει καλυφθεί από την εικόνα που προσθέσαμε.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-yginwQDkNps/TVhf2aAA2XI/AAAAAAAABQc/uGMbYzPAiaM/s1600/Screenshot-ADF_Day1-ADF%2BBC.odp%2B-%2BOpenOffice.org%2BImpress.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 241px;" src="http://4.bp.blogspot.com/-yginwQDkNps/TVhf2aAA2XI/AAAAAAAABQc/uGMbYzPAiaM/s320/Screenshot-ADF_Day1-ADF%2BBC.odp%2B-%2BOpenOffice.org%2BImpress.png" alt="" id="BLOGGER_PHOTO_ID_5573309927167940978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ειδικά για αυτές τις περιπτώσεις, η λύση είναι ένα click μακριά: δεξί click στην διαφάνεια μας και έπειτα απενεργοποιούμε την επιλογή "Display Objects From Master".&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-EOk0krKGang/TVhf_hZVkJI/AAAAAAAABQk/YNBirEvEJlY/s1600/Screenshot.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 148px;" src="http://2.bp.blogspot.com/-EOk0krKGang/TVhf_hZVkJI/AAAAAAAABQk/YNBirEvEJlY/s320/Screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5573310083772027026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Με αυτόν τον τρόπο, δημιουργείται μια λευκή σελίδα (χωρίς πρότυπο) ώστε να προσθέσουμε εμείς το περιεχόμενο που επιθυμούμε, όπου και όπως θέλουμε.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-7121941039471341114?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/7121941039471341114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=7121941039471341114' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7121941039471341114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/7121941039471341114'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/02/master-template-openoffice-impress.html' title='Αναιρώντας το master template από μια διαφάνεια του OpenOffice Impress'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-yginwQDkNps/TVhf2aAA2XI/AAAAAAAABQc/uGMbYzPAiaM/s72-c/Screenshot-ADF_Day1-ADF%2BBC.odp%2B-%2BOpenOffice.org%2BImpress.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-5461398331476088934</id><published>2011-02-07T00:18:00.005+02:00</published><updated>2011-02-07T00:28:28.783+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BPEL'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>Εμφάνιση δεδομένων ενός java.util.List σε μια ADF JSF σελίδα</title><content type='html'>Δουλεύοντας στην κατασκευή ενός προσαρμοσμένου Oracle BPM worklist application, έχουμε προσθέσει μια μέθοδο στο Application Module με το ακόλουθο signature:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;public List getNotificationOutcomes(String notificationId);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Πρόκειται για μια συνάρτηση που επιστρέφει τις δυνατές ενέργειες που μπορούν να πραγματοποιηθούν σε ένα notification. Για παράδειγμα: Approve ή Reject. O τύπος των δεδομένων που περιλαμβάνει η λίστα είναι ο &lt;span style="font-family:monospace;"&gt;oracle.bpel.services.workflow.task.model.ActionType&lt;/span&gt;, που για την ακρίβεια πρόκειται για interface με δυο μεθόδους:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;String getDisplayName();&lt;/span&gt;  &lt;span style="font-family:monospace;"&gt;&lt;br /&gt;String getAction();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Θέλοντας να εμφανίσουμε λοιπόν σε ένα μενού επιλογών ή σε μια σειρά κουμπιών τα στοιχεία αυτής της λίστας, ώστε ο χρήστης να αλληλεπιδράσει με το human task μας, μπορούμε να χρησιμοποιήσουμε το &lt;span style="font-weight: bold;"&gt;af:iterator&lt;/span&gt; component αφού στην αρχή κάνουμε drag-and-drop το return type του component μας στην σελίδα μας με την επιλογή εμφάνισης ως ADF read-only table. Παρατηρείστε πως η μεταβλητή των δεδομένων που επιστρέφει η function ονομάζεται ως element στα ADF bindings.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_RJFKX1cK_dA/TU8e_vgyGTI/AAAAAAAABQM/jomMgafE7rY/s1600/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BWorklistUI.jws%2B%253A%2BViewController.jpr-1.png"&gt;&lt;img style="cursor: pointer; width: 263px; height: 85px;" src="http://2.bp.blogspot.com/_RJFKX1cK_dA/TU8e_vgyGTI/AAAAAAAABQM/jomMgafE7rY/s320/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BWorklistUI.jws%2B%253A%2BViewController.jpr-1.png" alt="" id="BLOGGER_PHOTO_ID_5570705344515152178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Έπειτα από αυτό, διαπιστώνουμε πως οι τιμές του table μας προέρχονται από ένα collection model που με τη σειρά του πηγάζει από τον τύπο return της συνάρτησής μας στο Application Module.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_RJFKX1cK_dA/TU8fJhOAHmI/AAAAAAAABQU/euzu9ziO7k8/s1600/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BWorklistUI.jws%2B%253A%2BViewController.jpr%2B%253A%2B-home-spk-Projects-workdir-igp-artifacts-WorklistUI-ViewController-public_html-worklist.jspx.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 74px;" src="http://4.bp.blogspot.com/_RJFKX1cK_dA/TU8fJhOAHmI/AAAAAAAABQU/euzu9ziO7k8/s320/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BWorklistUI.jws%2B%253A%2BViewController.jpr%2B%253A%2B-home-spk-Projects-workdir-igp-artifacts-WorklistUI-ViewController-public_html-worklist.jspx.png" alt="" id="BLOGGER_PHOTO_ID_5570705512476974690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Αυτή είναι είναι ακριβώς και η μορφή των δεδομένων (collection model) που περιμένει ως είσοδο o af:iterator, που αποτελεί μια παραλλαγή του JSTL foreach tag. Σβήνουμε λοιπόν το af:table και προσθέτουμε το iterator component, για να παράγει για παράδειγμα menu list items.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;af:iterator value="#{bindings.return.collectionModel}" var="actionRow"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;rows="#{bindings.return.rangeSize}" id="i1"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;   &amp;lt;af:commandMenuItem text="#{actionRow.element.displayName}" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;/af:iterator&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Αξίζει σε αυτό το σημείο να σημειωθεί πως "επίτηδες" ο τύπος των αποτελεσμάτων είναι List και όχι σε generic format, πχ List&lt;actiontype&gt; μιας και στον JDeveloper 11.1.1.3 προκύπτει ένα φοβερό μήνυμα του στυλ: &lt;span style="font-family:monospace;"&gt;MDS-01161: Reference "/java/util/List&amp;lt;...&amp;gt;" has an invalid character&lt;oracle bpel="" services="" workflow="" task="" model="" xml=""&gt;&lt;br /&gt;&lt;br /&gt;&lt;/oracle&gt;&lt;/span&gt;&lt;/actiontype&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-5461398331476088934?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/5461398331476088934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=5461398331476088934' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5461398331476088934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5461398331476088934'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/02/javautillist-adf-jsf.html' title='Εμφάνιση δεδομένων ενός java.util.List σε μια ADF JSF σελίδα'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_RJFKX1cK_dA/TU8e_vgyGTI/AAAAAAAABQM/jomMgafE7rY/s72-c/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BWorklistUI.jws%2B%253A%2BViewController.jpr-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-700599512243065287</id><published>2011-01-29T13:40:00.000+02:00</published><updated>2011-01-29T13:42:15.414+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='jdeveloper'/><title type='text'>Περί κωδικών σφαλμάτων σε ojdeploy scripts στα Windows και στο Linux</title><content type='html'>Μια εξαιρετική περιγραφή του &lt;span style="font-weight: bold;"&gt;ojdeploy&lt;/span&gt; και μάλιστα σε σχέση με ένα ANT script βρίσκεται εδώ (&lt;a href="http://jdeveloperfaq.blogspot.com/2010/01/faq-10-how-to-configure-ojdeploy-as-ant.html"&gt;http://jdeveloperfaq.blogspot.com/2010/01/faq-10-how-to-configure-ojdeploy-as-ant.html&lt;/a&gt;) Αν μάλιστα κατασκευάσουμε ένα ojdeploy deployment script που θα καλείται από το πρόγραμμα ojdeploy, τότε θα χρειαστεί να χειριστούμε τον κωδικό λάθους που θα προκύψει ώστε να συνεχίσουμε ανάλογα την ροή του script μας. Όπως έχω παρατηρήσει, αν προκύψει compilation error, τότε ο κωδικός που επιστρέφει το ojdeploy είναι το 4, ενώ αν όλα πάνε καλά το 0.&lt;br /&gt;&lt;br /&gt;Σε περιβάλλον Linux, θα μπορούσαμε να έχουμε μια ροή script που θα πάει όπως στο παράδειγμα που ακολουθεί. Σε ένα shell script, η έκφραση $? κρατά τον κωδικό λάθους της τελευταίας εντολής, ενώ η ανακατεύθυνση της εξόδου λαθών (error stream) τροφοδοτείται στο standard output (έκφραση 2&gt;&amp;amp;1)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;$OJDEPLOY_ROOT/ojdeploy -buildfile ojdeploy-build.xml -define app_root_dir=$DEV_ROOT &amp;gt; $DEV_TMPDIR/ojdeploy.txt 2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;if [ "$?" -ne "0" ]; then&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;    echo "ojdeploy failed"&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;    exit 1&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;else&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;    exit 0&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;fi    &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;αντίστοιχα στα Windows η μεταβλητή errorlevel διατηρεί το exit code της τελευταίας εντολής.&lt;br /&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;%OJDEPLOY_ROOT%\ojdeploy -buildfile ojdeploy-build.xml -define app_root_dir=%DEV_ROOT% &amp;gt; %TEMP%/ojdeploy.txt 2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: monospace;"&gt;if %errorlevel% LEQ 1 goto done&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;echo ojdeploy failed&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;exit /b 1&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: monospace;"&gt;:done&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;exit /b 0&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-700599512243065287?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/700599512243065287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=700599512243065287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/700599512243065287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/700599512243065287'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/01/ojdeploy-scripts-windows-linux.html' title='Περί κωδικών σφαλμάτων σε ojdeploy scripts στα Windows και στο Linux'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-2408229454132990212</id><published>2011-01-20T22:14:00.002+02:00</published><updated>2011-01-20T22:16:59.452+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Κατέβασμα (download) του documentation του Oracle Fusion Middleware 11.1.1.4</title><content type='html'>Έχω μια συγκεντρωτική συνήθεια που θέλει όλο το υλικό και την τεκμηρίωση των εργαλείων και των έργων στο οποίο συμμετέχω να βρίσκεται αποθηκευμένο στο laptop μου. Έτσι, την προηγούμενη εβδομάδα που κυκλοφόρησε η έκδοση 11.1.1.4 του Fusion Middleware θέλησα να κρατήσω τοπικά αντίγραφα της τεκμηρίωσης.&lt;br /&gt;&lt;br /&gt;Στις παλαιότερες εκδόσεις της Oracle (9i και 10g τουλάχιστον από όσο γνωρίζω) το documentation προσφερόταν για download ως zip αρχείο. Αυτό όμως έχει αλλάξει και πια η οθόνη του download δεν διαθέτει αυτή την δυνατότητα ενώ είναι φυσικά και διαμορφωμένη πολύ διαφορετικά.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_RJFKX1cK_dA/TTiYE5fnIlI/AAAAAAAABQA/_4CZzFMg0rg/s1600/Screenshot-Oracle%2BFusion%2BMiddleware%2B11g%2B%252811.1.1.4%2529%2BDocumentation%2BLibrary%2B-%2BMozilla%2BFirefox.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 227px;" src="http://1.bp.blogspot.com/_RJFKX1cK_dA/TTiYE5fnIlI/AAAAAAAABQA/_4CZzFMg0rg/s320/Screenshot-Oracle%2BFusion%2BMiddleware%2B11g%2B%252811.1.1.4%2529%2BDocumentation%2BLibrary%2B-%2BMozilla%2BFirefox.png" alt="" id="BLOGGER_PHOTO_ID_5564364549536555602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Προκειμένου να κατεβάσουμε (download) όλο το documentation της πιο πρόσφατης έκδοσης στον τοπικό μας δίσκο, δεν έχουμε παρά να εκμεταλλευτούμε το &lt;span style="font-weight: bold;"&gt;wget&lt;/span&gt; ώστε να κάνει crawling στο site της Oracle. Πιο συγκεκριμένα η βασική σελίδα του documentation είναι η  &lt;a href="http://download.oracle.com/docs/cd/E17904_01/index.htm"&gt;http://download.oracle.com/docs/cd/E17904_01/index.htm&lt;/a&gt; άρα εκτελούμε την εντολή:&lt;br /&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;wget -r -np -nc -nH http://download.oracle.com/docs/cd/E17904_01/index.htm&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Η διαδικασία θα πάρει αρκετή ώρα και συνολικά θα κατέβουν γύρω στις 100,000 αρχεία συνολικού μεγέθους 2.6 GB. Τα αρχεία αυτά περιλαμβάνουν την τεκμηρίωση σε μορφή html και pdf καθώς και όλα τα JavaDoc των προϊόντων.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-2408229454132990212?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/2408229454132990212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=2408229454132990212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/2408229454132990212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/2408229454132990212'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/01/download-documentation-oracle-fusion.html' title='Κατέβασμα (download) του documentation του Oracle Fusion Middleware 11.1.1.4'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_RJFKX1cK_dA/TTiYE5fnIlI/AAAAAAAABQA/_4CZzFMg0rg/s72-c/Screenshot-Oracle%2BFusion%2BMiddleware%2B11g%2B%252811.1.1.4%2529%2BDocumentation%2BLibrary%2B-%2BMozilla%2BFirefox.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-933691534204359993</id><published>2011-01-07T22:28:00.002+02:00</published><updated>2011-01-07T22:30:49.657+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Developer'/><category scheme='http://www.blogger.com/atom/ns#' term='jdeveloper'/><title type='text'>Ανάκτηση αποθηκευμένων (saved) passwords από συνδέσεις σε SQL Developer και JDeveloper</title><content type='html'>Χρησιμοποιώ τον Oracle SQL Developer για να συνδέομαι σε διάφορες βάσεις πελατών μου. Χθες βρέθηκα στην εξής κατάσταση: χρειάστηκε να τρέξω ένα SQL script σε μια βάση από command-line, για την οποία δεν είχα σημειώσει το password του SYSTEM. Για καλή μου τύχη, είχα βέβαια δημιουργήσει παλαιότερα μια σύνδεση στον SQL Developer, αλλά ως γνωστόν το password δεν εμφανίζεται σε αναγνώσιμη μορφή.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_RJFKX1cK_dA/TSd3lNgZJxI/AAAAAAAABPw/REx-575MW6Q/s1600/Screenshot-New%2B-%2BSelect%2BDatabase%2BConnection.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 202px;" src="http://3.bp.blogspot.com/_RJFKX1cK_dA/TSd3lNgZJxI/AAAAAAAABPw/REx-575MW6Q/s320/Screenshot-New%2B-%2BSelect%2BDatabase%2BConnection.png" alt="" id="BLOGGER_PHOTO_ID_5559543746176558866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Οι συνδέσεις αποθηκεύονται σε ένα ειδικό αρχείο ονόματι &lt;span style="font-family:monospace;"&gt;connections.xml&lt;/span&gt; και ορίζονται στο HOME του χρήστη. Στην έκδοση 2.1 του SQL Developer βρίσκονται στην διαδρομή &lt;span style="font-family:monospace;"&gt;$ΗΟΜΕ/.sqldeveloper/system2.1.0.63.73/o.jdeveloper.db.connection.11.1.1.2.36.55.30/connections.xml&lt;/span&gt; Ανοίγοντας αυτό το αρχείο, βρίσκουμε σε κρυπτογραφημένη μορφή (encrypted) τα passwords των συνδέσεων μας.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_RJFKX1cK_dA/TSd3s8bH8QI/AAAAAAAABP4/XjYKrDHmitg/s1600/Screenshot-spk%2540linux-spk%253A%257E-.sqldeveloper.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 94px;" src="http://4.bp.blogspot.com/_RJFKX1cK_dA/TSd3s8bH8QI/AAAAAAAABP4/XjYKrDHmitg/s320/Screenshot-spk%2540linux-spk%253A%257E-.sqldeveloper.png" alt="" id="BLOGGER_PHOTO_ID_5559543879030010114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Προκειμένου να αποκωδικοποιήσουμε (decrypt) αυτό το password, υπάρχει μια θαυμάσια απάντηση στο stackoverflow.com (&lt;a href="http://stackoverflow.com/questions/1032721/does-anybody-know-what-encrypting-technique-is-jdeveloper-sql-developer-using-to"&gt;http://stackoverflow.com/questions/1032721/does-anybody-know-what-encrypting-technique-is-jdeveloper-sql-developer-using-to&lt;/a&gt;) που συνοψίζεται στην κατασκευή ενός προγράμματος, το οποίο περιμένει ως είσοδο ένα κρυπτογραφημένο password, και τυπώνει την αποκρυπτογραφημένη μορφή του. Ακολουθεί μια τροποποίηση του, ώστε να γίνει πιο γενικό.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family: monospace;"&gt;import oracle.jdevimpl.db.adapter.DatabaseProviderHelper;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;import java.io.*;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: monospace;"&gt;class Decode {&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;      String pass = ""; &lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: monospace;"&gt;      public Decode() {&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;         System.out.print("Please type encrypted password:");&lt;/span&gt; &lt;br /&gt; &lt;span style="font-family: monospace;"&gt;                BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); &lt;/span&gt;&lt;br /&gt; &lt;pre style="font-family: monospace;"&gt;         try {&lt;br /&gt;         String encyptedPass = br.readLine();&lt;br /&gt;         pass = DatabaseProviderHelper.comingIn(encryptedPass);&lt;br /&gt;               System.out.println(pass);&lt;br /&gt;        } catch (IOException ioe) {&lt;br /&gt;         System.out.println("IO error trying to read encrypted password!");&lt;br /&gt;         System.exit(1);&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt; &lt;span style="font-family: monospace;"&gt;      }   &lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: monospace;"&gt;      public static void main(String[] args){&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;                        new Decode();&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;      }   &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: monospace;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;To πρόγραμμα που μόλις δημιουργήσαμε θα το κάνουμε compile:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;javac -cp $SQL_DEVELOPER_HOME/modules/oracle.adf.model_11.1.1/db-ca.jar:&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;$SQL_DEVELOPER_HOME&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/modules/oracle.ldap_11.1.1/ojmisc.jar Decode.java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;και τελικά θα το τρέξουμε:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;java -cp &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;$SQL_DEVELOPER_HOME&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/modules/oracle.adf.model_11.1.1/db-ca.jar:&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;$SQL_DEVELOPER_HOME&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;/modules/oracle.ldap_11.1.1/ojmisc.jar:. Decode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Επειδή και ο JDeveloper χρησιμοποιεί τον ίδιο αλγόριθμο για να αποθηκεύει τα passwords των συνδέσεων, μπορούμε πάλι να χρησιμοποιήσουμε το ίδιο πρόγραμμα για να βρούμε την τιμή ενός password.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-933691534204359993?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/933691534204359993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=933691534204359993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/933691534204359993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/933691534204359993'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/01/saved-passwords-sql-developer.html' title='Ανάκτηση αποθηκευμένων (saved) passwords από συνδέσεις σε SQL Developer και JDeveloper'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_RJFKX1cK_dA/TSd3lNgZJxI/AAAAAAAABPw/REx-575MW6Q/s72-c/Screenshot-New%2B-%2BSelect%2BDatabase%2BConnection.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-4547526508628789405</id><published>2011-01-04T22:35:00.001+02:00</published><updated>2011-01-04T22:36:14.892+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jdeveloper'/><title type='text'>Εκκίνηση του JDeveloper χωρίς να ανοίγει προηγούμενα επεξεργασμένα αρχεία</title><content type='html'>Ο JDeveloper έχει το συνήθειο όταν ξεκινά, να εμφανίζει τους editors των αρχείων που επεξεργαστήκαμε την τελευταία φορά. Για λόγους επιτάχυνσης της εκκίνησης, μπορούμε να αποτρέψουμε αυτή την συμπεριφορά ξεκινώντας με την παράμετρο noreopen, δηλαδή κάπως έτσι:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;$JDEV_HOME/jdev/bin/jdev -noreopen&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-4547526508628789405?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/4547526508628789405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=4547526508628789405' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4547526508628789405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4547526508628789405'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2011/01/jdeveloper.html' title='Εκκίνηση του JDeveloper χωρίς να ανοίγει προηγούμενα επεξεργασμένα αρχεία'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-2583850094334788320</id><published>2010-12-29T23:47:00.001+02:00</published><updated>2010-12-29T23:49:17.930+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='jdeveloper'/><title type='text'>Εύκολος σχηματισμός XPath εκφράσεων με την βοήθεια του JDeveloper</title><content type='html'>Έχουμε αναφερθεί στο παρελθόν (&lt;a href="http://serafeimk.blogspot.com/2009/08/jdeveloper-11g-xml-2.html"&gt;http://serafeimk.blogspot.com/2009/08/jdeveloper-11g-xml-2.html&lt;/a&gt;) για τις XML διευκολύνσεις που προσφέρει ο JDeveloper 11g. Μια σημαντική βοήθεια αφορά επίσης και την εμφάνιση της XPath έκφρασης δυναμικά, καθώς πλοηγούμαστε στο κείμενο ενός XML αρχείου. Κατά αυτόν τον τρόπο, μπορούμε να προσδιορίσουμε και να δοκιμάσουμε την XPath έκφραση που θα χρησιμοποιήσουμε για παράδειγμα σε ένα μετασχηματισμό ενός BPEL process μας.&lt;br /&gt;&lt;br /&gt;Ανοίγοντας λοιπόν στον JDeveloper ένα XML αρχείο (διάλεξα το&lt;span style="font-family:monospace;"&gt; web.xml&lt;/span&gt; μιας εφαρμογής) και διαλέγοντας από το μενού Search-&gt;XPath Search, εμφανίζεται το πλαίσιο του XPath search. Κάνουμε click σε ένα μικρό εικονίδο που λέει "Copy XPath for current selection"&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_RJFKX1cK_dA/TRuspMbBQYI/AAAAAAAABPQ/n2wPzY3Lapo/s1600/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BIGP_SOA_LF5.jws%2B%253A%2BLF5_004UI.jpr.png"&gt;&lt;img style="cursor: pointer; width: 276px; height: 320px;" src="http://3.bp.blogspot.com/_RJFKX1cK_dA/TRuspMbBQYI/AAAAAAAABPQ/n2wPzY3Lapo/s320/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BIGP_SOA_LF5.jws%2B%253A%2BLF5_004UI.jpr.png" alt="" id="BLOGGER_PHOTO_ID_5556224389000806786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Από εδώ και στο εξής, καθώς κάνουμε click σε ένα XML element στο αρχείο μας, ενημερώνεται το XPath expression που αντιστοιχεί στην διαδρομή.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_RJFKX1cK_dA/TRusx7iVLxI/AAAAAAAABPY/UwmEEoJEDQ4/s1600/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BIGP_SOA_LF5.jws%2B%253A%2BLF5_004UI.jpr%2B%253A%2B-home-spk-Projects-workdir-jdev11-poc_igp-soa-IGP_SOA_LF5-LF5_004UI-public_html-WEB-INF-web.xml.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 193px;" src="http://2.bp.blogspot.com/_RJFKX1cK_dA/TRusx7iVLxI/AAAAAAAABPY/UwmEEoJEDQ4/s320/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BIGP_SOA_LF5.jws%2B%253A%2BLF5_004UI.jpr%2B%253A%2B-home-spk-Projects-workdir-jdev11-poc_igp-soa-IGP_SOA_LF5-LF5_004UI-public_html-WEB-INF-web.xml.png" alt="" id="BLOGGER_PHOTO_ID_5556224539086892818" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-2583850094334788320?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/2583850094334788320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=2583850094334788320' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/2583850094334788320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/2583850094334788320'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2010/12/xpath-jdeveloper.html' title='Εύκολος σχηματισμός XPath εκφράσεων με την βοήθεια του JDeveloper'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_RJFKX1cK_dA/TRuspMbBQYI/AAAAAAAABPQ/n2wPzY3Lapo/s72-c/Screenshot-Oracle%2BJDeveloper%2B11g%2BRelease%2B1%2B-%2BIGP_SOA_LF5.jws%2B%253A%2BLF5_004UI.jpr.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-108360595404416036</id><published>2010-12-27T22:10:00.003+02:00</published><updated>2010-12-27T22:24:19.691+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>Ενσωμάτωση (integration) ενός Java applet σε μια JSF σελίδα</title><content type='html'>Αν και τα Java applets είναι εντελώς εκτός μόδας, παρουσιάστηκε η ανάγκη να χρησιμοποιήσω κάποιο από αυτά σε μια ADF JSF εφαρμογή. Πιο συγκεκριμένα, υπήρξε η ανάγκη διασύνδεσης μιας σελίδας ADF με μια web camera οπότε κατέφυγα στην τεχνολογία των Java applets σε συνδυασμό με την βιβλιοθήκη Java Media Framework (JMF - &lt;a href="http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140239.html"&gt;http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140239.html&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Προκειμένου να ενσωματώσουμε ένα Java applet σε μια JSF σελίδα, δεν έχουμε παρά να χρησιμοποιήσουμε την JSP tag library και πιο συγκεκριμένα το συστατικό &lt;span style="font-family:monospace;"&gt;jsp:plugin&lt;/span&gt;, ειδικά για applets. Περισσότερα για το JSP 2.0 tag library βρίσκονται στο: &lt;a href="http://java.sun.com/products/jsp/syntax/2.0/syntaxref20.html"&gt;http://java.sun.com/products/jsp/syntax/2.0/syntaxref20.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_RJFKX1cK_dA/TRjy3w5_rtI/AAAAAAAABPI/8Bxe315DstY/s1600/gallery.png"&gt;&lt;img style="cursor: pointer; width: 176px; height: 320px;" src="http://1.bp.blogspot.com/_RJFKX1cK_dA/TRjy3w5_rtI/AAAAAAAABPI/8Bxe315DstY/s320/gallery.png" alt="" id="BLOGGER_PHOTO_ID_5555457180196384466" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;O κώδικας στην JSF σελίδα μας θα μοιάζει κάπως έτσι:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;jsp:plugin  type="applet" code="mypackage.CameraApplet" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;                      archive="cameraapplet.jar,jmf.jar,mediaplayer.jar" height="300"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;                      width="400" align="bottom"  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;                      codebase="../../applet"&amp;gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;                         &amp;lt;jsp:fallback&amp;gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;                            This browser does not support Applets.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;                         &amp;lt;/jsp:fallback&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;                      &amp;lt;/jsp:plugin&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Σε περίπτωση που θέλουμε να περάσουμε παραμέτρους στο applet, για παράδειγμα κάποια τιμή από τα ADF bindings μας, θα πρέπει να χρησιμοποιήσουμε το tag jsp:params και να ορίσουμε κατάλληλα την παράμετρο μας ώστε να διαβαστεί από το tag library. Μπορούμε λοιπόν, στην αρχή της σελίδας να κάνουμε τη δήλωση:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;   &amp;lt;c:set var="adfParamNbr"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;          value="#{bindings.ParamNbr.inputValue}"/&amp;gt;               &lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;που δείχνει σε μια μεταβλητή που αφορά τα bindings. Συνεπώς, η δήλωση του applet θα μεταβληθεί ως εξής ώστε να συμπεριλαμβάνει αυτή την παράμετρο μέσω Unified Expression Language.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:monospace;"&gt;&amp;lt;jsp:plugin  type="applet" code="com.mni.mednext.view.applet.CameraApplet" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;                      archive="cameraapplet.jar,jmf.jar,mediaplayer.jar" height="300"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;                      width="400" align="bottom"  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;                      codebase="../../applet"&amp;gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:monospace;" &gt;                         &amp;lt;jsp:params&amp;gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:monospace;" &gt;                            &amp;lt;jsp:param name="param1" value="${adfParamNbr}" /&amp;gt;                                                            &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:monospace;" &gt;                         &amp;lt;/jsp:params&amp;gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;                         &amp;lt;jsp:fallback&amp;gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;                            This browser does not support Applets.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;                         &amp;lt;/jsp:fallback&amp;gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;                      &amp;lt;/jsp:plugin&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-108360595404416036?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/108360595404416036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=108360595404416036' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/108360595404416036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/108360595404416036'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2010/12/java-applet-jsf.html' title='Ενσωμάτωση (integration) ενός Java applet σε μια JSF σελίδα'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_RJFKX1cK_dA/TRjy3w5_rtI/AAAAAAAABPI/8Bxe315DstY/s72-c/gallery.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-6977787484629971193</id><published>2010-12-18T16:09:00.003+02:00</published><updated>2011-06-21T15:42:57.667+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libreoffice'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenOffice'/><title type='text'>Μια χρήσιμη επιλογή του OpenOffice όταν επεξεργαζόμαστε αρχεία</title><content type='html'>Πολύ συχνά όταν επεξεργαζόμαστε αρχεία στο OpenOffice, χρειάζεται να τα αντιπαραβάλλουμε ή να δανειστούμε κάποιο κείμενο από το ένα από αυτά. Έτσι είναι συνηθισμένο να τροποποιήσουμε κατά λάθος αυτό από το οποίο αντλούμε την πληροφορία. Προκειμένου να αποφύγουμε ανάλογες καταστάσεις, όταν ανοίγουμε ένα αρχείο στο OpenOffice, έχουμε την επιλογή να ανοιχτεί μόνο για ανάγνωση (read-only)&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_RJFKX1cK_dA/TQzA47nRTuI/AAAAAAAABOw/uUkBmNv0UwQ/s1600/Screenshot-Open.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_RJFKX1cK_dA/TQzA47nRTuI/AAAAAAAABOw/uUkBmNv0UwQ/s320/Screenshot-Open.png" alt="" id="BLOGGER_PHOTO_ID_5552024524948590306" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-6977787484629971193?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/6977787484629971193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=6977787484629971193' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/6977787484629971193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/6977787484629971193'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2010/12/openoffice.html' title='Μια χρήσιμη επιλογή του OpenOffice όταν επεξεργαζόμαστε αρχεία'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_RJFKX1cK_dA/TQzA47nRTuI/AAAAAAAABOw/uUkBmNv0UwQ/s72-c/Screenshot-Open.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-5475703778325456005</id><published>2010-12-11T23:20:00.004+02:00</published><updated>2010-12-11T23:26:13.907+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>Αξιοποιώντας τα XML metadata του ADF</title><content type='html'>Έχει περάσει αρκετός καιρός σε σχέση με το τελευταίο άρθρο που είχε να κάνει με την άντληση γνώσης από τα &lt;span lang="en-US"&gt;XML&lt;/span&gt; αρχεία στα οποία στηρίζεται το &lt;span lang="en-US"&gt;ADF&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;&lt;u&gt;&lt;a href="http://serafeimk.blogspot.com/2010/07/xml-artifacts-adf.html"&gt;http://serafeimk.blogspot.com/2010/07/xml-artifacts-adf.html&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;) Αυτή τη φορά βρίσκομαι στην πολύ ευχάριστη θέση να περιγράψω την πρόοδο αυτού του έργου, να δώσω παραδείγματα λειτουργίας και να παρουσιάσω τους στόχους για το αμέσως επόμενο χρονικό διάστημα.&lt;br /&gt;&lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Η κεντρική ιδέα έχει να κάνει με την κατανόηση της δομής ενός έργου, του κώδικα που περιλαμβάνει και την εξαγωγή ευφυϊας από ένα &lt;span lang="en-US"&gt;ADF&lt;/span&gt; &lt;span lang="en-US"&gt;project&lt;/span&gt;. Σε αντίθεση με άλλες τεχνολογίες ή &lt;span lang="en-US"&gt;frameworks&lt;/span&gt;, το &lt;span lang="en-US"&gt;ADF&lt;/span&gt; ακολουθώντας μια «περιγραφική» (&lt;span lang="en-US"&gt;declarative&lt;/span&gt;) προσέγγιση για την επιτάχυνση της ανάπτυξης διαδικτυακών εφαρμογών κάνει μια εκτενή χρήση &lt;span lang="en-US"&gt;metadata&lt;/span&gt; σε μορφή &lt;span lang="en-US"&gt;XML&lt;/span&gt;. Η επεξεργασία αυτών των αρχείων μπορεί να μας οδηγήσει σε:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;γρήγορη κατανόηση της δομής μιας εφαρμογής&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;επιβεβαίωση της εφαρμογής κανόνων επιχειρηματικής λογικής (business logic)&lt;br /&gt; &lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;έλεγχο ποιότητας (quality assurance) και αντιπαραβολή με ισχύοντες κανόνες προγραμματισμού&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;καλύτερο προγραμματισμό έργου (&lt;span lang="en-US"&gt;project&lt;/span&gt; &lt;span lang="en-US"&gt;management&lt;/span&gt;) γνωρίζοντας σε ρεαλιστικό βαθμό το ποσοστό υλοποίησης&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;ακριβή ανάλυση επιπτώσεων (&lt;span lang="en-US"&gt;impact&lt;/span&gt; &lt;span lang="en-US"&gt;analysis&lt;/span&gt;)  σε περίπτωση αλλαγών στον κώδικα καθώς και εξακρίβωση των συσχετίσεων μεταξύ διαφόρων στοιχείων&lt;/p&gt;   &lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Σε συνεργασία με τον Δημήτρη Στασινόπουλο (&lt;a href="http://dstas.blogspot.com/"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;&lt;span lang="en-US"&gt;http&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;://&lt;/u&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;&lt;span lang="en-US"&gt;dstas&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;.&lt;/u&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;&lt;span lang="en-US"&gt;blogspot&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;.&lt;/u&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;&lt;span lang="en-US"&gt;com&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;) έχουμε αναπτύξει ένα κορμό που αναλαμβάνει να διαβάσει διαφόρους τύπους &lt;span lang="en-US"&gt;XML&lt;/span&gt; αρχείων που διαχειρίζεται το &lt;span lang="en-US"&gt;ADF&lt;/span&gt; (πχ. &lt;span lang="en-US"&gt;Entity&lt;/span&gt;/&lt;span lang="en-US"&gt;view&lt;/span&gt; &lt;span lang="en-US"&gt;objects&lt;/span&gt;, &lt;span lang="en-US"&gt;task&lt;/span&gt; &lt;span lang="en-US"&gt;flows&lt;/span&gt;, κλπ) και να αποθηκεύσει τα περιεχόμενα τους, σε μορφή οργανωμένη και αναλυτική σε μια σχεσιακή βάση δεδομένων, ώστε να μπορεί να γίνει αντικείμενο αναφορών (&lt;span lang="en-US"&gt;SQL&lt;/span&gt; &lt;span lang="en-US"&gt;reporting&lt;/span&gt;) Είναι σημαντικό να αναγνωρίσουμε εδώ πως σε ορισμένες περιπτώση (πχ για τα βασικά &lt;span lang="en-US"&gt;ADF&lt;/span&gt; &lt;span lang="en-US"&gt;objects&lt;/span&gt;, όπως &lt;span lang="en-US"&gt;entities&lt;/span&gt;, &lt;span lang="en-US"&gt;view&lt;/span&gt; &lt;span lang="en-US"&gt;objects&lt;/span&gt;, κλπ) η οργάνωση των &lt;span lang="en-US"&gt;XML&lt;/span&gt; αρχείων ακολουθεί ένα συγκεκριμένο σχήμα (&lt;span lang="en-US"&gt;XSD&lt;/span&gt;) γεγονός που κάνει πιο εύκολη την ανάγνωσή τους και την κατανόηση της δομής τους.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Ξεκινώντας λοιπόν την κατηγοριοποίηση των στοιχείων που εμπλέκονται στο &lt;span lang="en-US"&gt;ADF&lt;/span&gt; έχουμε να κάνουμε:&lt;/p&gt; &lt;ol&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Με περιγραφικά δεδομένα σχετικά με &lt;span lang="en-US"&gt;entities&lt;/span&gt;, &lt;span lang="en-US"&gt;view&lt;/span&gt; &lt;span lang="en-US"&gt;objects&lt;/span&gt;, &lt;span lang="en-US"&gt;application&lt;/span&gt; &lt;span lang="en-US"&gt;modules&lt;/span&gt; και εν γένει με αυτό που ονομάζεται &lt;span lang="en-US"&gt;ADF&lt;/span&gt; &lt;span lang="en-US"&gt;Business&lt;/span&gt; &lt;span lang="en-US"&gt;Components&lt;/span&gt; (&lt;span lang="en-US"&gt;BC&lt;/span&gt;) και αποτυπώνεται σε &lt;span lang="en-US"&gt;XML&lt;/span&gt; αρχεία&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Με &lt;span lang="en-US"&gt;Java&lt;/span&gt; κλάσεις που επεκτείνουν τις δυνατότητες των &lt;span lang="en-US"&gt;ADF&lt;/span&gt; &lt;span lang="en-US"&gt;components&lt;/span&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Αυτόνομες &lt;span lang="en-US"&gt;Java&lt;/span&gt; κλάσεις που χρησιμοποιούνται για διάφορους λόγους&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;&lt;span lang="en-US"&gt;Property  files &lt;/span&gt;και &lt;span lang="en-US"&gt;bundles&lt;/span&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Με &lt;span lang="en-US"&gt;task&lt;/span&gt; &lt;span lang="en-US"&gt;flows&lt;/span&gt; που υλοποιούν την λογική του &lt;span lang="en-US"&gt;ADF&lt;/span&gt; &lt;span lang="en-US"&gt;Controller&lt;/span&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Με σελίδες &lt;span lang="en-US"&gt;JSF&lt;/span&gt; που περιγράφουν το &lt;span lang="en-US"&gt;user&lt;/span&gt;     &lt;span lang="en-US"&gt;interface&lt;/span&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Με αρχεία &lt;span lang="en-US"&gt;page&lt;/span&gt; &lt;span lang="en-US"&gt;definition&lt;/span&gt; που είναι υπεύθυνα για το &lt;span lang="en-US"&gt;data&lt;/span&gt;-&lt;span lang="en-US"&gt;binding&lt;/span&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY" lang="en-US"&gt;JSF backing beans&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Με διάφορα βοηθητικά αρχεία σε μορφή &lt;span lang="en-US"&gt;XML&lt;/span&gt; που αφορούν κάθετους τομείς όπως διαμόρφωση ασφάλειας (πχ. αρχείο &lt;span lang="en-US"&gt;jazn&lt;/span&gt;-&lt;span lang="en-US"&gt;data&lt;/span&gt;.&lt;span lang="en-US"&gt;xml&lt;/span&gt;), οργάνωση δομής του &lt;span lang="en-US"&gt;JDeveloper&lt;/span&gt; (.&lt;span lang="en-US"&gt;jpr&lt;/span&gt; και .&lt;span lang="en-US"&gt;jws&lt;/span&gt; αρχεία), κλπ&lt;/p&gt;   &lt;/li&gt;&lt;/ol&gt; &lt;p style="margin-bottom: 0cm;" align="JUSTIFY" lang="en-US"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Σε πρώτο στάδιο το έργο που έχουμε αναπτύξει εστιάζει στις &lt;span lang="en-US"&gt;XML&lt;/span&gt; απεικονίσεις των στοιχείων (και όχι σε πηγαίο κώδικα), τις οποίες και τελικά αποθηκεύει σε μια βάση δεδομένων. Για το πώς θα γίνει αυτή η μετατροπή, έχουμε δοκιμάσει δυο τρόπους:&lt;/p&gt; &lt;ol&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;μετατροπή που στηρίζεται στην χρήση ενός λεξικού (&lt;span lang="en-US"&gt;dictionary&lt;/span&gt;) που αντιστοιχίζει &lt;span lang="en-US"&gt;XPath&lt;/span&gt; διαδρομές του αρχείου προς ανάγνωση με κολόνες και πίνακες σε μια βάση δεδομένων. Τα πλεονέκτηματα αυτής της μεθόδου έχουν να κάνουν με το μικρό μέγεθος του κώδικα προς συντήρηση, την επεξεργασία απλά του &lt;span lang="en-US"&gt;dictionary&lt;/span&gt;     &lt;span lang="en-US"&gt;table&lt;/span&gt; για την προσθήκη νέων στοιχείων (δηλαδή διαδρομών), την πιο παραμετροποιημένη αντιστοίχηση στοιχείων &lt;span lang="en-US"&gt;XML&lt;/span&gt; με &lt;span lang="en-US"&gt;database&lt;/span&gt; &lt;span lang="en-US"&gt;tables&lt;/span&gt;, κ.α.&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;μετατροπή που στηρίζεται σε μια &lt;span lang="en-US"&gt;Java&lt;/span&gt;-&lt;span lang="en-US"&gt;XML&lt;/span&gt;     &lt;span lang="en-US"&gt;binding&lt;/span&gt; διαδικασία, σύμφωνα με την οποία, τα σχήματα των αρχείων που θα διαβαστούν έχουν ήδη απεικονιστεί σε &lt;span lang="en-US"&gt;Java&lt;/span&gt; κλάσεις, οπότε η ανάγνωση ενός αρχείου δημιουργεί μια σειρά από &lt;span lang="en-US"&gt;Java&lt;/span&gt; &lt;span lang="en-US"&gt;objects&lt;/span&gt; που τελικά αποθηκεύονται (&lt;span lang="en-US"&gt;persist&lt;/span&gt;) σε μια βάση. Πλεονεκτήματα αυτής της μεθόδου περιλαμβάνουν την άμεση προσαρμογή σε αλλαγές στα &lt;span lang="en-US"&gt;XSDs&lt;/span&gt; του &lt;span lang="en-US"&gt;ADF&lt;/span&gt;, την αναπαράσταση απείρων επιπέδων ιεραρχίας, την μεταφερσιμότητα σε διάφορες βάσεις δεδομένων, την δυνατότητα ανάστροφης διαδρομής και παραγωγής &lt;span lang="en-US"&gt;ADF&lt;/span&gt; &lt;span lang="en-US"&gt;XML&lt;/span&gt; από ένα &lt;span lang="en-US"&gt;code&lt;/span&gt; &lt;span lang="en-US"&gt;generator&lt;/span&gt;, κ.α.&lt;/p&gt;   &lt;/li&gt;&lt;/ol&gt; &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Λόγω ότι ήδη έχει υλοποιηθεί ένα παλαιότερο έργο στην πρώτη επιλογή, προς το παρόν αυτή η λύση έχει προβάδισμα και μας προσφέρει τα πρώτα αποτελέσματα προς επίδειξη. Αξίζει να σημειωθεί πως και οι δύο λύσεις «πατάνε» καλύτερα όταν υπάρχει ένα &lt;span lang="en-US"&gt;XSD&lt;/span&gt; σχήμα. Έπειτα από έρευνα σε αυτόν τον τομέα, καταλήξαμε στα εξής συμπεράσματα σχετικά με τις κατηγορίες αρχείων του &lt;span lang="en-US"&gt;ADF&lt;/span&gt;:&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="JUSTIFY" lang="en-US"&gt;&lt;br /&gt;&lt;/p&gt; &lt;ol&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Για&lt;span lang="en-US"&gt;     &lt;/span&gt;την&lt;span lang="en-US"&gt; &lt;/span&gt;πρώτη&lt;span lang="en-US"&gt; &lt;/span&gt;κατηγορία&lt;span lang="en-US"&gt; (entities, view objects, application modules) &lt;/span&gt;υπάρχουν&lt;span lang="en-US"&gt; &lt;/span&gt;τα&lt;span lang="en-US"&gt; &lt;/span&gt;συνοδευτικά&lt;span lang="en-US"&gt; XSDs &lt;/span&gt;στην&lt;span lang="en-US"&gt; &lt;/span&gt;διαδρομή&lt;span lang="en-US"&gt; &lt;span style="font-family:monospace;"&gt;$MIDDLEWARE_HOME/ racle_common\modules\oracle.adf.model_11.1.1/adfm.jar&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/li&gt;&lt;/ol&gt; &lt;p style="margin-bottom: 0cm;" align="JUSTIFY" lang="en-US"&gt;&lt;a href="http://1.bp.blogspot.com/_RJFKX1cK_dA/TQPreaAyqxI/AAAAAAAABNs/A21bzQgLqyk/s1600/listing.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 218px;" src="http://1.bp.blogspot.com/_RJFKX1cK_dA/TQPreaAyqxI/AAAAAAAABNs/A21bzQgLqyk/s320/listing.png" alt="" id="BLOGGER_PHOTO_ID_5549538073461828370" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;ol start="2"&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Για τη δε κατηγορία των &lt;span lang="en-US"&gt;page&lt;/span&gt; &lt;span lang="en-US"&gt;definitions&lt;/span&gt;, βρίσκονται και αυτά στην παραπάνω διαδρομή&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Για τα &lt;span lang="en-US"&gt;task&lt;/span&gt; &lt;span lang="en-US"&gt;flows&lt;/span&gt; &lt;span lang="en-US"&gt;definitions&lt;/span&gt;, θα μπορούμε να τα βρούμε στην διαδρομή &lt;span  lang="en-US" style="font-family:monospace;"&gt;$MIDDLEWARE_HOME/  racle_common\modules\oracle.adf.model_11.1.1/adf-controller-schema.jar&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;a href="http://1.bp.blogspot.com/_RJFKX1cK_dA/TQPrvfXqNCI/AAAAAAAABN0/KmIVLcPF0rg/s1600/secondlisting.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 218px;" src="http://1.bp.blogspot.com/_RJFKX1cK_dA/TQPrvfXqNCI/AAAAAAAABN0/KmIVLcPF0rg/s320/secondlisting.png" alt="" id="BLOGGER_PHOTO_ID_5549538366957696034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ol start="4"&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Για την περίπτωση των &lt;span lang="en-US"&gt;JSPX&lt;/span&gt; αρχείων δεν υπάρχει αντίστοιχο &lt;span lang="en-US"&gt;XSD&lt;/span&gt; (αφού η περιγραφή των &lt;span lang="en-US"&gt;component&lt;/span&gt;     &lt;span lang="en-US"&gt;tags&lt;/span&gt; βρίσκεται σε &lt;span lang="en-US"&gt;tld&lt;/span&gt; αρχείο) άρα η αποθήκευση ολόκληρου του αρχείου είναι επιβεβλημένη (η ιδέα της αποθήκευσης σε πολλαπλούς πίνακες φαντάζει δύσκολη) καθώς και η χρήση &lt;span lang="en-US"&gt;XPath&lt;/span&gt; &lt;span lang="en-US"&gt;expressions&lt;/span&gt; για την άντληση γνώσης. &lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Η αποτελεσματική επεργασία των &lt;span lang="en-US"&gt;Java&lt;/span&gt; &lt;span lang="en-US"&gt;source&lt;/span&gt; αρχείων είναι κάτι που προγραμματίζουμε να δούμε στο επόμενο διάστημα, διαθέτοντας ήδη πολλές ιδέες.&lt;/p&gt;   &lt;/li&gt;&lt;/ol&gt; &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;&lt;br /&gt;Πέρα από την αποθήκευση σε σχεσιακή μορφή, σώζουμε ταυτόχρονα και την πρωτογενή μορφή των αρχείων του ADF, καθώς έχουμε διαπιστώσει πως πολλά ερωτήματα reporting απαντώνται πιο γρήγορα και αποδοτικά με XPath queries.&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;&lt;br /&gt;Η τελική διαδικασία μπορεί να εκκινηθεί δηλώνοντας μια διαδρομή πάνω στο δίσκο που περιλαμβάνει ένα &lt;span lang="en-US"&gt;ADF&lt;/span&gt; &lt;span lang="en-US"&gt;project&lt;/span&gt; και αφότου έχουμε δηλώσει τις πληροφορίες σύνδεσης με την βάση δεδομένων που τελικά θα αποθηκεύσει τα αποτελέσματα. Έπειτα, ένα προς ένα όλα τα αρχεία που έχουν σημασία για το &lt;span lang="en-US"&gt;ADF&lt;/span&gt; θα διαβαστούν και θα σωθούν στη βάση (σε πρωτογενή και αναλυμένη μορφή). Πρόκειται για μια επεξεργασία που σε ένα μεγάλο έργο (πχ 100 &lt;span lang="en-US"&gt;application&lt;/span&gt; &lt;span lang="en-US"&gt;modules&lt;/span&gt;) αναμένεται να κρατήσει κάποιο σοβαρό χρόνο, οπότε κατευθυνόμαστε: &lt;/p&gt; &lt;ol&gt;&lt;ul&gt;&lt;li&gt;       &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;αφενός στην προσέγγιση ενός &lt;span lang="en-US"&gt;ANT&lt;/span&gt; &lt;span lang="en-US"&gt;build&lt;/span&gt;       &lt;span lang="en-US"&gt;script&lt;/span&gt; που θα την ξεκινά (ενδεχομένως σε καθημερινή βάση ως τμήμα μιας &lt;span lang="en-US"&gt;continuous&lt;/span&gt; &lt;span lang="en-US"&gt;integration&lt;/span&gt; υποδομής) &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;       &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;στην καλύτερη παραμετροποίησή της ώστε να επεξεργάζεται συγκεκριμένες κατηγορίες (πχ &lt;span lang="en-US"&gt;entities&lt;/span&gt;) ή εν γένει να ενσωματώνει φίλτρα ή να ανανεώνει και να συγκρίνει παλαιότερα τρεξίματα&lt;/p&gt;     &lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt; &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Στο τέλος αυτής της διαδικασίας, το &lt;span lang="en-US"&gt;ADF&lt;/span&gt; &lt;span lang="en-US"&gt;project&lt;/span&gt; μας βρίσκεται αποθηκευμένο ως «φύλλο και φτερό» σε μια βάση, οπότε μπορούμε να κάνουμε ελεύθερα τα &lt;span lang="en-US"&gt;SQL&lt;/span&gt; ερωτήματά μας σε ένα απλό και κατανοητό σχήμα. ή να χρησιμοποιήσουμε ερωτήματα βασισμένα στο XPath και στο XQuery ώστε να ρωτήσουμε τη βάση δεδομένων στην αρχική μορφή αποθήκευσης των αρχείων. Σε αυτό το σημείο υπάρχουν δύο ακόμα δυνατότητες:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Άμεσης χρήσης μέσω ενός &lt;span lang="en-US"&gt;SQL&lt;/span&gt; εργαλείου (πχ &lt;span lang="en-US"&gt;SQL&lt;/span&gt;     &lt;span lang="en-US"&gt;Developer&lt;/span&gt;) βασικών &lt;span lang="en-US"&gt;reports&lt;/span&gt; (&lt;span lang="en-US"&gt;top&lt;/span&gt;-20) που έχουμε κατασκευάσει και αφορούν συχνά σφάλματα βασισμένα σε &lt;span lang="en-US"&gt;best&lt;/span&gt; &lt;span lang="en-US"&gt;practices&lt;/span&gt;. Φυσικά μας είναι εύκολο να προσθέσουμε νέα &lt;span lang="en-US"&gt;reports&lt;/span&gt; κατόπιν απαίτησης.&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;     &lt;p style="margin-bottom: 0cm;" align="JUSTIFY"&gt;Χρησιμοποίησης μιας &lt;span lang="en-US"&gt;custom&lt;/span&gt; &lt;span lang="en-US"&gt;Flex&lt;/span&gt;-&lt;span lang="en-US"&gt;based&lt;/span&gt; εφαρμογής που έχουμε φτιάξει ώστε να γίνεται η παραγωγή των παραγωγή των παραπάνω αναφορών και η δημιουργία νέων.&lt;/p&gt;   &lt;/li&gt;&lt;/ul&gt; &lt;a href="http://4.bp.blogspot.com/_RJFKX1cK_dA/TQPr_RhJqWI/AAAAAAAABN8/aXLyPe8NWMQ/s1600/Screenshot-Oracle%2BSQL%2BDeveloper.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 172px;" src="http://4.bp.blogspot.com/_RJFKX1cK_dA/TQPr_RhJqWI/AAAAAAAABN8/aXLyPe8NWMQ/s320/Screenshot-Oracle%2BSQL%2BDeveloper.png" alt="" id="BLOGGER_PHOTO_ID_5549538638117316962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Δουλεύουμε ώστε να έχουμε έτοιμη την πρώτη δοκιμαστική έκδοση στις αρχές Ιανουαρίου 2011, που ενδεχομένως να φιλοξενηθεί σε μια &lt;span lang="en-US"&gt;cloud&lt;/span&gt; &lt;span lang="en-US"&gt;computing&lt;/span&gt; υποδομή ώστε να μπορέσει να την ελέγξει κάποιος άμεσα μέσα από το &lt;span lang="en-US"&gt;web&lt;/span&gt;. Είδωμεν !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-5475703778325456005?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/5475703778325456005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=5475703778325456005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5475703778325456005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5475703778325456005'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2010/12/xml-metadata-adf.html' title='Αξιοποιώντας τα XML metadata του ADF'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_RJFKX1cK_dA/TQPreaAyqxI/AAAAAAAABNs/A21bzQgLqyk/s72-c/listing.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-8901798305267896190</id><published>2010-11-29T22:00:00.003+02:00</published><updated>2010-11-29T22:06:24.935+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Άνοιγμα αρχείων .XSLX στο Linux</title><content type='html'>Σε παλαιότερο άρθρο είχαμε αναφερθεί στη δυνατότητα ανοίγματος αρχείων .docx στο Linux με την χρήση του wine και του Microsoft Word Viewer (&lt;a href="http://serafeimk.blogspot.com/2010/11/docx-linux-microsoft-word-viewer-wine.html"&gt;http://serafeimk.blogspot.com/2010/11/docx-linux-microsoft-word-viewer-wine.html&lt;/a&gt;) Κάτι αντίστοιχο μπορεί να συμβεί και με τα αρχεία του Microsoft Excel, μιας και διατίθεται ο αντίστοιχος viewer που επίσης μπορούμε να εγκαταστήσουμε μέσω wine. Πιο συγκεκριμένα, δοκιμάζοντας να ανοίξω ένα αρχείο .xlsx με το OpenOffice 3.2 έλαβα το ακόλουθο μήνυμα:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_RJFKX1cK_dA/TPQG1FTVLfI/AAAAAAAABLI/fLc4CvmSOzs/s1600/Screenshot-Filter%2BSelection.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 221px;" src="http://4.bp.blogspot.com/_RJFKX1cK_dA/TPQG1FTVLfI/AAAAAAAABLI/fLc4CvmSOzs/s320/Screenshot-Filter%2BSelection.png" alt="" id="BLOGGER_PHOTO_ID_5545064550226013682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Για να αντιμετωπίσουμε αυτό το πρόβλημα κατεβάζουμε το Microsoft Excel Viewer και προχωρούμε στην εγκατάστασή του με την εντολή:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;wine ExcelViewer.exe&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ακολουθούν τα βήματα της εγκατάστασης με φωτογραφίες:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_RJFKX1cK_dA/TPQG8qolM_I/AAAAAAAABLQ/CaHVUP4tur8/s1600/Screenshot-Microsoft%2BOffice%2BExcel%2BViewer%2BSetup.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 277px;" src="http://2.bp.blogspot.com/_RJFKX1cK_dA/TPQG8qolM_I/AAAAAAAABLQ/CaHVUP4tur8/s320/Screenshot-Microsoft%2BOffice%2BExcel%2BViewer%2BSetup.png" alt="" id="BLOGGER_PHOTO_ID_5545064680506340338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_RJFKX1cK_dA/TPQHMc4NJyI/AAAAAAAABLY/i_WtsjW5Ncs/s1600/Screenshot-Microsoft%2BOffice%2BExcel%2BViewer%2BSetup-1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 277px;" src="http://1.bp.blogspot.com/_RJFKX1cK_dA/TPQHMc4NJyI/AAAAAAAABLY/i_WtsjW5Ncs/s320/Screenshot-Microsoft%2BOffice%2BExcel%2BViewer%2BSetup-1.png" alt="" id="BLOGGER_PHOTO_ID_5545064951691683618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_RJFKX1cK_dA/TPQHRnurs6I/AAAAAAAABLg/JAmaz0CV95o/s1600/Screenshot-Microsoft%2BOffice%2BExcel%2BViewer%2BSetup-2.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 166px;" src="http://4.bp.blogspot.com/_RJFKX1cK_dA/TPQHRnurs6I/AAAAAAAABLg/JAmaz0CV95o/s320/Screenshot-Microsoft%2BOffice%2BExcel%2BViewer%2BSetup-2.png" alt="" id="BLOGGER_PHOTO_ID_5545065040503878562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Έπειτα, όπως είναι αναμενόμενο, υπάρχει ένα εικονίδιο στην παλέτα των νέων εφαρμογών.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_RJFKX1cK_dA/TPQHb7aTP8I/AAAAAAAABLo/gX_GXDenbwU/s1600/Screenshot-Application%2BBrowser.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 72px;" src="http://1.bp.blogspot.com/_RJFKX1cK_dA/TPQHb7aTP8I/AAAAAAAABLo/gX_GXDenbwU/s320/Screenshot-Application%2BBrowser.png" alt="" id="BLOGGER_PHOTO_ID_5545065217585790914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Στο τέλος, μπορούμε να δούμε το Excel αρχείο μας με ακρίβεια στο Linux:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_RJFKX1cK_dA/TPQHqcG1qCI/AAAAAAAABLw/h0uc88FOtfQ/s1600/Screenshot-Microsoft%2BExcel%2BViewer%2B-%2BLF05.04.RequirementsReview.xls%2B%2B%255BCompatibility%2BMode%255D.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 218px;" src="http://1.bp.blogspot.com/_RJFKX1cK_dA/TPQHqcG1qCI/AAAAAAAABLw/h0uc88FOtfQ/s320/Screenshot-Microsoft%2BExcel%2BViewer%2B-%2BLF05.04.RequirementsReview.xls%2B%2B%255BCompatibility%2BMode%255D.png" alt="" id="BLOGGER_PHOTO_ID_5545065466880698402" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-8901798305267896190?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/8901798305267896190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=8901798305267896190' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/8901798305267896190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/8901798305267896190'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2010/11/xslx-linux.html' title='Άνοιγμα αρχείων .XSLX στο Linux'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RJFKX1cK_dA/TPQG1FTVLfI/AAAAAAAABLI/fLc4CvmSOzs/s72-c/Screenshot-Filter%2BSelection.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-5093208478653334709</id><published>2010-11-25T23:11:00.003+02:00</published><updated>2010-11-25T23:16:59.498+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu 10.10 και ZTE MF 110</title><content type='html'>Εξαιτίας μιας προσφοράς της Cosmote, τελικά απέκτησα το ZTE MF 110 προκειμένου να έχω πρόσβαση στο Internet από το laptop μου ανά πάσα στιγμή (internet on the go)&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_RJFKX1cK_dA/TO7RRYAqxlI/AAAAAAAABKg/PXNZKT-pVqo/s1600/IMG_0900.gif"&gt;&lt;img style="cursor: pointer; width: 320px; height: 118px;" src="http://4.bp.blogspot.com/_RJFKX1cK_dA/TO7RRYAqxlI/AAAAAAAABKg/PXNZKT-pVqo/s320/IMG_0900.gif" alt="" id="BLOGGER_PHOTO_ID_5543598287772894802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Αν και οι οδηγίες χρήσεως αναφέρονται στα Microsoft Windows και στο Apple OS X, υπάρχουν αρκετές αναφορές στο δίκτυο για λειτουργία του usb modem σε περιβάλλον Linux, οπότε ξεκίνησα το πείραμα. Η συσκευή αναγνωρίστηκε από το Ubuntu 10.10 ως MF636 (έξοδος από την εντολή &lt;span style="font-family:monospace;"&gt;lsusb&lt;/span&gt;) ενώ άμεσα εμφανίστηκε το παράθυρο εισαγωγής του PIN ώστε να ξεκλειδώσει το modem.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_RJFKX1cK_dA/TO7RraOzm8I/AAAAAAAABKo/J7EZ5u8tOAo/s1600/Screenshot-SIM%2BPIN%2Bunlock%2Brequired.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 206px;" src="http://1.bp.blogspot.com/_RJFKX1cK_dA/TO7RraOzm8I/AAAAAAAABKo/J7EZ5u8tOAo/s320/Screenshot-SIM%2BPIN%2Bunlock%2Brequired.png" alt="" id="BLOGGER_PHOTO_ID_5543598735045663682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Από εκεί και πέρα, ο ταχύτερος και ασφαλέστερος τρόπος ρύθμισης είναι μέσω του εξαιρετικού προγράμματος Sakis3g (&lt;a href="http://www.sakis3g.org/"&gt;http://www.sakis3g.org/&lt;/a&gt;) που μάλιστα διαθέτει και έκδοση για 64-bits. To Sakis3g αναλαμβάνει το δύσκολο έργο της ανίχνευσης της κατάλληλης διαμόρφωσης δίχως ερωτήσεις, γεγονός που αποδεικνύεται επιτυχημένο! Ακολουθεί η πρώτη οθόνη του προγράμματος:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_RJFKX1cK_dA/TO7R3JYTrnI/AAAAAAAABKw/bwhb4jEUASE/s1600/Screenshot-%2BPlease%2Bselect%2Ban%2Baction%2B.png"&gt;&lt;img style="cursor: pointer; width: 311px; height: 226px;" src="http://4.bp.blogspot.com/_RJFKX1cK_dA/TO7R3JYTrnI/AAAAAAAABKw/bwhb4jEUASE/s320/Screenshot-%2BPlease%2Bselect%2Ban%2Baction%2B.png" alt="" id="BLOGGER_PHOTO_ID_5543598936680541810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;ενώ μετά από λίγο θα μας ζητηθεί το όνομα του δικτύου που θα συνδεθούμε (internet στην περίπτωση της Cosmote)&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_RJFKX1cK_dA/TO7R_i5_5zI/AAAAAAAABK4/yBanMueKFAw/s1600/Screenshot-%2BPlease%2Bselect%2BAPN%2B.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 183px;" src="http://2.bp.blogspot.com/_RJFKX1cK_dA/TO7R_i5_5zI/AAAAAAAABK4/yBanMueKFAw/s320/Screenshot-%2BPlease%2Bselect%2BAPN%2B.png" alt="" id="BLOGGER_PHOTO_ID_5543599080971691826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Έπειτα από μικρή καθυστέρηση, εμφανίζεται το επιβεβαιωτικό μήνυμα και πλέον μπορούμε να απολαύσουμε την πλοήγηση στο δίκτυο!&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_RJFKX1cK_dA/TO7SOMJd8FI/AAAAAAAABLA/3P6hZ3Kzf_0/s1600/Screenshot-Sakis3G%2B0.2.0e-1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 141px;" src="http://2.bp.blogspot.com/_RJFKX1cK_dA/TO7SOMJd8FI/AAAAAAAABLA/3P6hZ3Kzf_0/s320/Screenshot-Sakis3G%2B0.2.0e-1.png" alt="" id="BLOGGER_PHOTO_ID_5543599332560597074" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-5093208478653334709?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/5093208478653334709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=5093208478653334709' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5093208478653334709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5093208478653334709'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2010/11/ubuntu-1010-zte-mf-110.html' title='Ubuntu 10.10 και ZTE MF 110'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RJFKX1cK_dA/TO7RRYAqxlI/AAAAAAAABKg/PXNZKT-pVqo/s72-c/IMG_0900.gif' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-8114849709869765971</id><published>2010-11-19T23:08:00.002+02:00</published><updated>2010-11-19T23:11:51.698+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtualbox'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='Solaris'/><title type='text'>Πρώτη γνωριμία με το Solaris</title><content type='html'>Είναι σίγουρο πως καθώς η οικογένεια των προϊόντων της Oracle μεγαλώνει, τόσο όλοι εμείς που ασχολούμαστε με τον προγραμματισμό και τις πλατφόρμες λογισμικού θα χρειάζεται να μαθαίνουμε καινούργια πράγματα. Ένα τέτοιο παράδειγμα αποτελεί και το Oracle Solaris, στο οποίο αναμένεται η εταιρεία να επενδύσει πολλά στο μέλλον. Αν και διαθέτει αρκετές ομοιότητες με το Linux, υπάρχουν πολλά πράγματα που στην αρχή θα μας ξενίσουν και θα χρειαστεί να δαπανήσουμε αρκετές ώρες διαβάσματος.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_RJFKX1cK_dA/TObnjoYtsZI/AAAAAAAABKI/dheZEL9IdDA/s1600/oracle-solaris.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 166px;" src="http://4.bp.blogspot.com/_RJFKX1cK_dA/TObnjoYtsZI/AAAAAAAABKI/dheZEL9IdDA/s320/oracle-solaris.png" alt="" id="BLOGGER_PHOTO_ID_5541370990848487826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Μια πρώτης τάξεως ευκαιρία λοιπόν να γνωρίσουμε το Solaris, αποτελεί το Oracle Solaris 11 Express 2010.11 που κυκλοφόρησε αυτήν την εβδομάδα (&lt;a href="http://www.oracle.com/technetwork/server-storage/solaris11/downloads/index.html"&gt;http://www.oracle.com/technetwork/server-storage/solaris11/downloads/index.html&lt;/a&gt;) Πρόκειται για μια ειδική έκδοση που προορίζεται για την εξοικείωση των χρηστών και των προγραμματιστών με ένα πλήθος από καινούργια χαρακτηριστικά που ενσωματώνονται σε αυτό το λειτουργικό σύστημα. Ο καλύτερος τρόπος να το γνωρίσουμε (και αυτός που ακολούθησα) είναι η εγκατάσταση του σε ένα virtual machine, και πιο συγκεκριμένα στο VirtualBox. Χρησιμοποιώντας λοιπόν το Oracle Solaris 11 Express 2010.11 LiveCD for x86, μπορούμε να ξεκινήσουμε μια "ζωντανή" έκδοση και να προχωρήσουμε στην εγκατάσταση του Solaris. Συνιστώ το vm να διαθέτει τουλάχιστον 2GB RAM και πάνω από 8GB χώρο αποθήκευσης.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_RJFKX1cK_dA/TObn1-QOF_I/AAAAAAAABKQ/9Mo-783RIgI/s1600/Screenshot.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 144px;" src="http://2.bp.blogspot.com/_RJFKX1cK_dA/TObn1-QOF_I/AAAAAAAABKQ/9Mo-783RIgI/s320/Screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5541371305956087794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Το πρόγραμμα της εγκατάστασης ήταν πολύ βατό και δεν θα μας απασχολήσει με πολλές ή δύσκολες ερωτήσεις. Απεναντίας, πολύ σύντομα θα αποκτήσουμε ένα έτοιμο σύστημα στη διάθεσή μας. Η εγκατάσταση των Guest Additions του VirtualBox ήταν επίσης εύκολη υπόθεση. Απλά επιλέγουμε Devices-&gt;Install Guest Additions και όλα γίνονται μόνα τους, χωρίς να χρειαστούμε την εγκατάσταση επιπρόσθετων πακέτων. Μάλιστα, με ένα απλό logout από τα X, μπορούμε άμεσα να δουλέψουμε με ενεργά τα guest additions, χωρίς να χρειαστεί restart!&lt;br /&gt;&lt;br /&gt;Ως δοκιμαστική έκδοση, περιλαμβάνει ένα μεγάλο αριθμό υπηρεσιών που ξεκινούν αυτόματα. Η πρώτη αίσθηση είναι πως το boot παίρνει αισθητά αρκετή ώρα, πάνω από 2 λεπτά στο Core Duo 2 επεξεργαστή μου. Και όντως, υπάρχουν πολλά πράγματα που εκτελούνται, γεγονός που το μαρτυρούν οι πάνω από 100 υπηρεσίες έναρξης. Το Solaris διατηρεί αναλυτικά στοιχεία για τον χρόνο εκκίνησής τους και τα συμβάντα που έχουν συμβεί. Είμαι σίγουρος πως με κατάλληλο tuning το boot time μπορεί να μειωθεί δραματικά.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_RJFKX1cK_dA/TObn9WCVoYI/AAAAAAAABKY/4sarPBQTnR0/s1600/Screenshot3.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 232px;" src="http://3.bp.blogspot.com/_RJFKX1cK_dA/TObn9WCVoYI/AAAAAAAABKY/4sarPBQTnR0/s320/Screenshot3.png" alt="" id="BLOGGER_PHOTO_ID_5541371432599396738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Το Solaris 11 Express διαθέτει μια γκάμα από εξαιρετικές τεχνολογίες για εξερεύνηση, όπως το σύστημα αρχείων ZFS, τα virtualization zones, το διαγνωστικό εργαλείο Dtrace, Firefox 3.6.10, JDK 1.6.21, Gnome 2.30 και πάρα πολλά άλλα. Επιπλέον software (αλλά όχι πολύ πλούσιο σετ) μπορούμε να βρούμε από τον Package Manager. Περισσότερες πληροφορίες για το Solaris μπορούμε να βρούμε στο: &lt;a href="http://www.oracle.com/technetwork/server-storage/solaris11/documentation/productdocumentation-178191.html"&gt;http://www.oracle.com/technetwork/server-storage/solaris11/documentation/productdocumentation-178191.html&lt;/a&gt; και στο &lt;a href="http://docs.sun.com/app/docs/coll/47.16"&gt;http://docs.sun.com/app/docs/coll/47.16&lt;/a&gt; Καλό ξεκίνημα!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-8114849709869765971?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/8114849709869765971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=8114849709869765971' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/8114849709869765971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/8114849709869765971'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2010/11/solaris.html' title='Πρώτη γνωριμία με το Solaris'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RJFKX1cK_dA/TObnjoYtsZI/AAAAAAAABKI/dheZEL9IdDA/s72-c/oracle-solaris.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-4974943927050026617</id><published>2010-11-10T22:51:00.002+02:00</published><updated>2010-11-10T22:53:48.362+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thinkpad'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Keyboard shortcuts για τα Lenovo Thinkpads στο Ubuntu 10.10</title><content type='html'>Το Ubuntu διαθέτει την καλύτερη αναγνώριση συσκευών ενός υπολογιστή από οποιαδήποτε άλλη διανομή του Linux. Κατά αυτόν τον τρόπο, μπορούμε να αξιοποιήσουμε διάφορες λειτουργίες του Thinkpad. Έτσι, μπορούμε να αναθέσουμε εργασίες σε συντομεύσεις ειδικών κουμπιών στο περιβάλλον GNOME. Για παράδειγμα, μπορούμε με το πατώντας το πλήκτρο ThinkVantage, να ξεκινούμε το Firefox.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_RJFKX1cK_dA/TNsGEVDVRJI/AAAAAAAABGg/1aX6_vcvmmE/s1600/thinkvantage-button_225x200.jpg"&gt;&lt;img style="cursor: pointer; width: 225px; height: 200px;" src="http://4.bp.blogspot.com/_RJFKX1cK_dA/TNsGEVDVRJI/AAAAAAAABGg/1aX6_vcvmmE/s320/thinkvantage-button_225x200.jpg" alt="" id="BLOGGER_PHOTO_ID_5538026838222521490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Τα βήματα έχουν ως εξής: Στο μενού System-&gt;Preferences θα βρούμε την επιλογή Keyboard Shortcuts που περιγράφει όλες τις διαθέσιμες συντομεύσεις. Ψάχνουμε να βρούμε την επιλογή Launch Web Browser καιι πατάμε μια φορά το πλήκτρο ThnkVantage. Αμέσως μετά έχει καταγραφεί η ενέργεια και το συνοδευτικό ειδικό πλήκτρο (XF86Launch1 στην περίπτωσή μας) Από εδώ και στο εξής, πατώντας αυτό το κουμπί θα εκκινείται ο Firefox.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_RJFKX1cK_dA/TNsGLFSC5bI/AAAAAAAABGo/xwxCE99DCEc/s1600/Screenshot-Keyboard%2BShortcuts.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 198px;" src="http://4.bp.blogspot.com/_RJFKX1cK_dA/TNsGLFSC5bI/AAAAAAAABGo/xwxCE99DCEc/s320/Screenshot-Keyboard%2BShortcuts.png" alt="" id="BLOGGER_PHOTO_ID_5538026954248349106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Κάτι που επίσης έχει ενδιαφέρον είναι το γεγονός πως η λίστα των keyboard shortcuts είναι επεκτάσιμη και μπορούμε να δηλώσουμε τα δικά μας γεγονότα (πχ ξεκίνημα ενός virtual machine) με τις δικές μας συντομεύσεις.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-4974943927050026617?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/4974943927050026617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=4974943927050026617' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4974943927050026617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4974943927050026617'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2010/11/keyboard-shortcuts-lenovo-thinkpads.html' title='Keyboard shortcuts για τα Lenovo Thinkpads στο Ubuntu 10.10'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RJFKX1cK_dA/TNsGEVDVRJI/AAAAAAAABGg/1aX6_vcvmmE/s72-c/thinkvantage-button_225x200.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-4001939758891069479</id><published>2010-11-05T22:15:00.005+02:00</published><updated>2011-06-21T15:43:40.558+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenOffice'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Άνοιγμα docx αρχείων στο Linux (συνδυασμός Microsoft Word Viewer και Wine)</title><content type='html'>Παρόλο που το OpenOffice κάνει ό,τι είναι δυνατόν προκειμένου να εμφανίσει με ακρίβεια αρχεία τύπου docx ή εν γένει .doc, δεν είναι λίγες οι φορές που έχει τύχει τα αποτελέσματα να μην είναι τα αναμενόμενα. Λάθη απεικόνισης συμβαίνουν στους πίνακες περιεχόμενων, στη στοίχιση των πεδίων, τα γραφήματα ή στις γραμματοσειρές. Μια εναλλακτική (δωρεάν) προσέγγιση είναι να χρησιμοποιήσουμε το Microsoft Word Viewer. Αφορμή για αυτό το άρθρο αποτέλεσε η δημοσίευση στο &lt;a href="http://sotostips.blogspot.com/2010/11/microsoft-word-viewer-compatibility.htm"&gt;http://sotostips.blogspot.com/2010/11/microsoft-word-viewer-compatibility.htm&lt;/a&gt;. Εκεί περιγράφεται η εγκατάσταση του Microsoft Word Viewer καθώς και του compatibility pack ώστε να μπορούμε να εμφανίσουμε σε read-only μορφή τύπους αρχείων που υποστηρίζονται από το Microsoft Word, που ανάμεσα στους άλλους περιλαμβάνεται και το docx.&lt;br /&gt;&lt;br /&gt;H δική μου προσπάθεια εστιάστηκε στην μεταφορά αυτής της λύσης στο περιβάλλον του Linux και πιο συγκεκριμένα στο openSuSE 11.2 με τη βοήθεια του Windows Emulator wine-1.1.28. Κατεβάζουμε λοιπόν από το site της Microsoft το &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en"&gt;Word Viewer&lt;/a&gt; καθώς και το &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=941b3470-3ae9-4aee-8f43-c6bb74cd1466&amp;amp;displayLang=en"&gt;Compatibility Pack&lt;/a&gt;. Έπειτα κάνουμε την εγκατάσταση στο Wine, πρώτα του Word Viewer, με την απλότητα του:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;wine wordview_en_us.exe&lt;br /&gt;&lt;/span&gt;&lt;a href="http://4.bp.blogspot.com/_RJFKX1cK_dA/TNRmQaW8QPI/AAAAAAAABF4/vdnql8bpdJw/s1600/Screenshot-Microsoft+Office+Word+Viewer.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 213px;" src="http://4.bp.blogspot.com/_RJFKX1cK_dA/TNRmQaW8QPI/AAAAAAAABF4/vdnql8bpdJw/s320/Screenshot-Microsoft+Office+Word+Viewer.png" alt="" id="BLOGGER_PHOTO_ID_5536162274084667634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_RJFKX1cK_dA/TNRmXIYgDGI/AAAAAAAABGA/onAH1EyhxKc/s1600/Screenshot-Microsoft+Office+Word+Viewer+2003+Setup.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 277px;" src="http://3.bp.blogspot.com/_RJFKX1cK_dA/TNRmXIYgDGI/AAAAAAAABGA/onAH1EyhxKc/s320/Screenshot-Microsoft+Office+Word+Viewer+2003+Setup.png" alt="" id="BLOGGER_PHOTO_ID_5536162389518453858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Με ανάλογο τρόπο εγκαθιστούμε το compatibility pack, παραβλέποντας οποιαδήποτε λάθη εμφανιστούν. Στο τέλος, το Microsoft Word Viewer βρίσκεται στη λίστα των νέων εφαρμογών.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_RJFKX1cK_dA/TNRmewpp4CI/AAAAAAAABGI/1OwSYoAHAnY/s1600/Screenshot-Application+Browser.png"&gt;&lt;img style="cursor: pointer; width: 254px; height: 320px;" src="http://3.bp.blogspot.com/_RJFKX1cK_dA/TNRmewpp4CI/AAAAAAAABGI/1OwSYoAHAnY/s320/Screenshot-Application+Browser.png" alt="" id="BLOGGER_PHOTO_ID_5536162520586903586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ας κάνουμε την αντιπαράθεση του Word Viewer με το OpenOffice. Σίγουρα το εργαλείο της Microsoft υπερισχύει στην ακρίβεια της απόδοσης των εγγράφων. Ενδεικτικά σε κάποια κείμενα που δοκίμασα, ακολουθούν συγκριτικές φωτογραφίες. Στο αριστερό παράθυρο είναι το Microsoft Word Viewer στο περιβάλλον του Linux ενώ στο δεξί το OpenOffice, διαβάζοντας το ίδιο κείμενο. Σε γενικές γραμμές, παρατήρησα προβλήματα απεικόνισης της σωστής γραμματοσειράς (πχ θέματα bold χαρακτήρων), εμφάνισης γραφημάτων αλλά και τοποθέτησης πλαισίων.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_RJFKX1cK_dA/TNRmpYmtWMI/AAAAAAAABGQ/w0KyI4P4dx0/s1600/Screenshot.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 165px;" src="http://1.bp.blogspot.com/_RJFKX1cK_dA/TNRmpYmtWMI/AAAAAAAABGQ/w0KyI4P4dx0/s320/Screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5536162703110658242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_RJFKX1cK_dA/TNRmu7iGqRI/AAAAAAAABGY/sHCLfABuf3s/s1600/Screenshot-1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 174px;" src="http://4.bp.blogspot.com/_RJFKX1cK_dA/TNRmu7iGqRI/AAAAAAAABGY/sHCLfABuf3s/s320/Screenshot-1.png" alt="" id="BLOGGER_PHOTO_ID_5536162798385932562" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-4001939758891069479?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/4001939758891069479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=4001939758891069479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4001939758891069479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/4001939758891069479'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2010/11/docx-linux-microsoft-word-viewer-wine.html' title='Άνοιγμα docx αρχείων στο Linux (συνδυασμός Microsoft Word Viewer και Wine)'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RJFKX1cK_dA/TNRmQaW8QPI/AAAAAAAABF4/vdnql8bpdJw/s72-c/Screenshot-Microsoft+Office+Word+Viewer.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-1732716396222671175</id><published>2010-10-28T17:21:00.004+03:00</published><updated>2010-10-28T17:25:17.970+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='weblogic'/><title type='text'>Προσαρμοσμένο monitoring στο Weblogic 10.3.3</title><content type='html'>Στο προηγούμενο άρθρο (&lt;a href="http://serafeimk.blogspot.com/2010/10/time-sync-virtualbox.html"&gt;http://serafeimk.blogspot.com/2010/10/time-sync-virtualbox.html&lt;/a&gt;) είχαμε αναφερθεί έστω και συνοπτικά στον JProfiler για την καταγραφή των εργασιών που λαμβάνουν χώρα σε έναν Application Server. Ως προγραμματιστές εφαρμογών στο Weblogic, μπορούμε κάνουμε monitoring του τι συμβαίνει στο Weblogic Server είτε από το Fusion Middleware Control είτε από την κονσόλα του Weblogic Server, ειδικά αν κάνουμε development. Στην πιο πρόσφατη έκδοση 10.3.3 έχει προστεθεί η δυνατότητα στην κονσόλα να κατασκευάζουμε τα δικά μας γραφήματα παρακολούθησης εργασιών, με βάση την πληροφορία που βρίσκεται στα ΜBeans του Weblogic.&lt;br /&gt;&lt;br /&gt;Πιο συγκεκριμένα, η λειτουργία αυτή είναι διαθέσιμη στην πρώτη σελίδα της κονσόλας στην κατηγορία "Charts And Graphs".&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_RJFKX1cK_dA/TMmHND1UkuI/AAAAAAAABFg/rbLBILvvUXY/s1600/untitled.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 187px;" src="http://4.bp.blogspot.com/_RJFKX1cK_dA/TMmHND1UkuI/AAAAAAAABFg/rbLBILvvUXY/s320/untitled.png" alt="Weblogic monitoring" id="BLOGGER_PHOTO_ID_5533102275638366946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Υπάρχουν κάποιες έτοιμες αναφορές και γραφήματα όπως για παράδειγμα το JVM Heap Size, τα JDBC connections, κλπ που απλά πρέπει να τα ενεργοποιήσουμε με την εργαλειοθήκη στο πάνω μέρος της οθόνης.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_RJFKX1cK_dA/TMmHZron1rI/AAAAAAAABFo/YZRM1viVPw8/s1600/untitled2.PNG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 164px;" src="http://1.bp.blogspot.com/_RJFKX1cK_dA/TMmHZron1rI/AAAAAAAABFo/YZRM1viVPw8/s320/untitled2.PNG" alt="Weblogic jvm monitoring" id="BLOGGER_PHOTO_ID_5533102492480951986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Το πιο σημαντικό πάντως της υπόθεσης είναι η δυνατότητα κατασκευής της δικής μας αναφοράς, χρησιμοποιώντας ιδιότητες των MBeans του Weblogic από τον Metric Browser. Με απλό drag και drop σε ένα νέο γράφημα, μπορούμε να κατασκευάσουμε το δικό μας dashboard για τα στοιχεία που μας ενδιαφέρουν, και που μπορούν να αφορούν στοιχεία του Server (CPU, JVM, Datasources, JMS, κλπ) ή των εφαρμογών μας.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_RJFKX1cK_dA/TMmHiaWOb_I/AAAAAAAABFw/ivSi1Qz_iDI/s1600/untitled3.PNG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 166px;" src="http://3.bp.blogspot.com/_RJFKX1cK_dA/TMmHiaWOb_I/AAAAAAAABFw/ivSi1Qz_iDI/s320/untitled3.PNG" alt="Weblogic custom report monitoring" id="BLOGGER_PHOTO_ID_5533102642459209714" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-1732716396222671175?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/1732716396222671175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=1732716396222671175' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/1732716396222671175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/1732716396222671175'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2010/10/monitoring-weblogic-1033.html' title='Προσαρμοσμένο monitoring στο Weblogic 10.3.3'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RJFKX1cK_dA/TMmHND1UkuI/AAAAAAAABFg/rbLBILvvUXY/s72-c/untitled.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-6354320935046887423</id><published>2010-10-22T22:52:00.003+03:00</published><updated>2010-10-22T22:55:13.985+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Γιατί είναι τόσο εύκολο να ξεκινήσεις ένα σύστημα στο Linux</title><content type='html'>Αυτές τις ημέρες έκανα την εγκατάσταση του Ubuntu 10.10 και για άλλη μια φορά επιβεβαίωσα πως είναι τόσο εύκολο και γρήγορο να στήνεις ένα Linux σύστημα, ιδίως αν βέβαια αν έχεις μια προηγούμενη εμπερία. Οι λόγοι πολλοί:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;οι εγκαταστάτες (installers) των περισσότερων διανομών δεν κάνουν πολλές ερωτήσεις αλλά είναι εξαιρετικά φιλικοί προς τον τελικό χρήστη&lt;/li&gt;&lt;li&gt;η διάρκεια της εγκατάστασης διαρκεί πολύ λίγο, σίγουρα λιγότερο από 20 λεπτά σε ένα μεσαίας δυναμικότητας μηχάνημα&lt;br /&gt;&lt;/li&gt;&lt;li&gt;φυσικά πάντα υπάρχει η επιλογή να χρησιμοποιήσουμε ένα Live CD ή USB, ώστε να δοκιμάσουμε μια διανομή ή να κάνουμε τα πειράματα μας με ασφάλεια&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Άπαξ και ξεκινήσει το σύστημα μας, μπορούμε σε μια γραμμή εντολών (κυριολεκτικά) να κάνουμε εγκατάσταση όλα τα προγράμματα που μας ενδιαφέρουν. Τόσο το πρόγραμμα &lt;span style="font-family:monospace;"&gt;apt-get&lt;/span&gt; του Ubuntu, όπως και το &lt;span style="font-family:monospace;"&gt;zypper&lt;/span&gt; του openSuSE κάνουν θαύματα. Σκεφτείτε, ιδίως αν προέρχεστε από τον κόσμο των Windows, σε μια εντολή να προκαλείτε την εγκατάσταση του Acrobat Reader, του Winzip, του Firefox, και λοιπών προγραμμάτων που καθημερινά χρειάζεστε. Πραγματικά εντυπωσιακό !&lt;/li&gt;&lt;li&gt;Ειδικά για την περίπτωση του Firefox, υπάρχει ένα extension ονόματι FEBE (Firefox Environment Backup Extension - &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/2109/"&gt;https://addons.mozilla.org/en-US/firefox/addon/2109/&lt;/a&gt;) που μας επιτρέπει να αποθηκεύσουμε (backup) τις ρυθμίσεις, όπως bookmarks, themes, extensions, ώστε να μπορούμε να τις αποκαταστήσουμε (restore) σε ένα άλλο μηχάνημα μέσα σε λίγα δευτερόλεπτα.&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://4.bp.blogspot.com/_RJFKX1cK_dA/TMHrqoSmMdI/AAAAAAAABFM/ONc-hQbpoc4/s1600/Screenshot-FEBE+Options.png"&gt;&lt;img style="cursor: pointer; width: 265px; height: 320px;" src="http://4.bp.blogspot.com/_RJFKX1cK_dA/TMHrqoSmMdI/AAAAAAAABFM/ONc-hQbpoc4/s320/Screenshot-FEBE+Options.png" alt="Firefox extension backup FEBE" id="BLOGGER_PHOTO_ID_5530960934990131666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_RJFKX1cK_dA/TMHrxHqsmPI/AAAAAAAABFU/aNpqnLHARgM/s1600/febe-restore.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 279px;" src="http://4.bp.blogspot.com/_RJFKX1cK_dA/TMHrxHqsmPI/AAAAAAAABFU/aNpqnLHARgM/s320/febe-restore.png" alt="Firefox extension FEBE restore" id="BLOGGER_PHOTO_ID_5530961046491928818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Τέλος τα περισσότερα αρχεία ρυθμίσεων του Linux είναι απλά αρχεία κειμένου. Κατά αυτόν τον τρόπο, είναι εύκολο να αποκαταστήσουμε τροποποιήσεις, απλά με copy και paste.&lt;/li&gt;&lt;/ul&gt;&lt;img src="file:///tmp/moz-screenshot.png" alt="" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-6354320935046887423?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/6354320935046887423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=6354320935046887423' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/6354320935046887423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/6354320935046887423'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2010/10/linux.html' title='Γιατί είναι τόσο εύκολο να ξεκινήσεις ένα σύστημα στο Linux'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RJFKX1cK_dA/TMHrqoSmMdI/AAAAAAAABFM/ONc-hQbpoc4/s72-c/Screenshot-FEBE+Options.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-3892385681602933327</id><published>2010-10-19T16:39:00.002+03:00</published><updated>2010-10-19T16:43:12.130+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualbox'/><title type='text'>Ρύθμιση του time sync στο VirtualBox</title><content type='html'>Ένα από τα πιο ουσιαστικά προγράμματα που έχω ποτέ χρησιμοποιήσει είναι το JProfiler (&lt;a href="http://www.ej-technologies.com/products/jprofiler/overview.html"&gt;http://www.ej-technologies.com/products/jprofiler/overview.html&lt;/a&gt;) Το έχω εμπιστευτεί ουκ ολίγες φορές για το profiling JEE εφαρμογών, που συνήθως εκτελούνταν στον Oracle Application Server (φυσικά λειτουργεί και με πολλούς άλλους Application Servers) και πραγματικά με έχει εντυπωσιάσει με τις δυνατότητές του και τη λεπτομέρεια των στοιχείων του. Ενώ όμως είναι ένα προϊόν που το έχω συστήσει σε πολλούς οργανισμούς, οι οποίοι τελικά το έχουν αγοράσει, προσωπικά θεωρώ το development license του υψηλό. Κατά αυτόν τον τρόπο βρίσκομαι στο αδιέξοδο μιας trial version που δεν μπορεί να λειτουργήσει ούτε να ανοίξει τα profiling snapshots που μου στέλνουν οι πελάτες μου.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_RJFKX1cK_dA/TL2f14NXxTI/AAAAAAAABE8/d3SRYlkMeco/s1600/Screenshot.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_RJFKX1cK_dA/TL2f14NXxTI/AAAAAAAABE8/d3SRYlkMeco/s320/Screenshot.png" alt="JProfiler license" id="BLOGGER_PHOTO_ID_5529751665451189554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Εξαιτίας του ότι τρέχω όλο το προγραμματιστικό μου περιβάλλον σε virtual machines του VirtualBox, μπορώ να κάνω ένα τέχνασμα, αλλάζοντας την ημερομηνία του guest vm ώστε να μην διαμαρτύρεται ο JProfiler για την πάροδο της δοκιμαστικής περιόδου. Πιο συγκεκριμένα, έχοντας κλειστό το guest vm, πληκτρολογούμε:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;VBoxManage setextradata [VMname] "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" "1"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Έτσι, απορρυθμίζεται το ρολόι του guest από το συγχρονισμό του με τον host. Έπειτα ξεκινούμε το vm μας και αλλάζουμε την ώρα. Ο JProfiler θα εκτελεστεί κανονικά μετά από αυτήν την αλλαγή.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_RJFKX1cK_dA/TL2gAbNPfVI/AAAAAAAABFE/MNRzpiMoYMA/s1600/Screenshot-05102010.jps+-+JProfiler+6.0.6.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 204px;" src="http://4.bp.blogspot.com/_RJFKX1cK_dA/TL2gAbNPfVI/AAAAAAAABFE/MNRzpiMoYMA/s320/Screenshot-05102010.jps+-+JProfiler+6.0.6.png" alt="JProfiler memory consumption" id="BLOGGER_PHOTO_ID_5529751846644579666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Τερματίζουμε το vm μας και για να επιστρέψουμε στο συγχρονισμό ώρας μεταξύ host και guest στο VirtualBox πληκτρολογούμε:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;VBoxManage setextradata [VMname] "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" "0"&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-3892385681602933327?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/3892385681602933327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=3892385681602933327' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3892385681602933327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/3892385681602933327'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2010/10/time-sync-virtualbox.html' title='Ρύθμιση του time sync στο VirtualBox'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_RJFKX1cK_dA/TL2f14NXxTI/AAAAAAAABE8/d3SRYlkMeco/s72-c/Screenshot.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-5734907760103077605</id><published>2010-10-13T23:28:00.003+03:00</published><updated>2010-10-19T16:45:32.102+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thinkpad'/><title type='text'>Μερικές πληροφορίες για τα Lenovo Thinkpad εκ των έσω</title><content type='html'>Εδώ και δυο περίπου χρόνια έχω βασιστεί  στο Lenovo Thinkpad T400 για τη δουλεία μου. Αν και έχει περάσει αρκετός καιρός από αυτήν την αγορά, ακόμα δεν αισθάνομαι μειονεκτικά ως προς τις επιδόσεις του, πόσο μάλλον όταν τρέχω τα πάντα σε VirtualBox. Απεναντίας, ίσως γιατί το host λειτουργικό σύστημα είναι Linux, ίσως γιατί η ποιότητα κατασκευής είναι πολύ υψηλή, ίσως γιατί έχω προσθέσει γρήγορους δίσκους και μνήμες, το μηχάνημα με ικανοποιεί απόλυτα στην καθημερινή και επίπονη (ελέω χρησιμοποίησης πολλαπλών Oracle προϊόντων) εργασία μου.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_RJFKX1cK_dA/TLYWlhrvo2I/AAAAAAAABEI/FT2M6USj4aQ/s1600/lenovo-thinkpad-t400-laptop.jpg"&gt;&lt;img style="cursor: pointer; width: 299px; height: 320px;" src="http://2.bp.blogspot.com/_RJFKX1cK_dA/TLYWlhrvo2I/AAAAAAAABEI/FT2M6USj4aQ/s320/lenovo-thinkpad-t400-laptop.jpg" alt="Lenovo Thinkpad T400" id="BLOGGER_PHOTO_ID_5527630426596680546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Η κρίση μου αυτή πιστεύω πως αποκτά ιδιαίτερη σημασία, αν αναλογιστεί κανείς πως μετακινούμαι σε καθημερινή βάση, το laptop λειτουργεί σε διάφορα περιβάλλοντα εργασίας, καλώδια δικτύου, πρίζες και καλώδια usb μπαίνουν και βγαίνουν αρκετές φορές κατά τη διάρκεια της ημέρας. Χωρίς καμία διάθεση προπαγάνδας, θεωρώ πως είναι το πιο αξιόπιστο laptop που έχει περάσει από τα χέρια μου (και η αλήθεια είναι πως έχουν περάσει ήδη πολλά), το πλέον αθόρυβο, με μεγάλη ανταποδοτική και ανταλλακτική αξία και ταιριάζει αρκετά σε αυτούς που θέλουν να κάνουν προγραμματισμό σε Linux: λόγω του παρελθόντος της IBM, υπάρχει πάρα πολύ καλή υποστήριξη του hardware των thinkpads από τον kernel αλλά και από άλλα συνοδευτικά προγράμματα στο Linux.&lt;br /&gt;&lt;br /&gt;Και αν αυτά ισχύουν για το λογισμικό και την εν γένει κατασκευή, τις προάλλες βρέθηκα αντιμέτωπος με την πρόκληση να ανοίξω το laptop ώστε να καθαρίσω την σκόνη που είχει αρχίσει και συσσωρεύεται κοντά στον ανεμιστήρα του. Για αυτήν την αποστολή, αποδείχθηκε πως είχα ως καλό σύμμαχο ένα υπερ-αναλυτικό hardware maintenance manual του Τ400 που περιγράφει και την παραμικρή λεπτομέρεια κατασκευής (&lt;a href="http://download.lenovo.com/ibmdl/pub/pc/pccbbs/mobiles_pdf/43y6629_04.pdf"&gt;http://download.lenovo.com/ibmdl/pub/pc/pccbbs/mobiles_pdf/43y6629_04.pdf&lt;/a&gt;). Επίσης έμαθα πως υπάρχει ένα επίσημο site της Lenovo (&lt;a href="http://www.lenovoservicetraining.com/"&gt;http://www.lenovoservicetraining.com&lt;/a&gt;) που περιγράφει αναλυτικά με φωτογραφίες και με videos διάφορες ειδικές εργασίες συντήρησης.&lt;br /&gt;&lt;br /&gt;Τελικά η αφαίρεση της σκόνης ήταν επιτυχής και πραγματικά αποσυναρμολογώντας το Thinkpad το εκτίμησα ακόμη περισσότερο!&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_RJFKX1cK_dA/TLYWyAjpKSI/AAAAAAAABEQ/5p_AmN8Q8yk/s1600/IMG_0862.JPG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 179px;" src="http://2.bp.blogspot.com/_RJFKX1cK_dA/TLYWyAjpKSI/AAAAAAAABEQ/5p_AmN8Q8yk/s320/IMG_0862.JPG" alt="Lenovo Thinkpad T400 hardware inside" id="BLOGGER_PHOTO_ID_5527630641042630946" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-5734907760103077605?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/5734907760103077605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=5734907760103077605' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5734907760103077605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20568265/posts/default/5734907760103077605'/><link rel='alternate' type='text/html' href='http://serafeimk.blogspot.com/2010/10/lenovo-thinkpad.html' title='Μερικές πληροφορίες για τα Lenovo Thinkpad εκ των έσω'/><author><name>Serafeim Karapatis</name><uri>http://www.blogger.com/profile/04661418240963978350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_RJFKX1cK_dA/TLa99hqG7II/AAAAAAAABEc/3imPadYQ_nI/s1600-R/U38951.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_RJFKX1cK_dA/TLYWlhrvo2I/AAAAAAAABEI/FT2M6USj4aQ/s72-c/lenovo-thinkpad-t400-laptop.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20568265.post-4484992570597847000</id><published>2010-09-30T15:29:00.006+03:00</published><updated>2010-09-30T15:34:35.549+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jdeveloper'/><title type='text'>Versioning comment templates στον JDeveloper 11g</title><content type='html'>Η ομάδα ανάπτυξης στην οποία εργάζομαι αυτόν τον καιρό κατέληξε σε μια γραμμογράφηση σχετικά με τα σχόλια των αρχείων (πχ αναλυτική περιγραφή, οδηγίες για testing, κλπ) που γίνονται commit στο Subversion. O JDeveloper 11g υποστηρίζει την δυνατότητα δημιουργίας ενός template που θα ακολουθούν τα commits στο versioning σύστημά μας.&lt;br /&gt;&lt;br /&gt;Ανατρέχοντας στο μενού Tools--&gt;Preferences βρίσκουμε την επιλογή Versioning-&gt;Comment templates και επιλέγουμε Add.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_RJFKX1cK_dA/TKSC3a8JkbI/AAAAAAAABDg/zPLFxPXidj4/s1600/template_editor.PNG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 229px;" src="http://1.bp.blogspot.com/_RJFKX1cK_dA/TKSC3a8JkbI/AAAAAAAABDg/zPLFxPXidj4/s320/template_editor.PNG" alt="" id="BLOGGER_PHOTO_ID_5522682931699093938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Κατόπιν γράφουμε το κείμενο μας που θα λειτουργεί ως template.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_RJFKX1cK_dA/TKSDEDCuXPI/AAAAAAAABDo/HxYo7KngUJU/s1600/create_template.PNG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 130px;" src="http://1.bp.blogspot.com/_RJFKX1cK_dA/TKSDEDCuXPI/AAAAAAAABDo/HxYo7KngUJU/s320/create_template.PNG" alt="" id="BLOGGER_PHOTO_ID_5522683148622519538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Προκειμένου να το μοιραστούμε και με άλλα μέλη της ομάδας μας, διαλέγουμε να κάνουμε export σε μορφή XML το template που μόλις κατασκευάσαμε.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_RJFKX1cK_dA/TKSDg545v_I/AAAAAAAABD4/mo6LWQkF-Eg/s1600/browse_template.PNG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 229px;" src="http://3.bp.blogspot.com/_RJFKX1cK_dA/TKSDg545v_I/AAAAAAAABD4/mo6LWQkF-Eg/s320/browse_template.PNG" alt="" id="BLOGGER_PHOTO_ID_5522683644381609970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Το παραγόμενο XML αρχείο μπορεί να τοποθετηθεί σε ένα shared drive ή στο versioning repository ώστε να έχουν πρόσβαση σε αυτό όλα τα μέλη της ομάδας, κάνοντας το import ακολουθώντας την αντίστοιχη επιλογή σε αυτήν την οθόνη. Την επόμενη φορά που θα κάνουμε commit, το template μας θα εμφανιστεί απευθείας, ώστε να μπορέσουμε να συμπληρώσουμε τις λεπτομέρειες.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_RJFKX1cK_dA/TKSDwtjCxJI/AAAAAAAABEA/4XYMTUSAy5c/s1600/commit_resources.PNG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 161px;" src="http://3.bp.blogspot.com/_RJFKX1cK_dA/TKSDwtjCxJI/AAAAAAAABEA/4XYMTUSAy5c/s320/commit_resources.PNG" alt="" id="BLOGGER_PHOTO_ID_5522683915946607762" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20568265-4484992570597847000?l=serafeimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://serafeimk.blogspot.com/feeds/4484992570597847000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20568265&amp;postID=4484992570597847000' title='0 Comments'/><link rel='ed
