<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Design &amp; Architecture</title><link>https://www.dotnetzone.gr:443/cs/forums/16/ShowForum.aspx</link><description>Θέματα αρχιτεκτονικής και σχεδιασμού εφαρμογών (design patterns, object orientation, κ.α.)</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Όχι άλλο version / feature hell ...</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/54357.aspx</link><pubDate>Sat, 10 Oct 2009 03:27:12 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:54357</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/54357.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=54357</wfw:commentRss><description>&lt;P&gt;Πολύ ενδιαφέρον! Καταρχήν τα θερμά μου συγχαρητήρια αν τα κατάφερες να ξεμπλέξεις από το αρχικό μοντέλο. Ξέρουμε όλοι πόσο δύσκολο είναι να κάνεις τόσο σημαντικές αλλαγές σε έργα που τρέχουν.&lt;/P&gt;
&lt;P&gt;Δεν νομίζω ότι το branching είναι για δουλεύει κανείς πολύ καιρό σε δυο εκδόσεις. Προσωπικά το χρησιμοποιώ για να διορθώσω σημαντικά bugs σε κάποια παλιά έκδοση, την ώρα που το trunk δεν είναι σε φάση για release.&lt;/P&gt;
&lt;P&gt;Μια άλλη εναλλακτική θα ήταν να είναι έτσι χωρισμένα τα modules του συστήματος έτσι ώστε να μπορείς να αναβαθμίζεις τμηματικά πράγματα. Σε κάθε περίπτωση δύσκολη δουλειά.&lt;/P&gt;
&lt;P&gt;Θα ήταν ενδιαφέρον να μας πεις αργότερα πως προχωράει!&lt;/P&gt;</description></item><item><title>Όχι άλλο version / feature hell ...</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/54341.aspx</link><pubDate>Fri, 09 Oct 2009 20:53:07 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:54341</guid><dc:creator>anjelinio</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/54341.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=54341</wfw:commentRss><description>&lt;P&gt;Πάει καιρός τώρα, που εμπλέκομαι σε ένα "μεγάλο" project, σε μια τράπεζα.&lt;/P&gt;
&lt;P&gt;Για κάποιο λόγο που δεν ελέγχω λοιπόν, αποφασίστηκε να κάνουμε develop παράλληλα 2 ή και 3 ακόμα versions, τα οποία περιέχουν features ( &lt;EM&gt;ή παραλλαγές&amp;nbsp;του ίδιου feature&lt;/EM&gt; ) και γίνονται αυτόνομα deploy στην παραγωγή απο τους admins της τράπεζας. &lt;/P&gt;
&lt;P&gt;Τώρα, αυτό το πράγμα σημαίνει ότι στον ίδιο κώδικα, μπορεί 2 ή 3 άνθρωποι να γράφουν διαφορετικά πράγματα ανάλογα για ποιό version γράφουν. Code branches&amp;nbsp;στον TFS, merge branches όταν κάτι πάει παραγωγή κτλ. κτλ. ... ένας διαχειριστικός εφιάλτης !&lt;/P&gt;
&lt;P&gt;Οπότε μια μέρα σκέφτηκα ότι αυτή η κατάσταση δεν πάει άλλο ... τελικά θα βρεθούμε σε καταστάσεις όπου έχουμε χάσει κώδικα, ή ο λάθος&amp;nbsp;κώδικας επικράτησε και διάφορα τέτοια τραγελαφικά. Άρα, έπρεπε κάτι να γίνει για να κάνουμε όλοι develop σε ένα κοινό codebase, αλλά να τρέχουν τα τάδε ή τα δείνα κωμάτια κώδικα, ανάλογα με το version/feature το οποίο&amp;nbsp;θέλουμε να τρέχει ανα πάσα στιγμή. &lt;/P&gt;
&lt;P&gt;Σκεπτόμενος επι του προβήματος λοιπόν, είδα ότι κατα βάση πρέπει να λύσω 2 προβλήματα:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Σε επίπεδο configuration, πρέπει να φιλτράρω xml fragments βάσει ενός current version name&lt;/LI&gt;
&lt;LI&gt;Σε επίπεδο κώδικα, πρέπει να τρέχει ένα κομμάτι κώδικα βάσει ενός current version name, ή κάποιες φορές ένα άλλο αν το τρέχον version δεν είναι αυτό που θέλω.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;Έγραψα λοιπον μια μικρή σχετικά κλάσση, η οποία κάνει αυτά ακριβώς τα πράγματα. Διαβάζει μια λίστα απο versions/features απο το&amp;nbsp;app config, και βάσει αυτών φιλτράρω τα configuration&amp;nbsp;αρχεία μας, και μου δίνει και κάποιες μεθόδους στο επίπεδο του κώδικα που τρέχω κάτι αν το τρέχον version είναι το ΧΧΧ,&amp;nbsp;overload που του δίνω και τον κώδικα που τρέχει αν το version ΔΕΝ είναι το ΧΧΧ, και κάνα-δύο ακόμα που μου λένε αν το ΧΧΧ είναι μέσα στα τρέχοντα version/feature names κτλ. &lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;class&lt;/SPAN&gt; VersionFilter {


        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// Filters an Xml file&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// &amp;lt;param name="inputNode"&amp;gt;&amp;lt;/param&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; XmlElement FilterForCurrentVersions(XmlElement inputNode);

        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// Checks if the givern version string is actually included in the CurrentVersions&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// &amp;lt;param name="versionString"&amp;gt;&amp;lt;/param&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;bool&lt;/SPAN&gt; IsCurrentVersion(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;string&lt;/SPAN&gt; versionString);

        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// Runs the runForVersion code if the versionString is included in the active versions, else it runs runIfNotVersion&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// &amp;lt;param name="versionString"&amp;gt;&amp;lt;/param&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// &amp;lt;param name="runForVersion"&amp;gt;&amp;lt;/param&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// &amp;lt;param name="runIfNotVersion"&amp;gt;&amp;lt;/param&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;void&lt;/SPAN&gt; RunForVersion(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;string&lt;/SPAN&gt; versionString, Action runForVersion, Action runIfNotVersion);

        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// Runs the given code, only if the given version string is incluyded in the "active" versions ... &lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// &amp;lt;param name="versionString"&amp;gt;&amp;lt;/param&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;/// &amp;lt;param name="runForVersion"&amp;gt;&amp;lt;/param&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;void&lt;/SPAN&gt; RunForVersion(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;string&lt;/SPAN&gt; versionString, Action runForVersion);

    }&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;Βέβαια,&amp;nbsp;έπρεπε να γίνουν κάποιες αλλαγές στον κώδικα εκεί που φορτώνω τα config files.&amp;nbsp;Και εκεί που θέλουμε να τρέξουμε το Α ή το Β ανάλογα με το τρέχον version, να χρησιμοποιήσουμε τη RunForVersion. Αλλά δεν ήταν και ιδιέταιρα πολλή δουλειά αυτό.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Κι&amp;nbsp;έτσι, μετά απο 1 - 2 μέρες τα cofig αρχεία μας είχαν πάνω στα elements ένα ForVersions attribute, και τα cs αρχεία μας χρησιμοποιούν το VersionFilter.RunForVersion:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt; &amp;lt;SiteMap&amp;gt;
   ... 
    &amp;lt;item allow-permissions=&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"ADD_CUSTOMER"&lt;/SPAN&gt; Text=&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"Νέα Ομάδα  Πελατών"&lt;/SPAN&gt;  NavigateUrl=&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"createJoint.action"&lt;/SPAN&gt; ForVersions=&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"Phase3"&lt;/SPAN&gt; /&amp;gt;
  ...
&amp;lt;/SiteMap&amp;gt;  &lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;..&amp;nbsp;και στον κώδικα ... &lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt; VersionFilter.RunForVersion(Constants.VersionNames.DocModificationHistory, 
                () =&amp;gt; { &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.chkNewReceipt.Visible &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; !&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.IsNewRecord &amp;amp;&amp;amp; !&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;string&lt;/SPAN&gt;.IsNullOrEmpty(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.ddlVerificationDocumentType.SelectedValue); },
                 () =&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.chkNewReceipt.Attributes[&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"style"&lt;/SPAN&gt;] &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"visibility: hidden"&lt;/SPAN&gt;
            );&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;.. ε, και στο app config ένα ακόμα app setting με τα τρέχοντα version names ... &lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;lt;add key=&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"CurrentVersions"&lt;/SPAN&gt; value=&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"Phase2;Phase3;Groups;Flagging"&lt;/SPAN&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;... στην αρχή, άκουσα διάφορα. "&lt;EM&gt;Μα τι μας λές τώρα, το μόνο σίγουρο είναι το branching στον TFS&lt;/EM&gt;" ... "&lt;EM&gt;Μα τώρα τέτοια θα κάνουμε ...&lt;/EM&gt; " κτλ. κτλ. &lt;/P&gt;
&lt;P&gt;Αλλά ήρθε εκείνη η μέρα, όπου έπρεπε να ανοίξει ένα feature. Μέχρι τώρα, θα έπρεπε να μαζεύαμε dlls, aspx, scripts, να τα κάναμε installation bundle, γράψιμο οδηγιών για τους admins που θα κάνουν το deploy, deploy .. και μετά το απαραίτητο code branch merge για να συνεχίσουμε όλοι in-sync. &lt;/P&gt;
&lt;P&gt;Aντ' αυτού όμως, έφυγε ένα email το οποίο έλεγε ... "&lt;EM&gt;παρακαλώ βρείτε το app setting 'CurrentVersions' στο web config, και προσθέστε ένα ';Flagging' στο τέλος του value&lt;/EM&gt;". Περιττό να πώ ότι το deployment όλων των άλλων εταιριών που συμμετέχουν στο project παίρνει μισή μέρα τουλάχιστον. Και πλέον το να υποστηρίξω 2 και 3 και 5 UAT deployments παράλληλα με διαφορετικά features έχει γίνει παιχνίδι. &lt;/P&gt;
&lt;P&gt;Έτσι, μετά απο όλα αυτά, σκέφτηκα ότι αξίζει τον κόπο να μοιραστώ τη σκέψη με τον κόσμο, για να ακούσω και κάποια τρίτη γνώμη :]&lt;/P&gt;
&lt;P&gt;Πολύ καλό μας απόγευμα λοιπόν !&amp;nbsp;&lt;/P&gt;</description></item></channel></rss>