• ú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 --- ---
    ANDY_WARHOL: delal jsem statickou analyzu kodu pres zminovany Cecil. alternativou ti muze byt pouziti api od reflectoru (ted uz bohuzel placenyho). Cecil umoznuje i upravovani dotycnyho IL kodu, ale to uz neni tak easy (musis fakt vedet co delas).

    pokud ale pouzijes roslyn, podel se o svoje zkusenosti. nechtelo se mi s tim matlat, kdyz to nemuzu nasadit to produkce, ale za kazdou osobni zkusenost bych byl vdecen ;)
    MORMEGIL
    MORMEGIL --- ---
    ANDY_WARHOL: Přinejmenším částečně Roslyn (ale zatím je to v CTP).
    SAJAGI
    SAJAGI --- ---
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    mam dotaz, nevite nekdo zda existuje nejaky zpusob, jak prochazet kod v C# nejak strukturovane, tedy ne pouze jako text. mam jednu konzolovku, ktera by mela prochazet vsechny cs file v danem adresari a mela by z nich vyzovabavat nejake informace. typicky me zajima co je v using clausuli, jaky je namespace a potom jake jsou tam metody a jaky je jejich navratovy typ. a co je jejich obsahem (tam uz mi staci text). mohu to delat textove, regexama a podobne, ale hodilo by se mi to nejak nacist jako objekt a mit to info strukturovane. resharper treba neco takoveho umi, umi code analyzing. nema treba nejake api ? hledal sem neco, ale nemuzu nic najit. nejaky napad by se mi opravdu hodil
    diky
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    KEDRIGERN: no jde mimo jine i o veci jako rychlost kompilace atd :/
    KEDRIGERN
    KEDRIGERN --- ---
    SHIGORBIRDMAN: C++11 jde, akorát nevím zda existují nějaké kvalitní tutoriály. Jako sám od sebe bych to nedal, ale advance C++ na MFF mi otevřelo oči :).

    A samozřejmě trochu boj je volba knihoven.
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    offtopic: po par letech prevazne se c# jsem sahnul na c++... au, au.... auuuuuu
    MINUSQ
    MINUSQ --- ---
    K0TEL: eaz fuscator do verze 3.3
    DARKREIDER
    DARKREIDER --- ---
    Este podotknem, ze to bolo uz daaaavno, tak mozno sa veci zmenili
    DARKREIDER
    DARKREIDER --- ---
    na hovno uplne nie, je to free verzia toho brutalne draheho, ktory mi nejaky Ind ponukal po telefone za par tisic dolarov, ked som zverejnil pri registracii telefon :). Je dost osekana, vie len zakladne nahradenia premennych a tusim este nejaku(e) drobnost(i), na poriadne zneprijemnenie refaktoringu to nie je, ale urcite to zamlzi znatelne, vzdy lepsie ako plain kod. Len bacha na resx, tie mi to pravidelne rozosralo, takze ich vyhodit zo zoznamu obfuskovania.
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    ten je imho dost nahovno
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    Neni nejakej pribalenej primo k Visual Studiu?
    K0TEL
    K0TEL --- ---
    zdar, nějakej typ na freeware obfuscator (.net)?
    LOOCAS
    LOOCAS --- ---
    KEDRIGERN: Díky, supr! To mě předtim nenapadlo. :) Zkusim.
    KEDRIGERN
    KEDRIGERN --- ---
    Běžně se zachytává výjimka (v objektových jazycích je takové ukončení jednou za čas ok - často by to byl výkonnostní problém). Ale samozřejmě lze snadno použít čítač - délku streamu máš, tak si počítej, kolik si přečetl a pak to ukonči.

    Nicméně tu výjimku tam stejně budeš mít a jestli to nejsou stovky streamů, ale ukočení max. pár desítek streamů, tak bych šel pohodlně přes výjimku.
    LOOCAS
    LOOCAS --- ---
    Leda while "nevyhodí vyjímku", to by asi šlo.
    LOOCAS
    LOOCAS --- ---
    SHIGORBIRDMAN: Znám. :) Ale while "co"? :) Jak řikám, v Pythonu neni objekt EOF.
    KEDRIGERN
    KEDRIGERN --- ---
    KEDRIGERN: s/teytu/textu (samozřejmě)
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    LOOCAS: znas cyklus while?
    KEDRIGERN
    KEDRIGERN --- ---
    LOOCAS: Zcela normálně, jako matchování teytu. Čteš a zkoumáš, co to zrovna je a pak už to jen dočteš. V Céčku to asi ani jinak dělat nemůžeš.

    Prostě když není objekt, tak ti nic moc nepomůže.
    LOOCAS
    LOOCAS --- ---
    SHIGORBIRDMAN: No, já si myslim, že ne. Proto se tu ptám, jak. :)

    Jak postavíš loop na proměnnym počtu iterací?
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    LOOCAS: a to je takovy problem nacist si to vsechno do toho pole bajtu (jak uz to delas) a brat to z nej? to "getdata" podle toho co pises vraci pole bajtu, to je takovy problem pouzit ji misto readbytes? odnekud musis vedet kolik v tom streamu je dat, to je takovy problem si to hlidat?
    LOOCAS
    LOOCAS --- ---
    SHIGORBIRDMAN: No, problém je v tom, že ten stream je speciální cStream objekt knihovny OpenMCDF. Nemá metodu ReadBytes, má pouze metodu GetData(od, do).
    Druhá věc je ten loop while. Já nezjistim žádný EOF. v IronPythonu ani žádnej takovej objekt neni. Afaik.
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    var id = stream.ReadBytes(16);
    var lenbytes = stream.ReadBytes(4);
    long len = lenbytes[0]+lenbytes[1]*256+lenbytes[2]*256*256+lenbytes[3]*256*256*256; //teda za predpokladu, ze je to ulozene jako maly endian
    var strbytes = stream.ReadBytes(len);

    a tak dal do, to cele do while cyklu dokud neni pozice ve streamu na konci. Neni mi moc jasne, v cem je konkretne problem.
    LOOCAS
    LOOCAS --- ---
    SHIGORBIRDMAN: No, na to se právě ptám. :D Jak napsat cyklus, kterej bude procházet pole po různě dlouhejch krocích?

    16 Bytů: ID (nepotřebuju)
    4 Byty: množství dalších Bytů, ve kterejch je uloženej string (potřebuju!)
    XY Bytů (dýlka je variabilní, uložená v předchozích Bytech, podle dýlky stringu), kde je string, kterej potřebuju upravit = změnit a tim i změnit jeho dýlku, což pak musim následně zapsat do předchozích 4 Bytů
    4Byty: množství dalších Bytů, ve kterejch je uloženej string (ten nepotřebuju)
    XY Bytů, množství určeno v předchozích čtyřech Bytech

    a tohle pořád dokola, dokud jsou v poli Byty.

    Jednoduše použít for x = 0 to len(Array[Byte]) použít nemůžu, jelikož by to chodilo po jednom Bytu.
    SAJAGI
    SAJAGI --- ---
    LOOCAS: Pokud tě dobře chápu, tak bych si vytvořil vlastní implementaci stream readeru / writeru, která bude mít ReadString / WriteString, a která bude sama načítat, resp. zapisovat ty tvoje DYLKY. Takže v principu pak bys měl něco jako
    while ((string token = inputStream.ReadString()) != null) {
      var modToken = token.ToUpper(); // do something with the token
      outputStream.WriteString(modToken);
    }


    Popřípadě tedy, pokud to nechceš konvertovat do stringu, tak si to ukládej do pole bajtů.
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    LOOCAS: mas to oparvdu jako normalni stream?
    pak fakt nevidim duvod proc to neudelat jako cyklus, kdy postupne nactes 4 bajty id, 4 bajty delku stringu, tolik bajtu kolik ma mit string atd.
    LOOCAS
    LOOCAS --- ---
    H_U_N_T_E_R: Array[Byte] mi vrací metoda .GetData() na tom stream objektu, kterej potřebuju upravit. Dělám to pomocí OpenMCDF knihovny na OLE strukturovanym storage v binárnim souboru (proprietárnim).


    SHIGORBIRDMAN: No, mě jde spíš o to, že tak, jak to dělám, mám pocit, že neni úplně košer. :) Můj postup:

    1) načtu soubor
    2) vycucnu z něj ten stream objekt
    3) ze stream objektu načtu všechny Byty v pořadí do Array[Byte] objektu

    a teď ta moje prasárna:
    4) pomocí Encoding.Unicode.GetString() překlopim celej Byte Array na unicode string
    5) rozdělim si celej string na list objektů podle speciálního terminate charakteru theString.split("\x00")
    6) vyměnim řetězce v poli, který potřebuju
    7) složim zpětně string z toho pole s pomocnym terminate charakterem: "\x00".join(theList)
    8) přeložim zpět na Byte Array: Encoding.Unicode.GetBytes(theString)
    9) zapíšu do streamu
    10) přepíšu stream v souboru, commitnu a uložim na disk.

    Tomu překládání pomocí UTF-16 bych se chtěl vyhnout a řešit to na úrovni toho Byte Array, proto se ptám, jak iterovat Byte Array, když mám předem daný pravidla:

    16 Bytů - vyhrazeno pro ID
    4 Byty - délka následujícího stringu (UTF-16) (uložíme do proměnný DYLKA)
    Len(DYLKA+1)*2 - počet následujících Bytů, který nesou textovou hodnotu (UTF-16)
    4 Byty - délka násleudjícího stringu (UTF-16) (uložíme do proměnný DALSIDYLKA)
    Len(DALSIDYLKA+1)*2 - počet následujících Bytů, který nesou textovou hodnotu (UTF-16)

    (mimochodem, psaný je to v IronPythonu)
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    LOOCAS: pokud chces libovolne menit obsah toho streamu, jako ze jednotlive objekty muzou menit sve hodnoty a velikost, tak se z toho, pokud je to opravdu klasicky Stream, "pobavis".

    Asi nacist vsechno do pameti jako deserializaci objektu v linked list seznamu (za predpokladu, ze je potrea nejak poradi).
    Nebo projet cely stream a zjistit si indexy, na kterych zacinaji jednotlive objekty, a udelat si dictionary ID/index
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    zaroven bych asi musel definovat i nejvyssi pocet znaku v patternu, protoze jinak by mi to zakonite vratilo jen cely retezec jako ze se jednou opakuje.
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    ANDY_WARHOL: vybralo by to zaroven ty nejdelsi nejdriv.
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    H_U_N_T_E_R: chtel bych nejak definovat nejmensi pocet znaku v tom patternu, takze tvuj priklad bych definoval ze chci mit 2
    a pak by vystup byl jen abab - 2x
    protoze to co uz by jednou v tom paternu bylo by se uz nepocitalo znovu.
    proste vypichnout unikatni co nejdelsi sequence

    H_U_N_T_E_R
    H_U_N_T_E_R --- ---
    LOOCAS: proč to máš jako pole bytů? Pokud to není stream, tak si to stejně celý načítáš do paměti a ukládáš zpětně, pak bych použil nějakou vhodnější strukturu a custom serializaci/deserializaci. A jelikož se ti to vejde do paměti, tak rozdíl mezi zpracováním RAW pole a nějakého spojáků/něčeho jiného bude minimální.
    Kliknutím sem můžete změnit nastavení reklam