Τρίτη 29 Ιανουαρίου 2019

ΕΟΠΥΥ Πειραιά - Αποζημείωση για γυαλιά οράσεως

Σήμερα πήγα να πάρω αμοζημείωση για γυλιά οράσεως που αγόρασα εγώ και η γυναίκα μου. Όταν πήγα στον ΕΟΠΥΥ Πειραιά (Ηρώων Πολυτεχνείου 19, Πειραιάς) έμαθα ότι δεν αρκούσαν τα ακόλουθα, αλλά χρειαζόταν να συμπληρωθεί και μια αίτηση καθώς επίσης να έχω και εξουσιοδότηση από την γυναίκα μου, που είναι η βασική ασφαλισμένη.

Ποια είναι τα βασικά, όπως αναφέρονται και στο website του Ε.Ο.Π.Υ.Υ:
  • Συνταγή από τον γιατρό η οποία θέλει σφραγίδα από τον ελεγκτή του ΕΟΠΥΥ
  • Βεβαίωση από το κατάστημα οπτικών
  • Απόδειξη απο το κατάστημα οπτικών
Επιπλέον πρέπει να γνωρίζετε ότι επιτρέπεται αγορά γυαλιών μόνο μια φορά ανα τέσσερα χρόνια άτομα άνω των 12 ετών και μια φορά ανα 2 χρόνια για άτομα κάτω από 12 ετών.

ΥΓ: Θεωρητικά ο ασφαλισμένος δεν θα έπρεπε να κάνει καμία διαδικασία, αλλά θα την έκανε το κατάστημα οπτικών. Αυτό όμως δεν ισχύει, ή τουλάχιστον δεν ισχύει ακόμη!

Πέμπτη 6 Δεκεμβρίου 2018

Laravel Custom Validation "comma separated*

Do you need to validate that something is a comma separated string and each entry should be then validated that it is a valid email, phone etc?

Simply add the following in your  AppServiceProvider's boot function:

        Validator::extend('comma_separated', function ($attribute, $value, $parameters, $validator) {
            $entryRules = $parameters[0];
            $parts = explode(",", $value);
            if ($entryRules) {
                foreach ($parts as $part) {
                    $entryValidator = 
                        validator(
                            ["value" => $part], 
                            ["value" => $entryRules], 
                            [],  
                            ["value" => $validator->getDisplayableAttribute($attribute) . " > Value"]
                        );
                    if ($entryValidator->fails()) {
                        foreach ($entryValidator->errors()->getMessages() as $validationErrors) {
                            if (is_array($validationErrors)) {
                                foreach ($validationErrors as $validationError) {
                                    $validator->errors()->add($attribute, $validationError);
                                }
                            }
                            else {
                                $validator->errors()->add($attribute, $validationErrors);
                            }
                        }
                        return FALSE;
                    }
                }
            }
            return TRUE;
        });

And use it like in the following snippet:

    $something = "something";
    $validator = validator(["value" => $something], ["value" => "comma_separated:email"]);

In my project, I have defined it in the $rules of my model class:

    public static $rules = [
      "datetime_from" => "required|date",
      "datetime_to" => "required|date|after_or_equal:datetime_from",
      "attendees" => "required|comma_separated:email",
      "title" => "required|min:3|max:255",
      "description" => "max:2000",
    ];

Δευτέρα 22 Οκτωβρίου 2018

Διαχείριση προσωπικών δεδομένων & επικοινωνιών.

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

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

Μια πάρα πολύ ωραία υλοποίηση, είναι αυτή που έχει γίνει στην εφαρμογή του Vodafone CU. Πραγματικά με ενθουσίασε το πόσο αναλυτικά έχουν τις επιλογές, αλλά και ότι σου βγάζει ένα τίμιο μήνυμα ότι μπορεί να χρειαστούν 24 ώρες για να ενεργοποιηθούν οι ρυθμίσεις.

Long Story Short:
  1. Εχεις Vodafone CU?
  2. Σε ενοχλούν με διαφημίσεις;
  3. Κατέβασε την εφαρμογή (Google Play, Apple App Store) 
  4. Ανοιξε την
  5. Συνδεσου
  6. Πηγαινε Μενου > Ρυθμίσεις > Διαχείριση προσωπικών δεδομένων & επικοινωνιών
  7. Επέλεξε τι θέλεις και αποθήκευσε τις ρυθμίσεις σου


Σημειωση: Το έκανα σήμερα, οποτε τις επόμενες ημέρες θα δω αν θα με ενοχλήσουν ή οχι! Ελπίζω να μην με ενοχλήσουν και να επιβεβαιώσει η Vodafone ότι ειναι σοβαρη εταιρεια που σέβεται τον καταναλωτη!

Τετάρτη 11 Ιουλίου 2018

[Laravel Hack] venturecraft/revisionable to include details

As a backend development, you might have been asked to keep a history of changes. A very good library that does so in Laravel, with minimum configuration, is the venturecraft/revisionable. A limitation of this library is that it is limited to whatever is stored in the table that is related to each model. 

There are several situations that this is not enough. For instance, you might have a Model "PriceTable" that is related to many "ServiceTypePrice" where "ServiceTypePrice" is stored in a separate table and they have a One-to-Many relationship.

My simplest solution was to convert define the relationship in the model class using "hasMany" and also create a function that converts the data of hasMany into a readable string. So I override method preSave that Revisionable uses, in order to include the result of getDetails() as if it is was a actual attribute of the table "PriceTable".

It should be noted that I have decided this solution since I have pretty small number of entries in the table "ServieTypePrice" for each "PriceTable", otherwise I would select a more sophisticated solution that I have already though of but I might test and document in a future post!

preSave code included in my "PriceTable" Model class is the following:
 
use \Venturecraft\Revisionable\RevisionableTrait; 
public function preSave() {
        if (!isset($this->revisionEnabled) || $this->revisionEnabled) {
            // if there's no revisionEnabled. Or if there is, if it's true
            $this->originalData = $this->original;
            $this->updatedData = $this->attributes;

            /**
             * Append details
             */
            if ($this->originalData) {
                $originalModel = static::find($this->originalData["id"]);
                $this->originalData["details"] = $originalModel->getDetails();
            }
            $this->updatedData["details"] = $this->getDetails();

            // we can only safely compare basic items,
            // so for now we drop any object based items, like DateTime
            foreach ($this->updatedData as $key => $val) {
                if (gettype($val) == 'object' && !method_exists($val, '__toString')) {
                    unset($this->originalData[$key]);
                    unset($this->updatedData[$key]);
                    array_push($this->dontKeep, $key);
                }
            }
            // the below is ugly, for sure, but it's required so we can save the standard model
            // then use the keep / dontkeep values for later, in the isRevisionable method
            $this->dontKeep = isset($this->dontKeepRevisionOf) ?
                array_merge($this->dontKeepRevisionOf, $this->dontKeep) : $this->dontKeep;
            $this->doKeep = isset($this->keepRevisionOf) ?
                array_merge($this->keepRevisionOf, $this->doKeep) : $this->doKeep;
            unset($this->attributes['dontKeepRevisionOf']);
            unset($this->attributes['keepRevisionOf']);
            $this->dirtyData = $this->getDirty();
            /**
             * Check Details
             */
            if ($this->originalData == NULL || strcmp((string) $this->updatedData["details"], (string) $this->originalData["details"]) !== 0) {
                $this->dirtyData["details"] = $this->updatedData["details"];
            }
            $this->updating = $this->exists;
        }
    }

Σάββατο 27 Ιανουαρίου 2018

Τηλεφωνική απάτη

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

Παρασκευή 1 Δεκεμβρίου 2017

Φορολοταρία

Έμοιαζε αστείο, αλλά τελικά όντως το υλοποίησαν. Πλέον το κράτος για πρώτη φορά δίνει ένα πολύ έξυπνο κίνητρο για να πληρώνουμε με κάρτες και να εισπράτει το ΦΠΑ, τον τσόγο!

Μάθετε αν είστε ένας από αυτούς καθώς και πόσους λαχνούς μαζέψατε από το ακόλουθο link http://www.aade.gr/menoy/meniaies-synallages-kai-lachnoi και πατήστε το κουμπί "ΕΙΣΟΔΟΣ ΣΤΗΝ ΕΦΑΡΜΟΓΗ" όπου κι εκεί θα πατήσετε το κουμπί "ΕΙΣΟΔΟΣ" και θα συνδεθείτε με τους κωδικούς που έχετε για το TaxisNet κι εν συνεχεία πατήστε "Εκτύπωση" στην περιοχή  "Δημόσια κλήρωση - Συναλλαγές και Λαχνοί". Η Εκτύπωση δημιουργεί ένα pdf αρχείο όπου θα δείτε να αναγράφει "α/α και λαχνός που κερδίζει".



Ελπίζω στο μέλλον να δώσουν κι άλλα κίνητρα μήπως κερδίσουμε κάτι όσοι ούτως ή αλλως πληρώνουμε με κάρτες!

Σάββατο 18 Νοεμβρίου 2017

Ένα παιδί κι όλα αλλάζουν - Δημοτικό σχολείο Αργυρούπολης Ρεθύμνου

Συγχαρητήρια στα παιδιά του Δημοτικού σχολείο Αργυρούπολης Ρεθύμνου για την τόσο επιτυχημένη ταινία μικρού μήκους. Πάρα πολύ συγκινητικό σενάριο και άψογη εκτέλεση.


Δευτέρα 13 Νοεμβρίου 2017

Internet Connection Fix for MAC OS

I connect to the Internet via my aDSL Router, but sometimes I have to use other networks or even mobile phones that work as Wifi hotspots. In total I have used tens of networks without facing any problem, but today I was trying to connect via my Xiaomi Redmi Note 4, but I could not! I tried really hard to find a solution and I finally found it! I had to use the Google's public DNS which are 8.8.8.8 and 8.8.4.4.

This is configured in System Preferences > Network > [Select your connection] > DNS tab > [Add the Google Public DNS]

Τρίτη 31 Οκτωβρίου 2017

Game Boy - Asterix & Obelix

Μετά από πολλά χρόνια ξαναβρήκα ένα από τα παλιά και αγαπημένα μου παιχνίδια Game Boy, το Asterix & Obelix. Πρόκειται για ένα παιχνίδι με τρομερα γραφικά, για την εποχή του. Σε αυτό το παιχνίδι οι ήρωες περνάνε από πίστες που αντιστοιχούν στις ακόλουθες χώρες: Μεγάλη Βρετανία, Ελλάδα, Ελβετία και Ισπανία ενώ υπάρχει και ένας τελικός.

Το καλό είναι ότι μέσα στο μενού του παιχνιδιού υπάρχει και η μαγική επιλογή PASSWORD, όπου κάνοντας συνδυασμους τεσσάρων στοιχείων σου προσπερνάει πίστες!

Και το ακόμη καλύτερο είναι ότι έχω όλη την λίστα:

Κωδικοί

Βρετανία

Πιστα 2:  Καρπούζι, Μπούτι, 1UP, Καρπούζι
Πίστα 3 #1: Μπούτι, Τυρί, Φλασκί, 1UP
Πίστα 3 #2: Γουρουνόπουλο, Μπούτι, Τυρί, Καρπούζι
Πίστα 4: Φλασκί, Μπούτι, Γουρουνόπουλο, Κοτόπουλο

Ελλάδα

Πίστα 1 #1: Γουρουνόπουλο, Κοτόπουλο, Μπούτι, Φλασκί
Πίστα 1 #2: Κοτόπουλο, Τυρί, 1UP, Κοτόπουλο
Πιστα 2:  Καρπούζι, Τυρί, Καρπούζι, Τυρί
Πίστα 3 #1: 1UP, Κοτόπουλο, Μπούτι, Μπούτι
Πίστα 3 #2: 1UP, Καρπούζι, Καρπούζι, Φλασκί
Πίστα 4: Κοτόπουλο, Καρπούζι, Φλασκί, Φλασκί

Ελβετία

Πίστα 1 #1: Τυρί, Καρπούζι, Τυρί, 1UP
Πίστα 1 #2: Καρπούζι, Γουρουνόπουλο, 1UP, Μπούτι
Πιστα 2:  Κοτόπουλο, 1UP, 1UP, Καρπούζι
Πίστα 3 #1: Τυρί, Τυρί, Φλασκί, Τυρί
Πίστα 3 #2: Φλασκί, Καρπούζι, Μπούτι, Μπούτι
Πίστα 4: 1UP, Γουρουνόπουλο, Κοτόπουλο, Γουρουνόπουλο

Ισπανία

Πίστα 1 #1: Μπούτι, Γουρουνόπουλο, Καρπούζι, Μπούτι
Πίστα 1 #2: Τυρί, Τυρί, Μπούτι, Γουρουνόπουλο
Πιστα 2:  Φλασκί, Φλασκί, Κοτόπουλο, Κοτόπουλο
Πίστα 3: Γουρουνόπουλο, 1UP, Γουρουνόπουλο, Γουρουνόπουλο
Πίστα 4: Μπούτι, Φλασκί, Τυρί, Κοτόπουλο

Τελικός

Ελβετία: Τυρί, Τυρί, Φλασκί, Κοτόπουλο
Ελλάδα:  Καρπούζι, Τυρί, Καρπούζι, Φλασκί
Ισπανία #1: Μπούτι, Μπούτι, Φλασκί, Τυρί
Ισπανία #2: Κοτόπουλο, Φλασκί, Τυρί, Κοτόπουλο


Επεξήγηση συμβόλων:

(Προσεχώς θα βγάλω πιο καθαρές εικονες!)

Γουρουνόπουλο

Καρπούζι

Κοτόπουλο

Μπούτι

Τυρί


1UP

Φλασκί






Τετάρτη 25 Οκτωβρίου 2017

Κλασική περίπτωση βλάβης: Χάλασε το κλειδί του Peugeot!

Μετά από σχεδόν μια δεκαετία χρήσης τα κατάφερα! Τρύπησα το κλειδί του αυτοκινήτου μου (Peugeot 207). Όπως φαίνεται, ήμουν πολύ επίμονος στο να το ανοίξω με αποτέλεσμα να το διαλύσω.
Ψάχνοντας να βρω πως θα το φτιάξω έπεσα πρώτα πάνω στην έκδοση νέου κλειδιού κι έπαθα ένα σοκ, καθώς το κόστος ειναι πάνω από 100€. Ευτυχώς υπάρχει κι επιλογή να αλλάξεις μόνο το κέλυφος (πλαστικό), το οποίο κάνει γύρω στα 16€ μέχρι 25€. Τελικά υπάρχει και η τρίτη και πλέον εικονομική λύση, το κάλυμα που κοστίζει 3,5€ μέχρι 10€! 

Για αρχή είχα παραγγείλει ένα κάλυμα και την έβγαλα πολύ φτηνά!

Car Key Cover ftw!

Πέμπτη 24 Αυγούστου 2017

Illustrated handbook of success

Πολύ συχνά μου αρέσει να διαβάζω βιβλία στο Kindle μου. Προτιμώ βιβλία που σχετίζονται με αυτοβελτίωση, διοίκηση επιχειρήσεων και φυσικά οτιδήποτε αφορά επιστήμη υπολογιστών. Ένα από τα πιο πρόσφατα που διάβασα είναι το Illustrated Handbook of Success.

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

Ελπίζω να υπάρξουν κι άλλα αντίστοιχα βιβλία από τον Thanos Tsilis


Μπορείτε να το αποκτήσετε πατώντας στο ακόλουθο κουμπί Shop now

Τρίτη 14 Φεβρουαρίου 2017

How to customise Digits Country Code Picker

I would like to share with you, the solution of how to theme the Country Code picker that open in Digits. Digits has documented on how to theme most parts of the basic UI, but they have left out the country picker! In first glance, you assume that it is simply a Spinner so you try to theme it as such but you fail, since it is TextView that opens and AlertDialog when you tap it!


SOLUTION:
In your custom theme, e.g. DigitsTheme, include the item name android:alertDialogTheme and set as value something like @style/DigitsDialogCustom then append in your styles.xml file another style that looks like the following:
<style name="DigitsDialogCustom" parent="@android:style/Theme.Dialog"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:background">@android:color/black</item> </style>
That is it! You now have a country picker that has black background!

Full styles.xml:
xml version="1.0" encoding="UTF-8"?> <resources> <style name="BaseTheme" parent="Theme.AppCompat.Light.DarkActionBar"> </style> <style name="AppTheme" parent="BaseTheme"> <item name="android:windowNoTitle">true</item> <item name="android:textColorPrimary">@android:color/white</item> <item name="android:textColorSecondary">@android:color/white</item> <item name="android:windowBackground">@android:color/black</item> <item name="android:textColorLink">#009996</item> <item name="android:colorAccent">#009996</item> <item name="android:popupBackground">#838383</item> <item name="android:alertDialogTheme">@style/DigitsDialogCustom</item> </style> <style name="DigitsDialogCustom" parent="@android:style/Theme.Dialog"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:background">@android:color/black</item> </style> </resources>

Δευτέρα 30 Ιανουαρίου 2017

GorbaTech Solutions Ltd

Μετά από πολλά χρόνια εργασίας σε διάφορες εταιρείες, έχω πλέον προχωρήσει στο επόμενο βήμα ιδρύοντας την δική μου, την GorbaTech Solutions.

Η GorbaTech Solutions είναι μια εταιρεία που προσπαθεί με μοντέρνο τρόπο να παρέχει υπηρεσίες υψηλού επιπέδου. Βασικό μας δόγμα είναι ότι "όσο μεγαλώνουν οι πελάτες, τόσο μεγαλώνουμε κι εμείς". 

Ήδη μας έχουν εμπιστευτεί αρκετές σοβαρές επιχειρήσεις για τις οποίες παρέχουμε υπηρεσίες: 
  • συμβουλευτικές (consulting services)
  • συντήρισης και επιδιόρθωσης παλαιών συστημάτων (maintenance & refactoring)
  • σχεδιασμού λογισμικού (software design)
  • ανάπτυξη μέρους ή ολόκληρων εφαρμογων
Επιπλέον έχουμε ασχοληθεί σε μεγάλο βάθος με την ανάπτυξη διαδραστικού περιεχομένου, κυρίως για διαφημιστικούς σκοπούς.


Περισσότερες πληροφορίες μπορείτε να βρείτε στην επίσημη ιστοσελίδα μας στο https://gorba.tech/ 

Τετάρτη 30 Δεκεμβρίου 2015

Η εξέλιξη μου ως προγραμματιστής - Μέρος 2ο

Σε συνέχεια της παλιότερης ανάρτησης Η εξέλιξη μου ως προγραμματιστής - Η αρχή!, σκοπεύω να γράψω κάποιες προσωπικές απόψεις σχετικά με την εξέλιξη ενός προγραμματιστή.

Επισήμανση

Αρχικά να επισημάνω ότι την λέξη "προγραμματιστής" την έχω εντός εισαγωγικών καθώς έχει παρερμηνευτει πολλές φορές. Ορισμένοι χρησιμοποιούν αυτη την λέξη ακόμη και για τον απλό τεχνικό υπολογιστών ενώ αλλοι την χρησιμοποιούν ακόμη και για άτομα που ασχολούνται με την αρχιτεκτονική έργων πληροφορικής μεγάλης κλίμακας. Στην πραγματικότητα υπάρχουν άπειρες ενδιάμεσες βαθμίδες μεταξύ του απλού τεχνικού μέχρι αυτή του αρχιτέκνονα λογισμικού (Software Architect). Προσωπικα θεωρώ οτι το ιδανικο είναι κάθε προγραμματιστής να περνάει απο όλες αυτες τι βαθμίδες ώστε να αντιλαμβάνεται την "δουλειά" σε ολα τα επίπεδα. Να σημειωθεί ότι πολλές φορές ισχύει το παράδοξο να ασχολειται με σχεδιασμό (software design) χωρίς να είχε ποτέ ιδιαιτερη προσωπική τριβή με την συγγρααφή κώδικα (coding) πράγμα που συνήθως οδηγεί σε λάθος εκτιμήσεις κόστους σε χρόνο και χρήμα!

Βαθμίδες προγραμματών

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

Το ξεκίνημα

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

Χαρακτηριστικά παράδειγματα αποτελούν:
  • Τα λογιστικά φύλλα (Spreadsheets)[1], όπου ο χρήστης μπορεί να καταγράψει δεδομένα τα οποία με χρήση συναρτήσεων μπορεί να μετασχηματίσει σε χρήσιμη πληροφορία. Μια πολύ συνηθισμένη χρήση αυτων των εργαλείων είναι η καταγραφή προσωπικών εσόδων-εξόδων και η παρακολούθηση τους.
  • Η ρύθμιση υπηρεσιών, όπως το IFTT (If This Then That), που δίνει την δυνατότητα στον χρήστη να "προγραμματίσει συγκεκριμένες λειτουργείες όταν συμβεί κάτι. Για παράδειγμα μπορεί όταν βγάλει μια μια κάμερα αντιληφθεί κίνηση, να βγάλει μια φωτογραφία και να του την στείλει μέσω email.
  • Η δημιουργία προσωπικής ιστοσελίδας (Wordpress, Blogspot etc) είναι άλλο ένα είδος υπηρεσίας όπου ο απλός χρήστης μπορεί να δημιουργήσει και να αρχίσει να έχει μια βασική επαφή με τον προγραμματισμο, ειδικά όταν θελήσει να προσθέσει κάποιο "προχωρημένο" plugin.

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

Μαθαίνοντας συγγραφή ή συρραφη κώδικα!

Τα πρώτα βήματα στον προγραμματισμό γίνονται με παραδείγματα. Κανένας δεν μπορει να μάθει πως να φτιάξει ενα κομμάτι κώδικα, αν πρωτα δεν έχει δει κάποιο υπάρχον. Τα πλέον κλασσικά κομμάτια κώδικα που χρησιμοποιούνται για εκμάθηση ειναι τα ακόλουθα:
Ενώ η ίσως πλέον κατάλληλη γλώσσα προγραμματισμού για να ξεκινήσει κάποιος με σωστές βάσεις είναι η all time classic ANSI C. Πρόκειται για την γλώσσα στην οποία βασίζονται σχεδόν όλες οι ευρέως διαδεδομένες γλώσσες προγραμματισμού κι άρα η μετάβαση σε κάποια από αυτές θα ειναι εύκολη.

Η εμπειρία ως κλειδί εξέλιξης

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


Τα "σκαλοπάτια"

Στο λογισμικό υπάρχουν πάντα πολλές προσεγγίσεις σε όλα τα θέματα. Η ίδια λογική ισχύει και για το ποιες είναι οι βαθμίδες των προγραμματιστών, αλλά η πλέον συνηθισμένη ειναι ακόλουθη:
  1. Trainee - Εκπαιδευόμενος που ενδέχεται να μην εχει καν πτυχίο. Συνήθως σε αυτό το στάδιο ο "προγραμματιστής" ενδέχεται να μην γνωρίζει καν βασικές δομές κάποιας γλώσσας προγραμματισμού κι απλά να προσπαθεί μέσω "μιμησης" να εξοικειωθεί με τις τεχνολογίες.
  2. Junior - Αρχάριος που έχει στοιχειώδεις γνώσεις αλλά ακόμη δεν μπορεί να αναλάβει κάποιο κομμάτι δουλειάς χωρίς την επίβλεψη κάποιου πιο έμπειρου που μεταξύ άλλων θα του επισημαίνει λάθη και θα τον καθοδηγεί στο πως να δημιουργεί κάτι πιο άρτιο.
  3. Mid level - Μέσου επιπέδου είναι κάποιος προγραμματιστής που μπορεί να αναπτύξη κάποια κομμάτια ενός προγράμματος χωρίς να χρειάζεται συνεχής παρακολούθηση από κάποιον έμπειρο, αλλά δεν διαθέτει την απαραίτητη εμπειρία ώστε να αυτά που αναπτύσει να είναι επεκτάσιμα και επαναχρησιμοποιήσιμα.
  4. Senior - Εμπειρος είναι ένας προγραμματιστής που μπορεί να αναπτύξει λογισμικό χωρίς την παρακολούθηση απο κάποιον πιο έμπειρο και μάλιστα ο κώδικας του έχει την κατάλληλη δομή ώστε να μπορεί εύκολα να επεκταθεί αλλά και να επαναχρησομοποιηθεί. Επιπλέον, ένας έμπειρος μηχανικός λογισμικού είναι αρκετά ικανός ώστε να καθοδηγεί και να εκπαιδεύει προγραμματιστής με λιγότερη εμπειρία.
  5. Lead/Principal - Επικεφαλής είναι ο υπεύθυνος μιάς ομάδας προγραμματιστών. Συνήθως είναι αρκετά έμπειρος τόσο σε τεχνικά θέματα όσο και σε θέματα διαχείρισης ομάδων. Σε αυτό το επίπεδο ασχολείται περισσότερο για το πως θα βελτιστοποιούνται οι διαδικασίες για παραγωγή του καλύτερου δυνατού αποτελέσματος παρά το πως θα γράψει ο ίδιος τον "κωδικα".
  6. Architect - Αρχιτέκτονας θεωρείται ένας μηχανικός λογισμικού που λαμβάνει όλες τις αποφάσεις σχετικά με το ποιες τεχνολογίες θα χρησιμοποιηθούν, πως θα συνδυαστούν αλλά ακομη και το τι δομή θα έχει ο κώδικας. Επιπλέον αποφασίζει για τα standards που πρέπει να ακολουθούνται από τις ομάδες ανάπτυξης λογισμικού.
  7. Chief Architect - Επικεφαλής αρχιτεκτονικής είναι το άτομο που ηγείται όλων και λαμβάνει όλες τις τεχνολογικές αποφάσισεις υψηλού επιπέδου. Να σημειώσω ότι πολλές φορές τυγχάνει αυτός που έχει ουσιαστικά τις αρμοδιότητες του Chief Architect να έχει τον τίτλο του CTO.

Υποσημειώσεις

[1] Λογιστικά φύλλα (Spreadsheets) ειναι πίνακες που επιτρέπουν εύκολους υπολογισμούς πάσης φύσεως. Στον κόσμο της πληροφορικής ταυτίζονται με τα πολύ διαδεδομένα προγράμματα MS Excel, Google Sheets και Numbers for Mac κι άλλα λιγότερο διαδεδομένα που ενδέχεται όμως να είναι ακόμη πιο κατάλληλα για κάλυψη συγκεριμένων αναγκών.
[2] Δυο από τα πλέον αγαπημένα μου βιβλία σχετικά με διαχείρηση ομάδων ανάπτυξης λογισμικου αποτελουν τα ακολουθα:




Τετάρτη 15 Απριλίου 2015

Programming Mobile Applications for Android Handheld

8-13 June at Found.ation with the co-operation of Pinnatta team

instructors: George Anagnostaros and Vassilis Pigadas



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



Απευθύνεται σε όσους θέλουν να μάθουν πως μπορούν να ανάπτυσουν εφαρμογές Android, που να ειναι συντηρισιμες σε έναν χώρο που συνεχώς μεταβάλλεται. Η γνώση Java είναι απαραίτητη, αλλά οι γνώστες C-like γλωσσών θα μπορέσουν να ακολουθήσουν με σχετική άνεση.


Πρόγραμμα:
Προαιρετικό πρόγραμμα:
  • Πεμπτη 4 Ιουνίου, 18:00-20:00 -Εισαγωγή στην Java
  • Παρασκευή 5 Ιουνίου, 18:00-20:00 - Εγκατασταση και γνωριμία με το Android Studio


Κανονικό πρόγραμμα:
Δευτέρα 8 Ιουνίου, 18:00-20:00 -
Βασικά στοιχεία μιας εφαρμογής Android (1)


Τρίτη 9 Ιουνίου, 18:00-20:00 -
Βασικά στοιχεία μιας εφαρμογής Android (2)
Δραστηριότητες και Προθέσεις (Activities and Intents)


Τετάρτη 10 Ιουνίου, 18:00-20:00 -
Δημιουργία διατάξεων (layouts)


Πέμπτη 11 Ιουνίου, 18:00-20:00 -
Βάσεις δεδομένων και πάροχοι περιεχομένου (SQLite & Content Providers)


Παρασκευή 12 Ιουνίου, 18:00-20:00 -
Υπηρεσίες και ασύγχρονες εργασίες (Services & AsyncTasks)


Σάββατο 13 Ιουνίου, 10:00-14:00 -
Επικοινωνία με το δίκτυο
Beta testing, debugging και δημοσίευση εφαρμογής στο Google Play


Τι θα χρειαστειτε:
  • Φορητό υπολογιστή με τουλάχιστον τα ακολουθα χαρακτηριστικά:
    • 4GB RAM
    • 10GB ελευθερου χώρου στον δισκο
    • Λειτουργικό σύστημα Linux, MAC OS, ή Windows
  • Προαιρετικά, θα ήταν καλό να εχετε και συσκευή με λειτουργικό σύστημα Android 4.0.3 και άνω ώστε να δοκιμασετε τα δημιουργήματα σας.


Σύνολο:
Προαιρετικό πρόγραμμα: 4 ώρες σε 2 μερες
Κανονικό πρόγραμμα: 14 ώρες σε 6 μέρες


Κόστος early bird (κανονικό πρόγραμμα): 95 ευρώ
Κόστος early bird (κανονικό πρόγραμμα + προαιρετικό πρόγραμμα): 110 ευρώ


Κόστος μετά την πάροδο των early bird (κανονικό πρόγραμμα): 110 ευρώ
Κόστος μετά την πάροδο των early bird (κανονικό πρόγραμμα + προαιρετικό πρόγραμμα): 125 ευρώ


Στο τέλος θα δοθούν πιστοποιητικά παρακολούθησης από το Found.ation.
ΒιογραφικάGeorge Anagnostaros
  • Head of Mobile Engineering in Pinnatta.
  • Co-founder & CTO of Apps4Mags
  • Working experience in software development of vast array of projects, since 2006.
  • Developing applications for mobiles since the era of J2ME, back to 2000, but he still learns new technologies (e.g. Swift, Lambda Expressions etc)
  • Education
    • Master of Science in the Management of Business Innovation and Technology
    • BsC, in Applied Informatics & Multimedia


Vassilis Pigadas

  • Android Engineer at Pinnatta
  • Working experience in Android development
  • Education
    • Master of Computer/Information Technology Administration and Management
    • BsC, in Computer Science & Biomedical Informatics

When ?

Monday, June 08, 2015 6:00 PM
-
Saturday, 13 June 2015

Where ?

Found.ation
Evristheos 2


118 54 Athina, Greece

Σάββατο 7 Μαρτίου 2015

Η εξέλιξη μου ως προγραμματιστής - Η αρχή!

Διευκρίνιση: Το συγκεκριμένο άρθρο ειναι κυρίως αυτοβιογραφικό. Απλά μου άρεσε η ιδέα να μοιραστώ το τι και πως με έκανε να γίνω προγραμματιστής 

Γιατί έγινα προγραμματιστής κι όχι μαθηματικός ή καθηγητής αγγλικών όπως έλεγα πολύ μικρός[1];

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

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

Ποια ήταν τα πρώτα μου βήματα στον προγραμματισμό;

  • Ίσως το πρώτο πρόγραμμα που έγραψα, στην πραγματικότητα το αντέγραψα απο το βιβλίο "Γνωρίστε τον μικρο-υπολογιστή"! Βιβλίο το οποίο διατηρώ καθαρά για λόγους νοσταλγίας. Ήταν ένα πάρα πολύ απλό παιχνιδάκι σε GWBasic, οπου ζητούσε από τον χρήστη να μαντέψει ένα νούμερο.[2] . Να σημειωθεί οτι αυτο το είχα κάνει πριν καν ξεκινήσω το δημοτικό. Πάντα νιώθω τυχερός που είχα την τύχη να υπάρχει υπολογιστής στο σπίτι κι άρα να έχω το ερέθισμα να ασχοληθώ.

  • "Μεγαλώνοντας" και έχοντας μάθει πλέον πιο πολλά, ανέπτυξα ένα εκπαιδευτικό παιχνίδι για την προπαίδια. Το είχα αναπτύξει κι αυτό σε GW BASIC, που ήταν άλλωστε η πρώτη μου γλώσσα προγραμματισμου! Η εφαρμογή ήταν πάρα πολύ απλή, για τα σημερινά δεδομένα, καθώς εμφανιζε δυο τυχαίους ακέραιους αριθμους απο το 1 μεχρι το 10 και ζητούσε στον χρήστη να γράψει το γινομενο, αν το έγραφες λάθος σε ενημέρωνε για το σωστό! Δεν ξέρω αν αυτό με έκανε να μάθω προπαίδια, αλλά σίγουρα με έκανε να νιώθω οτι ο προγραμματισμός δεν είναι κάτι το ουτοπικό!

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

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

Τι με έκανε προγραμματιστή;

1. Δεν υπήρχαν έτοιμα προγράμματα

Μεγάλωσα σε μια εποχή και μια χώρα, όπου μπορούσες να βρεις ελάχιστα έτοιμα προγράμματα.  Συνήθως μόνο εφαρμογές των ακόλουθων κατηγοριών μπορούσες να βρεις:
  • Παιχνίδια, όπως τα αγαπημένο μου Shinobi και Lemmings
  • Eφαρμογές γραφείου, οπως η σουϊτα Microsoft Works και η Lotus 1-2-3 που όμως για να κάνεις το κάτι παραπάνω απαιτούσαν να γράψεις μακροεντολές και έξυπνες συναρτήσεις.
  • Compilers, όπως GW-Basic, QBasic, Clipper κ.α.

2. Το απόλυτο εργαλείο για πειράματα χωρίς επιπλέον εξοπλισμό

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

3. Η χαρά της δημιουργίας

Ενας από τους πιο βασικούς λόγους που λατρεύω την ανάπτυξη λογισμικού είναι ότι μου δίνει την δυνατότητα να υλοποιώ κάτι που ο ίδιος βλέπω και χρησιμοποιώ. 
Ένα απο αυτά τα προγράμματα είναι οι Μαντινάδες, που ανέπτυξα πρώτη φορά το 2001 όταν ήμουν στην Α' Λυκείου χρησιμοποιώντας Visual Basic 6! Στο πλαισιο της συγκεκριμένης εφαρμογής υλοποίησα και έναν μεταφραστη απο ελληνικά σε greeklish ώστε να μπορεί να γίνεται αναγνωση των μαντινάδων μεσω της λειτουργιας Text2Speech που είχαν τα MS Windows, αλλά μονο για αγγλικά. 

4. Η ανάγκη για συνεχή μάθηση και βελτίωση

Σε αντιθέση με άλλα επαγγέλματα, όπου μετά απο μερικά χρόνια προϋπηρεσίας φτάνεις το ύψηστο επίπεδο γνώσης, στον προγραμματισμό συνέχεια μαθαίνεις. Ανακαλύπτεις νέες γλώσσες προγραμματισμου, νέες προσεγγίσεις ανάλυσης και επίλυσης προβλήματων, διαφορετικούς τρόπους σκέψεις και γενικότερα καταλήγεις στο να μάθεις ότι πάντα θα μαθαίνεις! Το καταπληκτικό είναι πως κάθε τι που μαθαίνεις σε κάνει πιο "εξυπνο", ενώ στην ουσία απλά σε πάει από έναν πιο σύντομο δρόμο σεσ σχέση με την μεγάλη διαδρομή που έκανε αυτός που το ανακάλυψε.
Αυτό ίσως προβληματίζει τους νεότερους, ή μπορεί και να τους αγχώνει, αλλά είναι το μόνο που μπορεί να γνωρίζει κάποιος που θέλει να θεωρηθεί καλός μηχανικός λογισμικού κι όχι απλά άλλο ένα code monkey!

Προγραμματιστής επι πληρωμή

Πάρα πολλοί νεαροί και νεαρές θεωρούν την δουλεία του προγραμματιστή ως ιδιαίτερα επικερδή. Το πρόβλημα ξεκινάει όταν μπερδεύουν το τι παίρνουν οι λίγοι και καλοι αρχιτέκτονες λογισμικού κι όχι τι παίρνει ο απλός εκπαιδευόμενος προγραμματιστής. Ενδεχομένως ακούνε για μισθους της ταξη των $100Κ τον χρόνο στο Silicon Valley και ονειρεύονται.

Η πραγματικότητα είναι λίγο πιο προσγειωμένη για τα ελληνικά δεδομένα. Ένας μηχανικός ξεκινάει έχοντας πτυχίο τριτοβάθμιας εκπαιδευσης με έναν μικτο μισθο της τάξης των 1200€, ως υπάλληλος[4], ενώ αν επιλέξει να εργαστεί ως ελεύθερος επαγγελματιας τότε έχει να αντιμετωπίσει δυο βασικές κατηγορίες "πελατών", αυτοί που θεωρούν τους μηχανικούς λογισμικου επιστήμονες που μοχθούν για να παραξουν το καλύτερο δυνατό αποτέλεσμα και αυτούς που θεωρούν τους coders τεμπέλιδες που έχουν έτοιμα τουβλάκια που τα κουμπώνουν και παράγουν εφαρμογές.

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

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

Σε επόμενο άρθρο σκοπεύω να γράψω:

  • Βαθμίδες προγραμματιστών
  • Πόσα χρόνια προγραμματιστής;
  • Ποιό είναι το επόμενο επίπεδο, μετά απο τον προγραμματισμό;


Υποσημειώσεις:
[1] Αποφάσισα να γίνω προγραμματιστής στην 5η δημοτικού, οπότε το "πολύ μικρός" εννοώ μεχρι την 4η δημοτικού ;-)
[2] Βρήκα ένα αναλυτικό άρθρο για το συγκεκριμενο βιβλίο, στο Asciimation
[3] Η αλήθεια ειναι οτι δεν ήταν πρόγραμμα, αλλά ενα spreadsheet σε Microsoft Works, αλλά τότε μου φαινοταν σαν να εγραφα κώδικα!
[4] Σύμφωνα με την τελευταία συλλογική σύμβαση εργασίας ο πρώτος μικτος μισθος ειναι γύρω στα 1200€, αλλά επειδή τώρα δεν ισχύουν ή κάποιος μπορεί να μην έχει πτυχίο ενδέχεται να λάβει ακόμα χαμηλότερο μισθο!

LinkWithin

Blog Widget by LinkWithin

Mobile edition