Σάββατο 11 Αυγούστου 2007

_vimrc


set shiftwidth=2
set tabstop=2
set number
set smartindent
set backspace=2
syntax on

set encoding=utf8
set fileencoding=utf8

abbreviate uricore <%@ taglib \
prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
abbreviate urisql <%@ taglib \
prefix = "sql" uri = "http://java.sun.com/jsp/jstl/sql" %>
abbreviate urifmt <%@ taglib \
prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %>
abbreviate urifn <%@ taglib \
prefix = "fn" uri = "http://java.sun.com/jsp/jstl/functions" %>
abbreviate urixml <%@ taglib \
prefix = "x" uri = "http://java.sun.com/jsp/jstl/xml" %>
abbreviate jsppage <%@ page contentType = "text/html" \
pageEncoding = "utf8" %>

map <F8> <Esc>:!ant javadoc<Return>
map <F9> <Esc>:!ant<Return>
map <F10> <Esc>:!ant run<Return>
(Όπου \ συνεχίζει η ίδια γραμμή, το έχω βάλει απλά για μορφοποίηση)
Δημοσιεύω επιτέλους κάτι που ήθελα να κάνω εδώ και καιρό. Το _vimrc μου. Για όσους δεν ξέρουν το _vimrc είναι το αρχείο ρυθμίσεων για κάθε χρήστη του vim.

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

Για όσους δεν ξέρουν τον vim να πω ότι είναι ένας από τους καλύτερους editor (ο καλύτερος κατά τη γνώμη μου) για να γράψει κάποιος οτιδήποτε, από κώδικα μέχρι ένα αρχείο κειμένου. Σίγουρα όσοι έχουν συνηθήσει το notepad ή γενικά τον τρόπου που γράφουμε ένα αρχείο κειμένου στα windows θα δυσκολευτούν πολύ στην αρχή, αλλά πιστέψτε με, αυτός ο κόπος αξίζει κάθε λεπτό που περνάς μαζί με αυτό τον editor.

Μπορείτε να τον κατεβάσετε και να τρέξετε το vim tutor που θα προσπαθήσει να σας μάθει τα βασικά. Και γράφω θα προσπαθήσει γιατί δεν μπορείς ξαφνικά να μάθεις τον τρόπο γραφής του vim. Τα δάχτυλα έχουν συνηθήσει να πηγαίνουν αλλού, δεν ξέρεις που βρίσκεσαι, πατάς ένα λάθος πλήκτρο και γίνεται πανικός. Εκεί όμως που σε ανταμοίβει είναι όταν κάνεις edit 10000 γραμμές σε ένα λεπτό. Εκεί νιώθεις πολύ "μάγκας". Ή όταν επιλέγεις μια στήλη κειμένου. Λίγοι editors έχουν αυτή την επιλογή.

Εγώ απλά ευχαριστώ τον Γαβριήλ από το Studio FM1 στο ΤΕΙ Κρήτης, όταν με είδε να κάνω edit ένα html αρχείο στον vim και μου ενεργοποίησε το syntax on. Τότε κατάλαβα ότι ο vim δεν ήταν απλά ένας παλαιοληθικός editor...

Πέμπτη 2 Αυγούστου 2007

Internet Explorer 6 και μέγεθος κελιών σε πίνακα

Όπως καταλαβαίνετε τις τελευταίες μέρες κάνω αρκετό development για Internet Explorer 6 (δυστηχώς) κι έτσι χρειάζεται να βρίσκω λύσεις στα διάφορα προβλήματά του.

Το σημερινό πρόβλημα λοιπόν είχε να κάνει με ένα παλιό κώδικα που έφτιαχνε μια ιστοσελίδα με ένα πίνακα. Αυτός ο πίνακας πρέπει να έχει συγκεκριμένο μέγεθος γιατί εκτυπώνεται και δίνεται σε πελάτες. Στην παλιά περίπτωση όλη η html ερχόταν στον browser σε μια γραμμή μέσα από πολλαπλά writes από ένα servlet.

Αφού λοιπόν έφτιαξα μια ωραία σελίδα με τον σκέτο html κώδικα και taglibs παρατηρήθηκε ότι ο πίνακας που έφτιαχνε ο ΙΕ6 ήταν κάπως μεγαλύτερος απ'ότι ο παλιός. Το πρόβλημα βρισκόταν στα κελιά. Αφού σπατάλησα αρκετή ώρα ψάχνοντας να βρω λάθος στον κώδικα τελικά με την βοήθεια του συναδέλφου μου βρέθηκε η λύση.

Αν υπάρχει κενό μεταξύ των html elements μέσα στο td τότε αυτό έχει μεγαλύτερο μέγεθος. Για παράδειγμα αυτό το κελί:

<td>
<center>
<font face = "arial">
Some text
</font>
</center>
</td>

θα έχει μεγαλύτερο ύψος από αυτό το κελί:

<td><center><font face = "arial">
Some text
</font></center></td>


Με κάτι τέτοια είναι που απορώ πως αυτός ο browser ακόμα έχει 75% μερίδιο στους χρήστες. Μου θύμησε μια περίπτωση που είχα συναντήσει παλιά με τον firefox, όμως εκεί ήταν λάθος του specification ( ο firefox το ακολουθούσε πιστά, ενώ ο IE6 είχε πιο λογική συμπεριφορά).
Τότε προσπαθούσα να πάρω με javascript τα παιδιά πχ ενός td. Το 1ο όμως παιδί δεν ήταν html element. Με τα πολλά ανακάλυψα ότι λόγω των tabs και τον αλλαγών γραμμών στον κώδικα ο firefox τοποθετούσε ως 1ο παιδί ενός td ένα κενό στοιχείο κειμένου. Δηλαδή για να πάρω την επιθυμητή συμπεριφορά στη javascript έπρεπε να γράψω όλο το td σε μια γραμμή.
Ώρες ώρες μου τι δίνουν αυτοί οι browser...

Τετάρτη 1 Αυγούστου 2007

Internet Explorer 6 και select box z-index

Ίσως αρκετοί από εσάς να γνωρίζετε ένα bug του Internet Explorer 6, στο οποίο ένα html select εμφανίζεται πάνω από οτιδήποτε, χωρίς να διαβάζει το z-index που του δίνεται. Π.χ. εμφανίζεται ένα div δυναμικά στη σελίδα, αλλά το select εξακολουθεί να βρίσκεται πάνω από το div. Το πρόβλημα βρίσκεται στο ότι το εν λόγω element δεν είναι html element αλλά είναι στην ουσία το select box που χρησιμοποιούν τα windows μέσα από το win32 api.

Πώς λοιπόν μπορούμε να λύσουμε αυτό το πρόβλημα; Χρησιμοποιώντας το ίδιο bug, που ισχύει και για το iframe. Στην ουσία δηλαδή ένα iframe τοποθετείται κάτω από το div και αποκρύπτει το προβληματικό select box. Χρειαζόμαστε όμως ακόμα ένα div το οποίο θα περιέχει το div το οποίο θέλουμε να δείξουμε.

Ακολουθώντας το παράδειγμα της εικόνας, αν έχουμε το:

<div class = "mydiv">
Περιεχόμενο, για να δούμε θα εμφανιστεί από πάνω;
</div>

θα πρέπει να το κάνουμε:

<div class = "wrapper">
<div class = "mydiv">
Περιεχόμενο, για να δούμε θα εμφανιστεί από πάνω;
</div>
<!--[if lte IE 6.5]><iframe></iframe><![endif]-->
</div>

Αυτό που χρήζει προσοχής είναι το conditional include που γίνεται έτσι ώστε το iframe να εμφανίζεται μόνο στον IE 6 και κάτω. Γενικά με αυτόν τον τρόπο μπορεί κανείς να εισάγει κώδικα, όπως css ή οτιδήποτε άλλο, που προορίζεται μόνο για τον IE6 και κάτω.

Τώρα ήρθε η ώρα για να κάνει την δουλειά το css. Έχουμε λοιπόν:

div.wrapper {
position: absolute;
left: 5px;
top: 5px;
z-index: 10;
overflow: hidden;
width: 288px;
height: 108px;

}

div.wrapper iframe {
display: block;
top: 0px;
left: 0px;
z-index: -1;
filter: mask();
width: 288px;
height: 108px;
}

div.mydiv {
position: absolute;
left: 0px;
top: 0px;
background-color: #EEEEEE;
border: 4px outset #004080;
width: 280px;
height: 100px;
}


Αυτό που πρέπει να προσέξει κανείς είναι τo filter:mask(); που είναι συγκεκριμένο για τον internet explorer και ενεργοποιεί την μηχανή rendering του ActiveX, καθώς επίσης και ότι το width & height είναι λίγο μεγαλύτερα για να συμπεριλάβουν το περιθώριο που έχει τεθεί στο αρχικό div.

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

Τρίτη 31 Ιουλίου 2007

Εύρεση προγράμματος που ακούει σε κάποια port στα windows xp

Οκ, μόλις είχα ένα περίεργο πρόβλημα. O apache2 δεν μπορούσε να σηκωθεί και κάνοντας repair στην εγκατάσταση μου έβγαλε το μήνυμα ότι δεν άνοιγε γιατί κάποιος άλλος είχε κάνει bind την πόρτα 80 στον υπολογιστή. Μετά από λίγο ψάξιμο βρήκα πως μπορώ να βρω το πρόγραμμα:
netstat -ano μας δίνει ποιό Process ID (PID) είναι συνδεδεμένο με ποιά πόρτα
Στη συνέχεια από τον Task Manager->View->Select Columns->PID και βρίσκουμε το πρόγραμμα.
Και για ένα περίεργο λόγο το πρόγραμμα που με μπλόκαρε ήταν το Skype...

Τρίτη 24 Ιουλίου 2007

Το πρώτο μου post

Καλώς ήρθατε στο blog μου. Μέσα σ'αυτές τις σελίδες θέλω να αποθηκεύσω διάφορα πράγματα, σχετικά με τον προγραμματισμό κυρίως, για τα οποία πάντα ήθελα να κρατάω σημειώσεις και ποτέ δεν το έκανα. Δηλαδή τα post θα έχουν την μορφή how-to και πιθανόν και link στην πρωτότυπη πηγή. Ελπίζω να φανούν χρήσιμες οι συμβουλές και στους υπόλοιπους.