REMIX07, Βουδαπέστη

Την προηγούμενη βδομάδα ήμουνα στη Βουδαπέστη, όπου και παρακολούθησα το REMIX07! Μπορώ πραγματικά να πω ότι έμεινα εντυπωσιασμένος από το Silverlight! Έχοντας ασχοληθεί με Flash στο παρελθόν και έχοντας αντιμετωπίσει το ‘δύστροπο’ (για τον προγραμματιστή) περιβάλλον του καθώς και τις αδυναμίες της Actionscript, πραγματικά έχω να πω ότι ο συνδυασμός XAML και .NET code είναι εκπληκτικά πρωτοποριακός στο χώρο του Web Development. Το Expression Blend είναι ένα αρκετά ώριμο εργαλείο, μέσω του οποίου μπορεί κάποιος σε ελάχιστα λεπτά να κάνει θαύματα. Anyway, ας παραθέσω μερικά από τα highlights της εκδήλωσης

  1. Την πρώτη θέση δικαίως κατέχει ο Scott Guthrie. Ένας σύγχρονος guru, μας έδειξε πάρα πολύ όμορφα demos σχετικά με κατασκευή Silverlight apps.
  2. Έμεινα πραγματικά εντυπωσιασμένος από την ταχύτητα πληκτρολόγησης αλλά και την ακρίβεια του κώδικα του Steve Marx. Μας έδειξε demos για κατασκευή Vista Gadgets, έναν Video Player με Silverlight και AJAX patterns.
  3. Πολύ καλή ήτανε και η παρουσίαση της Molly Holzschlag, σχετικά με CSS.
  4. Εντυπωσιακός ήτανε και ο Wayne Smith, ο οποίος, χρησιμοποιώντας το Blend, κατάφερε μέσα σε λίγη ώρα να φτιάξει ένα photo gallery (τμήμα του οποίου έκανε reflection πάνω σε ένα donut!).
  5. Πολύ καλός και ο George Moore, με demos από τα APIs που μας παρέχει το Live.
  6. Η river-boat το βράδυ στο Δούναβη! Αξέχαστη, από όλες τις απόψεις!

 

Παραθέτω και δύο photos, η μία έξω και η άλλη μέσα στο χώρο της εκδήλωσης

HPIM0813     DSC05856

Να προσθέσω ότι πολλά demos που παρουσιαστήκανε ομοιάζουν αρκετά με αυτά που παρουσιάστηκαν στην MIX07, και μπορείτε να βρείτε εδώ (credits go to Dimis for the link Smile)

edit: ένα πολύ ενημερωτικό blog post σχετικά με την πόλη της Βουδαπέστης έχει γράψει ο συνάδελφος Dimis εδώ

Τεχνολογίες Εφαρμογών Διαδικτύου – 2ο εργαστήριο

Σήμερα διεξήχθη στο τμήμα Πληροφορικής και Τηλεπικοινωνιών το δεύτερο εργαστήριο με θέμα την ASP .NET, στα πλαίσια του μαθήματος “Τεχνολογίες Εφαρμογών Διαδικτύου”. Θα ήθελα να ευχαριστήσω θερμά τους

  • Φοιτητές που ήρθανε και μας παρακολουθήσανε. Πραγματικά μας δίνετε δύναμη!! Smile
  • Τον Δημήτρη Ράπτη (dimis) και στον Στέλιο Καραμπασάκη (skarab) για την πολύτιμη βοήθειά τους στην επιλογή/σχεδιασμό/ανάλυση των θεμάτων που παρουσιάστηκαν καθώς και για την πολύτιμη βοήθειά τους κατά το 12ωρο των δύο εργαστηρίων. Καθώς και τον Άγγελο Μπιμπούδη (grnemo), για τη βοήθεια και την συμπαράστασή του.
  • Τον Στέφανο Σταμάτη, ενός εκ των admins του τμήματος για την πολύτιμη βοήθειά του.
  • Τον Αναπληρωτή Καθηγητή Δ. Μαρτάκο, για την ευγενική του άδεια να πραγματοποιήσουμε το εργαστήριο στα πλαίσια του μαθήματος που διδάσκει αυτό το εξάμηνο.

Συνοπτικά, τα θέματα που παρουσιαστήκανε (τα πρώτα 5 στο πρώτο εργαστήριο και τα άλλα 5 σήμερα) είναι

1. Εισαγωγή στο Visual Web Developer 2005
2. Κατασκευή  διεπαφής χρήστη διαδικτυακής εφαρμογής
3. Events – PostBack
4. Web Application State
5. Debugging  –  Tracing  a  Website
6. Style Sheets  –  Master Page
7. Databinding to User Interface Control
8. GridView  –  FormView
9. Login Controls  –  Membership
10. Configuring  –  Building  –  Deploying

Στο δεύτερο τμήμα προλάβαμε και δείξαμε λίγα πραγματάκια σχετικά με Web Services και winforms clients. 

Συνημμένα μπορείτε να βρείτε τα powerpoint presentations, demos καθώς και τις σημειώσεις που χρησιμοποιήθηκαν στα δύο εργαστήρια, καθώς και τη mini εφαρμογή που κατασκεύασα προκειμένου να δημιουργήσω sql server 2005 databases για τον καθέναSmile

Άντε, και του χρόνου!!Big Smile 

 

2η παρουσίαση στο DI : ASP.NET 2

(Αν και αρκετά καθυστερημένα) γράφω εδώ για την 2η παρουσίαση που έγινε στο τμήμα Πληροφορικής και Τηλεπικοινωνιών του Πανεπιστημίου Αθηνών με θέμα την ASP .NET 2, από τον Στέλιο Καραμπασάκη και από εμένα, την Παρασκευή 8 Ιουνίου 2007, στην Αίθουσα Α. Η αφίσα που χρησιμοποιήθηκε για την προβολή/διαφήμιση της εκδήλωσης καθώς και το ενημερωτικό thread που άνοιξε στο StudentGuru βρίσκονται εδώ

Τέλος, συννημένα βρίσκονται τα demos και το powerpoint που χρησιμοποίησα κατά τη διάρκεια της παρουσίασης.

Ευχαριστίες:

  • Στο Στέλιο για την πολύ καλή συνεργασία μας.
  • Στην υπόλοιπη ομάδα των MSP (dimis, grnemo) για την όλη βοήθεια και συμπαράστασή τους.
  • Στους (αρκετούς, παρά τις προσδοκίες μας) φοιτητές και φοιτήτριες που ήρθανε και μας παρακολουθήσανε, μέσα σε αυτό τον κυκεώνα τον εξεταστικών και των εργασιών.

Vista Gadget Debugging

Προσπαθούσα να φτιάξω ένα Vista Gadget χθες το βράδυ, και διαπίστωσα ότι το alert της Javascript δεν παίζει… Συνεπώς, μην έχοντας κάποιο περιβάλλον για την ανάπτυξη gadget, έψαξα για πιο ‘old-school’ μεθόδους. Βρήκα αυτό το εξαιρετικό εργαλείο της SysInternals, το DbgView, το οποίο μπορείτε να το κατεβάσετε από εδώ
http://www.microsoft.com/technet/sysinternals/utilities/debugview.mspx
Όπως λέει και η περιγραφή του, μπορεί να ‘πιάσει’ debug information από διάφορες πηγές

Under Windows 95, 98, and Me DebugView will capture output from the following sources:

Win32 OutputDebugString

Win16 OutputDebugString

Kernel-mode Out_Debug_String

Kernel-mode _Debug_Printf_Service

Under Windows NT, 2000, XP, Server 2003 and Vista DebugView will capture:

Win32 OutputDebugString

Kernel-mode DbgPrint

All kernel-mode variants of DbgPrint implemented in Windows XP and Server 2003

DebugView also extracts kernel-mode debug output generated before a crash from Window NT/2000/XP crash dump files if DebugView was capturing at the time of the crash.

Έτσι λοιπόν, χρησιμοποιώντας την System.Debug.outputString(string message) άπό το Javascript source του gadget, κατάφερα να κάνω output διάφορες πληροφορίες, τις οποίες και μετά παρατήρησα από το παράθυρο του DbgViewSmile

Όχι και η καλύτερη μέθοδος debugging, αλλά, μέχρι στιγμής, it’s better than nothing Smile

Paging In SQL Server 2005

Πολλές φορές, όταν εκτελούμε SQL queries, θέλουμε να πάρουμε ένα ορισμένο υποσύνολο από τα δεδομένα που θα παίρναμε κανονικά. Για παράδειγμα, το query

SELECT * FROM products ORDER BY ProductID ASC

στην Northwind database (πρόκειται για μία test database της Microsoft, μπορείτε να την κατεβάσετε από εδώ) φέρνει 77 rows. Πολύ εύκολα μπορούμε να πάρουμε τα πρώτα X rows από ένα table, χρησιμοποιώντας την έκφραση TOP. Δηλαδή, το query

SELECT TOP 10 * FROM products ORDER BY ProductID ASC

θα μας φέρει τα πρώτα 10 rows. Τι κάνουμε, όμως, όταν θέλουμε να φέρουμε συγκεκριμένα rows (π.χ. από το 5ο ως το 10ο); Σε εκδόσεις του sql server πριν την 2005, μπορούσαμε να χρησιμοποιήσουμε την έφραση set rowcount = X, όπου περιορίζαμε στο maximum τα rows που μπορεί να μας φέρει ένα query. Στη έκδοση 2005 όμως, έχουμε την έκφραση ROW_NUMBER() OVER (ORDER BY FieldName ASC/DESC). Το query

SELECT ROW_NUMBER() OVER (ORDER BY ProductID ASC), products.* FROM products ORDER BY ProductID ASC

θα μας φέρει όλα τα rows από το table Products, με το κάθε ένα row να έχει σαν πρώτο πεδίο ένα rownumber, όπου αυτό είναι ένας ακέραιος που μας δείχνει έναν αύξοντα αριθμό για το row. Το ROW_NUMBER παίρνει μετά το OVER μια έκφραση που του υποδεικνύει με βάση πιο πεδίο να κάνει το sorting και συνεπώς να βάλει τα rownumbers. Με τη χρήση του ROW_NUMBER μπορούμε λοιπόν πολύ εύκολα να φτιάξουμε την κάτωθι stored procedure που θα μας φέρνει συγκεκριμένα subsets δεδομένων

CREATE PROCEDURE usp_GetpagedProducts

@PageSize int,

@TargetPage int

AS

BEGIN

WITH tmp_cte AS

(

SELECT ROW_NUMBER() OVER (ORDER BY ProductID ASC) As Row, Products.* FROM Products

)

SELECT * FROM tmp_cte

WHERE Row BETWEEN (@TargetPage 1) * @PageSize + 1 AND @TargetPage*@PageSize

END

Χρησιμοποιώντας common table expressions (CTE – περισσότερα για αυτά σε επόμενο blog postWink) κρατάμε ένα resultset στη μνήμη με όλα τα products μαζί με το rownumber που τους αντιστοιχεί, και στο τέλος πετυχαίνουμε το paging με την χρήση των παραμέτρων της stored procedure (@PageSize είναι ο αριθμός των rows που επιθυμούμε να μας φέρει και @TargetPage είναι το συγκεκριμένο subset που θέλουμε). Για παράδειγμα, κλήση της stored procedure ως εξής

usp_GetPagedProducts 6,1

θα μας φέρει τα πρώτα 6 rows (rownumber από 1 ως 6), ενώ κλήση της stored procedure ως εξής

usp_GetPagedProducts 6,3

θα μας φέρει τα ‘τρίτα’ 6 rows (rownumber από 13 ως 18).

 

System.Text.StringBuilder

Ο τύπος δεδομένων string, είναι immutable στο .NET Framework. Πρακτικά αυτό σημαίνει, ότι όταν δημιουργήσουμε ένα string, τότε το περιεχόμενό του δεν μπορεί να αλλάξει. Δηλαδή, στο παρακάτω τμήμα κώδικα

string s = “Hello”;
s +=
” World”;

το s αρχικά δείχνει σε μία θέση μνήμης όπου είναι αποθηκευμένο το “Hello”. Με την προσθήκη (concatenation) του ” World”, το s πλέον δείχνει σε άλλη θέση μνήμης, στην οποία είναι αποθηκευμένο το “Hello World”. Συνεπώς, είναι προφανές ότι η επεξεργασία strings έχει κάποιο performance hit, ειδικά όταν έχουμε πολλά strings. Η λύση του .NET Base Class Library για αυτό είναι το object System.Text.StringBuilder

[SerializableAttribute]
[ComVisibleAttribute(true)]
public sealed class StringBuilder : ISerializable

Το StringBuilder είναι mutable αντικείμενο, δηλαδή το περιέχόμενό του μπορεί να αλλάξει. Η χωρητικότητα του δεν μπορεί να είναι μεγαλύτερη από System.Int32.MaxValue, και η default είναι 16.

Μερικά properties

  • Capacity (read/write) : επιστρέφει/θέτει το μέγιστο αριθμό χαρακτήρων που μπορεί να χωρέσει το συγκεκριμένο instance
  • MaxCapacity (read) : επιστρέφει το μέγιστο αριθμό χαρακτήρων που μπορεί να χωρέσει το συγκεκριμένο instance
  • Length (read/write) : επιστρέφει/θέτει το μήκος του περιεχόμενου string

Μερικές συναρτήσεις

  • Append (με 18 overloads) : προσθέτει Unicode χαρακτήρες (ή και άλλους τύπους δεδομένων) στο τέλος του περιεχόμενου string
  • Insert (με 17 overloads) : τοποθετεί Unicode χαρακτήρες (ή και άλλους τύπους δεδομένων) σε συγκεκριμένο σημείο του περιεχόμενου string (περνιέται σαν παράμετρος)
  • Remove : σβήνει x χαρακτήρες από το περιεχόμενο string στο σημείο y (x,y παράμετροι)
  • Replace (με 3 overloads) : αντικαθιστά χαρακτήρες ή ενσωματωμένα strings

 Για να πάρουμε το περιεχόμενο string του StringBuilder, αρκεί να καλέσουμε την συνάρτηση .ToString() που κληρονομεί από το System.Object.

 Να τονιστεί ότι οι συναρτήσεις του StringBuilder επενεργούν στο ίδιο object, αντί να επιστρέφουν ένα καινούριο, όπως γίνεται στην περίπτωση του string.

Δηλαδή, για τύπο string γράφουμε

string s =“Hello Woorld”;
s = s.Replace(
“oo”,“o”);

Ενώ για StringBuilder γράφουμε 

StringBuilder s = new StringBuilder(“Hello Woorld”);
s.Replace(
“oo”,“o”);

LEGO Mindstorms, Intro

Όλοι μας, μικροί και μεγάλοι σίγουρα θα έχουμε παίξει με LEGO. Με αυτά τα πολύχρωμα τουβλάκια που τα έστηνες όπως ήθελες, τους έβαζες και μικρά ανθρωπάκια και περνούσες πολύ ευχάριστα την ώρα σου. Η τεχνολογία όμως προοδεύει, και το ίδιο και τα LEGO. Έχω την τιμή να έχω προσωρινά στην κατοχή μου ένα LEGO Mindstorms (many many thanx to Fotis for this!!!!). Στην ιστοσελίδα της LEGO για τα Mindstorms, η οποία είναι εδώ, μπορείτε να δείτε πληροφορίες για αυτά, παρουσιάσεις, καθώς και software. Ποια είναι λοιπόν η ιδέα πίσω από τα LEGO Mindstorms; Η ιδέα είναι βασικά ότι πρόκειται για εύκολα προγραμματιζόμετα robots με αισθητήρες! Τα ρομποτάκια μπορούν να προγραμματιστούν να αντιδρούν σε ερεθίσματα που δέχονται οι αισθητήρες τους, και είτε να περιστραφούν, είτε να κινηθούν, είτε να κάνουν κάτι άλλο.

Ας περάσουμε αρχικά στο κουτί του Mindstorms, φωτογραφία του οποίου μπορείτε να δείτε εδώ Free Image Hosting at www.ImageShack.us

Ανοίγοντας το κουτί, μπορούμε να δούμε τα τουβλάκια (φυσικά!!!), κάποιες εύκολα κατανοήσιμες οδηγίες κατασκευής του robot, ένα CD με software για προγραμματισμό του robot, καλώδιο σύνδεσης με τον υπολογιστή, το NXT (λεπτομέρειες πιο κάτω) και ένα μεγάλο φύλλο χαρτιού (test pad για να κινείται το ρομποτάκι). Ενδεικτικές φωτογραφίες: Free Image Hosting at www.ImageShack.us Free Image Hosting at www.ImageShack.us Free Image Hosting at www.ImageShack.us

 

Το φυλλάδιο οδηγιών έχει οδηγίες για προγραμματισμό του ρομπότ μέσω ενός ειδικού software της LEGO (με το οποίο μπορεί κάποιος πανεύκολα να προγραμματίσει το ρομπότ – περισσότερα για αυτό σε επόμενο blog postSmile, και οδηγίες για κατασκευή ενός τύπου ρομπότ όχι σαν κι αυτό που φαίνεται στο κουτί, αλλά αυτόν: Free Image Hosting at www.ImageShack.us Free Image Hosting at www.ImageShack.us Free Image Hosting at www.ImageShack.us

Φυσικά, κανείς δεν μας απαγορεύει να φτιάξουμε ό,τι θέλουμε με τα τουβλάκια! LEGO είναι, ό,τι θες το κάνεις!

Το ρομποτάκι περιλαμβάνει 4 αισθητήρες.

  • αφής (είναι ακριβώς κάτω από τις δαγκάνες του)
  • ήχου (είναι το άσπρο υπερυψωμένο κουτάκι στο πίσω μέρος του ρομπότ)
  • φωτός (δεν φαίνεται καλά στις φωτογραφίες, είναι στο πίσω μέρος του ρομπότ και δεν είναι συνδεδεμένος)
  • υπερήχων (κάνει το ρομπότ ικανό να αντιδρά σε κίνηση – είναι πάνω από τις δαγκάνες του ρομπότ, φαίνεται σαν δύό μάτια)

Περιλαμβάνει επίσης δύο “κινητήρες”, δύο motors που δίνουν κίνηση στο ρομπότ. Οι αισθητήρες και τα δύο motors συνδέονται στο NXT, φωτογραφία του οποίου μπορείτε να δείτε εδώ: Free Image Hosting at www.ImageShack.us

Το ΝΧΤ είναι ο εγκέφαλος του Mindstorms. Περιλαμβάνει μια LCD οθόνη με 4 κουμπιά για διαχείριση του robot, μια ενσωματωμένη bluetooth συσκευή, τη θύρα για να συνδεθεί με PC μέσω του USB καλωδίου που περιλαμβάνεται στη συσκευασία, καθώς και θύρες για να συνδεθούν τα καλώδια που φεύγουν από τους αισθητήρες του ρομπότ. Έχει ενσωματωμένη μνήμη 64kb (35kb περίπου διαθέσιμα για τις εφαρμογές που θα του βάλετε – ναι, είναι κάπως λίγα Sad), λειτουργεί με 6 AA/LR6 μπαταρίες και έχει ένα ενσωματωμένο ηχειάκι για αναπαραγωγή απλών ήχων. Το firmware του NXT είναι αναβαθμίσιμο, κατεβάζετε το firmware από το site και το περνάτε μέσω του προγράμματος της LEGO, για το οποίο θα αναφερθώ σε επόμενο blog post. ΠΡΟΣΟΧΗ, όσοι έχετε το ΝΧΤ μην βάλετε το 1.04 firmware, το δοκίμασα και δεν αναγνωριζόταν το robot από το PC μετά Sad. Το 1.03 είναι μια χαρά, πάντως…

Απαιτήσεις συστήματος για να παίξει σύνδεση ΝΧΤ με PC:

  • Inter Pentium ή συμβατός, 800MHz τουλάχιστον
  • Windows XP SP2 τουλάχιστον (είναι συμβατό με Vista)
  • 256ΜΒ RAM τουλάχιστον
  • Μέχρι και 300ΜΒ σκληρού δίσκου
  • 1024×768 ανάλυση οθόνης
  • 1 USB θύρα
  • CD-ROM drive
  • Bluetooth adapter (προαιρετικά)

Τιμή του ρομπότ (από Amazon): 249.99$

Σε επόμενα blog post, θα αναφέρω πώς μπορεί να γίνει προγραμματισμός του ρομπότ, είτε μέσω του software της LEGO, είτε μέσω του Microsoft Robotics Studio!

Stay tuned!!!! Smile

 

ΥΓ. Ζητώ συγνώμη για την κακή ποιότητα των φωτογραφιών, αλλά με μόνη κάμερα την ψηφιακή του QTEK 9100, that was the best I could do.. Sad

Χρήση Javascript σε ASP .NET 2

Σήμερα χρειάστηκε σε μια ASP .NET εφαρμογή που φτιάχνω, να χρησιμοποιήσω κάποιες javascript functions. Μιας και ήθελα να παίζει σε μία συγκεκριμένη content page και όχι σε όλες, δεν μπορούσα να το γράψω με τον κλασσικό τρόπο ( //mpla mpla ) στον HTML κώδικα της Master σελίδας.

Με λίγο ψάξιμο, είδα πως γίνεται προγραμματιστικά. Η ASP .NET χρησιμοποιεί το νέο Page.ClientScript property για να δηλώσει Javascript κώδικα.
Το ClientScript object έχει πολλά properties και methods, θα αναφερθώ σε 3 από αυτές.

Χρήση του Page.ClientScript.RegisterClientScriptBlock

Η Page.ClientScript.RegisterClientScriptBlock μας επιτρέπει να δηλώσουμε μία javascript συνάρτηση στην κορυφή της σελίδας.
Δηλαδή, με κώδικα στο Load της σελίδας όπως ο παρακάτω

string myScript = @”function sayHi() {alert(‘Hi’);}”;
Page.ClientScript.RegisterClientScriptBlock(this.GetType(),”MyScript”,myScript,true);

και χρήση του onClientClick=”sayHi()” σε ένα Web Control, μπορούμε να χρησιμοποιήσουμε Javascript η οποία θα φορτώνει κατά την εκκίνηση της σελίδας και πριν το <body> στοιχείο της σελίδας.

Χρήση του Page.ClientScript.RegisterStartupScript

Η διαφορά της με την προηγούμενη είναι ότι τοποθετεί το script στο τέλος της σελίδας και όχι στην αρχή. Χρησιμοποιείται για να γραφεί Javascript κώδικας ο οποίος θα έχει reference σε συγκεκριμένα HTML controls της σελίδας, οπότε και θα πρέπει να γραφεί στο HTML output αφού έχουν τοποθετηθεί τα HTML controls στη σελίδα από τον browser (χρήση της RegisterClientScriptBlock με αυτό τον τρόπο θα δημιουργούσε javascript error).

Χρησιμοποιείται ως εξής
string myScript = @”function sayHi() {alert(document.forms[0][‘TextBox1’].value);}”; /*με την προυπόθεση ότι έχουμε ένα textbox με ID TextBox1 στη σελίδα μας*/
Page.ClientScript.RegisterClientScriptBlock(this.GetType(),”MyScript”,myScript,true);
 

Χρήση του Page.ClientScriptRegisterClientScriptInclude 

Αυτή η συνάρτηση χρησιμοποιείται για να φορτώσουμε .js αρχεία, στα οποία έχουμε γράψει τις Javascript συναρτήσεις μας.

Χρησιμοποιείται ως εξής
string myScript = “myjs.js”;
Page.ClientScript.RegisterClientScriptInclude(“myKey”,myScript);

και δίνει το ακόλουθο HTML αποτέλεσμα

http://myjs.js 

Μικρός οδηγός για SQL Server 2005 Merge Replication with Web synchronization

Μιας και τις τελευταίες μέρες ασχολήθηκα αρκετά με merge replication μέσω web synchronization για sql server 2005, θα παραθέσω εδώ μερικά απλά βηματάκια για να το υλοποιήσετε μέσω των GUIs του SQL Server Management Studio και να γίνει η ζωή σας πιο εύκοληBig Smile

Να αναφερθεί όλες οι εκδόσεις του sql server 2005 εκτός από την express, μπορούν να λειτουργήσουν ως publishers και distributors. 

Αρχικά, θα ήταν καλό να δημιουργήσουμε έναν νέο windows user στον publisher, ώστε με τα κατάλληλα permissions να χρησιμοποιηθεί για το replication, αλλά και ένα sql server login, το οποίο θα πρέπει να είναι συσχετισμένο με ένα database user ο οποίος να είναι dbowner στη βάση που θέλουμε να κάνουμε replicate.

 Αρχική Ρύθμιση του IIS

Το web synchronization μπορεί να παίξει είτε με IIS 5 ή 6. Αφού τον εγκαταστήσουμε στο σύστημά μας, θα πρέπει να του δώσουμε ένα SSL certificate, καθώς το web synchronization δουλεύει μέσω του https πρωτοκόλλου. Αν δεν έχουμε πιστοποιητικό από κάποιον παροχέα (π.χ. Verisign), μπορούμε να κατεβάσουμε το IIS 6 resource kit από εδώ, να το εγκαταστήσουμε και μετά να τρέξουμε το selfSSL.exe ώστε να εγκατασταθεί ένα πιστοποιητικό ασφαλείας για τον IIS μας. Κατόπιν, θα πρέπει να τρέξουμε μια management κονσόλα (Start->Run->mmc) και να κάνουμε add το snap-in για certificates. Αφού το κάνουμε αυτό, θα πρέπει να βρούμε το πιστοποιητικό που εγκαταστάθηκε, να του κάνουμε ένα export και μετά ένα import στο trusted root certificates store.

Ρύθμιση του publisher

Ανοίγουμε το  (SSMS) συνδεόμαστε στον database server μας ο οποίος θέλουμε να γίνει distributor. Πάμε στο σημείο που λέει replication, ανοίγουμε τα subnodes, επιλέγουμε αυτό με το όνομα ‘Local Publications’, δεξί κλικ και επιλέγουμε new publication. Αν δεν έχουμε ρυθμίσει τον sql server μας να είναι distributor, θα μας ζητηθεί να το κάνουμε. Καλό θα είναι το folder που θα αποθηκεύεται το snapshot να το έχουμε ρυθμίσει σαν UNC share, με τα κατάλληλα permissions. Στην επόμενη καρτέλα (replication type) επιλέγουμε merge publication, κατόπιν τα είδη sql server που πρόκειται να λειτουργήσουν σαν subscribers. Κατόπιν, επιλέγουμε ποια database objects θα είναι διαθέσιμα για replication, και αν αυτά θα είναι download only από το server ή αν αλλαγές σε αυτά από τους subscribers θα γίνονται apply στον Publisher. Στη συνέχεια, επιλέγουμε αν θέλουμε φίλτρα πάνω στα database objects που θα κάνουμε publish (π.χ. μέσω κάποιον sql queries). Τέλος, επιλέγουμε το πότε θα τρέχει ο snapshot agent και μετά τα security settings του, δηλαδή κάτω από ποια user permissions θα τρέχει (προφανώς θα πρέπει δικαιώματα εγγραφής στον UNC κατάλογο που περιγράψαμε παραπάνω) και πώς θα συνδέεται στον publisher. Το publication μας είναι πλέον έτοιμο, αφού του δώσουμε ένα όνομα.

Στη συνέχεια, κάνουμε δεξί κλικ στο publication που δημιουργήσαμε, και επιλέγουμε ‘Configure web synchronization’. Επιλέγουμε τον τύπο του sql server που θα χρησιμοποιήσει το virtual directory, και στην επόμενη καρτέλα επιλέγουμε το virtual directory που θα χρησιμοποιήσουμε. Θα αντιγραφεί εκεί πέρα το replisapi.dll, αρχείο απαραίτητο για το web synchronization. Επιλέγουμε ένα alias για το virtual directory και μετά επιλέγουμε τον τύπο του authentication που θα απαιτείται από το virtual directory, προκειμένου κάποιος subscriber να κάνει replication. Στη συνέχεια, επιλέγουμε έναν χρήστη που θα κάνει authentication, ώστε ο wizard να δώσει τα κατάλληλα permissions στο virtual directory. Τέλος, στην επόμενη καρτέλα, βάζουμε το UNC share για το snapshot folder.

Ο publisher μας είναι πλέον έτοιμος. Μπορούμε να δούμε το status του και πιθανά error messages από το replication monitor (δεξί κλικ πάνω στο publication και ‘Launch Replication Monitor’).

 

Ρύθμιση του subscriber

Στο node Local subscriptions, κάνουμε δεξί κλικ και επιλέγουμε ‘New subscriptions’. Συνδεόμαστε με τον Publisher, επιλέγουμε το publication και κατόπιν επιλέγουμε pull subscription (μιας και, προφανώς, το web synchronization δεν δουλεύει με push). Επιλέγουμε τη βάση του subscriber που θα κάνουμε replicate, και κατόπιν φτιάχνουμε τα security settings του merge agent. Στη συνέχεια, επιλέγουμε πότε θα τρέχει ο merge agent, είτε συνέχεια, είτε on demand, είτε με ένα schedule που θα του ορίσουμε εμείς. Στην επόμενη καρτέλα, επιλέγουμε το πότε θα γίνει initialize το subscription, μετά κάνουμε tick στο checkbox για να ενεργοποιηθεί το web synchronization, και στη συνέχεια δίνουμε τα στοιχεία για τη σύνδεση με τον IIS (δηλ. το URL και τα στοιχεία του χρήστη που φτιάξαμε στον publisher). Τελικά, επιλέγουμε αν το subscription θα είναι client type ή server type. Το subscription μας είναι έτοιμο.

Force web synchronization

Παραθέτω και RMO κώδικα σε VB .NET για να κάνετε force web synchronization (από SQL Server Books Online)

Public Sub SynchronizeWebNow()

        Dim publisherInstance As String = publisherName

        Dim hostname As String = “hostname”
        Dim webSyncUrl As String = “https://&#8221; + publisherInstance + “/VirtualDirectory/replisapi.dll”

        ‘ Create a connection to the Subscriber.
        Dim conn As ServerConnection = New ServerConnection(subscriberName, “username”, “password”)

        Dim subscription As MergePullSubscription
        Dim agent As MergeSynchronizationAgent

        Try
            ‘ Connect to the Subscriber.
            conn.Connect()

            ‘ Define the pull subscription.
            subscription = New MergePullSubscription()
            subscription.ConnectionContext = conn
            subscription.DatabaseName = subscriptionDbName
            subscription.PublisherName = publisherName
            subscription.PublicationDBName = publicationDbName
            subscription.PublicationName = publicationName

            ‘ If the pull subscription exists, then start the synchronization.
            If subscription.LoadProperties() Then
                ‘ Get the agent for the subscription.
                agent = subscription.SynchronizationAgent

                ‘ Check that we have enough metadata to start the agent.
                ‘If agent.PublisherSecurityMode = Nothing Then
                ‘ Set the required properties that could not be returned
                ‘ from the MSsubscription_properties table.

                agent.PublisherSecurityMode = SecurityMode.Standard
                agent.PublisherPassword = “publisherpassword”
                agent.PublisherLogin = “publisherusername”
                agent.Distributor = publisherInstance
                agent.DistributorSecurityMode = SecurityMode.Standard
                agent.DistributorLogin = “distibutorusername”
                agent.DistributorPassword = “distibutorpassword”
                agent.SubscriberLogin = “subscriberusername”
                agent.SubscriberSecurityMode = SecurityMode.Standard
                agent.SubscriberPassword = “subscriberpassword”
         

                ‘ Set optional Web synchronization properties.
                agent.UseWebSynchronization = True
                agent.InternetUrl = webSyncUrl

                agent.InternetSecurityMode = SecurityMode.Standard
                agent.InternetLogin = “windowsusername”
                agent.InternetPassword = “windowsuserpassword”
    

                ‘ Enable agent logging to the console.
                agent.OutputVerboseLevel = 1
                agent.Output = “”

                ‘ Synchronously start the Merge Agent for the subscription.
                agent.Synchronize()
            Else
                ‘ Do something here if the pull subscription does not exist.
                Throw New ApplicationException(String.Format( _
                 “A subscription to ‘{0}’ does not exist on {1}”, _
                 publicationName, subscriberName))
            End If
        Catch ex As Exception
            ‘ Implement appropriate error handling here.
            Throw New ApplicationException(“The subscription could not be ” + _
             “synchronized. Verify that the subscription has ” + _
             “been defined correctly.”, ex)
        Finally
            conn.Disconnect()
        End Try
    End Sub