Ruby installation version 1.8.7 & 1.9.1 on win32 platforms with rubyinstaller

Posted by superuser Fri, 26 Feb 2010 08:41:00 GMT

Luis Lavena and the rubyinstaller group have made 2 very reliable versions of Ruby programming language for Windows platforms.

Unlike the old ruby installer, the 1.8.7 and 1.9.1 versions have been compiled with the MinGW compiler(v. 3.4.5) toolset. Easy installing for Windows is essential for the future of Ruby in the programming jungle, and RubyInstaller works perfectly good.

This article should be intended as a minimal guide to install both Ruby 1.8.7 and Ruby 1.9.1 on win32 platforms.

  • Uninstall any previous installed Ruby version and remove the relative folders (for ex. C:\Ruby and/or C:\Ruby19 )
  • Install Ruby 1.8.7-p249
    • Accept the license (if you agree, of course)
    • Select the destination path of your installation. (i use the default C:\Ruby). Below, in the same window
    • Check the box Ruby executables to your PATH (IMPORTANT!) and “Associate .rb and .rbw files with this Ruby installation”
  • Finish the installation

Ruby 1.8 is succesfully installed!

Now it’s time to install Ruby 1.9 .

  • Install Ruby 1.9.1-p378
    • Accept the license
    • Select the destination path of your installation. (i use the default C:\Ruby19). Below, in the same window
    • DO NOT select anything . Leave both check boxs unchecked.
  • Finish the installation

Ruby 1.9 is succesfully installed!

To run Ruby 1.9 binaries you have to use absolute paths. C:\Ruby19\bin\whatever. That’s not so pretty!
To resolve this, i use an easy and smart method found on some discussions at the rubyinstaller google group.

The idea is to put some .bat (windows) scripts in the bin directory of the Ruby 1.8 installation to call internally the Ruby 1.9 binaries. In this way you do not have to add the Ruby 1.9 directory in your PATH env. variable. For my needs this work perfectly good.

In detail:

  • Download Ruby-Bat.rar . Unrar it. Move the five included .bat files (gem19.bat, irb19.bat, rake19.bat, ri19.bat, ruby19.bat) in your ruby-1.8 (not 1.9) installation directory (in my case this is C:\Ruby\bin).
    That’s all.

Open your command prompt and execute :

C:>irb19 
C:>gem19 install rack
C:>ri19 array
C:>rake19 -h

It works!

If you want to know more, open with your favorite editor for example rake19.bat to see what’s inside:

@echo off 
setlocal 
set PATH=C:\Ruby19\bin;%WINDIR%\system32;%WINDIR% 
ruby.exe -S rake %* 
endlocal 

If you need to make a custom ruby(v-1.9) binary just change the filename, substitute `rake` and save it in your ruby-1.8 (not 1.9) installation directory ( C:\Ruby\bin ). Not a perfect solution, but it just works as it should.

Posted in ,  | Tags , , ,  | no comments

3rd Ruby MeetUp in Athens

Posted by superuser Sat, 05 Dec 2009 17:12:00 GMT

Η ομάδα Rubyst.es με χαρά ανακοινώνει την τρίτη συνάντηση των φίλων της Ruby την Πέμπτη 10 Δεκεμβρίου στις 6 το απόγευμα. Αυτή τη φορά έχουμε την τιμή να φιλοξενούμαστε στο Microsoft Innovation Center σε ένα εξαιρετικό χώρο με πολλή άνετη πρόσβαση για όλους. Θα προσπαθήσουμε να καλύψουμε θέματα για προχωρημένους και αρχάριους ενώ σε αυτή τη συνάντηση θα έχουμε μια ξεχωριστή σύνθεση ομιλητών από βετεράνους της Ruby και του Rails. Αναλυτικά:

Πέρα από τις κυρίως ομιλίες μας θα υπάρχει και μια σειρά μικρών, ολιγόλεπτων παρουσιάσεων και σας προσκαλούμε να παρουσιάσετε και εσείς αν το επιθυμείτε. Η λίστα ως προς το παρόν έχει ως εξής:

Σας περιμένουμε όλους την Πέμπτη 10/12 στις 6 το απόγευμα στο Microsoft Innovation Center (Βασ.Σοφίας 103, στάση Μετρό Μέγαρο Μουσικής)

Περισσότερα Rubyst.es , στην αντίστοιχη mailing list και στο Facebook group

Posted in ,  | Tags , , ,  | no comments

[15/10/2009] Παρουσιάσεις προγραμματιστών Ruby στο Athens Digital Week 2009

Posted by superuser Thu, 15 Oct 2009 04:22:00 GMT

Την Πέμπτη 15 Οκτωβρίου 2009, και ώρα 16:00 – 18:00, στη Τεχνόπολη, Γκάζι στα πλαίσια των εκδηλώσεων του Athens Digital Week θα γίνουν οι ακόλουθες παρουσιάσεις από τα μέλη της ομάδας μας:

  • A blink into the Rails magic [Nick]
  • Ruby on Rails and Web on Python [john]
  • Creating administrator pages in a breeze [Panos]
  • From PHP to Ruby On Rails [jim]

Περισσότερες λεπτομέρειες στη λίστα ηλεκτρονικού ταχυδρομείου

Φυσικά μην ξεχάσετε τη δεύτερη εκδήλωση αύριο 16/10 στο ΤΕΙ ΠΕΙΡΑΙΑ
-

Posted in , ,  | Tags , , , ,  | no comments

2nd Ruby Meetup in Athens

Posted by superuser Wed, 07 Oct 2009 18:32:00 GMT

Η ελληνική κοινότητα της Ruby (http://rubyst.es) διοργανώνει το
δεύτερο Athens Ruby Meetup στο ΤΕΙ Πειραιά την Παρασκευή 16 Οκτώβρη 19:30 στην Αίθουσα
λειτουργικών συστημάτων. Αν και η κοινότητα είναι σχετικά νεαρή και
ακόμα μικρή θα παρουσιασθούν θέματα που αφορούν αρχάριους και
προχωρημένους χρήστες της Ruby. Αναλυτικότερα θα γίνουν οι εξής
παρουσιάσεις:

  • Deploying Rails applications στο appengine με JRuby [ PanosJee) ]
  • Εναλλακτικά ruby web frameworks (Ramaze/Sinatra/…) [ vtypal ]
  • Μetaprogramming σε Ruby [Jon Romero ]
  • How-to make a Rails plugin [ Jim Myhreberg ]
  • Open Discussion & QA

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

2o Athens Ruby Meetup
Χάρτες του ΤΕΙ Πειραιά : map1map2map3

Google Maps και οδηγίες λεωφορείων

Διεύθυνση :
Δήμος Αιγάλεω, επί των οδών Π. Ράλλη & Θηβών 250.
Κτίριο Ε – Αίθουσα Ε02
Κτίριο Α – Αίθουσα Α116

Σχετικά με τη Ruby

Η Ruby είναι μια δυναμική γλώσσα προγραμματισμού που επιτρέπει στον
προγραμματιστή να γράφει ευκολοανάγνωστο κώδικα σε λίγες γραμμές. Τα
τελευταία χρόνια έχει μια ιδιαίτερη δυναμική χάρη στο web framework,
Ruby on Rails

Σχετικά με την ελληνική κοινότητα Ruby

Είμαστε μια νεοσύστατη κοινότητα προγραμματιστών που αγαπάμε να
γράφουμε προγραμμάτα σε Ruby. Θα μας βρείτε στο http://rubyst.es αλλά
και στη λίστα ηλεκτρονικού ταχυδρομείου http://groups.google.com/group/ruby-hellug
. Εχουμε κάνει μια συνάντηση εως τώρα αλλά έχουμε πολλές ιδέες για το
μέλλον και αναμένουμε και τη δική σου συμμετοχή για μια ενεργή
ελληνική κοινότητα γύρω από την αγαπημένη μας γλώσσα

Posted in ,  | Tags , ,  | no comments

RUBY 1.9 STABLE !!!

Posted by superuser Sat, 31 Jan 2009 07:38:00 GMT

Η πολυαναμενόμενη stable έκδοση 1.9 της Ruby είναι γεγονός. Μετά από εργασίες development πολλών χρόνων, μόλις χθές έγινε η ανακοίνωση έκδοσης της πρώτης σταθερής Ruby 1.9 δια στόματος του Yuki Sonoda.

Η έκδοση 1.9 είναι μια καταλυτική προσπάθεια της κοινότητας Ruby να εδραιώσει τη γλώσσα στην ελίτ του Object Oriented κόσμου. Ήδη η ruby μπορεί να τρέξει σε Java Virtual Machine (JVM) με τις ευλογίες της Sun, σε Windows χάρις στην ανάπυξη του IronRuby (συνεργάζεται άψογα με .NET) με την υποστήριξη της Microsoft, ενώ πλέον τρέχει και σε "έξυπνα" κινητά τηλέφωνα ((Ruby 1.9) Symbian, iPhone, Windows Mobile και RIM BlackBerry χάρις στο Rhomobile).

Οι κύριες αλλαγές στο 1.9 είναι η αλλαγή του αργού interpreter MRI με τον εξαιρετικά γρήγορο YARV (κατά μέσο όρο είναι 70% γρηγορότερος από τον 1.8.5 MRI!), και πλέον ο YARV υποστηρίζει πλήρως κωδικοποίηαη χαρακτήρων UTF-8, κάτι που λύνει τα προβλήματα που είχαμε με την επεξεργασία ελληνικών χαρακτήρων. Ελπίζω η νέα έκδοση της ruby να ωθήσει νέους και παλαιότερους έλληνες προγραμματιστές να ασχοληθούν με αυτή γιατί πραγματικά νομίζω το αξίζει.

-----
Κατεβάστε την νέα έκδοση μέσω ftp:
ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p0.tar.bz2
ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p0.tar.gz
ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p0.zip

Posted in  | Tags , ,  | no comments

ΧΡΙΣΤΟΥΓΕΝΝΙΑΤΙΚΟ ΔΕΝΤΡΟ από παραγοντική συνάρτηση

Posted by superuser Mon, 29 Dec 2008 10:22:00 GMT

Χρόνια Πολλά και Ευτυχισμένο το 2009

Το κάτωθι χριστουγεννιάτικο δέντρο κατασκευάστηκε ορίζοντας την συνάρτηση παραγοντικού, υπολογίζοντας τις πρώτες 32 τιμές του και τυπώνοντας στο κέντρο. Ο κώδικας Ruby:

def factorial(n)
	if n <1 
		raise "The argument must be > 0"
	elsif n ==1
		return 1
	else
	        return n * factorial(n-1)
	end
end
print "\n"
print "ΧΡΟΝΙΑ ΠΟΛΛΑ\n".center(72)
1.upto(32) do |m| 
   print "#{factorial(m)}\n".center(42)
end

                             ΧΡΟΝΙΑ ΠΟΛΛΑ
                                        1
                                        2
                                        6
                                       24
                                       120
                                      720
                                     5040
                                     40320
                                   362880
                                   3628800
                                 39916800
                                 479001600
                               6227020800
                               87178291200
                             1307674368000
                           20922789888000
                           355687428096000
                         6402373705728000
                        121645100408832000
                       2432902008176640000
                     51090942171709440000
                    1124000727777607680000
                   25852016738884976640000
                 620448401733239439360000
                15511210043330985984000000
               403291461126605635584000000
             10888869450418352160768000000
           304888344611713860501504000000
           8841761993739701954543616000000
         265252859812191058636308480000000
       8222838654177922817725562880000000
      263130836933693530167218012160000000

Posted in  | Tags , ,  | no comments

Αυτοματοποίηση Εργασιών Πλοήγησης με το Mechanize [για ruby]

Posted by superuser Tue, 18 Nov 2008 19:41:00 GMT

Μετά από την παρουσίαση του hpricot και τους τρόπους ξεψαχνίσματος των σελίδων (x)html θα περάσουμε στο επόμενο στάδιο, δλδ θα αρχίσουμε να ελέγχουμε και να μηχανοποιούμε τις εργασίες πλοήγησης χρησιμοποιώντας το Mechanize (έχει καταγωγή από Python) και εκεί θα δούμε πολύ ενδιαφέροντα πράγματα.

Αν πρέπει να ορίσω το Mechanize θα έλεγα πως είναι ένας αυτόματος υπολογιστικός πλοηγητής κειμένου για τη γλώσσα προγραμματισμού ruby. Με το mechanize θα καταφέρουμε να αυτοματοποιήσουμε τις εργασίες πλοήγησης, αφού θα μπορούμε να καλούμε ιστοσελίδες, να βρίσκουμε και να επιλέγουμε συνδέσμους, να εισάγουμε στοιχεία σε φόρμες και να τις αποστέλλουμε. Αν και το mechanize προβάλλει μόνο τα δυναμικά στοιχεία της σελίδας (links, forms, buttons, ...) τα καλά νέα είναι πως συνεργάζεται - για την ακρίβεια εξαρτάται από το hpricot, οπότε για τις στατικές πληροφορίες (κείμενο, εικόνες, ...) θα καλούμε το hpricot. Πολλά έγραψα ας περάσω στα πειράματα μου:

Εγκατάσταση
Ως συνήθως μέσω gems:
$ gem install mechanize --include-dependencies

Εξαρτήσεις και μέσο
Για κάθε παράδειγμα που ακολουθεί θα πρέπει να δηλώνονται:
require 'rubugems'   # πιθανώς για windows Λ.Σ. να μην χρειάζεται
require 'mechanize'

agent = WWW::Mechanize.new 
#  agent.set_proxy("proxy.server.my", "8080") # MONON αν τρέχετε πίσω από proxy 

Ο agent είναι στην ουσία το μέσο πλοήγησης. Αν πρέπει να κλικάρω σε ένα σύνδεσμο ή να πατήσω ένα κουμπί θα καλέσω τον agent. Είναι αντικείμενο κλάσης WWW::Mechanize.

Πρώτο Τεστ
page = agent.get("http://www.google.gr/")

Η page (WWW::Mechanize::Page) αποτελείται από μια σειρά συστατικών που πιθανώς να θέλουμε να εξετάσουμε {url}{meta}{title}{iframes}{frames}{links}{forms}. Από αυτά τα πιο σημαντικά είναι οι σύνδεσμοι (links) που μας επιτρέπουν την πλοήγηση και οι φόρμες που μας επιτρέπουν να εισάγουμε στοιχεία. Για να έχετε μια γενική εικόνα μελετήστε τα περιεχόμενα της σελίδας με
pp page

ΣΥΝΔΕΣΜΟΙ (LINKS)
Το σύνολο των links που περιέχονται στη σελίδα είναι κλάσης WWW::Mechanize::List, ενώ κάθε σύνδεσμος είναι τύπου WWW::Mechanize::Page::Link.

Εύρεση Όλων των Συνδέσμων
puts page.links # WWW::Mechanize::Page::List

Δεν είναι πολύ χρήσιμη αυτή η μορφή. Αν θέλουμε όλο το κείμενο των links ή όλες τις διευθ.url των links, πολύ απλά θα θα πρέπει να εφαρμόσουμε τη μέθοδο each στη λίστα.
# ___'Ολα τα ονόματα συνδέσμων__
page.links.each { |link| puts link.text } # _____Όλες οι διευθύνσεις _________ page.links.each { |link| puts link.href }

Συνδυάζοντας τις δύο παραπάνω μπορούμε να αναπαράγουμε τα links σε κώδικα html Για την ορθότητα του αποτελέσματος θα υποθέσουμε πως όλοι οι σύνδεσμοι είναι σε απόλυτη διαδρομή δλδ ξεκινούν με http://www.google.gr/
page.links.each do |link|
	puts   "<a href=\"" +  link.href + "\">" + link.text + "</a>"
end

Αν υπάρχει συνδυασμός σχετικών και απόλυτων διαδρομών συνδέσμων - όπως στην περίπτωση της σελίδας google.gr, μπορείτε να λύσετε εύκολα το πρόβλημα. Για παράδειγμα, στη συνέχεια κάνω ένα έλεγχο αν το link ξεκινάει από http (οπότε είναι απόλυτη η διαδρομή), αν όχι προσθέτω το υπολλειπόμενο συστατικό δλδ το http://www.google.gr.
BASE = "http://www.google.gr"
page.links.each do |link|
    if link.href =~ /^http/ then
	    puts   "<a href=\"" +  link.href + "\">" + link.text + "</a>"
         else
            puts "<a href=\"" + BASH + link.href + "\">" + link.text + "</a>"
    end
end

Καθόλου άσχημα! Κατάφερα να συμμαζέψω όλα τα links και τα έχω έτοιμα προς χρήση.
Τι γίνεται αν θέλω κάποιο συγκεκριμένο link;
Εύρεση Συνδέσμων
Βρείτε κάποιο σύνδεσμο δίνοντας pp page.links. Για παράδειγμα:
	#<WWW::Mechanize::Page::Link
	#"Gmail"
	#"http://mail.google.com/mail/?hl=el&tab=wm"> 

Παρατηρήστε πως μπορώ να διακρίνω ένα σύνδεσμο από το κείμενο του ("Gmail") ή από το url του ("http://mail.google.com/mail/?hl=el&tab=wm"). Αν αναζητώ ένα link γνωρίζοντας ακριβώς το κείμενο του συνδέσμου ή το url
page.links.text('Gmail') 
page.links.href('http://mail.google.com/mail/?hl=el&tab=wm')

Φυσικά τις περισσότερες φορές θα χρησιμοποιήσουμε μόνο κάποιο συστατικό του κειμένου ή του url για να βρούμε το σύνδεσμο που ψάχνουμε. Σε αυτή την περίπτωση χρησιμοποιούμε RegExp = regular expressions. Η ιδέα δεν αλλάζει, αλλά μπορεί να έχω παραπάνω από ένα σύνδεσμο ως αποτέλεσμα αναζήτησης.
page.links.text(/mail/) # βρίσκει τα links που περιέχουν τη λέξη mail
page.links.href(/mail/) # βρίσκει links με url που περιέχει mail 

Και τώρα ήρθε η ώρα να κλικάρουμε ένα link. Θυμάστε τον agent; Λοιπόν η μορφή είναι agent.click [link] όπου [link] χρησιμοποιήστε τους άνωθεν τρόπους αναζήτησης
page_gmail = agent.click   page.links.text("Gmail")

Διαπιστώστε πως μεταφερθήκατε στη σελίδα του Gmail με pp page_gmail Από κει και πέρα μπορείτε να πλοηγηθείτε ατελείωτα και να αυτοματοποιήσετε τις αναζητήσεις σας. Να ψάξετε για νέα links και να συμπληρώσετε φόρμες. Αυτό θα παρουσιάσω στο δεύτερο μέρος του Mechanize.

Εύρεση, Συμπλήρωση και Αποστολή Μιας Φόρμας
Ας υποθέσουμε πως θέλουμε να βρούμε από το youtube.com βίντεο με θέμα "athens olympic games". Η κοινή πρακτική είναι να πάμε με τον browser στο youtube.com και στην πρώτη φόρμα που θα βρούμε να δηλώσουμε στο πεδίο αναζήτησης "athens olympic games". Ακριβώς την ίδια διαδικασία θα ακολουθήσω και με το mechanize.

require 'rubygems'
require 'mechanize'

agent = WWW::Mechanize.new
page = agent.get("http://www.youtube.com/")

Μέχρι εδώ όλα μας είναι γνωστά από την προηγούμενη παρουσίαση. Δώστε pp page και εστιάστε στη φόρμα:
 #<WWW::Mechanize::Form 
{name "searchForm"}
{method "GET"}
{action "/results"}
{fields
#<WWW::Mechanize::Form::Field:0x348ea88 @name="search_query", @value="">
#<WWW::Mechanize::Form::Field:0x348de58 @name="search_type", @value="">}
{radiobuttons}
{checkboxes}
{file_uploads}
{buttons}>

Αυτή είναι η πρώτη φόρμα αναζήτησης στην αρχική σελίδα του youtube.com . Για να την επιλέξω (παρατηρήστε πως υπάρχουν και άλλες) θα πρέπει να δηλώσω ή το όνομα της - δλδ. searchForm - ή τον controller(action) που θα επεξεργαστεί τη φόρμα μετά την αποστολή - δλδ /results. Πολλές φορές θα βρείτε φόρμες όπου δεν εμφανίζεται το όνομα τους, οπότε και θα πρέπει να δηλώνετε αναγκαστικά τον controller.
vres_form = page.form_with( :action => '/results' )

Στη φόρμα υπάρχουν δύο πεδία, to ένα με όνομα/@name "search query" και το άλλο με "search_type". Και τα δύο πεδία είναι κενά (@value = ""). Ας θέσουμε λοιπόν στο πεδίο search_query την τιμή "athens olympic games"
vres_form.search_query = "athens olympic games"

Δείτε πως ανανεώθηκε η τιμή της μεταβλητής @value του πεδίου search_query:
pp vres_form
#<WWW::Mechanize::Form
{name "searchForm"}
{method "GET"}
{action "/results"}
{fields
#<WWW::Mechanize::Form::Field:0x343e498 @name="search_query",
@value="athens olympic games">
#<WWW::Mechanize::Form::Field:0x343dca0 @name="search_type", @value="">}
{radiobuttons}
{checkboxes}
{file_uploads}
{buttons}>

Το μόνο που μας απομένει είναι να "πατήσουμε" το κουμπί αποστολής/submit. Πολύ απλά
myvideo_links = vres_form.click_button 

Η νέα σελίδα (myvideo_links) περιέχει τα links των βίντεο σχετικά με τους ολυμπιακούς αγώνες της Αθήνας. Όπως και στο πρώτο μέρος μπορούμε να αποσπάσουμε τις ονομασίες των links και των url διευθύνσεων ή ότι άλλο επιθυμείτε να βρείτε. Για παράδειγμα :
myvideo_links.links.href(/watch\?v=/).each do |lnk|
puts lnk.text
end

Opening Ceremony Olympic Games 2004 Athens
2004 Olympic 800m Final
Fani Halkia wins 400mH in Athens Olympic Games 2004
Taekwondo Athens Olympic games 2004 -58 Men Chinese Tiapei vs Mexico Round 1
The Emblem of the 2004 Athens Olympic Games
2004 Olympic Judo Highlights 1/2
Olympic games in Athens - Syrtaki dancing - Lifetime moment ........

Posted in  | Tags , , , , ,  | no comments

Εγκατάσταση Ruby, SQLite3, SQLite3-ruby και Sequel στα Windows 2000/XP

Posted by superuser Sun, 19 Oct 2008 19:41:00 GMT

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

Στη δουλειά για να εξομαλύνω τον όγκο εργασίας, αυτοματοποίησα αρκετές επαναλαμβανόμενες εντολές με απλά προγράμματα Ruby. Για να μην επιβαρύνω τα 256mb μνήμης του pc επέλεξα τη βάση δεδομένων sqlite3 - που με εξέπληξε θετικά αφού είναι πολύ χρηστική και πραγματικά lite. Για τις εργασίες που χρειάζομαι στο γραφείο είναι ότι πρέπει! Φόρτωσα τη βιβλιοθήκη σύνδεσης sqlite3-ruby και το αγαπημένο μου ORM τη sequel (που δουλεύει άψογα και με την sqlite). Ο συνδιασμός sqlite3 + sequel είναι ιδεώδες για μικρές εφαρμογές που πρέπει να αναπτυχθούν σε συστήματα χαμηλών δυνατοτήτων και που πρέπει να ολοκληρωθούν γρήγορα. Στο τέλος έβαλα και ένα μινιμαλιστικό ruby application server ονόματι Ramaze αφού ήταν αδιανόητο - λόγω των πόρων που καταλαμβάνει - να βάλω Rails σε workstation μηχάνημα. Τελικά μου άρεσε τόσο πολύ το Ramaze, που σκέφτομαι να αντικαταστήσω τις περισσότερες Rails εφαρμογές μου με αυτό. Θα γράψω εκτενέστερα για το Ramaze σε επόμενη καταχώρηση.

Σε αυτό το άρθρο απλά θα περιγράψω πως να κάνετε την εγκατάσταση σε Windows 2000/XP των προαναφερθέντων δλδ. Ruby, SQLite3, SQLite3-ruby και Sequel. Δεν πρέπει να χρειαστείτε πάνω από 10 λεπτά.

Ruby
Από την επίσημη σελίδα της Ruby κατεβάστε τον installer. Επιλέξτε να γίνει η εγκατάσταση σε μια διαδρομή δίχως κενά (όπως π.χ. το γνωστό Program Files. C:\ruby ή κάτι άλλο παρόμοιο είναι εντάξει). Κλικάρετε την επιλογή αυτόματης υποστήριξη rubygems - δε θα χρειάζεται να καλείτε require rubygems. Δεν πρέπει να συναντήσετε δυσκολίες εδώ.

Μετά την εγκατάσταση ελέγξτε τα gems που περιέχει η αρχική εγκατάσταση.

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\> gem list

*** LOCAL GEMS ***

fxri (0.3.6)
fxruby (1.6.16)
hoe (1.7.0)
hpricot (0.6)
log4r (1.0.5)
ptools (1.1.6)
rake (0.8.2)
ruby-opengl (0.60.0)
rubyforge (1.0.0)
test-unit (2.0.0)
win32-api (1.2.0)
win32-clipboard (0.4.4)
win32-dir (0.3.2)
win32-eventlog (0.5.0)
win32-file (0.5.5)
win32-file-stat (1.3.1)
win32-process (0.5.9)
win32-sapi (0.1.4)
win32-sound (0.4.1)
windows-api (0.2.4)
windows-pr (0.9.3)

SQLite3
Θα χρειαστεί να κατεβάσετε δύο αρχεία από το επίσημο site της SQLite.


Αποσυμπιέστε τα δύο zip αρχεία, και τοποθετήστε τα τρία αρχεία (sqlite3.exe, sqlite3.def και sqlite3.dll) στον κατάλογο bin του καταλόγου εγκατάστασης της ruby. Στην περίπτωση μου είναι ο C:\ruby\bin (αν έχετε εγκαταστήσει αλλού, βρείτε τον φάκελο bin της εγκατάστασης σας). Αυτό είναι όλο η Sqlite3 είναι έτοιμη προς χρήση!

SQLite3-ruby
Δεν είναι τίποτε άλλο από ένα module που επιτρέπει στη Ruby να επικοινωνεί με τις βάσεις δεδομένων sqlite3 που πριν από λίγο εγκαταστήσαμε. Δυστυχώς στην τελευταία έκδοση (1.2.4) που διατίθεται δεν υπάρχει ακόμη win32-gem πακέτο δλδ για windows. Δεν πειράζει. Θα εγκαταστήσω την προηγούμενη έκδοση δλδ την 1.2.3
Από το command prompt δώστε :

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\> gem install sqlite3-ruby --version 1.2.3

και είμαστε έτοιμοι.

Sequel
Πρόκειται για ένα εργαλείο Αντικειμενο-Σχεσιακής Αντιστοίχησης [ORM = Object Relational Mapping]. Κάνει ό,τι ακριβώς και το Active Record στο Rails. Δλδ αντιστοιχεί τις καταχωρήσεις στη βάση δεδομένων με αντικείμενα / στιγμιότυπα κλάσης Ruby. Η αντιστοιχία είναι πολύ χρήσιμη και σας γλυτώνει από πολύπλοκα queries sql. Εγκαταστήστε σαν απλό rubygem.

 C:\> gem install sequel 

Posted in  | Tags , , , , , , , ,  | no comments

Εγκατάσταση Ruby, SQLite3, SQLite3-ruby και Sequel στα Windows 2000/XP

Posted by superuser Sun, 19 Oct 2008 19:41:00 GMT

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

Στη δουλειά για να εξομαλύνω τον όγκο εργασίας, αυτοματοποίησα αρκετές επαναλαμβανόμενες εντολές με απλά προγράμματα Ruby. Για να μην επιβαρύνω τα 256mb μνήμης του pc επέλεξα τη βάση δεδομένων sqlite3 - που με εξέπληξε θετικά αφού είναι πολύ χρηστική και πραγματικά lite. Για τις εργασίες που χρειάζομαι στο γραφείο είναι ότι πρέπει! Φόρτωσα τη βιβλιοθήκη σύνδεσης sqlite3-ruby και το αγαπημένο μου ORM τη sequel (που δουλεύει άψογα και με την sqlite). Ο συνδιασμός sqlite3 + sequel είναι ιδεώδες για μικρές εφαρμογές που πρέπει να αναπτυχθούν σε συστήματα χαμηλών δυνατοτήτων και που πρέπει να ολοκληρωθούν γρήγορα. Στο τέλος έβαλα και ένα μινιμαλιστικό ruby application server ονόματι Ramaze αφού ήταν αδιανόητο - λόγω των πόρων που καταλαμβάνει - να βάλω Rails σε workstation μηχάνημα. Τελικά μου άρεσε τόσο πολύ το Ramaze, που σκέφτομαι να αντικαταστήσω τις περισσότερες Rails εφαρμογές μου με αυτό. Θα γράψω εκτενέστερα για το Ramaze σε επόμενη καταχώρηση.

Σε αυτό το άρθρο απλά θα περιγράψω πως να κάνετε την εγκατάσταση σε Windows 2000/XP των προαναφερθέντων δλδ. Ruby, SQLite3, SQLite3-ruby και Sequel. Δεν πρέπει να χρειαστείτε πάνω από 10 λεπτά.

Ruby
Από την επίσημη σελίδα της Ruby κατεβάστε τον installer. Επιλέξτε να γίνει η εγκατάσταση σε μια διαδρομή δίχως κενά (όπως π.χ. το γνωστό Program Files. C:\ruby ή κάτι άλλο παρόμοιο είναι εντάξει). Κλικάρετε την επιλογή αυτόματης υποστήριξη rubygems - δε θα χρειάζεται να καλείτε require rubygems. Δεν πρέπει να συναντήσετε δυσκολίες εδώ.

Μετά την εγκατάσταση ελέγξτε τα gems που περιέχει η αρχική εγκατάσταση.

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\> gem list

*** LOCAL GEMS ***

fxri (0.3.6)
fxruby (1.6.16)
hoe (1.7.0)
hpricot (0.6)
log4r (1.0.5)
ptools (1.1.6)
rake (0.8.2)
ruby-opengl (0.60.0)
rubyforge (1.0.0)
test-unit (2.0.0)
win32-api (1.2.0)
win32-clipboard (0.4.4)
win32-dir (0.3.2)
win32-eventlog (0.5.0)
win32-file (0.5.5)
win32-file-stat (1.3.1)
win32-process (0.5.9)
win32-sapi (0.1.4)
win32-sound (0.4.1)
windows-api (0.2.4)
windows-pr (0.9.3)

SQLite3
Θα χρειαστεί να κατεβάσετε δύο αρχεία από το επίσημο site της SQLite.


Αποσυμπιέστε τα δύο zip αρχεία, και τοποθετήστε τα τρία αρχεία (sqlite3.exe, sqlite3.def και sqlite3.dll) στον κατάλογο bin του καταλόγου εγκατάστασης της ruby. Στην περίπτωση μου είναι ο C:\ruby\bin (αν έχετε εγκαταστήσει αλλού, βρείτε τον φάκελο bin της εγκατάστασης σας). Αυτό είναι όλο η Sqlite3 είναι έτοιμη προς χρήση!

SQLite3-ruby
Δεν είναι τίποτε άλλο από ένα module που επιτρέπει στη Ruby να επικοινωνεί με τις βάσεις δεδομένων sqlite3 που πριν από λίγο εγκαταστήσαμε. Δυστυχώς στην τελευταία έκδοση (1.2.4) που διατίθεται δεν υπάρχει ακόμη win32-gem πακέτο δλδ για windows. Δεν πειράζει. Θα εγκαταστήσω την προηγούμενη έκδοση δλδ την 1.2.3
Από το command prompt δώστε :

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\> gem install sqlite3-ruby --version 1.2.3

και είμαστε έτοιμοι.

Sequel
Πρόκειται για ένα εργαλείο Αντικειμενο-Σχεσιακής Αντιστοίχησης [ORM = Object Relational Mapping]. Κάνει ό,τι ακριβώς και το Active Record στο Rails. Δλδ αντιστοιχεί τις καταχωρήσεις στη βάση δεδομένων με αντικείμενα / στιγμιότυπα κλάσης Ruby. Η αντιστοιχία είναι πολύ χρήσιμη και σας γλυτώνει από πολύπλοκα queries sql. Εγκαταστήστε σαν απλό rubygem.

 C:\> gem install sequel 

Posted in  | Tags , , , , , , , ,  | no comments

HPRICOT ο πιο διαδεδομένος συντακτικός αναλυτής στη Ruby

Posted by superuser Fri, 19 Sep 2008 10:56:00 GMT

Ο hpricot είναι ο πιο διαδεδομένος html/xml parser στη ruby. Εγκαταστείται όπως και τα περισσότερα rubygems, δίνοντας σαν root:

#  gem install hpricot --include-dependencies 

Η τελευταία έκδοση είναι η 0.6.161. Μπορείτε να την κατεβάσετε από το rubyforge από εδώ και να την εγκαταστήσετε τοπικά με:
gem install hpricot-0.6.161.gem 

Παρακάτω θα εξηγήσω με ένα παράδειγμα τις διάφορες δυνατότητες του αναλυτή. Για περισσότερες πληροφορίες δείτε στο τέλος του άρθρου τα προτεινόμενα links.

Θα χρησιμοποιήσω σαν παράδειγμα την αρχική σελίδα της ιστοσελίδας του τηλεοπτικού καναλιού ALTER. Ας υποθέσουμε πως το ζητούμενο είναι να αποσπάσω και να αποθηκεύσω τα στοιχεία του ημερησίου τηλεοπτικού προγράμματος από την αρχική σελίδα html.

Θα καλέσω τη σελίδα χρησιμοποιώντας το open-uri από την standard library της ruby, και θα χρησιμοποιήσω το hpricot για να αναλύσει τη σελίδα και να δημιουργήσει "elements" (σε λίγο θα μάθετε τι είναι ...)

irb(main):001:0> require 'open-uri'
=> true
irb(main):002:0> require 'hpricot'
=> true
irb(main):003:0> doc = Hpricot(open('http://www.alter.gr/'))
=> #<Hpricot::Doc "\357\273\277" {doctype " "\r\n\r\n" .................................

Αν δουλεύετε πίσω από proxy server τότε δηλώστε τα στοιχεία του με

doc = Hpricot(open('http://www.alter.gr/', :proxy => 'http://proxy.myserver.my:8080'))

Ας δούμε όμως σε ποιά κλάση ανήκει το doc:

irb(main):004:0> doc.class
=> Hpricot::Doc

Η μέθοδος Hpricot δέχεται ως πρόθεμα κώδικα html και επιστρέφει ένα αντικείμενο document (στιγμιότυπο Hrpicot::Doc) . Ουσιαστικά το Hpricot παίρνει τον κώδικα html της σελίδας που έχουμε καλέσει και τον φορτώνει σε ένα οργανωμένο δενδροειδής μορφής έγγραφο που εισάγει ιδιαίτερη σημειολογία για διευκόλυνση μας, ώστε να έχουμε εύκολη πρόσβαση σε όλα τα στοιχεία της σελίδας. Το doc αποτελείται από συστατικά που ονομάζονται elements. Και με τη σειρά τους τα συστατικά μπορούν να περιέχουν άλλα συστατικά ή κώδικα html ή την απλούστερη μορφή κειμένου - δηλαδή απλό κείμενο.

Για να αποσπάσετε στοιχεία από τον κώδικα html θα πρέπει να κάνετε αναζητήση (search) στο doc (#=>Hpricot::Doc) και το αποτέλεσμα θα είναι ένας πίνακας συστατικών/elements (Hpricot::Elements). Μπορείτε να ραφινάρετε την αναζήτηση σας όσο επιθυμείτε με επαναλαμβανόμενες αναζητήσεις. Η πιο απλή μορφή ενός συστατικού είναι κλάσης (#=> Hpricot::Element), δηλαδή ενός απομονωμένου συστατικού. Το περιεχόμενο ενός συστατικού ή του πίνακα συστατικών - δλδ. ο κώδικας html ή το απλό κείμενο - μπορεί πολύ απλά να αποσπασθεί εφαρμόζοντας τις μεθόδους .inner_html και .inner_txt αντίστοιχα.

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

irb(main):009:0> s1 = doc.search("/html/body//p")

H s1 είναι ένας πίνακας συστατικών.
irb(main):009:0> s1.class
=> Hpricot::Elements

Αν θέλω να αποσπάσω τον κώδικα html των συστατικών (παραγράφων) από όλα τα συστατικά θα εφαρμόσω τη μέθοδο inner_html. Τόσο απλά.
irb(main):010:0> s1.inner_html

Ας ξεκινήσουμε τώρα να αποσπάσουμε τα στοιχεία του ημερησίου τηλεοπτικού προγράμματος από την αρχική σελίδα html. Ξεκινώ τον κώδικα πάλι από την αρχή για να μη μπερδευτείτε.

irb(main):001:0> require 'open-uri'
=> true
irb(main):002:0> require 'hpricot'
=> true
irb(main):003:0> doc = Hpricot(open('http://www.alter.gr/'))
=> <Hpricot::Doc "\357\273\277" {doctype "DOCTYPE html PUBLIC \"-//W3C//DTD ..........

Είναι πάντα καλή ιδέα να πηγαίνετε στη σελίδα με το browser και να εξετάζετε τον κώδικα html. Κοιτώντας προσεκτικά αντιλαμβάνομαι πως το ημερήσιο πρόγραμμα περιλαμβάνεται στο εσωτερικό του τμήματος <div id=daily-programme>#περιεχόμενο#</div>. Περιέχει πολλά σκουπίδια που θα θελήσω να πετάξω αργότερα, αλλά προς στιγμής θέλω να απομονώσω αυτό το τμήμα του doc με μια αναζήτηση. Ποια είναι όμως η διαδρομή; Για να βρω τη διαδρομή (xpath) θα κάνω μια αναζήτηση με θέμα την τιμή #daily-programme και εφαρμόζοντας τη μέθοδος xpath που επιστρέφει ακριβώς τη διαδρομή:

irb(main):004:0> progxpath = doc.at("#daily-programme").xpath
=> "//div[@id='daily-programme']"

Επομένως //div[@id='daily-programme'] είναι η διαδρομή αναζήτησης για να κόψω από το doc, το περιεχόμενο του tag <div= id="daily-programme">. Το αποτέλεσμα της αναζήτησης θα είναι ένας πίνακας συστατικών.
irb(main):005:0> programme = doc.search(//div[@id='daily-programme'])
=> #Hpricot::Elements[{elem div id="daily-programme" "\r\n" {emptyelem img s
rc="/program/program.jpg" height="42" ............................
irb(main):006:0> programme.class
=> Hpricot::Elements

Ελέγχοντας πάλι τον κώδικα html της σελίδας βλέπω πως οι ώρες έναρξης των προγραμμάτων είναι μέσα σε tag "dt". Έτσι κάνει πολύ εύκολη την αναζήτηση των συστατικών:

irb(main):007:0> programme.search('dt')
=> #Hpricot::Elements[{elem <dt> "06:30" </dt>}, {elem <dt> "06:45" </dt>}, {el
em <dt> "07:00" </dt>}, {elem <dt> "07:15" </dt>}, {elem <dt> "07:30" </dt>}, {e
lem <dt> "08:00" </dt>}, {elem <dt> "08:15" </dt>}, {elem <dt> "08:30" </dt>}, {
elem <dt> "09:15" </dt>}, {elem <dt> "09:55" </dt>}, {elem <dt> "12:35" </dt>},
{elem <dt> "15:30" </dt>}, {elem <dt> "16:00" </dt>}, {elem <dt> "16:10" </dt>},
{elem <dt> "17:10" </dt>}, {elem <dt> "18:45" </dt>}, {elem <dt> "20:00" </dt>}
, {elem <dt> "20:55" </dt>}, {elem <dt> "21:00" </dt>}, {elem <dt> "23:00" </dt>
}, {elem <dt> "02:00" </dt>}, {elem <dt> "02:15" </dt>}]>

Έχουμε ακόμη ένα πίνακα συστατικών αλλά είναι αυτά ακριβώς που θέλουμε. Ο πίνακας συστατικών Hpricot::Elements είναι ένας κανονικός πίνακας (array) ruby, όπου μπορούμε να εφαρμόσουμε όποια μέθοδο επιθυμούμε. Σε αυτή την περίπτωση προτιμώ να αποσπάσω ένα-ένα τα στοιχεία με τη μέθοδο each, και για κάθε στοιχείο εφαρμόζω την μέθοδο .inner_html. Θα ορίσω ένα πίνακα με όνομα coltime για να αποθηκεύσω τα αποσπώμενα συστατικά.

irb(main):008:0> coltime = Array.new
=> []
irb(main):009:0> programme.search('dt').each { |ora|
irb(main):010:1* coltime << ora.inner_html
irb(main):011:1> }
=> # em <dt> "07:00" </dt>}, .........
irb(main):012:0> coltime
=> ["06:30", "06:45", "07:00", "07:15", "07:30", "08:00", "08:15", "08:30", "09:
15", "09:55", "12:35", "15:30", "16:00", "16:10", "17:10", "18:45", "20:00", "20
:55", "21:00", "23:00", "02:00", "02:15"]

Με την ίδια λογική η περιγραφή των προγραμμάτων βρίσκεται μέσα σε tag "dd". Θα εφαρμόσω ότι έκανα και με τις ώρες, με μόνη διαφορά πως θα μετατρέψω τα link σε absolute path - κάτι για το οποίο χρειάζεται μόνο μία επιπλέον μέθοδος - η gsub. Η περιγραφή των προγραμμάτων θα αποθηκευτεί στον πίνακα colcon.

irb(main):014:0> colcon = Array.new
=> []
irb(main):015:0> programme.search('dd').each { |mm|
irb(main):016:1* colcon << mm.inner_html.gsub("href=\"/", "href=\"http://www.alt
er.gr/")
irb(main):017:1> }
=> #<Hpricot::Elements[{elem <dd) {elem <a href="/zones/ent.php?id=1#ent46" titl ..
irb(main):018:0> colcon
=> ["(a href=\"http://www.alter.gr/zones/ent.php?id=1#ent46\" title=\"\316\237
316\244\316\221\316\247\316\245\316\224\316\241\316\237\316\234\316\237\316\243
\316\240\316\221\316\244\">\316\237 \316\244\316\221\316\247\316\245\316\224\31
\241\316\237\316\234\316\237\316\243 \316\240\316\221\316\244(/a>", "a....

Κλείνοντας θα αντιστοιχήσω τις τιμές των δύο πινάκων φτιάχνοντας το πρόγραμμα TV του Alter σε πίνακα και θα το αποθηκεύσω στο αρχείο alter.html.

irb(main):034:0> File.open("alter.html", "a") { |mv| 
irb(main):035:1* mv.puts("<table>")
irb(main):036:1> 1.upto(coltime.length) { |k|
irb(main):037:2* mv.puts("<td>#{coltime[k-1]}</td> <td>#{colcon[k-1]}</td> </tr> \n")
irb(main):038:2> }
irb(main):039:1> mv.puts("</table>")
irb(main):040:1> }


Κατεβάστε ΕΔΩ ολόκληρο το πρόγραμμα

Μπορείτε να το τρέξετε (αλλάξτε τη διαδρομή "your-path-to-ruby" με τη δική σας) σαν cron από τον σέρβερ σας και να προσφέρετε στους αναγνώστες σας το πρόγραμμα ανανεωμένο καθημερινά! Κάντε το ίδιο με δείκτες τιμών χρηματηστηρίων ή με αποτελέσματα τυχερών παιχνιδιών ή πρόγραμμα κινηματογράφων ή ότι άλλο βάζει ο νου σας... Η πληροφορία είναι δύναμη και μπορείτε αυτόματα να την έχετε στη διάθεση σας.

Σημαντικές Πηγές: Hpricot Basics, Πλήρης τεκμηρίωση , Συζητήσεις για το hpricot στο ruby-forum.com

{ 'Βαγγέλης Τυπάλδος' => 'vtypal_at_gmail.com', :@2008 => 'SuperUser.Gr'}

Posted in  | Tags , , , ,  | no comments