Για όσους δε γνωρίζουν, το NetBeans είναι ένα φανταστικό IDE, αρχικά για Java, αλλά αργότερα έγινε εξαιρετική επιλογή και για Web Development – είναι ένα πολύ δυνατό εργαλείο για προγραμματισμό σε PHP, αλλά και javascript, html5 κλπ. Υποστηρίζει όλες τις σύγχρονες βιβλιοθήκες, έχει ένα μεγάλο οικοσύστημα με plugins για συνεργασία με εξωτερικά εργαλεία (Bug trackers, version control systems, continuous integration systems κλπ) και φυσικά είναι open source.
Προφανώς θα είμαι εκεί, είναι μια ευκαιρία μεταξύ των άλλων για γνωριμία με ανθρώπους που μιλάμε εδώ και κάποια χρόνια στην κοινότητα του Netbeans (εδώ και κάποια χρόνια συμμετέχω σταθερά στην ομάδα NetCat που κάνει όλο το testing του NetBeans).
Παραθέτω την ανακοίνωση. Για περισσότερες πληροφορίες και δήλωση συμμετοχής κάντε κλικ εδώ.
Οι ημερίδες NetBeans λαμβάνουν χώρα σε διάφορες χώρες ανά τον κόσμο, από το JavaOne2014, όπου συνελήφθη η ιδέα. Πρόκειται για θέματα που αφορούν το NetBeans IDE και την πλατφόρμα NetBeans Rich Client, καθώς και τη γλώσσα προγραμματισμού Java (αλλά και άλλες γλώσσες που υποστηρίζονται από το NetBeans).
Η Κοινότητα του NetBeans σε συνεργασία με τον Κόμβο Καινοτομίας και Επιχειρηματικότητας της Τεχνόπολης Δήμου Αθηναίων, σας προσκαλούν στις 26 Αυγούστου σε μια ελεύθερη εκδήλωση σχετικά με το NetBeans IDE και την πλατφόρμα NetBeans Rich Client. Θα έχετε την ευκαιρία να ενημερωθείτε για τις τελευταίες εξελίξεις σχετικά με το NetBeans IDE και την πλατφόρμα NetBeans από ειδικούς του χώρου.
Πριν από λίγο καιρό προμηθεύτηκα ένα ASICMiner Block Erupter από το eBay. Πρόκειται για μια πολύ απλή συσκευή η οποία βοηθάει στο mining για bitcoins. Όχι ότι θα βγάλει ποτέ λεφτά (πλέον για να βγάλει κανείς λεφτά με bitcoing mining πρέπει να κάνει πολύ μεγάλες επενδύσεις, αφού η δυσκολία είναι τεράστια), αλλά έχει πλάκα σαν χόμπι, και μέσω ebay βρίσκεις τέτοιες συσκευές γύρω στα 20 ευρώ το κομμάτι.
Αφού το δοκίμασα μερικές μέρες στα Windows με το cgminer, ήρθε η ώρα να μετακομίσει στον server του ενυδρείου.
Η εγκατάσταση ήταν υπερβολικά εύκολη. Έβαλα το stick σε μια από τις θύρες του netbook, και έδωσα τις παρακάτω εντολές:
yum install libcurl-devel libudev-devel
(απαραίτητα πακέτα για να γίνει μετά το compile)
cd /rootgit clone https://github.com/ckolivas/cgminercd cgminer./autogen.sh./configure --enable-icarusmake install
και τρέχει με την εντολή cgminer. Τόσο απλά.
Από εκεί και πέρα, για να μην ασχολούμαι καθόλου μαζί του, έπρεπε να το μετατρέψω σε service ώστε να τρέχει μόνο του. Αρχικά, από το ίδιο το cgminer αποθηκεύουμε τα settings που έχουμε επιλέξει στο αρχείο /etc/cgminer.conf.
Μετά δίνουμε: vim /etc/init.d/cgminer για να δημιουργήσουμε ένα script για το service και μέσα paste:
#!/bin/sh## cgminer Mine bitcoins using cgminer## chkconfig: 345 20 80# description: Starts and stops cgminer to mine for \# bitcoins### BEGIN INIT INFO# Provides: cgminer# Required-Start: $local_fs $network $remote_fs# Required-Stop: $local_fs $network $remote_fs# Default-Start: 3 4 5# Default-Stop: 0 1 2 6# Short-Description: Bitcoin miner# Description: Mine bitcoins using cgminer### END INIT INFO# Source function library.. /etc/rc.d/init.d/functionsexec="/usr/local/bin/cgminer"prog="cgminer"config="/etc/cgminer.conf"args=" --config /etc/cgminer.conf"[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$proglockfile=/var/lock/subsys/$progstart() { [ -x $exec ] || exit 5 [ -f $config ] || exit 6 echo -n $"Starting $prog: " # if not running, start it up here, usually something like "daemon $exec" daemon $exec $args retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval}stop() { echo -n $"Stopping $prog: " # stop it here, often "killproc $prog" killproc $prog retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval}restart() { stop start}reload() { restart}force_reload() { restart}rh_status() { # run checks to determine if the service is running or use generic status status $prog}rh_status_q() { rh_status >/dev/null 2>&1}case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 restart ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}" exit 2esacexit $?
Αλλάζουμε permission με chmod 0755 /etc/init.d/cgminer και το service μας είναι έτοιμο. Θα έλεγα καλά κέρδη, αλλά δεν… οπότε, καλή διασκέδαση 😀
Έχω ένα 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.
για να ορίσουμε το 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. Δίνουμε:
Αποθηκεύουμε, και πηγαίνουμε να επεξεργαστούμε και το 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 που ήθελα να ξεκινήσω από καιρό ήταν να στήσω ένα μικρό linux server στο σπίτι, το οποίο θα ξεκούραζε τον βασικό μου υπολογιστή που έχω διαρκώς ανοιχτό, και να περιέχει όλα τα development tools που χρειάζομαι (git repositories, apache/mysql περιβάλλον για δοκιμές, αποθετήριο αρχείων για τη δουλειά και backup server), αλλά και μερικά που ήθελα να προσθέσω (Jenkins continius intergration server κ.α.).
Φυσικά το μεγαλύτερο πρόβλημα που υπάρχει όταν θέλεις να υλοποιήσεις ένα τέτοιο project είναι ο χρόνος. Βρήκα τελικά την ευκαιρία λίγο πριν τον δεκαπενταύγουστο, αφού όλοι οι πελάτες και συνεργάτες ήταν εκτός, ενώ εγώ πηγαίνω πάντα διακοπές το Σεπτέμβρη.
Η ιδέα ήταν πάντα να στήσω τον server σε κάποιο παλιό υπολογιστή. Τελικά η λύση ήρθε με ένα παλιό netbook acer aspire one, το οποίο αν και με βόλεψε για αρχή στη χρήση του, λίγους μήνες μετά την αγορά του ήταν ήδη τόσο απαρχαιωμένο τεχνικά που με δυσκόλευε στη δουλειά πάρα πολύ.
Τα πλεονεκτήματα του για home server όμως είναι πάρα πολλά:
Πολύ οικονομικό σε ανάγκες τροφοδοσίας
Τελείως αθόρυβο
Η μπαταρία του το κρατάει ανοιχτό μετά από αρκετά μεγάλη διακοπή ρεύματος, χωρίς την ανάγκη ups (αν και κάποια στιγμή η μπαταρία σίγουρα θα πεθάνει)
Πολύ μικρό και κρύβεται εύκολα
Τα τεχνικά χαρακτηριστικά είναι αρκετά καλύτερα από ενός φθηνού vps. Με 1GB Ram, 160GB και ένα αξιοπρεπέστατο atom επεξεργαστή, μπορώ να τρέξω πολύ περισσότερα πράγματα από αυτά που χρειάζομαι, χωρίς να χάσω σε σταθερότητα
Φυσικά έχει ενσωματωμένο wifi και lan port
Πριν ξεκινήσω το project, έπρεπε να αποφασίσω μερικά πρακτικά θέματα: που θα είναι το μηχάνημα, πως θα τροφοδοτείται και πως θα έχει πρόσβαση στο δίκτυο. Η λύση ήρθε εύκολα από ένα άλλο home project που είχα ξεκινήσει πριν από καιρό, τελείως άσχετο (αρχικά) με υπολογιστές: ένα ενυδρείο!
Βασικά πρόκειται (όπως θα δείτε στις φωτογραφίες) για ένα αρκετά μεγάλο ενυδρείο, το οποίο σαν βάση έχει το δικό του έπιπλο με ντουλάπια και θέσεις για τον δικό του εξοπλισμό (αεραντλίες, χρονοδιακόπτες, φίλτρα), και φυσικά έχει και τα πολύμπριζα που χρειάζομαι για την τροφοδοσία του netbook. Έτσι η αρχική ιδέα ήταν να βάλω το netbook μέσα στο ντουλάπι με τον υπόλοιπο εξοπλισμό.
Αυτή η ιδέα δεν πήγε πολύ καλά, γιατί στο ντουλάπι επικρατεί πολύ ζέστη και δεν υπάρχει επαρκής αέρας, με αποτέλεσμα όταν θέλω να κάνω κάτι βαρύ με το netbook, αυτό να ζεσταίνεται υπερβολικά και να σβήνει. Η τελική λύση ήταν να εκμεταλλευτώ ένα μικρό κενό που υπάρχει δίπλα στο ενυδρείο, ανάμεσα σε αυτό και τον τοίχο του δωματίου, που αερίζεται επαρκώς, έχει πρόσβαση σε όλα τα καλώδια του ενυδρείου και δεν φαίνεται καθόλου.
Η σύνδεση στο τοπικό δίκτυο γίνεται μέσω wifi, αφήνοντας το καλώδιο ελεύθερο για επόμενο project.
Η Αρχική Εγκατάσταση
Φυσικά ξεκινάμε με την εγκατάσταση του 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, χωρίς 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.
Αν έχετε κάποιο μηχάνημα που περισσεύει και λίγο (ή πολύ) χρόνο, δοκιμάστε το!
Επιτέλους, σχεδόν 2 μήνες μετά (μου τα είχαν στείλει από τέλη Δεκέμβρη), ήρθε το πακέτο που περίμενα από την Oracle.
Ουσιαστικά είναι το δώρο που κάνουν σε όσους συμμετέχουν ενεργά στο πρόγραμμα netcat. Ένα πιστοποιητικό συμμετοχής (με τα στατιστικά του τι έκανες), δύο μπλουζάκια με το σήμα του netbeans και ένα στυλό. Τίποτα σημαντικό δηλαδή.
Όμως έχουν κάποια συναισθηματική αξία, αφού ξέρεις ότι είναι ένα ευχαριστώ προς την κοινότητα του Netbeans. Παράλληλα δίνουν και κίνητρο ώστε να ασχοληθείς ακόμα πιο ενεργά.
Αυτή η κυκλοφορία μου έδωσε ιδιαίτερη χαρά, αφού για πρώτη φορά δούλεψα με την κοινότητα του στην ομάδα Netcat, κάνοντας καθημερινά δοκιμές στις daily builds που μας έδιναν οι developers και ψάχνοντας για bugs. Συγκεκριμένα ήμουν στην ομάδα που έκανε τις δοκιμές της php έκδοσης σε mac.
Η εμπειρία ήταν πολύ καλή, η επικοινωνία με την ομάδα που έκανε την ανάπτυξη αλλά και τους άλλους testers εξαιρετική και γενικά το οργανωμένο testing και bug reporting είναι μια εύκολη διαδικασία που μπορεί να ακολουθήσει κάποιος που θέλει να εμπλακεί με κάποιο ανοιχτό project χωρίς να έχει πολύ εξειδικευμένες τεχνικές γνώσεις. Αυτό που χρειάζεται ουσιαστικά είναι κάποιος χρόνος και μια σχετική συνέπεια, καθώς για την αξιολόγηση των builds υπάρχουν συγκεκριμένα deadlines και διαδικασίες που πρέπει να ακολουθήσεις.
Έχω σκοπό βέβαια να συνεχίσω την ενασχόληση μου με το συγκεκριμένο project, ίσως και πιο ενεργά. Για την ώρα περιμένω το δωράκι μου από την Oracle :p