Soci (Soczó Zsolt) szakmai blogja

2015.02.05.

.NET fejtörő 2. megoldás

Filed under: .NET,Szakmai élet — Soczó Zsolt @ 21:44

Feladat itt.

Emlékeztetőűl a feladat:

var sb = new StringBuilder();

for (int i = 0; i < 10; i++)
{
    sb.Append(i + ' ');
}

A művelet kimenete:
32333435363738394041

Miért?

i integer, ‘ ‘ char. A char nem más, mint egy 16-bites numeric (ordinal) érték, mi implicit konvertálható más, nagyobb vagy azonos méretű egészekké.
Azaz a ‘ ‘ szóköz karakter 32-es kódját kell hozzáadni a ciklusváltozóhoz, ezért jön ki egy számsorozat végeredményként.

2015.01.22.

.NET fejtörő 3.

Filed under: .NET,Szakmai élet,Teaser — Soczó Zsolt @ 08:00

Update: bocs, a Counter osztály lemaradt, így nem volt értelme a feladatnak.

Piros vagy zöld lesz a teszt kimenete? Válaszokat indoklással kommentben várom. A hozzászólások moderálva vannak, hogy 2 napot tudjam késleltetni a válaszokat, így mindenkinek lesz ideje gondolkodni. Jó filózást!


struct Counter
{
    int counter;
    public override string ToString()
    {
        return counter++.ToString(CultureInfo.InvariantCulture);
    }
}

[TestMethod]
public void Teaser3()
{
    var sb = new StringBuilder();
            
    var sz = new Counter();
            
    sb.Append(sz);
    Object p = sz;
    Object o = p;
    sb.Append(sz);
    sb.Append(o);
    sb.Append(p);
    sb.Append(o);

    Assert.AreEqual("01234", sb.ToString());
}

A Test Driven Development tanfolyam következő felvonása 2015. február kilencedikén lesz, szeretettel várlak.

2015.01.20.

.NET fejtörő 1. megoldás

Filed under: .NET,Szakmai élet — Soczó Zsolt @ 18:34

Ez a feladat egyszerű volt. A .NET-es lebegőpontos számok ismerik a végtelen fogalmát, így a nullával osztás végtelent ad eredményül. Azért lesz lebegőpontos az osztás, mert a PI konstans double, így az a értéke is double lesz. A b ugyan int lesz, de a compiler átkonvertálja double-lé, mielőtt az osztást elvégezné, mivel a másik argumentum double. Miért?
A C# spec 7.3.6 Numeric promotions bekezdése alapján azt az overloadolt operátor + verziót választja ki, amelyik passzol a paraméterekre. Nincs int, dobule verzió, ezért konvertálnia kell. A double -> int nem implicit konverzió, így megpróbálkozik az int -> double-lel, azaz a második argumentumot átkonvertálja double-lé. Erre pedig már passzol a double operator +(double x, double y) overloadolt alak.

.NET fejtörő 2.

Filed under: .NET,Szakmai élet,Teaser — Soczó Zsolt @ 08:00

Piros vagy zöld lesz a teszt kimenete? Válaszokat indoklással kommentben várom. A hozzászólások moderálva vannak, hogy 2 napot tudjam késleltetni a válaszokat, így mindenkinek lesz ideje gondolkodni. Jó filózást!

[TestMethod]
public void Teaser2()
{
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < 10; i++)
    {
        sb.Append(i + ' ');
    }

    Assert.AreEqual("1 2 3 4 5 6 7 8 9", sb.ToString());
}

A Test Driven Development tanfolyam következő felvonása február kilencedikén lesz, szeretettel várlak.

2015.01.15.

EF WithRequiredDependent – mit csinál ez?

Filed under: .NET,Entity Framework,Szakmai élet — Soczó Zsolt @ 15:10

Nem jövök rá, pontosan mit is csinál ez? A HasRequired már önmagában megcsinálja a foreign keyt, mit ad ez még a modellhez?

.NET fejtörő 1.

Filed under: .NET,Szakmai élet,Teaser — Soczó Zsolt @ 08:00

Piros vagy zöld lesz a teszt kimenete? Válaszokat indoklással kommentben várom. A hozzászólások moderálva vannak, hogy 2 napot tudjam késleltetni a válaszokat, így mindenkinek lesz ideje gondolkodni. Jó filózást!

[TestMethod]
public void Teaser1()
{
    try
    {
        var a = Math.PI;
        var b = 0;
        var c = a / b;
    }
    catch (DivideByZeroException exception)
    {
        Assert.Fail("A kutya fáját");
    }
}

A Test Driven Development tanfolyam következő felvonása 2015. február kilencedikén lesz, szeretettel várlak.

2015.01.11.

Gyors .NET tömörítő algoritmusok

Filed under: .NET,Szakmai élet — Soczó Zsolt @ 17:32

A backtesteremben nagyon sok adatot kell kezelni memóriában, sok gigabájtot. A memóriacache-emben tömörítve vannak az adatok. Tömörítésre eddig a .NET GZip algoritmusát használtam, fastest módban, így elfogadható sebességet és tömörítést kapva.
Most viszont olvastam róla, hogy vannak alternatív algoritmusok is. Tettem hát egy próbát, az alábbi eredményeket kapva:

.NET GZipStream fastest mode:
Compression time: 00:00:00.1801551, compressed size: 75,122.00
Decompression time: 00:00:00.2001859

Ez a baseline.

Snappy native:
https://snappy4net.codeplex.com/
Compression time: 00:00:00.1815305, compressed size: 508,387.00
Decompression time: 00:00:00.1464451

Hát, ez nem győzött meg.

Lz4:
http://lz4net.codeplex.com/
Compression time: 00:00:00.6303679, compressed size: 41,926.00
Decompression time: 00:00:00.1364594

Ez se az igazi sebességben, de legalább jól tömörít.

Lz4Native:
https://code.google.com/p/lz4-net/
Compression time: 00:00:00.0925361, compressed size: 49,862.00
Decompression time: 00:00:00.1757730

Na, ez már tetszik. Jobban tömörített, mint a gzip, fele annyi idő alatt, mint az, és a decompress is egy kicsit gyorsabb. Kipróbálom majd igazi adatokkal is, meglátjuk, ott hogy zenél.

2015.01.07.

Invalid file karakterek lecserélése

Filed under: .NET,Szakmai élet — Soczó Zsolt @ 17:51

Egy webes munkában file nevet kellett generálni a letöltendő fájloknak. Az eredeti névben lehet kettőspont, stb. ami nem megengedett fájlnevekben. A böngésző is lekezeli ezt valahogy, de én akartam ezt előre megoldani.

Itt vannak megoldások a feladatra.

Sokféle megoldást adnak, nekem a linq-s tetszik legjobban:

var invalidChars = Path.GetInvalidFileNameChars();
var invalidCharsRemoved = stringWithInvalidChars.Where(x => !invalidChars.Contains(x)).ToArray();

De ez a legfurább logikájú, ez ütötte meg a szememet:

string cleanFileName = String.Join("", fileName.Split(Path.GetInvalidFileNameChars()));

Erre mondja az angol, hogy convoluted logic?

Test Driven Development tanfolyam: február 9.

2014.11.11.

Console.WriteLine blokkolás

Filed under: .NET,.NET 4,.NET 4.5,Szakmai élet — Soczó Zsolt @ 19:38

Ma megint láttam valami újat, kár, hogy bosszúság árán. Egy program logol fileba és konzolra is. VS debugger alatt futott, majd detacholtam. A detacs hatására a Console.WriteLine többet nem tért vissza, nem hibát adott, hanem blokkolta a hívást, ezzel teljen megállítva a program működését. Gondlom a VS átirányította a std outot magára, a detacs során viszont valami nem jött össze neki. Tanulság: ne tessék a debuggerel szórakozni, ha produkciós kódról is fontos futtatásról van szó.

2014.10.10.

Ha stringeket kell formázni, ez hasznos lehet

Filed under: .NET,Felhívás,Szakmai élet — Soczó Zsolt @ 17:04

Pl. Format(“{Elso} – {Masodik}”, obj);

Az objből kiszedi az Elso es Masodik property-k értékét, és behelyettesíti.

Íme pár implementáció, nekem a szerzőé bevált (HaackFormatter).

—–

TDDre még van van pár helyem, akit érdekel, vagy ismerősét érdekli, jelentkezzen. Ha a jelentkezéskor a megjegyzésbe beírod a HaackFormatter szót, akkor még él a 150-es kedvezményes ár.

2014.10.09.

Ha egy MVC site nem ad vissza semmit

Filed under: .NET,.NET 4,.NET 4.5,ASP.NET,mvc,Szakmai élet — Soczó Zsolt @ 18:34

De hibát se, akkor lehet egyszerűen nincs minden IIS modul feltelepítve, ami kell hozzá.

2014.10.06.

TDD helyek

Filed under: .NET,Szakmai élet,Test Driven Development,Unit Test — Soczó Zsolt @ 10:52

Srácok/lányok/hölgyek/urak,
fogynak a helyek a TDD tanfolyamra keményen, az akciós ár beindította a gépezetet. Arra kérem aki jelentkezni szeretne, hogy töltse ki mihamarabb a webes formot, hogy lássam, mekkora teremre lesz szükség.

Köszi: soci

2014.10.01.

TDD tanfolyam kedvezményes ár még él pár napig

Filed under: .NET,Szakmai élet,Test Driven Development — Soczó Zsolt @ 09:02

Többen jeleztétek, hogy a cégeteknél nem lehet ilyen gyorsan finanszírozást találni a tanfolyamra, mivel az akciót csak 1 hete hirdettem meg. Ezért ha valaki még szeretne élni a 150-es árral jelezze nekem, így nyugodtan tudja intézni papírügyeket.

2014.09.22.

TDD tanfolyam újra – extra előfoglalási akcióval

Filed under: .NET,Design,Felhívás,Szakmai élet,TDD,Test Driven Development — Soczó Zsolt @ 16:43

Újra lesz TDD tanfolyam novemberben. Aki gyorsan lép, sokkal olcsóbban jöhet most tanulni.

Részletek itt, várok mindenkit szeretettel.

2014.09.15.

Visual Studio Profiler .NET Framework belsejéhez

Filed under: .NET,Szakmai élet — Soczó Zsolt @ 19:44

Windows 8-n már nem látszanak a rendszerhívások a profilerben, mivel nincsenek pdbk a natívra lefordított .net rendszerkódokhoz, ez pedig kellene a profilernek (illetve, mivel nagyon más a profiler mögötti infrastruktúra a Windows 8 szigorúbb secuja miatt).

Itt leírják, hogy lehet ngenelt assemblykhez pdbt generálni.

Az első, source nélküli leírás nekem nem volt elég, a metódusnevek helyén valamilyen hash szerű érték jelent csak meg, az nem túl hasznos.

Hogy ne kelljen kézzel cicózni a sok assemblyvel, itt a megoldás.
Végigszántja a gacot, és nyomja hozzájuk a pdbket. Ráadásul megcsinálja 32 és 64 bitre is. Szeretjük a Wintellectet.

2014.09.12.

Visual Studio repair

Filed under: .NET,Szakmai élet — Soczó Zsolt @ 15:36

A tegnapi gépdöglődés után Visual Studio repair volt, mivel indulás után szórta a hibákat, melyik modulja nem megy. A sima repair a Programs and Feature-sből nem segített. Két dolgot tettem, amitől rendbe jött. Egyrészt felraktam az VS 2013 SP3-at, másrészt kitöröltem pár megsérült config fájlt (hogy melyik segített sajnos emiatt nem tudom behatárolni).

C:\Users\soci\AppData\Local\Microsoft\VisualStudio\12.0\devenv.exe.config
Másrészt itt ha valamelyik, az adott assemblyhez tartozó fájl megsérül, akkor se indul a buli:
C:\Users\soci\AppData\Local\Microsoft_Corporation\

Ha valami misztikus oknál fogva semmilyen .netes program nem megy egy gépen, akkor lehet a központi config beteg, ezek a környéken:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\

Értelemszerűen kell a verziót és a bitnesst nézni.

2014.07.28.

WCF channel és channelfactory lezárás

Filed under: .NET,.NET 4.5,Szakmai élet,WCF — Soczó Zsolt @ 12:59

A WCF channelek lezárása egyértelmű, ha rendben van a csatorna Close(), ha faulted, Abort().
De mi van a channelfactory-vel?
Amiért a kérdés előjött az az, hogy egy szerviz rendszeres használata során 2 perc utáni hívásoknál elszállt a hívás. A kliens ezt élte meg:
An existing connection was forcibly closed by the remote host

A szerveren meg egy belső exception volt, amit a WCF lenyelt, de jelezte, hogy valami nem ok:
The I/O operation has been aborted because of either a thread exit or an application request.

A figyelmem a channelfactory-re terelődött. Az lokális változóként volt létrehozva, és ebek harmincadjára szabadon engedve. Jaj, ez beteg. Lokális dispose nem jó rá, mert akkor lezárja az összes általa nyitott csatornát (legalábbis vélemények szerint).

Próbáltam egy statikus példányt letárolni, azzal létrehozni a csatornákat, de ez is lepukkant 2 perc után (doksi szerint thread safe, több szálból használtam).

Végül nem maradt más, mint minden csatornához saját factory instance-et létrehozni, és a csatorna használata után mindkettőt lezárni. Pedig elvileg meg lehet osztani a factory-t, teljesítmény okokból. Ebben az alkalmazásban ez megfelelő megoldás, de ha sok csatornát kellene nyitni, az nem tetszene. Valaki látott már ilyen esetet?

2014.07.26.

MemoryCache bug

Filed under: .NET,.NET 4,.NET 4.5,ASP.NET,Szakmai élet — Soczó Zsolt @ 16:53

A MemoryCache osztály ASP.NET hoszt alatt időnként Dispose-olja magát. Nagyon kedves. Mindezt úgy teszi, hogy nem dob semmiféle exceptiont, csak ha beleraksz valamit, nem marad benne.
4.5-ben fixálták, de 4.0-ra is van workaround vagy hotfix is. Részletek itt.

2014.05.24.

Unit teszt snippet

Filed under: .NET,Szakmai élet,TDD,Test Driven Development,Testing,Unit Test — Soczó Zsolt @ 20:30

Tolom a teszteket ezerrel (ATS-elek), ez a kis snippet jól jött.

2014.05.12.

TDD is dead. Tényleg?

Filed under: .NET,Design,Szakmai élet,TDD,Test Driven Development,Testing — Soczó Zsolt @ 18:08

Pont TDD tanfolyam volt előző héten, amikor volt egy videó, amiben David Heinemeier Hansson, Martin Fowler és Kent Back beszéltek (vitatkoztak?) a témáról. A kiváltó cikk ez.
A második két ember gondolom közismert, David Heinemeier Hansson a Ruby on Rails létrehozója.

Az első rész nem volt túl mély, remélem a másodikban kicsit jobban belejönnek, bár lehet, hogy kár ezt várni. Van, amikor természetesen jön a TDD, van, amikor nem, ilyenkor igyekszünk utólag tesztelni, ha sikerül. Semmi se szentírás a szakmában, van, aki elölről szereti, van, aki hátulról. Mint az Eurovíziós dalfesztiválon. :)

« Older PostsNewer Posts »

Powered by WordPress