Στο προηγούμενο άρθρο είδαμε μια γενική περιγραφή της κατάστασης που επικρατεί στο χώρο της πληροφορικής από τα μάτια ενός προγραμματιστή, μηχανικού λογισμικού, software Architect, ή όπως θέλετε πείτε τον. Η ουσία είναι η ίδια,,, περίπου!
Θα συνεχίσουμε εδώ περιγράφοντας το τρόπο σκέψης, το λεγόμενο «κατακερματισμό» της σκέψης σε απλά, διαδοχικά βήματα έτσι ώστε η περιγραφή των κινήσεων να αποδώσει μια ακολουθία ικανή ώστε να περιγράψει μια ενέργεια. Η πληθώρα τους ακολουθεί το μοντέλο «διαίρει και βασίλευε». Τί σημαίνει αυτό? Ότι, απλούστατα, σπάζοντας ένα πρόβλημα σε πολλά μικρά προβληματάκια, και επιλύοντας τα ένα προς ένα, καταλήγεις, αναπόφευκτα, στην επίλυση του συνολικότερου προβλήματος. Και φυσικά εξηγούμαι:
Ας πάρουμε σαν παράδειγμα κάτι απλό: Την ανάγνωση, άθροιση και εμφάνιση του αποτελέσματος στην οθόνη, 5 αριθμών που βρίσκονται σε καθε γραμμή, από ένα αρχείο κειμένου!! Ας δούμε λοιπόν τα δεδομένα:
• Κατ’αρχήν ξέρουμε οτι είναι ένα αρχείο κειμένου και οτι θα το διαβάσουμε.
• Ότι διαβάζουμε ακριβώς 5 αριθμούς και τους αθροίζουμε.
• Ότι κάθε αριθμός βρίσκεται σε ξεχωριστή γραμμή μέσα στο αρχείο.
Ωραία μέχρι εδώ ... Ώρα όμως για μερικές αποφάσεις: Τί είδους γλώσσα να χρησιμοποιήσουμε? Τί μας προσφέρει η μία που δε μας προσφέρει η άλλη? Στη προκειμένη περίπτωση είναι απειροελάχιστες οι διαφορές. Τίποτα ουσιαστικό δεν διαφοροποιεί τη κατάσταση. Γι’αυτό θα χρησιμοποιήσω μια γλώσσα που ξεκίνησε αμειγώς ως μαθηματική και επεκτάθηκε ως ένα πανίσχυρο εργαλείο στη φαρέτρα του προγραμματιστή. Τη Delphi!
Ας υποθέσουμε λοιπόν οτι το αρχείο που πρέπει να διαβάσουμε λέγεται InputFile.txt και περιέχει τους εξής 5 αριθμούς:
12345
21211
11000
21980
31978
Ορίζουμε με βάση τα παραπάνω οτι χρειαζόμαστε 5 διαδικασιούλες για να σπάσουμε το πρόβλημα σε μικρότερα προβληματάκια. (οι 5 διαδικασίες δεν έχουν καμία σχέση με τα 5 νούμερα που επιλέξαμε να περιέχονται στο αρχείο που θα διαβάσουμε). Η διαδικασίες λοιπόν έχουν ως εξής:
1. Θέλουμε μια διαδικασία για να ανοίξουμε το αρχείο
2. Μια διαδικασία που διαβάζει γραμμές από το αρχείο.
3. Μια διαδικασία που αθροίζει το διαβασμένο νούμερο από το αρχείο.
4. Μία διαδικασία που να δείχνει το αποτέλεσμα.
5. και τέλος μια διαδικασία που κλείνει το αρχείο.
Αυτές ορίζονται παρακάτω ως εξής:
Procedure _OpenFile;
Ανοίγει το αρχείο που ορίσαμε οτι ονομάζεται «InputFile.txt»
function ReadLine( LineNumber: Integer ): String;
Διαβάζει μια συγκεκριμένη γραμμή του αρχείου που ορίζεται στη παράμετρο LineNumber και την επιστρέφει.
function SumVal ( aCurrentValue: Integer; aLineNumber: Integer ): Integer;
Αθροίζει τη τιμή που περιέχεται στην aCurrentValue με την τιμή που περιέχεται στη γραμμή του αρχείου aLineNumber και επιστρέφει το άθροισμα.
procedure ShowResult ( aResult : Integer );
Δείχνει το αποτέλεσμα που περιέχεται στην παράμετρο aResult στην οθόνη.
Procedure _CloseFile;
Κλείνει το αρχείο InputFile.txt
Ο πλήρης κώδικας του προγράμματος παρεθέτεται παρακάτω. Λειτουργεί κανονικά! Με βάση τα όσα είπαμε το αποτέλεσμα του προγράμματος είναι αυτό:
"File Summary Result : 98514"
Θα προσπαθήσω να σχολιάσω το κώδικα που σας δίνω παρακάτω όσο καλύτερα μπορώ ώστε να καταλάβετε τι γίνεται. Τα σχόλια βρίσκονται στο τέλος κάθε γραμμής και ξεκινάνε με «//».
program Programming; // Όνομα προγράμματος
{$APPTYPE CONSOLE}
uses Windows, System, SysUtils, Classes; // Βιβλιοθήκες συστήματος που χρειαζόμαστε
Type
TFileReadAndSum = Class(TComponent) // Δήλωση αντικειμένου
private
LocalFile : TextFile; // Χειριστής αρχείου κειμένου
public
Constructor Create(aOwner: TComponent); override; // Δημιουργία Αντικειμένου
Destructor Destroy; override; // Καταστροφέας Αντικειμένου
Procedure _OpenFile; // Διαδικασία ανοίγματος αρχείου
function ReadLine( LineNumber: Integer ): String; // Διαδικασία ανάγνωσης γραμμής
function SumVal ( aCurrentValue: Integer; aLineNumber: Integer ): Integer; // Αθροιστής
procedure ShowResult ( aResult : Integer ); // Παρουσίαση αποτελέσματος στην οθόνη
Procedure _CloseFile; // Κλείσιμο αρχείου
End;
Το κομμάτι που μόλις γράψαμε αποτελεί τη «δήλωση» των διαδικασιών που θα χρησιμοποιήσουμε. Δηλαδή την ταυτότητα των υπορουτίνων του προγράμματος. Υπορουτίνα ορίζουμε μια εσωτερική, αυτόνομη διαδικασία που εκτελεί συγκεκριμένες λειτουργίας και επιστρέφει συγκεκριμένα αποτελέσματα, ανάλογα προς τις τιμές των παραμέτρων που εισάγονται σε αυτή. Έτσι, για παράδειγμα η υπορουτίνα SumVal δέχεται 2 παραμέτρους: την aCurrentValue που πρέπει να είναι αριθμητική και την aLineNumber που επίσης πρέπει να είναι αριθμητική. Επίσης επιστρέφει μια επίσης αριθμητική τιμή. Ωραία όλα αυτά αλλά δεν έχουμε τελειώσει.. ίσα ίσα μόλις ξεκινήσαμε. Πρέπει να γράψουμε λοιπόν τι θα κάνει κάθε μια από αυτές τις υπορουτίνες. Οπότε προχωράμε στην υλοποίηση (το γράψιμο δηλαδή) του κώδικα που τις απαρτίζουν:
{ TFileReadAndSum }
// Δημιουργούμε ένα στιγμιότυπο/αντίγραφο του αντικειμένου TFileReadAndSum:
constructor TFileReadAndSum.Create(aOwner: TComponent);
begin
inherited Create(AOwner);
end;
// Καταστρέφουμε ένα στιγμιότυπο/αντίγραφο του αντικειμένου TFileReadAndSum:
destructor TFileReadAndSum.Destroy;
begin
inherited Destroy;
end;
// Κλείνουμε το αρχείο, κλείνοντας το χειριστή του αρχείου InputFile.txt που ορίσαμε ως LocalFile.
procedure TFileReadAndSum._CloseFile;
begin
CloseFile(LocalFile);
end;
// Ανοίγουμε το αρχείο, ανοίγοντας το χειριστή του αρχείου InputFile.txt που ορίσαμε ως LocalFile.
procedure TFileReadAndSum._OpenFile;
begin
AssignFile( LocalFile, 'InputFile.txt');
Reset(LocalFile);
end;
// Διάβασμα μιας γραμμή από το αρχείο που ο αριθμός της ( 1 – 5) ορίζεται από την παράμετρο LineNumber
function TFileReadAndSum.ReadLine(LineNumber: Integer): String;
var
Counter: Integer; // Δήλωση μεταβλητής μέτρησης
begin
if LineNumber <= 5 then // Αν η γραμμή που περιμένουμε >5 έχουμε πρόβλημα!
begin
Reset(LocalFile); // Ξεκινάμε από την αρχή του αρχείου ...
For Counter := 1 to 5 do // ... και για κάθε γραμμή από 1 έως την 5 ...
begin
ReadLn(LocalFile, Result); // ... διαβάζουμε τη γραμμή ...
if Counter = LineNumber then Exit; // ... και αν ο μετρητής 1 έως 5 είναι = με τη γραμμή που
end; // περιμένουμε τότε επιστρέφουμε τη τιμή και φεύγουμε.
end
else
Result := ''; // Αν LineNumber >5 τότε δεν επιστρέφουμε τίποτα.
end;
// Εμφάνιση στην οθόνη του αποτελέσματος που περιέχεται στην παράμετρο aResult
procedure TFileReadAndSum.ShowResult(aResult: Integer);
begin
Writeln( 'File Summary Result : ' + IntToStr(aResult) );
end;
// Πρόσθεση της παρούσας τιμής του αθροιστή aCrrentValue με το περιεχόμενο της γραμμής στην
// παράμετρο aLineNumber.
function TFileReadAndSum.SumVal(aCurrentValue: Integer; aLineNumber: Integer): Integer;
begin
Result := aCurrentValue + StrToInt(ReadLine(aLineNumber));
end;
// Όσο κι αν σας φανεί περίεργο,, το ουσιαστικό πρόγραμμά μας είναι αυτό που ακολουθεί! Αυτά που
// γράψαμε πριν έχουν νόημα μόνο αν συνδεθούν μεταξύ τους. Έτσι φροντίζουμε εδω να κάνουμε αυτούς
// τους συσχετισμούς ώστε η λογική μας να πάρει σάρκα και οστά ....
var // ΤΜΗΜΑ ΔΗΛΩΣΗΣ ΜΕΤΑΒΛΗΤΩΝ
LineIndex : Integer; // Δείκτης αριθμού γραμμής
Total : Integer; // Κράτηση συνόλου αθροίσματος
ReadAndSumObject: TFileReadAndSum; // Μεταβλητή αντιγράφου αντικειμένου
begin
ReadAndSumObject := TFileReadAndSum.Create(nil); // Δημιουργία αντιγράφου αντικειμένου
ReadAndSumObject._OpenFile; // Ανοίγουμε το αρχείο ...
Total := 0; // Μηδενίζουμε τον αθροιστή.
For LineIndex := 1 to 5 do // Για κάθε γραμμή από 1-5 του αρχείου
Total := ReadAndSumObject.SumVal(Total, LineIndex); // αθροίζουμε αντίστοιχα όπως ορίσαμε...
ReadAndSumObject.ShowResult( Total ); // Εμφάνιση του συνόλου στην οθόνη.
ReadAndSumObject._CloseFile; // Κλείσιμο αρχείου InputFile.txt
FreeAndNil(ReadAndSumObject); // Διαγραφή αντιγράφου αντικειμένου
Readln; // αναμονή για Enter
end. // Τερματισμός προγράμματος!!
Ωωωωωραίαααα!! Υπάρχει βέβαια ένα μικρό ζήτημα εδώ: Υποθέτουμε πως όλα θα πάνε ρολόι και οτι δεν θα υπάρχουν λάθη μέσα στο αρχείο. Πχ αντί για 12345 να διαβάσουμε κανένα 123ΨΔ. Όπως είναι αντιληπτό,, δεν υπάρχει φυσικά και περίπτωση να αθροιστεί αυτή η τιμή σαν αριθμός. Κάτι που θα καταλήξει σε σφάλμα. Γι’αυτό το λόγο υπάρχει και μια αντίστοιχη διαδικασία «διαχείρισης σφαλμάτων». Μια μικρή αλλαγή που μπορούμε να κάνουμε είναι να «προστατέψουμε» το ουσιαστικό προγραμμά μας κάπως έτσι:
Begin
Try
ReadAndSumObject := TFileReadAndSum.Create(nil);
ReadAndSumObject._OpenFile;
Total := 0;
For LineIndex := 1 to 5 do
Total := ReadAndSumObject.SumVal(Total, LineIndex);
ReadAndSumObject.ShowResult( Total );
ReadAndSumObject._CloseFile;
FreeAndNil(ReadAndSumObject);
Except
On Ex: Exception do
WriteLn(‘Πρόβλημα κατά την ανάγνωση/υπολογισμό με μήνυμα: ‘ + Ex.Message);
End;
Readln;
end.
Βάλαμε δηλαδή όλο το πρόγραμμα μέσα σε ένα block try…except…end όπου το λάθος διοχετεύεται κάτω από το Except. Το Except ερχεται από τη λέξη Exception που σημαίνει «εξαίρεση». Το σφάλμα δηλαδή διοχετεύεται στην απόληξη Except για περεταίρω επεξεργασία. Εμείς, με τη σειρά μας, το επεξεργαζόμαστε δίχνοντάς το στην οθόνη.
Πλέον όλα είναι στη θέση τους. Ο κώδικας γράφτηκε, το πρόγραμμα τρέχει αλλά εσείς?! Πως μπορείτε να το δείτε να τρέχει? Φυσικά όπως αντιλαμβάνεστε υπο κανονικές συνθήκες θα έπρεπε να προμηθευτείτε τη γλώσσα προγραμματισμού με κάποιο ... νόμιμο τρόπο φυσικά!! Παρόλα ταύτα οι εταιρείες έχουν και ελεύθερες εκδόσεις που δίνουν στον κόσμο δωρεαν. Οπότε μπορείτε να εγκαταστήσετε την Turbo Delphi από την Embarcadero σε αυτό το site https://downloads.embarcadero.com/free/turbodelphi . Το μέγεθος είναι 325.1 ΜΒ οπότε μπορεί να σας πάρει λίγη ώρα μέχρι να κατέβει. Εγκαταστήστε το, δημιουργείστε ένα καινούριο Console Application Project και αντιγράψτε το κώδικα του άρθρου. Πατήστε Ctrl+F9 για μεταγλώτιση και έλεγχο σφαλμάτων και F9 για να τρέξει. Αυτό είναι και το πρώτο σας ολοκληρωμένο και χρήσιμο πρόγραμμα! Προσπαθήστε να κάνετε αλλαγές ορίζοντας περισσότερες γραμμές για άθροιση στο αρχείο κλπ. Μεταγλωστίστε πάλι τρέξτε το και δείτε τις διαφοροποιήσεις.
Δευτέρα 18 Μαΐου 2009
Παρασκευή 15 Μαΐου 2009
Προγράμματα & Ανάπτυξη
Τώρα τελευταία, όλο και συχνότερα αντιμετωπίζω την απορεία ανθρώπων για το τί είναι πληροφορική? Τί είναι ο προγραμματιστής? Τί γράφει? Γιατί το γράφει τί σημαίνει πρόγραμμα και τα λοιπά ...
Σκέφτηκα λοιπόν, να δώσω μια μικρή ακτίδα φωτός μέσα στο χάος των προγραμμάτων, της λογικής του προγραμματισμού, της τέχνης του σχεδιασμού και στις δυνατότητες της πληροφορικής, μέσα από ένα άρθρο που μπορεί να είναι λίγο εκτενές αλλά πιστέψτε με,, στο τέλος η εικόνα θα είναι αρκετά πιο ελκυστική :-)
Τί είναι ο υπολογιστής? Μια συσκευή. Λίγο διαφορετική από το πλυντήριο στο σπίτι σας, αλλά με την ίδια σύνθεση περίπου. Δυστυχώς δεν έχει κάδο βέβαια αλλά έχει κυκλώματα και περιφερειακά τσιπάκια και τέτοιες ιστορίες όπως και το πλυντήριο. Λίγο αποτυχία ο συσχετισμός, αλλά, σοβαρά τώρα, σαν μηχανημα δεν έχει και πολλές δυνατότητες. Τουλάχιστον το πλυντήριο πλένει τα ρούχα μας. Σκοπός του είναι η διαχείριση της πληροφορίας, η αποθήκευση της και ο συνδυασμός της με άλλες ήδη υπάρχουσες πληροφορίες. Πως το κάνει αυτό?
Η όλη λειτουργία του βασίζεται στην ανάλυση ηλεκτρικών σημάτων στα επιμέρους κυκλώματα του. Δεν θα εμβαθύνω περισσότερο μιας και δεν μας ενδιαφέρει τόσο. Αυτό που μας ενδιαφέρει είναι οτι ο υπολογιστής μας απαρτίζεται από διάφορα κομμάτια που στο σύνολό τους προβάλλουν ένα αποτέλεσμα και το καθένα ξεχωριστά είναι υπεύθυνο για μια η περισσότερες εργασίες. Πχ η οθόνη είναι υπεύθυνη για την προβολή και την αλληλεπίδραση με το χρήστη. Ο σκληρός δίσκος για την αποθήκευση πληροφοριών, η μνήμη για τη προσωρινή κράτηση πληροφοριών και αποτελεσμάτων, το πληκτρολόγιο και το ποντίκι για την εισαγωγή και την κατάδειξη πληροφοριων κοκ.
Η καρδιά του υπολογιστή σας είναι ο επεξεργαστής (CPU = Central Processing Unit η ΚΜΕ = Κεντρική Μονάδα Επεξεργασίας). Η CPU είναι υπεύθυνη για την διαχείριση και επεξεργασία όλων των πληροφοριών του σύστήματος. Τα πάντα περνάνε απο εκείνη (εκτός από συγκεκριμένες προϋποθέσεις που δεν μας ενδιαφέρουν αυτή τη στιγμή). Πως είναι οι πληροφορίες αυτές?
10010101010101111000000111010111. Είναι ένας αριθμός. Ουσιαστικά είναι η μοναδική μορφή πληροφοριών που μπορεί να καταλάβει ο υπολογιστής σας. Στη πραγματικότητα είναι ο αριθμός 2.505.540.055 στο δεκαδικό σύστημα αριθμησης που ξέρουμε να μετράμε όλοι. Φυσικά δεν είναι το μοναδικό σύστημα αρίθμησης που υπάρχει. Συγκεκριμένα ο αριθμός 10010101010101111000000111010111 είναι το 2.505.540.055 στο δυαδικό σύστημα (βάση αριθμησης το 2) και το 955781D7 στο δεκαεξαδικό (βάση αρίθμησης το 16). Εύλογα θα ρωτήσει κανείς... Γιατί τόσες μορφές αρίθμησης? Σε τι ωφελούν όλα αυτά? Η απάντηση είναι πολύ απλή: Χώρος!! Ας πάρουμε ένα παράδειγμα: Κάθε αριθμός - γράμμα - σύμβολο εχει μήκος 1 byte (συνήθως, γιατί μπορεί να έχει και 2 ανάλογα κάποιες προϋποθέσεις. Εμείς υποθέτουμε οτι οι χαρακτήρες που εξετάζουμε έχουν μήκος 1 byte). Αυτό σημαίνει 1 byte = 8 bits. Το bit είναι η μικρότερη μονάδα πληροφορίας που μπορεί να οριστεί, να διαχειριστεί και να αποθηκευτεί από τον υπολογιστή σας. Δηλαδή το byte 255 (αριθμητικά) είναι 11111111 στο δυαδικό άρα FF στο δεκαεξαδικό. (απο δω και στο εξής: Δεκαεξαδικό = Hex, Δυαδικό = bin, Δεκαδικό = dec). Βάζοντάς τα κάτω έχουμε:
Dec Bin Hex
255 11111111 FF
Τί πιάνει περισσότερο χώρο και τί λιγότερο? To Hex, όπως βλέπουμε ... ;-) Ουσιαστικά αυτή είναι και η σκοπιμότητά του. Η αριθμητική σύμπτηξη. Λιγότερο μέγεθος, λιγότερη χρησιμοποιούμενη μνήμη.
Μνήμη,, τι εννοούμε μνήμη? Κατ'αρχήν ας πάρουμε τους εαυτούς μας. Όλοι μας έχουμε εμπειρίες που θυμόμαστε, παιδικά χρόνια, καλές στιγμές, κακές στιγμές. Πράγματα που θυμόμαστε πάντα και πράγματα που ξεχνάμε. Μιλάμε δηλαδή για το διαχωρισμό της ανθρώπινης μνήμης σε συνειδητό - ασυνείδητο. Έτσι και οι υπολογιστές χρησιμοποιούν μια λιγο διαφορετική μορφή αρχιτεκτονικής που ορίζουν τις ικανότητες να θυμάται και να αποθηκεύει. Βραχυπρόθεσμα και μακροπρόθεσμα. Ο διαχωρισμός τους είναι ως εξής:
ROM : Read Only Memory : Μνήμη μόνο για ανάγνωση. Περιέχει βοηθητικά προγράμματα ελέγχου των συσκευών του συστήματος, δίσκους, δισκέττες, CD-ROM, DVD κλπ. Συνήθως αρκετά μικρή μνήμη σε μέγεθος.
RAM : Random Access Memory: Μνήμη τυχαίας προσπέλασης. Αυτή θεωρείται ως η κύρια μνήμη οπου χρησιμοποιείται από τα προγράμματα του συστήματός σας για προσωρινή αποθήκευση δεδομένων. Μετά το πέρας της λειτουργίας του προγράμματος η μνήμη απελευθερώνεται για να αποδοθεί σε κάποιο άλλο πρόγραμμα.
Πως "παίζουμε" τώρα με όλα αυτά? Πως καθορίζουμε τη λογική των προγραμμάτων μας? Με ένα περιβάλλον ανάπτυξης (ένα άλλο πρόγραμμα δηλαδή) που σκοπό έχει να φτιάχνει προγράμματα μέσω συμβολικής "γλώσσας προγραμματισμού". Υπάρχουν πολλές στο εμπόριο, από μεγάλες εταιρείες. Άλλες τζαμπέ άλλες επί πληρωμή ... Πολύ γνωστές είναι η Microsoft Visual Basic .NET, C#, C++, Delphi, Cobol, Clipper, Java και άλλες πολλές μικρότερες και μεγαλύτερες από αυτές. Η επιλογή είναι θέμα του καθενός μας. Του τί θέλει να κάνει, πως να το κάνει, τα πλεονεκτήματα και τα μειονεκτήματα της κάθε γλώσσας κλπ. Υπάρχουν Projects που είναι φτιαγμένα και σε περισσότερες από μια γλώσσες συνδυαστικά. Κοινώς? Τα πάντα μπορούν να γίνουν με οποιοδήποτε τρόπο. Αρκεί να έχουμε φαντασία - όραμα - υπομονή - επιμονή και όρεξη για γράψιμο!!
Πως φαίνεται ένα πρόγραμμα? Ένα μέρος ενός προγράμματος φαίνεται παρακάτω:
procedure TfrmMain.btTestClick(Sender: TObject);
var
LocalArray : TByteDynArray;
Counter : Integer;
Res : AnsiString;
begin
SetLength(LocalArray, 1);
For Counter := $0 to $FF do
begin
LocalArray[Counter-1] := Counter;
SetLength(LocalArray, Length(LocalArray)+1);
end;
SetLength(LocalArray, Length(LocalArray)-1);
Res := '';
For Counter := $0 to $FF do Res := Res + AnsiChar(LocalArray[Counter]);
mmLog.Lines.Add( Res );
end;
Το τί κάνει αυτό το πραμα? Λίγη σημασία έχει ... Αυτό που έχει σημασία είναι οτι καταλαβαίνουμε τις λέξεις και μπορούμε να διαχωρίσουμε τη σύνταξη. Πχ. For <Μεταβλητή> := to do begin .... end; Η πρόταση αυτή είναι μια συγκεκριμένη σύνταξη που αναμένεται από το περιβάλλον ανάπτυξης. Ειδάλλως είναι λάθος, άρα δε τρέχει το πρόγραμμα! Αυτή η σύνταξη προέρχεται από τη γλώσσα Delphi. Ας δούμε μια άλλη γλώσσα, πχ C++:
int __Execute( const TStrings * Params, const TStrings * Vars,
const TStrings * TempVars, AnsiString * Response)
{
AnsiString datetime;
try
{
Query->SQL->Clear();
Query->SQL->Add("select getdate() 'datetime'");
Query->Open();
if(Query->Eof)
return 2;
datetime = Query->FieldByName("datetime")->AsString;
if(Params->Values["Append_Date"] == "Y")
Response->printf("%s, %s", Params->Values["Data"], datetime);
else
Response->printf("%s", Params->Values["Data"]);
}
__finally
{ Query->Close();
}
return 0;
}
Συγκεκριμένα προέρχεται από μια έκδοση της C++ που λέγεται Borland C++. Θα μπορούσα να συνεχίσω να παραθέτω τμήματα κώδικα από δεκάδες γλώσσες προγραμματισμού που υπάρχουν στο κόσμο της πληροφορικής. Το θεωρώ ανούσιο. Το να μάθει κανείς μια γλώσσα είναι το εύκολο της υπόθεσης. Το δύσκολο είναι να μπορέσει κανείς να απλουστεύσει το τρόπο σκέψης του τόσο ώστε να περιγράψει σε απλά βήματα τη λογική του τι θέλουμε ένα πρόγραμμα να κάνει περιγράφοντάς τη σκέψη μας κάνοντας χρήση της σύνταξης και των εντολών των γλωσσών προγραμματισμού.
Για να φτάσουμε όμως μέχρι εδώ, δηλαδή, την αποτύπωση της λογικής με απτές φράσεις και εντολές κατανοητές από τον άνθρωπο περάσαμε από τρικυμίες και μποφόρια, καινοτομίες και αποτυχίες. Οι υπολογιστές εξελίχθηκαν τεχνολογικά αλλά παρέμειναν τόσο ηλίθιοι όσο στα πρώτα χρόνια τους. Και εξηγούμαι: Δε καταλαβαίνουν τίποτα παραπάνω από τερααάστιες ακολουθίες από 0 και 1. Δηλαδή μεταφράσεις ψηφιακών σημάτων (όροι & κοιλάδες) σε 0 για κοιλάδες και 1 για όρη. (Τετραγωνισμένη μορφή της ημιτονοειδούς καμπύλης).Με αυτά ορίζονται τα κλεισίματα και τα ανοίγματα "διακοπτών" ωστε το 'α' να οριστεί σαν άλφα. Επειδή πλέον όλα γίνονται μέσω τρανζίστορς το άνοιγμα και το κλείσιμο των διακοπτών διαφέρει λιγάκι σε μορφή. Εσείς έχετε στο μυαλό σας οτι 1 = άνοιγμα διακόπτη, 0 = το κλείσιμό του.
Η βάση των πάντων? Μια γλώσσα που θεωρείται ως γλώσσα άμεσα κατανοητή από τον υπολογιστή,, η Assembly. Τα τσιπ των υπολογιστών, ο "επεξεργαστής" ως λεγόμενος, διαθέτει μια σειρά από εσωτερικές εντολές. Αυτές προδιαθέτουν και τις "χαμηλού επιπέδου" εντολές. Πως ορίζεται η Assembly? Δείτε,, κι αμα καταλάβετε σφυρίχτε μου κλέφτικα!!
.MODEL SMALL
.STACK 100h
.DATA
HelloWorldStr DB "Hello World$", 0Dh, 0Ah
.CODE
pusha ;Αποθήκευση καταχωρητών κατά την είσοδο (AX,BX,CX,DX,SI,BP)
mov dx, offset HelloWorldStr ;Φόρτωση μηνύματος
mov ah, 09h ;Εξυπηρέτηση 09h για εμφάνιση μηνύματος στην οθόνη
Int 21h ;Εμφάνιση
popa ;Επαναφορά καταχωρητών πριν την έξοδο
mov ah, 4Ch ;Εξυπηρέτηση 4Ch για έξοδο από το πρόγραμμα
Int 21h ;Εκτέλεση εξόδου
Καλούλιιι??! Αναμφισβήτητα! Το θέμα είναι οτι αν μέχρι σήμερα,, γράφαμε έτσι θα βρισκόμασταν ακόμα στο 1985,, τεχνολογικά πάντα. Άσε που κώδικα θα έγραφαν το 1/100 των ήδη υπάρχοντων προγραμματιστών στο πλανήτη. Χάλια ... Στη προκειμένη περίπτωση το συγκεκριμένο προγραμματάκι εμφανίζει στην οθόνη απλώς ένα μήνυμα: "Hello World".
Για να γίνει κανείς προγραμματιστής,,, δε χρειάζεται πολλά πράγματα. Διάβασμα, ενασχόληση, μεράκι και σκληρή δουλειά. Ότι δηλαδή θα χρειαζόταν σε οτιδήποτε άλλο με το οποίο θα θέλαμε να καταπιαστούμε. Το κακό είναι οτι η τεχνολογία προχωράει,, και μαζί πρέπει να προχωράμε και όλοι εμείς που δραστηριοποιούμαστε σε αυτό το τομέα. Κατα τα άλλα,, τα Bachelors, Masters και λοιπά κωλό-χαρτα δεν κάνουν το προγραμματιστή. Αλλά η σκληρή δουλειά και η αγάπη για το αντικείμενο. Στα χρόνια που έχω μέσα σε αυτό το αντικείμενο, είδα καλούς επαγγελματίες χωρίς ουτε κάν χαρτί πανεπιστημιακού επιπέδου, (ΙΙΕΚ δηλαδή), να βάζουν κάτω Πολυτεχνειάδες με πουλάδες και αστέρια που φυσικά κώδικα γράψανε μόνο στη σχολή και την είδανε Bill Gates μέσα σε μια νύχτα αφού πήραν το πτυχίο τους. Όπως φυσικά και πραγματικούς επαγγελματίες και επιστήμονες να ξαναεφεύρουν το τροχό επειδή και μόνο ο τροχός που υπήρχε στο εμπόριο δεν τους άρεσε! Με ένα laptop και λίγο καφέ, δηλαδή, να φτιάχνουν τεχνολογικά διαμάντια!!
Πως αποθηκεύονται οι πληροφορίες? Σε αρχεία, καταλόγους, μέσα σε άλλους καταλόγους και πάει λέγοντας!! Η έννοια της πληροφορίες μέσα στα αρχεία διαχωρίζεται σε κείμενο (text) και δυαδικά δεδομένα (binary data). Τα αρχεία κειμένου συνήθως περιέχουν δεδομένα που μπορούν να διαβαστούν από τον άνθρωπο άμεσα. Τα δυαδικά αρχεία περιέχουν, συνήθως, μεγάλες σειρές από περίεργα σύμβολα, που φυσικά νόημα δε βγαίνει με τίποτα!! Κι όμως!! ;-)
Ας πάρουμε 2 περιπτώσεις. Ας υποθέσουμε οτι θέλουμε να φτιάξουμε ένα πρόγραμμα που να διαβάζει ένα αρχείο κειμένου που ονομάζεται TestImport.txt και να το εμφανίζει στην οθόνη. Κάθε γραμμή περιέχει συγκεκριμένα στοιχειά: Πχ
000001$ΘΕΟΔΩΡΟΣ ΚΟΛΟΚΟΤΡΩΝΗΣ$210 9999999$ΤΡΟΠΟΛΙΤΣΑΣ 44-100$ΚΑΤΩΧΩΡΙ
Διακρίνουμε 5 πεδία με διάφορες πληροφορίες που διαχωρίζονται με το χαρακτήρα '$'. Πάμε να το σπάσουμε και να εμφανίσουμε τα δεδομένα σε μια οθόνη:
Procedure ReadLine();
var
InputFile : TextFile;
Line : String;
Broker : TStringList;
Counter : Integer;
begin
Assign(InputFile, 'c:\TestImport.txt'); //Προετοιμασία δείκτη αρχείου
Reset(InputFile); //Ανοιγμα αρχείου
Broker := TStringList.Create; //Δημιουργία λίστα σπασίματος πεδίων '$'
While Not Eof(InputFile) do //Για κάθε γραμμή μέχρι τέλος του αρχείου
begin
ReadLn(Line, InputFile); //Διάβασμα γραμμής αρχείου
Broker.Text := AnsiReplaceStr(Line, '$', #10); //Σπάσιμο πεδίων
For Counter := 0 to Broker.Count -1 do //Εμφάνιση στην οθόνη όλων των πεδίων
WriteLn(Broker[Counter]);
end;
CloseFile(InputFile); //Κλείσιμο αρχείου
End; //Τελος διαδικασίας
Το αποτέλεσμα φαίνεται παρακάτω όπως θα φαίνεται στην οθόνη:
000001
ΘΕΟΔΩΡΟΣ ΚΟΛΟΚΟΤΡΩΝΗΣ
210 9999999
ΤΡΟΠΟΛΙΤΣΑΣ 44-100
ΚΑΤΩΧΩΡΙ
Αυτού του τύπου τα αρχεία λέγονται CSV (Comma Separated Values). Οι τιμές δηλαδή χωρίζονται με comma ή κάποιον αντίστοιχο χαρακτήρα που έχει το ρόλο του νοητού διαχωρισμού των τιμών κάθε γραμμής του αρχείου. Υπάρχουν και τα λεγόμενα Fixed Width όπου το μέγεθος είναι δεδομένο για κάθε πεδίο και σταθερό ότι και να γίνει. Το αρχείο θα γινόταν ως εξής:
000001ΘΕΟΔΩΡΟΣ ΚΟΛΟΚΟΤΡΩΝΗΣ210 9999999ΤΡΟΠΟΛΙΤΣΑΣ 44-100ΚΑΤΩΧΩΡΙ
Για να το διαβάσουμε θα μας έδιναν προδιαγραφές ανάγνωσης. Δηλαδή ποιό πεδίο ξεκινά από ποιά θέση και για τι μέγεθος. πχ:
Πεδίο εκκίνηση μήκος
-----------------------------------------------------
Κωδικός 1 6
Ονοματεπώνυμο 7 21
Τηλέφωνο 22 11
Διεύθυνση 39 18
Περιοχή/Πόλη 57 8
Τροποποιώντας τον κώδικα λίγο παραπάνω, θα λάβουμε ακριβώς τα ίδια πράγματα.
Αντίστοιχα για τα αρχεία δυαδικών δεδομένων (binary files), συμβαίνει περίπου το ίδιο με μια μικρή διαφοροποίηση: Οτι έχουμε ήδη έτοιμη μια δομή που οριοθετεί την ανάγνωση και το γράψιμο της κάθε εγγραφής μέσα στο αρχείο. Και εξηγούμαι: Γνωρίζουμε από το πινακάκι πιο πάνω τα μεγέθη των δεδομένων προς διάβασμα. Πόσο μήκος σε χαρακτήρες έχει ο κωδικός, το ονοματεπώνυμο κλπ. Έτσι αποτυπώνουμε το πινακάκι αυτό σε μια μορφή "σφραγίδας" και παίζουμε επάνω της:
Type
RecordStruct = Record
Code : String[06];
FullName : String[21];
Phone : String[11];
Address : String[18];
Area : String[08];
End;
Ωραία πράματα!! Τί έχουμε εδώ? Μια χαρτογράφηση της εγγραφής με αυτά τα στοιχεία που γνωρίζουμε οτι περιέχονται ανα εγγραφή. Δηλαδή σε κάθε γραμμή του αρχείου. Αυτό βοηθάει τα πράγματα αρκετά. Γιατί? Γιατί δεν είμαστε υποχρεωμένοι να υπολογίσουμε το μήκος διαβάσματος από κάθε νοητή γραμμή του αρχείου (γιατί ουσιαστικά δεν υπάρχει πλέον γραμμή μιας και είναι δυαδικά δεδομένα). Πάμε να τα τσιμπήσουμε:
Type
RecordStruct = Record
Code : String[06];
FullName : String[21];
Phone : String[11];
Address : String[18];
Area : String[08];
End;
Procedure ReadBinaryData()
var
RecordItem : RecordStruct;
DataFile : File Of RecordStruct;
begin
AssignFile(DataFile, 'c:\TestImport.dat');
Reset(DataFile);
.
.
Σκέφτηκα λοιπόν, να δώσω μια μικρή ακτίδα φωτός μέσα στο χάος των προγραμμάτων, της λογικής του προγραμματισμού, της τέχνης του σχεδιασμού και στις δυνατότητες της πληροφορικής, μέσα από ένα άρθρο που μπορεί να είναι λίγο εκτενές αλλά πιστέψτε με,, στο τέλος η εικόνα θα είναι αρκετά πιο ελκυστική :-)
Τί είναι ο υπολογιστής? Μια συσκευή. Λίγο διαφορετική από το πλυντήριο στο σπίτι σας, αλλά με την ίδια σύνθεση περίπου. Δυστυχώς δεν έχει κάδο βέβαια αλλά έχει κυκλώματα και περιφερειακά τσιπάκια και τέτοιες ιστορίες όπως και το πλυντήριο. Λίγο αποτυχία ο συσχετισμός, αλλά, σοβαρά τώρα, σαν μηχανημα δεν έχει και πολλές δυνατότητες. Τουλάχιστον το πλυντήριο πλένει τα ρούχα μας. Σκοπός του είναι η διαχείριση της πληροφορίας, η αποθήκευση της και ο συνδυασμός της με άλλες ήδη υπάρχουσες πληροφορίες. Πως το κάνει αυτό?
Η όλη λειτουργία του βασίζεται στην ανάλυση ηλεκτρικών σημάτων στα επιμέρους κυκλώματα του. Δεν θα εμβαθύνω περισσότερο μιας και δεν μας ενδιαφέρει τόσο. Αυτό που μας ενδιαφέρει είναι οτι ο υπολογιστής μας απαρτίζεται από διάφορα κομμάτια που στο σύνολό τους προβάλλουν ένα αποτέλεσμα και το καθένα ξεχωριστά είναι υπεύθυνο για μια η περισσότερες εργασίες. Πχ η οθόνη είναι υπεύθυνη για την προβολή και την αλληλεπίδραση με το χρήστη. Ο σκληρός δίσκος για την αποθήκευση πληροφοριών, η μνήμη για τη προσωρινή κράτηση πληροφοριών και αποτελεσμάτων, το πληκτρολόγιο και το ποντίκι για την εισαγωγή και την κατάδειξη πληροφοριων κοκ.
Η καρδιά του υπολογιστή σας είναι ο επεξεργαστής (CPU = Central Processing Unit η ΚΜΕ = Κεντρική Μονάδα Επεξεργασίας). Η CPU είναι υπεύθυνη για την διαχείριση και επεξεργασία όλων των πληροφοριών του σύστήματος. Τα πάντα περνάνε απο εκείνη (εκτός από συγκεκριμένες προϋποθέσεις που δεν μας ενδιαφέρουν αυτή τη στιγμή). Πως είναι οι πληροφορίες αυτές?
10010101010101111000000111010111. Είναι ένας αριθμός. Ουσιαστικά είναι η μοναδική μορφή πληροφοριών που μπορεί να καταλάβει ο υπολογιστής σας. Στη πραγματικότητα είναι ο αριθμός 2.505.540.055 στο δεκαδικό σύστημα αριθμησης που ξέρουμε να μετράμε όλοι. Φυσικά δεν είναι το μοναδικό σύστημα αρίθμησης που υπάρχει. Συγκεκριμένα ο αριθμός 10010101010101111000000111010111 είναι το 2.505.540.055 στο δυαδικό σύστημα (βάση αριθμησης το 2) και το 955781D7 στο δεκαεξαδικό (βάση αρίθμησης το 16). Εύλογα θα ρωτήσει κανείς... Γιατί τόσες μορφές αρίθμησης? Σε τι ωφελούν όλα αυτά? Η απάντηση είναι πολύ απλή: Χώρος!! Ας πάρουμε ένα παράδειγμα: Κάθε αριθμός - γράμμα - σύμβολο εχει μήκος 1 byte (συνήθως, γιατί μπορεί να έχει και 2 ανάλογα κάποιες προϋποθέσεις. Εμείς υποθέτουμε οτι οι χαρακτήρες που εξετάζουμε έχουν μήκος 1 byte). Αυτό σημαίνει 1 byte = 8 bits. Το bit είναι η μικρότερη μονάδα πληροφορίας που μπορεί να οριστεί, να διαχειριστεί και να αποθηκευτεί από τον υπολογιστή σας. Δηλαδή το byte 255 (αριθμητικά) είναι 11111111 στο δυαδικό άρα FF στο δεκαεξαδικό. (απο δω και στο εξής: Δεκαεξαδικό = Hex, Δυαδικό = bin, Δεκαδικό = dec). Βάζοντάς τα κάτω έχουμε:
Dec Bin Hex
255 11111111 FF
Τί πιάνει περισσότερο χώρο και τί λιγότερο? To Hex, όπως βλέπουμε ... ;-) Ουσιαστικά αυτή είναι και η σκοπιμότητά του. Η αριθμητική σύμπτηξη. Λιγότερο μέγεθος, λιγότερη χρησιμοποιούμενη μνήμη.
Μνήμη,, τι εννοούμε μνήμη? Κατ'αρχήν ας πάρουμε τους εαυτούς μας. Όλοι μας έχουμε εμπειρίες που θυμόμαστε, παιδικά χρόνια, καλές στιγμές, κακές στιγμές. Πράγματα που θυμόμαστε πάντα και πράγματα που ξεχνάμε. Μιλάμε δηλαδή για το διαχωρισμό της ανθρώπινης μνήμης σε συνειδητό - ασυνείδητο. Έτσι και οι υπολογιστές χρησιμοποιούν μια λιγο διαφορετική μορφή αρχιτεκτονικής που ορίζουν τις ικανότητες να θυμάται και να αποθηκεύει. Βραχυπρόθεσμα και μακροπρόθεσμα. Ο διαχωρισμός τους είναι ως εξής:
ROM : Read Only Memory : Μνήμη μόνο για ανάγνωση. Περιέχει βοηθητικά προγράμματα ελέγχου των συσκευών του συστήματος, δίσκους, δισκέττες, CD-ROM, DVD κλπ. Συνήθως αρκετά μικρή μνήμη σε μέγεθος.
RAM : Random Access Memory: Μνήμη τυχαίας προσπέλασης. Αυτή θεωρείται ως η κύρια μνήμη οπου χρησιμοποιείται από τα προγράμματα του συστήματός σας για προσωρινή αποθήκευση δεδομένων. Μετά το πέρας της λειτουργίας του προγράμματος η μνήμη απελευθερώνεται για να αποδοθεί σε κάποιο άλλο πρόγραμμα.
Πως "παίζουμε" τώρα με όλα αυτά? Πως καθορίζουμε τη λογική των προγραμμάτων μας? Με ένα περιβάλλον ανάπτυξης (ένα άλλο πρόγραμμα δηλαδή) που σκοπό έχει να φτιάχνει προγράμματα μέσω συμβολικής "γλώσσας προγραμματισμού". Υπάρχουν πολλές στο εμπόριο, από μεγάλες εταιρείες. Άλλες τζαμπέ άλλες επί πληρωμή ... Πολύ γνωστές είναι η Microsoft Visual Basic .NET, C#, C++, Delphi, Cobol, Clipper, Java και άλλες πολλές μικρότερες και μεγαλύτερες από αυτές. Η επιλογή είναι θέμα του καθενός μας. Του τί θέλει να κάνει, πως να το κάνει, τα πλεονεκτήματα και τα μειονεκτήματα της κάθε γλώσσας κλπ. Υπάρχουν Projects που είναι φτιαγμένα και σε περισσότερες από μια γλώσσες συνδυαστικά. Κοινώς? Τα πάντα μπορούν να γίνουν με οποιοδήποτε τρόπο. Αρκεί να έχουμε φαντασία - όραμα - υπομονή - επιμονή και όρεξη για γράψιμο!!
Πως φαίνεται ένα πρόγραμμα? Ένα μέρος ενός προγράμματος φαίνεται παρακάτω:
procedure TfrmMain.btTestClick(Sender: TObject);
var
LocalArray : TByteDynArray;
Counter : Integer;
Res : AnsiString;
begin
SetLength(LocalArray, 1);
For Counter := $0 to $FF do
begin
LocalArray[Counter-1] := Counter;
SetLength(LocalArray, Length(LocalArray)+1);
end;
SetLength(LocalArray, Length(LocalArray)-1);
Res := '';
For Counter := $0 to $FF do Res := Res + AnsiChar(LocalArray[Counter]);
mmLog.Lines.Add( Res );
end;
Το τί κάνει αυτό το πραμα? Λίγη σημασία έχει ... Αυτό που έχει σημασία είναι οτι καταλαβαίνουμε τις λέξεις και μπορούμε να διαχωρίσουμε τη σύνταξη. Πχ. For <Μεταβλητή> :=
int __Execute( const TStrings * Params, const TStrings * Vars,
const TStrings * TempVars, AnsiString * Response)
{
AnsiString datetime;
try
{
Query->SQL->Clear();
Query->SQL->Add("select getdate() 'datetime'");
Query->Open();
if(Query->Eof)
return 2;
datetime = Query->FieldByName("datetime")->AsString;
if(Params->Values["Append_Date"] == "Y")
Response->printf("%s, %s", Params->Values["Data"], datetime);
else
Response->printf("%s", Params->Values["Data"]);
}
__finally
{ Query->Close();
}
return 0;
}
Συγκεκριμένα προέρχεται από μια έκδοση της C++ που λέγεται Borland C++. Θα μπορούσα να συνεχίσω να παραθέτω τμήματα κώδικα από δεκάδες γλώσσες προγραμματισμού που υπάρχουν στο κόσμο της πληροφορικής. Το θεωρώ ανούσιο. Το να μάθει κανείς μια γλώσσα είναι το εύκολο της υπόθεσης. Το δύσκολο είναι να μπορέσει κανείς να απλουστεύσει το τρόπο σκέψης του τόσο ώστε να περιγράψει σε απλά βήματα τη λογική του τι θέλουμε ένα πρόγραμμα να κάνει περιγράφοντάς τη σκέψη μας κάνοντας χρήση της σύνταξης και των εντολών των γλωσσών προγραμματισμού.
Για να φτάσουμε όμως μέχρι εδώ, δηλαδή, την αποτύπωση της λογικής με απτές φράσεις και εντολές κατανοητές από τον άνθρωπο περάσαμε από τρικυμίες και μποφόρια, καινοτομίες και αποτυχίες. Οι υπολογιστές εξελίχθηκαν τεχνολογικά αλλά παρέμειναν τόσο ηλίθιοι όσο στα πρώτα χρόνια τους. Και εξηγούμαι: Δε καταλαβαίνουν τίποτα παραπάνω από τερααάστιες ακολουθίες από 0 και 1. Δηλαδή μεταφράσεις ψηφιακών σημάτων (όροι & κοιλάδες) σε 0 για κοιλάδες και 1 για όρη. (Τετραγωνισμένη μορφή της ημιτονοειδούς καμπύλης).Με αυτά ορίζονται τα κλεισίματα και τα ανοίγματα "διακοπτών" ωστε το 'α' να οριστεί σαν άλφα. Επειδή πλέον όλα γίνονται μέσω τρανζίστορς το άνοιγμα και το κλείσιμο των διακοπτών διαφέρει λιγάκι σε μορφή. Εσείς έχετε στο μυαλό σας οτι 1 = άνοιγμα διακόπτη, 0 = το κλείσιμό του.
Η βάση των πάντων? Μια γλώσσα που θεωρείται ως γλώσσα άμεσα κατανοητή από τον υπολογιστή,, η Assembly. Τα τσιπ των υπολογιστών, ο "επεξεργαστής" ως λεγόμενος, διαθέτει μια σειρά από εσωτερικές εντολές. Αυτές προδιαθέτουν και τις "χαμηλού επιπέδου" εντολές. Πως ορίζεται η Assembly? Δείτε,, κι αμα καταλάβετε σφυρίχτε μου κλέφτικα!!
.MODEL SMALL
.STACK 100h
.DATA
HelloWorldStr DB "Hello World$", 0Dh, 0Ah
.CODE
pusha ;Αποθήκευση καταχωρητών κατά την είσοδο (AX,BX,CX,DX,SI,BP)
mov dx, offset HelloWorldStr ;Φόρτωση μηνύματος
mov ah, 09h ;Εξυπηρέτηση 09h για εμφάνιση μηνύματος στην οθόνη
Int 21h ;Εμφάνιση
popa ;Επαναφορά καταχωρητών πριν την έξοδο
mov ah, 4Ch ;Εξυπηρέτηση 4Ch για έξοδο από το πρόγραμμα
Int 21h ;Εκτέλεση εξόδου
Καλούλιιι??! Αναμφισβήτητα! Το θέμα είναι οτι αν μέχρι σήμερα,, γράφαμε έτσι θα βρισκόμασταν ακόμα στο 1985,, τεχνολογικά πάντα. Άσε που κώδικα θα έγραφαν το 1/100 των ήδη υπάρχοντων προγραμματιστών στο πλανήτη. Χάλια ... Στη προκειμένη περίπτωση το συγκεκριμένο προγραμματάκι εμφανίζει στην οθόνη απλώς ένα μήνυμα: "Hello World".
Για να γίνει κανείς προγραμματιστής,,, δε χρειάζεται πολλά πράγματα. Διάβασμα, ενασχόληση, μεράκι και σκληρή δουλειά. Ότι δηλαδή θα χρειαζόταν σε οτιδήποτε άλλο με το οποίο θα θέλαμε να καταπιαστούμε. Το κακό είναι οτι η τεχνολογία προχωράει,, και μαζί πρέπει να προχωράμε και όλοι εμείς που δραστηριοποιούμαστε σε αυτό το τομέα. Κατα τα άλλα,, τα Bachelors, Masters και λοιπά κωλό-χαρτα δεν κάνουν το προγραμματιστή. Αλλά η σκληρή δουλειά και η αγάπη για το αντικείμενο. Στα χρόνια που έχω μέσα σε αυτό το αντικείμενο, είδα καλούς επαγγελματίες χωρίς ουτε κάν χαρτί πανεπιστημιακού επιπέδου, (ΙΙΕΚ δηλαδή), να βάζουν κάτω Πολυτεχνειάδες με πουλάδες και αστέρια που φυσικά κώδικα γράψανε μόνο στη σχολή και την είδανε Bill Gates μέσα σε μια νύχτα αφού πήραν το πτυχίο τους. Όπως φυσικά και πραγματικούς επαγγελματίες και επιστήμονες να ξαναεφεύρουν το τροχό επειδή και μόνο ο τροχός που υπήρχε στο εμπόριο δεν τους άρεσε! Με ένα laptop και λίγο καφέ, δηλαδή, να φτιάχνουν τεχνολογικά διαμάντια!!
Πως αποθηκεύονται οι πληροφορίες? Σε αρχεία, καταλόγους, μέσα σε άλλους καταλόγους και πάει λέγοντας!! Η έννοια της πληροφορίες μέσα στα αρχεία διαχωρίζεται σε κείμενο (text) και δυαδικά δεδομένα (binary data). Τα αρχεία κειμένου συνήθως περιέχουν δεδομένα που μπορούν να διαβαστούν από τον άνθρωπο άμεσα. Τα δυαδικά αρχεία περιέχουν, συνήθως, μεγάλες σειρές από περίεργα σύμβολα, που φυσικά νόημα δε βγαίνει με τίποτα!! Κι όμως!! ;-)
Ας πάρουμε 2 περιπτώσεις. Ας υποθέσουμε οτι θέλουμε να φτιάξουμε ένα πρόγραμμα που να διαβάζει ένα αρχείο κειμένου που ονομάζεται TestImport.txt και να το εμφανίζει στην οθόνη. Κάθε γραμμή περιέχει συγκεκριμένα στοιχειά: Πχ
000001$ΘΕΟΔΩΡΟΣ ΚΟΛΟΚΟΤΡΩΝΗΣ$210 9999999$ΤΡΟΠΟΛΙΤΣΑΣ 44-100$ΚΑΤΩΧΩΡΙ
Διακρίνουμε 5 πεδία με διάφορες πληροφορίες που διαχωρίζονται με το χαρακτήρα '$'. Πάμε να το σπάσουμε και να εμφανίσουμε τα δεδομένα σε μια οθόνη:
Procedure ReadLine();
var
InputFile : TextFile;
Line : String;
Broker : TStringList;
Counter : Integer;
begin
Assign(InputFile, 'c:\TestImport.txt'); //Προετοιμασία δείκτη αρχείου
Reset(InputFile); //Ανοιγμα αρχείου
Broker := TStringList.Create; //Δημιουργία λίστα σπασίματος πεδίων '$'
While Not Eof(InputFile) do //Για κάθε γραμμή μέχρι τέλος του αρχείου
begin
ReadLn(Line, InputFile); //Διάβασμα γραμμής αρχείου
Broker.Text := AnsiReplaceStr(Line, '$', #10); //Σπάσιμο πεδίων
For Counter := 0 to Broker.Count -1 do //Εμφάνιση στην οθόνη όλων των πεδίων
WriteLn(Broker[Counter]);
end;
CloseFile(InputFile); //Κλείσιμο αρχείου
End; //Τελος διαδικασίας
Το αποτέλεσμα φαίνεται παρακάτω όπως θα φαίνεται στην οθόνη:
000001
ΘΕΟΔΩΡΟΣ ΚΟΛΟΚΟΤΡΩΝΗΣ
210 9999999
ΤΡΟΠΟΛΙΤΣΑΣ 44-100
ΚΑΤΩΧΩΡΙ
Αυτού του τύπου τα αρχεία λέγονται CSV (Comma Separated Values). Οι τιμές δηλαδή χωρίζονται με comma ή κάποιον αντίστοιχο χαρακτήρα που έχει το ρόλο του νοητού διαχωρισμού των τιμών κάθε γραμμής του αρχείου. Υπάρχουν και τα λεγόμενα Fixed Width όπου το μέγεθος είναι δεδομένο για κάθε πεδίο και σταθερό ότι και να γίνει. Το αρχείο θα γινόταν ως εξής:
000001ΘΕΟΔΩΡΟΣ ΚΟΛΟΚΟΤΡΩΝΗΣ210 9999999ΤΡΟΠΟΛΙΤΣΑΣ 44-100ΚΑΤΩΧΩΡΙ
Για να το διαβάσουμε θα μας έδιναν προδιαγραφές ανάγνωσης. Δηλαδή ποιό πεδίο ξεκινά από ποιά θέση και για τι μέγεθος. πχ:
Πεδίο εκκίνηση μήκος
-----------------------------------------------------
Κωδικός 1 6
Ονοματεπώνυμο 7 21
Τηλέφωνο 22 11
Διεύθυνση 39 18
Περιοχή/Πόλη 57 8
Τροποποιώντας τον κώδικα λίγο παραπάνω, θα λάβουμε ακριβώς τα ίδια πράγματα.
Αντίστοιχα για τα αρχεία δυαδικών δεδομένων (binary files), συμβαίνει περίπου το ίδιο με μια μικρή διαφοροποίηση: Οτι έχουμε ήδη έτοιμη μια δομή που οριοθετεί την ανάγνωση και το γράψιμο της κάθε εγγραφής μέσα στο αρχείο. Και εξηγούμαι: Γνωρίζουμε από το πινακάκι πιο πάνω τα μεγέθη των δεδομένων προς διάβασμα. Πόσο μήκος σε χαρακτήρες έχει ο κωδικός, το ονοματεπώνυμο κλπ. Έτσι αποτυπώνουμε το πινακάκι αυτό σε μια μορφή "σφραγίδας" και παίζουμε επάνω της:
Type
RecordStruct = Record
Code : String[06];
FullName : String[21];
Phone : String[11];
Address : String[18];
Area : String[08];
End;
Ωραία πράματα!! Τί έχουμε εδώ? Μια χαρτογράφηση της εγγραφής με αυτά τα στοιχεία που γνωρίζουμε οτι περιέχονται ανα εγγραφή. Δηλαδή σε κάθε γραμμή του αρχείου. Αυτό βοηθάει τα πράγματα αρκετά. Γιατί? Γιατί δεν είμαστε υποχρεωμένοι να υπολογίσουμε το μήκος διαβάσματος από κάθε νοητή γραμμή του αρχείου (γιατί ουσιαστικά δεν υπάρχει πλέον γραμμή μιας και είναι δυαδικά δεδομένα). Πάμε να τα τσιμπήσουμε:
Type
RecordStruct = Record
Code : String[06];
FullName : String[21];
Phone : String[11];
Address : String[18];
Area : String[08];
End;
Procedure ReadBinaryData()
var
RecordItem : RecordStruct;
DataFile : File Of RecordStruct;
begin
AssignFile(DataFile, 'c:\TestImport.dat');
Reset(DataFile);
.
.
Πέμπτη 22 Ιανουαρίου 2009
Ιδιωτικές Εταιρείες Τηλεπικοινωνιών - Το ξεμπέρδεμα ...
Αγαπητοί φίλοι,
Στη παρούσα ανάρτησή μου, είμαι στην ευχάριστη θέση να σας ενημερώσω οτι τελικά, όντως ξεμπέρδεψα από αυτό το "προβληματάκι" που ανέκυψε με την ForthNet! Και πιστέψτε με,, δε χρειάστηκε η συνδρομή κανενός φορέα από αυτούς που περιγράφω στις προηγούμενες αναρτήσεις μου. Είναι καλό να καταφεύγεις σε αυτούς όταν γνωρίζεις οτι δεν θα μπορούσες μόνος σου να ανταπεξέλθεις σε μια τέτοια διένεξη. Είναι κατανοητό και σεβαστό. Δεν θα έμπαιναν πολλοί στη διαδικασία να τα βάλουν με μια εταιρεία, πόσο μάλλον με μια εταιρεία 'Δεσπόζουσας Θέσης' στην αγορά των τηλεπικοινωνιών.
Κατάφερα και βεβαιώθηκα οτι "βρήσκουν και τα κάνουν"! Δεν τα αξίζουν. Όλα τα προβλήματα που προκαλούν στο καταναλωτικό κοινό, με τον ένα ή τον άλλο τρόπο, τα στηρίζουν στο ότι όλοι εμείς δεν θα αντιδράσουμε. Άλλωστε γι'αυτό είναι και τις περισσότερες φορές απαξιωτικοί και επιθετικοί. Δεν λένε ότι: "Η επίθεση είναι η καλύτερη άμυνα"??
Με λίγα λόγια, τελικά πήγα στα κεντρικά της εταιρείας στη Συγγρού. Με ένα αντίγραφο του νόμου από την εφημερίδα της κυβερνήσεως στη μία κωλό-τσεπη και ένα αντίγραφο του κώδικα δεοντολογίας από εσωτερικό έγγραφο άλλης εταιρείας παροχής υπηρεσιών σταθερής τηλεφωνίας και Internet, στην άλλη. Φυσικά όπως θα αντιλαμβάνεστε έγινε χαμός!
Φυσικά πιάστηκαν στον ύπνο καθώς δεν περίμεναν να ακούσουν από το στόμα ενός καταναλωτή οτι θα έμπαινε στην διαδικασία καταγγελίας της εταιρείας σε τόσους φορείς, με αποδεικτικά στοιχεία και ημερομηνίες, με νόμους, άρθρα και διατάγματα καθώς και το ότι ήταν έτοιμος να εξαντλήσει όλα τα νόμιμα μέσα ώστε να αναδείξει το δίκιο του και το πρόβλημά του, με όποιο κόστος!
Η απειλή μου όμως δεν περιορίστηκε μέχρι εκεί μόνο. Μπήκα στη διαδικασία να μιλήσω με το δικηγόρο μου, καθώς εκτός της ηθικής μου υποχρέωσης απέναντι στην κοινωνία, έχω και υποχρέωση απέναντι στον εαυτό μου, να μη με θεωρούν ηλίθιο! Έτσι, εκτός της ομαδικής καταγγελίας μέσω της ΕΕΤΤ και του Συνήγορου του Καταναλωτή, ήμουν και έτοιμος να καταθέσω μηνυτήρια αναφορά κατά της εταιρείας με αξίωση την χρηματική αποζημίωσή μου.
Τελικά? Εντός 5 λεπτών είχα στα χέρια μου ΌΛΑ τα πιστωτικά των λογαριασμών που είχαν εκδοθεί για το διάστημα 3/2008 έως 10/2008 και την συμπλήρωση φόρμας παραπόνων ώστε να ξεκινήσει η εσωτερική διαδικασία (μέσω του τμήματος προσωπικού) για έλεγχο των τμημάτων και του τρόπου αντιμετώπισης των πελατών από αυτά τα τμήματα. Την ηλίθια πάντως που με ειρωνεύτηκε την έδωσα στεγνά. Μπορεί να μη μου ανέφερε όνομα ή θέση,, αλλά την ώρα και την ημερομηνία που έγινε το σκηνικό, ήταν συγκεκριμένα άτομα που απαντούσαν στις τηλεφωνικές γραμμές και δίη λιγότερα που ήταν γυναίκες.
Περιμένω εντος του 20ήμερου, απάντηση της εταιρείας για την πρόοδο της αναφοράς. Για το μόνο που μπορώ να σας διαβεβαιώσω είναι ότι κανείς δε τόλμησε να αντιπαρατεθεί στα επιχειρήματά μου. Μόνο και μόνο αυτό φτάνει για να αντιληφθεί κανείς οτι έστω και η ελάχιστη γνώση των διάταξεων και των δικαιωμάτων μας είναι υποχρέωσή μας. Απέναντι σε εμας, την οικογένειά μας, τους συνανθρώπους μας και φυσικά την κοινωνία μας. Δεν ισχυρίζομαι οτι έκανα κάτι φοβερό. Τίποτα δεν έκανα. Έκανα απλώς ότι ΘΑ ΕΠΡΕΠΕ να κάνει κάθε πολίτης προκειμένου να διαφοροποιήσει κάτι, έστω και το ελάχιστο για τον επόμενο που θα προσπαθήσει η συγκεκριμένη εταιρεία να εκμεταλλευτεί.
Το ηθικό δίδαγμα της όλης ιστορίας ??
Όχι βία στα γήπεδα,, όχι βία στους δρόμους!
ΒΙΑΣΤΕ ΣΤΙΣ ΕΤΑΙΡΕΙΕΣ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ! Έστω κι αν δεν σας έκαναν τίποτα, αυτές ξέρουν!..
Στη παρούσα ανάρτησή μου, είμαι στην ευχάριστη θέση να σας ενημερώσω οτι τελικά, όντως ξεμπέρδεψα από αυτό το "προβληματάκι" που ανέκυψε με την ForthNet! Και πιστέψτε με,, δε χρειάστηκε η συνδρομή κανενός φορέα από αυτούς που περιγράφω στις προηγούμενες αναρτήσεις μου. Είναι καλό να καταφεύγεις σε αυτούς όταν γνωρίζεις οτι δεν θα μπορούσες μόνος σου να ανταπεξέλθεις σε μια τέτοια διένεξη. Είναι κατανοητό και σεβαστό. Δεν θα έμπαιναν πολλοί στη διαδικασία να τα βάλουν με μια εταιρεία, πόσο μάλλον με μια εταιρεία 'Δεσπόζουσας Θέσης' στην αγορά των τηλεπικοινωνιών.
Κατάφερα και βεβαιώθηκα οτι "βρήσκουν και τα κάνουν"! Δεν τα αξίζουν. Όλα τα προβλήματα που προκαλούν στο καταναλωτικό κοινό, με τον ένα ή τον άλλο τρόπο, τα στηρίζουν στο ότι όλοι εμείς δεν θα αντιδράσουμε. Άλλωστε γι'αυτό είναι και τις περισσότερες φορές απαξιωτικοί και επιθετικοί. Δεν λένε ότι: "Η επίθεση είναι η καλύτερη άμυνα"??
Με λίγα λόγια, τελικά πήγα στα κεντρικά της εταιρείας στη Συγγρού. Με ένα αντίγραφο του νόμου από την εφημερίδα της κυβερνήσεως στη μία κωλό-τσεπη και ένα αντίγραφο του κώδικα δεοντολογίας από εσωτερικό έγγραφο άλλης εταιρείας παροχής υπηρεσιών σταθερής τηλεφωνίας και Internet, στην άλλη. Φυσικά όπως θα αντιλαμβάνεστε έγινε χαμός!
Φυσικά πιάστηκαν στον ύπνο καθώς δεν περίμεναν να ακούσουν από το στόμα ενός καταναλωτή οτι θα έμπαινε στην διαδικασία καταγγελίας της εταιρείας σε τόσους φορείς, με αποδεικτικά στοιχεία και ημερομηνίες, με νόμους, άρθρα και διατάγματα καθώς και το ότι ήταν έτοιμος να εξαντλήσει όλα τα νόμιμα μέσα ώστε να αναδείξει το δίκιο του και το πρόβλημά του, με όποιο κόστος!
Η απειλή μου όμως δεν περιορίστηκε μέχρι εκεί μόνο. Μπήκα στη διαδικασία να μιλήσω με το δικηγόρο μου, καθώς εκτός της ηθικής μου υποχρέωσης απέναντι στην κοινωνία, έχω και υποχρέωση απέναντι στον εαυτό μου, να μη με θεωρούν ηλίθιο! Έτσι, εκτός της ομαδικής καταγγελίας μέσω της ΕΕΤΤ και του Συνήγορου του Καταναλωτή, ήμουν και έτοιμος να καταθέσω μηνυτήρια αναφορά κατά της εταιρείας με αξίωση την χρηματική αποζημίωσή μου.
Τελικά? Εντός 5 λεπτών είχα στα χέρια μου ΌΛΑ τα πιστωτικά των λογαριασμών που είχαν εκδοθεί για το διάστημα 3/2008 έως 10/2008 και την συμπλήρωση φόρμας παραπόνων ώστε να ξεκινήσει η εσωτερική διαδικασία (μέσω του τμήματος προσωπικού) για έλεγχο των τμημάτων και του τρόπου αντιμετώπισης των πελατών από αυτά τα τμήματα. Την ηλίθια πάντως που με ειρωνεύτηκε την έδωσα στεγνά. Μπορεί να μη μου ανέφερε όνομα ή θέση,, αλλά την ώρα και την ημερομηνία που έγινε το σκηνικό, ήταν συγκεκριμένα άτομα που απαντούσαν στις τηλεφωνικές γραμμές και δίη λιγότερα που ήταν γυναίκες.
Περιμένω εντος του 20ήμερου, απάντηση της εταιρείας για την πρόοδο της αναφοράς. Για το μόνο που μπορώ να σας διαβεβαιώσω είναι ότι κανείς δε τόλμησε να αντιπαρατεθεί στα επιχειρήματά μου. Μόνο και μόνο αυτό φτάνει για να αντιληφθεί κανείς οτι έστω και η ελάχιστη γνώση των διάταξεων και των δικαιωμάτων μας είναι υποχρέωσή μας. Απέναντι σε εμας, την οικογένειά μας, τους συνανθρώπους μας και φυσικά την κοινωνία μας. Δεν ισχυρίζομαι οτι έκανα κάτι φοβερό. Τίποτα δεν έκανα. Έκανα απλώς ότι ΘΑ ΕΠΡΕΠΕ να κάνει κάθε πολίτης προκειμένου να διαφοροποιήσει κάτι, έστω και το ελάχιστο για τον επόμενο που θα προσπαθήσει η συγκεκριμένη εταιρεία να εκμεταλλευτεί.
Το ηθικό δίδαγμα της όλης ιστορίας ??
Όχι βία στα γήπεδα,, όχι βία στους δρόμους!
ΒΙΑΣΤΕ ΣΤΙΣ ΕΤΑΙΡΕΙΕΣ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ! Έστω κι αν δεν σας έκαναν τίποτα, αυτές ξέρουν!..
Τετάρτη 14 Ιανουαρίου 2009
Νομικό Πλαίσιο - Περί Ηλεκτρονικών Επικοινωνιών
Αγαπητοί φίλοι,
Με πρόφαση τη προηγούμενη ανάρτηση του άρθρου μου περί των Ιδιωτικών εταιρειών τηλεπικοινωνιών και το παράδειγμα της απαράδεκτης συμπεριφοράς και διαχείρισης της ForthNet απέναντί μου, έκανα λίγη έρευνα. Ως μη νομικός μπορεί να μην έχω τα φώτα για λεπτομερή έρευνα πάνω στο νομικό πλαίσιο που διέπει τις εταιρείες αυτές και γενικότερα τις εταιρείες τηλεπικοινωνιών, αλλά πιστεύω πως κατέληξα, μετά από βοήθεια φίλων και γνωστών που εργάζονται σε εταιρείες ομοίου χαρακτήρα, στα εξής:
Ο νόμος που, τελίκα, καθορίζει τα πλαίσια λειτουργίας τους είναι ο Ν.3431/2006 (ΦΕΚ 13/Α'/3.2.2006) Περί Ηλεκτρονικών Επικοινωνιών και άλλες διατάξεις. Μπορείτε να βρείτε την περιγραφή του στην διεύθυνση: http://www.dsanet.gr/Epikairothta/Nomothesia/n3431_06.htm.
Έστω και για ενημερωτικούς λόγους αξίζει να ρίξετε μια ματιά στο, ομολογουμένως, εκτενές κείμενο και τη πληθώρα των άρθρων (74 στον αριθμό) που απαρτίζουν τον Νόμο 3431.
Πολλοί απο εσάς που έχετε προβλήματα με τέτοιου είδους εταιρείες φαντάζομαι οτι θα βρείτε άκρως ενδιαφέρουσες τις παραγράφους 1, 2 & 3 του άρθρου 38 όπου περιγράφεται το καθεστώς των χρεώσεων καθώς επίσης και το άρθρο 63 που περιγράφει τις διοικητικές κυρώσεις που μπορεί να επιβάλλει η ΕΕΤΤ (Εθνική Επιτροπή Τηλεπικοινωνιών & Ταχυδρομείων) σε περίπτωση παράβασης των σχετικών άρθρων του νομοθετικού πλαισίου.
Ελπίζω να σας βοήθησα έστω, και λίγο να δείτε, οτι μαζί με τις υποχρεώσεις που έχετε, απέναντι στις εταιρείες (είτε ιδιωτικές, είτε δημόσιες) έχετε και ισάξια δικαιώματα. Είμαστε όλοι καταναλωτές που περιμένουν να τους παρέχεται η πρόσβαση στις υπηρεσιές που πληρώνουν, καθώς επίσης και με την ποιότητα την οποία εγγυάται η εκάστοτε συγκεκριμένη εταιρεία. Μπορεί ο καθένας μας να ασκήσει το αναφθαίρετο και συνταγματικό του δικαίωμα να αποχωρήσει και να καταγγείλει μια σύμβαση αν και εφόσων, δεν πληρούνται οι προϋποθέσεις των προϊόντων που μας παρέχονται. Όπως θα έκανε και μια οποιαδήποτε εταιρεία αν δεν πληρώνατε το λογαριασμό σας.
Απαιτούμε το σεβασμό απέναντί μας. Δεν τον ζητάμε!!
Οι εταιρείες κρέμονται απο εμάς. Εμάς έχουν ανάγκη για να επιβιώσουν, και εμείς αποφασίζουμε αν αξίζουν να επιβιώσουν (τουλάχιστον στην Ελληνική αγορά) ή όχι.
Με πρόφαση τη προηγούμενη ανάρτηση του άρθρου μου περί των Ιδιωτικών εταιρειών τηλεπικοινωνιών και το παράδειγμα της απαράδεκτης συμπεριφοράς και διαχείρισης της ForthNet απέναντί μου, έκανα λίγη έρευνα. Ως μη νομικός μπορεί να μην έχω τα φώτα για λεπτομερή έρευνα πάνω στο νομικό πλαίσιο που διέπει τις εταιρείες αυτές και γενικότερα τις εταιρείες τηλεπικοινωνιών, αλλά πιστεύω πως κατέληξα, μετά από βοήθεια φίλων και γνωστών που εργάζονται σε εταιρείες ομοίου χαρακτήρα, στα εξής:
Ο νόμος που, τελίκα, καθορίζει τα πλαίσια λειτουργίας τους είναι ο Ν.3431/2006 (ΦΕΚ 13/Α'/3.2.2006) Περί Ηλεκτρονικών Επικοινωνιών και άλλες διατάξεις. Μπορείτε να βρείτε την περιγραφή του στην διεύθυνση: http://www.dsanet.gr/Epikairothta/Nomothesia/n3431_06.htm.
Έστω και για ενημερωτικούς λόγους αξίζει να ρίξετε μια ματιά στο, ομολογουμένως, εκτενές κείμενο και τη πληθώρα των άρθρων (74 στον αριθμό) που απαρτίζουν τον Νόμο 3431.
Πολλοί απο εσάς που έχετε προβλήματα με τέτοιου είδους εταιρείες φαντάζομαι οτι θα βρείτε άκρως ενδιαφέρουσες τις παραγράφους 1, 2 & 3 του άρθρου 38 όπου περιγράφεται το καθεστώς των χρεώσεων καθώς επίσης και το άρθρο 63 που περιγράφει τις διοικητικές κυρώσεις που μπορεί να επιβάλλει η ΕΕΤΤ (Εθνική Επιτροπή Τηλεπικοινωνιών & Ταχυδρομείων) σε περίπτωση παράβασης των σχετικών άρθρων του νομοθετικού πλαισίου.
Ελπίζω να σας βοήθησα έστω, και λίγο να δείτε, οτι μαζί με τις υποχρεώσεις που έχετε, απέναντι στις εταιρείες (είτε ιδιωτικές, είτε δημόσιες) έχετε και ισάξια δικαιώματα. Είμαστε όλοι καταναλωτές που περιμένουν να τους παρέχεται η πρόσβαση στις υπηρεσιές που πληρώνουν, καθώς επίσης και με την ποιότητα την οποία εγγυάται η εκάστοτε συγκεκριμένη εταιρεία. Μπορεί ο καθένας μας να ασκήσει το αναφθαίρετο και συνταγματικό του δικαίωμα να αποχωρήσει και να καταγγείλει μια σύμβαση αν και εφόσων, δεν πληρούνται οι προϋποθέσεις των προϊόντων που μας παρέχονται. Όπως θα έκανε και μια οποιαδήποτε εταιρεία αν δεν πληρώνατε το λογαριασμό σας.
Απαιτούμε το σεβασμό απέναντί μας. Δεν τον ζητάμε!!
Οι εταιρείες κρέμονται απο εμάς. Εμάς έχουν ανάγκη για να επιβιώσουν, και εμείς αποφασίζουμε αν αξίζουν να επιβιώσουν (τουλάχιστον στην Ελληνική αγορά) ή όχι.
Ετικέτες
Εταιρείες,
Ιδιωτικές,
προσφυγή κατά,
Τηλεπικοινωνιών,
Forthnet,
netone,
On Telecoms,
teledome,
Tellas,
vodafone,
wind
Τρίτη 13 Ιανουαρίου 2009
Ιδιωτικές Εταιρείες Τηλεπικοινωνιών
Αγαπητοί συναναγνώστες,
Παίρνω το θάρρος να σας γράψω για την γενική ασυδωσία που επικρατεί όσων αφορά την αντιμετώπιση των Ιδιωτικών εταιρειών παροχής σταθερής τηλεφωνίας και Internet. Αυτό που μου συνέβει δεν έχει προηγούμενο οπότε είναι και μια καλή ευκαιρία να δείτε κι εσείς από κοντά το τρόπο με τον οποίο μας βλέπουν οι εταιρείες αυτές. Όχι σαν πελάτες, με υποχρεώσεις μεν, αλλά και με δικαιώματα δε, αλλά σαν θύματα προς χρησιμοποίηση.
Προκειμένου να γλιτώσουμε από τις υπέρογκες χρεώσεις του ΟΤΕ αποφασίσαμε να απευθυνθούμε σε μια ιδιωτική εταιρεία, με ομολογουμένως, ένα δελεαστικότατο πακέτο σταθερής τηλεφωνίας και Internet. Τη FORTHNET. Κάναμε λοιπόν την αίτηση τον Νοέμβριο του 2007, και αναμέναμε την αποκατάσταση της γραμμής εντός του πλαισίου των 20 ημερών που υποτίθεται οτι εγγυάται η εταιρεία. Μάταια όμως. Μετά από πολύμηνη αναμονή, τον Μάρτιο του 2008 πήραμε την ειδοποίηση του τέλους των εργασιών και της αποκατάστασης της γραμμής. Μπήκα λοιπόν στην διαδικασία να συνδέσω routers, γραμμές τηλεφώνου, ρυθμίσεις υπολογιστών κλπ. Λόγω της εργασίας μου (Μηχανικός Λογισμικού) δεν είχα και ιδιαίτερο πρόβλημα στην εγκατάσταση τους. Μάταια όμως! Μετά από επικοινωνία μαζί τους ενημερώθηκα για βλάβη της γραμμής και πως θα με ειδοποιούσαν αφού ολοκληρωνόταν ο έλεγχος. Οπότε καταχωρήθηκε η βλάβη στο σύστημα της εταιρείας. Όλα αυτά το Μάρτιο του 2008!!
Πέρασαν μήνες, και συγκεκριμένα το Νοέμβριο του 2008, όταν τσατισμένος πια, τους πήρα για να δω τι θα γίνει τελικά! Ένα τεχνικός μιλώντας μαζί μου κατάφερε σε 5' ότι οι υπόλοιποι δεν κατάφεραν σε 8 μήνες!! Παρεμπιπτόντως, οι λογαριασμοί έρχονταν κανονικά με τις προβλεπόμενες χρεώσεις. Φυσικά για ευνόητους λόγους κανένας τους δε πληρώθηκε! Το Νοέμβριο του 2008 μου έρχεται λογαριασμός με ένα ποσό πίστωσης και ένα χρέωσης της τάξης των 50€. Σε επικοινωνία μου με το τμήμα εξυπηρέτησης πελατών ενημερώθηκα οτι θα πρέπει να πληρωθεί το ποσό της χρέωσης και ότι τα ποσά των προηγούμενων λογαριασμών θα πιστωθούν μιας και δεν είχα παροχή καμίας υπηρεσίας μέσα σε αυτό το 8μηνο.
Τη περασμένη Παρασκευή όμως 9/1/2009 προχώρησε η εταιρεία σε φραγή της γραμμής μου, ισχυριζόμενη οτι πρέπει να καταβληθούν τα ωφειλόμενα ποσά?!! Αφού έγινα έξω φρενών, και τηλεφώνησα στο τμήμα εξυπηρέτησης πελατών, μια ηλίθια θεώρησε καλό να ειρωνευτεί την κατάσταση και να αρνηθεί με συνδέσει με το προϊστάμενός της πρωτίστως και εν συνεχεία να αποδώσει το όνομα της ως ωφείλει. Επιπροσθέτως πρότεινε να καταβάλλω το συνολικό ποσό των ωφειλών (που πρέπει να πιστώσει η εταιρεία) και μετά να τα πιστώσουν. Με λίγα λόγια να βγάλουν τα διπλάσια! Ή να μη καταβάλλω το ποσό και να περιμένω πότε θα ολοκληρωθεί η πίστωση (κάθε μήνα) με ενεργοποιημένη τη φραγή ώστε να το πατσίσουν. Δηλαδή θα μου χρωστάνε τα διπλάσια εφόσων πάλι δε θα έχω καμία παροχή από τις υπηρεσίες τους.
Η κινήσεις μου ήταν άμεσες και μπορώ να πω αρκετά αποτελεσμάτικές. Αρχικά τηλεφώνησα στον Συνήγορο του Καταναλωτή (www.synigoroskatanaloti.gr/) απ'όπου έλαβα τη διαβεβαίωση της παράνομης φραγής της γραμμής μου εκ μέρους της FORTHNET. Μετά τηλεφώνησα και στην EETT (Εθνική Επιτροπή Τηλεπικοινωνιών & Ταχυδρομείων) ( http://www.eett.gr ), απ'όπου και εκεί έλαβα τις ίδιες διαβεβαιώσεις. Η προτροπή και των δύο φορέων ήταν η καταγγελία της εν λόγω εταιρείας καθώς υπάρχουν και άλλες ιδίου τύπου καταγγελίες σε εκκρεμότητα. Όπως καταλαβαίνεται,, τρίβανε τα χέρια τους στην EETT.
Μαζί τους ακόμα, face 2 face, δεν έχω μιλήσει. Κάτι που, φυσικά, θα γίνει τις αμέσως επόμενες ημέρες!! Οι αναφορές είναι έτοιμες ήδη και με κοινοποίηση στους αρμόδιους φορείς (ΕΕΤΤ, Συνήγορο του Καταναλώτή) καθώς επίσης και στο Υπουργείο Ανάπτυξης. Επίσης υποδείγματα των αναφορών θα βρείτε στα sites των φορέων. Αν έχετε οποιαδήποτε απορεία, τηλεφωνήστε τους!! Είναι αρκετά εξυπηρετικοί και κατανοούν το πρόβλημά σας.
Όλες αυτές οι εταιρειούλες της συμφοράς νομίζουν οτι απευθύνονται σε ένα κοινό που αποτελείται από "πρόβατα". Μια λίμνη "θυμάτων" σε ένα λεκανοπέδιο που περιμένουν να δώσουν, χωρίς πολλές δυσκολίες, τα λιγοστά τους χρήματα στους μεγαλο-απατεώνες ωστε να γεμίζουν τα ρεζερβουάρ των Ferrari τους και να χρηματοδοτούν τα ταξίδια τους στο Monte Carlo. Φτάνει πια! Αξίζει να το τραβάμε στα άκρα και αν χρειαστεί να καταστρέφουμε τα παράσιτα που λοιμαίνονται την κοινωνία μας. Έχουμε τη δύναμη. Μόνοι μας δεν είμαστε!
Είμαστε όλοι μαζί ...
Παίρνω το θάρρος να σας γράψω για την γενική ασυδωσία που επικρατεί όσων αφορά την αντιμετώπιση των Ιδιωτικών εταιρειών παροχής σταθερής τηλεφωνίας και Internet. Αυτό που μου συνέβει δεν έχει προηγούμενο οπότε είναι και μια καλή ευκαιρία να δείτε κι εσείς από κοντά το τρόπο με τον οποίο μας βλέπουν οι εταιρείες αυτές. Όχι σαν πελάτες, με υποχρεώσεις μεν, αλλά και με δικαιώματα δε, αλλά σαν θύματα προς χρησιμοποίηση.
Προκειμένου να γλιτώσουμε από τις υπέρογκες χρεώσεις του ΟΤΕ αποφασίσαμε να απευθυνθούμε σε μια ιδιωτική εταιρεία, με ομολογουμένως, ένα δελεαστικότατο πακέτο σταθερής τηλεφωνίας και Internet. Τη FORTHNET. Κάναμε λοιπόν την αίτηση τον Νοέμβριο του 2007, και αναμέναμε την αποκατάσταση της γραμμής εντός του πλαισίου των 20 ημερών που υποτίθεται οτι εγγυάται η εταιρεία. Μάταια όμως. Μετά από πολύμηνη αναμονή, τον Μάρτιο του 2008 πήραμε την ειδοποίηση του τέλους των εργασιών και της αποκατάστασης της γραμμής. Μπήκα λοιπόν στην διαδικασία να συνδέσω routers, γραμμές τηλεφώνου, ρυθμίσεις υπολογιστών κλπ. Λόγω της εργασίας μου (Μηχανικός Λογισμικού) δεν είχα και ιδιαίτερο πρόβλημα στην εγκατάσταση τους. Μάταια όμως! Μετά από επικοινωνία μαζί τους ενημερώθηκα για βλάβη της γραμμής και πως θα με ειδοποιούσαν αφού ολοκληρωνόταν ο έλεγχος. Οπότε καταχωρήθηκε η βλάβη στο σύστημα της εταιρείας. Όλα αυτά το Μάρτιο του 2008!!
Πέρασαν μήνες, και συγκεκριμένα το Νοέμβριο του 2008, όταν τσατισμένος πια, τους πήρα για να δω τι θα γίνει τελικά! Ένα τεχνικός μιλώντας μαζί μου κατάφερε σε 5' ότι οι υπόλοιποι δεν κατάφεραν σε 8 μήνες!! Παρεμπιπτόντως, οι λογαριασμοί έρχονταν κανονικά με τις προβλεπόμενες χρεώσεις. Φυσικά για ευνόητους λόγους κανένας τους δε πληρώθηκε! Το Νοέμβριο του 2008 μου έρχεται λογαριασμός με ένα ποσό πίστωσης και ένα χρέωσης της τάξης των 50€. Σε επικοινωνία μου με το τμήμα εξυπηρέτησης πελατών ενημερώθηκα οτι θα πρέπει να πληρωθεί το ποσό της χρέωσης και ότι τα ποσά των προηγούμενων λογαριασμών θα πιστωθούν μιας και δεν είχα παροχή καμίας υπηρεσίας μέσα σε αυτό το 8μηνο.
Τη περασμένη Παρασκευή όμως 9/1/2009 προχώρησε η εταιρεία σε φραγή της γραμμής μου, ισχυριζόμενη οτι πρέπει να καταβληθούν τα ωφειλόμενα ποσά?!! Αφού έγινα έξω φρενών, και τηλεφώνησα στο τμήμα εξυπηρέτησης πελατών, μια ηλίθια θεώρησε καλό να ειρωνευτεί την κατάσταση και να αρνηθεί με συνδέσει με το προϊστάμενός της πρωτίστως και εν συνεχεία να αποδώσει το όνομα της ως ωφείλει. Επιπροσθέτως πρότεινε να καταβάλλω το συνολικό ποσό των ωφειλών (που πρέπει να πιστώσει η εταιρεία) και μετά να τα πιστώσουν. Με λίγα λόγια να βγάλουν τα διπλάσια! Ή να μη καταβάλλω το ποσό και να περιμένω πότε θα ολοκληρωθεί η πίστωση (κάθε μήνα) με ενεργοποιημένη τη φραγή ώστε να το πατσίσουν. Δηλαδή θα μου χρωστάνε τα διπλάσια εφόσων πάλι δε θα έχω καμία παροχή από τις υπηρεσίες τους.
Η κινήσεις μου ήταν άμεσες και μπορώ να πω αρκετά αποτελεσμάτικές. Αρχικά τηλεφώνησα στον Συνήγορο του Καταναλωτή (www.synigoroskatanaloti.gr/) απ'όπου έλαβα τη διαβεβαίωση της παράνομης φραγής της γραμμής μου εκ μέρους της FORTHNET. Μετά τηλεφώνησα και στην EETT (Εθνική Επιτροπή Τηλεπικοινωνιών & Ταχυδρομείων) ( http://www.eett.gr ), απ'όπου και εκεί έλαβα τις ίδιες διαβεβαιώσεις. Η προτροπή και των δύο φορέων ήταν η καταγγελία της εν λόγω εταιρείας καθώς υπάρχουν και άλλες ιδίου τύπου καταγγελίες σε εκκρεμότητα. Όπως καταλαβαίνεται,, τρίβανε τα χέρια τους στην EETT.
Μαζί τους ακόμα, face 2 face, δεν έχω μιλήσει. Κάτι που, φυσικά, θα γίνει τις αμέσως επόμενες ημέρες!! Οι αναφορές είναι έτοιμες ήδη και με κοινοποίηση στους αρμόδιους φορείς (ΕΕΤΤ, Συνήγορο του Καταναλώτή) καθώς επίσης και στο Υπουργείο Ανάπτυξης. Επίσης υποδείγματα των αναφορών θα βρείτε στα sites των φορέων. Αν έχετε οποιαδήποτε απορεία, τηλεφωνήστε τους!! Είναι αρκετά εξυπηρετικοί και κατανοούν το πρόβλημά σας.
Όλες αυτές οι εταιρειούλες της συμφοράς νομίζουν οτι απευθύνονται σε ένα κοινό που αποτελείται από "πρόβατα". Μια λίμνη "θυμάτων" σε ένα λεκανοπέδιο που περιμένουν να δώσουν, χωρίς πολλές δυσκολίες, τα λιγοστά τους χρήματα στους μεγαλο-απατεώνες ωστε να γεμίζουν τα ρεζερβουάρ των Ferrari τους και να χρηματοδοτούν τα ταξίδια τους στο Monte Carlo. Φτάνει πια! Αξίζει να το τραβάμε στα άκρα και αν χρειαστεί να καταστρέφουμε τα παράσιτα που λοιμαίνονται την κοινωνία μας. Έχουμε τη δύναμη. Μόνοι μας δεν είμαστε!
Είμαστε όλοι μαζί ...
Ετικέτες
Εταιρείες,
Ιδιωτικες,
Τηλεπικοινωνιών,
Forthnet,
HOL,
On Telecoms,
Tellas
Εγγραφή σε:
Αναρτήσεις (Atom)