• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    TENCOKACISTROMYProgramovani v C#, F# a dalsich jazycich pro .NET, Mono a ostatni CLI implementace
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    JANFROG: To jsem nepochopil na poprvy ja tebe :).
    Jo, to bych napsat mohl. Ale asi by to bylo hazeni hrachu na zed.
    Bylo mi vysvetleno proc to tak delaj - dava to smysl. Ale me to ztezuje zivot :(.
    JANFROG
    JANFROG --- ---
    TENCOKACISTROMY: Huh, tak ted Ti nerozumim...
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    MORMEGIL: Mam na mysli tenhle postup.









































    main thread thread 1 thread 2
    start: A = "0", B = "1"
    vytvoreni kopie cookies A = "0", B = "1" A = "0", B = "1" A = "0", B = "1"
    odeslani requestu A = "0", B = "1" A = "0", B = "1" A = "0", B = "1"
    prijeti response A = "0", B = "1" A = "0", B = "1", C = "4" A = "0", B = "1", D = "5"
    merge z vlakna 1 A = "0", B = "1", C = "4" obsahuje jen "C" navic
    proste pridam "C = 4"
    A = "0", B = "1", D = "5"
    merge z vlakna 2 ??? A = "0", B = "1", C = "4" obsahuje "D" navic,
    ale neobsahuje "C".
    mam "C" odstranit nebo ho tam nechat?
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    JANFROG: Videl jsi tu tridu a jak ji ostatni tridy pouzivaji?
    Bez nejakejch negativnich konotaci - fakt by me zajimalo, jak bych toho timhle zpusobem dosahnul.
    JANFROG
    JANFROG --- ---
    MORMEGIL: Neni tak spatne. Zda se, ze to je udelane tak ze to mohu pouzit jen v omezenem kontextu. Pouziti v jinych kontextech se aktivne brani (nic neni virtual, vse private a podobne).

    Ja jsem pro to, at mi nikdo nebrani si to zmrsit sam. Kdyz na to dojde, vyrobce me totiz posle do .. tak jako tak. Alespon MS/IBM/Oracle/Apple to dela.
    MORMEGIL
    MORMEGIL --- ---
    JANFROG: Dost špatné přirovnání, nikdo ti nebrání tu knihovnu použít na připojení k jakémukoli HTTP serveru. Spíš je to jako mít auto, ve kterém nemůžu vyměnit původní turbo za turbo vlastní konstrukce. (Či auto, ve kterém sice fyzicky můžu vyměnit turbo za součástku od jiného výrobce, ale přijdu tím o záruku.)

    Takže jsi pro co? Aby se k autu dodávala kompletní technická dokumentace každé součástky, aby si ji každý mohl vyměnit, nebo aby si každý sice mohl do auta místo turba namontovat jiné, ale když mu pak nepůjdou stahovat okýnka, tak mu výrobce prostě řekne, ať si nestěžuje, že do toho neměl vrtat?
    JANFROG
    JANFROG --- ---
    MORMEGIL: Tyhle argumenty neberu :-) To je jako mit auto, co umi jen jednu trasu kterou si v autosalone vymysli, ze budes jedinou jezdit a zakazat jet kamkoli jinam, protoze by ses mohl ztratit a nedejboze jeste nehoho prejet.

    MORMEGIL
    MORMEGIL --- ---
    JANFROG: Tak ono je to vždycky otázka: Jakmile uděláš svoje metody virtuální, měl bys v dokumentaci vyjmenovat tu spoustu předpokladů, které na ně kladeš a asi si je ani neuvědomuješ. (Typu: Pokud někdo overridne property Count tak, že kolekci změní (třeba uvnitř bude vyhazovat expirované položky), tak to může začít chcípat na InvalidOperationException, páč ji volám uvnitř foreache. A tisíc dalších drobností.) Ve výsledku buď spousta „zbytečné“ práce s dokumentací, nebo flexibilní knihovna, která se ale chová podivně a nikdo neví proč, dokud nezačne zkoumat její zdrojáky. Taky ne zrovna „well designed object library“…
    MORMEGIL
    MORMEGIL --- ---
    TENCOKACISTROMY: Necháp. Jednak tedy seznam _všech_ cookies asi dostat nemůžeš, ale beztak tě zajímají jen cookie pro danou doménu, na které běží ta WS, ne? A k tomu tam máš GetCookies. A kolize, kdy ti jedno volání cookie odstraňuje, zatímco druhé přidává/mění, jsi mi tvrdil, že nenastane (potažmo totéž může nastat i na tom webu).

    Představoval jsem si to zhruba nějak takhle, ale dost pravděpodobně to ještě není dost defenzivní, dokumentaci ke Cookie* jsem nestudoval (a jelikož je Cookie třída, asi bude potřeba vyrábět nové instance a kopírovat sem tam, ne zneužívat jednu ne-thread-safe instanci všude dokola) a možná to ani nefunguje, samozřejmě jsem to ani nezkusil. :-)
    JANFROG
    JANFROG --- ---
    TENCOKACISTROMY:
    Muzes napsat prvni prispevek na tu stranku C# o "well designed object libraries". Namety:
    Overridnout cleny me napadlo taky, ale v duchu "co nutne nemusi byt virtualni neni" se tam nic takovyho nenachazi :D :(.
    Jednak neni jinej zpuosb jak ziskat seznam cookies bez pouziti reflexe.

    Dalsi muze byt o tom proc nemuzes vzit ten CookieContainer, rozsirit si ho jak potrebujes a pouzit :-)
    JANFROG
    JANFROG --- ---
    TENCOKACISTROMY: Hlavne nedrz si "master cookies" ale changelog :-)
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    To mergovani cookies je silenejsi nez jsem doufal.
    Jednak neni jinej zpuosb jak ziskat seznam cookies bez pouziti reflexe.

    Ale hlavne! Jak pak rozlisit stav, kdy ze byla nejaka polozka odebrana a ne ze byla mezitim pridana z jineho vlakna.
    LOOCAS
    LOOCAS --- ---
    Shánim člověka, co ovládá .NET, Windows Server (hlavně co se propojení s db, IIS a Active Directory týče) a umí programovat v IronPythonu (preferuju!), nebo C#.

    Potřebuju vytvořit web aplikaci, která bude přes uživatelsky přívětivý prostředí ovládat (posílat příkazy na CMD) server aplikaci, která se stará o scheduling a management PC v síti (network rendering).

    Mám už i hotový funkční demo tý aplikace, ale v PHP na Apachi a PostgreSQL. Potřebuju to předělat celý pod Windows Server prostředí (PostgreSQL bych nechal) s napojením na IIS, AD atp...

    Měl by někdo zájem?
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    MORMEGIL: Toho jsem se obaval :). Reseni toho thread-safe pristupu je vzdycky hroznyho psani. A blbe se to testuje :/.
    MORMEGIL
    MORMEGIL --- ---
    TENCOKACISTROMY: Tak to asi opravdu jenom držet pro každý thread vlastní instanci CookieContainer a přelévat cookies mezi těmihle a jedním centrálním, nic lepšího IMHO nevymyslíš. (A řekl bych, že to nebude ani nijak moc složité; nejtěžší tam bude detekce, které cookie se voláním smazaly, ale je možné, že to v tvém případě ani nemusíš dělat a prostě je tam necháš.)
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    MORMEGIL: Ta webova sluzba poskytuje metody, ktery dotycnej server ma i na webu. Takze bych si tipnul, ze to thread-safe bude. Druha strana shodou okolnosti pouziva WCF (ne ze by to neco zajistovalo, ale neni to splacany na kolene, videl jsem kus jejich serverovyho kodu).

    Overridnout cleny me napadlo taky, ale v duchu "co nutne nemusi byt virtualni neni" se tam nic takovyho nenachazi :D :(.

    Prave situace "nastav C na 1" + "nastav X na 3" se mi prave muze klidne stat. Pravdepodobnost, ze budu chtit "C" nastavovat 2x na jinou hodnotu je miziva. Ale ze bych mel nastavit dve ruzny hodnoty se uz stat muze. Uvnitr toho CookieContainer jsou kolekce - a ty teda pri blbejch okolnostech muzou pri vicevlaknovym zapisu delat poradnou neplechu :/. Nicmene presny implementace neznam a moc se mi nechce resit to pres ILSpy.
    MORMEGIL
    MORMEGIL --- ---
    TENCOKACISTROMY: To je dost vtipná konstrukce… Je vůbec samotná ta WS „thread-safe“ (můžeš z jedné session volat současně několik metod)? Cookies se v principu posílají tak, že v requestu pošlu všechny, co mám, v response mi přijdou _změny_, které mám aplikovat. Takže už samotná ta situace, že současně pošlu dva dotazy, načež mi současně přijdou odpovědi 1. nastav cookie C na hodnotu X, 2. nastav cookie C na hodnotu Y, je dost zajímavá.

    Ale samozřejmě to ve tvé situaci může prostě nenastávat, v tom případě může být reálná cesta IMHO leda ta varianta 3; nejdřív mě teoreticky napadlo podědit si CookieContainer a přepsat si ho na thread-safe, ale to v praxi nejde, protože tam nemají nic virtual. (Plus samozřejmě thread-safovost jednotlivých metod neznamená, že to bude fungovat jako celek, ale to už i viz výše.)
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    Potrebuju pouzivat webovou sluzbou, a ta po me chce aby jsem mel cookies. Webova sluzba neni moje a nemuzu na tom nic zmenit.

    Ty jednotlivy metody mi muzou upravovat dotycny cookies. A ty metody potrebuju volat z vice vlaken. Koukal jsem se do dokumentace a trida System.Net.CookieContainer neni thread-safe. Co s tim mam delat?

    1) Mam se spolehnout na to, ze se mi to nezesere? To se mi moc nechce.
    2) Mam se pokouset detekovat, ze to je zesrany a pak to nejak napravit? To se mi chce jeste min.
    3) Mam mit nejakou "centralni" cookies a tu synchronizovat s tim, co mi prichazi z volani tech metod? To je docela vopruz, ale mohlo by to byt spravne.
    4) Neco jinyho?
    OODOOW
    OODOOW --- ---
    NECROMAN: na to je tam spešl funkce, takže nejjednodušeji asi takhle:

    s.Substring(0, 3).PadRight('*', s.Length);

    ale možná to není nejrychlejší :)
    MORMEGIL
    MORMEGIL --- ---
    NECROMAN:
    public static string ReplaceWithStars(string s)
    {
    	if (ReferenceEquals(s, null)) throw new ArgumentNullException("s");
    	return s.Length > 3
    		? s.Substring(0, 3) + new string('*', s.Length - 3)
    		: s;
    }
    
    [TestFixture]
    public class UnitTests
    {
    	[Test]
    	public void TestReplaceWithStars()
    	{
    		Assert.AreEqual("abc*****", ReplaceWithStars("abcdefgh"));
    		Assert.AreEqual("ABC*****", ReplaceWithStars("ABCDEFgh"));
    		Assert.AreEqual("a", ReplaceWithStars("a"));
    		Assert.AreEqual("abc", ReplaceWithStars("abc"));
    		Assert.AreEqual("abc*", ReplaceWithStars("abcd"));
    		Assert.AreEqual("***", ReplaceWithStars("***"));
    		Assert.AreEqual("", ReplaceWithStars(""));
    		Assert.Throws<ArgumentNullException>(() => ReplaceWithStars(null));
    	}
    }
    


    A dobrá soutěž teď vymýšlet problémy a omezení takového řešení. :-)
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    NECROMAN:
    string MyStrFunc(string template) {
        return new StringBuilder(template,0,3).Append('*',template.Length-3);
    }
    


    Muzes vyzkouset, jestli to nebude rychlejsi nejprve s vytvorenim stringbuilderu s danou kapacitou teprve pak appendovat.
    Ochranu proti null atd... si zaridis sam :).
    Kliknutím sem můžete změnit nastavení reklam