Αρχείο κατηγορίας Περιπέτειες

Το Chrome κάνει αυτόματο redirect σε https για όλα τα .dev domains

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

Για το local development, χρησιμοποιώ virtual machines που τρέχουν με vagrant. Για να δουλέψω σε αυτά, στήνω ψεύτικα hosts (στο αρχείο htaccess) του τύπου “project.dev” ή “project.test”  και με αυτό τον τρόπο κάνω όλες τις δοκιμές μου εδώ και αρκετό καιρό.

Σήμερα λοιπόν προσπάθησα να ανοίξω ένα τέτοιο vm, έστω το “project.dev” και διαπίστωσα ότι δε φόρτωνε με τίποτα γιατί ο Chrome έκανε αυτόματα redirect στο https://project.dev – το οποίο δεν έπαιζε χωρίς certificate.

Αφού έχασα αρκετό χρόνο νομίζοντας ότι κάτι δεν πήγαινε καλά με το vm, τελικά βρήκα την αιτία εδώ: Chrome 63 forces .dev domains to HTTPS via preloaded HSTS.

Ο τρόπος που το κάνει είναι ότι έχει περάσει το .dev eTLD σε μια λίστα που έρχεται προφορτωμένη με τον Chrome με γνωστά site που χρησιμοποιούν το HSTS header (υπάρχει εδώ).

Η λύση που προτείνουν στο άρθρο που διάβασα είναι να αλλάξουν όλα τα vm και να χρησιμοποιούν άλλο eTLD (όπως π.χ. το .test που προανέφερα).

Happy coding

Το φίδι στο μπαλκόνι των Εξαρχείων

Σήμερα, την ώρα που έπινα το πρωί τον καφέ μου στη βεράντα, είδα σε γειτονική βεράντα κάτι που δεν περίμενα ποτέ να δω σε μια πολυκατοικία του κέντρου: ένα φίδι!
Αμέσως ειδοποίησα γείτονες καθώς και μια σχετική οργάνωση (ΑΝΙΜΑ) για να το μαζέψουν. Το φίδι όμως πρόλαβε και κρύφτηκε πολύ γρήγορα πίσω από μια γλάστρα κουλουριασμένο.
Μέχρι να έρθουν οι άνθρωποι της ΑΝΙΜΑ για να το μαζέψουν, χρειάστηκε να κάτσω για να προσέχω να μην φύγει(!!!), και έτσι μπορώ να βάλω πλέον στο βιογραφικό μου και το “φύλακας φιδιών”.

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

Εγκατάσταση πολλών εκδόσεων της php στον ίδιο server

php1Έχω ένα dedicated server στον οποίο τρέχω PHP 5.2, για λόγους συμβατότητας με κάποιες παλιές εφαρμογές. Πλέον όμως αυτή η έκδοση είναι ξεπερασμένη, οπότε έψαχνα να βρω μια λύση ώστε να τρέχω διαφορετικές εκδόσεις της PHP ανάλογα με το site.

Το cpanel/whm έχει πολύ ωραία εργαλεία για την αυτόματη εγκατάσταση της έκδοσης που θέλουμε και τα κάνει όλα να φαίνονται πολύ εύκολα, αλλά δυστυχώς επιτρέπει μόνο μια PHP έκδοση. Παρ’  όλα αυτά, σε πολλές hosting εταιρείες με cPanel, οι χρήστες μπορούν να αλλάζουν εκδόσεις της php μέσα από απλές εντολές στο .htaccess. Πως γίνεται αυτό;

Ψάχνοντας λίγο είδα ότι μπορείς ουσιαστικά να τρέξεις όσες διαφορετικές εκδόσεις της PHP θέλεις, αν την τρέχεις μέσω suPHP, CGI ή FastCGI. Ο server έτσι κι αλλιώς είναι στημένος με suPHP για λόγους ασφαλείας, οπότε τα πράγματα από εκεί και πέρα είναι σχετικά εύκολα.

Η ιδέα είναι ότι εγκαθιστούμε την κάθε έκδοση σε δικό της directory, και μετά για κάθε account λέμε ποια έκδοση της php θέλουμε να τρέξει, ή αν δεν το διευκρινίσουμε, τρέχει την default του cpanel (αν δεν το πειράξουμε και αυτό).

Ας πούμε λοιπόν ότι έχουμε στο server την 5.2.κάτι και θέλουμε να περάσουμε και την 5.5.3. Μέσω ssh κάνουμε login ως root και δίνουμε:

# cd /usr/src
# wget http://gr2.php.net/distributions/php-5.5.3.tar.gz
# tar xfz php-5.5.3.tar.gz
# cd php-5.5.3

Με άλλα λόγια, κατεβάζουμε το release που θέλουμε στο φάκελο /usr/src και το αποσυμπιέζουμε. Όλα τα αρχεία περνάνε στο φάκελο /usr/src/php-5.5.3.

Τώρα δίνουμε κάτι σαν:

# ./configure \
 --enable-bcmath \
 --enable-calendar \
 --enable-exif \
 --enable-ftp \
 --enable-gd-native-ttf \
 --enable-libxml \
 --enable-mbstring \
 --enable-pdo=shared \
 --enable-soap \
 --enable-sockets \
 --prefix=/opt/php55 \
 --with-bz2 \
 --with-config-file-path=/opt/php55/lib \
 --with-config-file-scan-dir=/opt/php55/lib/php.ini.d \
 --with-curl=/opt/curlssl/ \
 --with-freetype-dir=/usr \
 --with-gd \
 --with-gettext \
 --with-imap=/opt/php_with_imap_client/ \
 --with-imap-ssl=/usr \
 --with-jpeg-dir=/usr \
 --with-kerberos \
 --with-libxml-dir=/opt/xml2 \
 --with-libxml-dir=/opt/xml2/ \
 --with-mcrypt=/opt/libmcrypt/ \
 --with-mysql=/usr/ --with-libdir=lib64 \
 --with-mysql-sock=/var/lib/mysql/mysql.sock \
 --with-mysqli=/usr/bin/mysql_config \
 --with-openssl=/usr \
 --with-openssl-dir=/usr \
 --with-pcre-regex=/opt/pcre \
 --with-pdo-mysql=shared \
 --with-pdo-sqlite=shared \
 --with-png-dir=/usr \
 --with-pspell \
 --with-xpm-dir=/usr \
 --with-zlib \
 --with-zlib-dir=/usr

για να ορίσουμε το configuration με το οποίο θα γίνει η εγκατάσταση της php. Προφανώς αυτό το προσαρμόζει ο καθένας στα μέτρα του, οι διάφοροι παράμετροι ορίζουν ποια extensions της php θέλουμε να εγκαταστήσουμε κ.λ.π. Στις δικές μου επιλογές έχω ορίσει ότι η εγκατάσταση θα γίνει στον φάκελο /opt/php55.

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

# make

και μετά

# make install

Αν πάλι όλα πάνε καλά, έχουμε εγκαταστήσει τη νέα έκδοση της php στον κατάλογο /opt/php55.

Τώρα πρέπει να ρυθμίσουμε το αρχείο php.ini για αυτή την έκδοση. Ένα γρήγορο configuration είναι αυτό:

# cp php.ini-production /opt/php55/lib/php.ini

που αντιγράφει τις default ρυθμίσεις. Αν θέλουμε επιπλέον αλλαγές, μπορούμε να τις κάνουμε πειράζοντας αυτό το αρχείο:

# vi /opt/php55/lib/php.ini

Επόμενο βήμα είναι να ορίσουμε την php 5.5. σαν handler στο suPHP και στον apache. Δίνουμε:

# vi /opt/suphp/etc/suphp.conf

Προς το τέλος θα δείτε κάτι σαν:

application/x-httpd-php5="php:/usr/bin/php"

Ακριβώς κάτω από αυτό προσθέτουμε:

application/x-httpd-php55="php:/opt/php55/bin/php-cgi"

Αποθηκεύουμε, και πηγαίνουμε να επεξεργαστούμε και το configuration του apache

# vi /etc/httpd/conf/php.conf

Πάλι, κάπου προς το τέλος θα βρούμε κάτι σαν:  suPHP_AddHandler application/x-httpd-php5. Κάτω από αυτό, προσθέτουμε το:

suPHP_AddHandler application/x-httpd-php55

Κάνουμε και ένα restart στον apache και είμαστε έτοιμοι (στο centos δίνουμε # service httpd restart).

Τώρα, σε όποιο site θέλουμε να τρέξουμε τη νέα έκδοση της php, κάνουμε μια επεξεργασία στο .htaccess και προσθέτουμε πάνω – πάνω αυτή τη γραμμή:

AddHandler application/x-httpd-php55 .php

και πλέον το site θα τρέχει με τη νέα έκδοση της php.

Το επόμενο βήμα είναι βασικά να κάνουμε το αντίστροφο, η default έκδοση να είναι η 5.5 και κάποια site να μπορούν προαιρετικά να γυρίσουν στην 5.2, αλλά νομίζω ότι αυτό ήταν αρκετό για σήμερα 😀

Project: Aquarium Server

Ένα project που ήθελα να ξεκινήσω από καιρό ήταν να στήσω ένα μικρό linux server στο σπίτι, το οποίο θα ξεκούραζε τον βασικό μου υπολογιστή που έχω διαρκώς ανοιχτό, και να περιέχει όλα τα development tools που χρειάζομαι (git repositories, apache/mysql περιβάλλον για δοκιμές, αποθετήριο αρχείων για τη δουλειά και backup server), αλλά και μερικά που ήθελα να προσθέσω (Jenkins continius intergration server κ.α.).

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

Το netbook είχε βολέψει πάρα πολύ κάποτε λόγω μεγέθους. Αλλά, once you go mac... σταματάς να το χρησιμοποιείς.
Το netbook είχε βολέψει πάρα πολύ κάποτε λόγω μεγέθους. Αλλά, once you go mac… σταματάς να το χρησιμοποιείς.

Η ιδέα ήταν πάντα να στήσω τον server σε κάποιο παλιό υπολογιστή. Τελικά η λύση ήρθε με ένα παλιό netbook acer aspire one, το οποίο αν και με βόλεψε για αρχή στη χρήση του, λίγους μήνες μετά την αγορά του ήταν ήδη τόσο απαρχαιωμένο τεχνικά που με δυσκόλευε στη δουλειά πάρα πολύ.

Τα πλεονεκτήματα του για home server όμως είναι πάρα πολλά:

  • Πολύ οικονομικό σε ανάγκες τροφοδοσίας
  • Τελείως αθόρυβο
  • Η μπαταρία του το κρατάει ανοιχτό μετά από αρκετά μεγάλη διακοπή ρεύματος, χωρίς την ανάγκη ups (αν και κάποια στιγμή η μπαταρία σίγουρα θα πεθάνει)
  • Πολύ μικρό και κρύβεται εύκολα
  • Τα τεχνικά χαρακτηριστικά είναι αρκετά καλύτερα από ενός φθηνού vps. Με 1GB Ram, 160GB και ένα αξιοπρεπέστατο atom επεξεργαστή, μπορώ να τρέξω πολύ περισσότερα πράγματα από αυτά που χρειάζομαι, χωρίς να χάσω σε σταθερότητα
  • Φυσικά έχει ενσωματωμένο wifi και lan port

Πριν ξεκινήσω το project,  έπρεπε να αποφασίσω μερικά πρακτικά θέματα: που θα είναι το μηχάνημα, πως θα τροφοδοτείται και πως θα έχει πρόσβαση στο δίκτυο. Η λύση ήρθε εύκολα από ένα άλλο home project που είχα ξεκινήσει πριν από καιρό, τελείως άσχετο (αρχικά) με υπολογιστές: ένα ενυδρείο!

Το ενυδρείο. Το έπιπλο του είναι ιδανικό για να κρύψεις οτιδήποτε.
Το ενυδρείο. Το έπιπλο του είναι ιδανικό για να κρύψεις οτιδήποτε.

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

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

Η τελική θέση - έχω τραβήξει λίγο πιο έξω το netbook για να φαίνεται καθαρά.
Η τελική θέση – έχω τραβήξει λίγο πιο έξω το netbook για να φαίνεται καθαρά.

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

Η Αρχική Εγκατάσταση

Σύνδεση με SSH. Το ascii art δεν είναι πολύ καθαρό, είναι η γάτα μου :-)
Σύνδεση με SSH. Το ascii art δεν είναι πολύ καθαρό, είναι η γάτα μου 🙂

Φυσικά ξεκινάμε με την εγκατάσταση του Linux. CentOS, ώστε να ταιριάζει με το σύνηθες configuration που χρησιμοποιώ για hosting servers – άλλωστε αυτό είναι και το νόημα ενός δοκιμαστικού περιβάλλοντος. Το netbook δεν έχει CD drive, οπότε η εγκατάσταση έγινε από usb stick με χρήση του Universal USB Installer. Piece of cake 🙂

Η εγκατάσταση των πακέτων που χρειάζομαι για τον server ήταν πολύ εύκολη με τη χρήση του yum, και χρειάστηκε να αλλάξω το run level ώστε ο υπολογιστής να ανοίγει σε level 3 – χωρίς δηλαδή γραφικό περιβάλλον. Το γραφικό περιβάλλον όμως το άφησα εγκατεστημένο, ίσως χρειαστεί στο μέλλον (μπορεί π.χ. να θελήσω αργότερα να μπορώ να συνδέω το μηχάνημα στην τηλεόραση για σερφάρισμα).

Εκτός από τα βασικά (apache, mysql, php κλπ κλπ), εγκατέστησα το webmin και το virtualmin για ευκολότερη διαχείριση, καθώς και τον jenkins, ο οποίος τρέχει σαν ξεχωριστός server.

Τέλος, άνοιγμα ports από το iptables (το firewall του linux), και είμαστε έτοιμοι… για το τοπικό network. Όμως, υπάρχει ένα πρόβλημα: ένας άλλος λόγος που ήθελα να έχω ένα ξεχωριστό μηχάνημα με τα git repositories μου, είναι πως ήθελα να έχω πρόσβαση από μακριά.

Πρόσβαση από Μακριά

Το βασικό θέμα είναι ότι δεν έχω static ip. Και, αν και το router μου υποστηρίζει την αυτόματη σύνδεση σε dyndns, αυτή η υπηρεσία είναι πλέον εμπορική. Ευτυχώς όμως υπάρχει ανταγωνιστής: no-ip.com.

Το πρώτο βήμα είναι το δωρεάν registration και δημιουργία του πρώτου virtual host. Μετά, για να ενημερώνεται σωστά, κατέβασα το dynamic update client. Αυτό είναι ένα προγραμματάκι που κάθε μερικά λεπτά (όσο το ρυθμίσεις), ελέγχει ποια είναι η public ip του υπολογιστή και ενημερώνει την υπηρεσία για να ανανεώσει άμεσα το virtual host. Αυτό το ρύθμισα να τρέχει ως service στην έναρξη του υπολογιστή, και όλα καλά.

Επίσης, ήθελα ο υπολογιστής να απαντάει σε κάποιο ωραίο domain, όχι σε κάποιο no-ip.biz που κάθε φορά θα προσπαθώ να το θυμηθώ. Άλλωστε, μπορεί να θέλω να φιλοξενήσω πάνω από ένα site (όπως και κάνω) για τις δοκιμές μου. Ή, ένα ωραίο use case, αν θέλω να δείξω σε έναν πελάτη τη δουλειά που έχω σε εξέλιξη, θέλω να μπορεί να μπει σε κάποιο domain και δει – και δε θέλω να μπει σε κάποια no-ip διεύθυνση.

Η λύση εδώ έρχεται από ένα πραγματικό hosting server που έχω στημένο για τη δουλειά σε κάποιο datacenter. Πολύ απλά, μπήκα στο λογαριασμό ενός βασικού μου site και δημιούργησα στα dns του ένα cname record το οποίο οδηγεί κάποιο subdomain στο virtual host που μου δίνει η no-ip.

Π.χ., αν το domain μου ήταν toonomathsetairiasmoy.gr και το virtual host ήταν toenydriomou.no-ip.biz, έφτιαξα ένα cname toenydriomou.toonomathsetairiasmoy.gr -> toenydriomou.no-ip.biz. Με τον ίδιο τρόπο θα μπορούσα να στήσω οποιοδήποτε domain ή subdomain επιθυμώ, χωρίς να πληρώσω τίποτα επιπλέον, αφού έχοντας hosting server έχω και τον δικό μου dns server που εξυπηρετεί μια χαρά για τέτοια τρικ.

Τέλος, ρυθμίζουμε το Nat Server του router μας ώστε να προωθεί τα port που χρειαζόμαστε στην εσωτερική ip του netbook. Εννοείται βέβαια ότι χρειάζεται αρκετή προσοχή όσον αφορά το τι προωθούμε, τα permissions και τους κανόνες του iptables, καθώς πλέον έχουμε έναν υπολογιστή proxy μεταξύ του τοπικού δικτύου μας και του internet – με άλλα λόγια αν κάποιος αποκτήσει πρόσβαση σε αυτό, έχει πρόσβαση σε όλο το τοπικό δίκτυο.

Ένα πρόβλημα που μπορεί να αντιμετωπίσετε είναι το ότι πολλά φθηνά router (όπως αυτά που δίνει δωρεάν ο ΟΤΕ), δεν υποστηρίζουν τη λειτουργία NAT Loopback. Τι σημαίνει αυτό; Από οποιαδήποτε απομακρυσμένη τοποθεσία, αν χτυπήσετε το domain που δημιουργήθηκε στα προηγούμενα βήματα, όλα λειτουργούν όπως πρέπει. Αν όμως το χτυπήσετε εντός του εσωτερικού δικτύου, θα δείτε τη σελίδα ρυθμίσεων του router. Θεωρητικά αυτό θα σήμαινε ότι απλά χτυπώντας την εσωτερική ip του netbook θα έβλεπα ότι ήθελα, αλλά επειδή στο netbook τρέχω αρκετά apache virtual servers ώστε να έχω διαφορετικά domains, η σκέτη ip δε σημαίνει τίποτα. Η μόνη λύση που σκέφτηκα για αυτό ήταν να κάνω αλλαγές στα αρχεία hosts των υπολογιστών μου. Π.χ. στο desktop υπολογιστή μου που τρέχει windows 8, πρόσθεσα στο αρχείο c:\windows\system32\drivers\etc\hosts μια εγγραφή για κάθε domain που φιλοξενεί το netbook, με την ip του netbook. Αυτό βολεύει στους σταθερούς υπολογιστές που δε συνδέονται σε άλλα δίκτυα, στο macbook μου όμως που το χρησιμοποιώ έξω, ήθελα κάτι πιο απλό. Η λύση ήταν μια μικρή εφαρμογή, το Gas Mask, το οποίο επιτρέπει να έχω διαφορετικές εκδόσεις του αρχείου hosts, τα οποία να αλλάζω αναλόγως με τη δουλειά μου, εύκολα και γρήγορα.

Συγχρονισμός Εργασίας

Πλέον έχουμε ένα πλήρως λειτουργικό server με τα όλα του. Συνδεόμαστε για διαχείριση μέσω ssh (ή του webmin), δημιουργούμε sites με το virtualmin, και το καθένα έχει τις δικές του βάσεις, τα δικαιώματα του στην php, ftp service για να ανεβάζουμε αρχεία κ.λ.π. Επίσης τρέχουμε και μια σειρά από git repositories, στα οποία μπορώ να συνδεθώ από οπουδήποτε μέσω ssh.

Για λόγους ευκολίας όμως ήθελα και κάτι άλλο. Σε όλους τους υπολογιστές που κάνω development, τρέχω μεταξύ των άλλων το dropbox, το οποίο περιέχει τον φάκελο με όλα τα τρέχοντα project μου, ώστε να κάνω αλλαγές από οπουδήποτε, χωρίς να κάνω checkout από το git πάντα (ιδίως όταν σε ένα project δουλεύω μόνος μου ή οι συνεργάτες δεν έχουν git, οπότε η δουλειά γίνεται μόνο μέσα από το dropbox). Ήθελα αυτός ο φάκελος να συγχρονίζει με το netbook και ότι δουλεύω να υπάρχει αυτόματα σε κάποιο δοκιμαστικό περιβάλλον.

Αρχικά αναρωτιόμουν αν μπορεί να γίνει, γιατί είχα στο μυαλό μου ότι το dropbox λειτουργεί σε γραφικό περιβάλλον. Όμως ψάχνοντας λίγο είδα ότι έκανα λάθος:

Το dropbox τρέχει ως service, για κάθε χρήστη που το χρησιμοποιεί. Το γραφικό περιβάλλον (προφανώς), απλά δίνει εντολές στο service. Και επειδή προφανώς δεν είμαι ο μόνος με τέτοια ανάγκη, το dropbox παρέχει το dropbox cli, ένα python script που δίνει πρόσβαση σε όλες τις λειτουργίες του service μέσα από τη γραμμή εντολών. Πολύ σύντομα, και με λίγες εντολές, έφτιαξα ένα νέο account στο server, με δικό του subdomain, όρισα να συγχρονίζει μόνο με ορισμένους φακέλους (δεν ήθελα να τραβήξω τα πάντα από το dropbox), και μια μια μικρή αλλαγή στο configuration του apache, όρισα αυτό το φάκελο ως πηγή για τον apache. Έτοιμο και αυτό.

Επιπλέον Λειτουργίες

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

Κάμερα Ενυδρείου

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

Η κάμερα - για την ώρα κολλημένη με ταινία, αλλά θα αλλάξει σύντομα.
Η κάμερα – για την ώρα κολλημένη με ταινία, αλλά θα αλλάξει σύντομα.

Απλά πράγματα: Προσάρμοσα μια φθηνή webcam στο ενυδρείο, η οποία δείχνει όλο το εσωτερικό. Σύνδεσα τη webcam στο netbook και άρχισα να κάνω stream την εικόνα, ώστε να μπορώ πάντα και από παντού να δω την κατάσταση του ενυδρείου μου. Εκτός από το χάζεμα, αυτό έχει και μια πρακτική αξία: Όταν λείπω για κάποιες μέρες από το σπίτι, το ενυδρείο έχει σύστημα για αυτόματο τάϊσμα, αλλά δεν έχω κανένα τρόπο να γνωρίζω αν τα ψάρια είναι ok και όλα πηγαίνουν καλά. Αν κάποιο ψάρι αρρωστήσει και πεθάνει, αν μείνει στο ενυδρείο, μολύνει τα πάντα και σύντομα αντί για ενυδρείο συντηρείς ένα υδρόβιο νεκροταφείο. Βλέποντας λοιπόν από μακριά την κατάσταση, μπορώ αν χρειαστεί να ειδοποιήσω κάποιον φίλο μου να βάλει χέρι και να σώσει την κατάσταση.

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

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

Ο φωτισμός του ενυδρείου λειτουργεί με χρονοδιακόπτες που ανάβουν και σβήνουν σταδιακά τα φώτα σε συγκεκριμένες ώρες. Όταν σβήνουν, και για όσο είναι μέρα, το εσωτερικό του ενυδρείου είναι ακόμα ορατό, αλλά πολύ λιγότερο, ενώ όταν νυχτώνει πρακτικά η κάμερα αχρηστεύεται. Δεν υπάρχει λόγος λοιπόν να κάνει κάποιος stream μια μαύρη εικόνα, σωστά; Μια πολύ γρήγορη λύση λοιπόν ήταν 2 απλά cron job, τα οποία ενεργοποιούν και απενεργοποιούν το service του streaming τις ώρες που θέλω. Και αν για οποιοδήποτε λόγο χρειαστεί να μπω άλλη ώρα, απλά ενεργοποιώ το service μέσω ssh.

Πείτε γεια στο αγγελόψαρο...
Πείτε γεια στο αγγελόψαρο…

Το θέμα του streaming ήταν λίγο πολύπλοκο. Για να λειτουργήσει σωστά έπρεπε να εγκαταστήσω τον ffserver με διάφορους codecs κλπ, και να το ρυθμίσω να τρέχει ως service. Η εγκατάσταση έγινε και πάλι με το yum. Για να τρέξει σωστά δημιουργούμε ένα .conf αρχείο που περιγράφει το τι θέλουμε να περιέχει το stream και ποιος έχει πρόσβαση. Εγώ π.χ. δημιούργησα 3 διαφορετικά stream:

  • ένα χαμηλής ανάλυσης και framerate (ένα καρέ/sec), σε mjpeg format, δημόσιο παντού, ώστε να μπορώ αν θέλω να το κάνω embed σε κάποιο site
  • ένα υψηλής ανάλυσης, με ήχο και καλύτερη framerate (5 καρέ / sec), κλειδωμένο στο εσωτερικό δίκτυο και
  • ένα html stream (!) το οποίο ουσιαστικά μου δείχνει την κατάσταση του stream server – και αυτό μόνο από το εσωτερικό δίκτυο.

Για να λειτουργήσουν όλα αυτά, χρειάζεται επίσης και τη σωστή εντολή, την οποία εγώ την μετέτρεψα σε service. Κάτι σαν:

ffserver -loglevel quiet -f /etc/ffserver.conf & ffmpeg -v 2 -f video4linux2 -i /dev/video0 -f alsa -ac 1 -i hw:1 http://localhost:8090/aquarium.ffm &

δηλαδή, τρέχει τον ffserver, χωρίς logs, με τις ρυθμίσεις που έχω ορίσει στο ffsserver.conf. Τραβάει το video από τη συσκευή /dev/video0, δηλαδή την usb camera όπως τη βλέπει αυτόματα το linux, και τον ήχο μέσω alsa από την αντίστοιχη συσκευή. Όλα αυτά τα δημοσιεύει στην διεύθυνση που έχω καθορίσει. Το & στο τέλος, λέει στο bash να τρέξει το service στο background. Το μετέτρεψα σε service φτιάχνοντας αντίστοιχα ένα αρχείο /etc/init.d/ffserver. Για λεπτομέρειες σχετικά με αυτό… google it 🙂

Το επόμενο project που έχω στο μυαλό μου θα κάνει την κατάσταση λίγο καλύτερη: Θα αφαιρέσω τελείως τα timers από τα φώτα. Είναι αναλογικά, και μετά από κάποιο διάστημα ή μετά από διακοπές ρεύματος, χάνουν τον συγχρονισμό τους και πρέπει να τα ρυθμίσεις ξανά. Στη θέση τους θα εγκαταστήσω controllers που θα ελέγχονται από το netbook. Έτσι θα είναι πάντα σωστά στην ώρα τους, ενώ θα μπορώ να τα χειριστώ και από απόσταση, η να προσθέσω επιπλέον αυτοματισμούς. Σε συνδυασμό με κάποιους αισθητήρες (θερμοκρασία, στάθμη νερού), μπορώ να έχω έναν αρκετά καλό έλεγχο από μακριά. Φυσικά, όταν γίνει αυτό, θα ακολουθήσει άλλο αναλυτικό post.

Proxy Server

Μέσα στο δίκτυο του σπιτιού έχω πάρα πολλές συσκευές για browsing (ipad, laptops, κινητά κλπ), τα οποία δεν τρέχουν κάτι ιδιαίτερο, αλλά όλα μαζί επιβαρύνουν τη σύνδεση μου αρκετές φορές, ειδικά αν έχω φιλοξενούμενους.

Η γρήγορη λύση: squid server. Proxy server, μπορείς να κασάρεις τα πάντα, με αποτέλεσμα να κάνεις λιγότερα πραγματικά request προς το internet και σώζεις αρκετό bandwidth. Ρυθμίζω όλες τις δευτερεύουσες συσκευές να βλέπουν τον proxy, και μόνο τα μηχανήματα της δουλειάς να βλέπουν απ΄ευθείας το router μου.

Μελλοντικά Project

  • Κάτι άμεσο είναι να χρησιμοποιήσω την ελεύθερη ethernet port του netbook για να συνδέσω ένα παλιό wireless access point που έχω. Θα δημιουργήσω ένα ελεύθερο wireless δίκτυο (χωρίς κωδικούς), για χρήση από τους φιλοξενούμενους ή και τους γείτονες. Δεν θα έχει πρόσβαση στο εσωτερικό μου δίκτυο (θα χρησιμοποιεί διαφορετικό subnet), θα έχει περιορισμούς σε bandwidth και υπηρεσίες, και φυσικά θα έχει και τον proxy του. Το Delta Hacker έχει ένα ωραίο tutorial για τέτοιες δουλειές μέσω του pfsense, κάτι τέτοιο έχω στο μυαλό μου, αλλά θέλω να το υλοποιήσω με το CentOs. Είναι και ωραίο για πειραματισμούς.
  • Αυτοματισμοί για το ενυδρείο (όπως λέω πιο πάνω).
  • Μια άλλη ιδέα στα πλαίσια του πειραματισμού είναι μια δεύτερη webcam συνδεμένη στο netbook, η οποία ελέγχει τον χώρο (security δηλαδή). Η διαφορά είναι ότι αυτή η κάμερα θα ενεργοποιείται με την κίνηση και θα καταγράφει για κάποιες μέρες. Παράλληλα, το αρχείο της καταγραφής μπορεί να ανεβαίνει σε κάποια online υπηρεσία (dropbox;), ώστε αν κάποιος μπει και κλέψει το netbook, η καταγραφή δεν θα χάνεται. Ίσως αυτό να τρέξει σε κάποια άλλη συσκευή τοποθετημένη αλλού (π.χ. ένα raspberry pi στο πατάρι), αλλά το στήσιμο είναι πολύ κοντινό.
  • Χρήση ως NAS. Στο σπίτι υπάρχουν διάφοροι σκληροί δίσκοι που έχω παρατήσει για μεγαλύτερους. Λέω να συνδέσω κάποιον στο netbook μέσω usb, ο οποίος θα μπορεί να τραβάει backups, να κρατάει media files για προβολή από την τηλεόραση (μέσω DLNA;), το βράδυ να ανεβάζει/κατεβάζει torrents κ.λ.π. – έτσι δεν θα έχω κανένα λόγο να αφήνω ανοιχτό άλλο υπολογιστή το βράδυ.
  • Δημιουργία VPN – έτσι θα έχω καλύτερη πρόσβαση στο εσωτερικό μου δίκτυο, με μεγαλύτερη ασφάλεια, ενώ όταν χρειάζεται θα μπορώ με το laptop να μπαίνω σε υπηρεσίες χωρίς να φοβάμαι ότι κάποιος παρακολουθεί μια δημόσια σύνδεση. Πάλι το Delta Hacker έχει ένα ωραίο tutorial σε ένα από τα πρώτα τεύχη.

Συμπέρασμα

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

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

Αν έχετε κάποιο μηχάνημα που περισσεύει και λίγο (ή πολύ) χρόνο, δοκιμάστε το!

pcre.backtrack_limit

Σε ένα από τα project που δουλεύω, έχω φτιάξει ένα μικρό parser για τα templates. Ουσιαστικά έχει διάφορα conditions (π.χ. ISHOME αν είναι η αρχική σελίδα, REGISTERED αν ο χρήστης έχει κάνει login κλπ). Αυτά τρέχουν με regular expressions απλά και γρήγορα.

Όλα δούλευαν ρολόι, μέχρι που σε κάποιο template ένα από τα regular expression σταμάτησε να δουλεύει, χωρίς όμως κάποιο notice, warning ή error. Μάλιστα αυτό γίνονταν μόνο στο laptop μου και όχι στον desktop υπολογιστή.

Μετά από λίγο σκάλισμα, αποφάσισα να τρέξω την preg_last_error() ώστε να δω αν υπάρχει κάποιο λάθος που για κάποιο λόγο δεν εμφανίζεται στα warnings της php. Και είχα δίκιο, η εντολή μου επέστρεφε την τιμή 2 που ισούται με το PREG_BACKTRACK_LIMIT_ERROR, κάτι που δεν μου είχε ξανατύχει.

Ψάχνοντας λίγο ακόμα, βρήκα την ρύθμιση pcre.backtrack_limit που υπάρχει από την PHP 5.2, και στις τελευταίες εκδόσεις η προεπιλογή είναι 1000000, αλλά πριν την 5.3.7 ήταν το ένα δέκατο (100000).

Στο συγκεκριμένο template που έτρεχα, είχα ένα πολύ μεγάλο κομμάτι html κώδικα μέσα σε ένα tag [ISHOME][/ISHOME]. Επειδή ήταν πολύ μεγάλο, αυτό το συγκεκριμένο όριο χτυπούσε και σταματούσε την εκτέλεση του regular expression, χωρίς όμως να χτυπάει ο υπόλοιπος κώδικας. Και ο λόγος που γίνονταν μόνο στο laptop είναι ότι έτρεχα πιο παλιά έκδοση της php.

Η λύση βέβαια ήταν κάτι τόσο απλό:

ini_set('pcre.backtrack_limit', '1000000');

και για να έχω και τη συνείδηση μου ήσυχη, το έκανα τελικά κάπως έτσι:

$backtrack_limit = ini_get('pcre.backtrack_limit');
 if ($backtrack_limit < 1000000){
 ini_set('pcre.backtrack_limit', '1000000'); 
 }
// εδώ μπήκε ο κώδικας με τα regular expressions
ini_set('pcre.backtrack_limit', $backtrack_limit);

Αν ποτέ αντιμετωπίσετε κάτι ανάλογο, αυτή είναι μια λύση.