• ú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 --- ---
    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?
    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 :).
    NECROMAN
    NECROMAN --- ---
    Dotaz, jak byste nejcisteji napsali metodu, ktera pro dany string vrati jiny string, ktery bude mit pvni tri znaky stejne a misto dalsich hvezdicky?
    SAJAGI
    SAJAGI --- ---
    CERMINEK: Místo IndexOf raději http://msdn.microsoft.com/en-us/library/dy85x1sa.aspx . .NET je deklarativnější, než C++.
    CERMINEK
    CERMINEK --- ---
    Asi jsem na .NET vážně lama, ale potřeboval bych píchnout s přístupem k souborům. Čumím do MSDN a nějak mi to hlava nebere. Marně hledám klasické fopen, fclose...

    Potřebuji přistupovat ke svě souborům, kdy oba na začátku otevřu pokud existují, pokud ne tak je vytvořím. Po té z jednoho načtu hodnotu a tu budu v průběhu programu aktualizovat. U toho druhého pak chci zapisovat nové hodnoty vždy na konec souboru, aby se zachovaly již ty co tam jsou...
    Poradí někdo prosím? stačí vodítko... snad to dohledám...
    CERMINEK
    CERMINEK --- ---
    NIXX: jj už jsem na to přišel :-)
    NIXX
    NIXX --- ---
    CERMINEK: Jak jsi přišel na tu nulu? Kdyby ses obtěžoval přečíst si základní dokumentaci, věděl bys, že tam má přijít -1.
    String.IndexOf Method (System)
    http://msdn.microsoft.com/en-us/library/system.string.indexof.aspx
    LOOCAS
    LOOCAS --- ---
    CERMINEK: Regular Expressions?
    Kliknutím sem můžete změnit nastavení reklam