﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GreekTuts &#187; Προγραμματισμός</title>
	<atom:link href="http://greektuts.net/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://greektuts.net</link>
	<description>Ελληνικά Βοηθήματα</description>
	<lastBuildDate>Thu, 22 Jul 2010 19:56:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<image>
  <link>http://greektuts.net</link>
  <url>http://www.greektuts.net/images/favicon4.ico</url>
  <title>GreekTuts</title>
</image>
		<item>
		<title>CSS SuperHero : Βασικές Αρχές</title>
		<link>http://greektuts.net/css-superhero-basic-principles/</link>
		<comments>http://greektuts.net/css-superhero-basic-principles/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 15:54:15 +0000</pubDate>
		<dc:creator>Pantso</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[basic]]></category>
		<category><![CDATA[basic principles]]></category>
		<category><![CDATA[cascading]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[css principles]]></category>
		<category><![CDATA[css superhero]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[hero]]></category>
		<category><![CDATA[id]]></category>
		<category><![CDATA[pantso]]></category>
		<category><![CDATA[paragraph]]></category>
		<category><![CDATA[super]]></category>
		<category><![CDATA[superhero]]></category>
		<category><![CDATA[βασικές αρχές]]></category>
		<category><![CDATA[βασικές αρχές των css]]></category>
		<category><![CDATA[γρηγορόπουλος παναγιώτης]]></category>

		<guid isPermaLink="false">http://greektuts.net/?p=4029</guid>
		<description><![CDATA[Σε αυτό το πρώτο μέρος της σειράς βοηθημάτων, που θα σας μετατρέψει από αρχάριο, σε CSS Super Hero, θα κάνουμε τα πρώτα μας βήματα στον μαγευτικό κόσμο των CSS και θα φτάσουμε να γνωρίζουμε ότι χρειάζεται για να τα χρησιμοιποιήσουμε στις ιστοσελίδες μας αλλά ακόμα και επαγγελματικά.]]></description>
			<content:encoded><![CDATA[<h1>Τι είναι τα CSS;</h1>
<p>CSS σημαίνει Cascading Style Sheets. Και τι σημαίνει αυτό; Ας το πάρουμε από την αρχή.</p>
<p>Η γνωστή σε όλους μας γλώσσα προγραμματισμού ιστοσελίδων και εφαρμογών, η HTML, χρησιμοποιείται για την δημιουργία και την περιγραφή στοιχείων σε μια ιστοσελίδα. Όταν λοιπόν εμείς διαβάζουμε ένα κείμενο, όπως αυτό που διαβάζεται αυτήν την στιγμή, o browser μας, δεν το &#8220;διαβάζει&#8221; όπως και εμείς. Συνήθως τα κείμενα που βρίσκονται σε μια ιστοσελίδα, είναι περιτρυγυρισμέμα σε <strong>paragraph tags</strong>. Τα Tags είναι ο τρόπος που χρησιμοποιείται για να περιγράψουμε αντικείμενα. Έτσι, ότι βρίσκεται ανάμεσα σε tags, παίρνει και τις αντίστοιχες ιδιότητες.</p>
<p>Αν λοιπόν το κείμενο &#8220;<strong>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</strong>&#8221; το γράψουμε <strong>&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;/p&gt;</strong>, αυτό θα πάρει τις ιδιότητες της παραγράφου, ενώ αν το γράψουμε <strong>&lt;b&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;/b&gt;</strong> θα γίνει bold.</p>
<p>Ωραία ως εδώ. Τι γίνεται όμως όταν θέλουμε αυτό το κείμενο να έχει μεγαλύτερο μέγεθος από κάποιο άλλο στοιχείο paragraph στην ιστοσελίδα μας; H ακόμα χειρότερα άμα θέλουμε να έχουμε 8 διαφορετικά είδη παραγράφων και τίτλων; Εδώ έρχονται και συμπληρώνουν τα CSS. Μέσα από τους selectors (επιλογέας) μπορούμε να &#8220;στοχεύσουμε &#8221; στοιχεία στην HTML σελίδα, και να τους δώσουμε στυλ.</p>
<h1>Σύνταξη &#8211; Δομή</h1>
<p>Για να στοχεύσουμε λοιπόν τα διάφορα στοιχεία στην σελίδα μας, πρέπει να γνωρίζουμε την δομή και την σύνταξη μιας CSS εντολής. Ας δούμε καλύτερα σε ένα γράφιμα</p>
<blockquote>
<p style="text-align: center;"><img class="size-full wp-image-4095 aligncenter" src="http://greektuts.net/wp-content/uploads3/2010/07/css-basic-principles1.jpg" alt="" width="571" height="131" /></p>
</blockquote>
<p>Το παραπάνω παράδειγμα, &#8220;στοχεύει&#8221; όλα τα στοιχεία H1 στην ιστοσελίδα μας. H1 είναι ο μεγαλύτερος σε μέγεθος τίτλος σε ένα κείμενο. Αρχίζοντας λοιπόν, σαν selector, χρησιμοποιούμε το όνομα του tag που θέλουμε να αλλάξουμε. Αφήνουμε ένα κενό, και  ανοίγουμε αγκύλες. Ότι περιέχεται μέσα στις αγκύλες είναι η δήλωση μας . Χρησιμοποιόντας την ιδιότητα (property) <strong>color</strong> στοχεύουμε το χρώμα του κειμένου. Αμέσως μετά την ιδιότητα βάζουμε άνω και κάτω τελείες και δίνουμε την τιμή μας. Για να κλείσουμε την πρώτη δήλωση, χρησιμοποιούμε το ελληνικό ερωτηματικό (semicolon). Στην δεύτερη δήλωση, χρησιμοποιούμε την ιδιότητα <strong>font-size</strong>, η οποία αλλάζει το μέγεθος του κειμένου. Βάζουμε άνω και κάτω τελείες και δίνουμε την τιμή που θέλουμε να έχει σε pixels. Κλείνουμε με ελληνικό ερωτηματικό, και με την ανάποδη αγκύλη.</p>
<p>Χρησιμοποιόντας λοιπόν τα CSS μπορούμε να επιλέξουμε όλα τα στοιχεία της ιστοσελίδας μας, και να τους δώσουμε ζωή. Δείτε τον κώδικα ζωντανά μέσω του w3scholls.com χρησιμοποιόντας τον σύνδεσμο που ακολουθεί</p>
<p style="text-align: center;"><a title="Δοκιμάστε τον κώδικα" href="http://www.w3schools.com/css/tryit.asp?filename=trycss_syntax1" target="_blank"><img class="size-full wp-image-4097 aligncenter" src="http://greektuts.net/wp-content/uploads3/2010/07/tryitoutbtn.png" alt="" width="450" height="24" /></a></p>
<h1>Id και Class</h1>
<p>Επειδή τα tags της HTML είναι περιορισμένα, τα CSS μας δίνουν την δυνατότητα να δηλώσουμε τα δικά μας μοναδικά ή μη στοιχεία, και να τους δώσουμε στύλ. Αυτό το κάνουμε χρησιμοποιόντας μέσα στα division tags της HTML (τα γνωστά divs) , ID και CLASS. Πως το κάνουμε αυτό; Ας δούμε ένα γράφιμα.</p>
<blockquote>
<p style="text-align: center;"><img class="size-full wp-image-4102 aligncenter" src="http://greektuts.net/wp-content/uploads3/2010/07/css-basic-principles2.jpg" alt="" width="580" height="600" /></p>
</blockquote>
<p>Στα παραπάνω παραδείγματα, βλέπουμε πως μπορούμε να &#8220;τυλίξουμε&#8221; την παράγραφο μας μέσα σε divs, και να επιλέξουμε ακριβώς αυτό που θέλουμε για να του δώσουμε στύλ. Στην πρώτη περίπτωση μπορεί να θέλουμε να βάλουμε το κείμενο στο κέντρο αλλά να μην θέλουμε το ίδιο για όλα τα &lt;p&gt; tags της σελίδας μας. Έτσι γράφουμε</p>
<pre name="code" class="css">
.test { color: black; text-align:center;}
</pre>
<p>Αυτό θα επιλέξει όλο το div και θα μετακινίσει το κείμενο του στο κέντρο, χωρίς να επιρεάσει άλλα paragraphs στην σελίδα.</p>
<p>Αν θέλουμε να επιλέξουμε την παράγραφο που υπάρχει μέσα στο div, γράφουμε</p>
<pre name="code" class="css">
.test p { color: black; text-align:left;}
</pre>
<p>Γενικότερα, όταν θέλουμε να επιλέξουμε στοιχεία μέσα σε divs, γράφουμε αναλυτικά όλο το &#8220;μονοπάτι&#8221; μέχρι να φτάσουμε σε αυτά. Ας δούμε για παράδειγμα το 3 κώδικα στο γράφιμα παραπάνω. Έχουμε ένα paragraph μέσα σε ένα div μέσα σε ένα id. Για να επιλέξουμε και να δώσουμε στυλ μόνο στην παράγραφο, γράφουμε</p>
<pre name="code" class="css">
#test .test p { color:white; }
</pre>
<p>Παρατηρήστε ότι έχουμε το ίδιο όνομα στο class και στο id μας. Αυτό δεν πειράζει καθόλου. Τα ID και τα Classes είναι διαφορετικά στοιχεία και έτσι επιτρέπεται να έχουν το ίδιο όνομα.</p>
<p><strong>ΠΡΟΣΟΧΗ</strong>: Το σωστό είναι όταν χρησιμοποιούμε ID να μην εμφανίζουμε το ίδιο στοιχείο πάνω από μια φορά στην σελίδα μας. Τα ID δηλώνουν μοναδικά στοιχεία. Το αντίθετο συμβαίνει με τα Classes. Μπουρούμε να έχουμε απεριόριστα αντίγραφα του class μέσα στην σελίδα μας.</p>
<p style="text-align: center;"><a title="Δοκιμάστε τον κώδικα" href="http://www.w3schools.com/css/tryit.asp?filename=trycss_syntax_id" target="_blank"><img class="size-full wp-image-4097 aligncenter" src="http://greektuts.net/wp-content/uploads3/2010/07/tryitoutbtn.png" alt="" width="450" height="24" /></a></p>
<h1>Cascading</h1>
<p>Και τι πάει να πεί Cascading; Είναι αναφορά στο φαινόμενο του καταράχτη, και ουσιαστικά δείχνει την κληρονομικότητα που έχουν τα στοιχεία των CSS. Και πως εφαρμόζεται αυτό;</p>
<p>Στο τρίτο παράδειγμα που γράψαμε παραπάνω, αν γράψουμε</p>
<pre name="code" class="css">
#test .test p { color:white; }
</pre>
<p>θα &#8220;στοχεύσουμε&#8221; την παράγραφο κατευθείαν, και θα της δώσουμε στύλ συγκεκριμένα. Αν όμως δώσουμε στύλ στο ID τι θα συμβεί;</p>
<pre name="code" class="css">
#test { color:white; }
</pre>
<p>Ακριβώς το ίδο. Όλα τα στοιχεία που περιέχονται μέσα στο ID αυτό θα κληρονομίσουν την ιδιότητα να έχουν λευκό χρώμα στα γράμματα.</p>
<p style="text-align: center;"><a title="Δοκιμάστε τον κώδικα" href="http://www.w3schools.com/css/tryit.asp?filename=trycss_syntax_class" target="_blank"><img class="size-full wp-image-4097 aligncenter" src="http://greektuts.net/wp-content/uploads3/2010/07/tryitoutbtn.png" alt="" width="450" height="24" /></a></p>
<h1>Στο επόμενο μέρος&#8230;</h1>
<p>Αφού κάναμε μια εισαγωγή στα CSS, στο επόμενο μέρος θα δούμε πιο αναλυτικά πράγματα που μπορούμε να κάνουμε με τις επιλογές, τα Ids και τα Classes, και θα ξεκινήσουμε να δίνουμε στύλ σε στοιχεία. Μέχρι τότε, περιμένουμε να ακούσουμε τις απόψεις σας και τις πρακτικές σας πάνω σε θέματα χρήσης των CSS.</p>
]]></content:encoded>
			<wfw:commentRss>http://greektuts.net/css-superhero-basic-principles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Απλό Σύστημα Εγγραφής Χρηστών</title>
		<link>http://greektuts.net/register-system/</link>
		<comments>http://greektuts.net/register-system/#comments</comments>
		<pubDate>Wed, 21 Jul 2010 07:50:22 +0000</pubDate>
		<dc:creator>Jimakos</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[jimakos]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[login system]]></category>
		<category><![CDATA[register]]></category>
		<category><![CDATA[register system]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://greektuts.net/?p=4082</guid>
		<description><![CDATA[Αναρωτηθήκατε ποτέ πως είναι ένα σύστημα πρόσβασης χρηστών σε μια ιστοσελίδα; Σε αυτό το βοήθημα λοιπόν θα δούμε πως μπορούμε να δημιουργήσουμε για αρχή ένα απλό σύστημα εγγραφής χρηστών, χρησιμοποιόντας απλές εντολές της PHP, λίγη SQL και HTML.]]></description>
			<content:encoded><![CDATA[<h1>H Φόρμα Εγγραφής</h1>
<p>Καταρχάς θα χρειαστούμε μια φόρμα την οποία πρέπει να συμπληρώσει ο χρήστης για να προχωρήσει στην εγγραφή του .</p>
<p>Ο παρακάτω κώδικας είναι μια απλή φόρμα με λίγο κώδικα της php ο οποίος θα μας χρησιμεύσει αργότερα για την εμφάνιση μηνυμάτων.</p>
<pre name="code" class="php">
forma.php
&lt;?php
session_start();
?&gt;
&lt;html &gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
&lt;title&gt;Φόρμα Εισαγωγής στοιχείων&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;pre&gt;
&lt;form action="register.php" method="get" &gt;
Όνομα : &lt;input name="name" style="background:#3281C0" /&gt;&lt;br /&gt;
Κωδικός:&lt;input name="name" style="background:#3281C0"  /&gt;&lt;br /&gt;
Email : &lt;input name="email"  style="background:#3281C0"  /&gt;
&lt;br /&gt;
&lt;input value="Καταχωρηση" /&gt;
&lt;?php
if (isset($_SESSION['errors'])){
echo $_SESSION['errors'];
}
else
echo $_SESSION['error2']; ?&gt;
&lt;/pre&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<h1>Η Βάση Δεδομένων</h1>
<p>Έπειτα θα χρειαστούμε μια βάση δεδομένων στην οποία θα καταχωρήσουμε τα στοιχειά που θα εισάγουν οι χρήστες</p>
<p>Ας δούμε λοιπόν πως θα δημιουργήσουμε αυτή την βάση :</p>
<p>Δημιουργία βάσης :</p>
<pre name="code" class="php">
CREATE DATABASE `Greektuts` ;
</pre>
<p>έπειτα αφού επιλέξουμε την βάση δημιουργούμε έναν πίνακα:</p>
<p>Δημιουργία πίνακα:</p>
<pre name="code" class="php">
CREATE TABLE `Greektuts`.`Register` (

`Name` VARCHAR( 40 ) NOT NULL ,
`Password` VARCHAR( 40 ) NOT NULL ,
`Email` VARCHAR( 60 ) NOT NULL ,
PRIMARY KEY ( `Name` )

) ENGINE = MYISAM ;
</pre>
<p>Έτσι έχουμε δημιουργήσει την βάση μας και τον πίνακα μας .</p>
<h1>Διαχείρηση Δεδομένων</h1>
<p>Τώρα το κομμάτι του κώδικα που θα διαχειριστεί τα δεδομένα:</p>
<p>Δημιουργούμε ένα αρχείο php με όνομα register.php</p>
<p>Για αρχή θα δημιουργήσουμε μια function για να διαχειριζόμαστε την σύνδεση μας με την βάση</p>
<pre name="code" class="php">
&lt;?php
function db_con(){
$connection=mysql_connect("$localhost","$db_username","db_password") or die("Δεν επιτεύχθηκε η σύνδεση");
$db_selct=mysql_select_db($db_name,$connection) or die("Δεν επιτεύχθηκε η σύνδεση με τον πίνακα ");
}
?&gt;
</pre>
<p>Λοιπόν δημιουργήσαμε μια μέθοδο για να μπορούμε να την καλούμε όποτε εμείς θέλουμε</p>
<p>Ας δούμε αναλυτικά τι κάναμε μέχρι στιγμής</p>
<p>Είναι ο κώδικας σύνδεσης στην βάση</p>
<pre name="code" class="php">
$connection=mysql_connect("$localhost","$db_username","db_password") or die("Δεν επιτεύχθηκε η σύνδεση");
</pre>
<p>Σημαντικό*</p>
<p>Αντικαταστήστε το $localhost,$db_username,$db_password και παρακάτω το $db_name</p>
<p>με τα δικά σας στοιχειά ένα παράδειγμα :</p>
<pre name="code" class="php">
$connection=mysql_connect("localhost","root","") or die("Δεν επιτεύχθηκε η σύνδεση");
</pre>
<p>Η σύνδεση αυτή καθορίζει το όνομα της βάσης την οποία θέλουμε να επιλέξουμε</p>
<pre name="code" class="php">
$db_selct=mysql_select_db($db_name,$connection) or die("Δεν επιτεύχθηκε η σύνδεση με τον πίνακα ");
</pre>
<p>Έπειτα προχωράμε παρακάτω :</p>
<pre name="code" class="php">
&lt;?php
session_start();
$name = $_POST['name'];
$pass = $_POST['password'];
$email = $_POST['email'];
if(isset($_POST['submit'])){
unset($_SESSION['errors']);
if(empty($name)){
$_SESSION['errors']=" Το πεδίο όνομα θα πρέπει να συμπληρωθεί ";
}
if(empty($pass)){
$_SESSION['errors'].=" Το πεδιο κωδικός θα πρέπει να συμπληρωθεί ";
}
if(empty($email)){
$_SESSION['errors'].=" Το πεδιο email θα πρεπει να συμπληρωθει ";
}
</pre>
<p>Εδώ απλά κάνουμε έναν έλεγχο απλό για το αν έχουν εισαχθεί δεδομένα στην φόρμα που είχαμε δημιουργήσει προηγουμένως.</p>
<p>Ας το πάρουμε κομμάτι κομμάτι</p>
<pre name="code" class="php">
session_start();
</pre>
<p>αυτή η μέθοδος θα μας χρησιμεύσει αργότερα για την επιστροφή μηνυμάτων στον χρήστη .</p>
<p>Ο παρακάτω κώδικας ελέγχει αν έχει “πατηθεί “ το κουμπί Καταχώρησε αν όντως έχει “πατηθεί”</p>
<p>τότε βγάζει όλα τα δεδομένα από το $_SESSION['errors'] ώστε να μην έχουμε κολλήματα αργότερα</p>
<pre name="code" class="php">
if(isset($_POST['submit'])){
unset($_SESSION['errors']);
</pre>
<p>Εδώ κάνουμε έναν έλεγχο από τους πιο απλούς που θα μπορούσατε να κάνετε</p>
<p>ελέγχουμε αν το πεδίο όνομα είναι άδειο αν ναι τότε εκχωρούμε μέσα στο $_SESSION  το ακόλουθο μήνυμα. Το ίδιο γίνετε για όλα τα πεδία τα οποία θέλουμε να ελέγξουμε.</p>
<pre name="code" class="php">
if(empty($name)){
$_SESSION['errors']=" Το πεδίο όνομα θα πρέπει να συμπληρωθεί ";
}
</pre>
<p>Παρατήρηση στο δεύτερο έλεγχο και ούτω κάθε ξης βάζουμε μια . πριν το =</p>
<p>Τέλος προσθέτουμε λίγο ακόμη έλεγχο και είμαστε έτοιμοι</p>
<pre name="code" class="php">
if(!isset($_SESSION['errors'])){
db_con();
$query=mysql_query("SELECT * FROM register where Name='$name' ") or die("Κάτι πήγε στραβά");
$check=mysql_num_rows($query);
if($check &gt;0){
$_SESSION['error2']="Το όνομα χρήστη $name υπάρχει ήδη στην βάση ";
header( "Location: forma.php" );
}
else {
$query=("INSERT INTO register (Name, Password,Email) VALUES ('$name', '$pass', '$email')");
$insert=mysql_query($query);
}
}
else {
header( "Location: forma.php" );
}
}
</pre>
<p>Ελέγχουμε αν υπάρχουν errors αν όχι τότε προχωράμε στον επόμενο έλεγχο ο οποίος είναι η ύπαρξη του ονόματος που εισαχθεί μέσα στην βάση μας. Εάν υπάρχει τότε δηλώνουμε το μήνυμα σε μια μεταβλητή και στέλνουμε τον χρήστη πίσω στην φόρμα εκεί θα του επιστρέφουν τα ανάλογα μηνύματα.</p>
<blockquote style="text-align: center;"><p><em><strong>Μπορείτε να κατεβάσετε τα     αρχεία του βοηθήματος εδώ</strong></em></p>
<p><em><strong><a href="http://greektuts.net/wp-content/uploads3/2010/07/register-system.zip" target="_blank"><img src="../wp-content/uploads/2009/10/membersdownload1.png" alt="download" width="200" height="200" /></a></strong></em></p></blockquote>
<p style="text-align: center;">
<p>﻿</p>
]]></content:encoded>
			<wfw:commentRss>http://greektuts.net/register-system/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Γιατί η Python μοιάζει με τον Chuck Norris</title>
		<link>http://greektuts.net/why-python-is-like-chuck-norris/</link>
		<comments>http://greektuts.net/why-python-is-like-chuck-norris/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 07:20:02 +0000</pubDate>
		<dc:creator>KrAp</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Άρθρα]]></category>
		<category><![CDATA[apostolos]]></category>
		<category><![CDATA[apostolos kritikos]]></category>
		<category><![CDATA[chuck norris]]></category>
		<category><![CDATA[krap]]></category>
		<category><![CDATA[kritikos]]></category>
		<category><![CDATA[python and chuck norris]]></category>
		<category><![CDATA[απόστολος]]></category>
		<category><![CDATA[Γιατί η Python μοιάζει με τον Chuck Norris]]></category>

		<guid isPermaLink="false">http://greektuts.net/?p=4020</guid>
		<description><![CDATA[Ο οδηγός Python αποτελεί τον πιο ανεπτυγμένο, από άποψη περιεχομένου οδηγό, που έχω καταθέσει στο GreekTuts.net. Οι έμπειροι προγραμματιστές εντοπίζουν εύκολα πότε μια γλώσσα προγραμματισμού αξίζει της προσοχής τους. Με βάση αυτό το σκεπτικό ξεκίνησα να γράφο τον οδηγό της Python χωρίς να σκεφθώ ότι για κάποιους, η δύναμη της Python μπορεί να είναι ασαφής ή ακόμη και άγνωστη.]]></description>
			<content:encoded><![CDATA[<p>Μία πρόσφατη κουβέντα που είχα με μερικούς φίλους κατέληξε, ούτε λίγο ούτε πολύ στο εξής. «Γιατί να αρχίσεις έναν οδηγό για Python;». Φαίνεται πως η απάντησή μου «γιατί πήρε  το όνομά της από ταινία των Monty Python» δεν ήταν αρκετή. «Ε και; Θα χρειαστούν καλύτερα επιχειρήματα από αυτό για να πείσεις κάποιον να διαβάσει τον οδηγό σου!».</p>
<p>Όπως είπα παραπάνω, ο έμπειρος προγραμματιστής έχει μια σειρά τρόπων για να κατανοεί τη σπουδαιότητα μιας γλώσσας προγραμματισμού. Ένα πολύ πρακτικός τρόπος, που αποτελεί και γενική πρακτική, είναι η αξιολόγηση των εφαρμογών που έχουν υλοποιηθεί κάνοντας χρήση της γλώσσας αυτής.</p>
<h1><strong>Ο </strong><strong>Chuck </strong><strong>Norris και η </strong><strong>Python</strong></h1>
<p><strong> </strong></p>
<blockquote>
<p style="text-align: center;"><img class="size-full wp-image-4021 aligncenter" src="http://greektuts.net/wp-content/uploads3/2010/07/chuckthon.png" alt="" width="342" height="348" /></p>
</blockquote>
<p>Ο Chuck Norris αποτελεί πλέον persona – φαινόμενο χάρη στο διαδικτυακό καλαμπούρι που ξεκίνησε στις τάξεις των geeks του διαδικτύου (<a href="http://www.chucknorrisfacts.com/">http://www.chucknorrisfacts.com/</a>). Αποτελεί δηλαδή ένα παράδειγμα χαρακτήρα που, ενώ η πρωταρχική του ιδιότητα θα μπορούσε να χαρακτηρισθεί αδιάφορη, η χρήση του σε ένα πετυχημένο (και παράλληλα έξυπνο) project, όχι μόνον τον έφερε και πάλι στο προσκήνιο, αλλά εκτίναξε και το «κασέ» του, στα ύψη.</p>
<p>Με παρόμοιο τρόπο η Python αντλεί μεγάλη δύναμη μέσα από τις εφαρμογές για την υλοποίηση των οποίων έχει χρησιμοποιηθεί. Προφανώς η Python, σαν γλώσσα προγραμματισμού, έχει κάποια δυνατά σημεία και κάποιες αδυναμίες. Και οι δύο αυτές κατηγορίες σημείων όμως, κατά την προσωπική μου άποψη, περιλαμβάνουν ζητήματα υποκειμενικά. Μία εφαρμογή αντίθετα, χαρακτηρίζεται από χαρακτηριστικά όπως λειτουργικότητα, ορθότητα (ύπαρξη κατά το δυνατό λιγότερων λαθών), φορητότητα (υποστήριξη διαφορετικών λειτουργικών συστημάτων, κλπ. Αυτά τα χαρακτηριστικά, όντας εύληπτα από τους περισσότερους χρήστες, έμπειρους και μη, διευκολύνουν την αξιολόγηση της ίδιας της γλώσσας προγραμματισμού (κρίση δια του αποτελέσματος) μέσα από μία, θεωρώ, αντικειμενικότερη ματιά.</p>
<p>Αν λοιπόν η επιτυχία του Chuck Norris εκτινάχθηκε στα ύψη από την δημοσιοποίηση ενός καλοστημένου project σκεφθείτε που πρέπει να κατατάξουμε την γλώσσα Python μετά την παρουσίαση όχι μιας, ούτε δύο αλλά 4 + 1 εκπληκτικών εφαρμογών.</p>
<p>Έχετε δίπλα σας την κούπα με τον αγαπημένο καφέ ή τσάι; Ας ξεκινήσουμε…</p>
<h1><strong>Mercurial: Δουλέψτε ευκολότερα, δουλέψτε ταχύτερα</strong></h1>
<p>Αποτελεί εργαλείο που απευθύνεται κυρίως σε ανθρώπους που ασχολούνται με την ανάπτυξη λογισμικού. Πρόκειται για μια εφαρμογή ανοικτού λογισμικού (δηλαδή ο κώδικας διατίθεται ελεύθερα προς χρήση και τροποποίηση) η οποία λειτουργεί σε Windows, Mac OS X και στα περισσότερα συστήματα τύπου UNIX. Αποστολή του είναι η ομαδική ανάπτυξη ενός έργου λογισμικού με ταυτόχρονη παρακολούθηση, καταγραφή και τήρηση ιστορικού των αλλαγών που γίνονται από τους προγραμματιστές που συμμετέχουν στο έργο. Παρακολουθούνται αρχεία τύπου text αλλά και binary αρχεία.</p>
<p>Η εφαρμογή διατίθεται κάτω από άδεια GNU GPL ενώ ο δημιουργός και κύριος προγραμματιστής του έργου είναι ο Matt Mackall. Η υλοποίησή της βασίζεται στις γλώσσες Python και C.</p>
<p><span style="text-decoration: underline;">Επίσημη ιστοσελίδα</span>: <a href="http://mercurial.selenic.com/">http://mercurial.selenic.com/</a></p>
<h1><strong>Gwibber: </strong><strong>Microblogging Freedom</strong></h1>
<p><strong> </strong></p>
<blockquote>
<p style="text-align: center;"><img class="size-full wp-image-4022 aligncenter" src="http://greektuts.net/wp-content/uploads3/2010/07/gwibber.png" alt="" width="580" height="197" /></p>
</blockquote>
<p>Η εφαρμογή gwibber αποτελεί μια δωρεάν εφαρμογή πελάτη για τη διαχείριση γνωστών ιστοσελίδων κοινωνικής δικτύωσης (Twitter, Identi.ca, StatusNet, Facebook, FriendFeed, Digg, Flickr, Qaiku). Είναι φτιαγμένη για εμφανίζει στον χρήστη, ανά πάσα στιγμή, διαφορετικές ροές. Απευθύνεται σε λειτουργικά συστήματα Linux (είναι μάλιστα προεγκατεστημένη στην έκδοση 10.04 της διανομής Ubuntu).</p>
<p><span style="text-decoration: underline;">Επίσημη ιστοσελίδα</span>: <a href="http://gwibber.com/">http://gwibber.com/</a></p>
<h1><strong>Emesen: An IM for the WLM<sup>TM</sup> network</strong></h1>
<p>Πρόκειται για μία από τις αγαπημένες μου εφαρμογές για λειτουργικά συστήματα Linux. Αντικαθιστά επάξια το MSN των Windows.</p>
<p>Αποστολή του είναι να «αντιγράψει» τις ιδιότητες του MSN προσφέροντας στον χρήστη Linux Λειτουργικών συστημάτων ένα εύχρηστο αλλά παράλληλα οικείο περιβάλλον αποστολής προσωπικών μηνυμάτων.</p>
<p>Λειτουργεί άψογα με λογαριασμούς Microsoft και φυσικά διατίθεται δωρεάν με άδεια GNU GPL.</p>
<p>Όπως και πριν, το Emesen είναι γραμμένο σε Python.</p>
<p><span style="text-decoration: underline;">Επίσημη ιστοσελίδα</span>: <a href="http://www.emesene.org/">http://www.emesene.org/</a> <strong> </strong></p>
<h1><strong>Trac: Integrated SCM &amp; Project Management</strong></h1>
<p><strong> </strong></p>
<blockquote>
<p style="text-align: center;"><img class="size-full wp-image-4023 aligncenter" src="http://greektuts.net/wp-content/uploads3/2010/07/traclogo.png" alt="" width="512" height="512" /></p>
</blockquote>
<p>Ακόμη ένα εξαιρετικό εργαλείο για ανάπτυξη και εκσφαλμάτωση λογισμικού γραμμένο αποκλειστικά σε Python. Διατίθεται δωρεάν και αποτελεί λογισμικό ανοικτού κώδικα. Η αρχική του ονομασία ήταν svntrac λόγω της ικανότητάς του να συνεργάζεται με το Subversion.</p>
<p><span style="text-decoration: underline;">Επίσημη ιστοσελίδα</span>: <a href="http://trac.edgewall.org/">http://trac.edgewall.org/</a></p>
<h1><strong>(+1) </strong><strong>Django: </strong><strong>Web </strong><strong>framework για τελειομανείς με </strong><strong>deadlines</strong></h1>
<p><strong> </strong></p>
<blockquote>
<p style="text-align: center;"><img class="size-full wp-image-4024 aligncenter" src="http://greektuts.net/wp-content/uploads3/2010/07/django.jpg" alt="" width="350" height="122" /></p>
</blockquote>
<p>Το Jango αποτελεί στην κυριολεξία ένα trend της εποχής. Πρόκειται για ένα Web Framework που διατίθεται δωρεάν κάτω από BSD License και φυσικά ο κώδικάς του είναι ανοικτός. Η μυστήρια ονομασία του προέρχεται από τον τσιγγάνο κιθαρίστα <a title="Django  Reinhardt" href="http://en.wikipedia.org/wiki/Django_Reinhardt">Django Reinhardt</a>. Είναι γραμμένο εξ’ ολοκλήρου σε Python.</p>
<p><span style="text-decoration: underline;">Επίσημη ιστοσελίδα</span>: <a href="http://www.djangoproject.com/">http://www.djangoproject.com</a></p>
<p>Για όσους από εσάς λοιπόν δεν είναι ξεκάθαρο το πόσο σημαντική γλώσσα είναι η Python, οι παραπάνω εφαρμογές έρχονται να «ξεκαθαρίσουν» το τοπίο, κάνοντας σαφές με τον καλύτερο τρόπο ότι κάποιος που γνωρίζει καλά Python, μπορεί να υλοποιήσει μια μεγάλη γκάμα πραγμάτων, που εμπίπτουν σε ποικιλία τεχνολογιών.</p>
<p>Μέχρι την επόμενη λοιπόν φορά που θα τα πούμε…</p>
<p><em><span style="text-decoration: underline;">…να είστε καλά και να προσέχετε τον εαυτό σας</span>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://greektuts.net/why-python-is-like-chuck-norris/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Βασικοί JQuery Selectors</title>
		<link>http://greektuts.net/basic-jquery-selectors/</link>
		<comments>http://greektuts.net/basic-jquery-selectors/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 07:51:30 +0000</pubDate>
		<dc:creator>KrAp</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[j Query]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jquery donwload]]></category>
		<category><![CDATA[jquery selectors]]></category>
		<category><![CDATA[krap]]></category>
		<category><![CDATA[kritikos]]></category>
		<category><![CDATA[sample]]></category>
		<category><![CDATA[selectors]]></category>
		<category><![CDATA[απόστολος]]></category>
		<category><![CDATA[απόστολος κρητικός]]></category>

		<guid isPermaLink="false">http://greektuts.net/?p=3995</guid>
		<description><![CDATA[Σε προηγούμενα άρθρα έχουμε δεί τα βασικά χαρακτηριστικά της JQuery, και μάθαμε σχεδόν όλα όσα χρειαζόμαστε για να ξεκινήσουμε την περιήγηση μας στον κόσμο της. Σε αυτό το άρθρο θα ασχοληθούμε με ένα ζήτημα που αποτελεί ακρογωνιαίο λίθο στην JQuery, και αυτό είναι οι selectors της πασίγνωστης βιβλιοθήκης Javascript.]]></description>
			<content:encoded><![CDATA[<p><strong> </strong></p>
<p>Στο τέλος του οδηγού θα μπορούμε:</p>
<ul>
<li>Να κάνουμε χρήση των κλασικών JQuery selectors</li>
<li>Να κάνουμε χρήση των ιεραρχικών JQuery selectors</li>
</ul>
<h1><strong>Προαπαιτούμενα</strong></h1>
<p><strong> </strong></p>
<p>Εισαγωγή στην JQuery:  <a href="../jquery-intro/">Μέρος 1ο</a>, <a href="../jquery-intro-part2/">Μέρος  2ο</a> <em>(του Παναγιώτη Γρηγορόπουλου)</em></p>
<h1><strong>Πριν ξεκινήσουμε…</strong></h1>
<p><strong> </strong></p>
<p>… θα ήθελα να επισημάνω ένα – δύο πρακτικά ζητήματα.</p>
<p>Στη συνέχεια παρουσιάζεται ο τρόπος για να επιτευχθούν οι στόχοι που περιγράψαμε στην εισαγωγή. Θα παρατηρήσετε ότι το άρθρο ακολουθεί τη δομή:</p>
<p><em>Μικρή περιγραφή του τι θέλουμε να επιτύχουμε (+ επιπλέον σχόλια)</em></p>
<p><em>Παράδειγμα κώδικα</em></p>
<p>Στο τέλος του άρθρου θα βρείτε συνημμένο ένα συμπιεσμένο αρχείο που περιέχει:</p>
<ul>
<li>Τις δύο      εκδόσεις της JQuery</li>
<li>Συγκεντρωμένα      όλα τα παραδείγματα.</li>
</ul>
<p>Για να χρησιμοποιήσετε ορθά το πακέτο, το μόνο που έχετε να κάνετε είναι να το αποσυμπιέσετε σε κάποιο κατάλογο του συστήματος σας και στη συνέχεια χωρίς να κάνετε καμία αλλαγή στο περιεχόμενο του…</p>
<ul>
<li>Κάνοντας      διπλό κλικ στα αρχεία τύπου html μπορείτε να δείτε το αποτέλεσμα      των παραδειγμάτων.</li>
<li>Ανοίγοντας      τα αρχεία τύπου html με τον αγαπημένο σας επεξεργαστή κειμένου (προσωπικά      χρησιμοποιώ τον <a href="http://sourceforge.net/projects/notepad-plus/files/notepad%2B%2B%20releases%20binary/npp%205.6.8%20bin/npp.5.6.8.Installer.exe/download">Notepad++</a> και ορίζω      την γλώσσα προγραμματισμού σε Javascript) μπορείτε να δείτε τον κώδικα (html και JQuery).</li>
</ul>
<p><em>Βεβαιωθείτε ότι δεν ξεχάσατε το μάτι της κουζίνας ανοικτό, ετοιμάστε μία κούπα καφέ ή τσάι, βάλτε απαλή μουσική και ξεκινάμε…</em></p>
<h1><strong>Τι είναι οι </strong><strong>JQuery </strong><strong>Selectors;</strong></h1>
<p>Αναρωτηθήκατε ποτέ γιατί η JQuery ονομάστηκε έτσι; Πολλοί από εσάς ίσως αναγνωρίζουν το J σαν συντομογραφία της JavaScript αλλά, το Query που κολλάει;</p>
<p>Θα σας βοηθήσω. Η έννοια query είναι γνωστότερη στην περιοχή των βάσεων δεδομένων όπου περιγράφει μία ερώτηση, μία αναζήτηση αν θέλετε, του χρήστη ως προς τη βάση δεδομένων με σκοπό να του επιστραφεί το σύνολο των εγγραφών, των στοιχείων δηλαδή της βάσης δεδομένων, που ικανοποιούν το ερώτημα αυτό. Σε μία βάση δεδομένων με τα δημογραφικά στοιχεία μιας χώρας για παράδειγμα ενδεικτικά queries θα μπορούσαν να είναι: «Αναζητώ όλους τους άνδρες με ηλικία άνω των 50 ετών», ή «Αναζητώ όλους τους κατοίκους της περιοχής Άνω Πόλη» ή «Αναζητώ γυναίκες μεταξύ 25 και 35 ετών που είναι ανύπαντρες» <em>(ΟΚ το τελευταίο ακούγεται κάπως αλλά εν πάση περιπτώσει αντιλαμβάνεστε πως λειτουργεί ένα </em><em>query)</em>.</p>
<p>Στην JQuery ένα query λειτουργεί με παρόμοιο τρόπο. Αναλαμβάνει να συλλέξει ένα σύνολο από τα στοιχεία που βρίσκονται στην υπό ανάπτυξη ιστοσελίδα ώστε να μπορέσει στη συνέχεια, ο προγραμματιστής, να επέμβει σε αυτά (είτε αισθητικά, είτε λειτουργικά). Τον ρόλο των queries στην JQuery βιβλιοθήκη παίζουν δύο ομάδες συναρτήσεων που ονομάζονται Selectors και Filters αντίστοιχα. Σήμερα θα ασχοληθούμε με τους Selectors.</p>
<h1><strong>Κάτι μου θυμίζει…</strong></h1>
<p><strong> </strong></p>
<p>Αν η παραπάνω συζήτηση σας φαίνεται γνώριμη τότε μάλλον έχετε παρακολουθήσει κάποιο από τα άρθρα που συνιστούμε ως προαπαιτούμενα στην αρχή του άρθρου. Σε αυτά τα δύο άρθρα, ο Παναγιώτης Γρηγορόπουλος έχει περιγράψει το μεγαλύτερο μέρος των βασικών σημείων της βιβλιοθήκης της JQuery και, όπως είναι φυσικό, έχει ασχοληθεί και με το θέμα των Selectors. Σε αυτό εδώ το άρθρο, θα δούμε το ζήτημα αυτό αναλυτικότερα και θα παρουσιάσουμε εξειδικευμένα παραδείγματα. Ακόμη και αν έχετε διαβάσει τα παραπάνω άρθρα, μείνετε μαζί μας. Σας υπόσχομαι ότι δεν θα βαρεθείτε J</p>
<h1><strong>JQuery </strong><strong>selectors. Πλοηγηθείτε στα στοιχεία της ιστοσελίδας σας.</strong></h1>
<p><strong> </strong></p>
<p>Για την καλύτερη κατανόηση των εννοιών που παρουσιάζουμε σε αυτό το άρθρο έχω ετοιμάσει ένα δείγμα ιστοσελίδας στο οποίο και θα δουλεύουμε για λίγο καιρό. Το αποτέλεσμα, όταν το ανοίξουμε με τον αγαπημένο μας browser μοιάζει κάπως έτσι:</p>
<blockquote>
<p style="text-align: center;"><img class="size-full wp-image-3997 aligncenter" src="http://greektuts.net/wp-content/uploads3/2010/06/sample.png" alt="" width="579" height="293" /></p>
</blockquote>
<p>Αντίστοιχα ο κώδικας του αρχείου χωρίς το κομμάτι της JQuery είναι ο ακόλουθος:</p>
<pre name="code" class="html">
&lt;html&gt;

&lt;head&gt;

&lt;title&gt;JQuery Selectors | GreekTuts.net&lt;/title&gt;

&lt;/head&gt;

&lt;body&gt;

&lt;h1 id="header"&gt;Μια επικεφαλίδα&lt;/h1&gt;

&lt;p&gt;Μια απλή παράγραφος κειμένου. Μια απλή παράγραφος κειμένου. Μια απλή παράγραφος κειμένου. Μια απλή παράγραφος κειμένου. Μια απλή παράγραφος κειμένου. Μια απλή παράγραφος κειμένου. Μια απλή παράγραφος κειμένου.&lt;/p&gt;

&lt;p id="secondparagraph"&gt;Μία ακόμη παράγραφος. Μία ακόμη παράγραφος. Μία ακόμη παράγραφος. Μία ακόμη παράγραφος. Μία ακόμη παράγραφος. Μία ακόμη παράγραφος. Μία ακόμη παράγραφος. Μία ακόμη παράγραφος. Μία ακόμη παράγραφος. Μία ακόμη παράγραφος.&lt;/p&gt;

&lt;table&gt;

&lt;tr&gt;

&lt;td&gt;Δεδομένο 1.1&lt;/td&gt;

&lt;td&gt;Δεδομένο 1.2&lt;/td&gt;

&lt;td&gt;Δεδομένο 1.3&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;Δεδομένο 2.1&lt;/td&gt;

&lt;td&gt;Δεδομένο 2.2&lt;/td&gt;

&lt;td&gt;Δεδομένο 2.3&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;Δεδομένο 3.1&lt;/td&gt;

&lt;td&gt;Δεδομένο 3.2&lt;/td&gt;

&lt;td class="someclass"&gt;Δεδομένο 3.3&lt;/td&gt;

&lt;/tr&gt;

&lt;/table&gt;

&lt;p&gt;3η παράγραφος...&lt;/p&gt;

&lt;p&gt;4η &lt;b&gt;παράγραφος...&lt;/b&gt; ( μπορεί να γίνεται &lt;b&gt;κουραστικό&lt;/b&gt; αλλά είναι για καλό σκοπό <img src='http://greektuts.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )&lt;/p&gt;

&lt;/body&gt;

&lt;/html&gt;
</pre>
<p>Ας πάμε να εμπλουτίσουμε τον κώδικά μας με λίγο JQuery και να δούμε πως μπορούμε να επιλέξουμε κάποια από τα στοιχεία στην ιστοσελίδα μας. Υπενθυμίζω ότι ο κώδικας JQuery μπαίνει στο τμήμα &lt;head&gt; … &lt;/head&gt; της ιστοσελίδας μας και αρχίζει πάντοτε με την συμπερίληψη της βιβλιοθήκης JQuery.</p>
<pre name="code" class="html">
&lt;script src="jquery-1.4.2.min.js"&gt;&lt;/script&gt;
</pre>
<p>Στη συνέχεια πρέπει να δηλώσουμε στον browser ότι θέλουμε ο JQuery κώδικάς μας να εκτελεστεί όταν φορτώνεται η ιστοσελίδα. Για τον λόγο αυτό δηλώνουμε την παρακάτω συνάρτηση μέσα στην οποία θα πειραματιστούμε (τώρα και σε όλα τα υπόλοιπα άρθρα της σειράς)</p>
<pre name="code" class="html">
&lt;script&gt;

$("document").ready(function() {

//κώδικας

});

&lt;/script&gt;
</pre>
<h1><strong>Μερικοί απλοί </strong><strong>selectors</strong></h1>
<p><strong> </strong></p>
<p>Πριν ξεκινήσουμε 1 – 2 διευκρινήσεις:</p>
<ul>
<li>HTML tag: Ένα html tag είναι      μια λέξη κλειδί (εντολή) της html. Π.χ. &lt;body&gt;, &lt;p&gt;,      &lt;li&gt;, &lt;b&gt;, κλπ.</li>
<li>.css(…): Συνάρτηση της JQuery που επεμβαίνει      στο CSS του στοιχείου που προηγείται της τελείας και επιδρά με      τον τρόπο που περιγράφουν τα ορίσματα της παρένθεσης. Στο σημερινό άρθρο      θα συναντήσετε την δήλωση <em>css(&#8220;</em><em>border&#8221;, &#8220;</em><em>thin </em><em>solid </em><em>red&#8221;)</em>.      Αυτό που πρακτικά κάνει είναι να περικλείει το / τα επιλεγμένο(α)      στοιχείο(α) σε ένα κόκκινο πλαίσιο ώστε να μπορείτε να δείτε το αποτέλεσμα      του JQuery κώδικα κάθε φορά. Θα σας πρότεινα να αγνοήσετε τον      τρόπο που λειτουργεί για την ώρα. Επικεντρωθείτε στους selectors.</li>
<li>Σχόλια JQuery ( // ): Όπως σε      κάθε γλώσσα προγραμματισμού έτσι και στην JQuery υπάρχει      η δυνατότητα δήλωσης σχολίων. Αυτή γίνεται με την προσθήκη των χαρακτήρων //      μπροστά από τη γραμμή που θέλουμε να προσδιορίσουμε ως σχόλιο. Στο σημερινό      παράδειγμά μας (που μπορείτε να κατεβάσετε στο τέλος του άρθρου) θα βρείτε      συγκεντρωμένους όλους τους selectors που θα παρουσιάσουμε. Για να μην μπερδευτείτε, τους      δίνουμε υπό μορφή σχολίων. Κάθε φορά που θέλετε να δοκιμάσετε κάποιον το      μόνο που έχετε να κάνετε είναι να αφαιρέσετε το // μπροστά από τη γραμμή      που σας ενδιαφέρει (και φυσικά να προσθέσετε // σε όλες τις υπόλοιπες)      ώστε να είναι ενεργοποιημένος μόνον ένας selector κάθε      φορά.</li>
</ul>
<h1><strong>Επιλογή όμοιων </strong><strong>tags</strong></h1>
<p><strong> </strong></p>
<pre name="code" class="html">
$("p").css("border", "thin solid red")
</pre>
<p>Ο παραπάνω selector θα επιλέξει όλα τα στοιχεία &lt;p&gt; που βρίσκονται στην ιστοσελίδα μας. Όπως παρατηρείτε ο selector δεν είναι τίποτε άλλο παρά το σήμα κατατεθέν της JQuery (δηλαδή το $) ακολουθούμενο από τον προσδιοριστή που θέλουμε, στην περίπτωσή μας το p κλεισμένο σε παρενθέσεις και διπλά εισαγωγικά. Παρατηρήστε ότι βάζουμε την περιγραφή του tag μόνο, χωρίς τα &lt; &gt; στα οποία περικλείεται κανονικά.</p>
<h1><strong>Επιλογή</strong><strong> στοιχείων</strong><strong> με</strong><strong> ίδια</strong><strong> κλάση</strong><strong> </strong></h1>
<pre name="code" class="html">
$(".someclass").css("border", "thin solid red")
</pre>
<p>Πολλές φορές ρυθμίζουμε την εμφάνιση συγκεκριμένων στοιχείων κάνοντας χρήση κλάσεων CSS. Με τον selector $(&#8220;.myClass&#8221;) μπορούμε να επιλέξουμε όλα τα στοιχεία της ιστοσελίδας μας που ανήκουν σε αυτήν την κλάση.</p>
<h1><strong>Επιλογή στοιχείου με βάση το </strong><strong>id</strong></h1>
<p><strong> </strong></p>
<pre name="code" class="html">
$("#header").css("border", "thin solid red")
</pre>
<p>Ένας άλλος μηχανισμός που προσφέρεται από τα CSS είναι τα ids. Ο selector $(&#8220;#id&#8221;) μας επιτρέπει να διαχειριστούμε στοιχεία με ids μέσω της JQuery.</p>
<h1><strong>Επιλογή στοιχείων με βάση το </strong><strong>tag και την κλάση</strong></h1>
<pre name="code" class="html">
$("td.someclass").css("border", "thin solid red")
</pre>
<p>Είναι εφικτό να υπάρξουν συνδυαστικοί selectors. Ο παραπάνω επιλέγει όλα τα tags τύπου td που όμως ανήκουν στην κλάση someclass.</p>
<h1><strong>Επιλογή στοιχείων με βάση το </strong><strong>tag, το </strong><strong>id και την κλάση</strong></h1>
<pre name="code" class="html">
$("p#secondparagraph.someclass").css("border", "thin solid red")
</pre>
<p>Σε αυτόν τον πολύ συγκεκριμένο selector γίνεται χρήση των μηχανισμών του id και της κλάσης. Πιο συγκεκριμένα θα επιλεγεί εκείνο το στοιχείο με id secondparagraph και κλάση someclass.</p>
<h1><strong>Selectors ιεραρχίας</strong></h1>
<p>Εκτός από τους παραπάνω selectors υπάρχει και μία ομάδα selectors που σχετίζονται  με την ιεραρχία των στοιχείων μέσα με μια ιστοσελίδα. Ας τους δούμε έναν – έναν.</p>
<h1><strong>Επιλογή στοιχείων παιδιών</strong></h1>
<pre name="code" class="html">
$("tr &gt; td").css("border", "thin solid red")
</pre>
<p>Ο selector $(&#8220;a &gt; b&#8221;) επιλέγει όλα τα tags τύπου b που αποτελούν παιδιά του tag a (βρίσκονται δηλαδή ακριβώς ένα επίπεδο κάτω από το b). Στην προκειμένη περίπτωση θα επιλεγούν όλα τα td tags που είναι άμεσα παιδιά ενός tr tag (μην βιαστείτε να σκεφθείτε… «μα ένα td πάντα περιέχεται σε ένα tr» γιατί τα μάτια μου έχουν δει πολλά J ).</p>
<h1><strong>Επιλογή απογόνων</strong></h1>
<pre name="code" class="html">
$("p b").css("border", "thin solid red")
</pre>
<p>Λειτουργεί όπως και ο a &gt; b selector με τη διαφορά ότι δεν περιορίζεται σε άμεσα παιδιά. Με τον selector $(&#8220;a b&#8221;) μας επιστρέφεται μία λίστα με όλα τα tags b που αποτελούν απογόνους του a όσα επίπεδα κάτω και αν βρίσκονται από το a.</p>
<h1><strong>Επιλογή επομένου στοιχείου</strong></h1>
<pre name="code" class="html">
$("table + p").css("border", "thin solid red")
</pre>
<p>Ο selector $(&#8220;a + b&#8221;) επιστρέφει το αμέσως επόμενο tag τύπου b που βρίσκεται μετά το tag a. Στο παράδειγμά μας θα επιστραφεί η αμέσως επόμενη παράγραφος μετά τον πίνακα.</p>
<h1><strong>Επιλογή συγγενικού στοιχείου (ή αδερφού κόμβου)</strong></h1>
<pre name="code" class="html">
$("table ~ p").css("border", "thin solid red")
</pre>
<p>Ο selector $(&#8220;a ~ b&#8221;) επιστρέφει όλους τους αδερφούς κόμβους του a που είναι τύπου b. Στο συγκεκριμένο παράδειγμα θα επιστραφούν όλες οι παράγραφοι που αποτελούν συγγενικούς κόμβους του πίνακα της ιστοσελίδα μας.</p>
<p>Δοκιμάστε τα παραδείγματα που συνοδεύουν το άρθρο και πειραματιστείτε. Ως την επόμενη συνάντησή μας…</p>
<p><em><span style="text-decoration: underline;">Να είστε καλά και να φροντίζεται τον εαυτό σας</span></em>.</p>
<blockquote>
<p style="text-align: center;"><em><strong>Μπορείτε να κατεβάσετε τα   αρχεία του βοηθήματος εδώ</strong></em></p>
<p style="text-align: center;"><a href="http://greektuts.net/wp-content/uploads3/2010/06/jquery_tuts_selectors.zip" target="_self"><em><strong><img src="../wp-content/uploads/2009/10/membersdownload1.png" alt="download" width="200" height="200" /></strong></em></a></p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://greektuts.net/basic-jquery-selectors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eiσαγωγή στην PHP Μέρος 4</title>
		<link>http://greektuts.net/php-intro-part4/</link>
		<comments>http://greektuts.net/php-intro-part4/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 07:25:15 +0000</pubDate>
		<dc:creator>Pantso</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[intro]]></category>
		<category><![CDATA[part4]]></category>
		<category><![CDATA[Εισαγωγη στην PHP]]></category>
		<category><![CDATA[Μέρος 4]]></category>
		<category><![CDATA[τέσσερα]]></category>
		<category><![CDATA[τέταρτο]]></category>

		<guid isPermaLink="false">http://greektuts.net/?p=3957</guid>
		<description><![CDATA[Στα προηγούμενα μέρη της εισαγωγής στην PHP είδαμε τις βασικές έννοιες και συναρτήσεις ενώ μιλήσαμε για την δομή και τις μεταβλητές που χρησιμοποιούμε στην PHP. Σε αυτό το 4ο μέρος, θα δούμε τα ψευδώνυμα (Aliases) των στηλών και των πινάκων που μπορούμε να χρησιμοποιήσουμε αλλά και 3 νέες εκφράσεις που χρησιμοποιούνται στην PHP]]></description>
			<content:encoded><![CDATA[<h1>Ψευδώνυμα (Aliases) Στηλών και Πινάκων</h1>
<p>Μερικές φορές είναι βολικό να αναφερόμαστε στις στήλες και στους πίνακες της MySQL με διαφορετικά ονόματα. Θα δούμε ένα παράδειγμα μιας βάσης δεδομένων που χρησιμοποιείται στο σύστημα κρατήσεων online μιας αεροπορικής εταιρείας. Για να παρουσιάσει τις πτήσεις που προσφέρονται από την εταιρεία, η βάση δεδομένων περιέχει τους εξής δύο πίνακες : Flights και Cities.<br />
Η κάθε καταχώρηση στον πίνακα Flights παριστάνει μια πραγματική πτήση ανάμεσα σε δύο πόλεις, την αρχή και τον προορισμό της πτήσης. Προφανώς, οι Origin και Destination θα αποτελούν στήλες του πίνακα Flights, μαζί μ’ άλλες στήλες για πράγματα όπως η ημερομηνία και η ώρα της πτήσης, ο τύπος του αεροσκάφους, ο αριθμός της πτήσης και τα διάφορα ναύλα.<br />
Ο πίνακας Cities περιέχει μια λίστα όλων των πόλεων προς τις οποίες πετάει η εταιρεία. Έτσι, και οι δύο στήλες Origin και Destination στον πίνακα Flights θα πρέπει να περιέχουν κωδικούς (ID&#8217;s) για να αναφέρονται στις καταχωρήσεις του πίνακα Cities. Θα δούμε τώρα μερικά ερωτήματα (queries).<br />
Για να πάρουμε μια λίστα όλων των πτήσεων με τις πόλεις προέλευσής τους :</p>
<pre name="code" class="html">
mysql&gt; SELECT Flights.Number, Cities.Name
-&gt; FROM Flights, Cities
-&gt; WHERE Flights.Origin = Cities.ID;
+--------+-----------+
| Number | Name      |
+--------+-----------+
| CP110  | Montreal  |
| CP226  | Sydney    |

| QF2026 | Melbourne |
...      ...
</pre>
<p>Για να πάρουμε μια λίστα όλων των πτήσεων με τις πόλεις προορισμού τους :</p>
<pre name="code" class="html">
mysql&gt; SELECT Flights.Number, Cities.Name
-&gt; FROM Flights, Cities
-&gt; WHERE Flights.Destination = Cities.ID;
+--------+----------+
| Number | Name     |
+--------+----------+
| CP110  | Sydney   |
| CP226  | Montreal |
| QF2026 | Sydney   |
...      ...
</pre>
<p>Τι μπορούμε να κάνουμε τώρα αν θέλουμε να εμφανίσουμε την προέλευση και τον προορισμό της κάθε πτήσης μ’ ένα μόνο ερώτημα; Ένα ερώτημα που μπορεί να σκεφθούμε να χρησιμοποιήσουμε είναι το εξής :</p>
<pre name="code" class="html">
mysql&gt; SELECT Flights.Number, Cities.Name, Cities.Name
-&gt; FROM Flights, Cities
-&gt; WHERE Flights.Origin = Cities.ID
-&gt; AND Flights.Destination = Cities.ID;
Empty set (0.01 sec)
</pre>
<p>Το παραπάνω ερώτημα δεν δουλεύει επειδή λέμε στην MySQL να ενώσει (join) τους πίνακες Flights και Cities και να εμφανίσει τον αριθμό πτήσης, το όνομα της πόλης και το όνομα της πόλης ξανά όλων των καταχωρήσεων που επιστρέφονται αν ταιριάξουμε το Origin με το City ID και το Destination με το City ID.<br />
Μ’ άλλα λόγια, οι στήλες Origin, Destination και City ID πρέπει να είναι ίσες μεταξύ τους. Αυτό έχει σαν αποτέλεσμα μια λίστα όλων των πτήσεων όπου η προέλευση και ο προορισμός είναι ίδιοι. Δεν θα υπάρχουν λοιπόν καθόλου καταχωρήσεις που να ταιριάζουν με την παραπάνω περιγραφή και έτσι είχαμε το αποτέλεσμα &#8220;Empty set&#8221;.<br />
Αυτό που χρειαζόμαστε είναι ένας τρόπος να μπορούμε να επιστρέψουμε δύο διαφορετικές καταχωρήσεις από τον πίνακα Cities, μια για την προέλευση και μια για τον προορισμό, για κάθε αποτέλεσμα. Αν είχαμε δύο αντίγραφα του πίνακα, ένα με όνομα Origins και ένα με όνομα Destinations, αυτό θα ήταν πολύ εύκολο να γίνει, αλλά γιατί να έχουμε δύο πίνακες που να περιέχουν την ίδια ακριβώς λίστα των πόλεων;<br />
Η λύση είναι να δώσουμε στον πίνακα Cities δύο διαφορετικά προσωρινά ονόματα (ψευδώνυμα, aliases) για τους σκοπούς αυτού του ερωτήματος (query). Αν γράψουμε μετά από το όνομα ενός πίνακα την έκφραση AS Alias στο τμήμα FROM του ερωτήματος SELECT, μπορούμε να του δώσουμε ένα προσωρινό όνομα με το οποίο να αναφερόμαστε σ’ αυτό οπουδήποτε στο ερώτημα. Ακολουθεί το παραπάνω ερώτημα ξανά, αλλά αυτή τη φορά έχουμε δώσει στον πίνακα Cities το ψευδώνυμο (alias) Origins.</p>
<pre name="code" class="html">
mysql&gt; SELECT Flights.Number, Origins.Name
-&gt; FROM Flights, Cities AS Origins
-&gt; WHERE Flights.Origin = Origins.ID;
</pre>
<p>Αναφερόμενοι στον πίνακα Cities δύο φορές, χρησιμοποιώντας δύο διαφορετικά ψευδώνυμα (aliases), μπορούμε να χρησιμοποιήσουμε μια ένωση (join) τριών πινάκων, όπου οι δύο από τους πίνακες θα είναι ουσιαστικά ίδιοι, για να πάρουμε το αποτέλεσμα που θέλουμε :</p>
<pre name="code" class="html">
mysql&gt; SELECT Flights.Number, Origins.Name,
-&gt;        Destinations.Name
-&gt; FROM Flights, Cities AS Origins,
-&gt;      Cities AS Destinations
-&gt; WHERE Flights.Origin = Origins.ID
-&gt; AND Flights.Destination = Destinations.ID;
+--------+-----------+----------+
| Number | Name      | Name     |
+--------+-----------+----------+
| CP110  | Montreal  | Sydney   |
| CP226  | Sydney    | Montreal |
| QF2026 | Melbourne | Sydney   |
...      ...         ...
</pre>
<p>Μπορούμε επίσης να ορίσουμε ψευδώνυμα για τα ονόματα στηλών. Θα μπορούμε να το χρησιμοποιήσουμε αυτό, για παράδειγμα, για να διαχωρίσουμε τις δύο στήλες &#8220;Name&#8221; στον παραπάνω πίνακα αποτελεσμάτων :</p>
<pre name="code" class="html">
mysql&gt; SELECT F.Number, O.Name AS Origin,
-&gt;        D.Name AS Destination
-&gt; FROM Flights AS F, Cities AS O, Cities AS D
-&gt; WHERE F.Origin = O.ID AND F.Destination = D.ID;
+--------+-----------+-------------+
| Number | Origin    | Destination |
+--------+-----------+-------------+
| CP110  | Montreal  | Sydney      |
| CP226  | Sydney    | Montreal    |
| QF2026 | Melbourne | Sydney      |
...      ...         ...
</pre>
<h1>Η Έκφραση GROUP BY</h1>
<p>Στα προηγούμενα, είχαμε δει το παρακάτω query, το οποίο μας εμφανίζει πόσα jokes είναι αποθηκευμένα στον πίνακα Jokes :</p>
<pre name="code" class="html">
mysql&gt; SELECT COUNT(*) FROM Jokes;
+----------+
| COUNT(*) |
+----------+
|        4 |
+----------+
</pre>
<p>Η συνάρτηση COUNT() της MySQL ανήκει σε μια ειδική κατηγορία συναρτήσεων άθροισης (summary functions) ή συναρτήσεων ομαδοποίησης (group-by functions). Σ’ αντίθεση μ’ άλλες συναρτήσεις οι οποίες επηρεάζουν τις καταχωρήσεις στο αποτέλεσμα του ερωτήματος SELECT, οι συναρτήσεις άθροισης ομαδοποιούν μαζί όλα τα αποτελέσματα και επιστρέφουν ένα μόνο αποτέλεσμα.<br />
Στο παραπάνω παράδειγμα, η συνάρτηση COUNT() επιστρέφει τον συνολικό αριθμό των γραμμών του αποτελέσματος.<br />
Ας υποθέσουμε ότι θέλουμε να εμφανίσουμε μια λίστα των συγγραφέων με τον αριθμό των jokes που αντιστοιχεί στον καθένα. Η πρώτη μας σκέψη θα ήταν να πάρουμε μια λίστα των ονομάτων και των ID’s όλων των συγγραφέων και μετά να χρησιμοποιήσουμε τη συνάρτηση COUNT() για να μετρήσουμε τον αριθμό των αποτελεσμάτων όταν κάνουμε SELECT στα jokes με το ID του κάθε συγγραφέα. Ο PHP κώδικας θα είναι ως εξής :</p>
<pre name="code" class="html">
// Μια λίστα όλων των συγγραφέων
$authors = mysql_query( "SELECT Name, ID FROM Authors" );
// Επεξεργασία του κάθε συγγραφέα
while ($author = mysql_fetch_array($authors)) {
$name = $author["Name"];
$id = $author["ID"];
// Μέτρηση των jokes που ανήκουν σ' αυτόν τον συγγραφέα
$result = mysql_query(
"SELECT COUNT(*) AS NumJokes ".
"FROM Jokes WHERE AID=$id" );
$row = mysql_fetch_array($result);
$numjokes = $row["NumJokes"];
// Εμφάνιση του συγγραφέα και του αριθμού των jokes
echo("&lt;P&gt;$name ($numjokes jokes)&lt;/P&gt;");
}
</pre>
<p>Χρησιμοποιήσαμε το AS στο δεύτερο query παραπάνω για να δώσουμε ένα φιλικότερο όνομα (NumJokes) στο αποτέλεσμα της COUNT(*). Η τεχνική αυτή θα δουλέψει αλλά θα χρειασθεί n+1 ξεχωριστά ερωτήματα, όπου n είναι ο αριθμός των συγγραφέων στη βάση δεδομένων. Υπάρχει, όμως, μια λύση σ’ αυτό.<br />
Προσθέτοντας την έκφραση GROUP BY σ’ ένα ερώτημα SELECT, μπορούμε να πούμε στην MySQL να ομαδοποιήσει (group) τα αποτελέσματα του ερωτήματος σε σύνολα που να έχουν την ίδια τιμή στις στήλες που έχουμε καθορίσει. Οι συναρτήσεις άθροισης, όπως είναι η COUNT(), επενεργούν μετά σ’ αυτές τις ομάδες και όχι στο συνολικό αποτέλεσμα.<br />
Το ακόλουθο query, για παράδειγμα, εμφανίζει τον αριθμό των jokes που έχουν αποδοθεί σε κάθε συγγραφέα στη βάση δεδομένων :</p>
<pre name="code" class="html">
mysql&gt; SELECT Authors.Name, COUNT(*) AS NumJokes
-&gt; FROM Jokes, Authors
-&gt; WHERE AID = Authors.ID
-&gt; GROUP BY AID;
+-----------------+----------+
| Name            | NumJokes |
+-----------------+----------+
| Kevin Yank      |        3 |
| Joan Smith      |        1 |
| Ted E. Bear     |        5 |
+-----------------+----------+
</pre>
<p>Ομαδοποιώντας τα αποτελέσματα ως προς το ID του συγγραφέα (AID), παίρνουμε μια ταξινόμηση των αποτελεσμάτων για τον κάθε συγγραφέα. Θα μπορούσαμε να είχαμε χρησιμοποιήσει και την έκφραση GROUP BY Authors.ID και να πάρουμε το ίδιο αποτέλεσμα.</p>
<h1>Η Έκφραση LEFT JOIN</h1>
<p>Μπορούμε να δούμε από τα παραπάνω αποτελέσματα ότι ο Kevin Yank έχει τρία jokes στο όνομά του, ο Joan Smith έχει ένα και ο Ted E. Bear έχει πέντε. Αυτό που δεν δείχνουν αυτά τα αποτελέσματα είναι ότι υπάρχει ένας τέταρτος συγγραφέας, η Amy Mathieson, που δεν έχει κανένα joke στο όνομά της. Εφόσον δεν υπάρχουν καταχωρήσεις στον πίνακα Jokes με AID&#8217;s που να ταιριάζει το δικό της ID, δεν θα υπάρχουν αποτελέσματα που να ικανοποιούν την έκφραση WHERE στο παραπάνω ερώτημα γι’ αυτήν και συνεπώς θα αποκλειστεί από τον πίνακα των αποτελεσμάτων.<br />
Η MySQL παρέχει μια άλλη μέθοδο για την ένωση (joining) πινάκων, δηλ. την εμφάνιση πληροφοριών από πολλούς πίνακες ταυτόχρονα, που απoκαλείται left join, και είναι σχεδιασμένη γι’ αυτήν ακριβώς την κατάσταση. Για να κατανοήσουμε πώς διαφέρουν τα left joins από τα standard joins, πρέπει πρώτα να θυμηθούμε πώς δουλεύουν τα standard joins.<br />
Η MySQL εκτελεί ένα standard join δύο πινάκων εμφανίζοντας όλους τους δυνατούς συνδυασμούς των γραμμών αυτών των πινάκων. Σε μια απλή περίπτωση, ένα standard join δύο πινάκων με δύο γραμμές για τον καθένα θα περιέχει τέσσερις γραμμές. Αφού υπολογισθούν οι γραμμές του αποτελέσματος, η MySQL μετά κοιτάει την έκφραση WHERE για να πάρει οδηγίες για το ποιες γραμμές πρέπει να εμφανισθούν, όπως για παράδειγμα εκείνες που η στήλη AID του πίνακα 1 θα ταιριάζει με τη στήλη ID του πίνακα 2.<br />
Ο λόγος που το παραπάνω δεν ικανοποιεί τους σκοπούς μας είναι ότι θα θέλαμε να συμπεριλάβουμε επίσης και τις γραμμές του πίνακα 1 (Authors) που δεν έχουν κάποιες γραμμές που να ταιριάζουν στον πίνακα 2 (Jokes). Ένα left join κάνει ό,τι ακριβώς χρειαζόμαστε, αναγκάζοντας μια γραμμή να εμφανισθεί στα αποτελέσματα για κάθε γραμμή του πρώτου (αριστερού) πίνακα, ακόμη κι αν δεν βρεθούν καταχωρήσεις που να ταιριάζουν στον δεύτερο (δεξιό) πίνακα. Αυτές οι καταχωρήσεις παίρνουν τιμές NULL γι’ όλες τις στήλες του δεξιού πίνακα.<br />
Για να κάνουμε ένα left join ανάμεσα σε δύο πίνακες στην MySQL, διαχωρίζουμε τα ονόματα των δύο πινάκων στην έκφραση FROM με το LEFT JOIN αντί με κόμμα. Γράφουμε μετά το όνομα του δεύτερου πίνακα με ON &lt;συνθήκη&gt;, όπου η &lt;συνθήκη&gt; καθορίζει τα κριτήρια ταιριάσματος των γραμμών στους δύο πίνακες. Ακολουθεί το αναθεωρημένο ερώτημα για την εμφάνιση των συγγραφέων με τον αριθμό των jokes που τους έχει αποδοθεί :</p>
<pre name="code" class="html">
mysql&gt; SELECT Authors.Name, COUNT(*) AS NumJokes
-&gt; FROM Authors LEFT JOIN Jokes
-&gt; ON AID = Authors.ID
-&gt; GROUP BY AID;
+---------------+----------+
| Name          | NumJokes |
+---------------+----------+
| Amy Mathieson |        1 |
| Kevin Yank    |        3 |
| Joan Smith    |        1 |
| Ted E. Bear   |        5 |
+---------------+----------+
</pre>
<p>Πρέπει να έχουμε υπόψη μας ότι η συνάρτηση COUNT(*) μετράει τον αριθμό των γραμμών που επιστρέφονται για κάθε συγγραφέα. Αν κοιτάξουμε στα μη ομαδοποιημένα αποτελέσματα του LEFT JOIN, θα δούμε τα εξής :</p>
<pre name="code" class="html">
mysql&gt; SELECT Authors.Name, Jokes.ID AS JokeID
-&gt; FROM Authors LEFT JOIN Jokes
-&gt; ON AID = Authors.ID;
+---------------+--------+
| Name          | JokeID |
+---------------+--------+
| Kevin Yank    |      1 |
| Kevin Yank    |      2 |
| Kevin Yank    |      4 |
| Joan Smith    |      3 |
| Ted E. Bear   |      5 |
| Ted E. Bear   |      6 |
| Ted E. Bear   |      7 |
| Ted E. Bear   |      8 |
| Ted E. Bear   |      9 |
| Amy Mathieson |   NULL |
+---------------+--------+
</pre>
<p>Τώρα η Amy Mathieson έχει μια γραμμή με τιμή NULL. Το ότι η τιμή του Joke ID είναι NULL δεν επηρεάζει την συνάρτηση COUNT(*) αυτή το μετράει σαν μια γραμμή. Αν αντί για το *, προσδιορίσουμε το όνομα μιας στήλης, όπως Jokes.ID, θα αγνοήσει τις τιμές NULL αυτής της στήλης και θα μας δώσει το αποτέλεσμα που ψάχνουμε :</p>
<pre name="code" class="html">
mysql&gt; SELECT Authors.Name, COUNT(Jokes.ID) AS NumJokes
-&gt; FROM Authors LEFT JOIN Jokes
-&gt; ON AID = Authors.ID
-&gt; GROUP BY AID;
+---------------+----------+
| Name          | NumJokes |
+---------------+----------+
| Amy Mathieson |        0 |
| Kevin Yank    |        3 |
| Joan Smith    |        1 |
| Ted E. Bear   |        5 |
+---------------+----------+
</pre>
<h1>Η Έκφραση HAVING</h1>
<p>Τι γίνεται, όμως, αν θελήσουμε μια λίστα μόνο εκείνων των συγγραφέων που δεν έχουν κανένα joke στο όνομά τους; Ας δούμε πρώτα το ερώτημα που θα επέλεγαν οι περισσότεροι χρήστες :</p>
<pre name="code" class="html">
mysql&gt; SELECT Authors.Name, COUNT(Jokes.ID) AS NumJokes
-&gt; FROM Authors LEFT JOIN Jokes
-&gt; ON AID = Authors.ID
-&gt; WHERE NumJokes = 0
-&gt; GROUP BY AID;
ERROR 1054: Unknown column 'NumJokes' in 'where clause'
</pre>
<p>Ο λόγος που η έκφραση WHERE NumJokes = 0 δεν μας έκανε τη δουλειά είναι επειδή οι συνθήκες στην έκφραση WHERE επηρεάζουν τις καταχωρήσεις που έχουν επιλεγεί πριν ομαδοποιηθούν σύμφωνα με την έκφραση GROUP BY.<br />
Έτσι, αν θελήσουμε να αποκλείσουμε από το μέτρημα τα jokes που περιέχουν τη λέξη &#8220;chicken&#8221;, θα μπορούσαμε να χρησιμοποιήσουμε την έκφραση WHERE, όμως εφόσον η στήλη NumJokes δεν υπάρχει πριν επενεργήσει η GROUP BY, θα πρέπει να χρησιμοποιήσουμε μια διαφορετική μέθοδο για να ορίσουμε συνθήκες.<br />
Οι συνθήκες που επηρεάζουν τα αποτελέσματα αφού έχει γίνει η ομαδοποίηση (grouping) πρέπει να εμφανισθούν σε μια ειδική έκφραση HAVING. Έτσι λοιπόν, το σωστό ερώτημα είναι το εξής :</p>
<pre name="code" class="html">
mysql&gt; SELECT Authors.Name, COUNT(Jokes.ID) AS NumJokes
-&gt; FROM Authors LEFT JOIN Jokes
-&gt; ON AID = Authors.ID
-&gt; GROUP BY AID
-&gt; HAVING NumJokes = 0;
+---------------+----------+
| Name          | NumJokes |
+---------------+----------+
| Amy Mathieson |        0 |
+---------------+----------+
</pre>
<p>Μερικές συνθήκες εργάζονται και στις δύο εκφράσεις HAVING και WHERE. Για παράδειγμα, αν θελήσουμε να αποκλείσουμε έναν συγκεκριμένο συγγραφέα με το όνομά του, θα μπορούσαμε να χρησιμοποιήσουμε το Authors.Name != &#8220;AuthorName&#8221; σε μια από τις εκφράσεις WHERE ή HAVING, επειδή αν φιλτράρουμε τον συγγραφέα πριν ή μετά από την ομαδοποίηση, θα πάρουμε τα ίδια αποτελέσματα.<br />
Σε μερικές περιπτώσεις, είναι πάντα καλύτερο να χρησιμοποιούμε την έκφραση WHERE, επειδή η MySQL είναι καλύτερη στο να βελτιστοποιεί εσωτερικά τέτοια ερωτήματα και έτσι εκτελούνται ταχύτερα.</p>
]]></content:encoded>
			<wfw:commentRss>http://greektuts.net/php-intro-part4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JQuery. Ποια έκδοση μου ταιριάζει;</title>
		<link>http://greektuts.net/jquery-versions/</link>
		<comments>http://greektuts.net/jquery-versions/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 07:47:37 +0000</pubDate>
		<dc:creator>KrAp</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[apostolos]]></category>
		<category><![CDATA[j]]></category>
		<category><![CDATA[j Query]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jquery versions]]></category>
		<category><![CDATA[krap]]></category>
		<category><![CDATA[kritikos]]></category>
		<category><![CDATA[query]]></category>
		<category><![CDATA[απόστολος]]></category>

		<guid isPermaLink="false">http://greektuts.net/?p=3944</guid>
		<description><![CDATA[Σε αυτό το άρθρο θα αντιμετωπίσουμε το ερώτημα, ποια έκδοση της JQuery μας ταιριάζει. Αν και τεχνικά, το δίλλημα αυτό δε λέει πολλά, ωστόσο, έχω την άποψη πως ότι μαθαίνουμε ένα προγραμματιστικό εργαλείο, οι λεπτομέρειες μπορεί να είναι σημαντικές.]]></description>
			<content:encoded><![CDATA[<p>Στο πρώτο άρθρο μου για την JQuery επέλεξα να ασχοληθώ με μία συχνή παρεξήγηση.</p>
<p>Στο τέλος του οδηγού θα μπορούμε:</p>
<ul>
<li> Να αναγνωρίζουμε τη διαφορά μεταξύ των δύο εκδόσεων της JQuery και</li>
<li>να τεκμηριώσουμε, σε πιθανό JQuery debate μεταξύ geek φίλων, τις εκάστοτε επιλογές μας</li>
</ul>
<h2><em>Προαπαιτούμενα</em></h2>
<p>Εισαγωγή στην JQuery:  <a href="http://greektuts.net/jquery-intro/" target="_blank">Μέρος 1ο</a>, <a href="http://greektuts.net/jquery-intro-part2/" target="_blank">Μέρος  2ο</a> (του Παναγιώτη Γρηγορόπουλου)</p>
<h2><em>Πριν ξεκινήσουμε…</em></h2>
<p>… θα ήθελα να επισημάνω ένα – δύο πρακτικά ζητήματα.<br />
Στη συνέχεια παρουσιάζεται ο τρόπος για να επιτευχθούν οι στόχοι που περιγράψαμε στην εισαγωγή. Θα παρατηρήσετε ότι το άρθρο ακολουθεί τη δομή:</p>
<p>Μικρή περιγραφή του τι θέλουμε να επιτύχουμε (+ επιπλέον σχόλια)<br />
Παράδειγμα κώδικα</p>
<p>Στο τέλος του άρθρου θα βρείτε συνημμένο ένα συμπιεσμένο αρχείο που περιέχει:</p>
<p>•    Τις δύο εκδόσεις της JQuery<br />
•    Συγκεντρωμένα όλα τα παραδείγματα.</p>
<p>Για να χρησιμοποιήσετε ορθά το πακέτο, το μόνο που έχετε να κάνετε είναι να το αποσυμπιέσετε σε κάποιο κατάλογο του συστήματος σας και στη συνέχεια χωρίς να κάνετε καμία αλλαγή στο περιεχόμενο του…</p>
<p>•    Κάνοντας διπλό κλικ στα αρχεία τύπου html μπορείτε να δείτε το αποτέλεσμα των παραδειγμάτων.<br />
•    Ανοίγοντας τα αρχεία τύπου html με τον αγαπημένο σας επεξεργαστή κειμένου (προσωπικά χρησιμοποιώ τον <a href="http://sourceforge.net/projects/notepad-plus/files/notepad%2B%2B releases binary/npp 5.6.8 bin/npp.5.6.8.Installer.exe/download" target="_blank">Notepad++</a> και ορίζω την γλώσσα προγραμματισμού σε Javascript) μπορείτε να δείτε τον κώδικα (html και JQuery).</p>
<p>Βεβαιωθείτε ότι δεν ξεχάσατε το μάτι της κουζίνας ανοικτό, ετοιμάστε μία κούπα καφέ ή τσάι, βάλτε απαλή μουσική και ξεκινάμε…</p>
<p><strong>Επιλέγοντας τη σωστή έκδοση της βιβλιοθήκης JQuery (…και γιατί αυτό δεν είναι βίτσιο)</strong></p>
<p>Όσοι από εσάς είχατε προηγούμενη εμπειρία με την βιβλιοθήκη JQuery, ή απλά διαβάσατε τα άρθρα που αναφέραμε ως «προαπαιτούμενα» νωρίτερα στο παρόν άρθρο, διαπιστώσατε ότι η JQuery έρχεται σε δύο εκδόσεις (production και development).</p>
<blockquote>
<p style="text-align: center;"><img class="size-full wp-image-3948 aligncenter" title="jquery_versions" src="http://greektuts.net/wp-content/uploads3/2010/06/jquery_versions.png" alt="" width="560" height="153" /></p>
</blockquote>
<p>Από τα ονόματα και μόνο, αντιλαμβάνεται κανείς τον τρόπο χρήσης. Development κατά την διαδικασία ανάπτυξης, Production όταν δημοσιεύσουμε τη δουλειά μας. Στις τάξεις των προγραμματιστών κυκλοφορεί συχνά η θεωρία «Αν δουλεύει, άστο όπως είναι!». Η φιλοσοφία αυτή δουλεύει άψογα όταν αναλαμβάνουμε να τροποποιήσουμε μια εφαρμογή του ελληνικού δημοσίου (!) . Δεν είναι όμως πανάκια.</p>
<p>Πολλές φορές είναι καλό να χρησιμοποιούμε τα σωστά εργαλεία για τις σωστές δουλειές. Η προσωπική μου συμβουλή λοιπόν, όσον αφορά την JQuery προτιμήστε να αναπτύσσετε κάνοντας χρήση της έκδοσης development και να δημοσιεύεται κάνοντας χρήση της έκδοσης production.</p>
<p><strong>Μα γιατί; Αφού δουλεύει!</strong></p>
<p>Ας δούμε μερικές διαφορές μεταξύ των δύο εκδόσεων…</p>
<h1>JQuery – Production</h1>
<p>Η επίσημη έκδοση της JQuery για χρήση στον server, δηλαδή αφότου η ιστοσελίδα μας έχει δημοσιευθεί. Όπως πιθανότατα παρατηρήσατε και στην εικόνα που παραθέσαμε νωρίτερα στο άρθρο, το μέγεθός της είναι μόλις 24 kilobytes και αποτελεί μία minified έκδοση. Είναι κατασκευασμένη έτσι ώστε να διευκολύνει την εκτέλεση στο περιβάλλον των διαφόρων servers, ταχύτερα από ότι η development έκδοση. Θα μπορούσαμε να πούμε ότι βελτιστοποιεί την εκτέλεση σε επίπεδο server.</p>
<blockquote>
<p style="text-align: center;"><img class="size-full wp-image-3947 aligncenter" title="jquery_production" src="http://greektuts.net/wp-content/uploads3/2010/06/jquery_production.png" alt="" width="578" height="388" /></p>
</blockquote>
<h1>JQuery – Development</h1>
<p>Και αυτή επίσημη έκδοση :p της JQuery όμως για τη φάση της ανάπτυξης. Αν και σαν μέγεθος αρχείου δεν μπορεί να θεωρηθεί μεγάλο (155 kilobytes), είναι περίπου 6,5 φορές η production έκδοση. Η ειδοποιός διαφορά με την production έκδοση θα έλεγα ότι έγκειται στον κώδικά τους. Όπως μπορείτε να δείτε στην εικόνα που ακολουθεί, η development έκδοση είναι γραμμένη με τρόπο κατανοητό από κάποιον που γνωρίζει JavaScript σε αντίθεση με την production έκδοση, της οποίας τον κώδικα δεν θα χαρακτηρίζαμε υπερβολικά «αναγνώσιμο».</p>
<blockquote>
<p style="text-align: center;"><img class="size-full wp-image-3946 aligncenter" title="jquery_development" src="http://greektuts.net/wp-content/uploads3/2010/06/jquery_development.png" alt="" width="579" height="576" /></p>
</blockquote>
<h1>Ας το πιστέψουμε… Πως χρησιμοποιώ τις διαφορετικές εκδόσεις στην πραγματικότητα;</h1>
<p>Το μόνο πράγμα που αλλάζει είναι το αρχείο της έκδοσης που θα συνοδεύει τον κώδικά σας και μία διαφορετική γραμμή στον κώδικά σας. Αναλυτικότερα…</p>
<p>Εάν κατεβάσετε αυτή τη στιγμή το .rar αρχείο που βρίσκεται στο τέλος του σημερινού μας άρθρου, και αφού το αποσυμπιέσετε, θα δείτε ότι περιλαμβάνει έναν φάκελο jquery_tuts_versions. Μέσα του μπορείτε να βρείτε τις τελευταίες εκδόσεις της JQuery:</p>
<p>•    jquery-1.4.2.js για την development<br />
•    jquery-1.4.2.min.js για την προduction (το min από το minified)</p>
<p>Ανάλογα με το αν αναπτύσσετε ή δημοσιεύετε τη δουλειά σας, κρατάτε το αντίστοιχο αρχείο στον κατάλογο που είναι τοποθετημένη η ιστοσελίδα σας.</p>
<p>Όσον αφορά τον κώδικα της ιστοσελίδας σας τώρα. Σε περίπτωση που βρίσκεστε σε φάση ανάπτυξης (επομένως έχετε κρατήσει το jquery-1.4.2.js στον κατάλογό σας) ο κώδικας μιας hello world ιστοσελίδας που κάνει χρήση του JQuery θα μοιάζει με τον παρακάτω:</p>
<pre name="code" class="html">
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Development phase example&lt;/title&gt;
&lt;!-- εδώ υποδεικνύουμε την έκδοση της JQuery που θα χρησιμοποιήσουμε --&gt;
&lt;script type="text/javascript" src="jquery-1.4.2.js"&gt;&lt;/script&gt;
&lt;!-- λίγη JQuery... --&gt;
&lt;script type="text/javascript"&gt;
$("document").ready(function() {
alert("Η ιστοσελίδα βρίσκεται σε φάση ανάπτυξης");
});
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
…
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Σε περίπτωση που η ιστοσελίδα σας είναι έτοιμη να δημοσιευθεί θα χρησιμοποιήσετε το αρχείο jquery-1.4.2.min.js και ο κώδικάς σας, σε σχέση με τον προηγούμενο θα είναι αλλαγμένος κατά μία γραμμή:</p>
<pre name="code" class="html">
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Production phase example&lt;/title&gt;
&lt;!-- εδώ υποδεικνύουμε την έκδοση της JQuery που θα χρησιμοποιήσουμε --&gt;
&lt;script type="text/javascript" src="jquery-1.4.2.min.js"&gt;&lt;/script&gt;
&lt;!-- λίγη JQuery... --&gt;
&lt;script type="text/javascript"&gt;
$("document").ready(function() {
alert("Η ιστοσελίδα έχει δημοσιευθεί");
});
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Σε αυτό το άρθρο αντιμετωπίσαμε το φιλοσοφικό ερώτημα, ελαφρώς ευκολότερο από το αίνιγμα της Σφίγγας, ποια έκδοση της JQuery μας ταιριάζει. Αν και τεχνικά, το δίλλημα αυτό δε λέει πολλά, ωστόσο, έχω την άποψη πως ότι μαθαίνουμε ένα προγραμματιστικό εργαλείο, οι λεπτομέρειες μπορεί να είναι σημαντικές. Σε περιπτώσεις όπως η JQuery, η χρήση της οποίας είναι συνυφασμένη με ανάπτυξη ιστοσελίδων για το διαδίκτυο, η τεκμηρίωση της παραπάνω θέσης είναι περιττή.</p>
<p>Δοκιμάστε τα παραδείγματα που συνοδεύουν το άρθρο και πειραματιστείτε ως την επόμενη συνάντησή μας…</p>
<p>Μην ξεχνάτε,</p>
<p>να είστε καλά και να φροντίζεται τον εαυτό σας.</p>
<blockquote style="text-align: center;"><p><em><strong>Μπορείτε να κατεβάσετε τα     αρχεία του βοηθήματος εδώ</strong></em></p>
<p style="text-align: center;"><a href="http://greektuts.net/wp-content/uploads3/2010/06/jquery_tuts_versions.zip" target="_blank"><em><strong><img src="../wp-content/uploads/2009/10/membersdownload1.png" alt="download" width="200" height="200" /></strong></em></a></p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://greektuts.net/jquery-versions/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>CSS Super Hero</title>
		<link>http://greektuts.net/css-super-hero/</link>
		<comments>http://greektuts.net/css-super-hero/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 06:00:23 +0000</pubDate>
		<dc:creator>Pantso</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[box model]]></category>
		<category><![CDATA[cascading style sheets]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[css super hero]]></category>
		<category><![CDATA[css tutorial]]></category>
		<category><![CDATA[greektuts]]></category>
		<category><![CDATA[id]]></category>
		<category><![CDATA[super hero]]></category>
		<category><![CDATA[βοήθημα css]]></category>
		<category><![CDATA[Δωρεάν]]></category>
		<category><![CDATA[μαθήματα]]></category>

		<guid isPermaLink="false">http://greektuts.net/?p=3935</guid>
		<description><![CDATA[Ακολουθήστε και εσείς την νέα μας σειρά βοηθημάτων, για την εκμάθηση των CSS. Σε αυτήν την σειρά, θα μάθουμε τα πάντα για τα CSS, από επίπεδο αρχάριου, μέχρι επίπεδο Super Hero! Μετατρέψτε και εσείς την αγάπη σας για το design σε χόμπυ, αλλά ακόμα και σε επάγγελμα. Διαβάστε περισσότερα για την σειρά CSS Super Hero]]></description>
			<content:encoded><![CDATA[<p>Τα <a href="http://greektuts.net/category/programming/css/" target="_self">CSS</a>, ή αλλιώς Cascading Style Sheers, είναι ο καλύτερος τρόπος για να δώσουμε ζωή σε μια ιστοσελίδα. Λέγοντας ζωή, εννοούμε χρώμα, στύλ, εικόνες περιγράμματα, και ότι άλλο μπορούμε να φανταστούμε. Στην νέα μας σειρά, <strong>CSS Super Hero</strong>, θα μάθουμε τα πάντα από επίπεδο αρχάριου, μέχρι επαγγελματία, για τα <a href="http://greektuts.net/category/programming/css/">CSS</a>, και θα καλύψουμε σχεδόν κάθε περίπτωση χρήσης των <a href="http://greektuts.net/category/programming/css/">CSS</a> στον σχεδιασμό και την ανάπτυξη ιστοσελίδων.</p>
<p>Αναλυτικότερα θα δούμε :</p>
<ul>
<li>Τις βασικές αρχές</li>
<li>Την σύνταξη</li>
<li>Τις κλάσσεις και τα IDs</li>
<li>Πως δίνουμε στύλ με τα CSS</li>
<li>Την επεξήγηση του Box Model</li>
</ul>
<p>Σε κάθε άρθρο θα έχουμε πληθώρα παραδειγμάτων κώδικα, αλλά και όλα τα αρχεία παραδειγμάτων <a href="http://greektuts.net/category/freebies/">ΔΩΡΕΑΝ</a> προς κατέβασμα για όλους τους αναγνώστες μας.</p>
<p>Tέλος για τους <a href="http://greektuts.net/subscriptions/" target="_blank">συνδρομητές</a> μας, όλα τα βοηθήματα, θα παρέχονται και σε βίντεο !</p>
<p>Μείνετε μαζί μας, και γίνετε και εσείς ένας <strong>CSS Super Hero</strong> !!!</p>
<p>Παρακαλουθήστε τα άθρα καθώς αυτά δημοσιεύνται</p>
<blockquote>
<p style="text-align: center;"><a href="http://greektuts.net/css-superhero-basic-principles/" target="_self"><img src="../wp-content/uploads3/2010/07/csssuperhero_part1.jpg" alt="Post Pic" width="106" height="106" /></a></p>
<p style="text-align: center;"><a href="http://greektuts.net/css-superhero-basic-principles/" target="_self">Βασικές Αρχές</a></p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://greektuts.net/css-super-hero/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Μαθαίνοντας Python – Μέρος 6α</title>
		<link>http://greektuts.net/python-part-6a/</link>
		<comments>http://greektuts.net/python-part-6a/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 06:30:58 +0000</pubDate>
		<dc:creator>KrAp</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[krap]]></category>
		<category><![CDATA[απόστολος]]></category>
		<category><![CDATA[απόστολος κρητικός]]></category>
		<category><![CDATA[Γλώσσα Προγραμματισμού]]></category>
		<category><![CDATA[Προγραμματισμός]]></category>

		<guid isPermaLink="false">http://greektuts.net/?p=3928</guid>
		<description><![CDATA[Μετά από απουσία αρκετών μηνών, ήρθε η στιγμή να συνεχίσουμε το οδοιπορικό μας στην γλώσσα Python περνώντας πια σε προχωρημένα θέματα. Στο σημερινό μας άρθρο θα μιλήσουμε για συναρτήσεις (functions).]]></description>
			<content:encoded><![CDATA[<p>Οι συναρτήσεις αποτελούν χαρακτηριστικό κλειδί σε πολλές γλώσσες προγραμματισμού. Δεν θα μπορούσαν λοιπόν να απουσιάζουν και από την Python. Μία συνάρτηση στο προγραμματισμό λειτουργεί αντίστοιχα με μια μαθηματική συνάρτηση με μόνη (ίσως) διαφορά ότι στις προγραμματιστικές συναρτήσεις το αποτέλεσμα των συναρτήσεων <span style="text-decoration: underline;">μπορεί να επιστραφεί (με τη μορφή κάποιου αντικειμένου) ή όχι</span>.</p>
<p>Στο τέλος του οδηγού θα μπορούμε:</p>
<ul>
<li>Να ορίσουμε συναρτήσεις με σταθερές τιμές παραμέτρων</li>
<li>Να ορίσουμε συναρτήσεις με παραμέτρους που αποτελούν λέξεις &#8211; κλειδιά</li>
<li>Να ορίσουμε συναρτήσεις με λίστες για παραμέτρους</li>
<li>Να δημιουργήσουμε ανώνυμες συναρτήσεις τύπου lambda</li>
<li>Να τεκμηριώνουμε σωστά τις συναρτήσεις μας</li>
</ul>
<p>Για την καλύτερη κατανόηση αυτού του αντικειμένου ο συγκεκριμένος οδηγός χωρίστηκε σε δύο τμήματα…</p>
<h1>Προαπαιτούμενα</h1>
<p><strong> </strong></p>
<p>Μαθαίνοντας Python:  <a href="../archives/1571">Μέρος Ι</a>, <a href="../archives/1713">Μέρος  ΙΙ</a>, <a href="../archives/1838">Μέρος ΙΙΙ</a>, <a href="../archives/1930">Μέρος IV</a>, <a href="../python-part5/">Μέρος V</a></p>
<h1>Πριν ξεκινήσουμε…</h1>
<p><strong> </strong></p>
<p>… θα ήθελα να επισημάνω ένα – δύο πρακτικά ζητήματα.</p>
<p>Στη συνέχεια παρουσιάζεται ο τρόπος για να επιτευχθούν οι στόχοι που περιγράψαμε στην εισαγωγή. Θα παρατηρήσετε ότι το άρθρο ακολουθεί τη δομή:</p>
<p><em>Μικρή περιγραφή του τι θέλουμε να επιτύχουμε (+ επιπλέον σχόλια)</em></p>
<p><em>Παράδειγμα κώδικα</em></p>
<p>Στο τέλος του αρχείου θα βρείτε συνημμένο ένα python script που περιέχει συγκεντρωμένα όλα τα παραδείγματα.</p>
<p>Για να τα χρησιμοποιήσετε, αντιγράφετε το εκάστοτε παράδειγμα σε ένα νέο αρχείο python και το εκτελείτε (βλ. <a title="Permanent Link to Μαθαίνοντας Python – Μέρος 1ο" href="../archives/1571">Μαθαίνοντας Python – Μέρος 1ο</a> ). Τα παραδείγματα είναι φτιαγμένα με τέτοιον τρόπο ώστε να τυπώνουν τα αποτελέσματα στην οθόνη ώστε να μπορείτε να πιστοποιήσετε εύκολα τη λειτουργικότητά τους. Για διευκόλυνσή σας έχουμε χωρίσει τα παραδείγματα με σχόλια που δίνουν μια μικρή περιγραφή του τι επιχειρούμε κάθε φορά.</p>
<p>Βεβαιωθείτε ότι δεν ξεχάσατε το μάτι της κουζίνας ανοικτό, ετοιμάστε μία κούπα καφέ ή τσάι, βάλτε απαλή μουσική και ξεκινάμε…</p>
<h1>Συντάσσοντας μια συνάρτηση </h1>
<pre name="code" class="python">
def triangle_area(a, b):

area = a * b / 2

print("Το εμβαδό του τριγώνου είναι:", area)
</pre>
<p>Παραπάνω μπορείτε να δείτε την βασική δήλωση της συνάρτησης υπολογισμού του εμβασδού τριγώνου. Αρχικά δηλώνουμε τη συνάρτηση χρησιμοποιώντας την δεσμευμένη λέξη def ακολουθούμενη από το όνομα της συνάρτησης (στην προκειμένη περίπτωση triangle_area). Σε παρένθεση τοποθετούνται οι απαιτούμενες παράμετροι (a, b) που στην προκειμένη περίπτωση υποδηλώνουν την βάση και το ύψος του τριγώνου αντίστοιχα). Στη συνέχεια μια νέα μεταβλητή ορίζεται, η μεταβλητή area, στην οποία θα ανατεθεί το αποτέλεσμα της φόρμουλας υπολογισμού του εμβαδού του τριγώνου (βάση * ύψος / 2). Τέλος η συνάρτηση αναλαμβάνει να εκτυπώσει το αποτέλεσμα στην οθόνη.</p>
<p><strong> </strong></p>
<h1>Κλήση συνάρτησης</h1>
<p><strong> </strong></p>
<p>Η κλήση μιας συνάρτησης σε Python γίνεται γράφοντας απλά το όνομα της συνάρτησης και περικλείοντας μέσα σε παρένθεση τις τιμές των παραμέτρων (εφόσον χρειάζεται). Έτσι για να χρησιμοποιήσουμε την συνάρτηση που ορίσαμε λίγο νωρίτερα χρησιμοποιούμε την παρακάτω γραμμή κώδικα.</p>
<pre name="code" class="python">
triangle_area(66, 2010)
</pre>
<p>Προφανώς η ύπαρξη παραμέτρων σε μία συνάρτηση δεν είναι υποχρεωτική. Ας δούμε μαζί την δήλωση της παρακάτω απλής συνάρτησης που τυπώνει ένα συγκεκριμένο μήνυμα στην κονσόλα όταν κληθεί:</p>
<pre name="code" class="python">
def no_params_function():

print("Αυτή η συνάρτηση δε δέχεται παραμέτρους...")
</pre>
<p>Όπως παρατηρείτε η παρένθεση δεν περιέχει τίποτε, δηλαδή δεν έχουν δηλωθεί παράμετροι. Η κλήση αυτής της συνάρτησης γίνεται ως εξής…</p>
<pre name="code" class="python">
no_params_function()
</pre>
<p>και όπως θα δείτε αν το δοκιμάσετε, δουλεύει άψογα παρόλη την απουσία των παραμέτρων.</p>
<p><strong> </strong></p>
<h1>Αναθέτοντας μια συνάρτηση σε μια μεταβλητή </h1>
<p><strong> </strong></p>
<p>Ναι! Είναι εφικτό. Στην Python μια συνάρτηση μπορεί να ανατεθεί σε μια μεταβλητή (ακόμη ένα σημείο που υποδηλώνει τη δύναμη της συγκεκριμένης γλώσσας προγραμματισμού.</p>
<pre name="code" class="python">
aVariable = triangle_area

aVariable(5,8)
</pre>
<p>Αν τρέξετε τον παραπάνω κώδικα θα διαπιστώσετε ότι θα πάρετε τα ίδια αποτελέσματα με αυτά που θα παίρνατε αν χρησιμοποιούσατε την αρχική συνάρτηση triangle_area(x,y) που δημιουργήσαμε νωρίτερα. Ας δούμε όμως αναλυτικότερα τις δύο αυτές γραμμές.</p>
<p>Στην πρώτη γραμμή αναθέτουμε την συνάρτησή μας στην μεταβλητή aVariable. Δώστε προσοχή στην απουσία παραμέτρων. Αυτό συμβαίνει γιατί δεν θέλουμε να γίνει ανάθεση της συνάρτησής μας για δύο συγκεκριμένες τιμές αλλά του μηχανισμού της.</p>
<p>Έτσι, στην δεύτερη γραμμή, συμπεριφερόμαστε στην μεταβλητή aVariable σαν να είναι η συνάρτησή μας. Για αυτόν τον λόγο και η το όνομα της μεταβλητής μας ακολουθείται από την παρένθεση με τις παραμέτρους που θα ορίζαμε αν τρέχαμε την αρχική μας συνάρτηση. Δοκιμάστε το και θα διαπιστώσετε ότι το αποτέλεσμα είναι σωστό.</p>
<h1>Επιστροφή του αποτελέσματος αντί για εκτύπωση</h1>
<p><strong> </strong></p>
<p>Ας δούμε άλλη μια εκδοχή της αγαπημένης μας συνάρτησης υπολογισμού του εμβαδού τριγώνου J.</p>
<pre name="code" class="python">
def triangle_area_return(a, b):

area = a * b / 2

return area
</pre>
<p>Σε αυτήν την εκδοχή της συνάρτησής μας ο προσεκτικός αναγνώστης παρατηρεί (εκτός από το διαφορετικό όνομα της συνάρτησης) μία ακόμη σημαντική διαφορά. Αντί για τη γραμμή εκτύπωσης του αποτελέσματος, χρησιμοποιούμε την δεσμευμένη λέξη return. Αυτή η αλλαγή έχει σαν αποτέλεσμα η τιμή του αποτελέσματος <span style="text-decoration: underline;">να επιστρέφεται αντί να εκτυπώνεται</span>.</p>
<p>Έτσι, αν θέλουμε να εμφανίσουμε το αποτέλεσμα της συνάρτησης αυτής θα πρέπει να εκτελέσουμε την παρακάτω γραμμή κώδικα:</p>
<pre name="code" class="python">
print( triangle_area_return( 5, 5 ) )
</pre>
<p>Δοκιμάστε να εκτελέσετε την ίδια γραμμή χωρίς να περικλείεται από την εντολή print( ) και θα διαπιστώσετε ότι τίποτε δε συμβαίνει.</p>
<p><strong> </strong></p>
<h1>Πως το χρησιμοποιώ πραγματικά;</h1>
<p><strong> </strong></p>
<p>Οι συναρτήσεις χρησιμοποιούνται συνήθως για να υλοποιούν συχνά χρησιμοποιούμενες διαδικασίες. Πολύ συχνά το αποτέλεσμα μιας συνάρτησης χρειάζεται να τροφοδοτήσει μία άλλη. Αυτό επιτυγχάνεται με τη χρήση της return. Ας το δούμε στην πράξη:</p>
<p>Υπενθυμίζω την τελευταία έκδοση της συνάρτησής μας:</p>
<pre name="code" class="python">
def triangle_area_return(a, b):

area = a * b / 2

return area
</pre>
<p>Δημιουργούμε μία δεύτερη, πολύ απλή συνάρτηση η οποία λαμβάνει στην είσοδο ένα εμβαδό και τυπώνει ένα ειδικά διαμορφωμένο μήνυμα…</p>
<pre name="code" class="python">
def print_triangle_area_return(data):

print("Το εμβαδό του τριγώνου που διάβασα είναι:", data)
</pre>
<p>…στην τιμή myData ανατίθεται το αποτέλεσμα της συνάρτησης υπολογισμού του εμβαδού…</p>
<pre name="code" class="python">
myData = triangle_area_return(2, 155)
</pre>
<p>…τέλος τροφοδοτούμε το περιεχόμενο του myData στην συνάρτηση εκτύπωσης:</p>
<pre name="code" class="python">
print_triangle_area_return(myData)
</pre>
<p>Σε αυτό το άρθρο πήραμε μία γεύση από τα σημαντικότερα σημεία ορισμού και διαχείρισης συναρτήσεων σε Python. Μείνετε συντονισμένη για τη συνέχεια του οδηγού στον οποίο και θα ολοκληρωθεί το αντικείμενο αυτό.</p>
<p>Μέχρι τότε,</p>
<p><em><span style="text-decoration: underline;">να είστε καλά και να φροντίζεται τον εαυτό σας</span></em>.</p>
<p><strong><p style="text-align: center; font-weight: bold;"><br><img src="http://greektuts.net/images/GTMemberAccess.png" alt="Member Area" /> <br>Άν είστε ήδη συνδρομητής κάντε login με τα στοιχεία σας. Για να γίνετε συνδρομητής πατήστε <a href="/wp-login.php?action=register">εδώ</a> </p></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://greektuts.net/python-part-6a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eiσαγωγή στην PHP Μέρος 3</title>
		<link>http://greektuts.net/php-intro-part3/</link>
		<comments>http://greektuts.net/php-intro-part3/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 06:22:55 +0000</pubDate>
		<dc:creator>Pantso</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[intro]]></category>
		<category><![CDATA[introduction]]></category>
		<category><![CDATA[εισαγωγή στην php μέρος 3]]></category>

		<guid isPermaLink="false">http://greektuts.net/?p=3915</guid>
		<description><![CDATA[Στο δεύτερο μέρος της εισαγωγής στην PHP μιλήσαμε για τα Regular Expressions, για την μορφωποίηση των κειμένων, τις παραγράφους και τους υπερσύνδεσμους. Στο τρίτο μέρος, θα μιλήσουμε περί περιεχομένου, θα δούμε κάποια προχωρημένα πράγματα για SQL, και θα δούμε τέλος και την ταξινόμηση με την Order By]]></description>
			<content:encoded><![CDATA[<h1><strong>Διαχωρισμός Κειμένου σε Σελίδες</strong></h1>
<p>Αν και κανένα joke δεν είναι πιθανό να είναι τόσο μεγάλο που να χρειάζεται περισσότερες από μία σελίδες, πολλά content-driven sites περιέχουν μεγάλο περιεχόμενο που είναι συχνά καλύτερο να παρουσιασθεί διασπασμένο σε σελίδες. Υπάρχει μια ακόμη συνάρτηση στην PHP που το κάνει αυτό πολύ εύκολα. Η <em>split</em><em>()</em> είναι μια συνάρτηση που δέχεται μια κανονική έκφραση και ένα string κειμένου και χρησιμοποιεί ταιριάσματα για την κανονική έκφραση για να διασπάσει το κείμενο σ’ έναν πίνακα (array). Ας δούμε το ακόλουθο παράδειγμα :</p>
<pre name="code" class="php">
$regexp="[ \n\r\t]+";   // Ένας ή περισσότεροι whitespace characters
$text="This is a test.";
$textarray=split($regexp, $text);
echo("$textarray[0]&lt;BR&gt;");         // Εμφανίζει "This&lt;BR&gt;"
echo("$textarray[1]&lt;BR&gt;");         // Εμφανίζει "is&lt;BR&gt;"
echo("$textarray[2]&lt;BR&gt;");         // Εμφανίζει "a&lt;BR&gt;"
echo("$textarray[3]&lt;BR&gt;");         // Εμφανίζει "test.&lt;BR&gt;"
</pre>
<p>Αν αντί να αναζητούμε έναν whitespace character αναζητούμε ένα [PAGEBREAK] tag και αντί να εμφανίζουμε όλα τα κομμάτια του κειμένου εμφανίσουμε μόνο τη σελίδα που μας ενδιαφέρει, η οποία δείχνεται από μια μεταβλητή $page που μεταβιβάζεται μαζί με την αίτηση για τη σελίδα (page request), για παράδειγμα, μπορούμε να διαιρέσουμε το περιεχόμενο σε σελίδες.</p>
<pre name="code" class="php">
// Αν δεν έχει καθορισθεί κάποια σελίδα, default είναι η
// πρώτη σελίδα ($page = 0)
if (!isset($page)) $page = 0;
// Διαιρούμε το κείμενο σ’ έναν πίνακα (array) από σελίδες
$textarray=split("\[PAGEBREAK]", $text);
// Επιλέγουμε τη σελίδα που θέλουμε
$pagetext=$textarray[$page];
$regexp="[ \n\r\t]+";   // Ένας ή περισσότεροι whitespace characters
$text="This is a test.";
$textarray=split($regexp, $text);
echo("$textarray[0]&lt;BR&gt;");         // Εμφανίζει "This&lt;BR&gt;"
echo("$textarray[1]&lt;BR&gt;");         // Εμφανίζει "is&lt;BR&gt;"
echo("$textarray[2]&lt;BR&gt;");         // Εμφανίζει "a&lt;BR&gt;"
echo("$textarray[3]&lt;BR&gt;");         // Εμφανίζει "test.&lt;BR&gt;"
</pre>
<p>Αν αντί να αναζητούμε έναν whitespace character αναζητούμε ένα [PAGEBREAK] tag και αντί να εμφανίζουμε όλα τα κομμάτια του κειμένου εμφανίσουμε μόνο τη σελίδα που μας ενδιαφέρει, η οποία δείχνεται από μια μεταβλητή $page που μεταβιβάζεται μαζί με την αίτηση για τη σελίδα (page request), για παράδειγμα, μπορούμε να διαιρέσουμε το περιεχόμενο σε σελίδες.</p>
<pre name="code" class="php">
// Αν δεν έχει καθορισθεί κάποια σελίδα, default είναι η
// πρώτη σελίδα ($page = 0)
if (!isset($page)) $page = 0;
// Διαιρούμε το κείμενο σ’ έναν πίνακα (array) από σελίδες
$textarray=split("\[PAGEBREAK]", $text);
// Επιλέγουμε τη σελίδα που θέλουμε
$pagetext=$textarray[$page];
</pre>
<p>Φυσικά, θα θελήσουμε να έχουμε κάποιον τρόπο μετακίνησης ανάμεσα στις σελίδες. Θα τοποθετήσουμε έναν σύνδεσμο (link) προς την προηγούμενη σελίδα στην κορυφή της τρέχουσας σελίδας και έναν σύνδεσμο προς την επόμενη σελίδα στη βάση της τρέχουσας σελίδας. Αν αυτή είναι η πρώτη σελίδα δεν θα χρειασθούμε ένα link προς την προηγούμενη σελίδα. Γνωρίζουμε ότι βρισκόμαστε στην πρώτη σελίδα αν το $page είναι ίσο με 0. Παρόμοια, δεν χρειαζόμαστε ένα link προς την επόμενη σελίδα όταν βρισκόμαστε στην τελευταία σελίδα.</p>
<p>Για να είμαστε σίγουροι ότι βρισκόμαστε στην τελευταία σελίδα, χρειαζόμαστε μια συνάρτηση της PHP με όνομα <em>count</em><em>()</em>, η οποία δέχεται έναν πίνακα (array) και επιστρέφει τον αριθμό των στοιχείων του πίνακα. Αν μεταβιβάσουμε τον πίνακα των σελίδων, η count() θα μας πει πόσες σελίδες υπάρχουν. Αν υπάρχουν 10 σελίδες, τότε το $textarray[9] θα περιέχει την τελευταία σελίδα. Έτσι, γνωρίζουμε ότι βρισκόμαστε στην τελευταία σελίδα αν το $page είναι ίσο με count($textarray) – 1.</p>
<p>Ο κώδικας για τα links μετάβασης ανάμεσα στις σελίδες είναι ο εξής :</p>
<pre name="code" class="php">
if ($page != 0) {
$prevpage = $page - 1;
echo("&lt;P&gt;&lt;A HREF=\"$PHP_SELF?id=$id&amp;page=$prevpage\"&gt;".
"Προηγούμενη Σελίδα&lt;/A&gt;&lt;/P&gt;");
}
// Το περιεχόμενο της σελίδας εμφανίζεται εδώ …
if ($page &lt; count($textarray) - 1) {
$nextpage = $page + 1;
echo("&lt;P&gt;&lt;A HREF=\"$PHP_SELF?id=$id&amp;page=$nextpage\"&gt;".
"Επόμενη Σελίδα&lt;/A&gt;&lt;/P&gt;");
}
</pre>
<p>Ολόκληρος ο κώδικας για την εμφάνιση του κειμένου του joke είναι ως εξής :</p>
<pre name="code" class="php">
&lt;!-- joke.php --&gt;
...
// Παίρνουμε (get) το κείμενο του joke από τη βάση δεδομένων
$joke = mysql_query("SELECT JokeText FROM Jokes ".
"WHERE ID=$id");
$joke = mysql_fetch_array($joke);
$joketext = $joke["JokeText"];
// Φιλτράρουμε τον HTML κώδικα
$joketext = htmlspecialchars($joketext);
// Αν δεν έχει καθορισθεί κάποια σελίδα, default είναι η πρώτη σελίδα
($page = 0)
if (!isset($page)) $page = 0;
// Διαιρούμε το κείμενο σ’ έναν πίνακα (array) από σελίδες
$textarray=split("\[PAGEBREAK]",$joketext);
// Επιλέγουμε τη σελίδα που θέλουμε
$joketext=$textarray[$page];
// Bold και italics
$joketext = eregi_replace("\[b]","&lt;B&gt;", $joketext);
$joketext = eregi_replace("\[eb]","&lt;/B&gt;", $joketext);
$joketext = eregi_replace("\[i]","&lt;I&gt;", $joketext);
$joketext = eregi_replace("\[ei]","&lt;/I&gt;", $joketext);
// Παράγραφοι και αλλαγές γραμμών
$joketext = ereg_replace("\r", "", $joketext);
$joketext = ereg_replace("\n\n", "&lt;P&gt;", $joketext);
$joketext = ereg_replace("\n", "&lt;BR&gt;", $joketext);
// Υπερσύνδεσμοι (Hyperlinks)
$joketext = ereg_replace(
"\[L]([-_./a-zA-Z0-9!&amp;%#?,'=:~]+)\[EL]",
"&lt;A HREF=\"\\1\"&gt;\\1&lt;/A&gt;", $joketext);
$joketext = ereg_replace(
"\[L=([-_./a-zA-Z0-9!&amp;%#?,'=:~]+)]".
"([-_./a-zA-Z0-9 !&amp;%#?,'=:~]+)\[EL]",
"&lt;A HREF=\"\\1\"&gt;\\2&lt;/A&gt;", $joketext);
if ($page != 0) {
$prevpage = $page - 1;
echo("&lt;P&gt;&lt;A HREF=\"$PHP_SELF?id=$id&amp;page=$prevpage\"&gt;".
"Προηγούμενη Σελίδα&lt;/A&gt;&lt;/P&gt;");
}
echo( "&lt;P&gt;$joketext" );
if ($page &lt; count($textarray) - 1) {
$nextpage = $page + 1;
echo("&lt;P&gt;&lt;A HREF=\"$PHP_SELF?id=$id&amp;page=$nextpage\"&gt;".
"Επόμενη Σελίδα&lt;/A&gt;&lt;/P&gt;");
}
...
</pre>
<h1><strong>Αυτόματη Υποβολή Περιεχομένου</strong></h1>
<p>Θα δούμε τώρα πώς μπορούμε να δεχόμαστε jokes αλλά να μην εμφανίζονται αμέσως στο site. Θα προσθέσουμε μια νέα στήλη στον πίνακα Jokes με όνομα Visible η οποία θα δέχεται μόνο μία από δύο τιμές : &#8216;Y&#8217; και &#8216;N&#8217;. Τα νέα jokes που θα υποβάλλονται θα γίνονται ίσα με Visible=&#8217;N&#8217; αυτόματα και δεν θα μπορούν να αποκλειστούν από το να εμφανισθούν στο site, προσθέτοντας απλά την έκφραση WHERE Visible=&#8217;Y&#8217; σ’ ένα ερώτημα (query) του πίνακα Jokes για το οποίο τα αποτελέσματα προορίζονται για κοινή θέα.</p>
<p>Τα jokes που έχουν τη στήλη Visible=&#8217;N&#8217; θα βρίσκονται στη βάση δεδομένων περιμένοντας τροποποίηση από έναν content manager, ο οποίος θα μπορεί να τα τροποποιήσει πριν τα κάνει ορατά ή απλά να τα διαγράψει αμέσως. Η δημιουργία μιας στήλης που μπορεί να περιέχει μία από δύο τιμές, η μια από τις οποίες είναι η προκαθορισμένη (default), έχει να κάνει μ’ ένα νέο είδος στήλης της MySQL που αποκαλείται <em>ENUM</em> :</p>
<pre name="code" class="php">
mysql&gt; ALTER TABLE Jokes ADD COLUMN
-&gt; Visible ENUM('N', 'Y') NOT NULL;
</pre>
<p>Η πρώτη τιμή που υπάρχει στις παρενθέσεις, δηλ. το &#8216;N&#8217; στην προκειμένη περίπτωση, είναι η προκαθορισμένη (default) τιμή, η οποία εκχωρείται στις νέες καταχωρήσεις αν δεν έχει καθορισθεί μια τιμή στην εντολή INSERT.</p>
<h1><strong>Προχωρημένη </strong><strong>SQL</strong></h1>
<p>Καθώς έχουμε δουλέψει με το παράδειγμα ενός Internet Joke Database website, είχαμε την ευκαιρία να εξερευνήσουμε τις περισσότερες πλευρές της Structured Query Language (SQL), από την βασική μορφή του ερωτήματος CREATE TABLE μέχρι τους δύο τρόπους σύνταξης των ερωτημάτων INSERT. Θα δούμε τώρα μερικά ακόμα τρικ της SQL που δεν τα έχουμε συναντήσει.</p>
<h1><strong>Ταξινόμηση με την </strong><strong>ORDER</strong><strong> </strong><strong>BY</strong></h1>
<p>Η <em>Order</em><em> </em><em>By</em> είναι μια προαιρετική έκφραση σ’ ένα ερώτημα SELECT με την οποία μπορούμε να καθορίσουμε μια στήλη (column) για να ταξινομήσουμε τον πίνακα των αποτελεσμάτων. Για παράδειγμα, για να ταξινομήσουμε με βάση τη στήλη Name του πίνακα Authors, δίνουμε την εξής εντολή :</p>
<pre name="code" class="php">
mysql&gt; SELECT Name, eMail FROM Authors ORDER BY Name;

+-----------------+----------------------+
| Name            | eMail                |
+-----------------+----------------------+
| Antonopoulos Antonis| ant@hellas.gr |
| Basileiadis Basileios| bas@hellas.gr|
| Konstantinou Konstantinos| kon@hellas.gr |
| Papadopoulos Nikolaos|pap@hellas.gr |
+-----------------+----------------------+
</pre>
<p>Αν προσθέσουμε τη λέξη κλειδί <em>DESC</em> μετά από το όνομα της στήλης ταξινόμησης, τα αποτελέσματα θα εμφανισθούν σε φθίνουσα σειρά, ως εξής :</p>
<pre name="code" class="php">
mysql&gt; SELECT Name, eMail FROM Authors ORDER BY Name DESC;

+-----------------+----------------------+
| Name            | eMail                |
+-----------------+----------------------+
| Papadopoulos Nikolaos | pap@hellas.gr|
| Konstantinou Konstantinos | kon@hellas.gr|
| Basileiadis Basileios| bas@hellas.gr|
| Antonopoulos Antonis|ant@hellas.gr|
+-----------------+----------------------+
</pre>
<p>Μπορούμε να ταξινομήσουμε και με βάση περισσότερες από μία στήλες, χωρίζοντάς τες με κόμμα στην έκφραση ORDER BY, οπότε η MySQL θα ταξινομήσει τις καταχωρήσεις με βάση την πρώτη στήλη, μετά με βάση τη δεύτερη στήλη όπου υπάρχουν ίδιες τιμές στην πρώτη στήλη κοκ. Μπορούμε να χρησιμοποιήσουμε τη λέξη κλειδί DESC σε όποια στήλη θέλουμε στην έκφραση ORDER BY για να αντιστρέψουμε τη σειρά ταξινόμησης.</p>
<h1><strong>Η Έκφραση </strong><strong>LIMIT</strong></h1>
<p>Συχνά θα εργαζόμαστε μ’ έναν μεγάλο πίνακα μιας βάσης δεδομένων, αλλά θα μας ενδιαφέρουν λίγες μόνο καταχωρήσεις του. Ας υποθέσουμε ότι θέλουμε να παρακολουθούμε τη δημοτικότητα των διάφορων jokes στο site. Θα μπορούμε να προσθέσουμε μια στήλη με όνομα TimesViewed στον πίνακα Jokes.</p>
<p>Ξεκινώντας με μια τιμή 0 για τα καινούργια jokes και προσθέτοντας το 1 στην τιμή του joke που ζητήθηκε κάθε φορά που εμφανίζεται η σελίδα του joke, θα μπορούμε να παρακολουθούμε πόσες φορές έχει διαβασθεί το κάθε joke στη βάση δεδομένων.</p>
<p>Ο PHP κώδικας για το query που αυξάνει κατά 1 τη στήλη TimesViewed ενός joke μ’ ένα δεδομένο ID, είναι ως εξής :</p>
<pre name="code" class="php">
$sql = "UPDATE Jokes SET TimesViewed=TimesViewed+1 ".
"WHERE ID=$id";
if (!mysql_query($sql)) {
echo("&lt;P &gt; Λάθος στην πρόσθεση ".
"γι' αυτό το joke! &lt;/P&gt;\n");
}
</pre>
<p>Μια κοινή χρήση αυτού του μετρητή θα ήταν για να παρουσιάσουμε μια λίστα των &#8220;Top 10 Jokes&#8221; στην πρώτη σελίδα του site, για παράδειγμα. Μπορούμε να χρησιμοποιήσουμε την έκφραση <em>ORDER</em><em> </em><em>BY</em><em> </em><em>TimesViewed</em><em> </em><em>DESC</em> για να εμφανίσουμε τα jokes από τις υψηλότερες προς τις χαμηλότερες τιμές της στήλης TimesViewed. Θα πρέπει απλά να επιλέξουμε τις 10 πρώτες τιμές από την κορυφή της λίστας.</p>
<p>Με την έκφραση (clause) <em>LIMIT</em> μπορούμε να καθορίσουμε ότι θέλουμε έναν μόνο συγκεκριμένο αριθμό αποτελεσμάτων. Σύμφωνα με το παραπάνω παράδειγμα, χρειαζόμαστε μόνο τα 10 πρώτα :</p>
<pre name="code" class="php">
$sql = "SELECT * FROM Jokes ORDER BY TimesViewed
DESC LIMIT 10";
</pre>
<p>Επίσης, θα μπορούμε να αποφύγουμε τη λέξη κλειδί DESC και να εμφανίσουμε τα 10 λιγότερο δημοφιλή jokes. Το επόμενο query θα εμφανίσει από το 21<sup>ο</sup> έως το 25<sup>ο</sup> πιο δημοφιλή jokes :</p>
<pre name="code" class="php">
$sql = "SELECT * FROM Jokes ORDER BY TimesViewed
DESC LIMIT 20, 5";
</pre>
<p>Πρέπει να έχουμε υπόψη μας ότι η πρώτη καταχώρηση στη λίστα των αποτελεσμάτων έχει αριθμό 0 και έτσι η 21<sup>η</sup> καταχώρηση της λίστας θα έχει αριθμό 20.</p>
<h1><strong>Οι Εκφράσεις </strong><strong>LOCK</strong><strong> και </strong><strong>UNLOCK</strong></h1>
<p>Στο ερώτημα UPDATE που χρησιμοποιήσαμε παραπάνω, υπάρχει ένας μικρός κίνδυνος. Τι θα συμβεί αν τη στιγμή που αλλάζει η τιμή της στήλης TimesViewed, κάποιος άλλος χρήστης εμφανίσει το ίδιο joke; Το PHP script θα εκτελεσθεί για δεύτερη φορά για την καινούργια αίτηση (request). Όταν εκτέλεσε το SELECT για να πάρει την τρέχουσα τιμή της στήλης TimesViewed, θα πήρε την ίδια τιμή με το πρώτο script, επειδή η τιμή δεν έχει ακόμη ενημερωθεί.</p>
<p>Και τα δύο scripts θα προσθέσουν μετά το 1 στην ίδια τιμή και θα γράψουν την καινούργια τιμή στον πίνακα. Το αποτέλεσμα θα είναι ότι δύο χρήστες είδαν το joke, αλλά ο μετρητής TimesViewed αυξήθηκε μόνο κατά 1. Για να αποφύγουμε προβλήματα όπως το παραπάνω, μπορούμε να κλειδώσουμε έναν ή περισσότερους πίνακες με τους οποίους εργαζόμαστε σ’ ένα ερώτημα και να έχουμε έτσι αποκλειστική πρόσβαση σ’ αυτούς για όσο διαρκεί το ερώτημα. Η σύνταξη για το κλείδωμα ενός πίνακα είναι ως εξής :</p>
<pre name="code" class="php">
LOCK TABLES tblName { READ | WRITE }
</pre>
<p>Όταν κλειδώνουμε έναν πίνακα, πρέπει να καθορίσουμε αν θέλουμε ένα &#8220;read lock&#8221; ή ένα &#8220;write lock&#8221;. Το πρώτο εμποδίζει άλλες διεργασίες από το να κάνουν αλλαγές στον πίνακα αλλά επιτρέπει σ’ άλλες να διαβάσουν τον πίνακα. Το δεύτερο απαγορεύει όλες τις προσβάσεις στον πίνακα.</p>
<p>Όταν τελειώσουμε την εργασία μας μ’ έναν πίνακα που έχουμε κλειδώσει, πρέπει να απελευθερώσουμε το κλείδωμα για να μπορέσουν να έχουν οι άλλες διεργασίες πρόσβαση στον πίνακα ξανά :</p>
<h3>UNLOCK TABLES</h3>
<p>Ακολουθεί ένα παράδειγμα ενός PHP κώδικα :</p>
<pre name="code" class="php">
mysql_query("LOCK TABLES inventory WRITE, shipping WRITE");
// … εντολές …
mysql_query("UNLOCK TABLES");
</pre>
]]></content:encoded>
			<wfw:commentRss>http://greektuts.net/php-intro-part3/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Εισαγωγή στην ASP</title>
		<link>http://greektuts.net/introduction-to-asp/</link>
		<comments>http://greektuts.net/introduction-to-asp/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 06:30:14 +0000</pubDate>
		<dc:creator>Pantso</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[active server pages]]></category>
		<category><![CDATA[Γλώσσα]]></category>
		<category><![CDATA[Γλώσσα Προγραμματισμού]]></category>
		<category><![CDATA[Προγραμματισμός]]></category>

		<guid isPermaLink="false">http://greektuts.net/?p=3900</guid>
		<description><![CDATA[Σε αυτό το βοήθημα θα κάνουμε την εισαγωγή στην γλώσσα προγραμματισμού ιστοσελίδων και διαδικτυακών εφαρμογών, την ASP. Στην εισαγωγή λοιπόν για την γλώσσα αυτή θα δούμε τι είναι η ASP, πως χρησιμοποιείται και τι κάνει, και θα μιλήσουμε για την σύνταξή της και τις διάφορες scripting γλώσσες που εμπεριέχει, ενώ σε αργότερα βοηθήματα θα δούμε περισσότερες λεπτομέριες]]></description>
			<content:encoded><![CDATA[<h1><strong>Τι Είναι η </strong><strong>ASP</strong></h1>
<p>Η γλώσσα προγραμματισμού <strong><em>ASP</em></strong><em> (</em><em>Active</em><em> </em><em>Server</em><em> </em><em>Pages</em><em>)</em> έχει το ιδιαίτερο χαρακτηριστικό ότι ο κώδικάς της πρώτα μεταγλωττίζεται στον server και μετά φορτώνεται σαν ένα κανονικό html έγγραφο, χωρίς ο χρήστης να είναι σε θέση να δει τον αρχικό κώδικα. Με την τεχνολογία της ASP μπορούμε να δημιουργήσουμε δυναμικές ιστοσελίδες (dynamic web pages).</p>
<p>Ανταγωνιστικές της τεχνολογίας ASP είναι η τεχνολογία <strong><em>Php</em></strong><em> (</em><em>HyperText</em><em> </em><em>PreProcessor</em><em>)</em> καθώς και η τεχνολογία <strong><em>CFML</em></strong><em> (</em><em>ColdFusion</em><em> </em><em>Markup</em><em> </em><em>Language</em><em>)</em>.</p>
<h1><strong>Τι Είναι ένα Αρχείο </strong><strong>ASP</strong><strong> </strong></h1>
<ul>
<li>Ένα αρχείο ASP είναι ακριβώς το ίδιο όπως ένα αρχείο HTML.</li>
<li>Ένα αρχείο ASP μπορεί να περιέχει κείμενο, HTML tags και scripts.</li>
<li>Τα scripts σ’ ένα αρχείο ASP εκτελούνται στον server.</li>
<li>Ένα αρχείο ASP έχει την επέκταση <strong><em>.</em></strong><strong><em>asp</em></strong>.</li>
</ul>
<p><strong> </strong></p>
<h1><strong>Πώς Δουλεύει ένα Αρχείο </strong><strong>ASP</strong></h1>
<ul>
<li>Όταν ένας φυλλομετρητής ζητάει ένα αρχείο HTML, ο server      επιστρέφει το αρχείο.</li>
<li>Όταν ένας φυλλομετρητής ζητάει ένα αρχείο ASP, ο server καλεί την ASP.</li>
<li>Η ASP      διαβάζει το αρχείο ASP και εκτελεί τα scripts που περιέχει.</li>
<li>Τέλος, το αρχείο ASP επιστρέφεται στον φυλλομετρητή σαν ένα απλό αρχείο HTML.</li>
</ul>
<p><strong> </strong></p>
<h1><strong>Τι Μπορεί να Κάνει η </strong><strong>ASP</strong><strong> για μας</strong></h1>
<ul>
<li>Να τροποποιήσει δυναμικά το περιεχόμενο μιας      ιστοσελίδας.</li>
<li>Να απαντά σε ερωτήσεις χρήστη ή σε δεδομένα      που υποβάλλονται από φόρμες HTML.</li>
<li>Να έχει πρόσβαση σε δεδομένα ή σε βάσεις      δεδομένων και να επιστρέφει τα αποτελέσματα σ’ έναν φυλλομετρητή.</li>
<li>Να προσαρμόζει μια ιστοσελίδα ώστε να την      κάνει πιο χρήσιμη στους χρήστες.</li>
<li>Τα πλεονεκτήματα από την χρήση της ASP αντί για την CGI και την Perl      είναι η απλότητα και η ταχύτητα.</li>
<li>Παρέχει ασφάλεια εφόσον ο ASP κώδικάς μας δεν μπορεί να ειδωθεί από τον      φυλλομετρητή.</li>
<li>Εφόσον τα αρχεία ASP επιστρέφονται σαν απλή HTML, μπορούν να ειδωθούν από οποιονδήποτε φυλλομετρητή.</li>
<li>Ο έξυπνος ASP προγραμματισμός μπορεί να ελαχιστοποιήσει την      κυκλοφορία στο δίκτυο (network traffic).</li>
</ul>
<p><strong> </strong></p>
<h1><strong>Σύνταξη της </strong><strong>ASP</strong></h1>
<p>Δεν μπορούμε να δούμε τον ASP κώδικα σ’ έναν φυλλομετρητή, αλλά μόνο την έξοδο από την ASP, που είναι απλή HTML. Και αυτό γιατί τα scripts εκτελούνται στον server πριν σταλεί το αποτέλεσμα στον φυλλομετρητή.</p>
<p><span style="text-decoration: underline;">Παραδείγματα</span></p>
<p><strong><em>Εμφάνιση Κειμένου</em></strong></p>
<p>Πώς να γράψουμε κάποιο κείμενο στο τμήμα &lt;body&gt; του HTML εγγράφου με την ASP.</p>
<pre name="code" class="html">
&lt;html&gt;
&lt;body&gt;
&lt;%
response.write"Hello World!"
%&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong><em>Κείμενο και </em></strong><strong><em>HTML</em></strong><strong><em> </em></strong><strong><em>tags</em></strong></p>
<p>Πώς να μορφοποιήσουμε το κείμενο με HTML tags.</p>
<pre name="code" class="html">
&lt;html&gt;
&lt;body&gt;
&lt;%
response.write("&lt;h2&gt; Hello World! &lt;br&gt; Αυτή η πρόταση χρησιμοποιεί
HTML tags για να μορφοποιήσει το κείμενο!
&lt;/h2&gt;")
%&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<h1><strong>Ο Βασικός Κανόνας Σύνταξης της </strong><strong>ASP</strong></h1>
<p>Ενα αρχείο ASP περιέχει κανονικά HTML tags, όπως ένα κανονικό αρχείο HTML. Επιπλέον, ένα αρχείο ASP μπορεί να περιέχει server scripts, που περικλείονται από τους οριοθέτες (delimiters) &lt;% και %&gt;. Τα server scripts εκτελούνται στον server και μπορούν να περιέχουν οποιεσδήποτε εκφράσεις, εντολές, διαδικασίες ή τελεστές που είναι έγκυροι για τη γλώσσα συγγραφής που χρησιμοποιούμε.</p>
<h1><strong>Το Αντικείμενο </strong><strong>Response</strong></h1>
<p>Η μέθοδος Write του αντικειμένου Response της ASP χρησιμοποιείται για να σταλεί περιεχόμενο (content) στον φυλλομετρητή. Για παράδειγμα, η επόμενη εντολή στέλνει το κείμενο <em>Hello</em><em> </em><em>World</em> στον φυλλομετρητή :</p>
<pre name="code" class="html">
Response.Write("Hello World")
</pre>
<p><strong> </strong></p>
<h1><strong>Η </strong><strong>VBScript</strong></h1>
<p>Στην ASP μπορούμε να χρησιμοποιήσουμε διάφορες γλώσσες συγγραφής (scripting languages). Η προκαθορισμένη είναι η γλώσσα VBScript, όπως φαίνεται στο επόμενο παράδειγμα :</p>
<pre name="code" class="html">
&lt;html&gt;
&lt;body&gt;
&lt;%
response.write("Hello World!")
%&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Το παράδειγμα αυτό χρησιμοποιεί τη συνάρτηση <em>response</em><em>.</em><em>write</em> για να εμφανίσει το μήνυμα <em>Hello</em><em> </em><em>World</em><em>!</em> στο τμήμα &lt;body&gt; του HTML εγγράφου.</p>
<h1><strong>Η </strong><strong>JavaScript</strong></h1>
<p>Για να χρησιμοποιήσουμε την JavaScript σαν την προκαθορισμένη γλώσσα συγγραφής, εισάγουμε την εξής εντολή (language specification) στην κορυφή της σελίδας :</p>
<pre name="code" class="html">
&lt;%@ language="javascript" %&gt;
&lt;html&gt;
&lt;body&gt;
&lt;%
Response.Write("Hello World!")
%&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Πρέπει να έχουμε υπόψη μας ότι σ’ αντίθεση με την VBScript, η JavaScript ξεχωρίζει τα πεζά από τα κεφαλαία γράμματα (case sensitive). Ετσι, θα πρέπει να γράψουμε τον ASP κώδικα με κεφαλαία ή πεζά γράμματα ανάλογα με τις απαιτήσεις της γλώσσας.</p>
<p><strong> </strong></p>
<h1><strong>Αλλες Γλώσσες Συγγραφής (</strong><strong>Scripting</strong><strong> </strong><strong>Languages</strong><strong>)</strong></h1>
<p>Η ASP δίνεται με τις γλώσσες συγγραφής VBScript και JavaScript. Αν θέλουμε να γράψουμε κώδικα σε μια άλλη γλώσσα, όπως Perl, REXX ή Python, θα πρέπει να εγκαταστήσουμε τις αντίστοιχες μηχανές συγγραφής (scripting engines). Επειδή τα scripts εκτελούνται στον server, ο φυλλομετρητής που ζητάει το αρχείο ASP δεν είναι ανάγκη να υποστηρίζει scripting.</p>
]]></content:encoded>
			<wfw:commentRss>http://greektuts.net/introduction-to-asp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
