Soci (Soczó Zsolt) szakmai blogja

2009.01.31.

Jobbik += 5 %

Filed under: Élet — Soczó Zsolt @ 11:33

Draskovics nem mérlegelt a miskolci rendőrkapitány ügyében

Ostoba egy ember ez, még ha tudjuk, nem maga hozza meg az ilyen döntéseket.

2009.01.26.

.NET teljesítményhangolási tapasztalatok 1.

Filed under: .NET,Szakmai élet — Soczó Zsolt @ 16:10

Volt egy munkám, amiben egy bonyolult formokat dinamikusan, xml leírásból megjelenítő üzleti alkalmazást kellett optimalizálni.
A probléma az volt vele, hogy a formokat nagyon lassan generálta le, 10-20 mp is kellett egy bonyolultabbhoz. Ezeken már több száz vezérlő volt, de akkor is, nem kell annak ilyen lassúnak lenni.
A szűk keresztmetszetek felderítéséhez a korábbi bejegyzésben említett VSTS profilert használtam.
A következő általánosítható tapasztalatokról számolhatok be. Mivel nagyon sok érdekes eredménye volt a kutatásnak, több részben osztom ezeket meg veletek.

Ha nem használjuk ki a ResourceManager lokalizálási lehetőségeit, csak arra használunk erőforrásokat, hogy a kódból kiemeljünk egyes, később esetleg módosítandó stringeket, akkor sokat sprórolhatunk az erőforrások betöltésekor.
Példaképpen nézzünk egy sima WinForms alkalmazást, amihez hozzáadtunk egy erőforrást (.resx). A resxhez generálnak nekünk egy típusos elérő osztályt is, így a következő sorral egyszerűen elérhetjük az erőforrásként tárolt Teszt nevű kulcsot:

MessageBox.Show(Resource1.Teszt);

Mit is csinál a generált kód?

internal static string Teszt
{
get
{
return ResourceManager.GetString(“Teszt”, resourceCulture);
}
}

Ahol a ResourceManager egy System.Resources.ResourceManager példány.

Az ő feladata, hogy megpróbáljon lokalizált erőforrásokat keresni, ha vannak, azokat betölteni. Hol laknak ezek? Processz Explorerrel megnézve kiderül:

CultureTest.exe	FAST IO DISALLOWED	C:\szemet\CultureTest\bin\Debug\en-US\CultureTest.resources.dll
CultureTest.exe	PATH NOT FOUND	C:\szemet\CultureTest\bin\Debug\en-US\CultureTest.resources.dll
CultureTest.exe	FAST IO DISALLOWED	C:\szemet\CultureTest\bin\Debug\en-US\CultureTest.resources\CultureTest.resources.dll
CultureTest.exe	PATH NOT FOUND	C:\szemet\CultureTest\bin\Debug\en-US\CultureTest.resources\CultureTest.resources.dll
CultureTest.exe	FAST IO DISALLOWED	C:\szemet\CultureTest\bin\Debug\en-US\CultureTest.resources.exe
CultureTest.exe	PATH NOT FOUND	C:\szemet\CultureTest\bin\Debug\en-US\CultureTest.resources.exe
CultureTest.exe	FAST IO DISALLOWED	C:\szemet\CultureTest\bin\Debug\en-US\CultureTest.resources\CultureTest.resources.exe
CultureTest.exe	PATH NOT FOUND	C:\szemet\CultureTest\bin\Debug\en-US\CultureTest.resources\CultureTest.resources.exe
CultureTest.exe	FAST IO DISALLOWED	C:\Windows\Microsoft.NET\Framework\v2.0.50727\en-US\mscorrc.dll
CultureTest.exe	PATH NOT FOUND	C:\Windows\Microsoft.NET\Framework\v2.0.50727\en-US\mscorrc.dll
CultureTest.exe	FAST IO DISALLOWED	C:\Windows\Microsoft.NET\Framework\v2.0.50727\en-US\mscorrc.dll
CultureTest.exe	PATH NOT FOUND	C:\Windows\Microsoft.NET\Framework\v2.0.50727\en-US\mscorrc.dll
CultureTest.exe	FAST IO DISALLOWED	C:\Windows\Microsoft.NET\Framework\v2.0.50727\en-US\mscorrc.dll.DLL
CultureTest.exe	PATH NOT FOUND	C:\Windows\Microsoft.NET\Framework\v2.0.50727\en-US\mscorrc.dll.DLL
CultureTest.exe	FAST IO DISALLOWED	C:\Windows\Microsoft.NET\Framework\v2.0.50727\en\mscorrc.dll
CultureTest.exe	NAME NOT FOUND	C:\Windows\Microsoft.NET\Framework\v2.0.50727\en\mscorrc.dll
CultureTest.exe	FAST IO DISALLOWED	C:\Windows\Microsoft.NET\Framework\v2.0.50727\en\mscorrc.dll
CultureTest.exe	NAME NOT FOUND	C:\Windows\Microsoft.NET\Framework\v2.0.50727\en\mscorrc.dll
CultureTest.exe	FAST IO DISALLOWED	C:\Windows\Microsoft.NET\Framework\v2.0.50727\en\mscorrc.dll.DLL
CultureTest.exe	NAME NOT FOUND	C:\Windows\Microsoft.NET\Framework\v2.0.50727\en\mscorrc.dll.DLL
CultureTest.exe	FAST IO DISALLOWED	C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorrc.dll
CultureTest.exe	SUCCESS	C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorrc.dll

Szép lista, mi? És nem is mindig ilyen rövid a lista, sok assembly és több alkönyvtár is be szokott jönni a képbe. Szóval ő keresgélt keményen, mire a végén rájött (ez nem látszik az előbbiből), hogy a fő assemblyben, a CultureTest.exe-ben van, amiért küzd. Ez a fallback location.
Mellesleg a rémségek kicsiny tárháza nem merül ki ennyiben. Nézzük meg, mi történt a registryben:

2 CultureTest.exe RegOpenKey NAME NOT FOUND Desired Access: Read HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Managed\S-1-5-21-1912844993-3366795750-3477756003-1000\Installer\Assemblies\C:|szemet|CultureTest|bin|Debug|CultureTest.exe
3 CultureTest.exe RegOpenKey NAME NOT FOUND Desired Access: Read HKCU\Software\Microsoft\Installer\Assemblies\C:|szemet|CultureTest|bin|Debug|CultureTest.exe
4 CultureTest.exe RegOpenKey NAME NOT FOUND Desired Access: Read HKCR\Installer\Assemblies\C:|szemet|CultureTest|bin|Debug|CultureTest.exe
5 CultureTest.exe RegOpenKey NAME NOT FOUND Desired Access: Read HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Managed\S-1-5-21-1912844993-3366795750-3477756003-1000\Installer\Assemblies\Global
6 CultureTest.exe RegOpenKey SUCCESS Desired Access: Read HKCU\Software\Microsoft\Installer\Assemblies\Global
7 CultureTest.exe RegEnumValue SUCCESS Index: 0, Name: System.Data.Entity,version=”3.5.0.0″,publicKeyToken=”b77a5c561934e089″,processorArchitecture=”MSIL”,fileVersion=”3.5.21015.1″,culture=”neutral”, Type: REG_MULTI_SZ, Length: 126, Data: C3OujdJLp9NfYy,t(d,[DP_EntityFramework_F>XQM@Z1Phc9}TW]UlV1Ni HKCU\Software\Microsoft\Installer\Assemblies\Global
8 CultureTest.exe RegEnumValue SUCCESS Index: 1, Name: System.Data.Entity.Design,version=”3.5.0.0″,publicKeyToken=”b77a5c561934e089″,processorArchitecture=”MSIL”,fileVersion=”3.5.21015.1″,culture=”neutral”, Type: REG_MULTI_SZ, Length: 126, Data: C3OujdJLp9NfYy,t(d,[DP_EntityFramework_F>rl{^k~VBe8%[-9p_{$g7 HKCU\Software\Microsoft\Installer\Assemblies\Global
9 CultureTest.exe RegEnumValue SUCCESS Index: 2, Name: System.Windows.Forms.DataVisualization,version=”3.5.0.0″,publicKeyToken=”31bf3856ad364e35″,processorArchitecture=”MSIL”,fileVersion=”3.5.30729.116″,culture=”neutral”, Type: REG_MULTI_SZ, Length: 112, Data: O`X&9fQNo8q+=[WOk(@QChart_Feature>v’=bOR[V[A!n0Y5w^}Hc HKCU\Software\Microsoft\Installer\Assemblies\Global
10 CultureTest.exe RegEnumValue SUCCESS Index: 3, Name: System.Windows.Forms.DataVisualization.Design,version=”3.5.0.0″,publicKeyToken=”31bf3856ad364e35″,processorArchitecture=”MSIL”,fileVersion=”3.5.30729.116″,culture=”neutral”, Type: REG_MULTI_SZ, Length: 112, Data: O`X&9fQNo8q+=[WOk(@QChart_Feature>i_^,7P9r9@brsnF$’^Sq HKCU\Software\Microsoft\Installer\Assemblies\Global
11 CultureTest.exe RegEnumValue SUCCESS Index: 4, Name: System.Web.DataVisualization,version=”3.5.0.0″,publicKeyToken=”31bf3856ad364e35″,processorArchitecture=”MSIL”,fileVersion=”3.5.30729.116″,culture=”neutral”, Type: REG_MULTI_SZ, Length: 112, Data: O`X&9fQNo8q+=[WOk(@QChart_Feature>Wh{mN1!@0AM{uwUXeK*Y HKCU\Software\Microsoft\Installer\Assemblies\Global
12 CultureTest.exe RegEnumValue SUCCESS Index: 5, Name: System.Web.DataVisualization.Design,version=”3.5.0.0″,publicKeyToken=”31bf3856ad364e35″,processorArchitecture=”MSIL”,fileVersion=”3.5.30729.116″,culture=”neutral”, Type: REG_MULTI_SZ, Length: 112, Data: O`X&9fQNo8q+=[WOk(@QChart_Feature>)s9`q)4`i?zUn`)KOc8c HKCU\Software\Microsoft\Installer\Assemblies\Global
13 CultureTest.exe RegEnumValue NO MORE ENTRIES Index: 6, Length: 4,168 HKCU\Software\Microsoft\Installer\Assemblies\Global
14 CultureTest.exe RegCloseKey SUCCESS HKCU\Software\Microsoft\Installer\Assemblies\Global
15 CultureTest.exe RegOpenKey SUCCESS Desired Access: Read HKCR\Installer\Assemblies\Global
16 CultureTest.exe RegEnumValue SUCCESS Index: 0, Name: Microsoft.VisualStudio.VSContentInstaller,Version=”8.0.0.0″,PublicKeyToken=”b03f5f7f11d50a3a”,Culture=”neutral”,FileVersion=”8.0.50727.42″,ProcessorArchitecture=”MSIL”, Type: REG_MULTI_SZ, Length: 404, Data: Du!zKukZ[8DDoq4qr00M>IEJ5Ceoex8F3H%MC+Ga*, gKH-=4wv49{b[v2]HUCqDEXPLORE>IEJ5Ceoex8F3H%MC+Ga*, UvOAm{qpx?)oAC’mF&N`VSTA_IDE>IEJ5Ceoex8F3H%MC+Ga*, ^Sd&qu_%!Ajz=c-67LgzVS_Baseline_Shell>IEJ5Ceoex8F3H%MC+Ga* HKCR\Installer\Assemblies\Global
17 CultureTest.exe RegEnumValue SUCCESS Index: 1, Name: Microsoft.VisualStudio.Zip,Version=”8.0.0.0″,PublicKeyToken=”b03f5f7f11d50a3a”,Culture=”neutral”,FileVersion=”8.0.50727.42″,ProcessorArchitecture=”MSIL”, Type: REG_MULTI_SZ, Length: 708, Data: Du!zKukZ[8DDoq4qr00M>gOxADwX’$9kl’.`[S7hE, Du!zKukZ[8DDoq4qr00M>O%ZhVgKv@A4B`u_Z?tGQ, gKH-=4wv49{b[v2]HUCqDEXPLORE>gOxADwX’$9kl’.`[S7hE, gKH-=4wv49{b[v2]HUCqDEXPLORE>O%ZhVgKv@A4B`u_Z?tGQ, UvOAm{qpx?)oAC’mF&N`VSTA_IDE_Resources>gOxADwX’$9kl’.`[S7hE, UvOAm{qpx?)oAC’mF&N`VSTA_IDE>O%ZhVgKv@A4B`u_Z?tGQ, ^Sd&qu_%!Ajz=c-67LgzVS_Baseline_Shell>gOxADwX’$9kl’.`[S7hE HKCR\Installer\Assemblies\Global
18 CultureTest.exe RegEnumValue SUCCESS Index: 2, Name: Microsoft.VisualStudio.CommonIDE,Version=”8.0.0.0″,PublicKeyToken=”b03f5f7f11d50a3a”,Culture=”neutral”,FileVersion=”8.0.50727.42″,ProcessorArchitecture=”MSIL”, Type: REG_MULTI_SZ, Length: 286, Data: Du!zKukZ[8DDoq4qr00M>vpAcaJ2Wn@5ip,X!wCW!, gKH-=4wv49{b[v2]HUCqDEXPLORE>vpAcaJ2Wn@5ip,X!wCW!, UvOAm{qpx?)oAC’mF&N`VSTA_IDE>vpAcaJ2Wn@5ip,X!wCW! HKCR\Installer\Assemblies\Global
19 CultureTest.exe RegEnumValue SUCCESS Index: 3, Name: EnvDTE,Version=”8.0.0.0″,PublicKeyToken=”b03f5f7f11d50a3a”,Culture=”neutral”,FileVersion=”8.0.50727.42″, Type: REG_MULTI_SZ, Length: 404, Data: Du!zKukZ[8DDoq4qr00M>@,s,oxU@??Bf~_96IfEk, gKH-=4wv49{b[v2]HUCqDEXPLORE>@,s,oxU@??Bf~_96IfEk, UvOAm{qpx?)oAC’mF&N`VSTA_IDE>@,s,oxU@??Bf~_96IfEk, ^Sd&qu_%!Ajz=c-67LgzVS_Baseline_Shell>@,s,oxU@??Bf~_96IfEk HKCR\Installer\Assemblies\Global
20 CultureTest.exe RegEnumValue SUCCESS Index: 4, Name: EnvDTE80,Version=”8.0.0.0″,PublicKeyToken=”b03f5f7f11d50a3a”,Culture=”neutral”,FileVersion=”8.0.50727.42″, Type: REG_MULTI_SZ, Length: 404, Data: Du!zKukZ[8DDoq4qr00M>t’fLj76Px?g%5Lxn)q8x, gKH-=4wv49{b[v2]HUCqDEXPLORE>t’fLj76Px?g%5Lxn)q8x, UvOAm{qpx?)oAC’mF&N`VSTA_IDE>t’fLj76Px?g%5Lxn)q8x, ^Sd&qu_%!Ajz=c-67LgzVS_Baseline_Shell>t’fLj76Px?g%5Lxn)q8x HKCR\Installer\Assemblies\Global
21 CultureTest.exe RegEnumValue SUCCESS Index: 5, Name: Microsoft.VisualStudio.Shell,Version=”2.0.0.0″,PublicKeyToken=”b03f5f7f11d50a3a”,Culture=”neutral”,FileVersion=”2.0.50727.42″,ProcessorArchitecture=”MSIL”, Type: REG_MULTI_SZ, Length: 386, Data: Du!zKukZ[8DDoq4qr00M>66^Wy*2E=9qqd?H3c$dl, gKH-=4wv49{b[v2]HUCqDEXPLORE>66^Wy*2E=9qqd?H3c$dl, UvOAm{qpx?)oAC’mF&N`VSTA_IDE>66^Wy*2E=9qqd?H3c$dl, UvOAm{qpx?)oAC’mF&N`VSTA_IDE>=f^c@WH_u9~OIp_cDln1 HKCR\Installer\Assemblies\Global

1114 CultureTest.exe RegEnumValue SUCCESS Index: 1,098, Name: Policy.11.0.Microsoft.Office.Interop.Word,fileVersion=”12.0.4518.1014″,version=”12.0.0.0000000″,culture=”neutral”,publicKeyToken=”71E9BCE111E9429C”, Type: REG_MULTI_SZ, Length: 102, Data: w_1^VV!!!!!!!!!MKKSkWord_PIA>$c5^P,b`F=p4x$@{SnSa HKCR\Installer\Assemblies\Global
1115 CultureTest.exe RegEnumValue SUCCESS Index: 1,099, Name: Microsoft.Vbe.Interop,Version=”11.0.0.0000″,Culture=”neutral”,PublicKeyToken=”71e9bce111e9429c”,FileVersion=”11.0.8161.0″, Type: REG_MULTI_SZ, Length: 120, Data: (f’^Vn-}f(ZXfeAR6.jiVSCommonPIAHidden>X.2kG@=8r=omnVtBlW4t HKCR\Installer\Assemblies\Global
1116 CultureTest.exe RegEnumValue NO MORE ENTRIES Index: 1,100, Length: 4,168 HKCR\Installer\Assemblies\Global

Mivel nem akarok senkivel kitolni kivágtam ezer sort a kimenetből. Ráadásul az előbb 2x is lefut a registryben. Mi a fene ez?
A .NET betöltője (fusion) ha nem tud betölteni egy assembly-t a probing folyamat során, akkor végső kétségbeesésében arra gondol, biztos ott van az, csak letörölték. Elő hát az MSI installerrel -ha van neki- és állítsuk vissza azt telepítésből – gondolja, és így is tesz. Átnézi a fenti több mint ezer bejegyzést, hátha. De nem. Sajnos ezen hiábavaló próbálkozás elég sok időt elvisz, akár 1-2 mp-cel is lassabbá teheti a program elindulását.
Számomra ez egy igen bosszantó, okoskodó fícsör, írtam is Junfeng Zhang-nak, ki lehet-e kapcsolni, de sajnos nem kaptam választ.
Mi mégis a megoldás? Meg kell akadályozni a keresgélést, ha nincs szükségünk erre a szolgáltatásra.
Tegyük fel nem szeretném lokalizálni az appot egyelőre, azaz számomra teljesen felesleges ez a keresgélés. Hogyan lehet megmondani, hogy az erőforrásokat csak a fő assemblyben keresse?
Egyszerű, a Main() elejére:

Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.InvariantCulture;

Ezek után már egyáltalán nem keresgél a lemezen és a registryben sem. Semennyire. Egyszerű? Tetszik? :)

.NET fw. platform invoke 64 biten

Filed under: .NET,CLR,Szakmai élet — Soczó Zsolt @ 14:29

Egy apró érdekesség. Van egy 32 bites windows dll, amit a gyártó még nem írt meg 64 bitre. Ezt .NET-ből a jól ismert DllImport attribútummal, PInvoke segítségével lehet meghívni. 64 bites gépen azonban alapértelmezetten a C# fordító olyan assemblyket generál, amelyek platform függetlenek, így 64 bites osen a jitter 64 bites gépikódot generál. Persze, így már nem tudja betölteni a 32 bites DLL-t a pinvoke, és elszáll a program hibával, amikor először hívnánk egy függvényt a DLL-ből. A megoldás egyszerű: meg kell jelölni a projektet, hogy x86-ra forduljon. Ettől az IL kód persze nem változik, de a metadatok között ott lesz a jelzés a jitternek, hogy tessék 32 bites kódot generálni.
A bosszantó ebben az esetben csak az, hogy azért lett volna jó a natív 64 bites memóriamodell, mert tényleg gigabájtnyi adatot akartam a memóriában kezelni.

Szórakozik az ISA

Filed under: Szakmai élet — Soczó Zsolt @ 12:54

Időnként nem elérhető a soci.hu, nemrég fél napra megállt. Ez már nem az első eset, a probléma oka, hogy az ISA 2004 webproxy szerviz nem akar normálisan működni. Arra panaszkodik, hogy:

“Description: The Web Proxy filter failed to bind its socket to 195.70.38.156 port 80. This may have been caused by another service that is already using the same port or by a network adapter that is not functional. To resolve this issue, restart the Microsoft Firewall service. The error code specified in the data area of the event properties indicates the cause of the failure.
The failure is due to error: 0x80072740”

Fogja-e valaki a portot? netstat -a -n. A Web proxy szerviz!

Hát ő, hogy a nyavaja törné ketté. Maga a proxy fogja a portot, és panaszkodik másra. Mi ez bug?

Itt azt írják, a WPAD is okozhat gondot, kikapcsoltam. Más ötlet?

2009.01.21.

Visual Studio Team System teljesítményanalízis

Filed under: .NET,Szakmai élet,Visual Studio,VS 2008 — Soczó Zsolt @ 10:57

A Visual Studio számomra egyik egyik legkedvesebb eszköze a Profiler. Számos cégnek oldottam már meg vele teljesítményproblémákat, amelyeket profiler nélkül sokkal nehezebb lett volna.
A profiler arra képes, hogy egy futó program belső részeinek futási idejét képes mérni. Működhet sampling módban, ilyenkor bizonyos időközönként (alapban 10 millió órajelciklusonként) belenéz a futó programba, és megnézi a verem állapotát, azaz, hogy éppen melyik metódusban van a vezérlés.
A másik mód az instrumentation, ekkor kódot injektálnak az futtatandó assembly-kbe, így belülről tudják mérni, mi-mennyi ideig futott.
A sampling nem sokat lassít a mérendő programon, de pontatlanabb, az intrumentation pontos, de nagyon sokat lassít a célprogramon.
Én első körben a sampling-et használom, ha csak ki akarom szúrni a kód leglassabb részét. Az intrumentation megmutatja azt is, hányszor hívtak meg egy metódust, azaz nem kell elvetni, csak másra való, mint a sampling.
A teljesítményhangolásban az a szép, hogy intuitíven sokszor nagyon mást optimalizálna az ember, mint a mérések alapján.

Az ábrán az látszik, hogy az idő jelentős részét a DateTime.Hour hívás viszi el. Kicsit gyanús ez, de sűrűbb mintavétellel vagy instrumentation segítségével jobban rá lehet nézni a körmére. Ha igaza van (valószínű), akkor ez pont olyan pont, amire álmomban nem gondoltam volna.

Érdemes megfigyelni még, hogy a felső toolbaron van egy láng ikon, arra kattintva a hívási fában azonnal levisznek a leglassabb metódushoz. Egyszerű, de szenzációs. Ez a 2008-ban jelent meg.

2009.01.20.

Amikor egy metódus nem a helyén lakik

Filed under: .NET,Design,Élet,Felhívás,Szakmai élet,Tőzsde — Soczó Zsolt @ 12:52

Az utóbbi pár hétben rendkívül intenzíven egy programot írok – egy Automated Trading System-et, így mondják ezeket angolul. Azaz egy olyan programot, amely real-time tőzsdei adatok alapján automatikusan döntéseket hoz, ad-vesz. Persze a dolog a valóságban elképesztően bonyolult tud lenni, de programozási gyakorlatnak mindenképpen érdekes.

A rendszer részleteiről egyelőre nem akarok írni, majd ha működik, beszélek róla – bár lehet, hogy pont akkor nem kellene, mi? :)

No, a lényeg, hogy az ilyen rendszereket az ember csak akkor indít el, ha nagyon hosszú múltbeli adatokon végigpróbálva elég jó a nyereség/veszteség aránya, és nem csinál zsinórban annyi veszteséget, ami már pszichológialiag fáj, vagy akár le is nullázza az erre szánt pénzt.
Ezt a tesztelést hívják backtest-nek. Ehhez adatok kellenek, amit persze pénzért adnak, de ez már csak ilyen, ha ez ember pénzt akar keresni, ahhoz be is kell fektetni.
Nekem most már van több mint 10 évnyi perces adatom a legnagyobb likviditású futures-ökhöz (S&P 500 E-Mini, Nasdaq E-Mini, stb.).
Jöhet a szakma. A backtest írásakor kialakult a következő kódrészlet:

class BackTestSession
{

for (int i = 0; i < bars.Count; i++) { foreach (TradingAlgorithm alg in algs) { StepOne(alg, i); } } private void StepOne(TradingAlgorithm alg, int i) { if (!alg.InLong && !alg.InShort) { decimal entryPrice; TradeActionReason reason = alg.WantToBuyLong(i, out entryPrice); if (reason != TradeActionReason.None) { return; } reason = alg.WantToSellShort(i, out entryPrice); if (reason != TradeActionReason.None) { return; } return; } if (alg.InLong) { TradeActionReason reason = alg.WantToSellLong(i); if (reason != TradeActionReason.None) { return; } } if (alg.InShort) { TradeActionReason reason = alg.WantToCoverShort(i); if (reason != TradeActionReason.None) { return; } } return; } ... } [/source] Ez a kód messziről bűzlik. Mi a gond vele? Nem jó helyen lakik. Figyeljük meg, hogy egyfolytában egy másik típuson (TradingAlgorithm) végez műveleteket, átnyúlkál oda adatokért és műveleteket végezve rajta. Ez egy code smell a refactoringok házatáján, amire megoldás, ha elköltöztetjük a metódust a helyére. Move method refactoring. [source='C#'] class BackTestSession { for (int i = 0; i < bars.Count; i++) { foreach (TradingAlgorithm alg in algs) { alg.StepOne(i); } } } class TradingAlgorithm { public void StepOne(int i) { if (!InLong && !InShort) { decimal entryPrice; TradeActionReason reason = WantToBuyLong(i, out entryPrice); if (reason != TradeActionReason.None) { return; } reason = WantToSellShort(i, out entryPrice); if (reason != TradeActionReason.None) { return; } return; } if (InLong) { TradeActionReason reason = WantToSellLong(i); if (reason != TradeActionReason.None) { return; } } if (InShort) { TradeActionReason reason = WantToCoverShort(i); if (reason != TradeActionReason.None) { return; } } return; } } [/source] Látható a különbség? Sokkal direktebb lett a kód, oda került a metódus, ahová való. Erről szól az első GRASP pattern, az Information Expert.

Következő refactoring lenne az out paraméterek kiirtása, lecserélése member változóra. Erre még a VS is ad refactoring támogatást.

És most jön a shameless plug (bár nem ezért kezdem el írni a cikket, de ki nem hagynám a lehetőséget :): A Netacademiában márciusban lesz újra Design Patterns tanfolyamom, ahol az objektumorientált programozás praktikáit mutatom meg 4 napban, ilyen egyszerűeket mint a fenti, és sokkal bonyolultabbakat is. A régi tananyagot átírom a következő hetekben, kiegészítve .NET Fw. 3.5-ös példákkal (WCF-ben és WPF-ben nagyon szép példákat látni a patternekre).

2009.01.12.

Új fotók a gyerekekről

Filed under: Élet,Személyes — Soczó Zsolt @ 13:25

Némi magánélet: kiraktam egy tucatnyi fotót, amin a gyerkőcök láthatók – Karácsonykor.

Megújult a soci.hu

Filed under: Felhívás,Szakmai élet — Soczó Zsolt @ 13:21

A blogot kiegészítendő összeraktam némi információt magamról és a tervezett szolgáltatásaimról.
Köszönet Attilának, tőle loptam a design-t.
Rém utálok webet design-olni, ez meg is látszik a site-on, de majd csiszolok még rajta. :)

Jöhetnek a megrendelések. :)

Hasznos kimenete ennek a munkának, hogy összegyűjtöttem az eddig írt cikkeim jelentős részét, így egy helyen, akár zipelve is elérhetőek.

2009.01.06.

Frissített CV

Filed under: Élet,Szakmai élet,Személyes — Soczó Zsolt @ 01:09

A változás első szeleként frissítettem az önéletrajzomat, ilyet mindig csak munkahely-váltáskor szoktam tenni, vagy ha kell valamihez. Most mindkét ok kapóra jött, hát kibővítettem kicsit. Ez angol nyelvű, a magyart egyelőre még nem írtam meg.

Mukodj – Sci módra

Filed under: Élet — Soczó Zsolt @ 00:23

Hát, sikerült valaminek megröhögtetni az év elején.
Sci OT (Operatív Thetán, igen drága pénzen “kiképzett” über-izé-ember-lény) sikertörténetek, könnyek között olvastam némelyiket.
Elképesztő, hogy az emberi tudatállapotok szivárványának eldugott alvégein mennyi furcsa ember bolyong. (Mondjuk ezzel a mondattal én is benevezhetek :)

2009.01.01.

Újra MVP lettem :))

Filed under: Élet,Szakmai élet,Személyes — Soczó Zsolt @ 15:35

Kösznöm az MS-nek, hogy immár 5. éve (remélem jól emlékszem) újra MVP lehetek. Számomra sokat jelentenek azok az erőforrások (könyvek, online könyvek, MVP akadémia, private newsgroup, helyi kapcsolatok, stb.), amelyeket a program ad, ezek nélkül féllábú óriás lennék. :)

Idén már az MSDN és Techet előfizetés is igen fontos lesz, mivel magamnak fizetek mindent, nem áll egy nagy cég mögöttem.

Amit legjobban ki fogok viszont használni, az a forráskód hozzáférés. Tervben van egy közös koprodukció az MSHU-val, amely keretében Windows Internals témában fogok sok-sok információt megtanítani nektek idén, ha minden terv szerint alakul. Ehhez meg nagyon kell majd a forráskód hozzáférés.

Közben most rendelem meg a saját új gépemet, egy Dell Latitude E6500 8G RAM-mal, brutális gép lesz. Indul az év, nagyon sok tervem van, majd meglátjuk, mire futja az erőmből és főleg az időmből. Ez utóbbi szokott lenni a szűk keresztmetszet.

Bikásabb új évet kívánok!

Filed under: Uncategorized — Soczó Zsolt @ 15:04

Bár még csak amatőr tőzsdecápácska vagyok, de ez nekem azt mondja, hogy elértük a 2003-as történelmi support szintet, így most már fordulnia kell a trendnek, vagy ha nem, hamarosan bezár a sarki közért is.
Mivel havi grafikont látunk ez lehet még vagy fél év is, és simán lehet még belőle double bottom hasonlóan az előzőhöz (meg úgy általában ez gyakori), de a lényeg, hogy szerintem optimista bikák lehetünk hamarosan. Addig is persze lehetne shortolni, de előbb tanulom még a “szakmát”.

BUÉK. :)

Powered by WordPress