Δευτέρα, 29 Σεπτεμβρίου 2014

Bash Bug

Το Σεπτέμβριο του 2014 βρέθηκε ένα λάθος στο κέλυφος εντολών του Linux αλλά και του OS Χ (Mac), όπου μπορεί να εκτελεστεί κώδικας χωρίς την θέληση του χρήστη.

Το γιατί υπήρχε αυτό το "άγνωστο" λάθος τόσο καιρό είναι ένας προβληματισμός που δεν έχει βρει τη λύση του. Οπωσδήποτε ο κώδικας του BASH, του κελύφους δηλαδή επεξεργασίας εντολών, δεν είναι ένας κρυφός κώδικας. Υπάρχει όμως ένας κανόνας στο Linux και την γλώσσα C και κατ' επέκταση της C++ που λέει ότι ποτέ δεν γράφουμε για το ίδιο πράγμα νέο κώδικα. Έτσι όλα τα προγράμματα κτίζονται από κομμάτια που βρίσκονται σε μια βιβλιοθήκη έτοιμων λύσεων.

Η κοινή χρήση λύσεων στο Linux και στο OS X έχει ως αποτέλεσμα να περνάει τα τυχόν σφάλματα αυτών σε νέα σύνθετα προγράμματα.

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

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

Εδώ θέλω να θυμίσω ότι στα λειτουργικά της Microsoft υπήρχαν δυο δυνατότητας. Η χρήση κοινών ρουτινών αλλά και η χρήση ιδιωτικών. Στην πρώτη περίπτωση μάλιστα  μέσω του COM ενός προτύπου διαχείρισης αντικειμένων μπορούσε κανείς να διατηρεί κοινές ιδιωτικές ρουτίνες, δηλαδή κοινές για τις εφαρμογές εκείνες που έχουν το "δικαίωμα" να τις χρησιμοποιήσουν. Το δικαίωμα ή άδεια χρήση σε ένα εσωτερικό σημείο είχε έναν πολύ μεγάλο αριθμό ο οποίος ήταν αδύνατο να βρεθεί για να ξεκλειδώσει το αντικείμενο COM και να το χρησιμοποιήσει. Στο λειτουργικό Linux οι βιβλιοθήκες είναι κοινές, και ως αρχεία έχουν περιορισμούς ως προς το ποια ομάδα χρηστών μπορεί να τα χρησιμοποιήσει. Με απλά λόγια βλέπουμε τη διαφορά φιλοσοφίας. Στα μεν Windows...ο παραγωγός λογισμικού αγοράζει άδειες...ενώ στα Linux είναι όλα ελεύθερα και τακτοποιημένα ανά χρήστη.

Οπότε τώρα ήρθε η ώρα να κατανοήσουμε τι σημαίνει έκδοση λογισμικού. Στα μεν Windows με την φιλοσοφία "αγοράζεις λειτουργικότητα"...το σύστημα διατηρεί για τον ίδιο σκοπό διάφορες εκδόσεις ενός λογισμικού, ενώ στο Linux επειδή η φιλοσοφία είναι "διαθέτεις τη λειτουργικότητα που χρειάζεσαι επιλέγοντας ελεύθερο λογισμικό" απλά διατηρείς "φρέσκιες" τις βιβλιοθήκες και έχεις όλα τα προγράμματα αναβαθμισμένα. Στα linux δεν θα "επέμενε" ένα πρόγραμμα να χρησιμοποιήσει την παλιά ρουτίνα (βιβλιοθήκης) επειδή δεν είχε ανανεώσει την άδεια χρήσης ο παραγωγός αυτού του λογισμικού. Απαιτείται φυσικά απόλυτη συμβατότητα..και αυτή μπορεί να επιτευχθεί όταν το λογισμικό είναι ανοικτό, ο κώδικάς του.

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

Το Linux παραμένει πάντα ως το λειτουργικό χωρίς ιούς, και θα παραμένει επειδή στη φιλοσοφία του είναι ο αποκλεισμός εκτελέσιμων αρχείων από την ελεύθερη πρόσβαση στους φακέλους του υπολογιστή, ενώ διατηρείται η ελεύθερη χρήση ρουτινών..(ελεύθερα χρησιμοποιείς την βιβλιοθήκη αλλά δεν την αλλάζεις). Οι αλλαγές γίνονται από προγράμματα με προχωρημένα δικαιώματα. Ένας ιος δεν μπορεί να πάρει αυτά τα προχωρημένα δικαιώματα...χωρίς την συγκατάθεση του χρήστη (του υπερ-χρήστη στην ουσία του Administrator).

O Bash είναι η εφαρμογή που τρέχει εφαρμογές τόσο για τον χρήστη όσο και για τον υπερ-χρήστη, οπότε εκεί υπήρχε θέμα "προσβολής" του συστήματος, αν εκτελεστεί με δικαιώματα υπερ-χρήστη κάτι παρά τη θέλησή μας. Όμως θα έπρεπε πιο πριν να είχαμε κατεβάσει μια αναβάθμιση βιβλιοθήκης που εσωτερικά θα είχε προγραμματιστεί να "διαβάλλει" το σύστημα. Με το συνήθη τρόπο ενημέρωσης του συστήματος αυτό είναι αδύνατο να συμβεί. Οι άλλοι δύο τρόποι είναι: η ενημέρωση με εκτελέσιμο κώδικα και η ενημέρωση με πηγαίο κώδικα (που απαιτεί μεταγλώττιση σε εκτελέσιμο κώδικα). Ο πρώτος είναι ο επικίνδυνος, ενώ ο δεύτερος αν και φαινομενικά είναι ακίνδυνος, αποδείχθηκε όπως στον Bash ότι μπορούν να υπάρξουν "τρύπες"...που ενώ είναι εκεί...και ο κώδικας είναι ανοικτός...δεν είναι κατανοητές.

Το Bash Bug λοιπόν είναι ένα από τα λάθη που υπήρχαν για χρόνια και ήταν μη παρατηρήσιμα....Υπάρχουν άλλα; Ποιος ξέρεις...σίγουρα; Αν είναι σπάνιο να βρεθεί ένα τέτοιο σφάλμα, είναι περισσότερο σπάνιο αυτός που θα το βρει να θέλει να επωφεληθεί δημιουργώντας το χάος..





Τετάρτη, 24 Σεπτεμβρίου 2014

Νέα στοιχεία ελέγχου - για φόρμες της VB6



Μετά από αρκετή προσπάθεια κατάφερα να φτιάξω ένα στοιχείο ελέγχου που μπορεί να παίρνει διάφορες μορφές σε μια φόρμα.

Στην εικόνα παραπάνω είναι ένα στοιχείο ελέγχου σε διάφορες μορφές. Η πιο κοπιαστική μορφή είναι αυτή του επεξεργαστή κειμένου. Εδώ έχουμε έναν επεξεργαστή κειμένου χωρίς μίξη γραμματοσειρών και μεγεθών/τύπου χαρακτήρων, αν και μπορούμε να αλλάξουμε οποτεδήποτε αυτά για όλα μαζί. Αυτό που προσφέρει είναι ότι χρησιμοποιεί εμφάνιση UNICODE χαρακτήρων, αλλάζει την απόσταση γραμμών, αλλάζει όποτε θέλουμε την αναδίπλωση λέξεων, μπορούμε να αποκόψουμε ή αντιγράψουμε προς το πρόχειρο ή να επικολλήσουμε από το πρόχειρο, μπορούμε να μεταφέρουμε σε άλλο ίδιο ή ακόμα και στο Word το κείμενο με "σύρε και απέθεσε" ενέργεια (Drag & Drop). Υπάρχει μπάρα οριζόντιας ολίσθησης που εμφανίζεται όταν πάμε στην δεξιά πλευρά και όταν μετακινήσουμε τις γραμμές πάνω ή κάτω με ώθηση κρατώντας πατημένο το αριστερό πλήκτρο του ποντικού. Μπορεί να χειριστεί τεράστιο κείμενο και σε μια φόρμα που αλλάζει μέγεθος μπορεί να αλλάξει την αναδίπλωση λέξεων άμεσα χωρίς καθυστέρηση. Υποστηρίζει απλή αναίρεση (αν μεταφέρουμε τον κέρσορα και δεν έχουμε πατήσει κάποιο πλήκτρο τότε ισχύει η αναίρεση της προηγούμενης ενέργειας με ctrl z). Δεν μπορούμε να αναιρέσουμε την προσθήκη πάνω από μια παράγραφο (αυτό θέλει περισσότερο προγραμματισμό). Αντί αυτού μπορούμε να μαρκάρουμε το κείμενο που θέλουμε να αφαιρέσουμε και να το κάνουμε και άμεσα μπορούμε να το επαναφέρουμε...

Επιπλέον υπάρχουν στοιχεία ελέγχου όπως, το Check Me, ή ελληνικά το Επίλεξέ Με όπου η επιλογή ή η μη επιλογή εμφανίζεται ως κουκκίδα τετράγωνη. Στην επιλογή του στοιχείου έχουμε αλλαγή χρωματισμού, στην εικόνα φαίνεται πράσινο. Με το πλήκτρο "διάστημα" μπορούμε να εναλλάσσουμε την τιμή του (την εμφάνιση ή απόκρυψη της κουκκίδας), και κάθε αλλαγή δίνει ένα "γεγονός" στο πρόγραμμα για να "εξυπηρετηθεί". (event service routine, event programming). 

Υπάρχει επίσης το απλό μπουτόν επιλογής το οποίο όμως διαφέρει από τα συνηθισμένα στο ότι εκτός από διπλό κλικ για να ενεργοποιηθεί (και όχι ένα), μπορεί να ενεργοποιηθεί με ολίσθηση της λεζάντας δεξιά. Δηλαδή με το ποντίκι πετάμε τη λεζάντα δεξιά και αυτό σημαίνει "γεγονός επιλογής".

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

Επιπλέον στο παράδειγμα εδώ εμφανίζεται ένα στοιχείο αναφοράς (το οποίο κρύβει και μια διαμόρφωση εισαγωγής στοιχείων), και βρίσκεται πάνω αριστερά, καθώς και μια λίστα με τιμές που έχουν επίσης την ιδιότητα να επιλέγεται η δράση τους (εδώ να γραφτεί ο αριθμός στο στοιχείο εμφάνισης αριθμού) με ολίσθηση δεξιά (pan right)

Τέλος υπάρχει ένας συνδυασμός δυο στοιχείων ελέγχου που δίνει το Combobox, όπου μπορούμε να γράψουμε με αυτόματη συμπλήρωση από μια λίστα τιμών (εδώ  λέξεων πόλεων/μερών). Με τα άνω και κάτω βελάκια ανοίγουμε την λίστα, όπως και με πάτημα και τράβηγμα του πρώτου στοιχείου ελέγχου. Μπορούμε να επιλέξουμε από τη λίστα με Enter ή αν θέλουμε να τροποποιήσουμε την επιλογή στο κύριο στοιχείο χωρίς να κλείσουμε την λίστα. Η λίστα φεύγει αν πατήσουμε TAB για να κινηθούμε στο επόμενο στοιχείο ή SHIFT TAB στο προηγούμενο, ή απλά αν επιλέξουμε άλλο στοιχείο (ακόμα και με επιλογή από το ποντίκι του πρώτου στοιχείου πάλι κλείνει η λίστα, ουσιαστικά δεν κλείνει αν πληκτρολογούμε κάτι στο πρώτο στοιχείο ενώ είναι ανοικτή, με τα βελάκια άνω και κάτω πάμε στη λίστα και με τα δεξιά και αριστερά στην διόρθωση της επιλογής)

Η βάση όλων αυτών των μορφών είναι ένα και μόνο στοιχείο ελέγχου το glist4 το οποίο έχει χρησιμοποιηθεί (σε πιο απλή μορφή) στον Επιλογέα Αρχείων. Με απλά λόγια το glist4 έχει μια επιφάνεια όπου ζωγραφίζει..και τρία τετράπλευρα (shapes) που χρησιμοποιεί για μπάρα ολίσθησης. Μάλιστα στην περίπτωση της μορφής του επεξεργαστή κειμένου, παρέχει σε ανώτερο επίπεδο το τετράπλευρο όπου θα εμφανιστεί μια γραμμή κειμένου χωρίς να περιέχει ούτε ένα γράμμα...στην εσωτερική του λίστα. Το κείμενο παραμένει σε ένα αντικείμενο όπου "διαμένουν" οι παράγραφοι τεμαχισμένες σε γραμμές. 

Τα παραπάνω καλούδια είναι γραμμένα με VB6, και το πρόγραμμα επίδειξης τρέχει σε XP, 7, Linoux με WINE. Ο κώδικας είναι ανοικτός και βρίσκεται εδώ:
http://www.vbforums.com/showthread.php?776741-Nice-Textboxes-version2