<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-347191732171091753</id><updated>2011-11-21T04:32:56.700-08:00</updated><category term='linux'/><category term='book reviews'/><category term='ubuntistas'/><category term='intelligence'/><category term='engineering'/><category term='programming'/><category term='mathematics'/><category term='metaprogramming'/><category term='finite elements'/><category term='physics'/><category term='unclassified'/><category term='semeiotic'/><category term='φιλοσοφία'/><category term='electronics'/><category term='financial'/><title type='text'>The quantum mechanics of linux</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>61</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-3666060860836864897</id><published>2011-07-25T12:08:00.000-07:00</published><updated>2011-07-25T12:09:24.195-07:00</updated><title type='text'>New blog</title><content type='html'>&lt;div&gt;To blog αυτό συνεχίζεται &lt;a href="http://blog.delta-pi-systems.eu/gr"&gt;εδώ&lt;/a&gt;.&lt;/div&gt;This blog is being continued &lt;a href="http://blog.delta-pi-systems.eu/en"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-3666060860836864897?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/3666060860836864897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2011/07/new-blog.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/3666060860836864897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/3666060860836864897'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2011/07/new-blog.html' title='New blog'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-8549956445680984989</id><published>2011-05-09T17:45:00.000-07:00</published><updated>2011-05-09T17:49:25.802-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intelligence'/><title type='text'>Σκέψεις πάνω στην τεχνητή νοημοσύνη</title><content type='html'>&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Αν υποθέσουμε ότι έχουμε όλο το χρόνο και τα χρήματα που χρειάζονται και ότι οι αλγόριθμοι που υπάρχουν για "εκμάθηση" είναι αρκετά ικανοποιητικά για ένα συγκεκριμένο πρόβλημα, τότε το μυστήριο τεχνητής νοημοσύνης ίσως είναι απλά ένα θέμα υλοποίησης. Τι θέλω να πω; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Ας φανταστούμε έναν υπολογιστή πάνω σε ρόδες, ο οποίος είναι εξοπλισμένος με κάμερα, μικρόφωνο, ηχεία, όργανα αφής και (ίσως και κάποια άλλα μετρητικά όργανα) τα οποία όλα λειτουργούν συνέχεια. Τα δεδομένα σε real time περνάνε από διάφορα layers εκμάθησης ώστε τελικά να αποθηκεύεται, για οτιδήποτε βλέπει, ακούει, και αισθάνεται με οποιοδήποτε τρόπο, μια "invariant" μορφή της πληροφορίας που απέκτησε. &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Ταυτόχρονα, αυτό το σύστημα να είναι εξοπλισμένο με σύστημα "συναισθημάτων". Στο παρελθόν έχουν παρουσιασθει διάφορα τέτοια τεχνητά συστήματα "συναισθημάτων", αλλά κανένα δεν έχει εφαρμοσθεί σε τέτοια μεγάλη κλίμακα. &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Αυτό που υποστηρίζει ο φίλος μας ο jeff hawkins, ότι δηλαδή δε χρειάζεται επιπλέον υπολογιστική ισχύς το πιστεύω. Το θέμα είναι ότι δεν έχει υπάρξει κάποιο εγχειρημα (ή γνωρίζεις κάτι) τέτοιας κλίμακας. &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Οι σκέψεις αυτές ξεπήδηξαν διαβάζοντας από http://norvig.com/ το άρθρο  How to Write a Spelling Corrector και συνειδητοποίησα ότι η γνώση πολλές φορές υπάρχει απλά δε γνωρίζουμε να την εφαρμόσουμε σε άλλα πεδία. Η θεωρία που κρύβεται πίσω από το spelling corrector τόσο της google όσο και άλλων εταιριών είναι το θεώρημα του Bayes (βλ. επίσης bayesian spam filter) το οποίο το διδαχτήκαμε στο 3ο έτος του πανεπιστημίου στη στατιστική. Είμαι σίγουρος ότι κανένας από τους καθηγητές μας δε γνωρίζει αυτές τις εφαρμογές του θεωρήματος του Bayes, αλλά αυτό είναι off-topic. &lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Ίσως δηλαδή η γνώση και η τεχνολογία για την ανάπτυξη νοήμονων μηχανών να υπάρχει απλά να μην έχει συνδυαστεί κατάλληλα. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-8549956445680984989?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/8549956445680984989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2011/05/blog-post.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/8549956445680984989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/8549956445680984989'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2011/05/blog-post.html' title='Σκέψεις πάνω στην τεχνητή νοημοσύνη'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-338688238759534544</id><published>2011-04-16T14:38:00.000-07:00</published><updated>2011-04-16T14:43:51.113-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>wc recursively in perl</title><content type='html'>&lt;code&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Πάντα χρειαζόμουν ένα απλό script που να μετράει τις γραμμές κώδικα σε αρχεία και σε φακέλους αλλά και σε όλα τα αρχεία που βρίσκονται στους υποφακέλους. Και μιας και αυτό το διάστημα μαθαίνω perl είπα να δοκιμάσω την τύχη μου. Βέβαια το παρακάτω δεν κάνει τίποτε από ένα system call σε μια εντολή με pipes (που χρησιμοποιεί και awk) και να τυπώνει το αποτέλεσμα:&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;div&gt;&lt;code&gt;&lt;span class="Apple-style-span"   style="font-family:arial;font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;#!/usr/bin/env perl&lt;br /&gt;if ( @ARGV &amp;gt; 0 )&lt;br /&gt;{&lt;br /&gt;   $count = `find $ARGV[0] -type f -exec wc -l {} \\; | awk '{total += \$1} END{print total}'`;&lt;br /&gt;   print $count;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;   print "No arguments!\n";&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-338688238759534544?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/338688238759534544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2011/04/wc-recursively-in-perl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/338688238759534544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/338688238759534544'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2011/04/wc-recursively-in-perl.html' title='wc recursively in perl'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-8940040290707805453</id><published>2011-03-11T03:08:00.000-08:00</published><updated>2011-03-11T03:16:28.414-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Non Turing complete γλώσσες προγραμματισμού</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Σκεφτόμουν αυτές τις μέρες γιατί οι γλώσσες προγραμματισμού, ενώ όλες ειναι Turing complete, δεν έχουν την ίδια εκφραστικότητα. Γιατί δηλαδή κάποιες είναι πιο εύκολες στη χρήση από κάποιες άλλες; Και τότε μου γεννήθηκε η απορία αν υπάρχουν non Turing complete γλώσσες προγραμματισμού. Μια σύντομη έρευνα έδειξε ότι υπάρχουν: η &lt;/span&gt;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/BlooP_and_FlooP"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;BlooP&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;. Η BlooP μαζί με τη FlooP  σχεδιάστηκαν από το Douglas R. Hofstadter για το βιβλίο του Gödel, Escher, Bach.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-8940040290707805453?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/8940040290707805453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2011/03/non-turing-complete.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/8940040290707805453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/8940040290707805453'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2011/03/non-turing-complete.html' title='Non Turing complete γλώσσες προγραμματισμού'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-4297879073918152223</id><published>2011-03-07T14:01:00.000-08:00</published><updated>2011-03-07T14:08:11.849-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntistas'/><title type='text'>Ubuntistas: Issue 11</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Τέλειωσα, ύστερα από πολύ καιρό (γιατί ασχολούμουν με την ολοκλήρωση της διατριβής μου), με τη βοηθεία του kalakouentin τη σελιδοποίηση του 11 τεύχους του περιοδικού &lt;/span&gt;&lt;/span&gt;&lt;a href="http://ubuntistas.ubuntu-gr.org/"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;ubuntistas&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;. Στο τεύχος αυτό υπάρχουν άρθρα για το android, για γεωγραφικά συστήματα πληροφοριών (GIS), το 3ο μέρος για την κρυπτογραφία με Java, google search tips, καθώς και 3 άρθρα που έγραψα για parallel computing με openMP, για τη γλώσσα προγραμματισμού scheme, και για τη βιβλιοθήκη συμβολικών μαθηματικών της python sympy.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Καλή ανάγνωση!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-4297879073918152223?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/4297879073918152223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2011/03/ubuntistas-issue-11.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/4297879073918152223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/4297879073918152223'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2011/03/ubuntistas-issue-11.html' title='Ubuntistas: Issue 11'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-302773767012633841</id><published>2010-10-22T04:13:00.000-07:00</published><updated>2010-10-22T04:25:39.623-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metaprogramming'/><category scheme='http://www.blogger.com/atom/ns#' term='book reviews'/><title type='text'>Metaprogramming Ruby</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Z8m106a4Z-w/TMFyI6-tXCI/AAAAAAAAADM/bg0w1efqu6U/s1600/Perrotta.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 166px; height: 200px;" src="http://4.bp.blogspot.com/_Z8m106a4Z-w/TMFyI6-tXCI/AAAAAAAAADM/bg0w1efqu6U/s200/Perrotta.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5530827314984475682" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;I explained &lt;/span&gt;&lt;/span&gt;&lt;a href="http://quantum-linux.blogspot.com/2009/09/blog-post.html"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;here&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt; (in greek) a bit about metaprogramming and &lt;/span&gt;&lt;/span&gt;&lt;a href="http://quantum-linux.blogspot.com/2010/10/metaprogramming-and-finite-elements.html"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;here&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt; about an application in a python/c++ finite element code but this book is everything you need about metaprogramming in Ruby. Written by Paolo Perrotta in a way that two colleagues discuss and solve every day problems. The book is full of example code and assumes some basic knowledge of the Ruby language. The first part of the book deals with general metaprogramming concepts in Ruby from objects and methods to blocks and classes to finally code that writes code. The second part dives in the metaprogramming techniques of Rails, with ActiveRecods being the most important part. The last chapter deals how to use metaprogramming safely. As Yukihiro "matz" Matsumoto says in the foreword "It's a bit like magic", but be ware because there is white magic and black magic.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-302773767012633841?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/302773767012633841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2010/10/metaprogramming-ruby.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/302773767012633841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/302773767012633841'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2010/10/metaprogramming-ruby.html' title='Metaprogramming Ruby'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Z8m106a4Z-w/TMFyI6-tXCI/AAAAAAAAADM/bg0w1efqu6U/s72-c/Perrotta.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-2466330731051104801</id><published>2010-10-17T16:36:00.000-07:00</published><updated>2010-10-17T16:47:51.398-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>TeX code generation with perl</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;A couple of months ago I started to learn some basic &lt;/span&gt;&lt;a href="http://www.perl.org/"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;perl&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;, because perl is one of the programming languages that one should know. It can be used from text processing and web applications to system administration and many other applications.  So I came with the idea to write something simple in order to automate some TeX code generation done by some other part of my program. So I wrote some basic perl functions that can be found here:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/env perl&lt;br /&gt;&lt;br /&gt;sub initialize{&lt;br /&gt;$text = '\documentclass{article}'."\n";&lt;br /&gt;$text .= '% Created by '."\n";&lt;br /&gt;$text .= '\begin{document}'."\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub usepackage{&lt;br /&gt;$text = '\usepackage{'.$_[0]."}\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub finalize{&lt;br /&gt;$text = '\end{document}'."\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub itemize{&lt;br /&gt;$text = '\begin{itemize}'."\n";&lt;br /&gt;$text .= "\t\item"."\n";&lt;br /&gt;$text .= '\end{itemize}'."\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub enumerate{&lt;br /&gt;$text = '\begin{enumerate}'."\n";&lt;br /&gt;$text .= "\t\item"."\n";&lt;br /&gt;$text .= '\end{enumerate}'."\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub figure{&lt;br /&gt;$text = '\begin{figure}'."\n";&lt;br /&gt;$text .= "\t".'\includegraphics{}'."\n";&lt;br /&gt;$text .= '\end{figure}'."\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub table{&lt;br /&gt;$text = '\begin{tabular}'."\n";&lt;br /&gt;#$text = 'table';&lt;br /&gt;$text .= '\end{tabular}'."\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub tabbing{&lt;br /&gt;$a = '\begin{tabbing}'."\n";&lt;br /&gt;$a .= '\end{tabbing}'."\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub section{&lt;br /&gt;$a = '\section{'.$_[0]."}\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub subsection{&lt;br /&gt;$a = '\subsection{'.$_[0]."}\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub equation{&lt;br /&gt;$a = '\begin{equation}'."\n";&lt;br /&gt;$a .= $_[0];&lt;br /&gt;$a .= '\end{equation}'."\n";&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;And  a simple example is given below:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;code&gt;&lt;br /&gt;print &amp;initialize;&lt;br /&gt;print &amp;amp;usepackage("graphicx");&lt;br /&gt;&lt;br /&gt;print &amp;itemize;&lt;br /&gt;print &amp;enumerate;&lt;br /&gt;print &amp;figure;&lt;br /&gt;print &amp;table;&lt;br /&gt;&lt;br /&gt;print &amp;finalize;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-2466330731051104801?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/2466330731051104801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2010/10/tex-code-generation-with-perl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/2466330731051104801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/2466330731051104801'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2010/10/tex-code-generation-with-perl.html' title='TeX code generation with perl'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-7413530224555254151</id><published>2010-10-08T03:28:00.001-07:00</published><updated>2010-10-08T03:41:33.225-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book reviews'/><title type='text'>Book Review: Foundations of GTK+ Development</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Z8m106a4Z-w/TK7ycCZHayI/AAAAAAAAAC8/8WZF1peX5Jk/s1600/Krause.png"&gt;&lt;img style="text-align: justify;float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 241px; height: 320px; " src="http://4.bp.blogspot.com/_Z8m106a4Z-w/TK7ycCZHayI/AAAAAAAAAC8/8WZF1peX5Jk/s320/Krause.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5525620356322650914" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;div style="text-align: justify;"&gt;Foundations of GTK+ Development is a book about the development of GUI applications using the open source library GTK+. It assumes knowledge of the C language and explains first the structure of the GTK+ library, i.e. GLib, GObject, GDK, GdkPixbuf, Pango, and ATK. By building a simple "Hello World" application explains the basics of GTK+, the main loop function, signals and callbacks, events, and widgets. Then the author explains with many examples and code listings the use of container widgets, basic widgets, and dialogs. &lt;/div&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;The use of the GLib library, the text view widget, the tree view widget, and of course the generation of menus and toolbars are then described in detail again with examples and source code. Finally more advanced topics like dynamic user interfaces, creating custom widgets, and some additional widgets, like canvas, cairo, calendar among others, are discussed. The book concludes with a chapter with five full working applications and a lot of appendices.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-7413530224555254151?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/7413530224555254151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2010/10/book-review-foundations-of-gtk.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/7413530224555254151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/7413530224555254151'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2010/10/book-review-foundations-of-gtk.html' title='Book Review: Foundations of GTK+ Development'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Z8m106a4Z-w/TK7ycCZHayI/AAAAAAAAAC8/8WZF1peX5Jk/s72-c/Krause.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-8112979539156654258</id><published>2010-10-06T07:50:00.000-07:00</published><updated>2010-10-06T07:58:18.280-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>xcf2pdf</title><content type='html'>&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;xcf2pdf is a simple python script, that uses convert from &lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.imagemagick.org/script/index.php"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;ImageMagick&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; to batch convert every xcf image inside a folder to a pdf&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008423"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Menlo; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;#!/usr/bin/python&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;from&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; subprocess &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; *&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color:#be299d;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; re&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;def&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; convert(file): &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;p = Popen([&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;'convert'&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;, file, file[:-&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;]+&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;'pdf'&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;], stdout=PIPE, stderr=PIPE)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;p = Popen(&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;'ls'&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;, stdout=PIPE, stderr=PIPE)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;ls, error = p.communicate()&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;files = re.split(&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;'\n'&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;, ls)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;for&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; i &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;in&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; files: &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;if&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; i[-&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;:]==&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;'xcf'&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;: &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"   style="  ;font-family:'courier new';font-size:small;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;convert(i)&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;There are a few features missing and known bugs, e.g. it will convert every layer of the xcf file to a different page in the same pdf. (Beware of the python code formatting)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-8112979539156654258?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/8112979539156654258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2010/10/xcf2pdf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/8112979539156654258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/8112979539156654258'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2010/10/xcf2pdf.html' title='xcf2pdf'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-5255841602402926207</id><published>2010-10-06T05:42:00.001-07:00</published><updated>2010-10-06T05:51:38.485-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='engineering'/><title type='text'>GGGears</title><content type='html'>&lt;p&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;In many engineering applications engineers have to calculate how gears are working under stress. &lt;/span&gt;&lt;/span&gt;&lt;a href="http://gggears.sourceforge.net/"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;GGGears&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; is a free software that does exactly this by means of the finite element package &lt;/span&gt;&lt;/span&gt;&lt;a href="http://download.gna.org/getfem/html/homepage/"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;GETFEM++&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; and the mesh generation package &lt;/span&gt;&lt;/span&gt;&lt;a href="http://geuz.org/gmsh/"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;GMSH&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;, both also free software. It supports both 2D and 3D mesh generation and solver. The user does not need to know anything about finite elements or mesh generation; he/she just need to insert the geometrical data of the gear systmem.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;The installation of the software can be easily done in Ubuntu by first adding the repository&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;sudo add-apt-repository ppa:gggears/main&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 12px; color: rgb(0, 0, 255); line-height: 15px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#000000;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;sudo apt-get update&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=""&gt;&lt;span class="Apple-style-span"  style="color:#000000;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="color:#000000;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;and then installing gggears and its dependencies by&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#000000;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;sudo apt-get install gggears&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-5255841602402926207?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/5255841602402926207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2010/10/gggears.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5255841602402926207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5255841602402926207'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2010/10/gggears.html' title='GGGears'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-743926485664617312</id><published>2010-10-06T04:02:00.000-07:00</published><updated>2010-10-06T04:20:33.790-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='finite elements'/><category scheme='http://www.blogger.com/atom/ns#' term='metaprogramming'/><title type='text'>Metaprogramming and finite elements</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;The idea of metaprogramming is great; you write code that writes code that writes code... If I am not wrong the first language that introduced this concept was &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Lisp_(programming_language)"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;LISP&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; (at the moment I am learning the &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Scheme_(programming_language)"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Scheme&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; dialect) So, the idea behind metaprogramming is to write a program in a high level language which will then create source code in a lower language (or even the same) in order to automate some procedure. From Lisp many languages have been influenced, such as Ruby and python, that also incorporate metaprogramming aspects.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;One day someone said why don't we apply this concept to finite element code as well. Finite element code can be really annoying (as every code is) so by writing some code that writes finite element code would make our calculations easier. The result of this idea is the &lt;/span&gt;&lt;a href="http://www.fenicsproject.org/wiki/FEniCS_Project"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;FEnics&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; project. Thank you for the great job guys!!! Finite elements are usually used to solve partial differential equations. So find a PDE you like and just solve it.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;The program can be easily installed in Ubuntu by writing &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;sudo apt-get install fenics&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;Of course there are many other packages for many distributions. Have fun!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-743926485664617312?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/743926485664617312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2010/10/metaprogramming-and-finite-elements.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/743926485664617312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/743926485664617312'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2010/10/metaprogramming-and-finite-elements.html' title='Metaprogramming and finite elements'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-6192339484722196676</id><published>2010-09-14T14:18:00.000-07:00</published><updated>2010-09-14T14:20:43.453-07:00</updated><title type='text'>Chaos economics</title><content type='html'>&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Δεν άντεξα. Ξεκίνησα ένα blog στην αγγλική γλώσσα για το χάος στη θεωρία της οικονομίας:&lt;/span&gt;&lt;/span&gt;&lt;a href="http://chaos-economics.blogspot.com/"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; chaos economics&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-6192339484722196676?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/6192339484722196676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2010/09/chaos-economics.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/6192339484722196676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/6192339484722196676'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2010/09/chaos-economics.html' title='Chaos economics'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-8721375140658833836</id><published>2010-09-01T15:09:00.000-07:00</published><updated>2010-09-01T15:22:08.847-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mathematics'/><title type='text'>Adjoint</title><content type='html'>Τον τελευταίο καιρό ασχολούμαι συνέχεια με adjoint equations (εξισώσεις) και adjoint variables (μεταβλητές) αλλά μου λείπει η ελληνική μετάφραση. Υποψιάζομαι τη λέξη "συζηγής" αλλά δεν είμαι σίγουρος. &lt;br /&gt;&lt;br /&gt;Αλλά ας πάρω τα πράγματα από την αρχή. Για πρώτη συνάντησα τους adjoint πίνακες στο πρώτο έτος στο πανεπιστήμιο (ή μήπως ήταν στη Γ' λυκείου;) Τώρα μιλάμε και για adjoint τελεστές. Στα προβλήματα αυτόματου ελέγχου (είτε κανονικών ή μερικών διαφορικών εξισώσεων) υπάρχει η αντικειμενική συνάρτηση και η εξίσωση ως περιορισμός. Αν πολλαπλασιαστεί ο περιορισμός με μία νέα (άγνωστη προς το παρόν) μεταβλητη και το γινόμενο προστεθεί στην αντικειμενική συνάρτηση τότε παίρνουμε την Lagrange-ιανή του συστήματος. Η μερική παράγωγος της Lagrang-ιανής ως πρός τη μεταβλητή κατάστασης (state variable) δίνει την adjoint εξίσωση, ενώ η μερική παράγωγος της Lagrang-ιανής ως πρός την adjoint μεταβλητη δίνει την αρχική εξίσωση. &lt;br /&gt;&lt;br /&gt;Αναρωτιέμαι αν υπάρχει κανένα βιβλίο στα ελληνικά που να εξηγεί αυτά τα μαθηματικά. Και αν υπήρχε, θα έβρισκε αναγνωστικό κοινό; Θα άξιζε τον κόπο μια τέτοια προσπάθεια; Όπως και να έχει είναι κι αυτό ένα από τα μελλοντικά μου πλάνα. &lt;br /&gt;&lt;br /&gt;Ενα βιβλίο (στα γερμανικά) που θα πρότεινα για βέλτιστο έλεγχο μερικών διαφορικών εξισώσεων είναι το Optimale Steuerung partieller Differentialgleichungen του Fredi Tröltzsch, εκδόσεις Vieweg.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-8721375140658833836?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/8721375140658833836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2010/09/adjoint.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/8721375140658833836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/8721375140658833836'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2010/09/adjoint.html' title='Adjoint'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-5981257432277409371</id><published>2010-09-01T11:12:00.001-07:00</published><updated>2010-09-01T11:43:00.076-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='φιλοσοφία'/><title type='text'>Ελευθερία στο δημόσιο τομέα</title><content type='html'>&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;Το ελεύθερο λογισμικό/ λογισμικού ανοιχτού κώδικα έχει δείξει δείγματα επιτυχίας και ωριμότητας σε διάφορους τομείς. Φανταστείτε τώρα οι αρχές του ελεύθερου λογισμικού να εφαρμοζόταν σε διάφορα επιπέδα του δημόσιου τομέα, όπως υγεία, εκπαίδευση, ασφαλιστικό, ακόμη και στον προϋπολογισμό του κράτους. &lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;Για παράδειγμα, τα δεδομένα στην υγεία να ήταν ελεύθερα σε όλα τα ερευνητικά κέντρα ώστε να μπορούσαν οι μελέτες και οι στατιστικές να γίνονται σε μεγαλύτερο δείγμα. Φυσικά δε θα δημοσιεύονται προσωπικά δεδομένα. Επιπλέον, όλα τα αρχεια και δεδομένα να αποθηκεύονται σε κάποιο ελεύθερη μορφή και να έχει φυσικά κάποιο αντίγραφο και ο ασθενής. Έτσι, ο ασθενής θα μπορεί να πάει σε καινούριο γιατρό και να έχει το πλήρες ιστορικό ανα πάσα στιγμή.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;Ο προϋπολογισμός του κράτος θα μπορούσε να ψηφίζεται απευθείας από τους πολίτες, ή έστω να ελέγχεται ανά πάση στιγμή. Ο έλεγχος των χρηματοδοτήσεων, των εξόδων και των εσόδων θα μπορούσε να επηρεάσει την ψήφο πολλών από εμάς.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;ΥΓ. Η ιδέα αυτή προήλθε από το φίλο μου τον Κώστα.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-5981257432277409371?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/5981257432277409371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2010/09/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5981257432277409371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5981257432277409371'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2010/09/blog-post.html' title='Ελευθερία στο δημόσιο τομέα'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-2726296947499551226</id><published>2010-08-31T00:41:00.000-07:00</published><updated>2010-08-31T00:59:53.337-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='financial'/><title type='text'>Venture capital</title><content type='html'>&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Με μια σύντομη αναζήτηση στο διαδίκτυο βρήκα αρκετές ελληνικές εταιρίες που δραστηριοποιούνται στο χώρο των venture capitals, αλλά  και κάποιες εταιρίες που ιδρύθηκαν μέσα από χρηματοδότηση venture capitals. Αναρωτιέμαι γιατί δεν υπάρχει μια άνθηση νεοσύστατων εταιριών στην Ελλάδα. Φταίει η έλλειψη γνώσεων, η έλλειψη τόλμης ή μήπως ευθύνεται η υπάρχουσα ελληνική νοοτροπία του "ωχαδερφισμού", του "έλα-μωρέ" ή του "ε κάπως θα βολευτούμε κι εμείς". Αν είναι το πρώτο τότε φταίνε τα πανεπιστήμια, αν είναι το δεύτερο τότε ευθύνονται οι εταιρίες venture capitals που δεν ενημερώνουν τους νέους και δε διαφημίζουν την πραμάτεια τους. Τέλος, αν είναι το τρίτο---που υποψιάζομαι φέρει το μεγαλύτερο ποσοστό ευθύνης---φταίμε όλοι μας σαν κοινωνία.  &lt;/span&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Εγώ πάντως ελπίζω πώς η κατάσταση τώρα ακριβώς λόγω της οικονομικής κρίσης θα βελτιωθεί. Ίσως να είμαι απλά ένας ονειροπόλος...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-2726296947499551226?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/2726296947499551226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2010/08/venture-capital.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/2726296947499551226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/2726296947499551226'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2010/08/venture-capital.html' title='Venture capital'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-7335414051932475674</id><published>2010-08-31T00:04:00.000-07:00</published><updated>2010-08-31T00:13:12.225-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='engineering'/><title type='text'>Open design σε μηχανήματα</title><content type='html'>&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Πώς θα μπορούσε να εφαρμοσθεί η ιδέα του ελεύθερου λογισμικού σε προϊόντα; Για παράδειγμα, μια εταιρία που κατεσκευάζει μηχανήματα θα μπορούσε να παρέχει τα σχέδια των μηχανημάτων της ελεύθερα και γύρω από αυτή να δημιουργούσε μια κοινότητα, η οποία θα την τροφοτούσε με ιδέες, με νέους πελάτες και φυσικά με διαφήμιση. Οποιοδήποτε "bug", σφάλμα στη λειτουργία της μηχανής, θα εμφανιζόταν και θα διορθωνόταν πολύ πιο γρήγορα απ'ότι σε ένα κλειστό σχεδιασμό.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-7335414051932475674?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/7335414051932475674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2010/08/open-design.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/7335414051932475674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/7335414051932475674'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2010/08/open-design.html' title='Open design σε μηχανήματα'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-4671718506841187844</id><published>2010-08-30T23:18:00.000-07:00</published><updated>2011-05-10T12:23:11.528-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unclassified'/><title type='text'>Περί πιστωτικών καρτών και αεροπορικών εταιριών</title><content type='html'>&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;Προσπάθησα για άλλη μια φορά σήμερα να χρησιμοποιήσω την πιστωτική κάρτα (της alpha bank) στις ιστοσελίδες της olympic airlines και aegean airlines με αποκαρδιωτικά αποτελέσματα. Το "επιπλέον" σύστημα ασφάλειας της πιστωτικής κάρτας δεν επιτρέπει ούτε τον κάτοχο της κάρτας να κάνει μία κράτηση. Για να μην σχολιάσω το γεγονός ότι οι ιστοσελίδες των αεροπορικών εταιριών είναι τόσο επιφορτισμένες με διαφημίσεις και flash που δε  μπορώ να κάνω την κράτησή μου χωρίς να πρέπει να κλείσω άπειρα ενοχλητικά παράθυρα.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-4671718506841187844?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/4671718506841187844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2010/08/blog-post.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/4671718506841187844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/4671718506841187844'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2010/08/blog-post.html' title='Περί πιστωτικών καρτών και αεροπορικών εταιριών'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-8331876859956571275</id><published>2010-06-24T01:06:00.000-07:00</published><updated>2010-06-24T01:15:38.069-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Σκέψεις για το μέλλον του ελεύθερου λογισμικού</title><content type='html'>&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;Το ελεύθερο λογισμικό τα έχει όλα: κώδικα, προγραμματιστές, αποθετήρια κώδικα. Αυτό όμως που πραγματικά λείπει από το  ελεύθερο λογισμικό είναι η συνδυασμένη προσπάθεια. Βλέπουμε να υπάρχουν δεκάδες προγράμματα που κάνουν λίγο ή πολύ την ίδια δουλειά. Αντί ένας προγραμματιστής να αρχίσει να δουλεύει σε ένα υπάρχον πρόγραμμα και να διορθώσει τα τυχόν σφάλματα ή να προσθέσει καινούριες δυνατότητες ξεκινάει ένα δικό του με την ελπίδα να είναι καλύτερο από το προηγούμενο. Αυτό δεν είναι απαραίτητα αρνητικό, μιας και δημιουργούνται νέα προγράμματα, υπάρχει ανταγωνισμός και ο ανταγωνισμός οδηγεί στην πρόοδο. Αλλά πιστεύω ότι αν υπήρξε συνδυασμένη προσπάθεια και οργανωμένος σχεδιασμός θα αποφεύγαμε την πολλαπλή ανακάλυψη του τροχού.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-8331876859956571275?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/8331876859956571275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2010/06/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/8331876859956571275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/8331876859956571275'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2010/06/blog-post.html' title='Σκέψεις για το μέλλον του ελεύθερου λογισμικού'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-4822173799899281166</id><published>2010-03-11T01:10:00.000-08:00</published><updated>2010-03-11T01:11:47.822-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>FORTRAN ξανά</title><content type='html'>FORTRAN ξανά&lt;br /&gt;Ή "η νέα γλώσσα προγραμματισμού"&lt;br /&gt;&lt;br /&gt;Ακούω γέλια; Ναι η FORTRAN είναι μια σύγχρονη γλώσσα προγραμματισμού που μαθαίνεται από πολλούς νέες και νέους στο forum μας, αλλά δυστυχώς δε διδάσκεται (τουλάχιστον σωστά). Και επειδή αυτοί που τη διδάσκουν δε ξέρουν από ελεύθερο λογισμικό, οπότε δε μπορούν να γράψουν έναν οδηγό και να τον διαθέσουν ελεύθερο, αποφάσισα να κάνω εγώ αυτή τη δουλειά. (Όχι ότι δε μου κάνει κέφι)&lt;br /&gt;&lt;br /&gt;Πολλές από τις πληροφορίες που αναφέρω εδώ βρίσκονται ήδη στους οδηγούς της υπογραφής μου, αλλά τις επαναλαμβάνω για τους τεμπέληδες. Καταρχήν (επειδή έχω κουραστεί να ακούω το logari81 να τονίζει τη διαφορά μεταξύ compiler, IDE, κλπ κλπ) υπάρχει το IDE, Integrated Development Environment, με το οποίο δεν πρόκειται να ασχοληθώ καθόλου. Όπως λέει η λέξη είναι ένα ολοκληρωμένο περιβάλλον ανάπτυξης, τίποτε λιγότερο τίποτε παραπάνω. Δεν είναι compiler, δεν είναι linker. Παράδειγμα: geany.&lt;br /&gt;&lt;br /&gt;Compiler: Είναι το πρόγραμμα εκείνο (γραμμής εντολών) που παίρνει τον πηγαίο κώδικα και το μετατρέπει σε δυαδικό εκτελέσιμο. Πάλι τίποτε λιγότερο τίποτε παραπάνω. Στον compiler ΔΕ γράφουμε κώδικα. Παραδείγμα: gfortran. Εγκατάσταση:&lt;br /&gt;sudo apt-get install gfortran&lt;br /&gt;&lt;br /&gt;Linker: Είναι το πρόγραμμα εκείνο (γραμμής εντολών) που "συνδέει" όλα τα δυαδικά αρχεία σε ένα εκτελέσιμο. Πάλι τίποτε λιγότερο τίποτε παραπάνω. Πολλές φορές ο compiler καλεί, ξανατονίζω καλεί, τον linker. Ο compiler ΔΕΝ κάνει linking. Kαλεί απλώς το linker. Παράδειγμα: ld. &lt;br /&gt;&lt;br /&gt;Τώρα που ξεκαθαρίσαμε τις βασικές έννοιες μπορούμε να προχωρήσουμε με τη FORTRAN. Όπως είπαμε FORTRAN είναι μια γλώσσα προγραμματισμού. Άλλα έχει πολλά πρότυπα, standards, όπως fortran 66, fortran 77, fortran 90/95, fortran 2003.Όταν γράφεις ένα πρόγραμμα αποφασίζεις σε ποιο πρότυπο θα το γράψεις, ή άλλοι το έχουν αποφασίσει πριν από σένα. Σε γενικές γραμμές είναι backwards compatible. Δε θα μπω σε λεπτομέρειες. Το fortran 66 είναι απαρχαιωμένο, μην το χρησιμοποιείτε. Το fortran 77 είναι μεν παλιό αλλά υπάρχει πολύ "legacy" κώδικας εκεί έξω που είναι γραμμένο σε αυτό. Αν ξεκινάτε κάτι καινούριο, τότε fortran 90/95. To fortran 2003 είναι ακόμη καινούριο, μη δοκιμασμένο και είναι πολύ πιθανό ο compiler gfortran να μην έχει όλες τις δυνατότητες που προδιαγράφονται από το πρότυπο. Ο gfortran υποστηρίζει τα πρότυπα 77 και 90/95 (για τα άλλα δεν είμαι σίγουρος). Ο g77 μόνο το 77 (όπως μαντεύετε και από το όνομα)&lt;br /&gt;&lt;br /&gt;Αυτά και με τα πρότυπα. Μία άλλη σημαντική παρατήρηση είναι το format. Στο fortran 77 επειδή είχαν ακόμη κάρτες διάτριτες (τώρα μπορείτε να δείτε σε μουσεία τέτοιες) το πρότυπο προέβλεπε οι πρώτες 6 στήλες να είναι κενές και επιτρέπεται να γράφεις μέχρι την εβδομικοστή κάτι στήλη.  Αυτό ονομάζεται fixed format, ενώ το ελεύθερο ονομάζεται free format. O compiler gfortran υποστηρίζει και τα δύο ανάλογα με την κατάληξη του αρχείου ή το command line argument: -ffree-form -ffixed-form και άλλα που μπορούν να βρεθούν εδώ http://linux.die.net/man/1/gfortran&lt;br /&gt;&lt;br /&gt;Για να σκεφτούμε, τι άλλο χρειάζεται; Α ναι, ένα παράδειγμα. Γράφουμε στο αρχείο foo.f: &lt;br /&gt;print*, "hello world"&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt; Ανοίγουμε το τερματικό και προσπαθούμε να το κάνουμε compile με:&lt;br /&gt;gfortran foo.f&lt;br /&gt;σφάλμα&lt;br /&gt;&lt;br /&gt;ξαναπροσπαθούμε:&lt;br /&gt;gfortran -ffree-form foo.f&lt;br /&gt;οκ&lt;br /&gt;&lt;br /&gt;το μετονομάζουμε το αρχείο σε foo.f90 και ξαναπροσπαθούμε:&lt;br /&gt;gfortran foo.f90&lt;br /&gt;οκ&lt;br /&gt;&lt;br /&gt;Τώρα στο αρχείο foo.f προσθέτουμε 6 κενά σε κάθε γραμμή:&lt;br /&gt;      print *, "hello, world"&lt;br /&gt;      end&lt;br /&gt;και ξαναπροσπαθούμε&lt;br /&gt;gfortran foo.f&lt;br /&gt;οκ&lt;br /&gt;&lt;br /&gt;You got the point? Ωραία αλλάζουμε κεφάλαιο. (Με προσοχή τις σελίδες γιατί είναι παλιές και ευαίσθητες) &lt;br /&gt;&lt;br /&gt;Πριν αλλάξουμε κεφάλαιο (με προσοχή τις σελίδες είπαμε) ας δούμε τη διαφορά compiling και linking. Mέχρι στιγμής λέγαμε στον compiler να κάνει τη όλη δουλειά μόνος του, δηλαδή και το compile και να καλέσει το linker (αν έχετε ανοιχτό το top σε άλλο τερματικό θα δείτε που τρέχει στιγμιαίο η εντολή ld). Aν όμως εκτελέσουμε την εντολή&lt;br /&gt;gfortran -c foo.f &lt;br /&gt;Εδώ γίνεται μόνο compile, δημιουργείται το *.ο αρχείο του πηγαίου κώδικα.&lt;br /&gt;&lt;br /&gt;Τώρα με&lt;br /&gt;gfortran -o a.out foo.o&lt;br /&gt;λέμε στον compiler να συνδέσει το εκτελέσιμο a.out με το δυαδικό foo.o.&lt;br /&gt;&lt;br /&gt;Αυτά. Happy crunching!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-4822173799899281166?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/4822173799899281166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2010/03/fortran.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/4822173799899281166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/4822173799899281166'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2010/03/fortran.html' title='FORTRAN ξανά'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-863426458300365935</id><published>2009-10-22T01:57:00.001-07:00</published><updated>2009-10-22T01:59:58.178-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Ghostscript</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;Η αποθήκευση ορισμένων σελίδων από αρχεία pdf, ps, eps ώς ξεχωριστά αρχεία καθώς και η συγχώνευση πολλών αρχείων pdf, ps, eps είναι αρκετά εύκολη με το πρόγραμμα ghostscript. Από τη γραμμή εντολών το πρόγραμμα αυτό εκτελείται πληκτρολογόντας gs. &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;H αποθήκευση ορισμένων σελίδων ως νέο αρχείο γίνεται με την παρακάτω εντολή:&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf -dFirstPage=first -dLastPage=last input.pdf&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;όπου output.pdf είναι το όνομα του καινούριου αρχείου, first είναι ο αριθμός της πρώτης σελίδας που θέλουμε να εξάγουμε, last είναι ο αριθμός της τελευταίας σελίδας που θέλουμε να εξάγουμε, και input.pdf είναι το όνομα του αρχικού αρχείου.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;Η συγχώνευση πολλών αρχείων pdf γίνεται με την παρακάτω εντολή:&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf input1.pdf input2.pdf input3.pdf&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;όπου output.pdf είναι πάλι το όνομα του νέου αρχείου και input1.pdf, input2.pdf input3.pdf είναι τα ονόματα των αρχείων προς συγχώνευση.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;Και ένα script που αυτοματοποιεί κάπως την πληκτρολόγηση δίνεται παρακάτω:&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;#!/bin/csh -f&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;# pdfextract - extracts pages from a pdf&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;# 2009.06.19 - written by DP&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set output=0&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set com=`basename $0`&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set USAGE="usage: $com [-f FirstPage] [-l LastPage] [-o OutputFile] [file]"&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set argv=(`getopt f:l:o: $*`)&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set errflg=$status&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set first=1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set last=0&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set pdffile=""&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;if ($errflg == 0) then&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;while ("$argv[1]" != "--")&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;switch ($argv[1])&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;case -f:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set first=$argv[2]&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;shift argv&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;breaksw&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;case -l:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set last=$argv[2]&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;shift argv&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;breaksw&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;case -o:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set output=1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set OutputFile=$argv[2]&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;shift argv&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;breaksw&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;default:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set errflg=1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;breaksw&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;endsw&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;shift argv&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;end&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;shift argv&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;endif&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;if ( $#argv == 0 ) then&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set errflg=2&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;endif&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;if ($errflg != 0) then&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;echo "$USAGE"&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;exit 1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;endif&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;if ($output == 0) then&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;if ( $last == 0 ) then&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set OutputFile="`basename -s .pdf $1`$first-end.pdf"&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;else&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set OutputFile="`basename -s .pdf $1`$first-$last.pdf"&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;endif&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;endif&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;foreach i ( ${argv} )&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set pdffile="$pdffile $i"&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;end&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;if (-e $OutputFile) then&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;echo "$OutputFile already exists"&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;exit 1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;endif&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;if ( $last == 0 ) then&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set gsargs=""&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;else&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;set gsargs="-dLastPage=$last"&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;endif&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$OutputFile -dFirstPage=$first $gsargs $pdffile&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;ΥΓ. Προσοχή που αλλάζει η γραμμή και που συνεχίζεται.&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-863426458300365935?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/863426458300365935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2009/10/ghostscript.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/863426458300365935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/863426458300365935'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2009/10/ghostscript.html' title='Ghostscript'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-7164168658112006430</id><published>2009-09-15T01:01:00.000-07:00</published><updated>2010-10-28T02:23:43.003-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metaprogramming'/><title type='text'>Μεταπρογραμματισμός</title><content type='html'>&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Μεταγλώσσα, μεταλογική και μεταπρογραμματισμός&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;Ήθελα να προγραμματίσω στην python την εντολή struct του matlab, η οποία λειτουργεί ως εξής:&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;a = struct('x', 1, 'y', [1,2], 'z', zeros(2))&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;και δημιουρργεί μια τέτοια δομή:&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;a = &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;    x: 1&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;    y: [1 2]&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;    z: [2x2 double]&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;και μετά είναι δυνατό να γράψουμε:&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;a.id = 1&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;Μετά από μια χρονοβόρα αναζήτηση σε εγχειρίδια της python, σε online documentation και στο διαδίκτυο γενικότερα, οδηγήθηκα στη λέξη μεταπρογραμματισμός, και συνειρμικά φυσικά θυμήθηκα τις λέξεις μεταγλώσσα και μεταλογική. Στη γλώσσα χρησιμοποιούμε προτάσεις 'ένα συν ένα κάνει δύο' αλλά και 'η πρόταση "ένα συν ένα κάνει δύο" είναι αληθής'. Στην πραγματικότητα οι δύο αυτοί τύποι προτάσεων ανήκουν σε δύο διαφορετικές γλώσσες. Η μία είναι η γλώσσα που περιέχει ένα σύνολο προτάσεων---δυνατών συντακτικά και γραμματικά---και η μεταγλώσσα, η οποία περιέχει τις προτάσεις που εκφέρουν την αλήθεια ή ψευδος των προτάσεων της γλώσσας. Η μεταγλώσσα είναι κι αυτή φυσικά μια γλώσσα, η οποία στη συγκεκριμένη περίπτωση χρησιμοποιεί τα ίδια σύμβολα με τη γλώσσα. Στο παραπάνω παράδειγμα η πρόταση  'ένα συν ένα κάνει δύο' ανήκει στη γλώσσα, ενώ η 'η πρόταση "ένα συν ένα κάνει δύο" είναι αληθής' ανήκει στη μεταγλώσσα. &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;Μια μεταγλώσσα με τη σειρά της μπορεί να έχει μια τρίτη μεταγλώσσα η οποία περιγραφει την αλήθεια των προτάσεώ της. Για παράδειγμα &lt;η πρόταση 'η πρόταση "ένα συν ένα κάνει δύο" είναι αληθής' είναι αληθής&gt; ανήκει στη μεταγλώσσα της μεταγλώσσας. &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;Ο κλάδος της λογικής (ή των μαθηματικών) που ασχολείται με αυτά τα προβλήματα είναι η μεταλογική (ή τα μεταμαθηματικά). &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;Κατ' αναλογία, υπάρχει κάτι αντίστοιχο και στον προγραμματισμό. Όχι με έκφραση αλήθειας βέβαια. Στον αντικειμενοστραφή προγραμματισμό είναι γνωστές οι έννοιες της κληρονομικότητας (inheritance), πολυμορφίας (polymorphism), encapsulation (δε γνωρίζω την ελληνική έννοια), κ.α. Δημιουργούμε classes, υπερφορτώνουμε τελεστές, κρύβουμε δεδομένα, αλλά οι δυνατότητες της python επεκτείνονται και στον μεταπρογραμματισμό. &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;def struct(*args):&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;    class mystruct: pass&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;    for i in range(len(args)/2):&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;        setattr(mystruct, args[2*i], args[2*i+1])&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;    return mystruct&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-7164168658112006430?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/7164168658112006430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2009/09/blog-post.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/7164168658112006430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/7164168658112006430'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2009/09/blog-post.html' title='Μεταπρογραμματισμός'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-3980196624399081457</id><published>2009-08-05T02:36:00.000-07:00</published><updated>2009-08-05T02:39:37.673-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='φιλοσοφία'/><title type='text'>Εκλογικό σύστημα</title><content type='html'>&lt;span class="Apple-style-span"   style="  ;font-family:Helvetica;font-size:12px;"&gt;&lt;div&gt;&lt;p style="text-align: justify;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; "&gt;Χρειαζόμαστε μια αναγέννηση. Όχι φυσικά υπό το εθνικιστικό πρήσμα ορισμένων. Ούτε όμως μία τεχνολογική αναγέννηση. Μια απαρχή της ανθρωπιστικής σκέψης ύπο ένα νέο πρίσμα. Μέχρι τώρα οι ανθρωπιστικές επιστημές, όπως και η ιατρική, ήταν περιχαρακωμένες στο δικό τους τρόπο σκέψης. Δε δεχόταν την επιρροή των μαθηματικών και της φυσικής. Αντίθετα τώρα βλέπουμε τη κβαντομηχανική να εισρέει στο πεδίο της λειτουργίας του εγκεφάλου και κατ'επέκταση να προσπαθεί να απαντήσει το ερώτημα της ελευθερίας της σκέψης. Οι φιλόσοφοι δε μπορούν πλέον να παράγουν τίποτε καινούριο, αναμοχλεύουν τα παλιά. Ακόμη κι αν το αρνούνται τα μαθηματικά επηρεάζουν  όλες τις πτυχές τις φιλοσοφίες.  &lt;/p&gt; &lt;p style="text-align: justify;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="text-align: justify;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; "&gt;Ένα εκλογικό σύστημα πλειοψηφίας είναι στη βάση του μη δημοκρατικό. Γιατί; Ας πάρουμε το εξής παράδειγμα των 100 ψηφοφόρων. Οι 40 ψηφίζουν για τον Α. Οι 30 για το Β και οι άλλοι 30 για το Γ. Αυτοί που ψήφισαν για το Β, αν δεν έβγαινε ο Β θα προτιμούσαν το Γ και όχι τον Α. Αυτοί που ψήφισαν για το Γ, αν δεν έβγαινε ο Γ θα προτιμούσαν το Β και όχι τον Α. Και αυτοί που ψήφισαν για τον Α, αν δεν έβγαινε ο Α θα προτιμούσαν το Β και όχι το Γ. Αμεσως αμέσως παρατηρούμε ότι τον Α τον θέλουν λιγότεροι (40) από αυτούς που τον αντιπαθούν (30+30). Και καταλήγουμε σε ένα κλίμα τόσο κοινωνικής όσο και πολιτικής αντιπάθειας. Αν όμως λάβουμε υπόψην τις δεύτερες προτιμήσεις των ψηφοφόρων τότε ο Β έχει 40 από αυτούς που θα ψήφιζαν τον Α συν 30 από αυτούς που θα ψήφιζαν το Γ (συν φυσικά τους δικούς του 30) και κανένα που τον αντιπαθεί. Δηλαδή όλοι θα προτιμούσαν το Β από τον Α!!!  &lt;/p&gt; &lt;p style="text-align: justify;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="text-align: justify;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; "&gt;Φυσικά τα πράγματα δεν είναι τόσα απλά, αλλά αυτό που θέλω να δείξω είναι η ανάγκη να αναθεωρήσουμε τον τρόπο σκέψης μας γενικότερα. Η αθηναϊκη δημοκρατία ήταν δημοκρατία όχι μόνο λόγω της άμεσης ψήφου, αλλά επείδη οι πολίτες είχαν το δικαίωμα του εξοστρακισμού. Σήμερα αυτό δεν υπάρχει. &lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-3980196624399081457?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/3980196624399081457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2009/08/blog-post_05.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/3980196624399081457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/3980196624399081457'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2009/08/blog-post_05.html' title='Εκλογικό σύστημα'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-6447233823823012160</id><published>2009-08-04T05:02:00.000-07:00</published><updated>2009-08-04T05:08:42.522-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='φιλοσοφία'/><title type='text'>Η κατάπτωση του σύγχρονου νεοελληνικού πολιτισμού</title><content type='html'>&lt;p style="text-align: justify;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; "&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="text-align: justify;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; "&gt;Δυστυχώς η επικεφαλίδα του παρόντος άρθρου δεν είναι καθόλου αισιόδοξη. Η πικρή αλήθεια είναι ότι ο σύγχρονος νεοελληνικός πολιτισμός είναι ανύπαρκτος. Δεν έχει να προσφέρει τίποτε απολύτως στο παγκόσμιο γίγνεσθαι. Το μόνο έκθεμα που του έχει απομείνει είναι τα άψυχα αγάλματα ενός εδώ και καιρό πεθαμένου πολιτισμού τα οποία φυλάσονται σε κτήρια, τα οποία τα αποκαλούμε μουσεία, ενώ τα σύγχρονα μουσεία στις αναπτυγμένες χώρες είναι διαδραστικά δίνοντας στον επισκέπτη τη δυνατότητα να μάθει από την επίσκεψή του. Τα κείμενα δε που συνοδεύουν τα αγάλματα είναι ξεχασμένα σε κάποιες βιβλιοθήκες των σχολών της φιλοσοφικής. &lt;/p&gt; &lt;p style="text-align: justify;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="text-align: justify;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; "&gt;Τα αίτια αυτής της κατάπτωσης μπορεί να ποικίλουν από την διαφθορά των πολιτικών και των πολιτών--δεν είναι μόνο οι πολιτικοί διεφθαρμένοι--μέχρι τη δομή του εκπαιδευτικού συστήματος. Σε πολλά συστήματα--με τον όρο σύστημα εννοείται οποιοδήποτε φυσικό ή κοινωνικό--άρση της αιτίας οδηγεί και σε άρση του αποτελέσματος. Παρόλ'αυτά η κατάπτωση του σύγχρονου πολιτισμού μας δεν άρεται απλά με την αλλαγή του εκπαιδευτικού συστήματος. Υψίστης σημασίας είναι η αλλαγή του τρόπου σκέψης ή καλύτερα η απαρχή της σκέψης, μιας και στη σύγχρονη κοινωνία η σκέψη, συνοδευόμενη από κριτική ικανότητα,   απουσιάζει παντελώς. &lt;/p&gt; &lt;p style="text-align: justify;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="text-align: justify;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; "&gt;H σύγχρονη δήθεν τεχνολογικά αναπτυγμένη κοινωνία μας έχει στη διάθεσή της μεταξύ των άλλων ηλεκτρονικούς υπολογιστές, ασύρματη επικοινωνία, πληθώρα μεταφορικών μέσων. Παρόλ'αυτά η γνώση των αρχών λειτουργίας τους αμελήται. Oι νέοι αδιαφορούν να μάθουν και αδιαφορούν να σκεφτούν. Ίσως επειδή δεν έχουν μάθει, αλλά πολύ πιο πιθανό είναι επειδή κάποιοι τους στέρουν εσκεμμένα αυτή τη δυνατότητα. Οι περισσότεροι νέοι που θέλουν να μάθουν κάτι παραπάνω φεύγουν στο εξωτερικό, επείδη η ελληνική πραγματικότητα τους στερεί ακριβώς αυτή τη δυνατότητα. &lt;/p&gt; &lt;p style="text-align: justify;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="text-align: justify;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; "&gt;Ο τρόπος διδασκαλίας έχει πλέον χάσει το νόημά του. Τα πανεπιστήμια αδυνατούν να διδάξουν, με φυσικά ελάχιστες εξαιρέσεις. Δεν υπάρχουν ελληνικά περιοδικά για τις φυσικές επιστήμες, τα μαθηματικά, τη φιλοσοφία ή αν υπάρχουν είναι απολιθωμένα σε μια προϊστορική εποχή. Παρ'όλαυτά βλέπουμε μικρές εστίες, που εκμεταλλεύονται τις νέες τεχνολογίες του διαδικτύου και προσπαθούν να αναζωπυρώσουν την όρεξη των νέων για μάθηση και για σκέψη.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-6447233823823012160?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/6447233823823012160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2009/08/blog-post.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/6447233823823012160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/6447233823823012160'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2009/08/blog-post.html' title='Η κατάπτωση του σύγχρονου νεοελληνικού πολιτισμού'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-4773002977347499114</id><published>2009-06-26T15:32:00.000-07:00</published><updated>2009-07-31T10:10:14.969-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='mathematics'/><title type='text'>Maxima</title><content type='html'>To Maxima είναι ένα σύστημα υπολογιστικής άλγεβρας (computer algebra system) για την επεξεργασία συμβολικών και αριθμητικών εκφράσεων. Συμπεριλαμβάνει παραγώγιση, ολοκλήρωση, σειρές Taylor, μετασχηματισμοί Laplace, κανονικές διαφορικές εξισώσεις, συστήματα γραμμικών εξισώσεων, πολυώνυμα καθώς και σύνολα, διανύσματα, πίνακες και τανυστές.Το Maxima προσφέρει υψηλής ακρίβειας αριθμητικά αποτελέσματα χρησιμοποιώντας ακριβή κλάσματα, μεταβλητής ακρίβειας ακεραίους και μεταβλητής ακρίβειας πραγματικούς αριθμούς. Έχει τη δυνατότητα σχεδιασμού συναρτήσεων και δεδομένων σε δύο και τρεις διαστάσεις.&lt;br /&gt;&lt;br /&gt;Το πρόγραμμα Maxima είναι τώρα πλέον ελεύθερο λογισμικό υπό την άδεια GNU GPL ενώ κατάγεται από το Macsyma, το θρυλικό σύστημα υπολογιστικής άλγεβρας που αναπτύχθηκε στα τέλη του 1960 στο πανεπιστήμιο της Μassachussetts.&lt;br /&gt;&lt;br /&gt;Οι δυνατότητες του Maxima είναι απεριόριστες και εδώ θα περιοριστούμε στην παρουσίαση μερικών μόνο. Η γραμμή εντολών του χωρίζεται σε inputs και outputs, οπότε γράφοντας 9+7; θα πάρουμε ως αποτέλεσμα 16 (τo ; στο τέλος είναι απαραίτητο κατάλοιπο από τη C). Τίποτε το συνταρακτικό. Αν όμως δώσουμε 2/6; θα μας επιστρέψει 1/3, θα απλοποιήσει δηλαδή το κλάσμα χωρίς να υπολογίσει την προσέγγισή του. Αν θέλουμε ένα ρητό αριθμό ως προσέγγιση τότε θα πρέπει να γράψουμε float(1/3); για να πάρουμε το αποτέλεσμα 0.333333333333. Αλλά ας περάσουμε σε κάτι πιο θεαματικό. Ας υποθέσουμε ότι χρειαζόμαστε να αναπτύξουμε τον αριθμό 30! (30 παραγοντικό είναι 1*2*3*...*28*29*30) σε γινόμενο πρώτων παραγόντων, τότε γράφοντας factor(30!); παίρνουμε ως αποτέλεσμα 2^26*3^14*5^7*7^4*11^2*13^2*17*19*23*29. Φυσικά με τον ίδιο τρόπο μπορούμε να παραγοντοποιήσουμε πολυώνυμα factor(x^2 + x -6); για να δούμε (x-2)(x+3).&lt;br /&gt;&lt;br /&gt;H επίλυση εξισώσεων γίνεται το ίδιο εύκολα solve(x^2-4,x); Το δεύτερο όρισμα, x, δηλώνει ως προς ποια μεταβλητή θα πρέπει να λυθεί η εξίσωση. Η παραγώγιση πραγματοποιείται με τη συνάρτηση diff(sin(x), x); Πάλι το δεύτερο όρισμα δηλώνει ως προς ποιά μεταβλητή πρέπει να παραγωγηθεί η δεδομένη συνάρτηση. Παρόμοια λειτουργεί και η αόριστη ολοκλήρωση integrate(1/x,x); και η ορισμένη ολοκλήρωση integrate(x+2/(x-3), x, 0, 1); H ανάπτυξη μιας συνάρτησης σε σειρά Taylor γίνεται με δύο τρόπους: niceindices(powerseries(%e^x, x, 0)); ή taylor(%e^x, x, 0, 5); Το όρισμα 0 δηλώνει σε ποιο σημείο να υπολογισθεί η σειρά ενώ στο δεύτερο τρόπο το όρισμα 5 δηλώνει πόσους όρους να δείξει στο αποτέλεσμα.&lt;br /&gt;&lt;br /&gt;Φυσικά ένα τέτοιο πρόγραμμα θα ήταν ελλειπές αν δεν είχε δυνατότητες σχεδιασμού. Χρησιμοποιεί το πρόγραμμα gnuplot για το σχεδιασμό. Οι συναρτήσεις plot2d και plot3d δίνουν αυτή τη δυνατότητα. Tα αποτελέσματα των εντολών plot2d([x^2, x^3, x^4-x+1], [x,-10,10]);&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Z8m106a4Z-w/SnMlGsTyg7I/AAAAAAAAAA8/rO7McoE7Km0/s1600-h/26a.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 243px;" src="http://2.bp.blogspot.com/_Z8m106a4Z-w/SnMlGsTyg7I/AAAAAAAAAA8/rO7McoE7Km0/s320/26a.png" alt="" id="BLOGGER_PHOTO_ID_5364672378031997874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt; και f(x,y):= sin(x) + cos(y); plot3d(f(x,y), [x,-5,5], [y,-5,5]); δίνουν τα αντίστοιχα διδιάστατα και τριδιάστατα γραφήματα. Στη δεύτερη περίπτωση ορίσαμε προηγουμένως μια νέα συνάρτηση χρησιμοποιώντας τον τελεστή := για να αποφύγουμε μια μακροσκελή εντολή.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Z8m106a4Z-w/SnMk5CGVMoI/AAAAAAAAAA0/-qY4QTXySAQ/s1600-h/26b-new.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 243px;" src="http://3.bp.blogspot.com/_Z8m106a4Z-w/SnMk5CGVMoI/AAAAAAAAAA0/-qY4QTXySAQ/s320/26b-new.png" alt="" id="BLOGGER_PHOTO_ID_5364672143362962050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To πρόγραμμα είναι γραμμένο σε Common Lisp και περιλαμβάνει μια πλήρη γλώσσα προγραμματισμού και σύνταξη παρόμοια με την ALGOL. Mπορεί να προσπελαστεί προγραμματιστικά και να επεκταθεί καθώς η υποκείμενη Lisp μπορεί να κληθεί μέσα από το Maxima. Μία άλλη πολύ ενδιαφέρουσα δυνατότητα του Maxima είναι η δημιουργία κώδικα για compiled γλώσσες προγραμματισμού όπως η FORTRAN.&lt;br /&gt;&lt;br /&gt;Εγκαθίσταται πολύ απλά από τη γραμμή εντολών με sudo apt-get install maxima ή από το μενού Εφαρμογές &gt; Προσθαφαίρεση Προγραμμάτων. Πρόσθετα πακέτα που μπορούν να φανούν χρήσιμα είναι τα maxima-doc, maxima-emacs, kayali (ένα GUI γραμμένο σε Qt), xmaxima (ένα GUI γραμμένο σε tcl/tk). Περισσότερες λεπτομέρειες μπορούν να βρεθούν στην ιστοσελίδα http://maxima.sourceforge.net/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-4773002977347499114?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/4773002977347499114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2009/06/maxima.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/4773002977347499114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/4773002977347499114'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2009/06/maxima.html' title='Maxima'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Z8m106a4Z-w/SnMlGsTyg7I/AAAAAAAAAA8/rO7McoE7Km0/s72-c/26a.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-9021880330137128925</id><published>2009-06-25T10:21:00.001-07:00</published><updated>2009-06-25T11:18:51.679-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Η τέχνη του προγραμματισμού</title><content type='html'>Σε καμιά περίπτωση δεν κατέχω την υψηλή αυτή τέχνη, απλώς προσπαθώ να μοιραστώ λίγη από τη γεύση της και θα χαρώ να διαβάσω τις δικές σας εμπειρίες.&lt;br /&gt;&lt;br /&gt;Γιατί τέχνη και γιατί προγραμματισμός; Προγραμματισμός γιατί όλες οι εφαρμογές στον υπολογιστή απαιτούν προγραμματισμό στη μία ή στην άλλη γλώσσα. Τέχνη γιατί δεν αρκεί να μάθει κανείς πως αναμιγνύονται τα χρώματα για να γίνει ζωγράφος, ούτε να μάθει να διαβάζει το πεντάγραμμο για να γίνει μουσικός. Φυσικά είναι απαραίτητες προϋποθέσεις αλλά δεν είναι οι μοναδικές. Έτσι και στον προγραμματισμό δε αρκεί να μάθει κανείς τη σύνταξη μιας γλώσσας για να πει ότι είναι προγραμματιστής.&lt;br /&gt;&lt;br /&gt;Η τέχνες δε μαθαίνονται στα πανεπιστήμια (μεγάλη κουβέντα αυτή, αλλά από προσωπική εμπειρία και βλέποντας φίλους αυτό συμπεράνω). Η τέχνη είναι κάτι που το ασκείς και εξασκείς μόνος σου. Κανείς δε μπορεί να σε βοηθήσει να γίνεις καλύτερος αν δεν προσπαθήσεις μόνος σου.&lt;br /&gt;&lt;br /&gt;Τα απαραίτητα χαρακτηριστικά ενός προγραμματιστή είναι να μπορεί να προγραμματίσει οτιδήποτε σε οποιαδήποτε γλώσσα. Αυτό δε σημαίνει ότι ξέρει όλες τις γλώσσες αλλά στην ανάγκη μπορεί να μάθει τη σύνταξη. Αυτό που απαιτείται είναι να μπορεί να χρησιμοποιεί χαρακτηριστικά της μιας γλώσσας σε άλλη. Αυτό που θέλω να πω είναι ότι η σύνταξη δεν πρέπει να είναι περιορισμός για την ανάγνωση ή τη συγγραφή ενός προγράμματος.&lt;br /&gt;&lt;br /&gt;H τέχνη του προγραμματισμού δεν περιλαμβάνει μόνο το γράψιμο κώδικα, αλλά κυρίως την αποσφαλμάτωσή του (debugging). Το πρώτο βήμα είναι η ορθή ανάγνωση του σφάλματος, το οποίο περιέχει αρκετές πληροφορίες για να βρούμε τη λύση του προβλήματος. Στην περίπτωση που το σφάλμα είναι bus error ή segmentation fault τότε αρχίζει η πραγματική τέχνη. Στη διαδικασία της αποσφαλμάτωσης ενά απλό printf διάσπαρτο σε διάφορα σημεία του κώδικα μπορεί να αντικαταστήσει και τον καλύτερο εργαλείο αποσφαλμάτωσης.&lt;br /&gt;&lt;br /&gt;Η τέχνη του προγραμματισμού περιλαμβάνει την κατανόηση του πως λειτουργεί, στοιχειωδώς τουλάχιστον, ο μεταγλωττιστής (compiler) ή ο ερμηνευτής (interpreter) της γλώσσας που χρησιμοποιούμε. Μόνο έτσι θα μπορεί να βελτιστοποιήσει κανείς ένα πρόγραμμα ή να βρει ένα δύσκολο λάθος σε άλλο. Tαυτόχρονα να κατανοεί πως λειτουργεί ο υπολογιστής και το λειτουργικό σύστημα, για να κατανοήσει τι σημαίνει θέση μνήμης και δείκτης.&lt;br /&gt;&lt;br /&gt;Η τέχνη του προγραμματισμού περιλαμβάνει τη γνώση των απαραίτητων εργαλείων που κάνουν τη ζωή του προγραμματιστή πιο εύκολη, αλλά ίσως και όχι. Τι θέλω να πω; Ο προγραμματιστής οφείλει να μπορεί να διαβάσει το Makefile ή το configure script ενός προγράμματος, να μπορεί να χρησιμοποιήσει debuggers και ταυτόχρονα όλα αυτά από τη γραμμή εντολών. Παρόλ'αυτά αν βρεθεί σε ένα καινούριο περιβάλλον να μπορεί να εξοικειωθεί γρήγορα με τα νέα εργαλεία του.&lt;br /&gt;&lt;br /&gt;Ο προγραμματιστής οφείλει, αν δεν έχει στη διάθεσή του τα απαραίτητα εργαλεία, να μπορεί να τα κατασκευάσει μόνος του. Δικαιολογίες όπως "δε βρίσκω αυτό το πρόγραμμα για να κάνω τη δουλειά μου" δε γίνονται δεκτές.&lt;br /&gt;&lt;br /&gt;Προγραμματισμός σημαίνει να βρίσκεται η βέλτιστη λύση σε κάθε πρόβλημα. Το κριτήριο όμως της βελτιστότητας κάθε φορά διαφέρει. Άλλες φορές είναι η ταχύτητα εκτέλεσης και άλλες φορές η ταχύτητα συγγραφής. Πολλές φορές η μέθοδος "brute force" είναι αποδεκτή όταν ένας πολύπλοκος αλγόριθμος θα χαλάσει την απλότητα του προγράμματος, χωρίς αυτό να σημαίνει ότι απλότητα είναι πάντα και ωραία.&lt;br /&gt;&lt;br /&gt;Η τέχνη του προγραμματισμού έγγειται στο να αφήνουμε τον υπολογιστή να κάνει επαναλαμβανόμενες και άρα ανιαρές εργασίες. Αυτό σημαίνει όταν έχουμε να γράψουμε κώδικα είναι καλύτερο να γράφουμε προγράμματα που γράφουνε κώδικα. Έτσι μειώνονται οι πιθανότητες για ανθρώπινο λάθος.&lt;br /&gt;&lt;br /&gt;Ο καλύτερος τρόπος να αποκτήσει κανείς εμπειρία με τον προγραμματισμό είναι να αρχίσει να προγραμματίζει. Στον κόσμο του ελεύθερου λογισμικού όπου ο κώδικας είναι ελεύθερος οι δυνατότητες για μάθηση είναι απεριόριστες. Η μελέτη κώδικα που έχουν γράψει άλλοι προγραμματιστές και η βήμα-βήμα επέκτασή του είναι ενδεδειγμένη τεχνική στην απόκτηση εμπειρίας και γνώσεων. Είναι αλήθεια ότι στην αρχή όλα φαίνονται δυσνόητα και απρόσιτα αλλά με την πάροδο του χρόνου ο κώδικας αρχίζει και γίνεται κατανοητός.&lt;br /&gt;&lt;br /&gt;Ο προγραμματισμός πρέπει να είναι στάση ζωής. Αυτό σημαίνει να βρίσκουμε αλγόριθμους για επίλυση προβλημάτων στην καθημερινή μας ζωή, όπως ποιός είναι ο συντομότερος δρόμος για τη δουλειά ή ποια είναι η βέλτιστη τακτική στο risk.&lt;br /&gt;&lt;br /&gt;Τέλος, σημασία έχει να διασκεδάζουμε με αυτό κάνουμε, διαφορετικά όλα είναι μάταια (όχι ότι δεν είναι ούτως ή άλλως, αλλά ας πούμε ότι δεν είναι).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-9021880330137128925?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/9021880330137128925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2009/06/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/9021880330137128925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/9021880330137128925'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2009/06/blog-post.html' title='Η τέχνη του προγραμματισμού'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-6185863348655222380</id><published>2009-04-29T01:28:00.001-07:00</published><updated>2009-04-29T01:31:29.932-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unclassified'/><title type='text'>Περί της λειτουργίας του εγκεφάλου</title><content type='html'>Oι νόμοι της φύσης υπάρχουν γιατί είμαστε---οι άνθρωποι δηλαδή---έλλογα όντα (είμαστε όντως;) ή μήπως είμαστε έλλογα όντα (αν είμαστε φυσικά) εξαιτίας των νόμων της φύσης; Οι φυσικοί νόμοι δηλαδή, προβλέπουν την ανθρώπινη ευφυία και αν ναι τότε προβλέπουν (με άμμεσο ή έμμεσο τρόπο) τις ερωτήσεις αυτές;&lt;br /&gt;&lt;br /&gt;Τι μαθηματικά χρειάζονται για να περιγραφεί η λειτουργία του εγκεφάλου; Ποιοι είναι οι φυσικοί νόμοι που διέπουν τη λειτουργία του εγκεφάλου; Τα φαινόμενα της συνείδησης διέπονται τους νόμους της κβαντομηχανικής; Αλλά τι είναι συνείδηση;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-6185863348655222380?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/6185863348655222380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2009/04/blog-post_29.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/6185863348655222380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/6185863348655222380'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2009/04/blog-post_29.html' title='Περί της λειτουργίας του εγκεφάλου'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-5136927882167147478</id><published>2009-04-28T01:09:00.000-07:00</published><updated>2009-04-28T01:18:11.060-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mathematics'/><title type='text'>Αυτόματος έλεγχος</title><content type='html'>Στον αυτόματο έλεγχο (control) έχουμε ένα δυναμικό σύστημα (κανονική διαφορική εξίσωση) και προσπαθούμε να ελέγξουμε τις παραμέτρους του συστήματος ώστε να μας δώσει το επιθυμητό αποτέλεσμα. Με την ίδια λογική μπορούμε να επεκτείνουμε την έννοια του ελέγχου και σε μερικές διαφορικές εξισώσεις, αν και σε αυτή την περίπτωση μιλάμε για βελτιστοποίηση (optimization) πλέον και όχι για έλεγχο. Oι εφαρμογές της βελτιστοποίησης μερικών διαφορικών εξισώσεων ποικίλουν από τη ρευστομηχανική και τις κατασκευές μέχρι τον ηλεκτρομαγνητισμό και γενικότερα όλα τα φαινόμενα που μπορούν να περιγραφούν με μερικές διαφορικές εξισώσεις.&lt;br /&gt;&lt;br /&gt;Τόσο η θεωρία του αυτόματου ελέγχου όσο και η βελτιστοποίηση μερικών διαφορικών εξισώσεων μπορεί να εφαρμοστεί σε plc για τον έλεγχο και βελτιστοποίηση σε πραγματικό χρόνο παραγωγικών διεργασίων.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-5136927882167147478?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/5136927882167147478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2009/04/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5136927882167147478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5136927882167147478'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2009/04/blog-post.html' title='Αυτόματος έλεγχος'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-6795211505479484643</id><published>2009-03-22T08:11:00.000-07:00</published><updated>2009-03-22T09:44:53.877-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>FORTRAN</title><content type='html'>10      IF (.NOT.(ΕΧΩ ΔΙΑΒΑΣΕΙ &lt;a href="http://www.pbm.com/%7Elindahl/real.programmers.html"&gt;ΑΥΤΟ&lt;/a&gt;)) ΤΗΕΝ&lt;br /&gt;        READ IT&lt;br /&gt;        ELSE&lt;br /&gt;        GOTO 10&lt;br /&gt;        END IF&lt;br /&gt;&lt;br /&gt;Κάπως έτσι φαίνεται ο κώδικας στην τυποποίηση της FORTRAN 77. Όλα κεφαλαία, καθόλου identation, πολλά goto και άλλα πολλά που κάνουν τον κώδικα δυσανάγνωστο. Αλλά η αρχαιότερη γλώσσα υψηλού επιπέδου έχει εξελιχθεί αρκετά. Υποστηρίζει πολλά χαρακτηριστικά του αντικειμενοστραφή προγραμματισμού με τα modules, έχει δικούς της δείκτες (pointers), αλλά και συμβατούς με τη C δείκτες (Cray pointers οι οποίοι όμως δεν περιλαμβάνονται στην τυποποίηση). Το πλεονέκτημά της είναι η ταχύτητα εκτέλεσης και ότι υπάρχει μια απειρία από προγράμματα που μπορεί να βρει κανείς σχετικά με επιστημονικούς υπολογισμούς. Για παράδειγμα το scipy της python περιλαμβάνει πολλούς wrapper σε προγράμματα FORTRAN (από εδώ www.netlib.org) για διαφορικές εξισώσεις, μετασχηματισμούς Fourier κ.α.. Φυσικά η FORTRAN υποστηρίζει και τις δύο μορφές παραλληλοποίησης, openmp και mpi.&lt;br /&gt;&lt;br /&gt;Σίγουρα στα γραφικά υστερεί. Aλλά για αυτό υπάρχει η C ή η python. H επικοινωνία με τη C είναι απλή (αν ξέρεις πως γίνεται δηλαδή), με παρόμοιο τρόπο γίνεται και με τη C++, αν και χρειάζεται και δεύτερο wrapper από C σε C++ για να μη χαθεί η αντικειμενοστρέφεια του κώδικα, με την python μπορεί να χρησιμοποιηθεί το πρόγραμμα f2py που γράφει ένα wrapper από τον FORTRAN κώδικα.&lt;br /&gt;&lt;br /&gt;Θα μου πείτε ποιος χρησιμοποιεί ακόμη FORTRAN όταν υπάρχει η python, η java, η C++ και τόσες άλλες γλώσσες προγραμματισμού; Πολλοί. Η πλειονότητα των προγραμμάτων στους υπερυπολογιστές (high performance computing) και σμήνη υπολογιστών (clusters) είναι προγράμματα FORTRAN. Δεν πρόκειται να δείτε κανένα πρόγραμμα java.&lt;br /&gt;&lt;br /&gt;Προγραμματίζοντας στη FORTRAN, όπως και στη C, μαθαίνει κανείς διαχείριση μνήμης. Το σίγουρο είναι ότι θα ψάχνεται με τις ώρες ένα bug που θα βγάζει segmentation fault ή bus error. Τα άλλα είναι σχετικά εύκολα, μιας και τα βρίσκει και o compiler.&lt;br /&gt;&lt;br /&gt;Μετά θα μου πείτε, μα αφού υπάρχει το octave ή το scilab ή τα αντίστοιχα εμπορικά; Ναι, και πάλι το octave χρησιμοποιει συναρτήσεις FORTRAN για την επίλυση εξισώσεων. Φυσικά είναι πολύ πιο εύκολο να προγραμματίσεις κάτι στο octave, αλλά αν ένας πίνακας είναι μεγάλος, της τάξης των 1.000.000 στοιχείων, τότε θα πρέπει να περιμένετε μέρες.&lt;br /&gt;&lt;br /&gt;Η FORTRAN υποστηρίζει και system call, δηλαδή μπορείτε να καλέσετε άλλα προγράμματα μέσω FORTRAN. Καθόλου καλή προγραμματιστική τεχνική αλλά γίνεται.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-6795211505479484643?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/6795211505479484643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2009/03/10-if.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/6795211505479484643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/6795211505479484643'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2009/03/10-if.html' title='FORTRAN'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-8931559154644434552</id><published>2009-02-24T06:04:00.000-08:00</published><updated>2009-03-22T08:13:03.162-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Γραφικά με GTK+</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Γενικά&lt;/span&gt;&lt;br /&gt;Θέμα του οδηγού αυτού είναι τα γραφικά με τη χρήση της βιβλιοθήκης GTK+. Ο επίσημος οδηγός στα αγγλικά βρίσκεται εδώ: http://library.gnome.org/devel/gtk-tutorial/stable/ Τα παραδείγματα που χρησιμοποιώ βρίσκονται και στον αρχικό οδηγό. Παρ'όλ' αυτά δεν πρόκειται για μετάφραση μιας και ο μεταφραστής είναι προδότης (traduttore traditore :D ) αλλά για έναν καινουριο οδηγό.&lt;br /&gt;Η GTK+ είναι μια βιβλιοθήκη που ξεκίνησε από το πρόγραμμα GIMP και εξελίχθηκε σε αυτόνομη βιβλιοθήκη. Παρέχει τις βασικές λειτουργίες για γραφικά, GUI, συμβάντα, κ.α.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Προαπαιτούμενα&lt;/span&gt;&lt;br /&gt;Για τη χρήση της βιβλιοθήκης θα χρειαστεί να εγκαταστήσουμε μερικά πακέτα, τα build-essential, gtk+-2.0, pkg-config. To build-essential μας δίνει το GNU C μεταγλωττιστή, τo εργαλείo make κ.α., το gtk+-2.0 είναι η βιβλιοθήκη, και το pkg-config είναι ένα βοηθητικό πρόγραμμα που διαχειρίζεται τις παραμέτρους για το gcc. Aνοίγουμε το τερματικό και πληκτρολογούμε:&lt;br /&gt;&lt;br /&gt;sudo apt-get install build-essential gtk+-2.0 pkg-config&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Το πρώτο πρόγραμμα&lt;/span&gt;&lt;br /&gt;Στον παρών οδηγό θα ασχοληθούμε με c, αλλά υπάρχουν και διεπιφάνειες και για άλλες γλώσσες προγραμματισμού. Ανοίγουμε ένα αρχείο bla.c και γράφουμε μέσα τον παρακάτω κώδικα:&lt;br /&gt;&lt;br /&gt;#include &amp;lt;gtk/gtk.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main( int   argc,&lt;br /&gt;      char *argv[] )&lt;br /&gt;{&lt;br /&gt;GtkWidget *window;&lt;br /&gt;&lt;br /&gt;gtk_init (&amp;amp;argc, &amp;amp;argv);&lt;br /&gt;&lt;br /&gt;window = gtk_window_new (GTK_WINDOW_TOPLEVEL);&lt;br /&gt;gtk_widget_show  (window);&lt;br /&gt;&lt;br /&gt;gtk_main ();&lt;br /&gt;&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Το αποθηκεύουμε και έπειτα το μεταγλωττίζουμε με την εντολή:&lt;br /&gt;&lt;br /&gt;gcc bla.c -o bla `pkg-config --cflags --libs gtk+-2.0`&lt;br /&gt;&lt;br /&gt;Προσοχή παραπάνω είναι ` και όχι ', αυτό σημαίνει αντικατάσταση του αποτελέσματος της εντολής pkg-config --cflags --libs gtk+-2.0, την οποία αν εκτελέσουμε μόνη της θα δούμε μια λίστα από διαδρομές, αρχεία, βιβλιοθήκες τα οποία είναι παράμετροι για το gcc. Φυσικά αν ξέρουμε τι κάνουμε αυτές τις παραμέτρους μπορούμε να τις τροποποιήσουμε με το χέρι.&lt;br /&gt;Τρέχοντας το πρόγραμμα:&lt;br /&gt;&lt;br /&gt;./bla&lt;br /&gt;&lt;br /&gt;θα δούμε ένα παράθυρο που δεν έχει τη δυνατότητα τερματισμού εκτός από το ctrl+c.&lt;br /&gt;&lt;br /&gt;H πρώτη γραμμή λέει στο πρόγραμμά μας ποια αρχεία να συμπεριλάβει. Η διαδρομή των αρχείων καθορίζεται από την εντολή pkg-config --cflags --libs gtk+-2.0. Μετά από τον απαραίτητο ορισμό του κυρίως προγράμματος main χρειαζόμαστε την κλήση της συνάρτησης gtk_init. Σε όλα τα προγράμματα αυτή η κλήση είναι απαραίτητη εκτός κι αν ξέρουμε τι κάνουμε. Όλες τις παραμέτρους από τη γραμμή εντολών που έχουν να κάνουν με τη gtk τις αφαιρεί από τη λίστα των παραμέτρων και τις υπόλοιπες μπορεί ο χρήστης να τις χρησιμοποιήσει όπως θέλει.&lt;br /&gt;&lt;br /&gt;Στην gtk σχεδόν όλα είναι GtkWidgets. Έτσι και το παράθυρό μας είναι ένας δείκτης τύπου GtkWidget (GtkWidget *window). Αυτός είναι ο ορισμός του αλλά το παράθυρο δημιουργείται για πρώτη φορά στη γραμμή:&lt;br /&gt;&lt;br /&gt;window = gtk_window_new (GTK_WINDOW_TOPLEVEL);&lt;br /&gt;&lt;br /&gt;Δημιουργείται όμως στη μνήμη, τίποτε δε φαίνεται ακόμη στην οθόνη. Η εντολή που το προβάλλει είναι η:&lt;br /&gt;&lt;br /&gt;gtk_widget_show  (window);&lt;br /&gt;&lt;br /&gt;Αλλά πάλι δε συμβαίνει τίποτε. Αρχίζουμε και βλέπουμε πράματα όταν ο κώδικάς μας μπει στο βρόγχο gtk_main (), ο οποίος είναι και ο κύριος βρόγχος του προγράμματός μας. Μετά από αυτή την εντολή τίποτε δε συμβαίνει.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Pygtk&lt;/span&gt;&lt;br /&gt;Και ύστερα από την παραπάνω προτροπή ακολουθεί σε python. Η python είναι μια γλώσσα προγραμματισμού που δε χρειάζεται να μεταγλωττιστεί (interpreted και όχι compiled, ας με βοηθήσει κάποιος με την ελληνική ορολογία) Σε αυτή την περίπτωση θα χρειαστούμε επιπλέον το πακέτο pygtk.&lt;br /&gt;&lt;br /&gt;Ανοίγουμε το τερματικό και πληκτρολογούμε python και μας περιμένει το γνωστό&lt;br /&gt;&gt;&gt;&gt;&lt;br /&gt;Εδώ πληκτρολογούμε&lt;br /&gt;&lt;br /&gt;    &gt;&gt;&gt;import pygtk&lt;br /&gt;    &gt;&gt;&gt;import gtk&lt;br /&gt;&lt;br /&gt;κι έτσι έχουμε εισάγει τις βιβλιοθήκες που χρειαζόμαστε. Μιας και στην python δε χρειάζεται να δηλώσουμε μεταβλητές απλώς δημιουργουμε το παράθυρό μας με&lt;br /&gt;&lt;br /&gt;    &gt;&gt;&gt;window = gtk.Window(gtk.WINDOW_TOPLEVEL)&lt;br /&gt;&lt;br /&gt;και το προβάλουμε με&lt;br /&gt;&lt;br /&gt;    &gt;&gt;&gt; window.show()&lt;br /&gt;&lt;br /&gt;Προφανώς ακόμη δεν εμφανίστηκε τίποτε στην οθόνη γιατί δε φτάσουμε στο κυρίως βρόγχο. Αυτό γίνεται με&lt;br /&gt;&lt;br /&gt;    &gt;&gt;&gt;gtk.main_level()&lt;br /&gt;&lt;br /&gt;Και πάλι το πρόγραμμά μας δεν έχει δυνατότητα τερματισμού εκτός από ctrl+c. Η δυνατότητα τερματισμού πραγματοποιείται με σύνδεση του συμβάντος με την αντίστοιχη εντολή.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-8931559154644434552?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/8931559154644434552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2009/02/gtk.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/8931559154644434552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/8931559154644434552'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2009/02/gtk.html' title='Γραφικά με GTK+'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-3434907261217792166</id><published>2009-02-13T08:27:00.001-08:00</published><updated>2009-02-24T07:30:47.815-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>sed</title><content type='html'>H sed είναι κι αυτή μια γλώσσα προγραμματισμού για μαζική επεξεργασία κειμένου. Ο όρος μαζική αναφέρεται στην αλλάγη για παράδειγμα μιας ακολουθίας γραμματων με μία άλλη σε πολλά αρχεία. Δε θέλουμε φυσικά να κάνουμε αυτή τη δουλειά για όλα τα αρχεία με το χερί, γι'αυτό και υπάρχουν αυτά τα εργαλεία που την αυτοματοποιούν.&lt;br /&gt;&lt;br /&gt;Aς υποθέσουμε ότι θέλουμε να αλλάξουμε σε ένα αρχείο, χωρίς να το ανοίξουμε με κάποιο πρόγραμμα, όλες τις εμφανίσεις της λέξης foo σε man. To αρχικό αρχείο είναι το old και αποθηκεύουμαι τις αλλαγές στο new. Αυτό γίνεται πολύ απλά με την παρακάτω εντολή:&lt;br /&gt;&lt;br /&gt;sed s/foo/man/ &amp;lt; old &amp;gt; new&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-3434907261217792166?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/3434907261217792166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2009/02/sed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/3434907261217792166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/3434907261217792166'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2009/02/sed.html' title='sed'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-1628032167490694281</id><published>2009-02-13T08:26:00.000-08:00</published><updated>2009-02-13T08:27:09.091-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>awk</title><content type='html'>Η awk είναι μια ακόμη γλώσσα προγραμματισμού που χρησιμοποιείται συνήθως σε συνδυασμό με προγράμματα κελύφους. Σκοπός της είναι να διευκολύνει την αναζήτηση σε αρχεία για ένα συγκεκριμένο μόρφωμα (pattern). Μπορεί να χρησιμοποιηθεί είτε ως εντολή από το τερματικό:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dt&gt;&lt;a href="http://forum.ubuntu-gr.org/viewtopic.php?f=9&amp;amp;t=1545#" onclick="selectCode(this); return false;"&gt;&lt;/a&gt;&lt;code&gt;awk 'source code' input-file1 input-file2&lt;/code&gt;&lt;/dt&gt;&lt;/dl&gt;ή αν το πρόγραμμα είναι αρκετά μεγάλο να εκτελεστεί από ένα αρχείο:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dt&gt;&lt;a href="http://forum.ubuntu-gr.org/viewtopic.php?f=9&amp;amp;t=1545#" onclick="selectCode(this); return false;"&gt;&lt;/a&gt;&lt;code&gt;awk -f program-file input-file1 input-file2 ...&lt;/code&gt;&lt;/dt&gt;&lt;/dl&gt;Ένα απλό πρόγραμμα awk είναι το εξής:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dt&gt;&lt;a href="http://forum.ubuntu-gr.org/viewtopic.php?f=9&amp;amp;t=1545#" onclick="selectCode(this); return false;"&gt;&lt;/a&gt;&lt;code&gt;awk '{ print }'&lt;/code&gt;&lt;/dt&gt;&lt;/dl&gt;το οποίο τυπώνει ό,τι γράψετε στην οθόνη (όχι με ανεξίτηλο μαρκαδόρο γιατι δε θα σβήνει μετα με τίποτε).&lt;br /&gt;Ένα πιο χρήσιμο πρόγραμμα θα μπορούσε να είναι το εξής:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dt&gt;&lt;code&gt;ps aux | awk '/foo/ { print $2 }'&lt;/code&gt;&lt;/dt&gt;&lt;/dl&gt;το οποίο τυπώνει τη δεύτερη στήλη της εντολής ps μόνο αν μία συγκεκριμένη γραμμή περιέχει την ακολουθία foo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-1628032167490694281?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/1628032167490694281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2009/02/awk.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/1628032167490694281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/1628032167490694281'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2009/02/awk.html' title='awk'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-2829018599691766241</id><published>2009-02-13T08:22:00.000-08:00</published><updated>2009-02-13T08:25:53.898-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>grep</title><content type='html'>Η εντολή grep είναι από τις πλέον ισχυρές εντολές στο linux. H χρήση της συνήθως συνδυάζεται με τους διαύλους (pipes). Σκοπός της είναι η αναζήτηση μιας ακολουθίας χαρακτήρων σε ένα κείμενο. Αλλά ας δούμε ένα παράδειγμα. To αποτέλεσμα της εντολής:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;ps aux&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;είναι όλες οι δειργασίες που εκτελουνται στον υπολογιστή μας από όλους τους χρήστες και όπως φαντάζεστε είναι αρκετά μακροσκελές. Εμείς όμως ψάχνουμε το id μιας συγκεκριμένης διεργασίας, η οποία ξέρουμε ότι περιέχει το συνδυασμό γραμμάτων qti. Για να αναζητήσουμε αυτή τη διεργασία διοχετεύουμε το αποτέλεσμα της εντολής ps aux με ένα δίαυλο στην εντολή grep:&lt;code&gt;&lt;br /&gt;&lt;br /&gt;ps aux | grep qti &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;η οποία μετά αναζητεί το συνδυασμό χαρακτήρων qti και επιστρέφει μόνο εκείνες τις γραμμές που περιεχουν αυτό το συνδυασμό. Φυσικά η χρήση διαύλων δε περιορίζεται μόνο σε έναν:&lt;code&gt;&lt;br /&gt;&lt;br /&gt;ps aux | grep qti | grep wx &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;(Eίναι πολύ πιθανό η παραπάνω εντολές να μην επιστρέψουν τίποτε αν δεν υπάρχουν διεργασίες με τετοιους συνδυασμούς γραμμάτων στο όνομά τους.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-2829018599691766241?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/2829018599691766241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2009/02/grep.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/2829018599691766241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/2829018599691766241'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2009/02/grep.html' title='grep'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-1036167230613153249</id><published>2009-01-25T12:08:00.000-08:00</published><updated>2009-01-25T12:14:09.603-08:00</updated><title type='text'>Αρχαίες σοφίες...</title><content type='html'>"I wouldn't touch that if I were you."&lt;br /&gt;&lt;br /&gt;"If it doesn't work on the first try, it certainly will on the 99th."&lt;br /&gt;&lt;br /&gt;"The only thing better than working, is making plans to work."&lt;br /&gt;&lt;br /&gt;"Well, all it needs is a bigger hammer."&lt;br /&gt;&lt;br /&gt;"More steam! It worked for uncle, before he blew up, so it should work now!"&lt;br /&gt;&lt;br /&gt;"If it works well with two wheels, just think how well it will work with eithy-four."&lt;br /&gt;&lt;br /&gt;"What do you mean it isn't working? It worked four decades ago!"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-1036167230613153249?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/1036167230613153249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2009/01/blog-post_25.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/1036167230613153249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/1036167230613153249'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2009/01/blog-post_25.html' title='Αρχαίες σοφίες...'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-5088989617724208311</id><published>2009-01-22T00:46:00.000-08:00</published><updated>2009-04-28T01:09:16.486-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mathematics'/><category scheme='http://www.blogger.com/atom/ns#' term='semeiotic'/><title type='text'>Η θεωρία της σημειωτικής</title><content type='html'>Σύμφωνα με τη θεωρία της σημειωτικής (από τον Peirce μέχρι και τον Eco) σε ένα κείμενο μπορεί να υπάρχουν περισσότερες από μία ερμηνείες. Αλλά τι συμβαίνει με ένα μαθηματικό κείμενο; Mπορεί για ένα μαθηματικό κείμενο να υπάρχουν περισσότερες από μία ερμηνείες. Τι σημαίνει αυτό και πώς είναι δυνατό; Συνήθως οι μαθηματικοί τύποι είναι δύσκολο να παρερμηνευθούν αλλά υπάρχουν παραδείγματα που δείχνουν ακριβώς αυτό. Για παράδειγμα όταν ο Shannon ζήτηση τη συμβουλή του Neumann για το πως να ονομάσει ένα μέγεθος (αυτό που τώρα ονομάζουμε εντροπία Shannon) ο Neumann του πρότεινε την έννοια της εντροπίας, πιστεύοντας ότι είναι η ίδια με αυτή που ήξερε αυτός από την κβαντομηχανική. Παρ'όλαυτα οι δύο έννοιες δεν είναι ταυτόσημες και ανάλογα σε ποιο πλαίσιο τη συναντάμε οφείλουμε να την ερμηνεύουμε διαφορετικά.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-5088989617724208311?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/5088989617724208311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2009/01/blog-post_22.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5088989617724208311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5088989617724208311'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2009/01/blog-post_22.html' title='Η θεωρία της σημειωτικής'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-1485721941197687825</id><published>2009-01-09T02:38:00.000-08:00</published><updated>2009-01-15T02:56:29.626-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mathematics'/><category scheme='http://www.blogger.com/atom/ns#' term='physics'/><title type='text'>Αξιωματική θεμελίωση της φυσικής</title><content type='html'>Το έκτο πρόβλημα του Hilbert είναι η αξιωματική θεμελίωση όλης της φυσικής. Ο Ευκλείδης ήταν ο πρώτος ίσως που ξεκίνησε ένα τέτοιο έργο με την αξιωματική θεμελίωση της γεωμετρίας, γνωστής τώρα ώς ευκλείδειος γεωμετρίας. Αρχικά θέτονται τα αξιώματα του συστήματος το οποίο πρόκειται να αναλυθεί και έπειτα με λογικά επιχειρήματα παράγονται όλα τα υπόλοιπα θεωρήματα. Το ίδιο έκανε και η ομάδα των γάλλων μαθηματικών Bourbaki με τα Στοιχεία των Μαθηματικών για όλα τα πεδία των θεωρητικών μαθηματικών, τα οποία περιλαμβάνουν:&lt;br /&gt;1. Θεωρία συνόλων&lt;br /&gt;2. Άλγεβρα&lt;br /&gt;3. Τοπολογία&lt;br /&gt;4. Συναρτήσεις μίας πραγματικής μεταβλητής&lt;br /&gt;5. Τοπολογικοί διανυσματικοί χώροι&lt;br /&gt;6. Ολοκλήρωση&lt;br /&gt;7. Αντιμεταθετική άλγεβρα&lt;br /&gt;8. Ομάδες Lie&lt;br /&gt;9. Φασματική θεωρία&lt;br /&gt;&lt;br /&gt;Στο πεδίο της φυσικής υπάρχει τo έργο των Landau και Lifschitz που καλύπτει τα εξής θέματα:&lt;br /&gt;1. Μηχανική&lt;br /&gt;2. Κλασσική θεωρία πεδίων&lt;br /&gt;3. Κβαντομηχανική: Μη σχετικιστική θεωρία&lt;br /&gt;4. Κβαντική ηλεκτροδυναμική&lt;br /&gt;5. Στατιστική φυσική Ι&lt;br /&gt;6. Ρευστομηχανική&lt;br /&gt;7. Θεωρία της ελαστικότητας&lt;br /&gt;8. Ηλεκτροδυναμική των συνεχών μέσων&lt;br /&gt;9. Στατιστική φυσική ΙΙ&lt;br /&gt;10. Φυσική κινητική&lt;br /&gt;&lt;br /&gt;Στο παρόν θα καλύψουμε μόνο τα θέματα της μηχανικής και θεωρίας της ελαστικότητας, ρευστομηχανικής, στατιστικής μηχανικής και φυσικής κινητικής. Η θεωρία πεδίων, η κβαντομηχανική και η ηλεκτροδυναμική δε θα περιληφθούν.&lt;br /&gt;&lt;br /&gt;Η μεγαλύτερη δυσκολία σε μία τέτοια προσπάθεια προέρχεται από τη δυσκολία απόδειξης για την ύπαρξη ή μη λύσεως στις εξισώσεις Navier-Stokes.&lt;br /&gt;&lt;br /&gt;Ο τρόπος με τον οποίο θα ακολουθήσει η ανάλυση είναι να τεθούν αξιώματα, τα οποία πηγάζουν από τη μέχρι τώρα εμπειρία και γνώση του φυσικού κόσμου, και μετά με βάση τα μαθηματικά και τη λογική να εξαχθούν όλοι οι υπόλοιποι φυσικοί νόμοι. Η ερώτηση που τίθεται είναι πως θα επιλεγούν τα αξιώματα, πόσα θα είναι και τι θα περιλαμβάνουν.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-1485721941197687825?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/1485721941197687825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2009/01/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/1485721941197687825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/1485721941197687825'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2009/01/blog-post.html' title='Αξιωματική θεμελίωση της φυσικής'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-4373417310607787352</id><published>2008-12-16T14:27:00.000-08:00</published><updated>2008-12-16T14:41:45.279-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='physics'/><title type='text'>Πυρηνικός Μαγνητικός Συντονισμός</title><content type='html'>O πυρηνικός μαγνητισμός συντονισμός είναι ένα φυσικό φαινόμενο συντονισμού του πυρήνα των ατόμων όταν βρίσκονται μέσα σε μαγνητικό πεδίο. Βρίσκει εφαρμογή σε διάφορα πεδία, όπως φασματοσκοπία για την ανάλυση των φυσικών ιδιοτήτων της ύλης, στην ιατρική για διάγνωση ασθενιών και στη χημική βιομηχανία για τη μελέτη πολυσυστατικών υγρών μιγμάτων.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-4373417310607787352?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/4373417310607787352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/12/blog-post_16.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/4373417310607787352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/4373417310607787352'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/12/blog-post_16.html' title='Πυρηνικός Μαγνητικός Συντονισμός'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-2678148142603237011</id><published>2008-12-11T03:42:00.000-08:00</published><updated>2008-12-11T03:44:34.860-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='mathematics'/><title type='text'>Aλγόριθμος RSA</title><content type='html'>Ένας αλγοριθμος κρυπτογράφησης που χρησιμοποιείται στο ssh είναι ο rsa. Γι'αυτό θα προσπαθήσω να εξηγήσω πως λειτουργεί αυτός ο αλγόριθμος. Καταρχήν ας δούμε πως λειτουργεί η δημιουργία κλειδιού (η εντολή είναι ssh-keygen)&lt;br /&gt;&lt;br /&gt;Αρχικά χρειαζόμαστε δύο μεγάλους πρώτους αριθμούς. Πρώτοι δηλαδή να διαιρούνται μόνο με τον εαυτό τους και τη μονάδα. Μεγάλοι για να είναι πιο δύσκολη η αποκρυπτογράφηση. Στο παράδειγμα όμως θα περιοριστούμε με μικρούς για να διευκολύνουμε τις πράξεις. Ας υποθέσουμε ότι έχουμε τους αριθμούς p = 19 και q = 7. Και οι δύο διαιρούνται μόνο με τον εαυτό τους και το 1.&lt;br /&gt;&lt;br /&gt;Έπειτα υπολογίζουμε το γινόμενό τους n = p q = 19 * 7 = 133, o οποίος φυσικά δεν είναι πρώτος γιατί είναι το γινόμενο δύο άλλων αριθμών.&lt;br /&gt;&lt;br /&gt;Το τρίτο βήμα είναι να υπολογίσουμε το γινόμενο φ(n) = (p-1)(q-1) = (19-1)*(7-1) = 18 * 6 = 108.&lt;br /&gt;&lt;br /&gt;Μετά πρέπει να επιλέξουμε έναν αριθμό e, τέτοιο ώστε να είναι μεγαλύτερος του 1 και μικρότερος του φ(n) =108. Δηλαδή 1 &lt; e &lt; φ(n). Επιπλέον δεν πρέπει να έχει κοινά πολλαπλάσια με τον φ(n), δηλαδή με το 108. Γι'αυτό πρέπει να αναλύσουμε τον 108 στα πολλαπλάσιά του, 108 = 2 * 2 *3 * 3* 3. Άρα ο e δε μπορεί να είναι 2, 3, 4, 6, 12, 18, 27, 36, 54, 108 (ελπίζω να βρήκα όλους τους συνδυασμούς, αν κάνω λάθος διορθώστε με). Ας διαλέξουμε το 5 για να είμαστε σίγουροι. Το ε = 5 είναι το δημόσιο κλειδί (public key) που αποθηκεύεται ώς ~/.ssh/id_rsa.pub.&lt;br /&gt;&lt;br /&gt;Tέλος, ψάχνουμε για έναν αριθμό d, τέτοιος ώστε αν πολλαπλασιάσουμε το d με το e και μετά διαιρέσουμε με το φ(n) το υπόλοιπο της διαίρεσης να είναι 1. Ένας τέτοιος αριθμός είναι το 65, γιατί 65*5=325 = 1 + 3*108 που αφήνει υπόλοιπο 1. Ο αριθμός d = 65 είναι το ιδιωτικό κλειδί (private key) που αποθηκεύεται ως ~/.ssh/id_rsa.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-2678148142603237011?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/2678148142603237011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/12/ssh-rsa.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/2678148142603237011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/2678148142603237011'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/12/ssh-rsa.html' title='Aλγόριθμος RSA'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-7452865722585612387</id><published>2008-12-08T09:27:00.000-08:00</published><updated>2008-12-08T09:28:45.131-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Αλλά τι είναι ένας υπολογιστής; ΙV</title><content type='html'>Στο τελευταίο μέρος αυτού του νήματος είδαμε τι είναι οι δείκτες, θέσεις μνήμης δηλαδή που δείχνουν σε μια άλλη θέση μνήμης--περιέχουν τη διεύθυνση της μνήμης αυτής. Εδώ θα δούμε πως μπορούν να χρησιμοποιηθούν οι δείκτες κατά τον προγραμματισμό, χωρίς να γράψουμε ούτε μία γραμμή κώδικα. Για το λόγο αυτό είναι απαραίτητο να εισηχθούν κάποιες καινούριες έννοιες οι οποίες είναι γνωστές και στα χρηματοοικονομικά, όπως ουρά αναμονής, first in first out (FIFO), last in first out (LIFO) και άλλα.&lt;br /&gt;&lt;br /&gt;Πριν απ'όλα πρέπει όμως να εξηγήσουμε τί είναι οι αγωγοί ή δίαυλοι (pipes). Τους χρησιμοποιούμε καθημερινά κι όμως είναι ό,τι καλύτερο έχει συμβεί στην ιστορία του unix και των υπολογιστών γενικότερα. Ας δούμε μια απλή εντολή πιο αναλυτικά:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ps aux | grep ps&lt;/span&gt;&lt;br /&gt;Η εντολή ps με τα ορισματα aux τυπώνει όλες τις διεργασίες που τρέχουν στον υπολογιστή από όλους τους χρήστες. Η εντολή grep ψάχνει για το συνδυασμό γραμμάτων ps. Το αποτέλεσμα θα είναι όλες εκείνες οι γραμμές της εντολής ps που περιέχουν το συνδυασμό γραμμάτων ps. Αυτό που συμβαίνει είναι το αποτέλεσμα της πρώτης εντολής να διοχετεύεται σαν είσοδος στην πρώτη. Αλλά πως διοχετεύεται; Στην πραγματικότητα δημιουργείται ένα είδος αρχείου--έχει κάποιες διαφορές από τα συνηθισμένα αρχεία--που ονομαζεται pipe. Στο αρχείο αυτό γράφονται τα αποτελέσματα της πρώτης εντολής και διαβάζονται από τη δεύτερη.&lt;br /&gt;&lt;br /&gt;Αλλά πώς γράφονται και πώς διαβάζονται; Με ποιά σειρά; Κι εδώ ακριβώς μπαίνει στο παιχνίδι η ρευστομηχανική, τα χρηματοοικονομικά και η ακαταστασία σε κάθε γραφείο. Μιά στίβα από χαρτιά σε ένα γραφείο λειτουργεί ως εξής: βάζεις το πρώτο χαρτί, και έπειτα το επόμενο χαρτί το ακουμπάς πάνω στο προηγούμενο. Όταν θες να πάρεις κάτι παίρνεις το πάνω πάνω. (Υπάρχει και η αναζήτηση, αλλά την αφήνουμε για το μέλλον, είναι πιο πολύπλοκη.) Επειτα έχουμε ένα λάστιχο με νερό. Αν βάλουμε νερό στη μία ακρη τότε θα βγει από την άλλη, κι αν ρίξουμε κι άλλο νερό τότε θα βγεί από την άλλη άκρη μόνο αν το αρχικό νερό που βάλαμε έχει αδειάσει. Τέλος πάμε στη ΔΕΗ ή στον ΟΤΕ να πληρώσουμε τα χρέη μας και πληρώνουμε με τις ώρες στην ουρά. Όσο πιο νωρίς πάμε τόσο νωρίτερα θα εξυπηρετηθούμε, εκτός φυσικά κι αν κάποιος κλέψει. Όλα τα παραπάνω είναι παραδείγματα από ουρές που παρατηρούνται και εφαρμόζονται ακόμη και στους υπολογιστές. Το παράδειγμα του αγωγού που χρησιμοποιήσαμε παραπάνω είναι ένα κλασικό παράδειγμα FIFO, ό,τι δηλαδή μπαίνει πρώτο βγαίνει και πρώτο. Αντίθετα η στίβα πάνω στο γραφείο μας είναι ένα παράδειγμα LIFO, last in first out, γιατί ό,τι μπαίνει τελευταίο βγαίνει πρώτο.&lt;br /&gt;&lt;br /&gt;Τι σημαίνει αυτό για τη μνήμη του υπολογιστή και τη διαχείρησή της από ένα πρόγραμμα; Ας πάρουμε το παράδειγμα της στίβας. Φυσικά το πρόγραμμα δε μπορεί να ξέρει εκ των προτέρων πόση μνήμη θα χρειαστεί (δε ξέρουμε εκ των προτέρων πόσα χαρτιά θα στιβάσουμε πάνω στο γραφείο μας). Ας υποθέσουμε ότι ένα χαρτί κατέχει μία θέση μνήμης. Τοποθετούμε το πρώτο χαρτί στο γραφείο μας. Έπειτα τοποθετούμε και ένα δεύτερο χαρτί πάνω στο γραφείο (τη μνήμη του υπολογιστή). Για να πούμε ότι κάνουμε μια στίβα, πρέπει να το βάλουμε πάνω στο άλλο. Αυτό σε γλώσσα υπολογιστών σημαίνει ότι χρειαζόμαστε και μία ακόμη θέση, ένα δείκτη, που δείχνει το χαρτί που βρίσκεται από πάνω. Φυσικά ο δείκτης του τελευταίου χαρτιού δε θα δείχνει πουθενά. Έτσι σε κάθε καινούριο χαρτί που προστείθεται στη στίβα μας πρέπει να δείχνει το προηγούμενο.&lt;br /&gt;&lt;br /&gt;Κάπως έτσι λειτουργούν και οι αγωγοί στο linux, δημιουργούν ένα αρχείο, τα δεδομένα του οποίου επεξεργάζονται από τη δεύτερη εντολή με τη σειρά που γράφτηκαν στο αρχείο. Οι αγωγοί είναι FIFO, σε αντίθεση με τις στίβες που είναι LIFO.&lt;br /&gt;&lt;br /&gt;Την ίδια λογική μπορούμε να την επεκτείνουμε και σε άλλα φυσικά παραδείγματα, όπως τη δενδρική δομή. Όλοι έχουμε παρατηρήσει ένα δέντρο με το κορμό, από τον οποίο βγαίνουν δυο-τρία κεντρικά κλαδιά, τα οποία με τη σειρά τους γεννάνε δικά τους παρακλάδια, και συνεχίζεται μέχρι τα φύλλα. Έτσι και στους υπολογιστές έχουμε μία θέση μνήμης, τον κορμό, και δύο δείκτες που δείχνουν σε δύο κλαδιά. Το κάθε κλαδί με τη σειρά του έχει μία θέση μνήμης και δύο δείκτες που δείχνουν στα παρακλάδια, κοκ.&lt;br /&gt;&lt;br /&gt;Φυσικά για να λειτουργήσουν όλα αυτά χρειαζόμαστε και τις διεργασίες που προσθέτουν ή αφαίρουν, χαρτιά από τη στίβα μας, ή κλαδιά από τη δενδρική δομή.&lt;br /&gt;&lt;br /&gt;Για να κάνουμε τα πράματα ακόμη πιο ενδιαφέροντα μπορούμε να έχουμε μία κυκλική δομή όπου το τελευταίο στοιχείο δείχνει στο πρώτο ή ακόμη πιο πολύπλοκες δομές όπου ένα παρακλάδι ενός δέντρου δείχνει σε ένα κλαδί σε κάποιο άλλο σημείο του δέντρου ή (η φαντασία σας μπορεί να οργιάσει) δύο δέντρα όπου ένα κλαδί του πρώτου δέντρου δείχνει σε ένα παρακλάδι του δευτερου (μήπως αυτό δε συμβαίνει σε οργανισμού όπως κισσός, δεν είμαι και βιολόγος αλλά έψαχνα να βρώ ένα φυσικό ανάλογο.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-7452865722585612387?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/7452865722585612387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/12/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/7452865722585612387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/7452865722585612387'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/12/blog-post.html' title='Αλλά τι είναι ένας υπολογιστής; ΙV'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-9151032032056288555</id><published>2008-11-27T05:36:00.000-08:00</published><updated>2008-11-27T05:37:10.767-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Αλλά τι είναι ένας υπολογιστής; ΙΙΙ</title><content type='html'>Πώς αποθηκεύονται οι αριθμοί σε ένα ηλεκτρονικό κύκλωμα που καταλαβαίνει μόνο 0 και 1; Παραπάνω είδαμε πως περιγράφονται οι ακέραιοι (1, 2, 3, ...) με τη βοήθεια πολλών λαμπτήρων, αλλά τι γίνεται με τον αριθμό 3,14 (τυχαία τον επέλεξα, δεν έχει να κάνει τίποτε με το π). Εδώ τα πράματα γίνονται λίγο πιο πολύπλοκα και γι'αυτό καθιερώθηκαν κάποια πρότυπα που διευκολύνουν τη ζωή των υπολογιστών. Καταρχήν θα γράψουμε τον αριθμο 3,14 ως εξής: + 0,314 * 10**1. (Το σύμβολο ** δηλώνει εκθέτη επηρεασμένος από τη FORTRAN, δηλαδή 10**1=10, 10**2=100, 10**3=1000 κ.ο.κ) Το πρόσημο μπορεί να είναι + ή -, αρα μπορεί να περιγραφεί με μία λάμπα, σβηστή/ανοιχτή. Το 0, αποφασίσαμε να είναι το ίδιο για όλους τους αριθμούς, άρα δε χρειάζεται να το αποθηκεύσουμε. Έπειτα μετατρέπουμε τον αριθμό 314 σε δυαδική μορφή, όπως περιγράφεται παραπάνω, δηλ. 100111010. Το 10** είναι κι αυτό μέσα στην τυποποίησή μας. Και μετά αποθηκεύουμε το 1. Έτσι χρειαζόμαστε μία λάμπα για το πρόσημο, ένα σύνολο από λάμπες για τον αριθμό μετά την υποδιαστολή (για συντομία θα το λέμε mantissa), και μετά σύνολο από λάμπες για τον εκθέτη. Όσο μεγαλύτερο είναι τα σύνολο (η μνήμη δηλαδή) για τον αριθμό μετά την υποδιαστολή τόση μεγαλύτερη ακρίβεια μπορούμε να επιτυχουμε. Όσο μεγαλύτερο είναι τα σύνολο (η μνήμη δηλαδή) για τον εκθέτη τόσο μεγαλύτερους αριθμούς μπορούμε να αποθηκεύσουμε. Αυτή είναι ουσιαστικά η διαφορά μεταξύ float και double στη C αλλά και σε πολλές γλώσσες προγραμματισμού.&lt;br /&gt;&lt;br /&gt;Πώς κάνουμε τώρα πράξεις με αυτό το πολύπλοκο κατασκεύασμα; Όπως θα την κάναμε και με το χέρι. Άς πάρουμε την πρόσθεση. Πρώτα θα συγκρίναμε τον εκθέτη, έπειτα θα μετακινούσαμε την υποδιαστολή στην κατάλληλ θέση, θα προσθέταμε και τέλος θα φέρναμε το αποτέλεσμα στην τελική μορφή. Αυτό κάνει και ο επεξεργαστής όταν έχει να προσθέσει δύο αριθμούς. Η όλη διαδικασία λέγεται αναφέρεται ως floating point arithemic. Και αυτός είναι ουσιαστικά ο τρόπος να συγκρίνουμε δύο επεξεργαστές. Πόσες πράξεις μπορούνε να κάνουν το δευτερόλεπτο (FLOPS=Floating Point Operations Per Second)&lt;br /&gt;&lt;br /&gt;Ας υποθέσουμε τώρα ότι έχουμε μια ταινία (μαγνητική όπως οι παλιές), η οποία είναι χωρισμένη σε τετραγωνα. Σε κάθε τετράγωνο χωράει ένας δυαδικός αριθμός με 4 ψηφία, ας πούμε. Τότε ο αριθμός παραπάνω θα χρειάζεται ένα τετραγωνο για την αποθήκευση του προσήμου (0000), 6 τετράγωνα για την αποθήκευση της mantissa (000 0000 0000 0001 0011 1010) και ένα τετράγωνα για τον εκθετη (0001), σύνολο 8. Αν έχουμε δηλαδή ένα array (a[10] στη C) με 10 τέτοιους αριθμούς, τότε αυτοί θα αποθηκευτούν διαδοχικά στα 8x10 τετράγωνα, θέσεις μνήμης δηλαδή.&lt;br /&gt;&lt;br /&gt;Mέχρι στιγμής προϋποθέτουμε ότι οι δύο αριθμοί βρίσκονται στη μνήμη. Σε ποιά μνήμη όμως; Καταρχήν υπάρχει ο σκληρός δίσκος, μπορεί να χρησιμεύσει ως εικονική μνήμη (virtual memory) αλλά είναι πολύ αργός. Έπειτα είναι η RAM, ένα ενδιάμεσο βήμα με μικρότερη χωρητικότητα, αλλά ελαφρώς πιο γρήγορη από το σκληρό δισκό (ναι καλά διαβάσατε, ελαφρώς πιο γρήγορη σε σχέση με αυτό που ακολουθεί). Έπειτα έχουμε την cache (υπάρχει σε δύο επίπεδα L2 και L1) η οποία είναι σαφώς γρηγορότερη αλλά και μικρότερα. Τέλος υπάρχει το registry, που είναι ουσιαστικά ενσωματωμένο στον επεξεργαστή και χωράει ίσα ίσα μερικές μεταβητές (βλ. register της C).&lt;br /&gt;&lt;br /&gt;Περνάμε τώρα στο cache mapping. To παραπάνω array χωράει στη μνήμη RAM χωρίς κανένα πρόβλημα. Αλλά ας υποθέσουμε (τα νούμερα εδώ είναι για λόγους του παραδείγματος μόνο, στην πραγματικότητα είναι μεγαλύτερα) ότι η μνήμη cache έχει μόνο 40 τετράγωνα. Tότε αυτό που θα κάνει ο υπολογιστής, σε ένα βρόγχο για παράδειγμα, είναι να φορτώσει τα 20 πρώτα μέλη του array μας και μετά τα επόμενα 20. Ένα πρόγραμμα αρχίζει και γίνεται αργό όταν δεν είναι καλά σχεδιασμένο και την ίδια στιγμή χρειάζονται τα a[3] και a[8] για μία διεργασία.&lt;br /&gt;&lt;br /&gt;Αν αριθμήσουμε την ταινία μας από 1 μέχρι 80 και πάει λέγοντας, τότε μπορούμε να αναθέσουμε σε κάθε αριθμό και μία διεύθυνση. Το τρίτο στοιχείο του array ξεκινάει στη θέση 17 (2*8+1) στο δυαδικό 0001 0001. Αν αποθηκεύσουμε αυτόν τον αριθμό στα τετράγωνα ας πούμε 126-127 τότε έχουμε τη διεύθυνση του a[3]. Αυτό το ονομάζουμε δείκτη (pointer) γιατί δείχνει στη διεύθυνση κάποιου άλλου στοιχείου. (Να με συγχωρέσουν οι προγαμματιστές C για τον "ανορθόδοξο" τρόπο αρίθμησης)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-9151032032056288555?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/9151032032056288555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/11/blog-post_27.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/9151032032056288555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/9151032032056288555'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/11/blog-post_27.html' title='Αλλά τι είναι ένας υπολογιστής; ΙΙΙ'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-3769346176750199798</id><published>2008-11-20T01:08:00.000-08:00</published><updated>2008-11-20T01:09:18.727-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Screen</title><content type='html'>Σιγουρα θα έχει τύχει να θέλετε να συνδεθείτε σε έναν απομακρυσμένο υπολογιστή, π.χ. με shh, να ξεκινήσετε μια εντολή από τη γραμμή εντολών, να αποσυνδεθείτε και μετά να συνδεθείτε από κάποιον άλλο υπολογιστή για να δείτε τα αποτελέσματά της. Κάτι τέτοιο είναι δυνατό με τη χρήση του προγράμματος screen, το οποίο πρέπει να είναι εγκατεστημένο φυσικά στον απομακρυσμένο υπολογιστή. Η εγκατάσταση γίνεται όπως πάντα από τη γραμμή εντολών:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;sudo apt-get install screen&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;H τυπική χρήση της εντολής είναι πρώτα να δημιουργήσουμε μια "οθόνη", να εκκινήσουμε εκεί τα προγράμματά μας, να "αποκολλήσουμε" (detach) την οθόνη, και έπειτα να ξανασυνδεθούμε από κάποιο άλλο μέρος του πλανήτη στην ίδια "οθόνη". Πληκτρολογώντας απλά&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;screen &lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;δημιουργείται μια οθόνη με ένα τυχαίο id. Έπειτα πατάμε Enter ή Space όπως μας λέει η οθονη και είμαστε σε ένα νέο κέλυφος. Εδω μπορούμε να εκκινήσουμε μια οποιαδήποτε διεργασία. Για να αποκολλήσουμε την οθονη στην οποία βρισκόμαστε πληκτρολογούμε Ctrl+A+D (εχοντας πατημένο το ctrl, χωρίς τα + φυσικά)Τώρα είμαστε στο προηγούμενο τερματικό απ' όπου ξεκινήσαμε. Για να δούμε πόσες οθόνες υπάρχουν, πληκτρολογούμε:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;screen -ls&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;και μπορούμε να δούμε τα ονόματα των "οθονών" καθώς και αν είναι αποκολλημένες ή όχι (Detached-Attached).&lt;br /&gt;Για να δώσουμε ένα δικό μας όνομα, πχ. myscreen, στην οθόνη πληκτρολογούμε:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;screen -R myscreen&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;Aν μια οθόνη είναι αποκολλημένη τότε μπορούμε να ανοίξουμε ένα άλλο κέλυφος, το οποίο μπορεί να προέλθει και από ssh, και πληκτρολογούμε για παράδειγμα:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;screen -r myscreen&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt; Eτσι επανερχόμαστε σε ότι κάναμε προηγουμένως. Φυσικά δε θα κρατήσει στη μνήμη όλα τα αποτελέσματα του προγράμματος που εκκινήσαμε στην οθονη. Για να το πετυχουμε και αυτό, πρέπει να κάνουμε χρήση της εντολής script. Οι οθόνες τερματίζονται όπως κάθε κέλυφος με exit ή ctrl+D. Περισσότερες λεπτομέρειες μπορείτε να βρείτε στο εγχειρίδιο:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;man screen&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-3769346176750199798?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/3769346176750199798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/11/screen.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/3769346176750199798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/3769346176750199798'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/11/screen.html' title='Screen'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-433578921692569861</id><published>2008-11-04T11:17:00.000-08:00</published><updated>2008-11-04T11:19:12.009-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mathematics'/><title type='text'>Διαφορές αθροισμάτων</title><content type='html'>Να βρεθούν δύο διαδοχικοί αριθμοί των οποίων το άθροισμα των ψηφίων τους να έχουν διαφορά 17.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-433578921692569861?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/433578921692569861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/11/blog-post.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/433578921692569861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/433578921692569861'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/11/blog-post.html' title='Διαφορές αθροισμάτων'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-5506513657729303660</id><published>2008-08-30T13:49:00.000-07:00</published><updated>2008-08-30T13:50:11.950-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Permissions III</title><content type='html'>Ένα σημείο το οποίο χωράει συζήτηση είναι το δικαίωμα ανάγνωσης (r). Όταν κάποιος άλλος χρήστης έχει δικαίωμα ανάγνωσης μόνο, σημαίνει ότι μπορεί να διαβάσει το αρχείο αλλά όχι να το τροποποιήση. Να διαβάσει όμως σημαίνει όχι απλώς να το ανοιξει με έναν editor και να το διαβάσει, αλλά να το αντιγράψει κι όλας, με την εντολή cp για παράδειγμα. Φυσικά το νέο αρχείο θα έχει ως ιδιοκτήτη το νέο χρήστη. Αυτό δημιουργία κάποια ανασφάλεια στους νέους χρήστες, αλλά δυστυχώς ή ευτυχώς έτσι είναι. Δεν είναι ούτε bug ούτε feature. Πολλές μεγάλες δισκογραφικές εταιρίες κάνουν έρευνα ώστε να μπορεί κάποιος να διαβάζει κάτι χωρίς να μπορεί να το αντιγράψει αλλά ανεπιτυχώς θα έλεγα. Οπότε αν θέλετε να μη μπορεί κάποιος να αντιγραψει τα αρχεία σας θα πρέπει να μην τους δώσετε δικαιώματα ανάγνωσης.&lt;br /&gt;&lt;br /&gt;Μια δεύτερη επισήμανση είναι οι φάκελοι. Για να μπορέσει κανείς να "μπει" μέσα σε ένα φάκελο πρέπει να έχει δικαίωμα εκτέλεσης του φακέλου.&lt;br /&gt;&lt;br /&gt;Αν θέλουμε να αναφερθούμε σε όλους τους χρήστες (u, g και ο) τότε μπορούμε να γράψουμε a (all) δηλαδή&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;chmod a+w myfile&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;δίνει σε όλους δικαίωμα τροποποίησης.&lt;br /&gt;&lt;br /&gt;Ακόμη μία άσκηση: Πώς μπορούμε να δημιουργήσουμε ένα φάκελο που να λειτουργεί σαν γραμματοκιβώτιο όπου όλοι μπορούν να γράψουν ένα αρχειό (να στείλουν ένα γράμμα) αλλά να μόνο ο ιδιοκτήτης να μπορεί να δεί το γραμματοκιβώτιό του. Το γράμμα μπορεί να το καταστρέψει ο αποστολέας; Ο παραλήπτης;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-5506513657729303660?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/5506513657729303660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/permissions-iii.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5506513657729303660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5506513657729303660'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/permissions-iii.html' title='Permissions III'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-5622040672816573986</id><published>2008-08-30T13:46:00.000-07:00</published><updated>2008-08-30T13:49:13.419-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Permissions II</title><content type='html'>Και τώρα η συνέχεια!&lt;br /&gt;&lt;br /&gt;Η σύνταξη της εντολής chgrp είναι:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;chgrp mygroup myfile&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;όπου mygroup είναι η ομάδα στην οποιά θα αλλάξει το αρχείο myfile. Mερικές επιλογές είναι -R η οποία αλλάζει και τις ομάδες στους υποφακέλους του myfile, αν υπάρχουν.&lt;br /&gt;&lt;br /&gt;Αντίστοιχα, η σύνταξη της εντολής chown είναι:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;chown owner myfile&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;όπου owner είναι o καινούριος ιδιοκτήτης στον οποιά θα ανηκει το αρχείο myfile. Mερικές επιλογές είναι -R η οποία αλλάζει και τους ιδιοκτήτες στους υποφακέλους του myfile, αν υπάρχουν.&lt;br /&gt;&lt;br /&gt;Η εντολή chmod αλλάζει τα δικαιώματα ως εξής:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;chmod mode myfile&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;όπου mode είναι τα νέα δικαιώματα του αρχείου myfile. Oι επιλογές του mode δίνονται με ένα γράμμα που δείχνει ποιον αφορά η αλλάγη (u, g, o), επειτα + για να προσθέσουμε δικαιώματα ή με - για να τα αφαιρέσουμε και έπειτα ακολουθουν τι δικαιώματα θέλουμε να δώσουμε ή να αφαιρέσουμε (r,w,x).&lt;br /&gt;&lt;br /&gt;Με μερικά παραδείγματα θα γίνει πιο κατανοητό.&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;ls -l&lt;br /&gt;-rw-r--r--   1 dp  staff  0 Aug 27 10:01 myfile&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;έχουμε ένα απλό αρχείο με δικαιώματα αναγνωσης και τροποποίησης από τον ιδιοκτήτη (dp), αναγνωσης από την ομάδα (staff) και αναγνωσης από όλους τους άλλους. Η εντολή:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;chmod u+x myfile&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;δίνει στον ιδιοκτητη το δικαίωμα να το εκτελεσει το αρχειο. Φυσικά αν δεν είναι bash script, ή εκτελέσιμο πρόγραμμα ή python script, κτλ. θα βγάλει σφάλμα αν πάμε να το εκτελέσουμε με&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;./myfile&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;Aλλά υποτίθεται ότι ξέρουμε σε ποια αρχεία δίνουμε το δικαίωμα της εκτέλεσης. Mε ls -l&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;-rwxr--r--   1 dp  staff  0 Aug 27 10:01 myfile*&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt; βλέπουμε στην πρώτη τριαδα το x. Aναλογα με τις ρυθμίσεις του κελύφους bash θα αλλάξει και το χρώμα του myfile (σε μενα βάζει ένα αστεράκι). Η εντολή:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;chmod u-x myfile&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;το επαναφέρει στην αρχική του κατάσταση.&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;chmod go+w myfile&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;θα δώσει δικαιώματα τροποποίησης στην ομάδα staff και σε όλους τους άλλους. Το αποτελεσμα της ls -l θα είναι τότε:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;-rwxrw-rw-   1 dp  staff  0 Aug 27 10:01 myfile*&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;στη δεύτερη και την τρίτη στήλη θα υπάρχει και w.&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;chmod o-wr myfile&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;θα αφαιρέσει το δικαίωμα τροποποιησης και αναγνωσης από όλους όσους δεν ανήκουν στην ομάδα staff.&lt;br /&gt;&lt;br /&gt;Υπάρχει και ένας δεύτερος τρόπος περιγραφης των δικαίωματων, κάπως πιο απόκρυφος ο οποίος χρησιμοποιείται και κάπως παραλαγμένος στην umask (Θα φτάσουμε κι εκεί.) Την κάθε τριάδα μπορούμε να την δούμε σαν ένα δυαδικό αριθμό που αποτελείται από bits τα οποία μπορεί να είναι 0 ή 1. Όταν υπάρχει ένα δικαίωμα το αντίστοιχο bit είναι 1, όταν δεν υπάρχει είναι 0. Η τριάδα r-- θα είναι ο αριθμό 100 στο δυαδικό σύστημα, τον οποίο αν το μετατρέψουμε στο δεκαδικό θα είναι ο 1x2**2+0x2**1 +0x2**0 (** σημαίνει ύψωση σε δύναμη) δηλαδή 4. Αντίστοιχα η τριάδα rw- αντιστοιχεί στο δυαδικό αριθμό 110 ή στον δεκαδικό 6. Αν θέλουμε τώρα να δώσουμε τα δικαιώματα rw-r--r-- σε ένα αρχείο θα δίναμε την εντολή:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;chmod 644 myfile&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;Άσκηση: Ποιο θα είναι το αποτέλεσμα της εντολής;&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;chmod 755 myfile&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-5622040672816573986?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/5622040672816573986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/permissions-ii.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5622040672816573986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5622040672816573986'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/permissions-ii.html' title='Permissions II'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-6440857940343146935</id><published>2008-08-30T13:45:00.000-07:00</published><updated>2008-08-30T13:49:34.951-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Permissions</title><content type='html'>Τα δικαιώματα (permissions) είναι ένα από τα βασικά χαρακτηριστικά των συστημάτων unix γενικότερα, που επιτρέπει τους χρήστες να ανταλλάσουν αρχεία ή να περιορίζουν την πρόσβαση τρίτων. Ας ανοίξουμε όμως ένα τερματικό από Αpplications &gt; Accessories &gt; Terminal για να δούμε ακριβώς τι συμβαίνει. Είμαστε λογικά στο αρχικό κατάλογο (/home/user όπου user το ονομα χρήστη σας) Πληκτρολογούμε:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dd&gt;&lt;code&gt;ls -l&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;H εντολή αυτή μας εμφανίζει τα περιεχόμενα του καταλόγου μαζί με χίλιες δυο άλλες άχρηστες πληροφορίες.&lt;br /&gt;&lt;br /&gt;Η πρώτη στηλη μπορεί να είναι d ή -, d για φάκελος (directory), - για απλό αρχείο.&lt;br /&gt;Κάθε αρχείο, κι όταν λέω αρχείο εννοώ και φακέλους, έχει ορισμένα χαρακτηριστικά, όπως σε ποιον ανήκει το αρχείο, σε ποια ομάδα ανήκει, ποιος έχει δικαίωμα να το διαβάσει, να το τροποποιήσει ή να το εκτελέσει. Η επόμενες 9 στήλες είναι συνδυασμοί των r,w,x,- έπειτα ακολουθεί ένας αριθμός, κι εκεί βλέπεται το όνομα του χρήστη σας δύο φορές. Η πρώτη εμφάνιση του user συμβολίζει τον ιδιοκτήτη του αρχείου (owner). H δεύτερη εμφάνιση την ομάδα (group). Oι 9 στήλες που περάσαμε είναι 3 συνδυασμοί των 3. Οι πρώτοι 3 συνδυασμοί αναφέρονται στα δικαιώματα του χρήστη. Η δεύτερη τριάδα αναφέρεται στα δικαιώματα της ομάδας και η τελευταία τριάδα στα δικαιώματα των άλλων (οthers, βλ. ανέκδοτο: εσύ με ποιούς είσαι με μας ή με τους άλλους; )&lt;br /&gt;&lt;br /&gt;r σημαίνει δικαιώματα ανάγνωσης (read). w σημαίνει δικαιώματα τροποποίησης (write). x σημαίνει δικαιώματα εκτέλεσης (execute). Οποτε αν δούμε το συνδυασμό -rw-r--r-- σημαίνει ότι το αρχείο είναι απλό αρχείο και όχι φάκελος, ο χρήστης στον οποίο ανήκει το αρχείο έχει δικαιώματα να το διαβάσει και να το τροποποιήσει, αλλά όχι να το εκτελέσει. Οι χρήστες που ανήκουν στην ομάδα έχουν δικαίωμα μόνο ανάγνωσης και οι άλλοι έχουν επισης δικαίωμα μόνο ανάγνωσης.&lt;br /&gt;&lt;br /&gt;Ο αριθμός που μας διέφυγε σημαίνει πόσα αρχεία περιλαμβάνει το αρχείο μας (Τι αριθμό θα έχει ένα αρχείο με - μπροστα κι όχι d; )&lt;br /&gt;&lt;br /&gt;Φυσικά όλα αυτά τα δικαιώματα μπορούν να αλλάξουν. Μερικές χρήσιμες εντολές είναι η chgrp, chown, chmod. H chgrp αλλάζει την ομάδα του αρχείου. Η chown αλλάζει τον ιδιοκτήτη του αρχείου. Και η chmod αλλάζει τα δικαιώματα. Φυσικά για να αλλάξουν αυτά πρέπει να είμαστε ιδιοκτήτες του αρχείου.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-6440857940343146935?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/6440857940343146935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/permissions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/6440857940343146935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/6440857940343146935'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/permissions.html' title='Permissions'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-4995674222331179650</id><published>2008-08-30T13:42:00.000-07:00</published><updated>2008-08-30T13:44:07.678-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Αντιμετώπιση προβλημάτων</title><content type='html'>Τι κάνουμε όταν:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;έχει κολήσει το γραφικό περιβάλλον&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dt&gt;&lt;a href="http://ubuntu.opengr.net/viewtopic.php?f=7&amp;amp;t=165#" onclick="selectCode(this); return false;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;ctrl+alt+backspace&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;Επανεκκινεί το xserver. Στις περισσότερες περιπτώσεις ίσως αρκεί να κάνουμε μόνο αυτό.&lt;/li&gt;&lt;li&gt;έχει κολήσει το γραφικό περιβάλλον και δεν επανέρχεται με ctrl+alt+backspace&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dt&gt;&lt;br /&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;ctrl+alt+f1&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;Μας βγάζει σε μία γραμμή εντολών όπου δίνουμε όνομα και κωδικό χρήστη. Από εκεί μπορούμε να κάνουμε τα πάντα  &lt;img src="http://ubuntu.opengr.net/images/smilies/icon_e_biggrin.gif" alt=":D" title="Very Happy" /&gt; Αυτό που θα θέλουμε αν φτάσουμε σε αυτό το σημείο είναι να κλείσουμε ή να κάνουμε επανεκκίνηση τον υπολογιστή. O τερματισμός γίνεται με την εντολή:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dt&gt;&lt;br /&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;sudo shutdown -h now&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;ενώ η επανεκκίνηση με:&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dt&gt;&lt;br /&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;sudo shutdown -r now&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/li&gt;&lt;li&gt;δεν ανταποκρίνεται το πληκτρολόγιο&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dt&gt;&lt;br /&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;ctrl+alt+PrintScreen+R&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;Θα μας δώσει το πληκτρολόγιο πάλι υπο τον έλεγχό μας. Τότε μπορούμε να πάμε στην αρχή της λίστας και να δοκιμάσουμε τα δύο πρώτα βήματα.&lt;/li&gt;&lt;li&gt;δεν ανταποκρίνεται το πληκτρολόγιο και το παραπάνω βήμα δεν έχει αποτελέσματα&lt;br /&gt;&lt;dl class="codebox"&gt;&lt;dt&gt;&lt;br /&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;ctrl+alt+PrintScreen+REISUB&lt;/code&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;Τερματίζει τον υπολογιστή σωστά.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;ΠΡΟΣΟΧΗ&lt;/span&gt;: Σε καμία περίπτωση δε σβήνουμε τον υπολογιστή αποσυνδέοντας την τροφοδοσία (βγάζοντας τον απο την μπριζα, ή σβήνοντας το διακόπτη). Είναι ότι χειρότερο μπορούμε να κάνουμε για τα δεδομένα μας.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-4995674222331179650?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/4995674222331179650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/blog-post_30.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/4995674222331179650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/4995674222331179650'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/blog-post_30.html' title='Αντιμετώπιση προβλημάτων'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-7974293954518516120</id><published>2008-08-21T13:14:00.000-07:00</published><updated>2008-08-23T07:57:27.549-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='electronics'/><title type='text'>Serial</title><content type='html'>Για τη σειριακή θύρα υπάρχουν τα προγράμμα: ckermit και gkermit από αυτή την ιστοσελίδα: http://www.columbia.edu/kermit/&lt;br /&gt;&lt;br /&gt;Ίσως και το minicom να φανεί χρήσιμο.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-7974293954518516120?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/7974293954518516120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/serial.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/7974293954518516120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/7974293954518516120'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/serial.html' title='Serial'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-2598499811302790919</id><published>2008-08-20T14:41:00.000-07:00</published><updated>2008-08-20T14:43:59.318-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>xorg.conf</title><content type='html'>Eνα βασικό αρχείο ρυθμίσεων του X-server, της υπηρεσίας δηλαδή γραφικών σε συστήματα linux, είναι το  /etc/X11/&lt;span class="posthilit"&gt;xorg&lt;/span&gt;.&lt;span class="posthilit"&gt;conf&lt;/span&gt;&lt;br /&gt;Χωρίζεται σε διάφορα sections για καθε συσκευή. Καλό είναι να ξέρουμε τι κάνει το κάθε section, ώστε να μπορούμε να το προσαρμόζουμε κατά βούληση. Πάντα πριν από κάθε αλλαγή κρατάμε ένα αντίγραφο ασφαλείας:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;cp /etc/X11/&lt;/span&gt;&lt;span style="font-weight: bold;" class="posthilit"&gt;xorg&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;.&lt;/span&gt;&lt;span style="font-weight: bold;" class="posthilit"&gt;conf&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; ~/Desktop&lt;/span&gt;&lt;br /&gt;Mία αναλυτική περιγραφή του αρχείου μπορεί να βρεθεί εδώ: &lt;!-- m --&gt;&lt;a class="postlink" href="http://www.x.org/archive/X11R6.8.0/doc/xorg.conf.5.html"&gt;http://www.x.org/archive/X11R6.8.0/doc/&lt;span class="posthilit"&gt;xorg&lt;/span&gt;.&lt;span class="posthilit"&gt;conf&lt;/span&gt;.5.html&lt;/a&gt;&lt;!-- m --&gt;&lt;br /&gt;Οι επιλογές που επηρεάζουν τα γραφικά είναι Device, Monitor, Screen. Φυσικά δεν είναι οι μόνες.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Device&lt;/span&gt;&lt;br /&gt;Πρέπει να έχει το λιγότερο ένα section για να λειτουργήσει η κάρτα γραφικών. Μπορεί όμως να περιλαμβάνει και παραπανω. Η δομή είναι η εξής:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Section "Device"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    Identifier "name"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    Driver     "driver"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    entries&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;EndSection&lt;/span&gt;&lt;br /&gt;Τα πεδία &lt;span style="font-weight: bold;"&gt;Identifier&lt;/span&gt; και &lt;span style="font-weight: bold;"&gt;Driver&lt;/span&gt; είναι απαραίτητα. Το πεδίο Identifier δηλώνει το μοναδικό όνομα της συσκευής, που θα χρειαστεί παρακάτω. Το πεδίο Driver δηλώνει τον οδηγό που θα χρησιμοποιηθεί. Για nvidia κάρτες με κλειστούς οδηγούς αυτό μπορεί να είναι "nv" για τους παλιούς οδηγούς, ή "nvidia" για τους καινουριους. Οι οδηγοί πρέπει να είναι εγκατεστημένη για να είναι έγκυρη αυτή η επιλογή.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Monitor&lt;/span&gt;&lt;br /&gt;Πρέπει να έχει το λιγότερο ένα section για να λειτουργήσει η οθόνη. Μπορεί όμως να περιλαμβάνει και παραπανω. Η δομή είναι η εξής:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Section "Monitor"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    Identifier "name"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    entries&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;EndSection&lt;/span&gt;&lt;br /&gt;Τo πεδίo &lt;span style="font-weight: bold;"&gt;Identifier&lt;/span&gt; είναι απαραίτητo. Το πεδίο Identifier δηλώνει το μοναδικό όνομα της συσκευής, που θα χρειαστεί παρακάτω. Εδώ καθορίζεται η αναλυση της οθονης, συχνότητα ανανέωσης και άλλα.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Screen&lt;/span&gt;&lt;br /&gt;Εδώ γίνεται ένας συνδυασμός Device και Monitor. Tα υποχρεωτικά πεδία είναι &lt;span style="font-weight: bold;"&gt;Identifier&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Device&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Monitor&lt;/span&gt;. Φυσικά για να χρησιμοποιηθεί ένα Device πρέπει προηγουμένως να έχει οριστεί. Το ίδιο και για το Monitor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-2598499811302790919?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/2598499811302790919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/xorgconf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/2598499811302790919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/2598499811302790919'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/xorgconf.html' title='xorg.conf'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-101499798900893083</id><published>2008-08-20T13:38:00.000-07:00</published><updated>2008-08-20T13:41:53.056-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='electronics'/><title type='text'>Embedded HA5-30</title><content type='html'>Οδηγός/πρόγραμμα που να ελέγχει αυτη τη συσκευή μπορεί να βρεθεί σε αυτή την ιστοσελίδα:&lt;br /&gt;http://www.lesbonscomptes.com/psxtcl/&lt;br /&gt;&lt;br /&gt;Η μεταγλώττιση του κώδικα γίνεται εύκολα με την εγκατάσταση του πακέτου tcl-dev&lt;br /&gt;sudo apt-get instal tcl-dev&lt;br /&gt;και την αλλάγη του Makefile ώστε να έχει το σωστό include path (/usr/include/tcl8.4)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-101499798900893083?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/101499798900893083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/embedded-ha5-30.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/101499798900893083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/101499798900893083'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/embedded-ha5-30.html' title='Embedded HA5-30'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-253454595213832796</id><published>2008-08-20T06:14:00.000-07:00</published><updated>2008-08-20T13:43:38.306-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='electronics'/><title type='text'>Relay card</title><content type='html'>H κάρτα advantech pci 1762 είναι μια pci κάρτα που έχει έξοδο 16 relay. Στην παρακάτω ιστοσελίδα υπάρχουν linux drivers για την κάρτα αυτή καθώς και για άλλες ενδιαφέρουσες κάρτες: http://www.comedi.org&lt;br /&gt;&lt;br /&gt;Για τον έλεγχο της παραπάνω κάρτας πρέπει να εγκατασταθούν οι drivers της comedi, οι οποίοι πρέπει να μεταγλωττιστούν με τον πυρήνα.&lt;br /&gt;&lt;br /&gt;Για έλεγχο της παράλληλης θύρας υπάρχει το πρόγραμμα parashell, βλ. http://sourceforge.net/projects/parashell/&lt;br /&gt;To Makefile πρέπει να τροποποιηθεί ώστε να περιλαμβάνει το σωστό include path για το αρχείο asm/io.h (-I/usr/src/linux-headers-2.6.24-19/include/)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-253454595213832796?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/253454595213832796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/relay-card.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/253454595213832796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/253454595213832796'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/relay-card.html' title='Relay card'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-5184737747100662827</id><published>2008-08-18T02:57:00.000-07:00</published><updated>2008-08-18T03:02:13.128-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Πώς στήνεται ένα cluster;</title><content type='html'>&lt;span style="color: rgb(255, 0, 0);"&gt;ΠΡΟΣΟΧΗ: Αυτά που ακολουθούν είναι για γερά νεύρα. Μπορεί να περιέχουν λάθη, ασάφειες και ατέλειες ή απλώς να μην ισχύουν για όλα τα συστήματα. Δεν ευθύνομαι για τυχόν λάθη ή βλάβες που θα δημιουργηθούν. Ακολουθήστε με δική σας ευθύνη.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Εισαγωγή&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ένα cluster είναι ένα δίκτυο από υπολογιστές, σχεδιασμένοι να λειτουργούν από κοινού ώστε να λύσουν ένα πρόβλημα. Clusters χρησιμοποιούνται συνήθως αλλά όχι μόνο σε τομείς της υπολογιστικής μηχανικής, φυσικής, κρυπτογραφίας, δημιουργίας ταινιών κ.α. αλλά και για οποιαδήποτε εφαρμογή απαιτεί πολλη υπολογιστική ισχύ. Θα μπορούσε να χρησιμοποιηθεί και ως desktop αλλά ένα έτοιμο desktop κάνει καλύτερα τη δουλειά και με λιγότερο κόπο. Η ιδέα πισω από το parallel computing είναι η εξής: χωρίζω το πρόβλημά μου σε μικρότερα υποπροβλήματα τα οποία λύνονται πιο γρήγορα σε έναν υπολογιστή και έπειτα ανασυνθέτω τη λύση από τα επιμέρους στοιχεία. Για να τρέξει ένα πρόγραμμα σε ένα cluster πρέπει να προγραμματιστεί σε mpi (υπάρχουν βιβλιοθήκες τουλάχιστον για fortran, C, C++ ). Η μετατροπή ενός υπάρχοντος προγράμματος είναι πολύ δύσκολη και είναι προτιμότερο να ξαναγραφεί από την αρχή, μιας και η αρχή λειτουργίας είναι τελείως διαφορετική.&lt;br /&gt;&lt;br /&gt;Δύο πακέτα που περιλαμβάνουν σχεδόν όλα όσα χρειαζόμαστε είναι το oscar και το rocks. Το oscar εγκαθίσταται σε ένα υπάρχον λειτουργικό - υποστηρίζει fedora, mandriva, suse, redhat, scientific linux, centos - ενώ το rocks εγκαθιστά και περιλαμβάνει το red hat. Είναι φυσικά δυνατόν να στηθεί ένα cluster πάνω σε οποιαδήποτε διανομή, αλλά αυτά είναι που διατίθενται έτοιμα και λειτουργούν με τον ελαχιστο κόπο.&lt;br /&gt;&lt;br /&gt;Αυτό το μέρος θα ασχοληθεί με το καθαρά τεχνικό κομμάτι. Δηλαδή φυσική συναρμολόγηση του cluster. Έπειτα θα ακολουθήσει η εγκατάσταση του λειτουργικού, με όλα τα απαραίτητα προγράμματα και βιβλιοθήκες. Προς το παρόν αυτός ο οδηγός θα ασχοληθεί μόνο με red hat ως λειτουργικό. Τέλος θα δωθεί μια μικρή εισαγωγή σε προγραμματισμό με mpi.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Ασφάλεια&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Πριν τη δημιουργία ενός cluster είναι απαραίτητο να γνωρίζουμε που βρίσκονται οι ασφάλειες της ηλεκτρικής εγκατάστασης. Επίσης πρέπει να ξέρουμε αν η ηλεκτρική μας εγκατάσταση αντέχει την ισχύ που θα εγκατασταθεί. (Μπορεί με 2 υπολογιστές να είναι αμελητέα, αλλά με 4 αρχίζουν και σοβαρεύουν τα πράματα.) Πρέπει επίσης να ξέρουμε ότι το σύστημα θα παραγει θερμότητα και το καλοκαίρι στην Ελλάδα είναι αρκετά επιφορτισμένο. Οπότε καλό είναι να σκεφτούμε και λίγο το περιβάλλον. (Εγω τα δοκιμάζω όλα αυτά κάπου στην κεντρική Ευρώπη με μέγιστη θερμοκρασία 25 βαθμούς.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Προαπαιτούμενα&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Τι θα χρειαστεί (ελάχιστα προαπαιτούμενα);&lt;br /&gt;&lt;br /&gt;1 υπολογιστής (από δω και πέρα θα ονομάζεται master) με:&lt;br /&gt;* 2 κάρτες δικτύου&lt;br /&gt;* 1 GB ram&lt;br /&gt;* 20 GB σκληρό δίσκο&lt;br /&gt;* cdrom&lt;br /&gt;&lt;br /&gt;2 υπολογιστές (από δω και πέρα θα ονομάζονται slave, και μπορούν να είναι και περισσότεροι) με:&lt;br /&gt;* 1 κάρτα δικτύου&lt;br /&gt;* 1 GB ram&lt;br /&gt;* 20 GB σκληρό δίσκο&lt;br /&gt;* cdrom ή PXE κάρτα δικτύου (με cdrom είναι πιο εύκολα)&lt;br /&gt;&lt;br /&gt;1 ethernet switsch&lt;br /&gt;&lt;br /&gt;4 καλώδια δικτύου ethernet&lt;br /&gt;&lt;br /&gt;1 πολύμπριζο με διακόπτη (αν η μπρίζα του τοίχου δεν αντέχει την ισχύ τότε θα πρέπει να χρησιμοποιηθούν περισσότερες μπρίζες)&lt;br /&gt;&lt;br /&gt;Οθόνη, πληκτρολόγιο, ποντικί είναι απαραίτητα μόνο για την αρχική εγκατάσταση. Έπειτα η διαχείρηση του cluster θα γίνεται απομακρυσμένα από το τοπικό δίκτυο (αν υπάρχει). Σε περίπτωση που δεν υπάρχει τοπικό δίκτυο τότε χρειάζονται μόνο στον master.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Η παρακάτω εγκατάσταση θα σβήσει όλα τα δεδομένα των υπολογιστών.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Συναρμολόγηση&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Η βασική διάταξη που θα χρησιμοποιηθεί είναι όλοι οι υπολογιστές του cluster συνδέονται με όλους. Αυτό θα γίνει στο ethernet switch. Eπιπλέον ο master με τη δεύτερη κάρτα δικτύου θα συνδεθεί στο εξωτερικό τοπικό δίκτυο. Υπάρχουν φυσικά και άλλοι τρόποι συνδεσμολογίας, που για πολλούς υπολογιστές ελαχιστοποιούν τη χρήση καλωδιών και ethernet switch αλλά δε θα ασχοληθούμε με αυτούς.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bιβλιογραφία&lt;/span&gt;&lt;br /&gt;1. High Performance Linux Clusters: with OSCAR, ROCKs, openMosix &amp;amp; MPI, J. D. Sloan&lt;br /&gt;2. &lt;a href="http://www.beowulf.org/"&gt;Beowulf&lt;/a&gt;&lt;br /&gt;3. &lt;a href="http://svn.oscar.openclustergroup.org/trac/oscar"&gt;Oscar&lt;/a&gt;&lt;br /&gt;4. &lt;a href="http://www.rocksclusters.org/wordpress/"&gt;Rocks&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-5184737747100662827?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/5184737747100662827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/cluster.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5184737747100662827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5184737747100662827'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/cluster.html' title='Πώς στήνεται ένα cluster;'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-3620500813194636385</id><published>2008-08-14T08:10:00.000-07:00</published><updated>2008-08-14T08:11:34.123-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Αλλά τι είναι ένας υπολογιστής; ΙΙ</title><content type='html'>Περνώντας ένα επίπεδο παραπάνω από αυτές τις λογικές πύλες μπορούν να φτιαχνούν πιο πολύπλοκα ηλεκτρονικά εξαρτήματα. Οι αγωγοί που συνδέουν τις ηλεκτρονικές συσκευές μεταξύ τους και μεταφέρουν δεδομένα από τη μία στην άλλη λέγονται buses. Aν υποθέσουμε ότι χρειαζόμαστε να συνδέσουμε 3 συσκευές μεταξύ τους τότε χρειάζονται 3 αγωγοί που συνδεουν κάθε συσκευή με όλες τις άλλες. Με 4 συσκευές τότε ο αριθμός των αγωγών είναι 6, για 5 συσκευές χρειαζόμαστε 10 αγωγούς κ.τ.λ. Μια απλή τεχνική να μειωθεί το πλήθος των αγωγών είναι κάθε συσκευή να έχει τον κωδικό της, όλες οι συσκευές να συνδεθούν σε σειρά και στην αρχή των δεδομένων να υπαρχει ο κωδικός της κάθε συσκευής. Έτσι όλα τα δεδομένα περνάνε με τη σειρά από όλες τις συσκευες αλλά μόνο η συσκευή με το σωστό κωδικό δεχεται τα δεδομενα. Υπ'όψην ότι τα δεδομένα μπορεί να είναι όχι "απλά δεδομένα" αλλά κάποιο σύνολο οδηγιων που πρέπει να εκτελέσει η κάθε συσκευή.&lt;br /&gt;&lt;br /&gt;Τι συμβαίνει όμως στην περίπτωση που ένας αγωγός πάθει βλάβη; Τότε όλο το σύστημα θα πάψει να λειτουργει. Στην περίπτωση αυτή πρέπει να υπάρχουν εφεδρικοί αγωγοί, αλλά πόσοι; Για 3 αγωγους είπαμε ότι χρειάζονται 3 αγωγοι, ενω αν χρησιμοποιήσουμε την τεχνικη διέυθυνσης τότε μειωνονται στους 2. Είναι εύκολο να δει κανεις ότι με 3 αγωγους όμως αν συμβεί το πολύ σε έναν αγωγό βλάβη τότε το σύστημα μπορεί να συνεχίσει να λειτουργεί. Παρόμοιες τεχνικές έχουν αναπτυχθεί και για πιο πολύπλοκα συστήματα.&lt;br /&gt;&lt;br /&gt;Το πιο βασικό στοιχειo μνήμης είναι το register (καταχωρητής). Οι μνήμες αυτές είναι πολύ μικρές σε χωρητικότητα αλλά η ταχύτητα προσπέλασης τους είναι πολύ μεγάλη και είναι ενσωματωμένες στον επεργαστή. (Στους προγραμματιστές C είναι ίσως γνωστή η τεχνική να τοποθετούν μια μεταβλητή που θα χρησιμοποιηθεί πολλές φορές σε register για να αυξηθεί η ταχύτητα του προγράμματος.)&lt;br /&gt;&lt;br /&gt;Εχοντας αυτά ως δομικά στοιχεία μπορούμε τώρα να γράψουμε ένα πρόγραμμα. Το σύνολο οδηγιών (instruction set) δεν είναι τίποτε άλλο από συνδυασμούς 4 βασικών οδηγιών - πρόσθεση, αφαιρεση, φορτωση, αποθηκευση δυαδικών αριθμών. Στις πρώτες assembly γλώσσες οι δυνατότητες δεν ήταν πολλές παραπάνω από αυτές τις 4. Καταρχήν χρειάζεται μια μνήμη για να αποθηκευτούν αυτές οι οδηγίες, ο καταχωρητης, και οι οδηγίες αυτές εκτελούνται από τον επεξεργαστή. Aς υποθέσουμε ότι στον καταχώρητη έχει αποθηκευτεί το παρακάτω σύνολο οδηγίων:&lt;br /&gt;&lt;br /&gt;Φορτωσε τη θέση μνήμης 123 (η οποια περιλαμβάνει τον αριθμό 0101)&lt;br /&gt;Φορτωσε τη θέση μνήμης 456 (η οποια περιλαμβάνει τον αριθμό 0011)&lt;br /&gt;Πρόσθεσε τα δύο&lt;br /&gt;Αποθηκευσε το αποτέλεσμα στη θέση μνήμης 789&lt;br /&gt;&lt;br /&gt;Όπως βλέπουμε στα δύο πρώτα βήματα λειτουργεί μόνο η οδηγία φόρτωσης, στο τρίτο της πρόσθεσης και στο τεταρτο της αποθήκευσης. Αυτό έδωσε την ιδέα να χρησιμοποιηθεί στο μέγιστο η ικανοτητα του επεξεργστή με το να εκτελει και τις τεσσερις οδηγίες ταυτοχρονα. Δηλαδή ας υποθέσουμε ότι ενα δευτερο συνολο οδηγιων ειναι το εξης:&lt;br /&gt;&lt;br /&gt;Αποθηκευσε τον αριθμό 0011 στη θέση μνήμης 345&lt;br /&gt;Τιποτε&lt;br /&gt;Τιποτε&lt;br /&gt;Τιποτε&lt;br /&gt;&lt;br /&gt;Τότε δεν είναι απαραίτητο να περιμένει ο επεξεργαστής να τελείωσει το πρώτο σύνολο οδηγιών για να εκτελεσθεί το δεύτερο, αλλά μπορεί να εκτελεσθεί ταυτοχρονα με το πρώτο, αφού οδηγια 1 είναι διαφορετική στις δύο περιπτώσεις. Από τη στιγμή που έχουμε ένα σύνολο οδηγιών που επαναλαμβάνεται πολλές φορες δημιουργήθηκε η ιδέα της διαδικασίας (procedure), που περιλαμβάνει ακριβώς ένα τέτοιο σύνολο οδηγιών. Μια διαδικασία μπορεί να καλεσθεί από ένα μεγαλύτερο σύνολο οδηγιων και να εκτελεσθεί στα πλαίσια αυτού του συνόλου. Επειτα μπορεί να χρησιμοποιηθεί από ένα άλλο σύνολο οδηγιων.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-3620500813194636385?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/3620500813194636385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/3620500813194636385'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/blog-post_1022.html' title='Αλλά τι είναι ένας υπολογιστής; ΙΙ'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-1268915120375129574</id><published>2008-08-14T08:03:00.000-07:00</published><updated>2008-08-14T08:09:10.228-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Αλλά τι είναι ένας υπολογιστής;</title><content type='html'>Στόχος αυτού του θέματος είναι να εξηγήσει τι είναι στα αλήθεια ένας υπολογιστής. Από τι αποτελείται και πως πραγματικά λειτουργεί. Για να τα καταλάβει κανείς αυτά δε χρειάζονται γνώσεις μαθηματικών, προγραμματισμού ή ηλεκτρονικής. Απλώς λογικής. Γι'αυτό και θα ξεκινήσουμε με τους πιο απλούς κανόνες λογικής, οι οποίοι ισχύουν από την εποχή του Αριστοτέλη.&lt;br /&gt;&lt;br /&gt;Η βασική αρχή της Αριστοτελικής λογικής είναι ότι μία πρόταση μπορεί να είναι αληθης ή ψευδής. Δε μπορεί να είναι και αληθής και ψευδής ταυτόχρονα, αλλά ούτε και να είναι τίποτε άλλο εκτός απο αληθης ή ψευδής. Φυσικά υπάρχουν και άλλες λογικες όπως η τρίτιμη λογική του Lukasiewiz, ή η ασαφής λογική (fuzzy) αλλα οι υπολογιστές δε λειτουργούν ακόμη με αυτές. Ίσως στο μέλλον. Aς υποθέσουμε τώρα ότι έχουμε δύο προτάσεις π1 και π2. Η κάθε πρόταση μπορεί να είναι αληθής ή ψευδής, αρα οι δυνατοί συνδυασμοί είναι 4.&lt;br /&gt;π1 αληθής, π2 αληθής&lt;br /&gt;π1 αληθής, π2 ψευδής&lt;br /&gt;π1 ψευδής, π2 αληθής&lt;br /&gt;π1 ψευδής, π2 ψευδής&lt;br /&gt;&lt;br /&gt;Η ερώτηση που τίθεται τώρα είναι τι συμβαίνει με την πρόταση "π1 και π2". Το αποτέλεσμα μπορεί να βρεθεί με το λεγόμενο πίνακα αλήθειας.&lt;br /&gt;(Πρέπει να βάλω τον πίνακα εδώ)&lt;br /&gt;&lt;br /&gt;Αλλά ας δούμε ένα παράδειγμα. π1="Σήμερα βρέχει" και π2="Χθες είχε ήλιο". Ας υποθεσουμε ότι όντως σημερα βρέχει και ότι όντως χθες είχε ήλιο. Τότε η π1 αληθεύει και η π2 αληθεύει. Τότε η π3= π1 και π2 ="Σήμερα βρέχει αλλά χθες είχε ήλιο" επίσης αληθεύει. Αν όμως χθες δεν είχε ήλιο, αρα η π2 είναι ψευδης, τότε και η π3="Σήμερα βρέχει αλλά χθες είχε ήλιο" είναι επίσης ψευδής.&lt;br /&gt;&lt;br /&gt;Παρόμοιο πίνακα αλήθειας μπορούμε να συντάξουμε για το διαζευτικό ή (όχι αποκλειστικό).&lt;br /&gt;(Πρέπει να βάλω τον πίνακα εδώ)&lt;br /&gt;&lt;br /&gt;π1="Σήμερα θα βρέψει", π2="Σήμερα θα έχει ήλιο", π3=π1 ή π2="Σήμερα θα βρέξει ή θα έχει ήλιο" αληθεύει σε τρεις από τις τέσσερις περιπτώσεις, εκτός απο την περίπτωση δηλαδή που ούτε βρέξει ούτε έχει ήλιο (ίσως όταν έχει μόνο σύννεφα).&lt;br /&gt;&lt;br /&gt;Υπάρχει βέβαια και το αποκλειστικό ή.&lt;br /&gt;(Πρέπει να βάλω τον πίνακα εδώ)&lt;br /&gt;&lt;br /&gt;Όπου πρέπει να αληθεύει το πολύ μία απο τις προτάσεις, όχι και οι δύο ταυτόχρονα, για να είναι και ο συνδυασμός τους αληθής.&lt;br /&gt;&lt;br /&gt;Φυσικά όλα τα παραπάνω μπορούν να γραφούν με μαθηματικά ή ηλεκτρονικά σύμβολα και να διατυπωθούν σχέσεις μεταξύ τους. Ας υποθέσουμε προς στιγμή ότι οι παραπάνω πίνακες μπορούν να πραγματοποιηθούν ως πύλες (ηλεκτρονικα εξαρτηματα, θα αναφερθώ στη φυσική τους λειτουργία παρακάτω). Οι τιμές αληθής-ψευδής μπορούν να μεταφραστούν ως 0-1 ή υψηλή-χαμηλή τάση, όπως χρησιμοποιείται στην ηλεκτρονική. Έχουμε δηλαδή μια συσκευή που έχει δύο εισόδους (καλώδια, σωλήνες), τις π1 και π2, και μία έξοδο (καλώδιο, σωλήνας), την π3.&lt;br /&gt;Αναλογα με το ποια συσκευη θα χρησιμοποιήσουμε μπορούμε να πραγματοποιήσουμε την αντίστοιχη πράξη. Οι είσοδοι αυτές δεν είναι τίποτε άλλο απο καλώδια με ρεύμα. Αν εχουν υψηλη ταση, αληθευουν. Με χαμηλή τάση ψεύδονται.&lt;br /&gt;&lt;br /&gt;Οι παραπάνω πύλες μπορούν να συνδυαστούν είτε σε σειρά ή παράλληλα και να δώσουν άλλες πιο πολύπλοκες πύλες με περισσότερες εισόδους και εξόδους. Το αποτελεσμα μιας πύλης μπορεί να διοχευτεί σε ένα λαμπτήρα (παλιότερα χρησιμοποιούσαν λαμπτηρες πυρακτώσεως στους πρώτους υπολογιστές). Αν είναι υψηλή η τάση (1, αληθης) τότε θα ανάψει η λαμπα, αν είναι χαμηλή η τάση (0, ψευδής) δε θα αναψει η λάμπα. Ετσι έχουμε μια πρωτόγονη επικοινωνία με το χρήστη. Κατ'αναλογία μπορεί να φανταστεί κανείς τα pixel της οθόνης.&lt;br /&gt;&lt;br /&gt;Μεχρι στιγμής είδαμε ότι μπορούμε να αναπαραστήσουμε μόνο 0-1, ψευδές-αληθες, και τίποτε παραπάνω. Θα αποδείξουμε τώρα ότι αυτή την αναπαρασταση μπορούμε να τη χρησιμοποιήσουμε για οτιδήποτε. Ας πάρουμε τους φυσικούς αριθμούς 1, 2, 3, 4, ... Το 1 είναι εύκολο. Το 2 γράφεται 1*2, το 3=1*2+1, 4=1*2*2, 5=1*2*2+1, 6=1*2*2+1*2, 7=1*2*2+1*2+1 κτλ. Όπως φαίνεται όλοι οι αριθμοί μπορούν να γραφούν ως γινομενο και άθροισμα του 1 και του 2. Ας θεωρήσουμε τώρα ότι έχουμε 8 λάμπες. Σβηστή είπαμε είναι 0, ανοιχτή 1. Τις βάζουμε σε σειρά. Το ένα αναπαρισταται απο αυτές τις λάμπες ώς εξης: οι 7 αριστερά ειναι σβηστες και η ογδοη ειναι ανοιχτη (00000001). Το δύο: οι 6 αριστερά ειναι σβηστες και η εβδομη ειναι ανοιχτη και η ογδοη σβηστη (00000010). Το τρία: οι 6 αριστερά ειναι σβηστες και η εβδομη ειναι ανοιχτη (00000011)και η ογδοη ανοιχτή. Το τέσσερα (00000100). Το πέντε (00000101). Και πάει λέγοντας.&lt;br /&gt;&lt;br /&gt;Γιατί όμως ξεκινάμε από δεξία; Οι άραβες θα ξεκινούσαν από αριστερα; Το ίδιο ακριβώς πρόβλημα υπάρχει και στην αρχιτεκτονική επεξεργαστών. Ο τρόπος που παρουσιάσαμε παραπάνω ακολουθεί το συνηθισμένο τρόπο γραφής αριθμών και καλείται big endian. Αντίθετα, ο τρόπος που γράφουμε την ημερομηνία (27.06.2008) από τα μικρότερα ψηφία στα μεγαλύτερα λέγεται little endian. Aρχιτεκτονική big endian έχουν οι επεξεργαστές powerpc, sparc, ενώ little endian οι intel, amd και άλλοι.&lt;br /&gt;&lt;br /&gt;Αν θελήσουμε να αναπαραστήσουμε και αρνητικούς αριθμούς τότε χρειαζόμαστε και μία ακομη λαμπα (bit) για το πρόσημο. Αν η πρώτη πρώτη λαμπα απο αριστερα είναι αναμένη τότε έχουμε αρνητικό αριθμό. (Για αυτούς που ξέρουν C αυτό αντιστοιχεί σε integer, ενώ η προηγούμενη αναπαρασταση σε unsigned)&lt;br /&gt;&lt;br /&gt;Επειδή όμως έχουμε πεπερασμένο αριθμό από λάμπες δε μπορουμε να αναπαραστήσουμε όλους τους αριθμούς. Γι'αυτό και υπαρχει σε όλες τις γλώσσες προγραμματισμού ένα εύρος απο -12345678 μέχρι 12345678 (για παραδειγμα) που μπορεί να αναπαρασταθεί. Η αναπαράσταση πραγματικών αριθμών γίνεται με τη χρήση επιπλέον λαμπτήρων (bits) που αποθηκεύουν τη θέση της υποδιαστολής και τον εκθέτη του 10, αλλά δε θα ήθελα να μπώ εδώ σε τέτοιες λεπτομέρειες.&lt;br /&gt;&lt;br /&gt;Έπειτα έρχεται η ερώτηση ναι αλλά εγώ δε θέλω μόνο αριθμούς θέλω και γράμματα, μικρά και κεφαλαία. Η απάντηση ήρθε με το αλφάβητο ASCII. Κάθε σύμβολο που χρησιμοποιείται έχει την αναπαράστησή του στο δεκαεξαδικό σύστημα (αντι να έχουμε λάμπες ανοιχτες-σβηστες, δυαδικό σύστημα δηλαδή, εχουμε λάμπες σβηστες+15 χρώματα δεκαεξαδικό δηλαδή). Ετσι μπορούμε να χρησιμοποιούμε λατινικούς χαρακτήρες, μικρά κεφαλαια, και άλλα σύμβολα. Μετά φυσικά ήρθαν και άλλες κωδικοποιήσεις για τις οποίες δεν έχω ιδέα&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-1268915120375129574?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/1268915120375129574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/1268915120375129574'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/blog-post_14.html' title='Αλλά τι είναι ένας υπολογιστής;'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-81339585640338416</id><published>2008-08-14T07:38:00.000-07:00</published><updated>2009-03-22T08:13:47.087-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Εισαγωγή σε parallel computing</title><content type='html'>Όλο και πιο συχνά ακούγεται στις μέρες μας ο όρος &lt;a href="http://en.wikipedia.org/wiki/Parallel_computing"&gt;parallel computing&lt;/a&gt;, παράλληλοι υπολογισμοί, και έχει γίνει πλέον και στους προσωπικούς υπολογιστές πραγματικότητα με επεξεργαστές διπλών και τρίδιπλων (όπως το λαϊκό) επεξεργαστών. Αλλά ποιος ο λόγος και υπάρχει πράγματι κέρδος από τους επεξεργαστές με δύο πυρήνες ή είναι απλώς ένα εμπορικό παιχνίδι των εταιριών για να αυξήσουν τα κέρδη τους; Αυτή την ερώτηση δυστυχώς αδυνατώ να απαντήσω αλλά θα σας δώσω μια απλή γεύση του πως μπορούμε να εκμεταλλευτούμε αυτή τη δυνατότητα.&lt;br /&gt;&lt;br /&gt;Oι παράλληλοι υπολογιστές χωρίζονται σε δύο βασικές κατηγορίες (επιτρέψτε μου την αγγλική ορολογία): shared και distributed μνήμης υπολογιστές. Οι πρώτοι, shared memory, είναι αυτοί που έχουμε στους  υπολογιστές μας, όπου ο κάθε επεξεργαστής (στο σημείο αυτό δε θα τους ξεχωρήσω από τους πυρήνες) μοιράζεται την ίδια μνήμη με όλους τους υπόλοιπους. Οι distributed memory υπολογιστές έχουν ο καθένας δική του μνήμη και επικοινωνούν μέσω δικτύου. Προφανώς αν έχουμε 100 επεξεργαστές είναι λίγο δύσκολο να τους καλωδιώσουμε ώστε να μοιράζονται την ίδια μνήμη, ίσως στο μέλλον. Η δημιουργια, ο προγραμματισμός και η χρήση distributed memory είναι αρκετά προχωρημένη και δε θα ασχοληθω εδώ καθόλου.&lt;br /&gt;&lt;br /&gt;Ας συνεχίσουμε λοιπόν με shared memory υπολογιστές. Για τα παρακάτω θα χρειαστούν:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;sudo apt-get install build-essential libgomp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;build-essential περιέχει όλα τα απαραίτητα πακέτα για προγραμματισμό και αναπτυξη κώδικα&lt;br /&gt;libgomp περιέχει τη βιβλιοθήκη για shared memory parallel programming&lt;br /&gt;&lt;br /&gt;Aναλυτικές οδηγίες για την gnu openMP μπορούν να βρεθούν http://gcc.gnu.org/onlinedocs/libgomp/&lt;br /&gt;&lt;br /&gt;Θα ξεκινήσω με ένα απλό hello world πρόγραμμα σε C. Δημιοργούμε καταρχήν ένα φάκελο&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;mkdir ~/testgomp&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;cd ~/testgomp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ανοίγουμε μέσα στο φάκελο testgomp με το gedit το αρχείο hello.c&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;gedit hello.c &amp;amp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Kαι εισάγουμε τα παρακάτω:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;int main()&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;printf("Hello world\n");&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;To μεταγλωττίζουμε και δημιουργούμε το εκτελέσιμο με:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;gcc -c hello.c&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;gcc -o serialtest hello.o&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Eκτελούμε το πρόγραμμα που δημιουργήθηκε με&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;./serialtest&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;και βλέπουμε ότι εκτυπώνεται στην οθόνη Hello world μόνο μία φορά.&lt;br /&gt;&lt;br /&gt;Tώρα προσθέτουμε τη γραμμή #pragma omp parallel δηλαδή το αρχείο θα πρέπει να φαίνεται:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;int main()&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;#pragma omp parallel&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;printf("Hello world\n");&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To μεταγλωττίζουμε (τώρα χρειάζεται να συνδέσουμε επίσης την αντίστοιχη βιβλιοθήκη) και δημιουργούμε το εκτελέσιμο με:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;gcc -c -fopenmp hello.c&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;gcc -o paralleltest hello.o&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Εκτελούμε τώρα το παράλληλο πρόγραμμα με&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;./paralleltest&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;και βλέπουμε να τυπώνεται δύο φορές ενώ υπάρχει μόνο μία φορά στον κώδικά μας και δεν υπάρχει φυσικά κανένας βρόγχος. (Φυσικά αν έχουμε επεξεργαστή με ένα μόνο πυρήνα δε θα δούμε διαφορά)&lt;br /&gt;Η γραμμή #pragma omp parallel αντιλαμβάνεται από το μεταγλωττιστή gcc σαν σχόλιο αν δεν υπάρχει η επιλογή -fopenmp κατά τη μεταγλώττιση, πράμα που επιτρέπει ένα πρόγραμμα που γράφουμε να είναι αρκετά portable.&lt;br /&gt;&lt;br /&gt;Φυσικά αυτό δεν είναι και πολύ χρήσιμο γιατί επαναλαμβάνει την ίδια δουλειά δύο φορές. Εμείς χρειαζόμαστε κάτι που να μοιράζει το φόρτιο εργασίας στους δύο επεξεργαστές.&lt;br /&gt;Aς δημιουργήσουμε τώρα ένα άλλο αρχείο hello2.c που θα περιέχει τα εξης:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;#define N 100000&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;int main()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;  int i, a[N];&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;  #pragma omp parallel for&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;  for (i=0;i&lt; style="font-weight: bold;"&gt;     a[i]= 2*i;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;  return 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Και μεταγλώττιση όπως πάντα με&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;gcc -c -fopenmp hello2.c&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;gcc -o paralleltest2 hello2.o&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Το συγκεκριμένο παράδειγμα μοιράζει αυτόματα το array a[N] στα δύο threads που δημιουργούνται. Τα αποτελέσματα είναι σωστά γιατί το δεξί μέλος της ισότητας δεν εξαρτώνται από το αριστερό.&lt;br /&gt;&lt;br /&gt;Aν είχαμε όμως κάτι όπως αυτό:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;#define N 100000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;int main()&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;  int i, a[N];&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;  a[0]=0;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;  #pragma omp parallel for&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;  for (i=1; i&lt;&gt;&lt;span style="font-weight: bold;"&gt;     a[i]= a[i-1]+1;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;  return 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;δε θα λειτουργούσε γιατι κάθε επόμενο στοιχείο του a θα εξαρτάται από το προηγούμενο, αρα για να υπολογισει το στοιχειο 50000 στο δεύτερο thread θα χρειάζεται το 49999 από το πρώτο thread το οποίο δεν έχει υπολογιστεί ακομη.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Σε distributed memory υπολογιστές όπου τα δεδομένα, το a στο παράδειγμά μας, δεν είναι σε κοινή μνήμη θα πρέπει να μεταφέρονται από επεξεργαστή σε επεξεργαστή (για περισσότερες πληροφοριές δες http://en.wikipedia.org/wiki/Message_Passing_Interface) Yπάρχουν διάφορα εργαλεία για να στηθεί ένα [/url=http://en.wikipedia.org/wiki/Computer_cluster]cluster[/url] (distributed memory υπολογιστής) φυσικά και σε linux.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Βιβλιογραφία&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1. http://openmp.org/wp/&lt;br /&gt;2. http://gcc.gnu.org/onlinedocs/libgomp/&lt;br /&gt;3. http://en.wikipedia.org/wiki/OpenMP&lt;br /&gt;4. http://en.wikipedia.org/wiki/Parallel_computing&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-81339585640338416?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/81339585640338416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/81339585640338416'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/parallel-computing.html' title='Εισαγωγή σε parallel computing'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-9012240806603956953</id><published>2008-08-13T14:43:00.000-07:00</published><updated>2008-11-03T11:47:28.511-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mathematics'/><title type='text'>Απλή ρίζα</title><content type='html'>Ο αριθμός 11.111.112.222.222 - 3.333.333 είναι τέλειο τετράγωνο. Βρείτε την τετραγωνική του ρίζα. Χωρίς υπολογιστή τσέπης ή γενικότερα υπολογιστή.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-9012240806603956953?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/9012240806603956953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/11.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/9012240806603956953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/9012240806603956953'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/11.html' title='Απλή ρίζα'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-5723610830887200044</id><published>2008-08-13T10:43:00.000-07:00</published><updated>2008-08-13T14:32:29.857-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mathematics'/><title type='text'>Διόφαντος, βιβλίο 1, πρόβλημα 1</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Πρόβλημα: &lt;/span&gt;Δοθείς αριθμός να μεριστεί σε δύο αριθμούς με δοθείσα διαφορά.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Λύση&lt;/span&gt;: Έστω πως ο δοθείς αριθμός είναι εκατό και η δοθείσα διαφορά σαράντα μονάδες. Να βρεθούν οι δύοι αριθμοί.&lt;br /&gt;Έστω πως ο μικρότερος είναι ο αριθμός, τότε ο μεγαλύτερος θα είναι ένας αριθμός συν σαράντα μονάδες, το άθροισμά τους είναι ίσο προς εκατό μονάδες, άρα εκατό μονάδες είναι ίσες προς δύο αριθμούς συν σαράντα μονάδες. Από όμοια μπορώ να αφαιρέσω όμοια, οπότε αφαιρώ και από τα δύο μέλη σαράντα μονάδες. Απομένουν δύο αριθμοί ίσοι προς εξήντα μονάδες, άρα ο αριθμός είναι τριάντα. Επομένως ο μικρότερος θα είναι τριάντα μονάδες και ο μεγαλύτερος εβδομήντα, η απόδειξη είναι φανερή.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-5723610830887200044?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5723610830887200044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5723610830887200044'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/1-1.html' title='Διόφαντος, βιβλίο 1, πρόβλημα 1'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-5073195509118787610</id><published>2008-08-13T09:00:00.000-07:00</published><updated>2008-08-13T14:32:11.322-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Κέλυφος για αρχάριους</title><content type='html'>&lt;strong&gt;Bash for beginners&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;To bash είναι ένα κέλυφος, όπως το csh, tcsh, zsh, ksh και άλλα. Είναι το προεπιλεγμένο κέλυφος για το ubuntu. To κέλυφος παρέχει ένα τρόπο επικοινωνίας του χρήστη με το λειτουργικό, είτε ενεργά (interactively) ή παθητικά (non-interactively). Ενεργά σημαίνει ότι οι εντολές εισάγονται από το πληκτρολόγιο από το χρήστη ενώ παθητικά εννοούμε ότι οι εντολές εκτελούνται από ένα αρχείο.&lt;br /&gt;&lt;br /&gt;Αν μια εντολή ξεκινάει με # τότε θεωρείται από το bash ως σχόλιο και αγνοείται. Οι εντολές μπορούν να χωριστούν χονδρικά σε τεσσερις κατηγορίες:&lt;br /&gt;&lt;br /&gt;* Απλές εντολές&lt;br /&gt;* Αγωγοί (pipelines)&lt;br /&gt;* Λίστες&lt;br /&gt;* Σύνθετες εντολές&lt;br /&gt;&lt;br /&gt;Οι απλές εντολές είναι ακολουθία λέξεων και κενών, όπως&lt;br /&gt;cd ~/Documents&lt;br /&gt;Oι αγωγοί | διοχετεύουν το αποτέλεσμα της πρώτης εντολής στη δεύτερη&lt;br /&gt;ls | grep myfile&lt;br /&gt;Οι λίστες είναι ακολουθία εντολών που εκτελούνται η μία μετά την άλλη&lt;br /&gt;cd ~/Documents; ls; cd&lt;br /&gt;Οι σύνθετες εντολές περιλαμβάνουν βρόγχους και εντολές ελέγχου.&lt;br /&gt;&lt;br /&gt;Το κέλυφος μπορεί να χρησιμοποιηθεί σαν μια αυτόνομη γλώσσα προγραμματισμού μιας και περιέχει όλα τα χαρακτηριστικά όπως πρόσθεση, πολλαπλασιασμός, βρόγχους, στοιχεία ελέγχου κ.α. που απαιτεί μια γλώσσα προγραμματισμού. Η εκτέλεση ενός προγράμματος κελύφους, ας πούμε του αρχείου myscript, γίνεται ως εξής:&lt;br /&gt;bash myscript&lt;br /&gt;Για ευκολία μπορούμε να εισάγουμε ως πρώτη γραμμή του αρχείου myscript τη γραμμή:&lt;br /&gt;#!/bin/bash&lt;br /&gt;και να αλλάξουμε τα δικαιώματα του αρχείου σε εκτελέσιμο&lt;br /&gt;chmod u+x myscript&lt;br /&gt;Tώρα μπορούμε να το εκτελέσουμε και ως&lt;br /&gt;./myscript&lt;br /&gt;Στην περίπτωση αυτή το # δεν λειτουργεί ως σχόλιο, η μόνη εξαίρεση, αλλά σε συνδυασμό με τo ! δηλώνει ότι πρόκειται για πρόγραμμα κέλυφους bash.&lt;br /&gt;&lt;br /&gt;To κλασσικό παράδειγμα "Hallo World" στους προγραμματιστές θα φαίνοταν στο bash:&lt;br /&gt;#!/bin/bash&lt;br /&gt;echo Hallo World&lt;br /&gt;που τυπώνει απλώς στην οθονη το "Hallo World".&lt;br /&gt;&lt;br /&gt;Όπως στις περισσότερες γλώσσες προγραμματισμού υπάρχουν οι έννοιες τυπική έξοδος (stdout), τυπική είσοδος (stdin), τυπικό λάθος (stderr). Η τυπική έξοδος και το τυπικό λάθος είναι συνήθως η οθόνη, ενώ η τυπική είσοδος το πληκτρολόγιο. Μπορούμε όμως να αναδιοχετεύσουμε όλα αυτά.&lt;br /&gt;&lt;br /&gt;* stdout σε αρχείο&lt;br /&gt;ls -l &gt; result1.txt&lt;br /&gt;Το αποτέλεσμα της εντολής ls-l αποθηκεύεται στο αρχείο result1.txt.&lt;br /&gt;ls -l &gt;&gt; result1.txt&lt;br /&gt;Εδώ τo αποτέλεσμα της εντολής ls -l θα αποθηκευτεί στο αρχείο result1.txt. Αν υπάρχει το αρχείο τότε θα γραφεί στο τέλος του αρχείου χωρις να διαγράψει τα προηγούμενα.&lt;br /&gt;&lt;br /&gt;* stderr σε αρχείο&lt;br /&gt;cd blah 2&gt; err.txt&lt;br /&gt;cd blah &gt;&amp;amp; err.txt&lt;br /&gt;Διοχετεύει το λάθος μήνυμα, σε περιπτωση που δεν υπάρχει ο φάκελος blah, στο αρχείο err.txt.&lt;br /&gt;&lt;br /&gt;Στα προγράμματα κελύφους είναι πολύ εύκολο να διαβάσουμε τα ορίσματα του προγράμματος με τις μεταβλητές $0, $1, $2, ..., οι οποίες δηλώνουν το όνομα του προγράμματος με$0 και επειτα το πρώτο, δεύτερο όρισμα κ.ο.κ. To παρακάτω πρόγραμμα τυπώνει στην οθόνη το όνομα του προγράμματος (του αρχείου) και το πρώτο όρισμα.&lt;br /&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;echo $0, $1&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-5073195509118787610?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/5073195509118787610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/blog-post_13.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5073195509118787610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5073195509118787610'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/blog-post_13.html' title='Κέλυφος για αρχάριους'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-6460346392786164231</id><published>2008-08-13T08:58:00.001-07:00</published><updated>2008-08-13T14:31:07.893-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Οδηγός gnuplot</title><content type='html'>&lt;strong&gt;gnuplot&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Το gnuplot είναι ένα πρόγραμμα για τη σχεδίαση δεδομένων και συναρτήσεων από τη γραμμή εντολών. H εγκατάσταση του προγράμματος gnuplot γίνεται με την εκτέλεση της εντολής:&lt;br /&gt;&lt;br /&gt;sudo apt-get install gnuplot&lt;br /&gt;&lt;br /&gt;όπως πάντα άλλωστε. Το gnuplot ενδείκνυται για να συμπεριληφθεί ως εντολές σχεδίασης σε άλλο πρόγραμμα που διαβάζει ή παράγει τα δεδομένα. Τονίζεται ότι χρησιμοποιείται από το octave (υψηλού επιπέδου γλώσσα για αριθμητικούς υπολογισμούς) και  υπάρχει και επέκταση της γλώσσας προγραμματισμού python για gnuplot.&lt;br /&gt;&lt;br /&gt;Πληκτρολογώντας gnuplot στη γραμμή εντολών του κελύφους εισέρχεστε στη γραμμή εντολών του gnuplot, ενώ πληκτρολογώντας exit ή quit επιστρέφετε στη γραμμή εντολών του κελύφους.&lt;br /&gt;&lt;br /&gt;H εντολή plot&lt;br /&gt;&lt;br /&gt;Είναι η βασικότερη ίσως εντολή στο gnuplot, η οποία σχεδιάζει μεγάλη ποικιλία διαγραμμάτων στο επιπέδο (2d). Μπορεί να  σχεδιάσει απλές γραμμές, σημεία (dots ή points), συνδυασμό των γραμμών και των σημείων, ιστογράμματα, ράβδους με ένδειξη λάθους, διανύσματα, ράβδους για οικονομικές εφαρμογές κ.α. Τα δεδομένα μπορεί να δημιουργούνται είτε μέσα απο το gnuplot με τη χρήση ενσωματωμένων συναρτήσεων ή που θα διαβάζονται από αρχεία. Οι επιλογές που δέχεται η εντολή plot είναι πάρα πολλές και οι συνδυασμοί τους ακόμη περισσότεροι, γι'αυτό στον οδηγό αυτό θα περιγραφούν μόνο μερικές από τις βασικές.&lt;br /&gt;&lt;br /&gt;Συναρτήσεις&lt;br /&gt;&lt;br /&gt;Οποιαδήποτε μαθηματική έκφραση που γίνεται αποδεκτή απο C, FORTRAN, Pascal μπορεί να σχεδιαστεί και με το gnuplot. Η προτεραιότητα των τελεστών καθορίζεται από τις προδιαγραφές της γλώσσας C.&lt;br /&gt;&lt;br /&gt;Αν πληκτρολογήσουμε&lt;br /&gt;&lt;br /&gt;plot x&lt;br /&gt;&lt;br /&gt;θα σχεδιάσει μια ευθεία γραμμή που θα ξεκινάει από το σημείο  (-10,-10) και θα καταλήγει στο σημείο (10,10) προεπιλεγμένα από το ίδιο το gnuplot. O τύπος της συνάρτησης φάινεται στην επάνω δεξιά γωνία του διαγράμματος. Με την ιδια λογική μπορούμε να σχεδιάσουμε γραφικές παραστάσεις πιο πολύπλοκων συναρτησεων όπως φαίνεται στα παρακάτω παραδείγματα:&lt;br /&gt;&lt;br /&gt;plot  x**2, x**3-5*x**2&lt;br /&gt;plot sin(x), cos(2*x)&lt;br /&gt;plot 1/tan(x), 1/tan(x+5), 1/tan(x/10)&lt;br /&gt;&lt;br /&gt;Όπως φαίνεται κάθε γράφημα τυπώνεται με διαφορετικό χρώμα για να ξεχωρίζεται από τα προηγούμενα. Είναι δυνατό να οριστούν συναρτήσεις από το χρήστη οι οποίες θα χρησιμοποιηθούν αργότερα.&lt;br /&gt;&lt;br /&gt;myfun(x) = sin(x) + x&lt;br /&gt;plot myfun(x)&lt;br /&gt;&lt;br /&gt;Για να αλλάξει το εύρος που θα σχεδιαστεί η καμπύλη, στο παράδειγμα από 0 μέχρι 5, μπορούμε να πληκτρολογήσουμε&lt;br /&gt;&lt;br /&gt;plot [0:5] 1/tan(x)&lt;br /&gt;&lt;br /&gt;Αρχεία δεδομένων&lt;br /&gt;&lt;br /&gt;Το gnuplot είναι δυνατό να σχεδιάσει και διαγράμματα τα οποία προέρχονται από ένα αρχείο δεδομένων.  Υπάρχει βέβαια περιορισμός στη μορφή του αρχείου. Τα δεδομένα πρέπει να είναι διατεταγμένα σε στήλες, όπου κάθε στήλη θα αντιπροσωπεύει τις τιμές ενός άξονα. Ας υποθέσουμε ότι στο αρχείο mydata είναι αποθηκευμένα τα παρακάτω δεδομένα:&lt;br /&gt;&lt;br /&gt;0 1.2&lt;br /&gt;1 2.5&lt;br /&gt;2 3.7&lt;br /&gt;3 4.8&lt;br /&gt;4 5.9&lt;br /&gt;&lt;br /&gt;Για να σχεδιάσουμε τα δεδομένα αυτά στο gnuplot, θα γράφαμε&lt;br /&gt;&lt;br /&gt;plot "mydata"&lt;br /&gt;&lt;br /&gt;Τα αρχεία δεδομένων μπορεί να περιλαμβάνουν περισσότερες από μία στήλες, οι οποίες μπορούν να σχεδιαστούν με την επιλογή using ή u.&lt;br /&gt;&lt;br /&gt;plot "mydata" using 1:2, u 1:3&lt;br /&gt;&lt;br /&gt;στην πρώτη περίπτωση θεωρεί ως δεδομενα την πρώτη και δεύτερη στήλη για τους x- και y- άξονες αντίστοιχα, ενώ στη δεύτερη περίπτωση την πρώτη και τρίτη στήλη του αρχείου.&lt;br /&gt;&lt;br /&gt;Μορφοποίηση διαγράμματος&lt;br /&gt;&lt;br /&gt;Ένας γενικός τίτλος πάνω από το διάγραμμα ορίζεται ως&lt;br /&gt;&lt;br /&gt;set title "Hallo world"&lt;br /&gt;&lt;br /&gt;σε αντίθεση με τη λεζάντα που δίνεται από&lt;br /&gt;&lt;br /&gt;plot x title "f(x) = x", x**2 title "f(x) = x**2"&lt;br /&gt;&lt;br /&gt;Oι ετικέτες των αξόνων ορίζονται με τις επιλογές&lt;br /&gt;&lt;br /&gt;set xlabel "x"&lt;br /&gt;set ylabel "f(x)"&lt;br /&gt;&lt;br /&gt;και το διάγραμμα τότε μπορεί να ξανασχεδιαστεί με&lt;br /&gt;&lt;br /&gt;replot&lt;br /&gt;&lt;br /&gt;Αυτοματοποίηση εντολών&lt;br /&gt;&lt;br /&gt;Όλες οι εντολές που θα χρησιμοποιηθούν μπορούν να αποθηκευτούν σε ένα αρχείο για μελλοντική χρήση και να καλούνται από το gnuplot με την εντολή load. Για παράδειγμα το αρχείο myfile μπορεί να περιλαμβάνει τις εξής εντολές:&lt;br /&gt;&lt;br /&gt;set title "Hallo world"&lt;br /&gt;set xlabel "Time"&lt;br /&gt;set ylabel "Money"&lt;br /&gt;plot x title "Time is money"&lt;br /&gt;&lt;br /&gt;και να καλεσθεί μέσα από το gnuplot  ως:&lt;br /&gt;&lt;br /&gt;load "myfile"&lt;br /&gt;&lt;br /&gt;όπου θα εκτελεσθούν οι παραπάνω εντολές.&lt;br /&gt;&lt;br /&gt;Επίλογος&lt;br /&gt;&lt;br /&gt;Οι δυνατότητες φυσικά του gnuplot δε περιορίζονται σε αυτά τα οποία περιγράφτηκαν εδώ. Για περισσότερες πληροφορίες μπορεί κανείς να ψάξει στην ιστοσελίδα του gnuplot, ή μέσα από το πρόγραμμα πληκτρολογώντας&lt;br /&gt;&lt;br /&gt;help {&lt;θέμα&gt;}&lt;br /&gt;&lt;br /&gt;Βιβλιογραφία&lt;br /&gt;&lt;br /&gt;http://www.gnuplot.info/docs/gnuplot.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-6460346392786164231?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/6460346392786164231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/gnuplot.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/6460346392786164231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/6460346392786164231'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/gnuplot.html' title='Οδηγός gnuplot'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-8083353236398166763</id><published>2008-08-13T08:44:00.000-07:00</published><updated>2008-08-13T14:30:49.124-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Oδηγός wget</title><content type='html'>&lt;strong&gt;wget&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Το wget είναι ένα πρόγραμμα για συλλογή δεδομένων από το διαδίκτυο, το οποίο μπορεί να εκτελεστεί και στο υπόβαθρο (background). Αυτό σημαίνει ότι ο χρήστης μπορεί ακόμη και να αποσυνδεθεί από το σύστημα ενώ η εντολή wget θα συνεχίσει να εκτελείται.&lt;br /&gt;&lt;br /&gt;Το wget μπορεί να δημιουργήσει τοπικές εκδόσεις μιας ιστοσελίδας, αναπαράγωντας πλήρως τη δομή των φακέλων της αρχικής ιστοσελίδας. Μπορεί επίσης να μετατρέψει τους συνδέσμους της ιστοσελίδας σε τοπικά αρχεία HTML για αναφορά σε εκτός σύνδεσης κατάσταση.&lt;br /&gt;&lt;br /&gt;Στο σημείο αυτό πρέπει να τονίσω ότι η δυνατότητα του να κατεβάζει κανείς δεδομένα από το διαδίκτυο από τη γραμμή εντολών σημαίνει ότι μπορεί να ενσωματωθεί σε ένα αρχείο εντολών κελύφους (script) και να εκτελεσθεί αυτόματα. Αυτό επιτρέπει την κατάχρηση ιστοσελίδων, που μπορεί να οδηγήσει στην κατάρρευσή τους. Αρά δεν ειναι αποδεκτή μια τέτοια χρήση και προτείνεται να γίνεται πάντα με μέτρο. Γι'αυτό στον οδηγό αυτό δε θα χρησιμοποιηθεί καμία ιστοσελίδα ως παράδειγμα αλλά πάντα η λέξη "url". Σε όλα τα παραδείγματα μπορείτε να αντικαταστήσετε τη λέξη url με οποιαδήποτε ιστοσελίδα όπως για παράδειγμα www.google.com ή http://ubuntu.opengr.net.&lt;br /&gt;&lt;br /&gt;Όπως η περισσότερες εντολές η επιλογή -V ή --version τυπώνει την έκδοση του wget, ενώ η επιλογή -h ή --help τυπώνει ένα μήνυμα βοηθειας με όλες τις επιλογές του wget.&lt;br /&gt;&lt;br /&gt;Αλλά ας περάσουμε σε ένα πολύ απλό παράδειγμα. Η παρακάτω εντολή&lt;br /&gt;&lt;br /&gt;wget url&lt;br /&gt;&lt;br /&gt;θα κατεβάσει την ιστοσελίδα url στο φάκελο στον οποίο εκτελέσθηκε και θα την αποθηκεύσει στο αρχείο index.html. Όπως θα παρατηρήσετε, αποθηκεύτηκε μεν η ιστοσελίδα αλλά όχι όλες οι απαραίτητες πληροφορίες ώστε να είναι πλήρως εμφανίσιμη και όταν δεν είστε συνδεδεμένοι.&lt;br /&gt;&lt;br /&gt;Σε περίπτωση που δε βρεθεί η ιστοσελίδα τότε θα εμφανιστεί ένα μήνυμα λάθους "Resolving url... failed: Host not found." Aν επιθυμείτε να προωθείσετε τα μηνύματα της εντολής wget σε ένα αρχείο τότε με την επιλογή -ο logfile όλα τα μηνύματα αποθηκεύονται στο αρχείο logfile.&lt;br /&gt;&lt;br /&gt;wget url -o mylog&lt;br /&gt;&lt;br /&gt;Αντί να δημιουργεί κάθε φορά καινούριο αρχείο μηνυμάτων, με την επιλογή -a logfile τα μηνύματα γράφονται στο τέλος του αρχείου logfile. Αν το αρχείο δεν υπάρχει τότε δημιουργείται ενα καινούριο. Φυσικά όλα τα μηνύματα μπορούν να κατασταλλούν με την επιλογή -q ή --quiet.&lt;br /&gt;&lt;br /&gt;Αν θελετε να κατεβάσετε με μία εντολή από πολλές ιστοσελίδες τότε μπορείτε να γράψετε όλες τις ιστοσελίδες σε ένα αρχείο εισόδου, για παραδειγμα το αρχείο myinput μπορεί να περιλαμβάνει&lt;br /&gt;&lt;br /&gt;url1&lt;br /&gt;url2&lt;br /&gt;url3&lt;br /&gt;&lt;br /&gt;Τότε η εντολή&lt;br /&gt;&lt;br /&gt;wget -i myinput -a mylog&lt;br /&gt;&lt;br /&gt;θα διαβάσει από το αρχείο  εισόδου myinput όλες τις ιστοσελίδες που θα δεί, δηλαδή τις url1, url2, url3, και θα τις κατεβάσει γράφοντας όλα τα μηνύματα στο αρχειό mylog.&lt;br /&gt;&lt;br /&gt;Το προεπιλεγμένο αρχείο εξόδου όπως είπαμε είναι το index.html. Αυτό μπορεί να αλλαχτεί με την επιλογή -Ο file. Προσοχή: είναι κεφαλαίο αγγλικό ο και όχι μηδέν!!!&lt;br /&gt;&lt;br /&gt;wget url -O myurl.html&lt;br /&gt;&lt;br /&gt;Η παραπάνω εντολή θα αποθηκεύσει την ιστοσελίδα url στο αρχείο myurl.html.&lt;br /&gt;&lt;br /&gt;Σε περίπτωση που η ιστοσελίδα περιέχει εικόνες, τότε η εντολή πρέπει να εκτελεσθεί με την επιλογή -k ή --convert-links ώστε να είναι αυτές διαθέσιμες και για τοπική χρήση. Μια άλλη επιλογή είναι η -m ή --mirror, η οποία δημιουργεί ένα κατοπτρικό αντίγραφο της ιστοσελίδας. Η επιλογή αυτή ενεργοποιεί, εκτός των άλλων, την αναδρομική επιλογή -r ή --recursive. To βάθος της αναδρομής οριζεται:&lt;br /&gt;&lt;br /&gt;-l depth&lt;br /&gt;&lt;br /&gt;όπου η προεπιλεγμένη τιμή για το depth είναι 5.&lt;br /&gt;&lt;br /&gt;H επιλογή -b ή --background θέτει την εντολή στο υπόβαθρο αμέσως μετά την εκκίνησή της. Εάν δεν έχει οριστεί αρχείο εξόδου μέσω της επιλογής -o, τότε το αποτέλεσμα προωθείται στο αρχειό wget-log. Θα παρατηρήσετε ότι με αυτή την εντολή, ο ελέγχος επιστρέφεται αμέσως στη γραμμή εντολών, μαζί με το pid (process identity) της διαδικασίας που ξεκίνησε. Αν ο χρήστης αποσυνδεθεί τότε η διαδικασία αυτή θα συνεχίσει να τρέχει.&lt;br /&gt;&lt;br /&gt;Και φυσικά είναι δυνατό τα cookies να ενεργοποιηθούν --cookies=on ή και να απενεργοποιηθούν --cookies=off.&lt;br /&gt;&lt;br /&gt;Βιβλιογραφία&lt;br /&gt;&lt;br /&gt;Manual pages: wget&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-8083353236398166763?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/8083353236398166763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/o-wget.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/8083353236398166763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/8083353236398166763'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/o-wget.html' title='Oδηγός wget'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-1685385254284105274</id><published>2008-08-13T08:43:00.000-07:00</published><updated>2008-08-13T14:27:43.814-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Oδηγός script</title><content type='html'>&lt;strong&gt;Script&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Πολλές φορές όταν δουλεύουμε από τη γραμμή εντολών δινουμε διαφορες εντολές οι οποίες είτε τερματίζουν χωρίς σφάλμα ή επιστρέφουν σφάλμα. Όταν εχουμε ανοιχτή τη γραμμή εντολών μπορούμε να δούμε τα αποτελεσματα τους, αλλά όταν την κλείσουμε το μόνο που μένει είναι το history. Είναι επομένως δύσκολο να δούμε εκ των υστερων τι κάναμε, τι πήγε στραβα ή πως μπορούμε να αναπάραγουμε ή να διορθώσουμε το λάθος.&lt;br /&gt;&lt;br /&gt;Γι'αυτές τις περιπτώσεις είναι χρήσιμη η εντολή script. Πληκτρολογώντας απλώς script οι εντολές καθως και τα αποτελέσματα όλων των εντολών απο δω και μετά θα αποθηκεύονται και σε ένα αρχείο που δημιουργειται στον τρέχων φάκελο. Για παράδειγμα σε εμένα το αποτελεσμα της script είναι:&lt;br /&gt;&lt;br /&gt;Script started, output file is typescript&lt;br /&gt;&lt;br /&gt;και ό,τι βλέπουμε στην οθονη αποθηκευεται και στο αρχείο typescript. H επιλογή -a προσθέτει τα αποτελεσματα σε ένα υπάρχον αρχείο χωρις να το διαγραφει το προηγούμενο. Μπορούμε να βγούμε από το περιβάλλον της εντολής script με ctrl+D, σταματώντας έτσι την αποθήκευση των εντολών και των αποτελεσματων τους στο αρχείο.&lt;br /&gt;&lt;br /&gt;Για περισσότερες επιλογές δες man script&lt;br /&gt;&lt;br /&gt;Το αρχείο μπορούμε να το μετονομάσουμε μετα και να το αρχειοθετησουμε. Με αυτόν τον τρόπο μπορουμε να έχουμε γρήγορα ένα βήμα προς βήμα οδηγό για το τι καναμε την τελευταία φορά που προσπαθήσαμε να εγκαταστήσουμε τους οδηγους της καρτας γραφικών ή οτιδήποτε άλλο καναμε από τη γραμμή εντολών.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-1685385254284105274?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/1685385254284105274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/script.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/1685385254284105274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/1685385254284105274'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/script.html' title='Oδηγός script'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-5837328213237656595</id><published>2008-08-13T08:40:00.000-07:00</published><updated>2008-08-13T14:30:09.974-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Οδηγός μεταγλώττισης πηγαίου κώδικα</title><content type='html'>&lt;strong&gt;Make&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;1. Εισαγωγή&lt;br /&gt;&lt;br /&gt;Oι υπολογιστές αυτό που κάνουν δεν είναι τίποτε άλλο από πρόσθεση, πολλαπλασιασμός και αποθήκευση και μεταφορά δεδομένων. Αυτό επιτυγχάνεται με ηλεκτρονικά κυκλώματα, τα οποία ανάλογα με την είσοδο που δέχονται επιτρέπουν ή όχι τη διέλευση του ρεύματος. Οι καταστάσεις αυτές μπορούν να αναπαρασταθούν στο δυαδικό συστημα ως 0 "δεν παιρνά ρεύμα" ή 1 "παιρνά ρεύμα". Οι οδηγίες ή εντολές που καταλαβαίνει δηλαδή ο υπολογιστής είναι γραμμένες σε γλώσσα μηχανής (machine code). Κώδικας μηχανής ή γλώσσα μηχανής είναι ένα σύστημα οδηγιών και δεδομένων που μπορούν να εκτελεσθούν απ'ευθείας από την κεντρική μοναδα επεξεργασίας του υπολογιστή. Η γλώσσα μηχανής είναι συνήθως δύσκολη στο χειρισμό από τον άνθρωπο, αν και στις πρώτες μέρες των υπολογιστών ήταν αρκετά απλά. Γι'αυτό το λόγο δημιουργήθηκε μια άλλη γλώσσα, η assembly, πιο προσιτή στον άνθρωπο. Η assembly είναι μια χαμηλού επιπέδου γλώσσα για τον προγραμματισμό υπολογιστών. Aν και χρησιμοποιείται ακόμη και σήμερα σε κάποιες εφαρμογές, όπως μικροεπεξεργαστές ή plc, είναι αρκετά δύσχρηστη. Γι'αυτό αναπτύχθηκαν υψηλότερου επιπέδου γλώσσες κατανοητές στον άνθρωπο. Οι γλώσσες προγραμματισμού μπορούν να χωριστούν σε δύο κατηγορίες, compiled και interpreted, ανάλογα με το αν μετατρέπουν τον πηγαίο κώδικα σε κώδικα μηχανής ή αν τον εκτελούν βήμα-βήμα. Μερικά παραδείγματα compiled γλωσσών προγραμματισμού είναι fortran, C, C++, ada, algol, cobol, delphi, pascal. Παραδείγματα interpreted γλωσσών προγραμματισμού, γνωστές και ως scripting γλώσσες, αποτελούν python, java, tcl, ruby. Στον παρών οδηγό θα ασχοληθούμε με τη μεταγλώττιση προγραμμάτων γραμμένα κυρίως σε C, και σε κάποιες περιπτώσεις fortran.&lt;br /&gt;&lt;br /&gt;Για τη μεταγλώττιση προγραμμάτων είναι απαραίτητα, εκτός του μεταγλωττιστή, κάποια εργαλεία που διευκολύνουν και αυτοματοποιούν τη διαδικασία. Στο debian (και σε παράγωγά του όπως το ubuntu) η εγκατάσταση των απαραίτητων προγραμμάτων, αν και είναι πολύ πιθανόν να είναι ήδη εγκατεστημένα, γίνεται ως εξής:&lt;br /&gt;&lt;br /&gt;sudo apt-get install gcc&lt;br /&gt;sudo apt-get install make&lt;br /&gt;&lt;br /&gt;Για τους χρήστες FORTRAN το απαραίτητο πακέτο μπορεί να εγκατασταθεί:&lt;br /&gt;&lt;br /&gt;sudo apt-get install gfortran&lt;br /&gt;&lt;br /&gt;Mια άλλη δυνατότητα περιλαμβάνει τη χρήση του μεταγλωττιστή g95, ο οποίος πρέπει να εγκατασταθεί χειροκίνητα. Τα υπόλοιπα εργαλεία, ld, ar, nm, που θα χρειασθούν είναι εγκατεστημένα σε κάθε σύστημα linux. Σε διαφορετική περίπτωση μπορούν να εγκατασταθούν επίσης απλά με τη χρήση της εντολής apt-get, όπως παραπάνω. Άλλες διανομές έχουν διαφορετικό τρόπο εγκατάστασης των πακέτων, όπως το rpm της Red Hat, oι οποίοι δεν πρόκειται να συζητηθούν εδώ.&lt;br /&gt;&lt;br /&gt;2. Ο μεταγλωττιστής gcc&lt;br /&gt;&lt;br /&gt;Ο μεταγλωττιστής gcc (GNU Compiler Collection, παλιότερα γνωστός ως GNU C Compiler) είναι ένα πρόγραμμα για τη μεταγλώττιση πηγαίου κώδικα σε γλώσσα μηχανής γραμμένου στις γλώσσες C, C++, ή Objective-C (αντικειμενική-C). Ο gcc μεταγλωττίζει ένα ή περισσότερα αρχεία πηγαίου κώδικα, για παράδειγμα πηγαία αρχεία C (file.c),  πηγαία αρχεία assemply (file.s) ή προεπεξεργασμένα  πηγαία αρχεία C (file.i). Aν η κατάληξη του αρχείου δεν αναγνωρισθεί τότε θεωρείται ως αντικειμενικό αρχείο (object) ή βιβλιοθήκη. Ο gcc καλεί συνήθως έναν προεπεξεργαστή (preprocessor), μεταγλωττίζει τον προεπεξεργασμένο κώδικα σε γλώσσα assembly, τον συναρμολεί και μετά το συνδέει με το linker. H διαδικασία μπορεί να διακοπεί σε ένα από τα προηγούμενα στάδια χρησιμοποιώντας τις επιλογές -c, -S, ή -E. Τα βήματα μπορεί επίσης να διαφέρουν ανάλογα με τη γλώσσα που χρησιμοποιείται. Ως προεπιλογή η έξοδος αποθηκεύεται στο αρχειό a.out. Σε μερικές περιπτώσεις ο gcc δημιουργεί ένα αντικειμενικό αρχειό έχοντας την κατάληξη .o και το αντίστοιχο βασικό όνομα.&lt;br /&gt;&lt;br /&gt;Οι επιλογές του προεπεξεργαστή και του linker που δίνονται στη γραμμη εντολών του gcc, μεταβιβάζονται σε αυτά τα εργαλεία όταν εκτελούνται. Στον παρών οδηγό θα σχολιασθούν μόνο οι βασικές επιλογές του gcc, ενώ για μια πλήρη αναφορά μπορείτε να ανατρέξετε στις σελίδες εγχειριδίου (man pages).&lt;br /&gt;&lt;br /&gt;Ας ξεκινήσουμε όμως από ένα απλό παράδειγμα. Το αρχείο hallo.c περιλαμβάνει τα εξής:&lt;br /&gt;&lt;br /&gt;/* hallo.c */&lt;br /&gt;int main(){&lt;br /&gt;  printf("Hallo world\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;H εντολή&lt;br /&gt;&lt;br /&gt;gcc hallo.c&lt;br /&gt;&lt;br /&gt;δέχεται ως αρχείο εισόδου το hallo.c, το μεταγλωτίζει και χωρίς να αποθηκεύει το ενδιάμεσο αντικείμενο, δημιουργεί το εκτελέσιμο με το προεπιλεγμένο όνομα a.out.&lt;br /&gt;&lt;br /&gt;H περιφραστική εκδοχή της παραπάνω εντολής θα ήταν:&lt;br /&gt;&lt;br /&gt;gcc -c hallo.c&lt;br /&gt;gcc -o a.out hallo.c&lt;br /&gt;&lt;br /&gt;Η επιλογή -c δηλώνει μεταγλώττιση (compile), ενώ η -ο (οutput) δηλώνει το αρχείο εξόδου. Στην περιφραστική εκδοχή αποθηκεύεται και το ενδιάμεσο αντικείμενο hallo.o.&lt;br /&gt;&lt;br /&gt;Αν υποθέσουμε ότι το αρχείο hallo.c περιέχει πολλούς βρόγχους (loops) τον ένα μέσα στον άλλο για τον υπολογισμό πινάκων. Τότε αυτό θα κάνει το πρόγραμμα αρκετά αργό. Σε τέτοιες περιπτώσεις είναι απαραίτητη η χρήση της επιλογής βελτιστοποίησης -Ο όπως στο παρακάτω παράδειγμα:&lt;br /&gt;&lt;br /&gt;gcc -c -O3 hallo.c&lt;br /&gt;&lt;br /&gt;όπου το επίπεδο βελτιστοποίησης τίθεται στο μέγιστο. Υπάρχει περίπτωση, μόνο αν ο κώδικάς σας δεν είναι γραμμένος καθαρα, η έκδοση με βελτιστοποίηση και αυτή χωρίς βελτιστοποίηση να διαφέρουν ως προς τα αποτελέσματα. Αυτό  συμβαίνει γιατί η βελτιστοποίηση που εφαρμόζεται τροποποιεί ουσιαστικά τον κώδικα. Το τι σημαίνει "καθαρά" δε θα το σχολιάσουμε εδώ, αλλά μπορείτε να ανατρέξετε σε διάφορα βιβλία προγραμματισμού.&lt;br /&gt;&lt;br /&gt;Οι επιλογές προεπεξεργαστή μπορεί να χρησιμοποιηθεί για προγράμματα που πρέπει να λειτουργούν σε διάφορες αρχιτεκτονικές με διαφορετικές  τιμές σε μια μεταβλητή. Ας θεωρήσουμε ότι έχουμε σε ένα πρόγραμμα την επιλογή 32-bit ή 64-bit, και ότι σε καθε περίπτωση πρέπει να συμβεί κάτι διαφορετικό. Αυτό δε συμαίνει ότι πρέπει να έχουμε και δύο εκδόσεις του προγράμματος. Μπορεί εύκολα να λυθεί με την επιλογή -D όπως στο παρακάτω παράδειγμα:&lt;br /&gt;&lt;br /&gt;int main(){&lt;br /&gt;  if (BIT==32){&lt;br /&gt;      printf("%i\n", BIT);&lt;br /&gt;      }&lt;br /&gt;  else if (BIT==64){ &lt;br /&gt;      printf("%i\n",BIT);&lt;br /&gt;      }&lt;br /&gt;  else {&lt;br /&gt;      printf("%i\n",BIT);&lt;br /&gt;      }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;To οποίο μεταγλωττίζεται με μία από τις επιλογές:&lt;br /&gt;&lt;br /&gt;gcc -DBIT hallo.c&lt;br /&gt;&lt;br /&gt;gcc -DBIT=32 hallo.c&lt;br /&gt;&lt;br /&gt;gcc -DBIT=64 hallo.c&lt;br /&gt;&lt;br /&gt;Aς υποθέσουμε τώρα το αρχειό mylib.h βρίσκεται στο φάκελο ~/include και ότι θέλουμε να το συμπεριλάβουμε στον κώδικά μας με την εντολή #include "mylib.h". Αυτό θα το κάναμε με την επιλογή -Ι κατά τη μεταγλώττιση, ή οποία δεχεται τόσο σχετική όσο και απόλυτη διαδρομή.&lt;br /&gt;&lt;br /&gt;gcc -l~/include hallo.c&lt;br /&gt;&lt;br /&gt;Η χρήση μιας βιβλιοθήκης, πχ. libast.a, η οποία βρίσκεται στο φάκελο ~/lib γίνεται με τις παρακάτω επιλογές:&lt;br /&gt;&lt;br /&gt;gcc -L~/lib -last hallo.c&lt;br /&gt;&lt;br /&gt;Πρέπει να σημειωθεί ότι η βιβλιοθήκη libast.a με το εργαλείο ar, που θα παρουσιαστεί παρακάτω.&lt;br /&gt;&lt;br /&gt;Γενικές επιλογές (κατά αλφαβητική σειρά)&lt;br /&gt;&lt;br /&gt;-ansi&lt;br /&gt;  Eπιβάλει πλήρη συμβατότητα με το πρότυπο ANSI.&lt;br /&gt;-c    Δημιουργία ενός συνδέσιμου αρχείου αντικειμένου για κάθε αρχείο πηγαίου κώδικα, αλλά χωρίς κλήση του linker.&lt;br /&gt;-E    Προεπεξεργάζεται τα πηγαία αρχεία αλλά δεν τα μεταγλωττίζει. Τυπώνει τα αποτελέσματα στην τυπική έξοδο. Αυτή η επιλογή είναι χρήσιμη για τη μεταβίβαση μερικών επιλογών cpp (C PreProcessor) που διαφορετικά θα σταματούσαν το gcc όπως η -C, -M, ή -P.&lt;br /&gt;-g    Συμπεριλαμβάνει πληροφορίες αποσφαλμάτωσης (debugging) για χρήση με το gdb.&lt;br /&gt;-glevel&lt;br /&gt;  Παρέχει πληροφορίες για την αποσφαλμάτωση. level πρέπει να είναι 1, 2, ή 3, με το 1 να παρέχει το ελάχιστο πλήθος πληροφοριών. Η προεπιλογή είναι το 2.&lt;br /&gt;--help&lt;br /&gt;  Τυπώνει τις συνηθέστερες βασικές επιλόγες και τερματίζει.&lt;br /&gt;-o file&lt;br /&gt;  Ορίζει το αρχείο εξόδου ως file. Προεπιλεγμένο είναι το a.out.&lt;br /&gt;-O[level]&lt;br /&gt;  Βελτιστοποίηση. level πρέπει να είναι 1, 2, 3, ή 0 (προεπιλεγμένο είναι το 1). Το 0 απενεργοποιεί τη βελτιστοποίηση.&lt;br /&gt;-p    Παρέχει πληροφορίες προφιλ για χρήση με prof.&lt;br /&gt;-pedantic&lt;br /&gt;  Προειδοποιεί αμετροεπώς.&lt;br /&gt;-pg    Παρέχει πληροφορίες προφιλ για χρήση με gprof.&lt;br /&gt;-std=standard&lt;br /&gt;  Kαθορίζει το πρότυπο της C του αρχείου εισόδου. Αποδεκτές τιμές είναι:&lt;br /&gt;      iso9899:1990, c89    1990 ISO C πρότυπο.&lt;br /&gt;      iso9899:199409    1994 προσθήκη στο 1990 ISO C πρότυπο.&lt;br /&gt;      iso9899:1999, c99    1999 ISO C αναθεωρημένο πρότυπο.&lt;br /&gt;      iso9899:1999, c9x&lt;br /&gt;      gnu89            1990 C πρότυπο με GNU επεκτάσεις (η προεπιλεγμένη τιμή).&lt;br /&gt;      gnu99, gnu9x        1999 αναθεωρημένο ISO C πρότυπο με GNU επεκτάσεις.&lt;br /&gt;&lt;br /&gt;-s    Μεταγλωττίζει τα πηγαία αρχεία σε κώδικα assembly, αλλά δεν τα συναρμολογεί.&lt;br /&gt;-v    Tυπώνει πληροφορίες έκδοσης.&lt;br /&gt;-V version&lt;br /&gt;  Προσπαθεί να εκτελέσει την gcc έκδοση version.&lt;br /&gt;-w    Aποσιωπεί τις προειδοποιήσεις.&lt;br /&gt;-W    Προειδοποιεί πιο αμετροεπώς από το κανονικό.&lt;br /&gt;-Wall&lt;br /&gt;  Ενεργοποιεί όλες τις πιθανές προειδοποιήσεις.&lt;br /&gt;-x language&lt;br /&gt;  Περιμένει το αρχείο εισόδου να είναι γραμμένο στη γλώσσα language, που μπορεί να είναι c, objective-c, c-header, c++, ada, f77, ratfor, assembler, java, cpp-output, c++-cpp-ouput, objc-cpp-output, f77-cpp-output, assembler-with-cpp, ή ada. Αν δεν ορισθεί τίποτε τότε μαντεύει τη γλώσσα από την κατάληξη του αρχείου.&lt;br /&gt;&lt;br /&gt;Επιλογές προεπεξεργαστή&lt;br /&gt;&lt;br /&gt;Ο gcc μεταβιβάζει τις παρακάτω επιλογές στον προεπεξεργαστή:&lt;br /&gt;&lt;br /&gt;-Dname[=def]&lt;br /&gt;  Οριζει το name με την τιμή def σαν να είχε οριστεί ως #define. Αν δε δοθεί =def, τότε το name ο=ρίζεται με την τιμή 1. -D έχει χαμηλότερη προτεραιότητα από -U.&lt;br /&gt;-Idir&lt;br /&gt;  Περιλαμβάνει το dir στη λίστα με τους φακέλους για να ψαξει για αρχεία που πρέπει να συμπεριληφθούν.&lt;br /&gt;-Uname&lt;br /&gt;  Aπομακρύνει τον ορισμό το συμβόλου name.&lt;br /&gt;&lt;br /&gt;Eπιλογές linker&lt;br /&gt;&lt;br /&gt;Ο gcc μεταβιβάζει τις παρακάτω επιλογές στο linker:&lt;br /&gt;&lt;br /&gt;-llib&lt;br /&gt;  Συνδέει στη βιβλιοθήκη lib.&lt;br /&gt;-Ldir&lt;br /&gt;  Ψάχνει στο dir εκτός από προεπιλεγμένους φακέλους για βιβλιοθήκες.&lt;br /&gt;-u symbol&lt;br /&gt;  Αναγκάζει το linker να ψάξει στις βιβλιοθηκες για τον ορισμό του symbol, και να συνδέσει στις βιβλιοθήκες που βρήκε.&lt;br /&gt;&lt;br /&gt;3. Εργαλεία&lt;br /&gt;&lt;br /&gt;3.1 Η εντολή: ld&lt;br /&gt;&lt;br /&gt;Το πρόγραμμα ld συνδέει (link) διαφορα αντικειμενα, στη δοσμένη σειρά, σε ένα εκτελέσιμο αντικείμενο (προεπιλογή a.out). Συνήθως εκτελείται αυτόματα από τις εντολές μεταγλώττισης όπως η gcc. Η βασική σύνταξη της εντολής είναι:&lt;br /&gt;&lt;br /&gt;ld [options] objfiles&lt;br /&gt;&lt;br /&gt;Eπιλογές&lt;br /&gt;&lt;br /&gt;-Ldir&lt;br /&gt;  Ψάχνει στο dir εκτός από προεπιλεγμένους φακέλους για βιβλιοθήκες.&lt;br /&gt;-o file&lt;br /&gt;  Ορίζει το αρχείο εξόδου ως file. Προεπιλεγμένο είναι το a.out.&lt;br /&gt;&lt;br /&gt;Για παράδειγμα:&lt;br /&gt;&lt;br /&gt;ld -o myexe file1.o file2.o file3.o&lt;br /&gt;&lt;br /&gt;δημιουργεί το εκτελέσιμο myexe από τα αντικείμενα file1.o file2.o file3.o.&lt;br /&gt;&lt;br /&gt;3.2 H εντολή: ar&lt;br /&gt;&lt;br /&gt;Χρησιμοποιείται συνήθως για τη δημιούργια βιβλιοθηκών. Η βασική σύνταξη της εντολής είναι:&lt;br /&gt;&lt;br /&gt;ar key [args] [posname] [count] archive [files]&lt;br /&gt;&lt;br /&gt;Key&lt;br /&gt;&lt;br /&gt;d    Διαγραφή των files από το archive.&lt;br /&gt;m    Μετακίνηση των files στο τέλος του archive.&lt;br /&gt;p    Τυπώνει τα files του archive.&lt;br /&gt;q    Προσθέτει τα files στο τέλος του archive.&lt;br /&gt;r    Αντικαθιστά τα files στο archive.&lt;br /&gt;t    Δείχνει τα περιεχομενα του archive ή τα αναφερθέντα files.&lt;br /&gt;x    Εξάγει τα περιεχόμενα από το archive ή μόνο τα αναφερθέντα files.&lt;br /&gt;&lt;br /&gt;Συνήθη ορίσματα&lt;br /&gt;&lt;br /&gt;a    Χρηση με r ή m για τοποθέτηση των files στο archive μετά το posname.&lt;br /&gt;b    Όπως το a αλλά πρίν το posname.&lt;br /&gt;c    Δημιουργία archive "σιωπηλά"&lt;br /&gt;i    Όπως το b.&lt;br /&gt;u    Χρήση με το r για την αντικατάσταση μόνο των files που άλλαξαν από την τελευταία φορά που προστέθηκαν στο archive.&lt;br /&gt;&lt;br /&gt;Για παράδειγμα η εντολή&lt;br /&gt;&lt;br /&gt;ar cr libast.a *.o&lt;br /&gt;&lt;br /&gt;θα δημιουργήσει μια βιβλιοθηκή με το όνομα libast από όλα τα αρχεία .ο που βρίσκονται στο φάκελο. Αν κάποιο όνομα αρχείο υπάρχει ήδη στη βιβλιοθηκη τοτε θα αντικατασταθεί.&lt;br /&gt;&lt;br /&gt;3.3 H εντολή: nm&lt;br /&gt;&lt;br /&gt;Με αυτή την εντολή μπορούν να τυπωθούν τα ονόματα των συναρτήσεων που χρησιμοποιούνται στο αντικείμενο. Τα ονόματα τυπώνονται όχι όπως  φαίνονται στον πηγαίο κώδικα αλλά με underscores και άλλες λεπτομέρεις που εξαρτώνται από το μεταγλωττιστή. Η εντολή nm είναι πολύ χρήσιμη κατά την αποσφαλμάτωση προγραμμάτων που είναι γραμμένα σε ανάμικτες γλώσσες προγραμματισμού. Η βασική σύνταξη της εντολής είναι:&lt;br /&gt;&lt;br /&gt;nm [options] objfiles&lt;br /&gt;&lt;br /&gt;Για παράδειγμα το αρχειό hallo.o του πρώτου παραδειγματος στο λειτουργικό mac os x (powerpc) θα δώσει:&lt;br /&gt;&lt;br /&gt;00000000 T _main&lt;br /&gt;       U _printf&lt;br /&gt;       U dyld_stub_binding_helper&lt;br /&gt;&lt;br /&gt;4. make&lt;br /&gt;&lt;br /&gt;Το make είναι ένα εργαλείο για την αυτόματη δημιουργία προγραμμάτων. Το προεπιλεγμένο αρχείο εισόδου είναι το Makefile, οπότε με την εκτέλεση της εντολής make θα ψάξει το πρόγραμμα για το αρχείο Makefile και αν δε το βρει θα βγάλει μήνυμα λάθους. Ένα απλό Makefile περιλαμβάνει τα εξής:&lt;br /&gt;&lt;br /&gt;# Αυτό είναι σχόλιο&lt;br /&gt;COM=myexe&lt;br /&gt;OBJ=file1.o file2.o file3.o&lt;br /&gt;LDR=gcc&lt;br /&gt;&lt;br /&gt;$(COM): $(OBJ)&lt;br /&gt;  $(LDR) -o $(COM) $(OBJ)&lt;br /&gt;# Τα κενά στην αρχή της παραπάνω γραμμής είναι σημαντικό να είναι tab.&lt;br /&gt;&lt;br /&gt;clean:&lt;br /&gt;  rm $(OBJ)&lt;br /&gt;# Ομοίως το κενό πρέπει να είναι tab.&lt;br /&gt;&lt;br /&gt;Στα Makefiles υπάρχει η "παραξενιά" να χρησιμοποιείται το tab. Πρέπει απλώς κανείς να το συνηθισει. Αλλά ας πάρουμε το αρχείο από την αρχή. COM=myexe δινει στη μεταβλητή COM την τιμή myexe, η οποία θα είναι το όνομα του εκτελέσιμου. OBJ=file1.o file2.o file3.o λέει στο make ότι τα αντικείμενα που χρειάζονται είναι τα file1.o file2.o file3.o. LDR=gcc ορίζει το πρόγραμμα που θα συνδέσει τα αντικείμενα, θα μπορούσε να ήταν και το ld.&lt;br /&gt;&lt;br /&gt;H επόμενη γραμμή λέει ότι το εκτελέσιμο $(COM) εξαρτάται από τα αντικείμενα $(OBJ). Για να δημιουργηθεί δηλαδή το αρχείο myexe πρέπει πρώτα να δημιουργηθούν τα εξαρτόμενα αντικείμενα. Ας υποθέσουμε τώρα ότι τα file1.c και file2.c είναι αρχεία C, ενώ το file3.f είναι αρχείο fortran. Aυτό δε φαίνεται πουθενά στο Makefile, παρόλ' αυτά το make θα καλέσει τους κατάλληλους μεταγλωττιστές, κι αν δεν υπάρχουν θα βγάλει μήνυμα λάθους. Aν πληκτρολογήσουμε make, θα προσπαθήσει να εκτελέσει τις εντολές:&lt;br /&gt;&lt;br /&gt;gcc -c file1.c&lt;br /&gt;gcc -c file2.c&lt;br /&gt;g77 -c file3.f&lt;br /&gt;&lt;br /&gt;Έπειτα θα τα συνδέσει με την εντολή&lt;br /&gt;&lt;br /&gt;gcc -o myexe file1.o file2.o file3.o&lt;br /&gt;&lt;br /&gt;Tελος η εντολή rm $(OBJ) δε θα εκτελεσθεί. Αυτό συμβαίνει γιατί υπάρχουν στο συγκεκριμενο αρχείο 2 στόχοι (targets), ο $(COM) και ο clean. Aν κατα την εκτέλεση της εντολής δε εχουμε δώσει κάποιο στόχο τότε ο προεπιλεγμένος είναι ο ανώτερος, δηλαδή σε αυτή την περίπτωση ο $(COM). Αν πληκτρολογήσουμε&lt;br /&gt;&lt;br /&gt;make clean&lt;br /&gt;&lt;br /&gt;τότε θα πάει στη γραμμή&lt;br /&gt;&lt;br /&gt;clean:&lt;br /&gt;&lt;br /&gt;όπου δε θα δει καμία εξάρτηση και μετά θα εκτελέσει την εντολή rm $(OBJ).&lt;br /&gt;&lt;br /&gt;Όλες οι παραπάνω εντολές και επιλόγες των εντολών που παρουσιασθηκαν παραπάνω, μπορούν με μεγάλη ευκολία να χρησιμοποιηθούν σε ένα Makefile.&lt;br /&gt;&lt;br /&gt;5. Επίλογος&lt;br /&gt;&lt;br /&gt;Στο μέλλον προβλέπεται αναλυτική περιγραφή του εργαλείου make, τον αποσφαλματωτη gdb καθώς και των άλλων εργαλείων που είναι χρήσιμα για την εγκατάσταση προγραμμάτων κατευθείαν από τον πηγαίο κώδικα.&lt;br /&gt;&lt;br /&gt;6. Βιβλιογραφία&lt;br /&gt;&lt;br /&gt;Herold, Helmut (2003), make - Das Profitool zur automatischen Generierung von Programmen, Addison-Wesley.&lt;br /&gt;&lt;br /&gt;Robbins, Arnold (2005), UNIX in a nutshell, O' Reilly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-5837328213237656595?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/5837328213237656595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5837328213237656595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/5837328213237656595'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/blog-post.html' title='Οδηγός μεταγλώττισης πηγαίου κώδικα'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-347191732171091753.post-945774516432398170</id><published>2008-08-13T08:17:00.000-07:00</published><updated>2008-08-13T11:21:01.340-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unclassified'/><title type='text'>Καλώς ήρθατε, welcome, willkommen</title><content type='html'>To θέμα αυτού του blog είναι όπως λέει και ο τίτλος το &lt;a href="http://www.linux.org/"&gt;linux&lt;/a&gt;. Ίσως να μην έχει καμία σχέση με την &lt;a href="http://en.wikipedia.org/wiki/Quantum_mechanics"&gt;κβαντομηχανική&lt;/a&gt; αλλά με τη λειτουργία του linux έχει. Ίσως στο μέλλον να ασχοληθεί και με την κβαντομηχανική, αλλά στο παρόν θα επιμείνουμε στην κλασσική μηχανική. Άλλωστε οι &lt;a href="http://en.wikipedia.org/wiki/Quantum_computer"&gt;κβαντικοί υπολογιστές&lt;/a&gt; θα γίνουν στο μέλλον σίγουρα πραγματικότητα.&lt;br /&gt;&lt;br /&gt;Καλή ανάγνωση!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/347191732171091753-945774516432398170?l=quantum-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://quantum-linux.blogspot.com/feeds/945774516432398170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/welcome-willkommen.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/945774516432398170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/347191732171091753/posts/default/945774516432398170'/><link rel='alternate' type='text/html' href='http://quantum-linux.blogspot.com/2008/08/welcome-willkommen.html' title='Καλώς ήρθατε, welcome, willkommen'/><author><name>Dimitris</name><uri>http://www.blogger.com/profile/02669653311290292722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
