μερικά tweaks για ubuntu 12.10

Ubuntu-tweak

Ένα εργαλείο που κάνει τις ρυθμίσεις παιχνιδάκι ακόμα και για αρχάριους χρήστες.

Για εγκατάσταση δώστε τα παρακάτω στο terminal:




sudo add-apt-repository ppa:tualatrix/ppa 
sudo apt-get update
sudo apt-get install ubuntu-tweak

Compiz

Θέλετε ωραία εφέ σε παράθυρα και στην επιφάνεια εργασίας? τότε χρειάζεστε το compiz settings manager, για εγκατάσταση δώστε το παρακάτω στο terminal:






sudo apt-get install compizconfig-settings-manager compiz-plugins-extra 

Synaptic Package Manager

Tα ubuntu 12.04/12.10 δεν έχουν τον synaptic προεγκατεστημένο και χρειάζεται να τον κατεβάσετε, μπορείτε να το κάνετε αυτό δίνοντας την παρακάτω γραμμή στο terminal:





sudo apt-get install synaptic

Βγάλτε το Global Menu

Για να βγάλετε το global menu από τα ubuntu 12.10 δώστε την παρακάτω γραμμή στο terminal:




 sudo apt-get autoremove appmenu-gtk appmenu-gtk3 appmenu-qt

Hardware drivers

Στα ubuntu 12.10 η τοποθεσία των extra driver έχει αλλάξει για αυτό εάν θέλετε να κάνετε την όποια αλλαγή πρέπει να πάτε στο Applications/System Tools/System Settings/Software sources και στην τελευταία καρτέλα λέει "Additional Drivers" και από εκεί μπορείτε να κάνετε τις αλλαγές που επιθυμείτε.

SSH server και google authenticator

Οι περισσότεροι από εμάς πιστεύω πως έχουν στην κατοχή τους ένα smartphone. Η google πρόσφατα έκανε το application καθώς και την εφαρμογή για servers που είχε για το two way verification, ονόματι google authenticator, open source.
Επίσης πλέον όλο και περισσότερος κόσμος αρχίζει να έχει πρόσβαση σε ένα δικό του server μέσω SSH και ειδικότερα όταν αυτός ο υπολογιστής μπορεί να είναι το Desktop σου ζητάς ένα παραπάνω επίπεδο ασφάλειας.

Τώρα θα μου πείτε τι σχέση έχουν αυτά τα δύο μεταξύ τους;
Θα προσπαθήσω να σας δείξω σε αυτό το άρθρο πως να εγκαταστήσετε το SSH-Server στο desktop σας καθώς και πώς να το θωρακίσετε χρησιμοποιώντας εκτός από τον κωδικό σας και ένα verification code το οποίο γίνεται generate στο κινητό σας και αλλάζει σε τακτά χρονικά διαστήματα.

Εφόσον έχουμε κάνει την εγκατάσταση του ssh-server, για ubuntu διανομές αρκεί να τρέξουμε στην κονσόλα το παρακάτω :

sudo apt-get install openssh-server

Θα χρειαστεί να εγκαταστήσουμε και το google-authenticator. Για να γίνει αυτό πάλι στην περίπτωση ubuntu τρέχουμε τις εντολές:

sudo apt-get install libpam-google-authenticator

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

Αρχικά θα ρυθμίσουμε το google authenticator και το κινητό μας για να δημιουργηθεί η απαραίτητη βάση για να προχωρήσουμε. Μην ξεχάσουμε ότι στο κινητό μας θα πρέπει να υπάρχει η εφαρμογή(την εγκαθιστάμε από το Play Store).
Αρχικά οι παρακάτω ρυθμίσεις στον υπολογιστή μας θα πρέπει να γίνουν από τον χρήστη στον οποίο θα συνδεόμαστε μέσω του SSH.
Γράφουμε την εντολή:

google-authenticator

Και στις παρακάτω ερωτήσεις απαντάμε σύμφωνα με το επίπεδο ασφάλειας που θέλουμε να έχουμε. Μπορούμε να ρυθμίσουμε το τρόπο ανανέωσης του παραγόμενου κωδικού, τον αριθμό των προσπαθειών καθώς και άλλα.
Έπειτα θα εμφανιστούν στην οθόνη μας το μυστικό κλειδί που πρέπει να βάλουμε στην εφαρμογή του κινητού μας, καθώς και πέντε κωδικοί ανάγκης σε περίπτωση που χάσουμε το κινητό μας. Επίσης την εισαγωγή του κλειδιού στο κινητό μπορούμε να την κάνουμε απλά σκανάροντας ένα QR code που μας παρέχεται.
Βάζουμε το μυστικό κλειδί στην εφαρμογή του κινητού μας,γράφουμε τους κωδικούς ανάγκης που είναι μίας χρήσης ο κάθε ένας και μπορούμε πλέον να κλείσουμε το session του τερματικού.
Αν πήγαν όλα καλά τώρα στο κινητό μας έχουμε ένα κωδικό που ανανεώνεται συχνά και ο οποίος είναι ο δεύτερος κωδικός εκτός από τον κωδικό χρήστη για μία περίοδο συνεδρίας SSH.

Για να γίνει η σύνδεση του authenticator με το SSH μας πρέπει να πειράξουμε το αρχείο με τις ρυθμίσεις του SSH. Στην περίπτωση μας είναι το αρχειο /etc/pam.d/sshd    οπότε και εκτελούμε το:

sudo nano /etc/pam.d/sshd

Εκεί χωρίς να κάνουμε καμία άλλη αλλαγή προσθέτουμε την γραμμή:
auth required pam_google_authenticator.so


Μετά ανοίγουμε το αρχείο /etc/ssh/sshd_config , πάλι με το nano

sudo nano /etc/ssh/sshd_config

Και αλλάζουμε την γραμμή         ChallengeResponseAuthentication           σε
                        ChallengeResponseAuthentication yes

Τέλος κάνουμε restart τον ssh server μας:

sudo service ssh restart 


Δείτε και μόνοι σας ότι δουλεύει, γράφοντας:
ssh 127.0.0.1  

Θα δείτε ότι θα σας ζητηθεί και Verification code αν όλα έχουν πάει καλά!!

Have Fun!!!

Πως να γράψετε C/C++ στο Linux.

Πήρατε την μεγάλη απόφαση. Να δοκιμάσετε το Linux. Καθώς το δοκιμάζετε, σας ήρθε μια ιδέα που σας χτύπησε κατακέφαλα!

"Οι φίλοι μου λένε ότι γράφεις C και ευχαριστιέσαι στα unix-οειδή συστήματα." Και σκέφτεστε με την σειρά σας: "Γιατί όχι;". Ξαφνικά σας λούζει κρύος ιδρώτας, ενώ νιώθετε την γη να χάνεται κάτω από τα πόδια σας. Δεν ξέρετε από που να αρχίσετε!

Μην αγχώνεστε φίλοι μου! Ο Super Φώτης είναι εδώ για να σας βοηθήσει! Αρχικά πάρτε βαθιές ανάσες. Τις πήρατε; Εξαίσια! Ανοίξτε τώρα σας παρακαλώ ένα παράθυρο του terminal.

Προτού τρομοκρατηθείτε από το θέαμα, αφήστε με να κάνω εγώ την γνωριμία. Terminal, από εδώ ένας νεοφώτιστος linux user. Νεοφώτιστε, το terminal! Και τώρα που τελειώσαμε με τις γνωριμίες, ανοίξτε τον αγαπημένο σας επεξεργαστή κειμένου (πολύ καλός για αρχάριους είναι ο nano, αλλά ενίοτε μπορείτε να χρησιμοποιήσετε vim, emacs, ed, κλπ).

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

Τώρα ήρθε η ώρα να καλέσουμε τον μεταγλωττιστή. Για λόγους απλότητας ας χρησιμοποιήσουμε τον gcc, που βρίσκεται προεγκατεστημένος σε πολλές διανομές. Για να τον "ταΐσουμε" το πρόγραμμα μας γράφουμε το εξής: gcc <file_name> π.χ gcc helloworld.c. Δεδομένου ότι δεν έχουμε κάποιο σφάλμα, και ότι το πρόγραμμα μεταγλωττίζεται μια χαρά, ο μεταγλωττιστής θα παράξει ένα αρχείο a.out. Για να το εκτελέσουμε γράφουμε απλά ./a.out

Σημείωση: Μπορείτε να πείτε στον μεταγλωττιστή να δώσει ένα όνομα στο εκτελέσιμο μετά που θα το παράξει. Για να το κάνετε, δώστε την παράμετρο -ο ακολουθούμενη από το επιθυμητό όνομα αρχείου κατά την κλήση, π.χ gcc helloworld.c -o hello. Για να εκτελέσετε μετά το πρόγραμμα, ακολουθείτε το γνωστό ./<file_name> δηλαδή ./hello.

Ότι θέλατε να ρωτήσετε για την C...απλά δεν το ξέρετε ακόμα!

Αυτό το άρθρο, το οποίο είναι και το πρώτο μου σε αυτό το blog, σηματοδοτεί την αρχή μίας σειράς άρθρων από μέρος μου, όπου θα γράφω για διάφορα που αφορούν την γλώσσα προγραμματισμού C. Μιας και η συγγραφή αυτών των άρθρων γίνεται για το Linux Users Group του TΕΙ Κρήτης, μια ομάδα προγραμματιστών (ωω, ελάτε τώρα, όλοι λατρεύετε τον προγραμματισμό, απλά δεν το έχετε καταλάβει ακόμα :) σκέφθηκα ότι θα ήταν καλό να υπάρχει μία σειρά άθρων που βουτάνε στα βαθιά όσον αφορά την C.

HelloWorld.c


Ξεκινώντας λοιπόν, θα ήθελα να επισκεφθούμε το πρώτο πρόγραμμα που γράφει κάθε νεοφώτιστος προγραμματιστής όταν δοκιμάζει ή μαθαίνει μία νέα γλώσσα: Το "Hello World". Βαρετό, μπορεί να σκεφτήκατε ήδη. Και εγώ το ίδιο θα έλεγα στην θέση σας. Αλλά αφήστε με να το αιτιολογίσω. Σε αυτό το άρθρο, δεν θα συγγράψουμε απλά ένα πρόγραμμα "Hello World", αλλά θα δούμε και πως λειτουργεί η C και ο μεταγλωτιστής της (compiler) μελετώντας το. Τώρα, όσον αφορά το γιατί το "Hello world", τότε η απάντηση έχει δύο σκέλη:
  1. Είναι το πιο απλό πρόγραμμα πάνω στο οποίο μπορούμε να μελετήσουμε κάποια χαρακτηριστικά της C. Επίσης το μέγεθος του μας επιτρέπει να αναφερθούμε σε κάποια κύρια χαρακτηριστικά της C χωρίς να πλατειάζουμε και να αναλωνόμαστε σε πάρα πολλές λεπτομέρειες υλοποίησης.
  2. Είναι ίσως η καλύτερη εισαγωγή σε μία γλώσσα κατά τη γνώμη πολλών επιστημόνων υπολογιστών, και κυρίως του Dennis Ritchie. O λόγος για κάτι τέτοιο είναι απλός: Το "Hello world" είναι αρκετά απλό για την κατανόηση όσον αφορά αρχάριους, ενώ δε, είναι και αρκετά πλούσιο σε πληροφορίες όσον αφορά την σύνταξη και την σημασιολογία μιας γλώσσας για ένα έμπειρο προγραμματιστή.


Χωρίς άλλες καθυστερήσεις, ήρθε η ώρα της αποκάλυψης της συγγραφής του "Hello world" στην C:

#include <stdio.h>

int main(void)
{
    printf("Hello world!\n");
    return 0;
}

Ας προσπαθήσουμε τώρα να αναλύσουμε το κώδικα μας (όχι δεν είναι τόσο τρομακτικό όσο ακούγεται.)

  • Η πρώτη γραμμή, που περιέχει το #include <stdio.h>  είναι μία οδηγία για τον προεπεξεργαστή της C (preprocessor directive). Η συγκεκριμένη οδηγία λέει στον προεπεξεργαστή: Πήγαινε και βρες το αρχείο stdio.h και εισήγαγε το κείμενο του αρχείου αυτού εδώ. Ο λόγος για τον οποίο κάνουμε κάτι τέτοιο είναι απλός: Πιο κάτω καλούμε την συνάρτηση printf() της βασικής βιβλιοθήκης της C. Προτού γίνει μία κλίση, είναι απαραίτητο ο μεταγλωτιστής να γνωρίζει κάποια κύρια χαρακτηριστικά της συνάρτησης (κυρίως την υπογραφή της, δηλαδή τι παραμέτρους δέχεται, και τι τύπο δεδομένων επιστρέφει). Για να το κάνει αυτό πρέπει να γνωρίζει εκ των προτέρων την υπογραφή της συνάρτησης. 
  • Με το να εισάγουμε το αρχείο ολόκληρο στην θέση της οδηγίας βεβαιωνόμαστε κατά αυτόν τον τρόπο ότι έχει εισαχθεί το πρωτότυπο της συνάρτησης (function prototype). Η C από τεχνικής άποψης, όσον αφορά τους Compilers της και συγκεκριμένα την διαδικασία του Parsing, ακολουθεί την λογική top-down parsing, κάτι που σημαίνει ότι για να μπορέσει να κάνει μεταγλωτίσει τον κώδικα ο μεταγλωτιστής, πρέπει να έχει δει πιο πάνω τουλάχιστον μία φορά πληροφορίες για την συνάρτηση. 
  • Από την στιγμή λοιπόν που ο κώδικας που περιέχει πληροφορίες για την printf() έχει εισαχθεί και ο μεταγλωτιστής τον συναντάει πιο πριν από την πραγματική κλίση της συνάρτησης, τότε το πρόγραμμα είναι εντάξει.
  • Μία παρατήρηση: Πολύ απλά γνωρίζουν ότι τα αρχεία .h είναι αρχεία κεφαλίδων χωρίς να γνωρίζουν περισσότερα πράγματα για αυτές. Κάπου εδώ θα είναι χρήσιμο να πούμε ότι τα αρχεία αυτά, τουλάχιστον όσον αφορά την "στάνταρτ" βιβλιοθήκη της C, περιέχουν αρκετά πρωτότυπα συναρτήσεων, μαζί με διάφορα άλλα στοιχεία όπως είναι αναγνωριστικά τύπων, μεταβλητές, κλπ. Τουλάχιστον όσον αφορά συστήματα που χρησιμοποιούν την υποδομή μεταγλωτιστών GCC, η βασική βιβλιοθήκη της C είναι στο σύστημα και ονομάζεται glibc. Για περισσότερες πληροφορίες δείτε το C Standard Library. Σημείωση: Για να βρείτε, και να εξετάσετε τα αρχεία αυτά ενώ βρίσκεστε σε περιβάλλον gnu/linux μπορείτε να γράψετε στο terminal: whereis <header_file> π.χ whereis stdio.h. 
  • Η επόμενη γραμμή περιέχει την υπογραφή (και αρχή του ορισμού) της συνάρτησης main(). Η συνάρτηση main() είναι μία ειδική συνάρτηση, που ορίζει την αρχή της εκτέλεσης του προγράμμματος μας. 
  • Μία παρατήρηση: Έχουμε ορίσει τιμή επιστροφής ακέραιο, και αυτό διότι, όπως όταν εκτελείται μία συνάρτηση και μετά τερματιστεί μπορεί να γυρνάει μία τιμή στην καλούσα ρουτίνα, έτσι και σε επίπεδο διεργασιών (προγραμμάτων) όταν μία διεργασία τελείωσει την εκτέλεση της γυρνάει μία τιμή στην καλούσα διεργασία (δλδ το λειτουργικό σύστημα). Παρά το γεγονός ότι πολλοί στο περιβάλλον windows μπορεί να το αγνοούσαν, στα περιβάλλοντα unix/linux αυτή η δυνατότητα είναι ιδιαιτέρως χρήσιμη, καθώς μπορούμε να μελετήσουμε την τιμή επιστροφής γράφωντας στο terminal echo $?. Κάτι τέτοιο αποδεικνύεται χρήσιμο σε διάφορες καταστάσεις όπως π.χ το shell scripting, όπου για παράδειγμα, μπορεί το script να ακολουθεί διαφορετικό branch σε περίπτωση που η διεργασία δεν τερματιστεί ομαλά.
  • Η επόμενη γραμμή περιέχει μία κλίση σε μία συνάρτηση της βασική βιβλιοθήκης της C: την printf(). Η printf() τυπώνει μορφοποιημένο κείμενο στο ειδικό αρχείο που καθορίζει την στάνταρτ έξοδο (stdout).
  • Η επόμενη τιμή επιστρέφει την τιμή 0 στο λειτουργικό σύστημα όπως συζητήσαμε πιο πριν. Παρά το γεγονός ότι δεν υπάρχει κάποια τυποποίηση συνήθως η τιμή 0 ορίζει ομαλή εκτέλεση και τερματισμό της διεργασίας, ενώ οτιδήποτε άλλο είναι κωδικός σφάλματος.

Είναι όμως αυτό αρκετό;


Γράψαμε το κείμενο αυτό σε ένα επεξεργαστή κειμένου και το αποθηκεύσαμε στον υπολογιστή μας ως hello.c. Είναι όμως αυτό αρκετό;

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

Παρά αυτήν την διαφορά το αρχείο μας δεν είναι τίποτα άλλο παρά (άχρηστα;) byte στην μονάδα αποθήκευσης του υπολογιστή μας, όσο δεν έχουμε ένα μεταγλωτιστή. Και αυτό διότι, ο μεταγλωτιστής είναι που πέρνει σαν είσοδο το αρχείο, και παράγει ένα εκτελέσιμο αρχείο, σε γλώσσα μηχανής. Χωρίς μεταγλωτιστή, το αρχείο μας είναι πολύ απλά ένα άχρηστο (σχεδόν) αρχείο κειμένουν και τίποτα περισσότερο.

Τί γίνεται όμως από την στιγμή που θα μεταγλωτιστεί;


Χωρίς να μπω σε λεπτομέρειες τεχνολογίας μεταγλωτιστών (αυτό είναι 1) πολύ σύνθετο, 2) απαιτεί τουλάχιστον ένα 3-4 φορές μεγαλύτερο άρθρο από αυτό), θα προσπαθίσω να δείξω τι παράγει ο μεταγλωτιστής και να κλείσω το άρθρο, γιατί κάπου εδώ φαντάζομαι θα έχετε αρχίσει να κουράζεστε και εσείς :)

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

Τι είναι όμως αυτά τα περιβόητα εκτελέσιμα αρχεία;

Ο υπολογιστής, (όπως γνωρίζουμε όλοι) καταλαβαίνει μόνο μία γλώσσα: την γλώσσα μηχανής. Η γλώσσα μηχανής αποτελείται από bit & byte. Εσωτερικά ένα εκτελέσιμο αρχείο μοιάζει κάπως έτσι:
  1. 0000000 457f 464c 0101 0001 0000 0000 0000 0000
  2. 0000010 0002 0003 0001 0000 8310 0804 0034 0000
  3. 0000020 06c4 0000 0000 0000 0034 0020 0007 0028
  4. 0000030 001e 001b 0006 0000 0034 0000 8034 0804
  5. 0000040 8034 0804 00e0 0000 00e0 0000 0005 0000

Αγνοήστε την πρώτη στήλη που είναι το memory offset (απόσταση από την αρχή του προγράμματος), όλα τα υπόλοιπα είναι απλά byte. Δεν μοιάζουν; Κι όμως. Είναι byte, απλά σε δεκαεξαδική αναπαράσταση (hex). Όσον αφορά την δεκαεξαδική αναπαράσταση δύο hex symbols αντιστοιχούν σε ένα byte. Δηλαδή το FF σε δυαδικό είναι 11111111 αφού το F είναι το 15 στο δεκαδικό και το 1111 σε δυαδικό.

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

Σημείωση: Για αυτούς που αισθάνονται την ανάγκη να δουν ένα ολόκληρο πρόγραμμα σε machine code έχω ανεβάσει τον κώδικα του helloworld εδώ --> http://pastebin.com/00r9iujE

Και τι παίζει με την Assembly;

Κάπου εδώ σας ακούω να διαμαρτύρεστε: "-Και τι παίζει με την Assembly; -Μου είχαν πει ότι θα έχει Assembly! -Είναι αιρετικός! Κάψτε τον!"

Μισό λεπτό αγαπητοί μου. Η assembly είναι σχεδόν το ίδιο πράγμα με το machine code.  Για την ακρίβεια είναι ανθρώπινα μνημονικά για εντολές του επεξεργαστή. Γιατί για πολλούς ανθρώπους το  mov ebp, esp λέει πολύ περισσότερα πράγματα από το 457f 464c (τυχαίο παράδειγμα)

ΣΗΜΕΙΩΣΗ: Μπορεί εμάς τους ανθρώπους να μας βολεύει η Assembly, αλλά για τον υπολογιστή δεν σημαίνει τίποτα (θυμηθείτε ότι ο υπολογιστής μιλάει μόνο σε 1 και 0 και όχι σε λέξεις) . Για αυτό όταν ένας άνθρωπος γράφει με το χέρι Assembly, είναι ανάγκη ο κώδικας να περαστεί από assembler και να παραχθεί κώδικας μηχανής (δηλαδή να γίνει μετάφραση του mov ebp, esp σε 457f 464c

Για όποιον ενδιαφέρεται να δει κώδικα assembly, εδώ είναι ο κώδικας ενός helloworld, σε x86 assembly, μεταγλωτισμένο από τον clang/llvm --> http://ecksit.wordpress.com/2011/01/01/hello-world-in-llvm/

apparmor ένα "μαγικό εργαλείο" ασφάλειας


Το AppArmor είναι ένα εργαλείο, μια μονάδα ασφάλειας για εφαρμογές που τρέχουν κάτω από λειτουργικό linux και υποστηρίζει αρκετές διανομές (debian,openSUSE,redhat) και προσφέρει ασφάλεια απέναντι σε τυχόν αδυναμίες που μπορεί να έχει μια εφαρμογή ακόμα και για 0-day αδυναμίες.

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

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

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

Το μοντέλο ασφάλειας της βασίζεται σε whitelist approach δηλαδή βρίσκει πρώτα ποιες εφαρμογές μπορούν να χαρακτηριστούν ως ασφαλείς και μετά από τις υπόλοιπες τους δίνει πρόσβαση σε όσο το δυνατόν λιγότερους πόρους συστήματος και αρχείων που μπορεί να ζητήσουν (μόνο στα πολύ βασικά δηλαδή).

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

Μπορείτε να διαβάσετε περισσότερα εδώ και εδώ.

Η εφαρμογή είναι open source και μπορείτε να την κατεβάσετε και να δείτε πως εγκαθίσταται από εδώ.

(υπάρχει προεγκατεστημένη σε συστήματα ubuntu και opensuse)

γρήγορο compile για C αρχεία μέσω bash script

Δεν είναι τίποτα σημαντικό απλά μπορεί να κάνει την ζωή σας πιο εύκολη αν γράφετε C στο linux και κάνετε compile με το gcc μέσω terminal.
Αυτοματοποιεί λίγο την όλη διαδικασία.

Παρακάτω είναι ο κώδικας:

clean=1
if [ $clean = 1 ]
then
 rm -f *.out
fi
gcc $1
chmod 700 a.out 
./a.out 
rm -f a.out 

Τον εξηγώ ανά γραμμή:

clean = 1 (μεταβλητή δική μου για το αν θα καθαρίσει τον παρόν φάκελο μετά από τα αρχεία .out ότι κατάλοιπα έμειναν μετά το compile)

ΠΡΟΣΟΧΗ: Σβήνει όλα τα αρχεία .out στον παρόν φάκελο όποτε καλό είναι να έχετε μόνο ένα project ανά φάκελο

gcc $1 εδώ παίρνει ως όρισμα το αρχείο.c και κάνει το compile.

chmod 700 a.out το κάνει εκτελέσιμο.

./a.out το εκτελεί πιθανόν να χρειαστεί να το τρέξετε ως admin με την sudo.

rm -f a.out σβήνει το εκτελέσιμο αρχείο.

syntax highlighting παράδειγμα

Οι γλώσσες που υποστηρίζονται μέχρι τώρα είναι οι: c/cpp, csharp, css, java, javascript, php, python, ruby, sql, vb, xml και perl.

Οδηγίες υπάρχουν εδώ (http://www.cyberack.com/2007/07/adding-syntax-highlighter-to-blogger.html)

Γενικώς όμως είναι απλό στην χρήση:
<pre class="brush:css">
Your 'CSS' code goes here
</pre>