<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Symbol LABoratory &#187; forráskód</title>
	<atom:link href="http://lab.symboltech.hu/tag/forraskod/feed/" rel="self" type="application/rss+xml" />
	<link>http://lab.symboltech.hu</link>
	<description>Kreativitás és Innováció a szoftveriparban</description>
	<lastBuildDate>Tue, 03 Jan 2012 14:24:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>PowerCommands &#8211; azaz ne hiányozzon semmi a VS2008-ból</title>
		<link>http://lab.symboltech.hu/2009/08/powercommands-azaz-ne-hianyozzon-semmi-a-vs2008-bol/</link>
		<comments>http://lab.symboltech.hu/2009/08/powercommands-azaz-ne-hianyozzon-semmi-a-vs2008-bol/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 11:34:48 +0000</pubDate>
		<dc:creator>developerteam</dc:creator>
				<category><![CDATA[Hírek]]></category>
		<category><![CDATA[forráskód]]></category>
		<category><![CDATA[projekt]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://lab.symboltech.hu/?p=363</guid>
		<description><![CDATA[Visual Studio 2008 remek eszköz. Számunkra egy dolog hiányzik belőle, mégpedig az, hogy a szépen, névterekben elhelyezett osztályok, ablakok, usercontrol-ok ugyanilyen szép mélységű könyvtárfát hoznak létre, amit ha egyszer kinyitottunk, sok kattintással tudjuk összecsukni.]]></description>
			<content:encoded><![CDATA[<p><strong>Visual Studio 2008 remek eszköz.</strong> Számunkra egy dolog hiányzik belőle, mégpedig az, hogy a szépen, névterekben elhelyezett osztályok, ablakok, usercontrol-ok ugyanilyen szép mélységű könyvtárfát hoznak létre, amit ha egyszer kinyitottunk, sok kattintással tudjuk összecsukni.</p>
<p>Ettől még jól használható, pláne, ha már a VS2005-höz is létezett VB-ben írt makró, ami becsukja a fát. Ennek volt kezdetleges változata, amely csak 1-1 szintet csukott be. És volt, ami már rekurzívan is működött. A tegnapi napig&#8230;</p>
<p> </p>
<p><img class="aligncenter size-medium wp-image-364" title="collapseproject" src="http://lab.symboltech.hu/wp-content/uploads/2009/08/collapseproject-289x300.jpg" alt="collapseproject" width="289" height="300" /></p>
<p style="text-align: left;">Egy VS2008 biztonsági frissítés feltelepítése óta nem működik. Lenne erőforrásunk debugolni, de csak-csak van más megoldás is, mondjuk egy ingyenes Microsoft tool!</p>
<p style="text-align: left; padding-left: 90px;"><em>A szoftverfejlesztő cégek mindegyike pénzért adja a termékeit. Bizonyos &#8220;kultúrákban&#8221; a termék ingyenes, a támogatás, ami által a tényleges előnyt szerzed, viszont fizetős, lásd Apache, Linux, MySql. Ebből kiindulva nem is keresgéltünk nagy tudású, de mégis ingyenes, &#8220;<strong>5 éve fejlesztjük, nagyon jó</strong>&#8221; termékek irányába, hiszen semmi nincs ingyen.</em></p>
<p>És találtunk egy tool-t, amely megfelel a céljainknak, hivatalos Microsoft termék, ingyenes, gyakorlatilag egy extension, amelyet minden bizonnyal a Microsoft is használ saját berkein belül. Talán a létrejötte is annak köszönhető, hogy valamelyik fejlesztő majdnem fellázadt a saját eszközük ellen.</p>
<p>Letölthető <a href="http://code.msdn.microsoft.com/PowerCommands" target="_self">erről az oldalról</a>.</p>
<p><strong>PowerCommands for Visual Studio 2008</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://lab.symboltech.hu/2009/08/powercommands-azaz-ne-hianyozzon-semmi-a-vs2008-bol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ha várni kell a Windowsban &#8211; A jó öreg homokóra</title>
		<link>http://lab.symboltech.hu/2009/07/ha-varni-kell-a-windowsban-a-jo-oreg-homokora/</link>
		<comments>http://lab.symboltech.hu/2009/07/ha-varni-kell-a-windowsban-a-jo-oreg-homokora/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 08:13:56 +0000</pubDate>
		<dc:creator>developerteam</dc:creator>
				<category><![CDATA[Fejlesztői hírek]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[cursor]]></category>
		<category><![CDATA[forráskód]]></category>
		<category><![CDATA[homokóra]]></category>
		<category><![CDATA[hourglass]]></category>
		<category><![CDATA[idisposable]]></category>
		<category><![CDATA[várakozás]]></category>
		<category><![CDATA[waitcursor]]></category>

		<guid isPermaLink="false">http://lab.symboltech.hu/?p=293</guid>
		<description><![CDATA[Gyakran fordul elő, hogy homokórát kell megjelenítenünk, mert valamilyen művelet hosszabb időt vehet igénybe. A felhasználó pedig várakozzon, ahelyett, hogy a beviteli mezőket próbálja szerkeszteni vagy a gombokat működésre bírni.]]></description>
			<content:encoded><![CDATA[<p>Gyakran fordul elő, hogy homokórát kell megjelenítenünk, mert valamilyen művelet hosszabb időt vehet igénybe. A felhasználó pedig várakozzon, ahelyett, hogy a beviteli mezőket próbálja szerkeszteni vagy a gombokat működésre bírni.</p>
<p>Régebbi programozási nyelvekben (Delphi, FoxPro) a hosszú műveletek automatikusan beállították a homokóra üzemmódot. Viszont nem kezelték jól a beágyazott műveleteket, azaz 10 darab SELECT végrehajtása egymás után 10 homokórás villogást eredményezett. Ez a mai világban inkább szégyenletes, mint felhasználóbarát.</p>
<p> </p>
<p>Ezt a problémát oldottuk meg az alábbi kódrészlettel:</p>
<pre>using System;
using System.Windows.Forms;</pre>
<pre>namespace SymbolTech.Common
{
    public class WaitCursor : IDisposable
    {
        private static int waitcursorlevel = 0;

        public WaitCursor()
        {
            waitcursorlevel++;
            if (waitcursorlevel &gt; 0)
                Cursor.Current = Cursors.WaitCursor;
        }

        public void Dispose()
        {
            waitcursorlevel--;
            if (waitcursorlevel == 0)
                Cursor.Current = Cursors.Default;
        }
    }
}</pre>
<p>Minden (hosszabb) műveletet beágyazunk egy <code>using(new WaitCursor()) </code>blokkba. Ezzel a következő előnyöket érjük el:</p>
<ol>
<li>A műveletek minden esetben &#8220;homokórázni&#8221; fognak.</li>
<li>A beágyazott műveletek (külső blokk már homokórában dolgozik, a belső, mondjuk 100 iteráció is bekapcsolja a homkórát) nem fogják villogtatni a kurzort.</li>
<li>Véletlenül sem felejtjük el visszakapcsolni az alapértelmezett kurzort, amennyiben a műveletek végrehajtásra kerültek.</li>
</ol>
<p> </p>
<p>Lássunk egy példát, a használatára:</p>
<pre>        private void DummyMethod()
        {
            using (new WaitCursor())
            {
                Thread.Sleep(100);
            }
        }</pre>
<pre>        private void button1_Click(object sender, EventArgs e)
        {
            using (new WaitCursor())
            {
                Thread.Sleep(500);
                for (int i = 0; i &lt; 10; i++)
                    DummyMethod();
            }
        }</pre>
<p>A példában egy beágyazott, többször (10x) végrehajtott műveletet látunk, amelyek összességében 1.5mp-re átkapcsolnak homokórára, de közben nem villog a kurzor.</p>
]]></content:encoded>
			<wfw:commentRss>http://lab.symboltech.hu/2009/07/ha-varni-kell-a-windowsban-a-jo-oreg-homokora/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Kivételek típusai &#8211; melyiket dobjam?</title>
		<link>http://lab.symboltech.hu/2009/07/kivetelek-tipusai-melyiket-dobjam/</link>
		<comments>http://lab.symboltech.hu/2009/07/kivetelek-tipusai-melyiket-dobjam/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 09:49:55 +0000</pubDate>
		<dc:creator>developerteam</dc:creator>
				<category><![CDATA[Fejlesztői hírek]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[exception]]></category>
		<category><![CDATA[fejlesztés]]></category>
		<category><![CDATA[forráskód]]></category>
		<category><![CDATA[kivétel]]></category>

		<guid isPermaLink="false">http://lab.symboltech.hu/?p=275</guid>
		<description><![CDATA[A kivételkezelés alatt sok fejlesztő a catch ág megvalósítását gondolja, de ugyanolyan fontos a kivételek eldobása is. Nem szabad azzal megelégedni, hogy dobunk egy ApplicationException-t, sokkal precízebb, ha a típusos esetekben (rossz paraméter, nem jó képformátum) a beépített kivételosztályokat használjuk.]]></description>
			<content:encoded><![CDATA[<p>A kivételkezelés alatt sok fejlesztő a catch ág megvalósítását gondolja, de ugyanolyan fontos a kivételek eldobása is. Nem szabad azzal megelégedni, hogy dobunk egy ApplicationException-t, sokkal precízebb, ha a típusos esetekben (rossz paraméter, nem jó képformátum) a beépített kivételosztályokat használjuk.</p>
<p>Lássuk, mik ezek:</p>
<table border="0" width="100%" bgcolor="#ffffff" bordercolor="#c0c0c0">
<tbody>
<tr bgcolor="#f0f0f0">
<td width="319"><strong>Kivétel osztály</strong></td>
<td width="528"><strong>Kiváltás oka</strong></td>
</tr>
<tr>
<td width="319"><strong>SystemException </strong></td>
<td width="528">Futásidejű hiba, a kivételes ősosztálya</td>
</tr>
<tr>
<td width="319"><strong>AccessException </strong></td>
<td width="528">Egy típus elemeléréseinek hibája (metódus, mező, property)</td>
</tr>
<tr>
<td width="319"><strong>ArgumentException </strong></td>
<td width="528">Metódushívás esetén hibás paraméter</td>
</tr>
<tr>
<td width="319"><strong>ArgumentNullException </strong></td>
<td width="528">Metódushívás esetén null paraméter, ha azt a metódus nem tudja kezelni</td>
</tr>
<tr>
<td width="319"><strong>ArgumentOutOfRangeException </strong></td>
<td width="528">Paraméter értéke adott határokon kívül esik</td>
</tr>
<tr>
<td width="319"><strong>ArithmeticException </strong></td>
<td width="528">&#8220;Matematikai&#8221; hiba</td>
</tr>
<tr>
<td width="319"><strong>ArrayTypeMismatchException </strong></td>
<td width="528">Típusos tömbön végzett művelet egy idegen típussal</td>
</tr>
<tr>
<td width="319"><strong>BadImageFormatException </strong></td>
<td width="528">Rossz képformátum</td>
</tr>
<tr>
<td width="319"><strong>CoreException </strong></td>
<td width="528">Futásidejű kivételes ősosztálya</td>
</tr>
<tr>
<td width="319"><strong>DivideByZeroException</strong></td>
<td width="528">Nullával való osztás</td>
</tr>
<tr>
<td width="319"><strong>FormatException </strong></td>
<td width="528">Argumentum formátuma nem helyes (pl: String.Format)</td>
</tr>
<tr>
<td width="319"><strong>IndexOutOfRangeException</strong></td>
<td width="528">Tömb indexelése túlmutat a határokon</td>
</tr>
<tr>
<td width="319"><strong>InvalidCastExpression </strong></td>
<td width="528">Futásidejű Cast művelet nem hajtható végre</td>
</tr>
<tr>
<td width="319"><strong>InvalidOperationException </strong></td>
<td width="528">Nem megfelelő (idejű?) művelet hívása</td>
</tr>
<tr>
<td width="319"><strong>MissingMemberException </strong></td>
<td width="528">DLL verziószám ütközés, eltérés metódushívás közben</td>
</tr>
<tr>
<td width="319"><strong>NotFiniteNumberException </strong></td>
<td width="528">Nem valós szám (decimal, float; NaN, Infinity)</td>
</tr>
<tr>
<td width="319"><strong>NotSupportedException </strong></td>
<td width="528">Nem létező metódus hívása (reflection?)</td>
</tr>
<tr>
<td width="319"><strong>NullReferenceException </strong></td>
<td width="528">NULL értékű változó által hivatkozott objektum elérése</td>
</tr>
<tr>
<td width="319"><strong>OutOfMemoryException </strong></td>
<td width="528">Memória elfogyás</td>
</tr>
<tr>
<td width="319"><strong>StackOverflowException </strong></td>
<td width="528">Verem műveletek memória elfogyása (rekurízió)</td>
</tr>
</tbody>
</table>
<p>A fenti lista számos lehetőséget kínál a fejlesztőknek a megfelelő kivétel eldobásában. Ezek használata nagyban megkönnyíti a hibakezelést és hibakeresést, a metódus írója pedig publikálhatja, hogy mit várt és mit kapott.</p>
]]></content:encoded>
			<wfw:commentRss>http://lab.symboltech.hu/2009/07/kivetelek-tipusai-melyiket-dobjam/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Egyedi sorosítás &#8211; IXMLSerializable megvalósítás</title>
		<link>http://lab.symboltech.hu/2009/07/egyedi-sorositas-ixmlserializable-megvalositas/</link>
		<comments>http://lab.symboltech.hu/2009/07/egyedi-sorositas-ixmlserializable-megvalositas/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 09:30:14 +0000</pubDate>
		<dc:creator>developerteam</dc:creator>
				<category><![CDATA[Fejlesztői hírek]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[dictionary]]></category>
		<category><![CDATA[forráskód]]></category>
		<category><![CDATA[ixmlserializable]]></category>
		<category><![CDATA[projekt]]></category>
		<category><![CDATA[sorosítás]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://lab.symboltech.hu/?p=268</guid>
		<description><![CDATA[C#, remek nyelv. Szinte mindent lehet sorosítani, XML-be menteni. Nem is kell kézzel ezeket megírni, összerakni. De egy pár dolog kimaradt. Talán oka is van, hogy miért, de ez nem lényeg. A lényeg, hogy meg lehet valósítani.]]></description>
			<content:encoded><![CDATA[<p><strong>C#, remek nyelv.</strong> Szinte mindent lehet sorosítani, XML-be menteni. Nem is kell kézzel ezeket megírni, összerakni. De egy pár dolog kimaradt. Talán oka is van, hogy miért, de ez nem lényeg. A lényeg, hogy meg lehet valósítani.</p>
<p>A generic List&lt;&gt;-et lehet sorosítani, de előtte kell egy plusz származtatási szinten készíteni. Dictionary&lt;T,U&gt;-t nem lehet. De van megoldás. Csináljunk egy sorosítható Dictionary-t.</p>
<pre>    [XmlRoot("Dictionary")]
    public class SerializableDictionary&lt;TKey, TValue&gt; : IXmlSerializable
    {
        public XmlSchema GetSchema()
        {
            return null;
        }</pre>
<pre>        public void ReadXml(XmlReader reader)
        {
            XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
            XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));</pre>
<pre>            bool wasEmpty = reader.IsEmptyElement;</pre>
<pre>            reader.Read();</pre>
<pre>            if (wasEmpty)
                return;</pre>
<pre>            while (reader.NodeType != XmlNodeType.EndElement)
                try
                {
                    reader.ReadStartElement("Item");
                    reader.ReadStartElement("Key");
                    TKey key = (TKey)keySerializer.Deserialize(reader);
                    reader.ReadEndElement();</pre>
<pre>                    reader.ReadStartElement("Value");
                    TValue value = (TValue)valueSerializer.Deserialize(reader);
                    reader.ReadEndElement();</pre>
<pre>                    reader.ReadEndElement();</pre>
<pre>                    reader.MoveToContent();</pre>
<pre>                    this.Add(key, value);
                }
                catch { }
            reader.ReadEndElement();
        }</pre>
<pre>        public void WriteXml(XmlWriter writer)
        {
            XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
            XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));</pre>
<pre>            foreach (TKey key in this.Keys)
            {
                writer.WriteStartElement("Item");
                writer.WriteStartElement("Key");
                keySerializer.Serialize(writer, key);
                writer.WriteEndElement();</pre>
<pre>                writer.WriteStartElement("Value");
                TValue value = this[key];
                valueSerializer.Serialize(writer, value);
                writer.WriteEndElement();</pre>
<pre>                writer.WriteEndElement();
            }
        }
    }</pre>
<p>Ahogy látható, csak a saját szintünket kell megvalósítani, a TKey és TValue elemek sorosításával már a saját osztályuk foglalkozik. Extrém eset ha a TValue is egy sorosítható Dictionary (valós példát nem tudunk jelenleg mondani), ilyenkor ennek az objektumnak a sorosításakor szintén a fenti algoritmus fog lefutni.</p>
]]></content:encoded>
			<wfw:commentRss>http://lab.symboltech.hu/2009/07/egyedi-sorositas-ixmlserializable-megvalositas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Takarítás szoftverkiadás előtt</title>
		<link>http://lab.symboltech.hu/2009/07/takaritas-szoftverkiadas-elott/</link>
		<comments>http://lab.symboltech.hu/2009/07/takaritas-szoftverkiadas-elott/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 07:14:44 +0000</pubDate>
		<dc:creator>developerteam</dc:creator>
				<category><![CDATA[Kikapcsolódás]]></category>
		<category><![CDATA[forráskód]]></category>
		<category><![CDATA[kiadás]]></category>
		<category><![CDATA[lassítás]]></category>
		<category><![CDATA[messagebox]]></category>
		<category><![CDATA[mulasztás]]></category>
		<category><![CDATA[popup]]></category>
		<category><![CDATA[programozó]]></category>
		<category><![CDATA[random]]></category>
		<category><![CDATA[szoftverkiadás]]></category>
		<category><![CDATA[takarítás]]></category>
		<category><![CDATA[tempfile]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://lab.symboltech.hu/?p=222</guid>
		<description><![CDATA[Szoftvertermék kiadása előtt mindenképp ajánlott a kódot revizionálni. Több hónapos, több fejlesztővel folyó fejlesztés során számos olyan dolog "marad" a forráskódban, amely nem maradhat benne a kiadás előtt.]]></description>
			<content:encoded><![CDATA[<p>Szoftvertermék kiadása előtt mindenképp ajánlott a kódot revizionálni. Több hónapos, több fejlesztővel folyó fejlesztés során számos olyan dolog &#8220;marad&#8221; a forráskódban, amely nem maradhat benne a kiadás előtt.</p>
<p>Eddigi fejlesztési tapasztalataink alapján összeszedtük, hogy mikkel találkoztunk eddig. Nem titok és nem szégyen, velünk is előfordul, mi is mulasztottunk már:</p>
<p style="text-align: left;"><strong><img class="aligncenter size-medium wp-image-239" title="wrongway" src="http://lab.symboltech.hu/wp-content/uploads/2009/07/wrongway-204x300.jpg" alt="wrongway" width="204" height="300" /></strong></p>
<p style="text-align: left;"><strong>Direkt lassítás.</strong> Nem károkozás, sokkal inkább professzionális munkamódszer, amikor lassabb számítógépet emulálva szándékos lassításokat helyezünk el a kódban. Nem célszerű ezt a kiadott verzióban is benne felejteni.<br />
<em><strong>Megoldás:</strong> #warning pragma használata</em></p>
<p><strong> </strong></p>
<p><strong>Felugró ablakok. </strong>Hibakeresési céllal sok programozó használ felugró ablakokat, sőt &#8211; bár nem illik, de néha az átlagosnál durvább verbális kifejezéseket is. Mivel ezek hibafelderítési célokat szolgálnak, általában ott maradnak benne a kódban, ahol csak alapos tesztelés során talál rá az ember/tesztelő. A végfelhasználónál megjelenő, nem értelmezhető, oda nem illő üzenetek presztízsrombolók.<br />
<em><strong>Megoldás:</strong> Üzenet megjelenítése Debug.WriteLine()-nal.</em></p>
<p><strong> </strong></p>
<p><strong>A bűvös new Random(). </strong>A végfelhasználó nem veszi észre mindig, de számos helyen alkalmazunk véletlen tesztadatokkal való feltöltést. Nem szerencsés, ha a végfelhasználónál történő új vevő rögzítéskor a vevő neve és címe már kitöltésre került tipikusan &#8220;<strong>Kovács Géza</strong>&#8221; és &#8220;<strong>Kiss János</strong>&#8221; nevekkel.<br />
<em><strong>Megoldás:</strong> new Random() konstruktorok megkeresése a forráskódokban.<br />
<strong>Saját tapasztalat:</strong> Nem minden ilyen konstruktor kell, hogy megszűntetésre kerüljön. Legutolsó projektünk a tisztítás után 7 helyen használta a Random konstruktort.</em></p>
<p><strong> </strong></p>
<p><strong>Ideiglenes fájlok írása.</strong> XML vagy bármilyen más adatátvitel implementálása közben gyakran mentjük az átvitt adatokat átmeneti fájlokba. Sok esetben ez a <strong>C:\tempfile.dat</strong>, amely azon kívül, hogy az ügyfél számítógépén furcsán mutat, rendes biztonsági házirendet tartalmazó környezetben (a fájlírás letiltása miatt) IOException-t eredményez.<br />
<em><strong>Megoldás:</strong> if DEBUG direktíva használata fájl írásakor.</em></p>
<p><strong>Takarításra fel!</strong> </p>
<p><img class="alignleft size-medium wp-image-225" title="sweep" src="http://lab.symboltech.hu/wp-content/uploads/2009/07/sweep-300x205.jpg" alt="sweep" width="300" height="205" /> </p>
<p> </p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
]]></content:encoded>
			<wfw:commentRss>http://lab.symboltech.hu/2009/07/takaritas-szoftverkiadas-elott/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

