Σάββατο 14 Νοεμβρίου 2015

[Tips] Αντίγραφα Ασφαλείας - Wordpress

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

Σε αυτή την ανάρτηση θα επικεντρωθώ στο Wordpress, αλλά και πιο συγκεκριμένα, στο πρόσθετο "Updraft Plus". H δωρεάν έκδοση του "Updraft Plus" είναι πραγματικά υπεραρκετή για τον μέσο ιδιοκτήτη blog. Με μια γρήγορη ματιά, τα κυριότερα χαρακτηριστικά του είναι τα εξής:

  • Αυτοματοποιημένα αντίγραφα ασφαλείας ανα Χ ημέρες
  • Επιλογή πλήρους αντιγράφου ασφαλείας (βάση δεδομένων, εικόνες και αρχεία), ή μονο της βάσης δεδομένων. Για blog που δεν χρησιμοποιούν πολλές εικόνες, η δεύτερη επιλογή είναι η καλύτερη. Να σημειώσω εδώ, οτι μπορείτε να έχετε πολλές εργασίες αντιγράφων ασφαλείας προγραμματισμένες, οπότε μπορείτε πχ να προγραμματίσετε 1 φορά το μήνα να παίρνει πλήρες αντίγραφο ασφαλείας, και μια φορά την εβδομάδα μόνο τη βάση δεδομένων.
  • Απομακρυσμένη αποθήκευση αντιγράφων ασφαλείας σε: Dropbox, Google Drive, FTP Server, Amazon S3, RackSpace, Openstack. Επίσης υποστηρίζεται και η αποστολή των αρχείων μέσω email.
  • Επαναφορά απο αντίγραφο ασφαλείας
  • Αποθήκευση μεγάλων site σε πολλαπλά αρχεία
  • Επιλογή αρχείων που θα συμπεριληφθούν (πρόσθετα, θέματα, περιεχόμενο, κλπ)
  • Λήψη αντιγράφων ασφαλείας απο τον browser
Εικόνα απο το διαχειριστικό περιβάλλον του πρόσθετου, απο την επι πληρωμή έκδοση του.

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

  • Onedrive
  • Copy.com
  • Google Cloud Storage
  • SFTP (Secure FTP) & SCP
  • WebDAV (πχ για λύσεις τύπου ownCloud ή κάποιον άλλο δικό μας διακομιστή)
  • UpdraftVault Plus (παρέχεται απο τους δημιουργούς)
και κοστίζει για τους Έλληνες πελάτες €67,65 στην απλή έκδοση για μέχρι 2 ιστότοπους, €92,25 στην Business έκδοση για μέχρι 10 ιστότοπους και €135,30 στην έκδοση για developers που υποστηρίζει απεριόριστους ιστότοπους.

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

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

Εσείς τι πλατφόρμα χρησιμοποιείτε για τον ιστότοπό σας; Αφήστε μου ένα σχόλιο!

Κυριακή 8 Νοεμβρίου 2015

[Gamer's Mind] Planetbase

Τον τελευταίο καιρό, στον ελεύθερό μου χρόνο καίγομαι με το παιχνίδι Planetbase. Τι είναι το Planetbase;

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

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

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

Έχω ολοκληρώσει τον 1ο απο τους 3 πλανήτες (Desert Planet), ο οποίος είναι και ο πιο εύκολος, και τώρα παίζω τον 2ο πλανήτη (Frozen Planet) στον οποίο οι δυσκολίες γίνονται μεγαλύτερες, καθώς εμφανίζονται οι ηλιακές εκλάμψεις.


Στήριξε την προσπάθεια των δημιουργών! Έχουν ήδη δημοσιεύσει 6 patches, και το παιχνίδι κυκλοφορεί μόλις 3 εβδομάδες. Μπορείς να το αγοράσεις απο το Steam έναντι €19,99, ενώ στο Humble Store κοστίζει €18,49! Τα αξίζει τα λεφτά του, ειδικά για τους φαν του είδους.

Τετάρτη 4 Νοεμβρίου 2015

[PHP Snippet] Αλλαγή των URL συγκεκριμένων Link

Σε περίπτωση μαζικής αλλαγής links (πχ, μεταφορά blog), αν θέλουμε να αλλάξουμε όλα τα link, είναι δύσκολο να γίνει με το χέρι, ειδικά σε περιπτώσεις που έχουμε πάρα πολλούς εσωτερικούς συνδέσμους. Ένας εύκολος τρόπος, είναι χρησιμοποιώντας το παρακάτω snippet:
(πριν το snippet, να πω το κλασσικό οτι κατα πάσα πιθανότητα δεν δουλεύει σε ΟΛΕΣ τις περιπτώσεις, οπότε κάποια link θα σας ξεφύγουν. 100%. Μην πείτε οτι δεν σας προειδοποίησα! :P )


 $regexp = "<a\s[^>]*src=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";
 if(preg_match_all("/$regexp/siU", $postbody, $matches, PREG_SET_ORDER)) {
  foreach($matches as $match) {
   // $match[2] = το URL που βρέθηκε στο A tag
   // $match[3] = το κείμενο που βρέθηκε στο A tag
   $isin = strpos($match[2], "dimitrisp.eu/blog"); //Εδώ μπαίνει το αρχικό link
   if ($isin !== FALSE) {
    $thislink = str_replace("http://dimitrisp.eu/blog", "", $match[2]); //Κι εδώ μπαίνει το αρχικό link... Θα μπορούσαμε να το τρέξουμε κατευθείαν, αλλα σώζει πόρους σε περίπτωση εκατοντάδων συνδέσμων.
    $thislink = str_replace(".html", "", $thislink); //Όπου .html, βάζουμε την κατάλληξη που είχαμε στα αρχεία του blog. Αν δεν είχε κατάλληξη, τότε απλά κάνουμε σχόλιο αυτή τη γραμμή.
    //Internal link detected... Post's slug is: $thislink
    $thislink = "http://blog.dimitrisp.eu/" . $thislink; // Όπου http://blog.dimitrisp.eu/, μπαίνει το καινούριο URL.
    $postbody = str_replace($match[2], $thislink, $postbody);
   }
  }
 }

Και επειδή φαίνεται χάλια εδώ, δείτε το στο Github!

Η χαρά της συνεργασίας με ανθρώπους με ευγνωμοσύνη

Όπως έγραψα σε προηγούμενη ανάρτηση, ανέλαβα να μεταφέρω το περιεχόμενο 2 blogs απο CommunityServer της Telligent, σε Wordpress. Η δουλειά αποδείχτηκε πιο δύσκολη απ'όσο περίμενα, αλλά έγινε ακόμα πιο γρήγορα απ'όσο υπολόγιζα.

Το αρχικό timeframe ήταν 2 εβδομάδες (απο τις 26 Οκτωβρίου μεχρι 8 Νοεμβρίου). Έπρεπε να υπολογίσω όλα τα προβλήματα που πιθανώς θα βρω, ακόμα και πιθανά κενά στις γνώσεις μου, οπότε αρχικά σκεφτόμουν για μήνα... Ζήτησα απο τον ιδιοκτήτη ένα αντίγραφο της βασης δεδομένων απο το ένα blog, και μετά απο λίγη ώρα το παρέλαβα, χωρίς να έχουμε συμφωνήσει ακόμα τίποτα.

Μετά απο μια πολύ γρήγορη ανάλυση, της οποίας προηγήθηκε αρκετό στήσιμο (δεν είχα Microsoft SQL Server εγκατεστημένο στο PC μου, οπότε έπρεπε να εγκαταστήσω ένα Virtual Machine και να βάλω Windows, SQL Server, και κάποια άλλα εργαλεία για να δουλέψω), είχα αποφασίσει οτι θα πω 2 εβδομάδες στον ιδιοκτήτη των blog (και για τα 2 blog, με συνολικά 1000+ αναρτήσεις, 2000+ σχόλια & trackbacks, 1000+ φωτογραφίες), και οτι θα μου δώσω μιάμιση βδομάδα για να το τελειώσω.

Το πρόβλημα; Έχω και δουλειά γραφείου 3 φορές την εβδομάδα, οπότε ήμουν ήδη εκτός προγράμματος :P

Χθες, Τρίτη 3 Νοεμβρίου 2015, του παρέδωσα το ένα blog, με όλες τις αναρτήσεις, τα σχόλια, τα tags και τις εικόνες. Αποτέλεσμα;


Χωρίς να του ζητήσω να με αναφέρει στο blog του, το έκανε. Η ανάρτηση βρίσκεται εδώ, και αυτή είναι η τελευταία παράγραφος. Στην προσωπική μας συνομιλία, οπου μιλάμε για την δουλειά, όχι απλά με ευχαρίστησε...

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

[Web Dev Issues #1] CommunityServer... Γιατι;

Ανέλαβα πρόσφατα να μεταφέρω 2 blogs απο Microsoft Telligent CommunityServer σε Wordpress. Το CommunityServer είναι μια πλατφόρμα φτιαγμένη σε ASP.net, C# & SQL Server με πάρα πολλές λειτουργίες, όπως πχ Blog, Wiki, Forum, Media Gallery... Τα 2 blog είναι βασισμένα στο blog κομμάτι του CommunityServer, και επειδή είναι πολύ παλιά έκδοση που δεν έχει export σε Blogml, έπρεπε να κάνω αλχημείες.

Αρχικά έπρεπε να εντοπίσω τον πίνακα που εχει όλες τις αναρτήσεις.... Κάτσε, το βρήκα! Είναι ο cs_Posts! Ναι αλλα γιατί έχει 3500 εγγραφές; Το blog έχει μόλις 1000 αναρτήσεις... Ω ναι, τα σχόλια αποθηκεύονται στον ίδιο πίνακα με τις υπολοιπες αναρτήσεις. Ναι αλλα ο άνθρωπος μου ζήτησε να του μεταφέρω και τα trackback. Που αποθηκεύονται αυτά; Καλά μαντέψατε, στον ίδιο πίνακα!

Πως διαφοροποιούνται; Έλα ντε... Κάτσε να δω... Υπάρχουν 1 πεδίο το οποίο στα entries -μεταξύ άλλων- trackbackName.. Χμ... Submittedusername... titleUrl... και λοιπά άλλα ωραία πραγματάκια τα οποία είναι χωρισμένα με ":". Οκ, αλλά τι είναι οι αριθμοί που έχει; τι πάει να πει "trackbackName:S:0:22:urlTitle:S:23:10"; Και που είναι τα λοιπά στοιχεία;

Μετά απο λίγο, παρατήρησα το επόμενο πεδίο στο οποίο τα entries ήταν της μορφής "http://www.url.url/urlDimitris P", και όλα ήταν ξεκάθαρα!
trackbackName:S:0:22 σημαίνει οτι στο πεδίο που αποθηκεύονται τα λοιπά στοιχεία, το string απο την θέση 0 και για 22 θέσεις ακόμα, είναι το URL.
urlTitle:S:23:10 απο την θέση 23 και για 10 θέσεις ακόμα είναι ο τίτλος της σελίδας.

Άρα είχα τον τρόπο για να εξάγω τις αναρτήσεις, τα σχόλια και τα trackbacks ξεχωριστά. Το έκανα. strpos, substr και Άγιος ο Θεός.

Γιατί ρε παιδιά; Το Wordpress μια χαρά τα έχει ταξινομημένα σε διαφορετικούς πίνακες... Οι αναρτήσεις και οι στατικές σελίδες είναι στον πίνακα wp_posts, και τα σχόλια μαζί με τα trackbacks είναι στον πίνακα wp_comments.

Το άλλο που δε μπορώ να καταλάβω στο CommunityServer είναι το εξής... Γιατί ονομάζεις τις κατηγορίες, tags? Και λέει κιόλας στο CommunityServer...

Below or keywords (tags) that you have used to categorize your posts.

Να γίνω και λίγο πιο κακός.. "Below or keywords..." Προφανώς εννοεί "Below are keywords..."

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

Παρασκευή 30 Οκτωβρίου 2015

[Android Dev Issues #1] "Συγχρονισμός" εγγραφών βάσης δεδομένων

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

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

Πρόβλημα #1: Αποστολή των επισκέψεων σε απομακρυσμένο διακομιστή, ωστε να τα βλέπει η εταιρεία.
- Δημιουργησα ένα απλό backend, το οποίο δέχεται την κάθε επίσκεψη με τις λεπτομέρειες που συμπλήρωσε ο πωλητής ως CSV string. Αφού λάβει το CSV string, το διαχωρίζει στις επιμέρους μεταβλητές του και το αποθηκεύει σε βάση δεδομένων. Το πρόβλημα λύθηκε.

Πρόβλημα #2: Αποστολή της ημερήσιας κατάστασης.
- Θα πρέπει να στείλω τα χιλιόμετρα έναρξης/λήξης. Δεν έχει σημασία αν θα έχουν φύγει όλες οι επισκέψεις. Το θέμα είναι οτι πρέπει να ενημερώνεται ο χειριστής στην εταιρεία με μήνυμα τύπου "ενδέχεται να μην έχουν σταλεί όλες οι επισκέψεις".

Πρόβλημα #3: Απολύσεις!
- Όπως σε όλες τις επιχειρήσεις αυτό τον καιρό, ο κάθε εργαζόμενος μπορεί να απολυθεί την οποιαδήποτε στιγμή. Θα πρέπει λοιπόν, να μην του δίνεται πρόσβαση εφ'όσον απολυθεί. Πρέπει να βάλω κάποιου είδους authentication, με το ID της συσκευής.

Global Πρόβλημα #1: Αναβαθμίσεις!
- Δεν είναι η μόνη εφαρμογή που φτιάχνω για την εταιρεία, οπότε θα πρέπει να κάνω και μια εφαρμογή-updater που να τρέχει στο background και να ελέγχει για updates. Επίσης θα πρέπει σε περίπτωση που απεγκατασταθεί η εφαρμογή απο τον πωλητή, να ενημερώνει την εταιρεία.

Θα επανέλθω με περισσότερες σκέψεις σε άλλο post.

Καλή Αρχή, version 2378396!

Είπα κι εγώ να κάνω άλλη μια προσπάθεια να φτιάξω ένα blog. Όσες φορές ξεκίνησα, το παράτησα, χωρίς κάποιο λόγο... Ίσως επειδή δεν είχα να γράψω κάτι αξιόλογο (με το μυαλό μου). Κατα κύριο λόγο, θα γράφω για τα προβλήματα που συναντάω στη δουλειά μου, καθώς και για μουσική & παιχνίδια.

Καλή αρχή λοιπόν :)