Δημοσιεύτηκε στις Δευτέρα, 27 Νοεμβρίου 2006 2:55 μμ από το μέλος PALLADIN :: 4 σχόλια

To Lisp or not to Lisp???

Φιλική συμβουλή προς τον Ψηλομύτη Μεμάστερ... Μπορεί να μάθει και να εκτιμησει την C# και .net γενικότερα, γράφοντας έναν Lisp .net compiler.

Και δεν χρειάζεται να πάει μακριά... απλά να κοιτάξει στο PC του

C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Tool Developers Guide\Samples\clisp

Και μιας και στην C# 3.0 τα lambda functions/expressions μας φέρνουν πιο κοντά στο Functional Programming, ισως θα πρέπει να ξανασκεφτούμε...

To LISP or not to LISP???

Δημοσιεύτηκε στις Τετάρτη, 22 Νοεμβρίου 2006 5:08 μμ από το μέλος PALLADIN :: 0 σχόλια

Looper Code Puzzle... The Ruby way

Μετά από το πολύ ενδιαφέρον σχόλιο της Νατάσας είπα να συνεχίσω το προηγούμενο post (έχω κάνει linked list από τα looper posts :) )

Η ιδέα είναι να δείξω ποσο ισχυρή και dynamic μπορεί να είναι η Ruby και ότι τέτοιου είδους puzzle δεν έχουν κανενα μα κανενα νόημα

class String
 def +(value)
  self 
 end
end

Όταν εκτελεστεί ο παραπάνω κώδικας αλλάζω την + μέθοδο στο string αντικείμενο. Και αυτή η συμπεριφορά θα ισχύει για όλα τα strings από εδώ και πέρα.

Τέτοιου τύπου αλλαγές μπορούν να γίνουν σε όλα τα αντικείμενα της Ruby

For Ruby Adventures check

http://poignantguide.net/ruby/

Το συγκεκριμένο guide άρεσε και στον Joel

Δημοσιεύτηκε στις Τετάρτη, 22 Νοεμβρίου 2006 11:22 πμ από το μέλος PALLADIN :: 3 σχόλια

Looper Code Puzzle... The C# way

Σε συνεχεια του προηγουμενου post

μια πιθανή λύση σε C# του προγουμένου puzzle θα ήταν και η κάτωθι (με την παραδοχή ότι μπορούμε να χρησιμοποιήσουμε και δικούς μας τύπους και όχι μονο τα primitives της γλώσσας)

class Infinity
{
 public static Infinity operator +(Infinity infinity, int value)
 {
  return infinity;
 }
}

Infinity i = new Infinity();
while(i == i + 1){}

Βεβαια στην Java δεν ισχύει καθώς δεν υποστηρίζεται operator overloading

Δημοσιεύτηκε στις Σάββατο, 18 Νοεμβρίου 2006 9:01 μμ από το μέλος PALLADIN :: 9 σχόλια

Looper Code Puzzle....???

Θέλω να μεταφέρω ένα ωραίο code puzzle από το βιβλίο Java Puzzlers (traps, pitfalls and corner cases)...

Έχουμε τον παρακάτω κώδικα

while(i == i + 1) {}

Τι τύπο και τι initialization πρέπει να έχει το i για να έχουμε ένα ωραίο infinite loop...????

Δημοσιεύτηκε στις Τετάρτη, 15 Νοεμβρίου 2006 11:17 πμ από το μέλος PALLADIN :: 0 σχόλια

Debug Assertions & Breakpoints (The Brute Force way)

Σήμερα διάβασα ένα ενδιαφέρον post στο blog του Δημήτρη Στάικου (also known as Brute Force) για τεχνικές Debug Assertions & Breakpoints σε kernel και user mode programming. Kάνοντας review τον κώδικα, αυτό που μού τράβηξε την προσοχή είναι ότι παίζει με macros. Το macro που μου άρεσε περισσότερο είναι αυτό που μετατρέπει το condition σε string.

#define STRINGIZE(a) _STRINGIZE(a)
#define _STRINGIZE(a) #a

STRINGIZE(argc == 2)

Ο κώδικας με τα macros μου θύμισαν τις δικες μου περιπέτειες (αρκετά χρόνια πίσω), τότε που προσπαθούσα να καταλάβω πως μπορείς να δημιουργήσεις exception handling στη C με macros (TRY, CATCH).

Κλείνοντας με λίγη δόση χιούμορ θα ήθελα να τονίσω ότι ο

1# λόγος που μου αρέσει η C# είναι για αυτά τα "Sanity Checks"...

Happy Coding φιλε Δημήτρη

Δημοσιεύτηκε στις Κυριακή, 12 Νοεμβρίου 2006 3:14 μμ από το μέλος PALLADIN :: 1 σχόλια

Java Generics and type erasure

Πρόσφατα έκανα code review σε ένα Java 1.5 project και βρέθηκα αντιμέτωπος "για άλλη μια φορά" με τα προβλήματα που δημιουργεί το type erasure των Java Generics.
Θα παρουσιάσω το πρόβλημα με ένα απλό κομμάτι κώδικα

        ArrayList<Integer> listOfInteger = new ArrayList<Integer>();
        ArrayList list = listOfInteger;
        list.add(new Object());

        int test = listOfInteger.get(0);

Οπότε ένα ωραιότατο ClassCastException καραδοκεί να μας αιφνιδιάσει. Τουλάχιστον τα unit tests στο JUnit βοήθησαν την κατάσταση.
Ένα πολύ καλό βιβλίο για το θέμα είναι το κάτωθι
http://www.amazon.com/Java-Generics-Collections-Maurice-Naftalin/dp/0596527756

(Πολύ δεν μιλήσαμε για Java…. Άλλωστε στο dotnetzone βρισκόμαστε...)
Όπως και να έχει, αισθάνομαι μια μεγαλύτερη ασφάλεια από InvalidCastException στον C# 2.0 κώδικά μου :)

Δημοσιεύτηκε στις Δευτέρα, 30 Οκτωβρίου 2006 3:55 μμ από το μέλος PALLADIN :: 0 σχόλια

RubyCLR => Microsoft

Πρώτα η Sun προσέλαβε τους developers του JRuby. Σήμερα ενημερώθηκα ότι ο John Lam(RubyCLR) πηγαίνει στην MS. Πολύ ενδιαφέρον δείχνουν στην Ruby τελευταία... Μήπως αυτό λεει πολλά... Δείτε τι λεει ο John Lam στο blog του

http://www.iunknown.com/articles/2006/10/20/dynamic-languages-microsoft-and-me

Δημοσιεύτηκε στις Σάββατο, 7 Οκτωβρίου 2006 10:23 μμ από το μέλος PALLADIN :: 0 σχόλια

100 χρόνια Kurt Gödel

Με αφορμή τη συμπλήρωση 100 ετών από τη γέννηση του Kurt Gödel (1906-1978), ο "Θαλής και Φίλοι" μία μη-κερδοσκοπική εταιρεία με έδρα την Ελλάδα, εορτάζει το γεγονός με μια σειρά ομιλιών. Τα θέματα που θα συζητηθούν παρουσιάζουν ιδιαίτερο ενδιαφέρον για όσους ασχολούνται με τη μαθηματική λογική και τη θεωρητική πληροφορική. Τέλος αξίζει να τονίσουμε τους πολύ σημαντικούς ομιλητές (Χρίστος Παπαδημητρίου, Γιάννης Μοσχοβάκης,Amir Alexander, Απόστολος Δοξιάδης, Jean-Michel Kantor, Τεύκρος Μιχαηλίδης,Αριστείδης Αραγεώργης, Βάσω Κιντή, Θεόδωρος Αραμπατζής, Στάθης Ψύλλος).

Για περισότερες πληροφορίες

http://www.thalesandfriends.org/gr/index.php?option=com_content&task=view&id=126&Itemid=44

Δημοσιεύτηκε στις Τετάρτη, 27 Σεπτεμβρίου 2006 6:37 μμ από το μέλος PALLADIN :: 1 σχόλια

as string ?? string.Empty

Θέλουμε να κάνουμε cast σε string και εάν απλά δεν γίνετε τότε να αναθέσουμε string.Empty. Ok λοιπόν



   object value = 123;
   string valueString = value as string ?? string.Empty;
   Assert.AreEqual(string.Empty, valueString);

Δημοσιεύτηκε στις Πέμπτη, 7 Σεπτεμβρίου 2006 5:24 μμ από το μέλος PALLADIN :: 1 σχόλια

Αυτό που θέλουν οι Developers!!!

O Joel τα λέει ολα...

http://www.joelonsoftware.com/articles/FieldGuidetoDevelopers.html

Δημοσιεύτηκε στις Τετάρτη, 6 Σεπτεμβρίου 2006 10:45 πμ από το μέλος PALLADIN :: 0 σχόλια

Iron Python 1.0

Συγχαρητήρια στον Jim Hugunin και σε όλη την ομάδα της Iron Python. Έχω παίξει λιγάκι μαζί της και έχω εντυπωσιαστεί με την απόδοση και την "δυναμική" που εισάγει στον "στατικό" κόσμο μας. Ελπίζω και σε άλλες τέτοιες "δυναμικές" προσπάθειες από την MS.

http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython

Δημοσιεύτηκε στις Παρασκευή, 4 Αυγούστου 2006 10:07 μμ από το μέλος PALLADIN :: 1 σχόλια

Db4o

Όσους τους εκνευρίζει το διαρκές Ο/R mapping και θέλουν κάτι πιο "natural" για τα CLR objects τους, τότε ας κοιτάξουν την db4ο(DataBase for Objects). Επαγγελματικά την χρησιμοποιώ εδώ και ένα χρόνο και έχω πιστεί για την αποτελεσματικοτητα της. Αυτό που ανακάλυψα είναι ότι με την db4o  μπορώ να είμαι όσο Agile επιθυμώ. Συγκεκριμένα στο project που δουλεύω το refactoring στο Object Model μου έχει γίνει απόλαυση.

Βεβαια σε καμια περίπτωση δεν πρόκειται να αντικαταστήσει ένα enterprise strength RDBMS. Απλά σε μερικά projects(real time systems, mobile apps και μερικά αλλα...) η db4o  μπορεί να κάνει την διαφορα σε performance και το σημαντικότερο σε productivity.

Και κάτι τελευταίο... μέχρι να έχουμε επίσημα στα χερια μας το LINQ η db4o μας προσφέρει κάτι αντίστοιχο(στο περίπου) και το λέει Native Queries.

Ένα πολύ πολύ απλό παράδειγμα για μια πρώτη γεύση.



public class Person
{
  private string name;
  private int age;

  public Person(string name, int age)
  {
   this.name = name;
   this.age = age;
  }

  public string Name
  {
   set { this.name = value; }
   get { return this.name; }
  }

  public int Age
  {
   set { this.age = value; }
   get { return this.age; }
  }

  public override string ToString()
  {
   return String.Format("{0}, {1}", this.name, this.age);
  }
}

 static void Main(string[] args)
 {

   ObjectContainer db = Db4o.OpenFile("test.yap" );
  
   db.Set(new Person("Nick Palladinos", 27));
   db.Set(new Person("George Palladinos", 20));

   IList<Person> personList = db.Query<Person>(delegate(Person person)
   {
     return person.Name.Contains("Palladinos");
   });

   foreach (Person person in personList)
   {
     Console.WriteLine(person);
   }

   db.Close();
 }

Δημοσιεύτηκε στις Παρασκευή, 7 Ιουλίου 2006 11:29 πμ από το μέλος PALLADIN :: 0 σχόλια

(Graham C# Closures)

Ένα από τα αγαπημένα μου βιβλία είναι το Hackers & Painters του Paul Graham.
Σε ένα από τα κεφαλαια του βιβλίου πορουσιάζει την υλοποιηση μιας συνάρτησης που δημιουργεί accumulators (θέλοντας να δείξει την δύναμη των closures). Ο κώδικας που παραθέτει είναι σε διαφορες γλώσσες(Lisp, Python, SmallTalk, JavaScript και Java) (συγκρίνοντας τα παραδείγματα φαίνεται ξεκάθαρα η εκφραστική δύναμη και η μινιμαλιστική σχεδίαση της Lisp (O Paul Graham είναι γνωστός Lisp hacker)).

Στο Appendix: Power θα βρείτε τον κώδικα
http://www.paulgraham.com/icad.html

Με την C# 2.0 μπορούμε να δημιουργήσουμε closures χρησιμοποιώντας anonymous delegates.



Converter<int, int> MakeAccumulator(int n)
{
 return delegate(int y) { return n += y; };
}

Converter<int, int> accumulator = MakeAccumulator(0);

Console.WriteLine( accumulator(1) ); // 1
Console.WriteLine( accumulator(1) ); // 2
Console.WriteLine( accumulator(1) ); // 3

 

Δημοσιεύτηκε στις Πέμπτη, 29 Ιουνίου 2006 10:15 μμ από το μέλος PALLADIN :: 0 σχόλια

NSpec


Πριν από καιρό είχα δει το RSpec(for Ruby) και ήταν η πρώτη μου επαφή με το concept Behaviour Driven Development. Αρχικά δεν είχα εντυπωσιαστεί καθώς μου θύμιζε αρκετά γνωστές TDD πρακτικές.

Σήμερα κατέβασα το Nspec και έπαιξα λίγο μαζί του... Προς το παρόν αυτό που μου αρέσει αρκετά είναι η αναγνωσιμότητα του κώδικα (specification).

http://nspec.tigris.org/

code examples


 [Context]
public class Example
{
 [Specification]
 public void ShouldBeAbleToAddTwoNumbers()
 {
  Specify.That(2 + 2).Equals(4);
 }
}

[TestFixture]
public class Example
{
 [Test]
 public void ShouldBeAbleToAddTwoNumbers()
 {
  Assert.Equals(4, 2 + 2);
 }
}

Δημοσιεύτηκε στις Κυριακή, 25 Ιουνίου 2006 3:03 μμ από το μέλος PALLADIN :: 1 σχόλια

int mid =(low + high) / 2; Overflow?

Πρόσφατα εντόπισα ένα πολύ ενδιαφέρον άρθρο για ένα bug που ήταν κρυμμένο για 9 χρονια (στην περίπτωση του JDK).
Το βρήκα αρκετά διδακτικό και μας θυμίζει ότι το software είναι φτιαγμένο από αέρα αλλα δεν κατοικεί στον αέρα (και μάλλον το άπειρο κατοικεί μονο στο μυαλό μας και πουθενά αλλου). Plus ότι τα bugs θα είναι πάντα μαζί μας, όσα χρονια και αν έχουν περάσει, όσες φορες και αν έχουμε εξετάσει ένα κομμάτι κώδικα... Ενημερώστε τα Unit Tests παρακαλώ...

http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html

Δημοσιεύτηκε στις Κυριακή, 18 Ιουνίου 2006 12:54 μμ από το μέλος PALLADIN :: 1 σχόλια

Console Reloaded

Η Console class στο .Net 2.0 έχει βελτιωθεί αρκετά και έχουν προστεθεί αρκετές νέες λειτουργικότητες. Όλες οι νέες βελτιώσεις μας επιτρέπουν να μεταφερθούν πολλά old-school ascii effects. Έτσι αποφάσισα να κάνω ένα γρήγορο port ενός binary-Matrix like effect που είχα γράψει πριν από πολλά χρονια σε Turbo C++.



Random random = new Random();
while (!Console.KeyAvailable)
{
 int left = random.Next(Console.WindowWidth - 2) + 1;
 int top = random.Next(Console.WindowHeight - 2) + 1;
 Console.SetCursorPosition(left, top);

 if (random.Next() % 2 == 0)
  Console.ForegroundColor = ConsoleColor.DarkGreen;
 else
  Console.ForegroundColor = ConsoleColor.Green;

 if (random.Next() % 2 == 0)
  Console.Write("0");
 else
  Console.Write("1");

}

Δημοσιεύτηκε στις Δευτέρα, 12 Ιουνίου 2006 1:18 μμ από το μέλος PALLADIN :: 0 σχόλια

Java Generics FAQ

Όσοι ενδιαφέρονται και θέλουν να γνωρίζουν όλες τις κρυφές γωνιές των Java Generics, τότε θα βρούν πολύ χρήσιμο το Java Generics Faq. Το εντυπωσιακό είναι ότι το document(pdf) είναι 2.42 Mb (433 pages)!!! Μήπως είναι λίγο περίπλοκα τα Java Generics :) !!! Τι να θέλει να πει ο ποιητής ή ο compiler...
Δημοσιεύτηκε στις Σάββατο, 10 Ιουνίου 2006 12:31 μμ από το μέλος PALLADIN :: 0 σχόλια

Hello World!!!

Καλωσήρθατε στον μικρό μου δικτυακό τόπο. Ονομάζομαι Nίκος Παλλαδινός και σε αυτό το blog σκοπεύω να μοιραστώ κάποιες σκέψεις μου (ειδικότερα αυτές που μεταφράζονται σε κώδικα). Θα κλείσω το πρώτο μου post με την αρχή των πάντων...

class Message
{
   public string Hello;
   public string DotNetZone;
};

foreach(FieldInfo fieldInfo in typeof(Message).GetFields())
   Console.WriteLine(fieldInfo.Name);

   
Περισσότερες Δημοσιεύσεις « Προηγούμενη