Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια

ZipForge.NET

Επεσα πάνω σε αυτή τη βιβλιοθήκη η οποία διατίθεται δωρεάν για προσωπική χρήση, (αν και τα licences φτάνουν μέχρι και στα 4999 Ευρώ για πλήρες enterprise+source) και φαίνεται καλή. Αν κάποιος την έχει ήδη δοκιμάσει, ας μας δώσει παραπάνω πληροφορίες.

Αντιγράφω από τη σελίδα του προϊόντος:

ZipForge.NET is a fast .NET framework zip component. With this toolkit you can easily add zip archive functionality to your projects. Free for personal use. Royalty-free for commercial use. ZipForge.NET is 100% managed .NET component written in pure C#.

Key features:

  • 100% managed code without unsafe blocks
  • Creates and handles ZIP files
  • Adds, moves, extracts, deletes, updates, tests, refreshes a group of files by a single operation
  • Streaming support
  • Progress indication
  • Encryption\decryption
  • Transactions
  • Zip64 support (allows to create archives over 4Gb)
  • Supports .NET 1.1 and 2.0
  • A lot of demos (C#, VB.NET and Delphi.NET demos are included)
  • Extensive help
  • Royalty-free
  • Full source code is available

Περισσότερα και download εδώ: http://www.componentace.com/.NET_zip_component_zipforge.htm

Δημοσιεύτηκε στις από το μέλος cap | 1 σχόλια
Δημοσίευση στην κατηγορία:

Remoting και BinaryFormatter Exceptions

Σε ένα πρόσφατο project στο οποίο συμμετείχα, έπεσα επάνω σε ένα πολύ μυστήριο System.Runtime.Serialization.SerializationException το οποίο προέκυπτε κατά τη διάρκεια κλήσεων που γίνονταν με remoting. Συγκεκριμένα, αυτό που έβλεπα ήταν το εξής:

An unhandled exception of Type 'System.Runtime.Serialization.SerializationException' occurred in mscorlib.dll.  
Additional Information:  BinaryFormatter version incompatibility.  Expected Version 1.0. Received Version 1008738336.1684104552

Φυσικά μου προκάλεσε την περιέργεια, γιατί δεν ακουγόταν φυσιολογικό. Η εγκατάσταση του .NET Framework και στον server και στον client ήταν καθαρή, και τίποτα δεν υπήρχε που να υποδεικνύει οτι κάτι δεν πήγαινε καλά με τον BinaryFormatter. Η κλήση ήταν ιδιαίτερα απλή. Ψαχνοντας λοιπόν λίγο, βρήκα αυτό εδώ το blog post το οποίο εξηγεί τα πράγματα. Για όσους βαριούνται να διαβάζουν, να το εξηγήσω με απλά λόγια:

Το error που γυρίζει ΔΕΝ ΕΧΕΙ ΚΑΜΜΙΑ ΣΧΕΣΗ με το πραγματικό πρόβλημα, γι'αυτό μην ψάχνετε τι συμβαίνει με τον BinaryFormatter σας. (Δεν αποκλείουμε να έχετε πρόβλημα εκεί, αλλά το πιθανότερο είναι να μην έχετε).

Στη δική μου περίπτωση, προσπαθούσα μέσα από το .config αρχείο να κάνω impersonate ένα χρήστη χρησιμοποιώντας λογ/σμό ο οποίος δεν υπήρχε στην εγκατάσταση του remoting server που παρουσίαζε το πρόβλημα. Φυσικά, με την πρώτη κλήση ο server θα έπρεπε να γυρίσει error. Ομως, πώς γυρνάει το error ο remoting server;

Κάπως έτσι:

HTTP/1.1 500 Internal Server Error
Server: Microsoft-IIS/5.0
Date: Mon, 22 Apr 2002 21:25:44 GMT
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 3286

<html>
  <head>
  <title>Configuration Error</title>
  <style>
  ...

Ομως, εκεί μπερδεύονται τα πράγματα. Ο binary formatter που βρίσκεται στη μεριά του client νομίζει οτι αυτό είναι ένα binary encoded remoting message και προσπαθεί να το διαβάσει. Το πρώτο πράγμα που αναμένει είναι το version 1.0 αλλά αντί για αυτό βρίσκει το string [html]. Στη δική του γλώσσα, αυτό μεταφράζεται σε αυτό τον περίεργο αριθμό έκδοσης που σας λέει οτι βρήκε. Νομίζει λοιπόν οτι οι εκδόσεις των binaryFormatters στον server και στον client δεν ταιριάζουν και τσουπ, νατο το μισητό error που καμμία σχέση δεν έχει με την πραγματικότητα.

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


 

Δημοσιεύτηκε στις από το μέλος cap | 1 σχόλια
Δημοσίευση στην κατηγορία:

Συμβουλές: Εργασιακός χώρος και κάπνισμα

Ενα από τα μεγαλύτερα "αγκάθια" στη σημερινή Ελληνική πραγματικότητα, και ιδιαίτερα για τους software developers, ειναι το κάπνισμα. Ναι, μπορεί οι χώρες της ΕΕ η μία μετά την άλλη να ακολουθούν το Αμερικανικό μοντέλο απαγορεύοντας το κάπνισμα σχεδόν παντού σε κοινόχρηστους χώρους και ενθαρρύνοντας τις ιδιωτικές εταιρίες να ακολουθήσουν παρόμοια μέτρα, όμως στην Ελλάδα τα πράγματα ακόμα είναι μοιρασμένα. Αρκετοί software developers (και όχι μόνο) είναι καπνιστές. Λογω της φύσης της εργασίας του developer, είναι δύσκολο ένας ενεργός καπνιστής που ασκεί αυτό το επάγγελμα να είναι αποδοτικός σε ένα αντικαπνιστικό περιβάλλον, δεδομένου οτι απαιτείται ιδιαίτερη προσήλωση στη δουλειά του η οποία "αδυνατιζει" από τις συνεχείς διακοπές προκειμένου να βγει κάπου έξω για να καπνίσει. Οσο για την αντίστροφη περίπτωση, δηλ. το να είναι κάποιος αντικαπνιστής σε ένα περιβάλλον καπνιστών, γνωρίζουμε όλοι πόσο ενοχλητικό μπορεί να αποδειχθεί αυτό για τον εργαζόμενο.

 

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

 

Για τον προγραμματιστή: Αν καπνίζετε και ΔΕΝ έχετε σκοπό να το κόψετε, ΜΗΝ δουλέψετε σε αντικαπνιστική εταιρία. Οι διαρκείς διακοπές για τσιγάρο θα κάνουν την ζωή σας δύσκολη και θα μειώσουν την παραγωγικότητά σας. Αν η εταιρία οργανώνει πολύωρα meetings, θα αντιμετωπίσετε πρόσθετες δυσκολίες καθώς από ένα σημείο και μετά δεν θα έχετε τη διάθεση να παρακολουθήσετε λόγω επιθυμίας για τσιγάρο. Επιλέξτε κάποια πιό "ανεκτική" εταιρία.

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

(Γενικά, φημολογείται οτι στην Ελλάδα το καπνιστικό - αντικαπνιστικό καθεστώς των μικρού/μεσαίου μεγέθους εταιριών είναι αρκετές φορές άμεσα συνδεδεμένο με τις συνήθειες του "αφεντικού" - αν καπνίζει, τότε η εταιρία είναι καπνιστική. Αν όχι, τοτε είναι αντικαπνιστική. Στις μεγαλύτερου μεγέθους εταιρίες τα πράγματα είναι σαφή - στην πλειοψηφία τους είναι αντικαπνιστικές, πλην εξαιρέσεων.)

 

Τι θα λέγαμε έξω από τα δόντια: Αν δεν έχετε σκοπό να κόψετε το κάπνισμα, επιλέξτε ομοίους σας για να συνεργαστείτε. Αν δεν καπνίζετε, και πάλι επιλέξτε ομοίους σας. Γκρινια, παράπονα και δυσφορία ΜΕΤΑ την πρόσληψη δεν θα ωφελήσουν. Τα πράγματα είναι όπως είναι σε κάθε εταιρία και δεν αλλάζουν εύκολα χωρίς να δυσαρεστηθούν κάποιοι. Μην περιμένετε οτι εσείς, ο καπνιστης/αντικαπνιστής, θα δημιουργήσετε αλλαγή στις συνθήκες εργασίας μιας εταιρίας για να εργάζεστε εσείς καλύτερα.

 

Για την εταιρία: Αν είστε αντικαπνιστική εταιρία, αποφύγετε την πρόσληψη καπνιστών προγραμματιστών. Θα τους κάνετε τη ζωή δύσκολη και θα σας κάνουν την παραγωγή ακόμα πιο δύσκολη. Δεν υπάρχει πιο ενοχλητικό πράγμα για την παραγωγικότητα ενός προγραμματιστή από το να είναι αναγκασμένος να βγεί έξω από το κτίριο για να καπνίσει διακόπτοντας ό,τι κάνει, ή να αναγκάζεται να υποφέρει την παρουσία κάποιου Project Manager επάνω από το κεφάλι του ή σε κάποιο meeting χωρίς να μπορεί να καπνίσει.

Αν είστε εταιρία στην οποία επιτρέπεται το κάπνισμα και απασχολείτε μη καπνιστές προγραμματιστές, φροντίστε να τους τοποθετήσετε σε άλλο χώρο από τους καπνιστές. Αν τους βάλετε όλους μαζί, η παραγωγικότητά τους θα χαθεί στις «κόντρες» που θα αναπτυχθούν μεταξύ τους. Έν ανάγκει, φτιάξτε δύο ξεχωριστές ομάδες development με βάση αυτό το κριτήριο και μόνο. Θα διευκολύνετε τη δουλειά όλων.

 

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

 

Τη δημοσίευση μπορείτε να τη συζητήσετε στην αντίστοιχη περιοχή στις Συζητήσεις του DotNetZone.gr

Disclaimer: Οι παραπάνω απόψεις και θέσεις ανήκουν στο συγγραφέα της δημοσίευσης και μπορούν να χαρακτηριστούν υποκειμενικές. Η αρχική ιδέα της συγγραφής βασίστηκε πάνω σε μια δημοσίευση που έγινε στο JoelOnSoftware.com και την οποια μπορείτε να βρείτε εδώ: http://www.joelonsoftware.com/articles/fog0000000043.html. Δεν διεκδικούν σε καμμια περίπτωση τον τίτλο επίσημων συμβουλών παραγωγικότητας και η συζήτηση ή / και αμφισβήτησή τους όχι μόνο επιτρέπεται, αλλά ενθαρρύνεται!

 

 

 


 

Δημοσιεύτηκε στις από το μέλος cap | 4 σχόλια
Δημοσίευση στην κατηγορία:

Συμβουλές: Πόσες φορές την ημέρα διακόπτεται απρογραμμάτιστα η εργασία σας;

Βρίσκεστε όλοι μαζί μέσα σε ένα δωμάτιο; Περνάνε πάνω από το κεφάλι σας συνεχώς Project Managers ή ανώτερα στελέχη κρυφοκοιτώντας την οθόνη σας ή διακόπτοντάς σας για να σας ρωτήσουν πώς τα πάτε ή για να σας δώσουν οδηγίες;
Το τηλέφωνό σας χτυπάει συχνά για να σας ρωτήσουν διάφοροι διάφορα; Δεχεστε συχνά διακοπές από συναδέλφους σας για ερωτήσεις τις οποίες μπορούν να απαντήσουν και μόνοι τους; Σας καλούν ξαφνικά σε meetings για τα οποία κάποιος αμέλησε να σας ενημερώσει;

Για την εταιρία: Όλα αυτά συμβάλλουν στην ελλάτωση της παραγωγικότητας των προγραμματιστών. Η ανάπτυξη λογισμικού είναι μια πνευματική εργασία. Χρειάζεται την αντίστοιχη συγκέντρωση. Οι υστερικοί Project Managers που ρωτάνε κάθε πέντε λεπτά «πως πάει» δεν συμβάλλουν σε αυτό. Οργανώστε το χρονο που θα απασχολειτε τους προγραμματιστές καθορίζοντας γνωστά σε ολους εκ των προτέρων χρονικά διαστήματα σε συγκεκριμένες ημέρες. Δώστε οδηγίες σε όσους έχουν αλληλεπίδραση με τους developers για τα παραπάνω και οργανώστε τα meetings σας δημιουργώντας όσο λιγότερες έκτακτες διακοπές είναι δυνατόν. Αν ο χώρος σας σας το επιτρέπει, «αραιώστε» ελαφρά τις αποστάσεις μεταξύ των developers σε περίπτωση που αυτοί δείχνουν να αποσυντονίζονται από την μεταξύ τους εκτακτη επικοινωνία και επιθυμούν πιο ήσυχες συνθήκες εργασίας.

Τι θα λέγαμε έξω από τα δόντια: Η παραγωγικότητα στην πνευματική εργασία δεν εξασφαλίζεται με το «μαστίγιο» και τη δημιουργία παράλογου άγχους, αλλά με την εξασφάλιση κινήτρων. Εχετε προσλάβει ανθρώπους με το σκεπτικό ότι φροντίζουν για τη δουλειά τους. Φροντίστε να ΜΠΟΡΟΥΝ να φροντίσουν για τη δουλειά τους.

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

Τι θα λέγαμε έξω από τα δόντια: Κάντε σαφές ότι απροειδοποίητες διακοπές, προσκλήσεις σε meetings, ερωτήσεις, τηλεφωνικές ή κατ’ιδίαν, θα μπαίνουν σε queue και δεν θα απαντώνται όποτε «καπνίσει» σε αυτόν που ρωτάει. Η εταιρία θέλει να κάνετε τη δουλειά σας σωστά. Απαιτήστε να εργάζεστε κι εσείς σωστά. Δεν υπάρχουν δικαιολογίες σε αυτό. Ενας συνάδελφός σας μπορεί να διακόψει τη συγκέντρωσή σας για 15 λεπτά για να ρωτήσει κάτι που θα του εξοικονομήσει 30 δευτερόλεπτα εργασίας. Ενας project manager μπορεί να διακόψει απρογραμμάτιστα τη συγκέντρωσή σας για μια ώρα για να ρωτήσει πληροφορίες που θα του αποφέρουν μόνο καθησυχασμό στο αγχος του «ποτε θα παραδοθεί» που τον διακατέχει. Εξυπηρετήστε τους την πρώτη φορά, αλλά δαγκώστε τους αν το επαναλαμβάνουν συχνά. Αλλιώς και τη δουλειά σας δεν θα κάνετε και υπαίτιοι αποτυχίας θα χαρακτηριστείτε.

Τη δημοσίευση μπορείτε να τη συζητήσετε στην αντίστοιχη περιοχή στις Συζητήσεις του DotNetZone.gr

Disclaimer: Οι παραπάνω απόψεις και θέσεις ανήκουν στο συγγραφέα της δημοσίευσης και μπορούν να χαρακτηριστούν υποκειμενικές. Η αρχική ιδέα της συγγραφής βασίστηκε πάνω σε μια δημοσίευση που έγινε στο JoelOnSoftware.com και την οποια μπορείτε να βρείτε εδώ:
http://www.joelonsoftware.com/articles/fog0000000043.html. Δεν διεκδικούν σε καμμια περίπτωση τον τίτλο επίσημων συμβουλών παραγωγικότητας και η συζήτηση ή / και αμφισβήτησή τους όχι μόνο επιτρέπεται, αλλά ενθαρρύνεται!

 

 

 


Δημοσιεύτηκε στις από το μέλος cap | 0 σχόλια
Δημοσίευση στην κατηγορία:

Συμβουλές: Ποιά είναι η σχέση σας με τις προδιαγραφές;

Ειτε δουλεύει μια ολόκληρη ομάδα είτε ένα άτομο πάνω σε ένα project, αν δεν έχετε καταρτίσει προδιαγραφές το project είναι, στην καλύτερη περίπτωση, καταδικασμένο σε φριχτές καθυστερήσεις και δεν πρόκειται να «βγάλει» τα λεφτά του. Οι προγραμματιστές δεν θα ξέρουν τι ακριβώς πρέπει να φτιάξουν, οι πελάτες θα φωνάζουν «μα αυτό το ΕΝΝΟΟΥΣΑΜΕ όταν σας είπαμε αυτό κι εκείνο», και πολλές φορές θα χρειαστεί να γκρεμίσετε το μισό κώδικα της εφαρμογής και να τον ξαναγράψετε από την αρχή για χάρη κάποιας ασάφειας που δεν ξεκαθαρίστηκε παρά μόνο όταν ο πελάτης είδε την εφαρμογή να τρέχει. Υπόψη, κανείς δεν πρόκειται να αποζημιώσει την εταιρία σας γι’αυτό.

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

Τι θα λέγαμε έξω από τα δόντια: Μην «σνομπάρετε» την ανάλυση και μην επιχειρείτε να αρχίσετε να γράφετε datagrids και φόρμες με το «καλημερα». Οι πιθανότητες είναι ότι θα χτυπάτε το κεφάλι σας στον τοίχο πολύ σύντομα.

Για την εταιρία: Φροντίστε να εκμεταλλευθείτε το ανθρώπινο δυναμικό που έχετε στη διάθεσή σας με τον καλύτερο δυνατό τρόπο. Λαβετε υπόψη ότι η συλλογή και η σωστή κατάρτιση προδιαγραφών πολλές φορές αναλώνει σημαντικό μέρος του συνολικού χρόνου ανάπτυξης και διαθέστε εκεί τους απαιτούμενους πόρους. Εξασφαλίστε απρόσκοπτη επικοινωνία με τους εκπροσώπους του πελάτη οι οποίοι θα σας προσφέρουν όλες τις απαιτούμενες πληροφορίες. Αναθέστε σε ένα άτομο ή μια όμάδα ανθρώπων τη συλλογή προδιαγραφών για κάθε έργο που αναλαμβάνετε. Εντάξτε το κόστος της συλλογής προδιαγραφών στο συνολικό κόστος του έργου. ΒΑΛΤΕ ΤΟΝ ΠΕΛΑΤΗ ΝΑ ΥΠΟΓΡΑΨΕΙ. Αν φοβάστε ότι με τις προδιαγραφές το κόστος θα εκτιναχθεί στα ύψη και ο πελάτης δεν θα συμφωνήσει, ΜΗΝ ΑΝΑΛΑΜΒΑΝΕΤΕ ΤΟ ΕΡΓΟ. Καλύτερα μια άμεση απώλεια παρά μια εικονική «ανάσα» στα οικονομικά της εταιρίας σας με μακροπρόθεσμες δυσάρεστες συνέπειες που θα σας βάλουν ακόμα πιο «μεσα» από πριν.

Τι θα λεγαμε έξω από τα δόντια: Μην «κάψετε» τους developers βάζοντάς τους να υλοποιούν έργα με στενά deadlines χωρίς προδιαγραφές, ή περιμένοντας ότι οι προδιαγραφές θα έρθουν «μαγικά» κατά τη διάρκεια της ανάπτυξης. Ο,τι κοστολογήσατε θα σας κοστίσει διπλά ή τριπλά για να ολοκληρωθεί.

Τη δημοσίευση μπορείτε να τη συζητήσετε στην αντίστοιχη περιοχή στις Συζητήσεις του DotNetZone.gr

Disclaimer: Οι παραπάνω απόψεις και θέσεις ανήκουν στο συγγραφέα της δημοσίευσης και μπορούν να χαρακτηριστούν υποκειμενικές. Η αρχική ιδέα της συγγραφής βασίστηκε πάνω σε μια δημοσίευση που έγινε στο JoelOnSoftware.com και την οποια μπορείτε να βρείτε εδώ:
http://www.joelonsoftware.com/articles/fog0000000043.html. Δεν διεκδικούν σε καμμια περίπτωση τον τίτλο επίσημων συμβουλών παραγωγικότητας και η συζήτηση ή / και αμφισβήτησή τους όχι μόνο επιτρέπεται, αλλά ενθαρρύνεται!

 

 

 


Δημοσιεύτηκε στις από το μέλος cap | 0 σχόλια
Δημοσίευση στην κατηγορία:

Συμβουλές: Χρησιμοποιείτε κάποια εφαρμογή Bug Tracking;

Η μήπως σημειώνετε τα bugs σε κάποιο χαρτί; Ξερετε πόσα bugs έχει το λογισμικό σας κάθε στιγμή και πόσα μπορούν να φτιαχτούν ως την επόμενη εγκατάσταση; Τα έχετε ταξινομήσει σύμφωνα με το βαθμό σημαντικότητάς τους; Εχετε αναθέσει συγκεκριμένα bugs σε συγκεκριμένους ανθρώπους;
Τι;
Ειστε μικρή ομάδα;
Δεν το χρειάζεστε;
Τα έχετε όλα ΣΤΟ ΜΥΑΛΟ σας;
Συγχαρητήρια. Κερδίσατε αμέτρητα Σαββατοκύριακα εργασίας χωρίς λόγο και απίστευτη γκρίνια από τους πελάτες σας, και πάλι χωρίς λόγο. Καλή σας διασκέδαση.

Για την εταιρία: Η υιοθέτηση ενός bug tracking software δεν κοστίζει πολλά, μια και υπάρχουν αρκετά freeware ή open source προγράμματα που διατίθενται ελεύθερα. Ακόμα και το Excel μπορεί να κάνει αυτή τη δουλειά, ελλείψει ύπαρξης εξειδικευμένης εφαρμογής. Υιοθετώντας έστω και μια απλή διαδικασία διαχείρισης bugs θα έχετε πληρέστερο έλεγχο της διαδικασίας παραγωγής.

Τι θα λέγαμε έξω από τα δόντια: Τα bugs είναι αναμενόμενα στην κατασκευή λογισμικού. Αντιμετωπίστε τα οργανωμένα, ως μέρος της όλης διαδικασίας, και όχι ως κάτι «κακο» που «δεν συμβαίνει συχνά σε εμάς» και που απλά θέλετε να το «ξορκίσετε» όσο πιο γρήγορα και αναίμακτα γίνεται.

Για τον προγραμματιστή: Μην θεωρείτε περιττή πολυτέλεια και επιπρόσθετη αγγαρεία τις καταχωρήσεις σε ένα bug tracking software. Κάθε λεπτό που ξοδεύετε για να καταχωρήσετε κάποιο bug σε αυτό, θα το εξοικονομήσετε από το συνολικό χρονο παραγωγής του λογισμικού όταν και αν χρειαστεί να δείτε τι εκκρεμμότητες υπάρχουν. Επίσης είναι εύκολο, αν χρησιμοποιείτε λογισμικού αυτού του είδους, να «μοιράσετε» εργασίες διορθωσης σε συναδέλφους σας και να έχετε όλοι, σαν ομάδα, συνολική γνώση του τι πρέπει να διορθωθεί.

Τι θα λέγαμε έξω από τα δόντια: Μην βαριέστε! Η ανάπτυξη λογισμικού δεν είναι μόνο κώδικας! Είναι και σωστή οργάνωση. Καλός developer είναι αυτός που γράφει εκτός από καλό, bug-free κώδικα και αυτό δεν μπορεί να το πετύχει αν πηγαίνει μόνο με τη διαίσθηση.

Disclaimer: Οι παραπάνω απόψεις και θέσεις ανήκουν στο συγγραφέα της δημοσίευσης και μπορούν να χαρακτηριστούν υποκειμενικές. Η αρχική ιδέα της συγγραφής βασίστηκε πάνω σε μια δημοσίευση που έγινε στο JoelOnSoftware.com και την οποια μπορείτε να βρείτε εδώ: http://www.joelonsoftware.com/articles/fog0000000043.html. Δεν διεκδικούν σε καμμια περίπτωση τον τίτλο επίσημων συμβουλών παραγωγικότητας και η συζήτηση ή / και αμφισβήτησή τους όχι μόνο επιτρέπεται, αλλά ενθαρρύνεται!

Τη δημοσίευση μπορείτε να τη συζητήσετε στην αντίστοιχη περιοχή στις Συζητήσεις του DotNetZone.gr

 

 


 

Δημοσιεύτηκε στις από το μέλος cap | 0 σχόλια
Δημοσίευση στην κατηγορία:

Συμβουλές: Χρησιμοποιείτε λογισμικό Source Control;

Για τα Ελληνικά δεδομένα, η κύρια ερώτηση θα έπρεπε να είναι «ξέρετε ΤΙ είναι το λογισμικο Source Control»; Πολλές Ελληνικές εταιρίες των οποίων οι ομάδες ανάπτυξης αποτελούνται από μονοψήφιο αριθμό ατόμων δείχνουν να αγνοούν την ύπαρξη του Source Control, ιδιαίτερα μάλιστα όταν ένας προγραμματιστής έχει κάθε φορά την ευθύνη ενός ολόκληρου project. Αλλοίμονο, όμως, αν παρουσιαστεί η ανάγκη να δουλέψουν δύο άνθρωποι μαζί! Η καταστροφή έρχεται με τη μορφή χιονοστιβάδας: Ο ένας δεν ξέρει τι άλλαξε ο άλλος, ο κώδικας δεν αποθηκεύεται σε κεντρικό σημείο (η αν αποθηκεύεται, διαγράφεται και καταστρέφεται το ίδιο εύκολα), οι προγραμματιστές γίνονται ειδικοί στο copy/paste αρχείων κώδικα και το προϊόν σας βγαίνει στα ράφια περίπου 1000 ημέρες μετά το deadline.
Ένα προϊον Source Control ενθαρρύνει τη συλλογική εργασία. Οποιαδήποτε εταιρία διαθέτει πανω από έναν προγραμματιστή πρέπει να το έχει υπόψη της. Ακόμα και αν φαίνεται άχρηστο σε ομάδες του ενός ή των δύο ατόμων, η χρησιμοτητά του θα φανεί όταν η δουλειά θα αρχίσει να πολλαπλασιάζεται.

Για τον προγραμματιστή: ΑΠΑΙΤΗΣΤΕ την ύπαρξη source control προκειμένου να κάνετε σωστά τη δουλειά σας. Αν η εταιρία δεν ανταποκρίνεται στην απαίτησή σας, τότε οι πιθανότητες είναι ότι δεν θα ανταποκριθεί και σε άλλες, μεγαλύτερης βαρύτητας απαιτήσεις. Πάρτε τα μέτρα σας.

Τι θα λέγαμε έξω από τα δόντια: Ειστε σοβαροί επαγγελματίες και θέλετε σοβαρή αντιμετώπιση. Αν δεν την έχετε, κόφτε λάσπη.

Για την εταιρία: Ξοδέψτε χρονο και χρήμα στην οργάνωση της διαδικασίας ανάπτυξης, αν θέλετε να αυξηθεί το μέγεθος και τα έσοδά σας. Ικανοποιήστε τις απαιτήσεις του προγραμματιστή ο οποίος επιθυμεί να αυξήσει την παραγωγικότητά του, κάτι που θα έχει σαφή επίδραση στην αποδοτικότητα της ίδιας της εταιρίας. Το κόστος είναι πολύ μικρότερο από το όφελος που θα αντλήσετε.

Τι θα λέγαμε έξω από τα δόντια: Βάλτε το χέρι στην τσέπη για να μπούν λεφτά στην τσέπη. Οι τσιγκουνιές θα σας κρατήσουν στη Γ’ Εθνική ακόμα και όταν όλες οι άλλες συνθήκες ωριμάσουν. Μετά θα είναι αργά.

Disclaimer: Οι παραπάνω απόψεις και θέσεις ανήκουν στο συγγραφέα της δημοσίευσης και μπορούν να χαρακτηριστούν υποκειμενικές. Η αρχική ιδέα της συγγραφής βασίστηκε πάνω σε μια δημοσίευση που έγινε στο JoelOnSoftware.com και την οποια μπορείτε να βρείτε εδώ: http://www.joelonsoftware.com/articles/fog0000000043.html. Δεν διεκδικούν σε καμμια περίπτωση τον τίτλο επίσημων συμβουλών παραγωγικότητας και η συζήτηση ή / και αμφισβήτησή τους όχι μόνο επιτρέπεται, αλλά ενθαρρύνεται!

Τη δημοσίευση μπορείτε να τη συζητήσετε στην αντίστοιχη περιοχή στις Συζητήσεις του DotNetZone.gr

 

 

 

 

Δημοσιεύτηκε στις από το μέλος cap | 0 σχόλια
Δημοσίευση στην κατηγορία:

Acrobase - Η αναγέννηση μιας από τις δημοφιλέστερες BBS στην Ελλάδα κατά την προ-Internet εποχή

Acrobase LogoΟσοι από εσάς υπήρξαν φανατικοί των BBS στην προ-internet Ελληνική εποχή, με τα modem κάθε βράδυ να παίρνουν φωτιά και τις συζητήσεις να δίνουν και να παίρνουν, ενδεχομένως να θυμάστε την Acrobase BBS, μια από τις δημοφιλέστερες υπηρεσίες Bulletin Board System με τον εκπληκτικό αριθμό (τότε!) των 2000 ενεργών μελών. Η Acrobase, με 18 χρόνια ενεργής παρουσίας, έζησε τις μεγαλύτερες στιγμές της το διάστημα από το 1990 ως το 1996 οπου και με την άνοδο της χρήσης του Internet τα συστήματα αυτά άρχισαν σιγά σιγά να χάνουν το κοινό τους.

Σημερα η τεχνολογία έχει επιτρέψει πολύ αμεσότερες μορφές επικοινωνίας. Forums, newsgroups, email, sms… στην εποχή όμως εκείνη οπου το internet το αντιμετώπιζε η πλειοψηφία του κόσμου με τη φράση «τιντουτ’» J, και που κινητά, SMS και e-mail ήταν στα σπάργανα και αντε να τα ξέρανε μονο λίγοι και εκλεκτοί, αρκετοί από εμάς είχαν την ευκαιρία να ζήσουν την πραγματική δικτυακή επικοινωνία μέσα από την μεγάλη και πολύ δεμένη παρέα της Acrobase. Ανθρωποι γνωρίστηκαν και παντρεύτηκαν από εκεί, δημιουργήθηκαν φιλίες που κρατάνε ως σήμερα, συνεργασίες που ευδοκίμησαν, και πάνω από όλα υπήρχε διάχυτο το αίσθημα της παρέας. Αυτό φαινόταν και στις συναντήσεις των μελών οπου σπάγαμε πάντοτε όλα τα ρεκόρ συμμετοχής (500+ ατομα αν θυμάμαι καλά σε μια από τις τελευταίες που είχα παρευρεθεί). Ο χαρακτήρας των ανθρώπων και η δίψα τους για επικοινωνία αλλά και για δημιουργία μιας μεγάλης, τεράστιας παρέας, έκανε δυνατό αυτό το φαινόμενο.

Ειχαμε την τιμή και την ευθύνη να είμαστε λοιπόν οι πρωτοπόροι της ψηφιακής επικοινωνίας, και τιμήσαμε το προνόμιό μας αυτό με τον καλύτερο δυνατό τρόπο όλα αυτά τα χρόνια. Όμως, η προσπάθεια δεν τελείωσε. Η Acrobase ξαναζεί στο http://www.acrobase.gr/ υπό τη μορφή ενός σύγχρονου forum. Στόχος της είναι να μαζέψει όλα τα παλιά της μέλη ξανά αλλά και να συγκεντρώσει νέους φίλους. Πολλά από τα παλαιότερά της μέλη είναι σημερα διακεκριμένοι επαγγελματίες ή επιστήμονες, και την τιμούν ήδη με την παρουσία τους στη νέα αυτή προσπάθεια. Ο γράφων είχε την τιμή να είναι ένας εκ των πολλών καλών φίλων και συν-διοργανωτών της Acrobase εκείνη την εποχή με το (τότε και τώρα) ψευδώνυμο pilotsf.

Πληροφορίες για την Acrobase μπορείτε επίσης να βρείτε στο www.acrobase.org.

Αν λοιπόν αποτελούσατε μέλη της Acrobase παλιότερα, γνωρίζατε τι ήταν, ή την είχατε κάπου ακουστά, περάστε μια βόλτα. Αξίζει τον κόπο. Αλλα και να μην την γνωρίζατε, θα καταλάβετε :). Προσωπικά χρησιμοποιώ το παλιό μου nickname (από το 1993), το οποίο είναι pilotsf και θα συμβούλευα όσους υπήρξαν παλιότερα μέλη να πράξουν το ίδιο.

 

 

 

Δημοσιεύτηκε στις από το μέλος cap | 0 σχόλια
Δημοσίευση στην κατηγορία:

Θέματα navigation στο DotNetNuke ή πώς να γίνετε καλός μεταμεσονύκτιος προγραμματιστής :)

Χαρούμενος όπως πάντα (στην αρχή τουλάχιστον) έστησα το DotNetNuke 4.3.0 για να αρχίσω να προσαρμόζω το portal ενός πελάτη. Το κακό βέβαια ήταν οτι ο πελάτης είχε εκ των προτέρων δημιουργημένα σε HTML τα templates των σελίδων που ήθελε, και εγώ είχα το δύσκολο έργο να τα προσαρμόσω στα skins και τα containers του DNN.

Εκεί λοιπόν έπεσα πάνω σε ένα ενδιαφέρον πρόβλημα. Ακούστε:

Ο πελάτης έχει μια μορφή sitemap δύο επιπέδων (τριών, αν λάβουμε υπόψη τη home page). Δηλαδή κάπως έτσι:

Home
---Κατηγορία 1
------Υποκατηγορία 1
------Υποκατηγορία 2
---Κατηγορία 2
------Υποκατηγορία 1

και ούτω καθ'εξής. Ηθελε λοιπόν το εξής:

Είτε βρίσκεται στην Κατηγορία 1 είτε σε κάποια από τις υποκατηγορίες της, στο μενού που θα "έπεφτε" στο left pane, να εμφανίζεται ΠΑΝΤΑ η Κατηγορία 1 και από κάτω οι υποκατηγορίες της.
Εκτός αυτού, το μενού για κάθε "Κατηγορία" θα έπρεπε να έχει διαφορετικά styles.

Ανακάλυψα με τρόμο οτι το SolPartMenu δεν μπορεί να κάνει αυτή τη δουλειά. (Η τουλάχιστον δεν βρήκα άμεσα τρόπο, για να είμαι ακριβής). Απελπισία. Ο,τι side menu navigation module είχα δοκιμάσει (συμπεριλαμβανομένου και του πολύ καλού κατά τα άλλα Inventua Side Menu) δεν φαινοταν να καλύπτει ούτε καν την πρώτη προϋπόθεση. Ακούγεται περίεργο, αλλά είναι αληθινό. Με το Inventua το πλησιέστερο που κατάφερα να φτάσω ήταν στο να έχω το υποδέντρο δυο επιπέδων όταν έκανα κλικ σε κάποια από τις κατηγορίες, (καθε "Κατηγορία" είχε ανατεθεί ως root σελίδα, με αποτέλεσμα να έχω πολλές root - δεν μπόρεσα να το αποφύγω), αλλά στο styling...χαμός. Δεν έβγαινε άκρη.

Για να μην τα πολυλογώ, ανακάλυψα ένα πολύ απλό και δωρεάν module στη sixxac.com, ονόματι Sixxac Menu. Απλό και εύκολο. Του λες ποιό επίπεδο θέλεις να εμφανίζει και κάτω και το δείχνει. Τα styles του είναι απλά και γίνονται εύκολα override.

Τωρα ειχα δύο προβλήματα να λύσω:

1. Πώς θα εμφάνιζα ΚΑΙ την σελίδα π.χ. "Κατηγορία χ", αδιάφορα με το αν βρισκόμουν σε κατηγορία ή υποκατηγορία; Το Sixxac καταλάβαινε μόνο επίπεδα. Του έλεγες "επίπεδο 2", εδειχνε ότι βρισκόταν στο επίπεδο 2 (ευτυχώς από εκεί που βρισκόσουν, υπολογίζοντας το υπο-δέντρο από το root). Δεν ηθελα να σηκώνω Visual Studio, ήθελα μια απλή και κομψή λύση.

2. Πώς θα άλλαζα τα χρώματα ανάλογα με το σε ποιό υποδέντρο βρισκόμουν; (ΑΡΓΚ!)

Ξεκίνησα λοιπόν να λύσω το όλο puzzle φτιάχνοντας ένα δικο μου container για το όλο μενού και παίζοντας. Ψαχνοντας λοιπον, ανακαλυπτω αυτή την ωραία κλήση η οποία μπορεί να γίνει inline μέσα από τον container μια και καλεί public static method του Container class: (περισσότερα για αυτό μπορείτε να βρειτε κάνοντας κλικ εδώ)

<%=CType(DotNetNuke.UI.Containers.Container.GetPortalModuleBase(dnnACTIONS).PortalSettings.ActiveTab.BreadCrumbs(0), DotNetNuke.Entities.Tabs.TabInfo).Title%>

Χαχα! Μπορείς να πάρεις reference στα modules της σελίδας, αρκεί να περάσεις ένα user control που υπάρχει ήδη στον container σου (οπως το dnnACTIONS). Εμμέσως πλην σαφώς, από εκεί έχεις πρόσβαση στο ActiveTab!
Παίζοντας μετά ανακάλυψα οτι τo πρώτο element του Breadcrumbs collection μου δίνει την Parent σελίδα (ή την τρέχουσα, αν δεν υπάρχει parent)! Αρα λοιπον νατος ο τίτλος της parent! Οπου και να βρισκόμουν, είχα πάντα στα χέρια μου τον τίτλο "Κατηγορία χ", οπου χ το υποδέντρο που βρισκομουν.

Αρα λύθηκε το πρώτο πρόβλημα. Το δεύτερο όμως; Επρεπε να χρησιμοποιώ διαφορετικά styles για κάθε υποδέντρο, που σημαίνει οτι έπρεπε να βάζω με το χεράκι το navigation module σε κάθε σελίδα που φτιάχνω και το μόνο έξυπνο που θα μπορούσα να κάνω θα ήταν να φτιάξω μια ομάδα από containers (όσα και τα υποδέντρα μου) που ο καθένας να χρησιμοποιεί διαφορετικό stylesheet. ΑΡΓΚ!

Ε, οχι λοιπον! Μεσα στον ωραίο μου container έβαλα αυτό:

<link rel="stylesheet" href="<%=DotNetNuke.UI.Containers.Container.GetPortalModuleBase(dnnACTIONS).PortalSettings.ActiveTab.ContainerPath%><%=CType(DotNetNuke.UI.Containers.Container.GetPortalModuleBase(dnnACTIONS).PortalSettings.ActiveTab.BreadCrumbs(0), DotNetNuke.Entities.Tabs.TabInfo).TabID.Tostring%>.css" />

Τι λεει αυτό το μακρυνάρι;

Το πρώτο κομμάτι μου δίνει το path του container μου.
Το δεύτερο κομμάτι, όπως έκανα και πριν, μου δίνει το Breadcrumbs collection από το activeTab. Τι παίρνω όμως τώρα; Το ID του parent tab (θυμηθείτε οτι το BreadCrumbs(0) είναι για κάποιο λόγο το parent tab πάντα - εκτος αν δεν έχω parent).

Τι έκανα λοιπον συνολικά; Δυναμικά ορίζω ΠΟΙΟ stylesheet θα χρησιμοποιήσω (της μορφής 59.css, 34.css κλπ) για κάθε PARENT CATEGORY. Είχα 6 στη συγκεκριμένη περίπτωση.

Ετσι λοιπον χωρίς να ανοίξω Visual Studio και χωρίς να γράψω πάνω από 1-2 γραμμούλες κώδικα πέτυχα να:

- Εχω ένα module σε όλες τις σελίδες μου που να προσαρμόζεται δείχνοντας πάντα ένα υποδέντρο 2 επιπέδων και μαλιστα το ίδιο υποδέντρο ανεξαρτήτως αν βρίσκομαι στο πρώτο ή στο δεύτερο επίπεδο.
- Εχω διαφορετικό "styling" για κάθε υποδέντρο με χρήση απλά και μόνο ενός stylesheet που σαν file name έχει το tab ID του πρώτου επιπέδου του υποδέντρου.

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

 

 

 

 

Δημοσιεύτηκε στις από το μέλος cap | 1 σχόλια
Δημοσίευση στην κατηγορία: ,

Videos: Passing a Reference Type ByVal / Passing Strings ByVal

Με αφορμή τη δημοσίευση Passing Objects in Visual Studio 2003 που έγινε στο blog του Zeon, έφτιαξα δύο πεντάλεπτα βιντεάκια τα οποία δείχνουν με παραδείγματα τι γίνεται οταν περνάμε ένα reference type byval σε μια συνάρτηση που το μεταβάλλει, καθώς και τι ακριβώς συμβαινει με τα Strings, τα οποία δείχνουν να συμπεριφέρονται σαν value types ενώ στην πραγματικότητα είναι reference types.

Τα video είναι στην Ελληνική γλώσσα, και θα τα βρείτε στο dotNETZone.gr στις ακόλουθες διευθύνσεις:

Λήψη του "Passing Strings ByVal" video

Λήψη του "Passing Reference Types ByVal" video

Σημείωση: Για να πραγματοποιήσετε λήψη των video, πρέπει να είστε μέλη του dotNETZone.gr και να έχετε κάνει login.

 

 

 

 

 

Δημοσιεύτηκε στις από το μέλος cap | 2 σχόλια
Δημοσίευση στην κατηγορία:

Δωρεάν εργαλεία για XML από το Microsoft XML Tools Team

Τέσσερα απαραίτητα δωρεάν εργαλεία για να κάνετε τη ζωή σας με την XML πιό εύκολη. Ειδικά το XSD Inference 1.0 είναι κάτι που αρκετοί από εμάς μπορεί να χρειαστούν.

XSD Object Code Generator
The utility builds C# and VB.NET data structures from an XSD schema that can serialize and de-serialize to XML and other formats. This tool is available here.

Microsoft XML Diff and Patch
This tool lets you identify changes between two XML files. It also lets you patch the original XML file with the changes to get the final XML file. The assembly, source code, documentation and samples for this tool are now available here.

XSD Schema Validator
Leveraging the top conformant XML Schema Parser released with .Net Frameworks, this tool allows you to validate an XML documents against an W3C XML Schema (XSD) or an XML Data-Reduced (XDR) schema, verify the schemas are valid, or simply check the well-formedness of XML documents.

Microsoft XSD Inference 1.0
The Microsoft XSD Inference utility is used to create an XML Schema definition language (XSD) schema from an XML instance document. When provided with wellformed XML file, the utility generates an XSD that can be used to validate that XML file. You can also refine the XSD generated by providing the tool more wellformed XML files. The download contains the core library, simple command line utility and the source code.

Τα εργαλεία μπορείτε να τα βρείτε εδώ: http://www.gotdotnet.com/team/xmltools/default.aspx

Πηγή: David Hayden's Blog

 

 

 

Δημοσιεύτηκε στις από το μέλος cap | 0 σχόλια
Δημοσίευση στην κατηγορία: ,

C5 Generic Collection Library for .NET 2.0

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

Η C5 είναι μια βιβλιοθήκη generic collection classes gia C# και άλλες γλώσσες του CLI για το Microsoft.NET 2.0 και το Mono 1.2. Προσφέρει λειτουργίες και δομές δεδομένων που δεν παρέχουνται από το standard  System.Collections.Generic namespace.

Εδώ μπορείτε να βρείτε binaries, sources, online και downloadable documenation και ένα e-book που περιγράφει τη βιβλιοθήκη: http://www.itu.dk/research/c5/

Αναφέρω παρακάτω επιγραμματικά το τι περιέχει, περισσότερα μπορείτε να βρείτε στο online documentation καθώς και στο βιβλίο:

Interfaces overview
ICollection<T>, ICollectionValue<T>, IDictionary<K,V>, IDirectedCollectionValue<T>, IDirectedEnumerable<T>, IExtensible<T>, IIndexed<T>, IIndexedSorted<T>, IList<T>, IPersistentSorted<T>, IPriorityQueue<T>, IPriorityQueueHandle<T>, IQueue<T>, ISequenced<T>, IShowable, ISorted<T>, ISortedDictionary<K,V>, IStack<T>

Classes overview
ArrayBase<T>, ArrayBase<T>.Range, ArrayList<T>, ByteEqualityComparer, C5Random, CharEqualityComparer, CircularQueue<T>, ClearedEventArgs, ClearedRangeEventArgs, CollectionBase<T>, CollectionModifiedException, CollectionValueBase<T>, CollectionValueBase<T>.RaiseForRemoveAllHandler, Comparer<T>, ComparerZeroHashCodeEqualityComparer<T>, DelegateComparer<T>, DictionaryBase<K,V>, DirectedCollectionBase<T>, DirectedCollectionValueBase<T>, DoubleEqualityComparer, DuplicateNotAllowedException, EnumerableBase<T>, EqualityComparer<T>, EquatableEqualityComparer<T>, FixedSizeCollectionException, GuardedCollection<T>, GuardedCollectionValue<T>, GuardedDictionary<K,V>, GuardedDirectedCollectionValue<T>, GuardedDirectedEnumerable<T>, GuardedEnumerable<T>, GuardedEnumerator<T>, GuardedIndexedSorted<T>, GuardedList<T>, GuardedQueue<T>, GuardedSequenced<T>, GuardedSorted<T>, GuardedSortedDictionary<K,V>, HashBag<T>, HashDictionary<K,V>, HashedArrayList<T>, HashedLinkedList<T>, HashSet<T>, IncompatibleViewException, IntEqualityComparer, InternalException, IntervalHeap<T>, InvalidPriorityQueueHandleException,  ItemAtEventArgs<T>, ItemCountEventArgs<T>, KeyValuePairComparer<K,V>, ValuePairEqualityComparer<K,V>, LinkedList<T>, NaturalComparer<T>, NaturalComparerO<T>, NaturalEqualityComparer<T>, NoSuchItemException, NotAViewException, NotComparableException, ReadOnlyCollectionException, ReferenceEqualityComparer<T>,  SequencedBase<T>, SequencedCollectionEqualityComparer<T,W>, Showing, SortedArray<T>, SortedDictionaryBase<K,V>, Sorting, TestedAttribute, TreeBag<T>, TreeDictionary<K,V>, TreeSet<T>, UnlistenableEventException, UnsequencedCollectionEqualityComparer<T,W>, ViewDisposedException, WrappedArray<T>

Value Types overview
EnumerationDirection, EventTypeEnum, HashSet<T>.Feature, KeyValuePair<K,V>, Rec<T1,T2,T3,T4>, Rec<T1,T2,T3>, Rec<T1,T2>, SortedArray<T>.Feature, Speed

Delegates overview
Act, Act<A1,A2,A3,A4>, Act<A1,A2,A3>, Act<A1,A2>, Act<A1>, CollectionChangedHandler<T>, CollectionClearedHandler<T>, Fun<A1,A2,A3,A4,R>, Fun<A1,A2,A3,R>, Fun<A1,A2,R>, Fun<A1,R>, Fun<R>, ItemInsertedHandler<T>, ItemRemovedAtHandler<T>, ItemsAddedHandler<T>, ItemsRemovedHandler

 

 

Δημοσιεύτηκε στις από το μέλος cap | 0 σχόλια
Δημοσίευση στην κατηγορία:

WhyReboot: Βρείτε αν ο υπολογιστής σας χρειάζεται πραγματικά επανεκκίνηση μετά από κάποια εγκατάσταση

Πολλές εφαρμογές απαιτούν, μετά την εγκατάστασή τους, την επανεκκίνηση του υπολογιστή. Οι κατασκευαστές του WhyReboot ήθελαν να αντιμετωπίσουν αυτό το θέμα, το οποίο αρκετές φορές τους ταλαιπωρούσε άδικα, μια και ο εκάστοτε προγραμματιστής έκανε την εφαρμογή του να ζητάει επανεκκίνηση για ασήμαντους λόγους, όπως τη δημιουργία ενός help file. Ετσι, δημιουργησαν αυτή τη μικρή εφαρμογούλα που προσπαθεί να βρει ποιές διαδικασίες είναι σε pending κατάσταση μετά την εγκατάσταση μιας εφαρμογής, ωστε να αποφασίζετε μόνοι σας αν πραγματικά χρειάζεστε άμεσα reboot ή μπορείτε να το κάνετε και λίγο αργότερα. Δεν εγγυώνται οτι θα σας δώσει όλες τις pending διαδικασίες, όμως φαίνεται να κάνει καλή δουλειά.

Περισσότερα και download θα βρείτε στη διεύθυνση http://www.exodus-dev.com/products/WhyReboot/

 

 

 

 

 

Δημοσιεύτηκε στις από το μέλος cap | 1 σχόλια
Δημοσίευση στην κατηγορία:

SQLAssist: Ο εύκολος (και τσάμπα) τρόπος να γράφετε SQL με Intellisense μέσα από το VS.NET 2003/2005

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

Τι πρόβλημα έχουμε συνήθως όταν γράφουμε SQL Scripts; Πολλά.

- Δεν έχουμε intellisense, με αποτέλεσμα να γράφουμε ορισμένες φορές άλλα αντί άλλων ή να ανατρέχουμε συνέχεια σε Server Explorers / Enterprise Managers για να βλέπουμε τη δομή των πινάκων που θέλουμε να συμπεριλάβουμε στα statements μας.
- Αν είμαστε περισσότεροι από ένας, ο καθείς γράφει (συνήθως, εκτός αν έχουν οριστεί πολύ αυστηρά standards) με ό,τι case θέλει, με αποτέλεσμα να δημιουργείται ένα μικρό μπάχαλο.
- Δεν έχουμε ενιαίο τρόπο να αφήνουμε κενά, tabs κλπ (βλ. παραπάνω, πολλοί μάγειροι στην ίδια σούπα, ο καθενας με το δικό του tab/spacing/linefeed policy) με αποτέλεσμα τα scripts μας να μην έχουν ενιαίο look&feel.

To SQLAssist έρχεται να λύσει (όσο μπορεί) ορισμένα από αυτά τα θέματα, με κυριότερο την υποστήριξη Intellisense, καθώς και να σας βοηθήσει να γράψετε SQL κώδικα μέσα στο Visual Studio .NET 2003 ή 2005. Πιό συγκεκριμένα, υποστηρίζει:

- Pop - up intellisense για όλους τους τύπους objects. Αυτό είναι και το πλέον σημαντικό.
- Εκτέλεση του statement με εμφάνιση ενός ή πολλαπλών result sets, σε έναν ή πολλούς servers ταυτόχρονα, εντός transaction αν το θέλετε, με δυνατότητα rollback, μέσα από το Visual Studio.NET.
- Pretty formatting με αρκετές ρυθμίσεις (αν και δεν ήταν αρκετά ικανοποιητικό σε όλες τις περιστάσεις, για αρκετά πράγματα είναι επαρκές).
- Customizable templates. Εχει μερικά έτοιμα (π.χ. για declare cursor / iterate rows) και σας επιτρέπει να φτιάξετε τα δικά σας.
- Automatic keyword capitalization as-you-type (μπορεί να ενεργοποιηθεί/απενεργοποιηθεί)
- Αυτόματη συμπλήρωση των παρενθέσεων, εισαγωγικών κλπ.
- Script file / database association. Αν το ενεργοποιήσετε, κάθε φορά που ανοίγετε ένα συγκεκριμένο .sql αρχείο γίνεται σύνδεση στην database που έχετε επιλέξει.
- Sql Object Browser με δυνατότητα script μέσα στο VS.NET

Το εγκατέστησα για 2005 και μου έδωσε μια πάρα πολύ καλή εντύπωση. Εχει λίγα bugs (π.χ. αν δεν έχετε κάποιο docked παράθυρο αριστερά, το Intellisense που σας βγαίνει στο πρώτο statement βγαίνει εκτός ορίων οθόνης) αλλά γενικά μπορεί να θεωρηθεί ένας πολύ καλός αντικαταστάτης του Query Analyzer όταν έχετε να γράψετε περίπλοκα scripts και θέλετε ενιαίο look&feel. Το Intellisense είναι όλα τα λεφτά, μια και καταργεί όποια λάθη μπορεί να κάνετε πληκτρολογώντας ένα query του τύπου SELECT MyVeryLargeFieldName FROM MyVeryComplexTableWithAbbrvtns.

Βεβαια, υπάρχουν και άλλα τέτοια καλούδια, μόνο που τα άλλα κοστίζουν (π.χ. το PromptSQL). Το συγκεκριμένο, διατίθεται δωρεάν.

Περισσότερες πληροφορίες και download περιοχή για το SQLAssist μπορείτε να βρείτε εδώ: http://www.roundpolygons.com

Αν πάλι δεν θέλετε ενσωματωμένα πράγματα στο Visual Studio σας, μπορείτε να ρίξετε μια ματιά στο SqlBuddy (C# - Intellisence - Enabled Query Analyzer Replacement, http://sqlbuddy.sourceforge.net/). Δεν το έχω δοκιμάσει προσωπικά, οταν το βάλω και αυτό θα φροντίσω να γράψω μια άποψη.

 

 

 

 

Δημοσιεύτηκε στις από το μέλος cap | 4 σχόλια
Δημοσίευση στην κατηγορία:

Plaxo: Συγχρονίστε Outlook contacts, tasks, to-dos μεταξύ δύο ή περισσότερων υπολογιστών online

Το κακό είχε παραγίνει. Περναγα ένα νούμερο στο κινητό μου (με κάποιον φίλο, που είχε αλλάξει τηλέφωνο, και μου το έλεγε την ώρα του καφέ), και μετά συγχρόνιζα το κινητό μου με το PC του σπιτιού. Στη δουλειά όμως, έπρεπε να το κάνω με το χεράκι ή να πάρω και δεύτερη βάση για το κινητό. Παρομοίως: Περναγα ένα καινούριο τηλέφωνο στη δουλειά, στο σπίτι δεν το είχα. Αν τυχόν έκανα format σε ένα PC μου (σπιτι, δουλειά) και ξεχνούσα να αντιγράψω το .pst αρχείο μου, παπαλα τα contacts...ααααντε export σε csv από το ένα PC που ήταν στα καλά του, αααντε import στο άλλο...και αν άλλαζα δουλειά; Η άλλαζα PC; Παλι από την αρχή...

Ας το καταλάβουμε: Αρκετοί από εμάς έχουμε ΤΟΥΛΑΧΙΣΤΟΝ ΤΡΙΑ μηχανάκια που πρέπει να συγχρονίζονται: Ενα (ή περισσότερα) PC στη δουλειά, ένα (ή περισσότερα) PC/φορητά στο σπίτι, ΚΑΙ το κινητό. Για να κρατάμε σωστά contacts, πρέπει ή να βρούμε κάποια λύση ή να επιστρέψουμε στο παλιό-καλό τεφτεράκι (μουτζουρώνω, blanco, ξαναγράφω).

Enter Plaxo. Αυτή είναι λοιπον μια online υπηρεσία που στη βασική της μορφή παρέχεται δωρεάν. Τι ακριβώς κάνει;

- Μαζεύει όλα σου τα contacts, τα calendar entries και τα to-do lists και τα κρατάει online, μπορείς να έχεις online secure πρόσβαση σε αυτά μέσω web.
- Αν κάποιος από τα contacts σου είναι και αυτός χρήστης του Plaxo, τότε ο,τι αλλαγή κάνει στα στοιχεία του (που; στο δικό του outlook φυσικά!) ενημερώνει και το δικό σου outlook!
- Και ξέρεις την αλλαγή την ίδια στιγμή, γιατί σε ειδοποιεί (αμ έτσι θα σε άφηνε);
- Μπορείς να ζητήσεις μέσω του plaxo από κάποιον χρήστη που έχεις στα contacts σου να ενημερώσει τα στοιχεία τα οποία έχεις για αυτόν, ακόμα και αν δεν είναι μέλος της υπηρεσίας.
- Το βασικότερο, ΟΠΟΥ ΤΟ ΕΧΕΙΣ ΕΓΚΑΤΕΣΤΗΜΕΝΟ ΕΧΕΙΣ ΑΚΡΙΒΩΣ ΤΑ ΙΔΙΑ ΣΤΟΙΧΕΙΑ ΜΕ ΟΠΟΥΔΗΠΟΤΕ ΑΛΛΟΥ. Συγχρονίζει τα πάντα όπου βρίσκεται εγκατεστημένο.

Ενα παράδειγμα:
Ο Α και ο Β είναι plaxo users και ο ένας έχει τον άλλο ως contact.
Ο Α αλλάζει τηλέφωνο και ενημερώνει το outlook του στη δουλειά του.
Στον επόμενο συγχρονισμό, το plaxo έχει παρει την αλλαγή και έχει κάνει τα εξής:
- Εχει ενημερώσει το PC του Α στο σπίτι
- Εχει ενημερώσει το PC του B στο σπίτι, στη δουλειά και όπου αλλού και τον ίδιο τον Β οτι τα στοιχεία του Α άλλαξαν.

Ενα άλλο παράδειγμα:
Βρίσκομαι έξω και κάποιος φίλος μου στέλνει SMS με το νέο του κινητό.
Το περναω στο κινητό μου και όταν πάω σπίτι κάνω συγχρονισμό με το PC. (Αυτό μπορεί να μην κάνει apply σε όλους, σε όσους κάνει τελος πάντων).
Το plaxo έχει ήδη κάνει τα εξής:
- Εχει παρει online αντίγραφο της αλλαγής
- Οταν ανοίξω το PC μου στη δουλειά, η αλλαγή θα έχει "περάσει" και εκεί.

Ετσι σήμερα βρίσκομαι στην ευχάριστη θέση να περνάω ένα νουμεράκι στο κινητό μου και όταν γυρίσω σπίτι και το συγχρονίσω με το PC μου να ξέρω οτι το επόμενο πρωι το νουμεράκι θα βρίσκεται και στα contacts μου στη δουλειά. Το κινητό μου χτυπάει πλέον alerts με πράγματα τα οποία πέρασα στη δουλειά (συγχρονίστηκαν με του σπιτιού μου, και εν συνεχεία με το κινητάκι μου), και όταν θυμηθώ κάτι που έχω να κάνω στο σπίτι το περνάω ΣΤΟ ΣΠΙΤΙ και την επόμενη μέρα το alert μου βγαίνει στη δουλειά :)

Πριν απο λίγο καιρό έκανα format στο PC της δουλειάς και ως συνήθως ξέχασα να κάνω export τα contacts. Μικρό το κακό. Με το που εγκατέστησα το plaxo plugin, ως εκ θαύματος τα contacts μου καθώς και το calendar και τα to-dos ήταν όπως τα άφησα πριν το format!

Εύλογες απορίες που μπορεί να έχει κάποιος:

Q: Πόσοι χρησιμοποιούν αυτή την υπηρεσία;
Α: Μεχρι στιγμής, περίπου 5.000.000 άτομα έχουν κάνει εγκατάσταση του Plaxo, σύμφωνα με τα λεγόμενα στο Web Site τους.

Q: Ειναι ασφαλές ή θα δεχθώ ένα κιλό emails για να αγοράσω φθηνό viagra;
A: Μεχρι τώρα ούτε εγώ ούτε κάποιος που γνωρίζω να χρησιμοποιεί Plaxo μου έχει αναφέρει κάτι για Spam. Εξάλλου υπάρχει και ένα privacy policy που έχουν καταρτίσει. Το διαβάζετε και αποφασίζετε.

Q: Είναι πραγματικά τσάμπα ή θα μου ζητάει τα μαλλιοκέφαλά μου σε λίγο καιρό;
A: Η Basic υπηρεσία είναι τσάμπα, και υπάρχουν επιπρόσθετες υπηρεσίες (π.χ. find and remove duplicate contacts) επί πληρωμή.

Q: Εχει κανείς άλλος πρόσβαση στα contacts μου;
A: Μαλλον όχι, γιατί θα χρειαστεί username/password και πρέπει να περάσει από secure connection (ξερεις, λουκετάκι). Οπότε θεωρείται σχετικά ως πολύ ασφαλές. Αμα αποκτήσει κάποιος πρόσβαση εκεί, τρέχα να αλλάξεις passwords στο eBanking σου...

Q: Πρέπει να κατεβάσω κάτι;
A: Κατεβάζεις ένα plugin για το outlook και (αν θέλεις ) και μια toolbar. Κανεις login και εκεί, και απο εκεί και πέρα κάνει περιοδικούς συγχρονισμούς on-demand ή μόνο του.

Q: Ειναι spyware μήπως;
Α: Spybot και AdAware καθώς και Nod32 λένε οχι. Δεν έχει ακουστεί τίποτα για αυτό, και δεν νομίζω οτι τους συμφέρει γιατί έχουν μεγάλη δημοτικότητα.

Q: Εσύ το χρησιμοποιείς ή πας να μας κάνεις πειραματόζωα;
Α: Δεν είπα οτι το χρησιμοποιώ για πάνω από ένα χρόνο; Εξάλλου γι'αυτό έγραψα τώρα το post και όχι τοτε. Βεβαιώθηκα οτι είναι ασφαλές. (Στο μέτρο του δυνατού βέβαια).

Για περίσσότερα, www.plaxo.com

 

 

 

 

Δημοσιεύτηκε στις από το μέλος cap | 4 σχόλια
Δημοσίευση στην κατηγορία:

ColorPic: Βρείτε εύκολα και γρήγορα το χρώμα που εμφανίζεται στην οθόνη σας

ColorPic Shot

Χρειαζόμουν έναν color picker, ξέρετε, από αυτούς που σας δείχνουν το ακριβές χρώμα που βρίσκεται κάτω από το δρομέα σας σε μια εικόνα. Για παράδειγμα, θέλετε να δείτε ακριβώς τι χρώμα είναι το background μιας εικόνας ώστε να χρησιμοποιήσετε το ίδιο χρώμα κάπου αλλού. Συχνά χρησιμοποιείται ένα τέτοιο εργαλείο από Web Developers ή Authors.

Βρήκα λοιπόν το ColorPic, το οποίο ειναι 100% free, και περιέχει, μεταξύ άλλων, ένα πολύ ωραίο magnifier ωστε να είστε σίγουροι οτι το pixel στο οποίο βρίσκεται ο δρομέας σας έχει το χρώμα που ζητάτε.

Για περισσότερα, http://www.iconico.com/colorpic/ 

 

 

 

 

 

 

 

 

Δημοσιεύτηκε στις από το μέλος cap | 0 σχόλια
Δημοσίευση στην κατηγορία:

UDF: Δημιουργία user-defined table από delimited string

Ηταν ένα πρόβλημα που καιρό αντιμετώπιζα και έψαχνα μια πιό γενική λύση. Εχεις κάπου, για κάποιον λόγο, ένα ωραίο delimited string του στύλ "Mητσος,Κίτσος,Λάκης,Τακης" και θέλεις να δημιουργήσεις από αυτό ένα ωραίο result set, χρησιμοποιώντας μόνο SQL Server και τίποτα άλλο. Τι κάνεις;

Με ψάξιμο από εδώ και από εκεί, πήρα τη "βάση" για μια User-Defined Function την οποία μπορεί να "ταίσει" κανείς ένα delimited string, να προσδιορίσει (αν θέλει) και τον delimiter character, και να πάρει ένα ωραίο table variable που περιέχει ένα element σε κάθε του γραμμή. Θα ανέφερα πηγές, αλλα δυστυχώς δεν τις θυμάμαι πιά :) , ζητώ συγνώμη προκαταβολικά...

Μου φάνηκε ιδιαίτερα χρήσιμο σε αρκετές περιπτώσεις. Η παρούσα UDF λειτουργεί με το delimited string να είναι τύπου TEXT και το μέγιστο μήκος κάθε element 250 χαρακτήρες, ενώ σαν default delimiter χρησιμοποιεί το κόμμα (,). Ειναι όμως πολύ εύκολο να τα τροποποιήσετε όλα αυτά.

Κώδικα και σχολιασμό θα βρείτε εδώ, στα άρθρα.

 

 

 

Δημοσιεύτηκε στις από το μέλος cap | 0 σχόλια
Δημοσίευση στην κατηγορία:

Κλήση εξωτερικής εφαρμογής με διαφορετικά user credentials (run as) προγραμματιστικά (.NET 1.1)

Μετά από αρκετή διερεύνηση, επιχειρώντας να λύσω ένα συγκεκριμένο πρόβλημα, κατέληξα σε ένα "μπούσουλα" για τον τρόπο με τον οποίο μπορεί κάποιος να καλέσει με κώδικα μέσα από μια εφαρμογή ένα εξωτερικό process (ενα executable) χρησιμοποιώντας διαφορετικά user credentials από αυτά του χρήστη που "τρέχει" την εφαρμογή (ουσιαστικά δηλαδή να μιμηθούμε το "run as.." που μας δίνει το shell των Windows).

Το θέμα αυτό έχει λόγο ύπαρξης μόνο στο .NET 1.1, μια και στο .NET 2.0 μπορεί κανείς να προσδιορίσει user credentials στο System.Diagnostics.Process.Start().

Θερμές ευχαριστίες, φυσικά, στους συναδέλφους του dotNetZone.gr (είναι αυτονόητο οτι χωρίς τη βοήθειά τους δεν θα επιζούσα):

Ο παρακάτω κώδικας λειτουργεί για χρήστη που βρίσκεται σε domain και η κλήση έχει ως εξής:

        clsSpawnProcess.CreateProcess( _
                  "myUser" _
                , "myDomain" _
                , "myPassword" _
                , "c:\myfolder\myexecutable.exe" _
                , " " + "myCommandLineArguments")

Η χρήση των υποδειγματικών strings που αναφέρονται στην κλήση, φαντάζομαι, είναι αυτονόητη. Ο κώδικας δουλεύει σε WinXP, Win2000 και Win2003.

Ακολουθεί ο κώδικας:

Imports System
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Data
Imports System.Runtime.InteropServices
Imports System.IO

Public Class clsSpawnProcess

    <Flags()> _
    Enum LogonFlags
        LOGON_WITH_PROFILE = &H1
        LOGON_NETCREDENTIALS_ONLY = &H2
    End Enum

    <Flags()> _
    Enum CreationFlags

        CREATE_SUSPENDED = &H4
        CREATE_NEW_CONSOLE = &H10
        CREATE_NEW_PROCESS_GROUP = &H200
        CREATE_UNICODE_ENVIRONMENT = &H400
        CREATE_SEPARATE_WOW_VDM = &H800
        CREATE_DEFAULT_ERROR_MODE = &H4000000
    End Enum

    <StructLayout(LayoutKind.Sequential)> _
    Structure ProcessInfo
        Public hProcess As IntPtr
        Public hThread As IntPtr
        Public dwProcessId As UInt32
        Public dwThreadId As UInt32
    End Structure

    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
    Structure StartupInfo
        Public cb As Int32
        Public reserved1 As String
        Public desktop As String
        Public title As String
        Public dwX As UInt32
        Public dwY As UInt32
        Public dwXSize As UInt32
        Public dwYSize As UInt32
        Public dwXCountChars As UInt32
        Public dwYCountChars As UInt32
        Public dwFillAttribute As UInt32
        Public dwFlags As UInt32
        Public wShowWindow As Short
        Public reserved2 As Short
        Public reserved3 As Integer
        Public hStdInput As IntPtr
        Public hStdOutput As IntPtr
        Public hStdError As IntPtr
    End Structure

    <DllImport("advapi32.dll", CharSet:=CharSet.Unicode, ExactSpelling:=True, SetLastError:=True)> _
    Public Shared Function CreateProcessWithLogonW( _
    ByVal principal As String, _
    ByVal authority As String, _
    ByVal password As String, _
    ByVal logonFlags As LogonFlags, _
    ByVal appName As String, _
    ByVal cmdLine As String, _
    ByVal creationFlags As CreationFlags, _
    ByVal environmentBlock As IntPtr, _
    ByVal currentDirectory As String, _
     ByRef startupInfo As StartupInfo, _
     ByRef processInfo As ProcessInfo) As Boolean
    End Function

    <DllImport("kernel32.dll")> _
    Public Shared Function CloseHandle(ByVal h As IntPtr) As Boolean
    End Function

    '/// -----------------------------------------------------------------------------
    '/// <summary>
    '/// This is the class entry point. A call to this method allows us to
    '/// spawn an executable using alternate user credentials.
    '/// </summary>
    '/// <param name="username">The user's username</param>
    '/// <param name="domain">The domain name</param>
    '/// <param name="password">The user's password</param>
    '/// <param name="applicationPath">The full path to the executable</param>
    '/// <param name="commandLineArgs">Any command line arguments</param>
    '/// <remarks>
    '/// It is important that command line arguments start with a space, or else
    '/// the call will not work.
    '/// </remarks>
    '/// -----------------------------------------------------------------------------
    Public Shared Sub CreateProcess( _
    ByVal username As String _
    , ByVal domain As String _
    , ByVal password As String _
    , ByVal applicationPath As String _
    , ByVal commandLineArgs As String)

        Dim si As StartupInfo = New StartupInfo
        si.cb = Marshal.SizeOf(GetType(StartupInfo))
        Dim pi As ProcessInfo = New ProcessInfo

        If (CreateProcessWithLogonW(username, domain, password, _
         LogonFlags.LOGON_NETCREDENTIALS_ONLY, _
         applicationPath, commandLineArgs, _
         0, IntPtr.Zero, Nothing, _
         si, pi)) Then
            CloseHandle(pi.hProcess)
            CloseHandle(pi.hThread)
        Else
            'TODO: throw exception here or something
            Console.WriteLine("Error code: {0}", Marshal.GetLastWin32Error())
        End If
    End Sub
End Class

 

 

 

Δημοσιεύτηκε στις από το μέλος cap | 0 σχόλια
Δημοσίευση στην κατηγορία:

Δημιουργία design-time combo-style String property για user control

Εψαχνα αρκετές ημέρες, λόγω της μικρής μου εξοικείωσης με το design-time των user controls σε Windows Forms, για να καταλάβω πώς γίνεται να δημιουργήσουμε ένα string property το οποίο να φαίνεται μεν στον designer, αλλά να σου δίνει μια συγκεκριμένη λίστα επιλογών (ενα combo δηλαδή) για να διαλέξεις.

Γενικά, αν χρησιμοποιήσουμε κάποιο enumeration, το πράγμα κυλάει μόνο του. Αν όμως έχουμε String property και θέλουμε να επιλέξουμε μεταξύ συγκεκριμένων Strings, τότε το πρόβλημά μας ανάγεται στο πρόβλημα που θα αντιμετωπίζαμε χρησιμοποιώντας οποιοδήποτε άλλο Object ως property του user control μας.

Ητοι, για να δείξουμε μια combobox-style επιλογή σε design time για το συγκεκριμένο property του user control, χρειαζόμαστε ένα custom type converter.

Θα δουμε παρακάτω πώς γίνεται αυτό. Καταρχήν χρειαζόμαστε μια νέα κλάση:

Class MyListConverter
    Inherits System.ComponentModel.StringConverter

    'Εδώ φορτώνουμε τις τιμές μας.
    Public Overloads Overrides Function GetStandardValues( _
        ByVal context As System.ComponentModel.ITypeDescriptorContext) _
        As System.ComponentModel.TypeConverter.StandardValuesCollection

        Dim C As Collection = New Collection

        C.Add("Option 1")
        C.Add("Option 2")
        C.Add("Option 3")
        Return New StandardValuesCollection(C)

    End Function

    'Εδώ μπορούμε να κάνουμε return True αν θέλουμε να επιλέγουμε μόνο από τις προκαθορισμένες τιμές 
    'ή False αν θέλουμε να μπορούμε να γράψουμε και δικές μας τιμές.
    Public Overloads Overrides Function GetStandardValuesExclusive( _
        ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
        Return False
    End Function

    Public Overloads Overrides Function GetStandardValuesSupported( _
         ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
        Return True
    End Function

End Class

Τώρα που έχουμε το δικό μας Type Converter, πρέπει να τον "δέσουμε" με μια property του control Ας δούμε πώς:

    <System.ComponentModel.TypeConverter(GetType(MyListConverter))> _
    Public Property MyProperty() As Object
        Get
            Return (_myPrivateVariable)
        End Get
        Set(ByVal Value As Object)
            _myPrivateVariable = Value
        End Set
    End Property

Απλά δηλαδή σε ένα τυπικό Property definition προσθέτουμε το attribute που βλέπετε από πάνω. Το type που θέλουμε είναι το type της κλάσης που μόλις φτιάξαμε (MyListConverter). Το Property πρέπει να είναι οπωσδήποτε τύπου Object (πράγμα που δεν μας ενοχλεί, μια και τα Strings είναι objects), ενώ η _myPrivateVariable είναι και αυτή τύπου Οbject και αποτελεί την property backer variable μας.

 

Δημοσιεύτηκε στις από το μέλος cap | 0 σχόλια
Δημοσίευση στην κατηγορία:

Creating a simple, reusable Windows Service (template code)

Με αφορμή την ερώτηση ενός συναδέλφου παλαιότερα, έφτιαξα ένα μικρό αρθράκι σε δύο μέρη το οποίο αφορά τη δημιουργία ενός απλού Windows Service το οποίο μπορει να χρησιμοποιηθεί για να κάνετε hook στα methods οποιουδήποτε δικού σας assembly μέσω ενός thread που επαναλαμβάνει τη λειτουργία του ανά τακτικά διαστήματα και είναι άμεσα ελέγξιμο από το Service μέσω των μεθόδων χειρισμού του ίδιου του Service. Ελπίζω να το βρείτε χρήσιμο! Διαβάστε στα άρθρα το Μερος 1 και το Μερος 2

 

Δημοσιεύτηκε στις από το μέλος cap | 0 σχόλια
Δημοσίευση στην κατηγορία:

Using a trigger to perform mass-update-safe, specific-field calculations

Επεσα επάνω σε ένα απλό SQL-related σενάριο τις προάλλες, αλλά σκέφτηκα, αν και δεν είναι το super-duper άρθρο, να το μοιραστώ μαζί σας.

UPDATE: Εγώ μπορεί να νομίζω ό,τι θέλω, αλλά στο www.sswug.org έγινε Featured Article. :)

Time-saver, σε περίπτωση που σας έχει τύχει κάτι παρόμοιο. 

The scenario

You’ve got a table which contains some information and you want to perform calculations based on this information and store them in the same table or in another table.

The calculations must always be up-to-date.

The calculations are performed via a complex User Defined Function which accepts the other fields’ values as parameters.

The table has got thousands of rows and thus you do not want to use a view because it’ll degrade the overall performance.

For the same reason, you do not want to use a calculated field.

Διαβάστε περισσότερα εδώ, στα άρθρα.

 

 

 

Δημοσιεύτηκε στις από το μέλος cap | 0 σχόλια
Δημοσίευση στην κατηγορία:

CodeLibrary.NET: Αποθηκεύστε κώδικα, σημειώσεις, εικονες, σελίδες Web, links, ακόμα και ολόκληρα .chm αρχεία!

 

Το CodeLib (ή, με την πλήρη του ονομασία, CodeLibrary.NET), είναι μια εφαρμογή προσωπικής αρχειοθέτησης για κωδικα, αρχεία, εικόνες, URLs, σελίδες Web και οτιδήποτε άλλο μπορείτε να φανταστείτε. Διαθέτει ένα εξαιρετικά ανοιχτό και απλό user interface και συνεργάζεται με όλες τις δημοφιλείς databases (MS Access, SQL Server/MSDE, Firebird, MySQL)

Τι μπορεί να κάνει κανείς με το CodeLibrary.NET;

Σχεδόν τα πάντα! Υπάρχει ένα "δεντράκι" το οποίο μπορειτε να διαμορφώσετε όπως εσείς θέλετε και να φυλάξετε ΣΕ ΚΑΘΕ node του ΤΑΥΤΟΧΡΟΝΑ τα εξής:

Σημειώσεις:
Ελεύθερο, rich κείμενο
Κώδικα :
Με color-coding και υποστήριξη για όλες τις γνωστές γλώσσες + SQL Κώδικα!
Αρχεία:
Ο,τι εσείς επιθυμείτε! Ο inline viewer του υποστηρίζει ΠΑΡΑ ΠΟΛΛΑ formats. Τα αρχεία μπορούν να αποθηκευθούν είτε ως BLOBs απευθείας στη database είτε ως links σε αρχεία στο δίσκο σας.
Εικόνες:
Από εικονίδια ως TIFFs, μπορείτε να το χρησιμοποιήσετε για να αποθηκεύσετε τα πάντα.
URLs:
Μπορείτε να χρησιμοποιήσετε το CodeLibrary.NET για να αποθηκεύετε, με την κατηγοριοποίηση που επιθυμείτε, τα αγαπημένα σας URLs. Ακόμα, μπορείτε να εμπλουτίσετε π.χ. τον κώδικα τον οποίο έχετε αποθηκεύσει με αναφορές σε εξωτερικά URLs στην ίδια εγγραφή.
Συσχετίσεις:
Μπορείτε να συνδέσετε nodes που φτιάχνετε ωστε να δημιουργήσετε relations (συσχετίσεις) που θα σας βοηθήσουν αργότερα να ανατρέξετε στη σωστή πληροφορία.

Ενα feature-έκπληξη του CodeLibrary.Net είναι οτι μπορεί κανείς να κάνει import ΟΛΟΚΛΗΡΟ .chm αρχείο! Η εφαρμογή θα αναλάβει να τη "σπάσει" σε nodes και να δημιουργήσει τις αντίστοιχες html σελίδες ωστε να έχετε ολόκληρο το ebook σας σε nodes του CodeLibrary.NET (και φυσικά, να μπορείτε να κάνετε search σε αυτό!)

Μαζί με το CodeLibrary.NET προσφέρεται μια ολόκληρη ομάδα AddIns, με σημαντικότερο το Web Add-In που σας επιτρέπει να αποθηκεύετε απευθείας στο CodeLib τη σελίδα που βλέπετε εκείνη την ώρα στο browser σας. Επίσης το CodeLibrary.NET μπορεί να διαχείριστεί αποτελεσματικά το .ΜΗΤ format, επιτρέποντάς σας να φτιάξετε ολόκληρο αρχείο με σελίδες που έχετε αποθηκεύσει σε αυτό το format (κατι που ο γράφων κάνει εδώ και χρόνια).

Το CodeLib διατίθεται με εξαιρετικά συχνά updates (εβδομαδιαία κατα βάση) στην τιμή των $49 μέσω Paypal. Μπορειτε να κατεβάσετε μια trial έκδοση για 30 μέρες ή να κατεβάσετε τη free εκδοση η οποία δεν υπολείπεται καθόλου σε λειτουργικότητα της τρέχουσας, απλά βρίσκεται αρκετές εκδόσεις πίσω.

Περισσότερες πληροφορίες για το συγγραφέα του CodeLibrary.NET (Κινέζος στην εθνικότητα, ονοματι Fish(!), θα βρείτε στο http://dotnet.4all.cc, (UPDATE: http://myweb.hinet.net/home4/s630417/) οπου θα βρείτε και άλλα όμορφα utilities που έχει δημιουργήσει ο ίδιος (screen capture, resource file editor κλπ). Προσοχή, το site είναι ως επι το πλείστον στα ...κινέζικα, όμως είναι εύκολο από τις πρώτες (Αγγλικές) σελίδες (μην κανετε την αυτόματη μετάφραση που σας προτείνει, θα φρίξετε) να βρείτε τις ενημερωτικές σελίδες, το download του free version και την purchase page.

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

Δημοσιεύτηκε στις από το μέλος cap | 2 σχόλια
Δημοσίευση στην κατηγορία:

FolderSize: Προσθέστε πληροφορίες για το μέγεθος των φακέλων σας στον Windows Explorer

Ενα χαρακτηριστικό που πολύ συχνά μας "λείπει" όταν κοιτάμε τα folders μας στα Windows είναι να γνωριζουμε το συνολικο μέγεθος του φακέλου μαζί με τα αρχεία που περιέχει. Πολύ συχνά (ειδικά άν έχουμε φακέλους στους οποίους αρχειοθετούμε multimedia) είναι χρήσιμο να γνωρίζουμε ποιοί είναι αυτοί με το μεγαλύτερο συνολικά μέγεθος.

Το FolderSize, το οποίο θα βρείτε στη διεύθυνση http://foldersize.sourceforge.net/ προσθέτει στον Windows Explorer αυτή ακριβώς τη στήλη που λείπει. Σκανάρει δυναμικά τους φακέλους στο background και σας προσφέρει την πολύτιμη αυτή πληροφορία, την οποία μπορείτε να προσθέτετε ή να αφαιρείτε κατά βούληση, όπως ακριβώς και όλες τις άλλες στήλες.

Τρέχει σε Windows 2000/XP (και 2003), και έχει φτιαχτεί σε VS.NET 2003 με C++.

 

 

 

Δημοσιεύτηκε στις από το μέλος cap | 0 σχόλια
Δημοσίευση στην κατηγορία:

Enterprise Library Logging and Instrumentation Application Block - γιατί βρε παλικάρια;

Ειπα και εγώ σαν καλό παιδί να δοκιμάσω το Logging and Instrumentation Application Block του Enterprise Library, σε μια εφαρμογή που ήδη χρησιμοποιεί το Data Access Application Block.

Στο documentation ειδα οτι με μια γραμμή κώδικα μπορώ να γράφω σε όποιο sink (ουσιαστικά "μέρος" που κανω log - email, flat file, database κλπ). Ηθελα database. Σε πολλές κλήσεις υπάρχει ένα object που πηγαινοέρχεται, του οποίου ορισμένα properties θα ήθελα να γράφονται σε ξεχωριστά πεδία του πίνακά μου.

Η απογοήτευση!

Το database sink παίζει με μια συγκεκριμένη Stored Procedure της οποίας μπορείς να μεταβάλλεις το όνομα αλλα ΟΧΙ τα arguments που περνάνε σε αυτή! Οριστε τα arguments:

EventID, Category, Priority, Severity, Title, Timestamp, MachineName, AppDomainName, ProcessID, ProcessName, ThreadName, Win32ThreadId, Message, FormattedMessage

Δεν έχω τη δυνατότητα να περάσω άλλα εκτός αν κάνω extend το DatabaseSink class. Αλλα μετά, χάνω την ευκολία που μου παρέχει το configuration GUI! Και μην μου πει κανείς να πάρω το FormattedMessage (που είναι ntext) και να κάνω split σε SQL πράγματα που θα του περνάω delimited, γιατί δεν θέλω να σέρνεται. Θα χρησιμοποιηθεί για audit.

Αλλη λύση ήταν να "πειράξω" το ίδιο το block αλλα μετά ξεφεύγω από το standard και με καμμια αναβάθμισή του θα ψαχνόμαστε....

Μερικές ώρες χαμένες, και ήμουν τόσο ενθουσιασμένος...μα καλά, γιατί βάλανε hardcoded τα arguments που θα περάσουν στην SP? Δεν είχαν υπόψη τους οτι ειναι LOGGING και ΜΠΟΡΕΙ να θέλει κάποιος κακομοίρης να περάσει στην database και άλλες πληροφορίες;

Κλαψ.

 

 

 

Δημοσιεύτηκε στις από το μέλος cap | 0 σχόλια
Δημοσίευση στην κατηγορία:

Nod32 και Google Desktop Search

Αγόρασα πρόσφατα το NOD32. Πολύ καλό, πολύ "ελαφρύ", αλλά έχει ένα μεγάλο πρόβλημα συνεργασίας με το Google Desktop Search. Οσοι λοιπον επιθυμείτε να έχετε και τα δύο, αναμένετε επόμενες εκδόσεις του ενός ή του άλλου, ή εναλλακτικά χρησιμοποιήστε κάποια άλλη desktop search μηχανή (π.χ. MSN) ή κάποιο άλλο antivirus.

Περισσότερα για την ασυμβατότητα του NOD32 με το Google Desktop Search μπορείτε να βρείτε στο Troubleshooting Section της Google, στη διεύθυνση http://desktop.google.com/support/bin/answer.py?answer=17053


 

Δημοσιεύτηκε στις από το μέλος cap | 6 σχόλια
Δημοσίευση στην κατηγορία:
Περισσότερες Δημοσιεύσεις « Προηγούμενη - Επόμενη »