- A One Ui 8.5 és a Snapdragon 8 Elite 2 már biztos
- Itt egy pár fotó az iPhone 17 sorozatról
- MIUI / HyperOS topik
- One mobilszolgáltatások
- Samsung Galaxy Watch7 - kötelező kör
- Ennyibe kerülhet a Xiaomi Watch S4 európai változata
- Samsung Galaxy A56 - megbízható középszerűség
- iPhone topik
- Megérkezett a Google Pixel 7 és 7 Pro
- Végre bemutatkozott a Google Pixel 4a
Hirdetés
Talpon vagyunk, köszönjük a sok biztatást! Ha segíteni szeretnél, boldogan ajánljuk Előfizetéseinket!
Új hozzászólás Aktív témák
-
Keem1
veterán
Srácok, biztos hogy nem látom a fától az erdőt, de az aszinkron programozással mindig meggyűlik a bajom
Az alábbi egy .Net Core Console application részlete.
A BackgroundWorker nélkül működik az alábbi, de nyilván ekkor lefoglalja a main threadet a microwebserver, ezt szeretném elkerülni. Tehát a program fusson tovább, a webserver meg szépen a háttérben. Mit rontok el?
Szerk: fene vigye el, megvan a hiba
Lemaradt ez:
bgw.RunWorkerAsync();
, így már működikclass Program
{
static BackgroundWorker bgw = new BackgroundWorker();static void Main()
{
Console.WriteLine("WebGUI Teszt");
StartWebGui();
Console.ReadKey();
}static void StartWebGui()
{
var hostBuilder = new WebHostBuilder()
.UseKestrel()
.UseStartup<Startup>()
.UseUrls("http://localhost:808/")
.Build();if (bgw.IsBusy == false) bgw.DoWork += (sender, e) =>
{
hostBuilder.Run();
};
}
} -
Keem1
veterán
válasz
martonx #9278 üzenetére
Nyilván az is a nagy előnye, hogy baromi elterjedt. Szerintem Windowson kívül ott van minden rendszeren preinstalled. Pl. a Pi-hez "tartozó" Raspbianon is out-of-the box ott volt a Python.
Ugyan Pi-re simán feldobtam a Mono-t, még package managerrel is simán megy a saját appom, de én informatikus vagyok, nem hiszem hogy egy mezei usernek ez menne bármilyen Linuxon.
Uppsz, sorry, ez nem válasz akart lenni
-
Keem1
veterán
válasz
joysefke #9275 üzenetére
Alapvetően nincs baj, de mostanság az a módi, hogy mielőtt a céges "szoftverboltba" bekerülnének ezek, a részlegünk egyik managere részéről átnézésre kerülnek a kódok (nem programozók), és csak ha jóvá hagyták, akkor mehetnek fel. Már eleve a rendszer úgy működik az utóbbi időben, hogy .py és hasonló (php, sh, ps1, stb) fájlokat fogad el, .exe-t nem. Bocs, de, elfogad mást is, de utólagos check jön, mielőtt a többi team membernek elérhetővé válnak. És azon a manuális check-en nem mennek át a binárisok.
-
Keem1
veterán
Jó, én nem vagyok programozó, de a jelenlegi és az előző munkahelyemen is csinálgattam munkamegkönnyítő toolokat, mindegyik esetben C#-ban írtam őket. Itt most a jelenlegi cégnél (egy amerikai nagyvállalat) mindennél jobban preferálják a Pythont. Vannak kollégák, akik ismerik a nyelvet, így a toolokat most ők fejlesztik. A céges belső policy egyre jobban tiltja/üldözi a compiled exéket.
-
Keem1
veterán
public partial class MainWindow : Window
{
DispatcherTimer dispatcherTimer = new DispatcherTimer();
public MainWindow()
{
InitializeComponent();
// A program indulásakor beolvassa a táblázatot
Read();
// 10 percenként újra beolvassa
dispatcherTimer.Tick += new EventHandler(Reload);
dispatcherTimer.Interval = new TimeSpan(0, 10, 0);
dispatcherTimer.Start();
} -
Keem1
veterán
válasz
Jokerpoker #9212 üzenetére
Valóban egyszerűbb a CSV, de ha nem riadsz vissza a kihívásoktól, akkor egy HTML parsert javasolnék, ahol xpath alapján kéred le az adatot. Akár B opciónak, házi feladatnak a CSV feldolgozás mellett ezt is kipróbálhatod, én így gyűjtöm a koronavírus infót a hivatalos oldalról már 2 és fél hónapja.
Plusz parse-olok időjárási oldalakat is, már 4 évre visszamenő, óránkénti bontású saját statisztikám van. Az évek során többször variáltam az adatforrásokat, mivel voltak olyanok, ahonnan kitiltottak a gyakori lekérés miatt.
Én a HtmlAgilityPack nevűt használom, ez még a HTML lekérést is megoldja, https oldalról is, ráadásul én egy listából variálom a useragenteket (van köztük valós Chrome, Safari, IE, Firefox is), hogy ne tűnjön robotnak a program és ne tiltsák ki az oldalakról
-
Keem1
veterán
Skacok, algoritmus segítségre lenne szükségem. A Timert és a DateTime-t kellene kombinálnom úgy, hogy az Interval pontosan kétóránként (páros óránként), 0 perc 0 másodperckor legyen.
Kézenfekvő lehetne, ha eleve 0 perc 0 másodperckor indítanám, de az emberi erőt igényel.
Másik megoldás, hogy mondjuk másodperceként figyelem és ha 0 perc 0 másodperc, akkor "elérkezett az idő", de ez meg eléggé igénytelen és erőforráspazarló is.Szóval valami olyasmiban látnám a megoldást, hogy kezdéskor következő egész óra - az adott idő az interval, majd utána már 2 órának megfelelő ms.
Erre esetleg valami elegáns, hatékony és logikus ötlet?
A kód service-ként, szerveren fog futni (Raspberry Pi, Linux, mono-service-ként indítva).
-
Keem1
veterán
válasz
Jokerpoker #9182 üzenetére
Szerintem nem magára az adatbázisfájlra, hanem az adatbáziskezelő rendszerre gondolt. Nem ismerem a LocalDB-t, de pl. MySQL-nél telepíteni kell az adott gépre (vagy csatlakozni a távoli szerverhez), az SQLite esetén meg kell az a dll, ami maga az adatbáziskezelő rendszer.
De nem ismerem a LocalDB-t, fogalmam sincs, hogy épül fel és mi kell hozzá.
-
Keem1
veterán
válasz
Jokerpoker #9178 üzenetére
Nem biztos hogy igazam van, de a current working path lekérdezése nekem nem tetszik.
Megpróbálod a tiéd helyett ezzel? System.Environment.CurrentDirectory -
Keem1
veterán
Ez az, így van, sikerült is, sőt, kibővítettem úgy, hogy magába a Test osztályba tettem be a metódusokat, megfejelve azzal, hogy void helyett string a visszatérési értéke.
Nagyon köszi az útmutatást
public static class Test
{
public static string Add(string input)
{
return input;
}
public static string ToConsole(this string text)
{
Console.WriteLine(text);
return text;
}
public static string ToFile(this string text, string FilePath)
{
try
{
System.IO.File.AppendAllLines(FilePath, new[] { text }, System.Text.Encoding.UTF8);
}
catch { }
return text;
}
} -
Keem1
veterán
Srácok, van egy statikus ojjektumom (nevezzük most Teszt-nek), annak pedig egy fő metódusa:
string Add(string data)
Az esetek többségében a használata:string EzLeszAValtozo = Teszt.Add("ide írok valamit");
Viszont szükségem lenne egy olyan megvalósításra, hogy:
Teszt.Add("ide írok valamit").ToConsole();
Mely esetben az Add metódus string visszatérési értéke továbbmenne a ToConsole() metódusnak és abban csak annyi lenne, hogy Console.WriteLine(AzAddMetódusVisszatérésiÉrtéke);
Addig vagyok meg, hogy
public static Teszt
{
public static string Add(string input)
{
return input;
}
}Szóval valahogy a ToConsole metódust kéne kiviteleznem, de nem tudom hozzáfűzni az Add()-hoz. Lesz még ToFile(), ToMySql(), stb. de ha megvan a method chaining, szerintem a többivel már boldogulni fogok. A lényeg az, hogy az Add() visszatérési értéke átkerülhessen egy másik metódus bemenetére.
-
Keem1
veterán
válasz
bandi0000 #9167 üzenetére
Igen, közben rátaláltam erre, már beleástam magam
Köszönöm a linket!
Persze, kiválóan tudok angolul(egy nagy amerikai multinál dolgozom, ahol az 5 körös interjúból 4,5 volt angolul és napi szinten van szükség rá).
#9168 martonx:
Köszi, ezt megérdemeltem a lustaságom miattAmúgy ez a Mukesh Kumar féle szösszenet tényleg eléggé összeszedve mutatja a pro-kontra, meg összehasonlítási oldalról.
-
Keem1
veterán
Srácok, annyi technológia van már, kezdem elveszve érezni magam. Tudom, a net tele van leírással, de ha valakinek van kedve és 5 perce, nagyon leegyszerűsítve, csupán pár mondatban, leírná, hogy mi a különbség a .Net Framework, a .Net Core és a .Net Standard között?
Ez utóbbiról most hallottam először, miután egy NuGet package telepítése közben kiírta nekem, hogy nem kompatibilis ez a cucc az én projektemmel. A .Net Core-ról halvány sejtelmeim vannak, kb. egy új, platformfüggetlen csapásiránynak vélem. És mint a fentiekből kiderült, eddig a .Net Framework-kel kerültem kapcsolatba (amit eddig a pillanatig csak .Netként aposztrofáltam).Mivel nem teljesen témába vágó a kérdés, és kicsit redundáns is, megértem, ha válasz nélkül hagyjátok. De ha mégis vállalná valaki, hogy tényleg leegyszerűsítve, a különbségekre, előnyökre helyezve a hangsúlyt megválaszolná, annak megköszönöm.
Ha nem kapok válasz, akkor majd túrom a netet, úgyis megtalálom. Csak nekem ez a közösség eléggé szimpatikussá vált, sokat segítettetek eddig egy laikusnak (azt már sokszor mondtam, hogy ugyan kicsit konyítok hozzá, de nem vagyok programozó). -
Keem1
veterán
Hálás köszönet
Még valami!
Mivel eddig nem volt, Raspberry Pi-re fordítottam System.Data.SQLite binary-t. A NuGet a saját SQLite.Interop.dll-jét faszán megcsinálta: van egy x86 meg egy x64 mappa, benne a megfelelő dll, ugyanezen a néven. Ha az exe mellé hozzácsapom (a fenti két mappán kívül) az arm-es dll-t, akkor frankón működik. Viszont ez eléggé favágó megoldás. Ha létrehozok egy linux-arm mappát, és beleteszem a dll-t, nem találja (szól, hogy nincs ez a fájl). Rá tudom valahogy venni a Visual Studio-t, hogy "figyelj, van egy arm binary is, azt is használd"?Igen-igen, a tooljaimat már platformfüggetlenre írom. Minden faszán megy arm linux alatt is, kivéve - eddig - az SQLite. A favágó megoldással viszont már az is.
-
Keem1
veterán
Srácok, float formázással kapcsolatban kérnék segítséget:
String.Format("{0:#0.0#}", WeatherData["main.temp"])
Mivel magyar a windows régióm, tizedesvessző lesz a stringben. Viszont ebben az egy esetben, tizedespontra lenne szükségem. Nem szeretnék regionális beállításokkal mókolni (mivel tényleg csak ez az egy eshetőség van, amikor változtatni kell), így kézenfekvő lenne, ha a formátumkóddal oldanám meg. Na de egyelőre nem találtam rá a megoldásra. -
Keem1
veterán
Bár lehet hogy nem a legjobb stratégia, de én szeretem azokat a technikákat előnyben részesíteni, amik szinte szabvánnyá váltak és a legtöbb helyzetben egyértelműek, elfogadottak. Pl. ezért használok XMLRPC-t. Elég világosan lefektetett szabályai vannak, szinte minden platformon implementálták és mindenhol ugyanúgy használható.
Az lenne a jó, ha ugyanez XML helyett JSON-ban lenne (elvileg van rá törekvés: JSON-RPC). -
Keem1
veterán
VS 2019 Community van fent, gondolom, megfelelő lesz, ugye?
Már átállítottam a beállításokban a package reference-t.Persze, érthető hogy a lefordított projektben benne lesznek a dll-ek, csak a package-k ne legyenek már külön projektenként.
Még nem próbáltam ki, de köszönöm az infót!
-
Keem1
veterán
Ha már itt egy téma kapcsán felmerült a NuGet... Van valakinek ötlete arra, hogy lehet egy-egy package-et globálisan telepíteni? Értem ez alatt, hogy nem egy-egy projecthez/solution-hoz külön-külön, hanem felmenne pl. a már említett SQLite package (Visual Studiohoz rendelve, nem solutionhoz), és azt akármennyi projecthez hozzá lehetne adni anélkül, hogy újra és újra letöltenénk és mappák tucatjaiban sorakozna újra és újra ugyanaz a package (foglalva az értékes lemezterületet is).
-
Keem1
veterán
válasz
alratar #9092 üzenetére
Én nem NuGettel használom, és ezzel a hibával még én se találkoztam. Próbáltad már leszedni a standalone DLL-t és reference-ként hozzáadni? Vigyázz a megfelelő .NET verzióra és architektúrára (az SQLite 32/64 bit érzékeny).
Ha önállóan használod, keresd a nupkg verziót (ez lesz a kiterjesztés, de ez egy zip file) és csak az SQLite.dll-t add hozzá reference-ként. -
Keem1
veterán
Eddig fájlokkal dolgoztunk, most jött az ötlet, hogy egységes formátumú XML (XML-RPC) kommunikációra állnánk át.
És az lenne a következő hónapok terve, hogy Linuxra álljunk át. Persze SMB megosztás nyilván ott is játszik, csak hát... Virtuális Linuxon, illetve itthon Raspberry Pi-n egész jól fut a .Net 4.5 és a Core 3.0 kód is.@sztanozs
Ahogy látom, most a Python mindennél népszerűbb volt, pedig azt hittem eddig, hogy a legnépszerűbb nyelv a Java, illetve utána valahanyadik helyen, de nem sokkal lemaradva a C#/.Net. Meg is lepődtem nemrég. -
Keem1
veterán
Köszönöm
, ez a linkelt library így első olvasatra jónak tűnik. Kipróbálom, addig a saját magam által feltalálandó spanyolviaszt felfüggesztem
Igen, webszerver elkerülése a cél. Azt nem használhatunk.Egy nagy multinál dolgozom, ahol azért nem olyan egyszerű dolgokat átvinni a security policy-n. Saját dolgainkhoz kaptunk egy helyet és egy Ethernet kábelt a helyi szerverteremben, ahová egy i7 procis Lenovo desktop gép bekerült. Ez már eleve tűzfal, proxi, stb. mögött ül, élvezve az egész épület biztonsági szolgáltatásait. A gép célja, hogy a munkánk megkönnyítése érdekében különböző toolokat futtassunk rajta. A többiek Pythonban programoznak, de én nem tudok kígyóuk, én maradnék a C#-nál. Nem programozók vagyunk, nem programok írása a feladatunk munkaidőben, ezzel a saját napi munkáinkat segítjük/kiegészítjük/egyszerűsítjük, így amihez ezek kellenek, abban produktívabbak, gyorsabbak vagyunk.
Adatbázist se használhatunk, a config adatokat ini fájlokban tároljuk. -
Keem1
veterán
Srácok, segítséget kérnék. Rendkívül egyszerű webszerver class készítése a cél, HttpListener segítségével. Kicsit már ismerkedtem vele. Azért nem kész webszervert használok, mivel a cél eléréséhez kicsit ágyúval verébre eset lenne. A lényeg, hogy van egy solution két projecttel. Az egyik a server, a másik a client. Ők ketten belső hálón, XML-ek segítségével kommunikálnak. A server különböző (kapott bemeneti XML alapján) feladatokat old meg (pl. lekér a netről dolgokat, átalakítja, kioutputolja). A feladattól függő végeredményt pedig kiköpi szintén XML-ben a kliens felé (Webrequest).
Nos, ez frankón működik, itt a main()-ből ki is szedtem és betettem egy Webserver class-be. A cél az lenne, hogy a Webserver class Run() metódusa lenne ez a kiszolgáló kódrészlet, de ezenkívül lennének a végrehajtó metódusok, amik mind-mind string returnnal rendelkeznének (a HTML vagy XML stringje).
Ez eddig mind megy. Most jön az, amiben segítséget kérnék.
Hogy tudom megvalósítani, hogy a hívott URL szerinti metódus fussék le és a kimenetét (return string) adja vissza a HttpListener outputjaként?
Pl:
- http://serverfqdn:8080/teszt/ -> Webserver.Teszt() metódus string outputja
- http://serverfqdn:8080/anyamegyszent/ -> Webserver.AnyamEgySzent() metódus string outputjaAnnyi, hogy a server.exe egy lokális Win szerveren futna, nyilván ezt task scheduler egyszer elindítaná és ott szépen futna. Ennek a helyi szervernek nincs nyitott portja a net felé, alapvető biztonság tehát megtéve. És nem is a 80-as portot használná a program.
-
Keem1
veterán
válasz
t-shirt #9050 üzenetére
Ez kell neked
Standalone DLL, annyi, hogy verzió- és architektúra érzékeny. Muszáj vagy x32 vagy x64-ben fordítanod és vele a megfelelő DLL-t "csomagolni". Mindenképp a nuget package-t használd, mivel az egy nagyobb dll és nincs prerequisite.Emellett használhatsz helper classt is, de ha ráérzel a lényegre, akkor az adott class-ben úgyis megoldod a használatát. Én mindig készítek egy model classt, és szinte csak ott használom az adatbáziskezelést. így a helper már nem nyújt előnyt.
-
Keem1
veterán
-
Keem1
veterán
válasz
norbyy12 #8987 üzenetére
Én kicsit csodálkozva nézem az ilyen kérdéseket.
Mi a 40 perces programozás vizsgán nem tudtuk volna beírni fórumba (örültünk, ha ez az idő magára a feladatra elég lesz), másrészt 15 évvel ezelőtt habár már volt internet, de a vizsga idejére a gépeket megfosztották tőle a gépteremben
Tudom, okostelefon, de akkor is.
-
Keem1
veterán
Skacok, bizonyára már észrevettétek, hogy ugyan nem vagyok programozó, de a munkahelyemen a kolléganők életének megkönnyítésére kis toolokat készítek. Az alábbi kérdésre bár a választ sejtem, de azért egy A vagy B választ szeretnék kérni
Lenne egy windows service, ami baromi egyszerű: ha épp fut, akkor bizonyos paramétereket/adatokat (lokálisan és XMLRP service-ből) gyűjtve utána az adott alkalmazottnak kipattintja egy fancy e-mail formájában. Ok: ne neki kelljen összekotorni, plusz ők jobban emésztik a csini kis e-mailecskéket.
Tudom-e egyetlen applikációban összegyúrni a service-t és a pár adat bekérésére/módosítására szolgáló winformot (ezt mondjuk first run is feldobná, ahol e-mail cím, meg adott esetben a frissítési gyakoriság felülbírálása lenne - adatok a registryben).
A.) Igen, ez működik egy appon belül
B.) Francokat, csináld meg külön, ez nem lehetségesKöszi!
Ps.: eredetileg egy task schedulerrel időnként elindított console appra gondoltam, ami nyilván kézzel futtatva a paraméterek bizgerálására lenne jó, de szerintem hülyét kapnak a console felülettől, másrészt nem lenne jó, ha időnként feljönne (és abban a pillanatban el is tűnne) a console felülete.
-
Keem1
veterán
válasz
kw3v865 #8952 üzenetére
Ha jól értem a kérdést (a külső program, és nem az általad írt záródik be), akkor ez nem a te applikációdban keresendő probléma. A CLI appok nagy része a program futását követően terminál, ahogy lefutott a kód. Cmd-ben indítva azért nem, mert a cmd-t kapod vissza, de ugyanúgy kilép maga a program, és visszakapod a promptot. Az appban, ha a vége user interakció (pl. "press any key"), akkor nyilván ott marad bezárásig vagy az user input teljesüléséig.
A lineáris CLI appok mind így működnek.Elvileg lehetséges nem külső processzként futtatni, de erről inkább a topiktársak tudnak infót adni, én ugyanis nem tudom.
-
Keem1
veterán
válasz
RedHarlow #8949 üzenetére
Objektumorientált paradigma megvan?
Lokális változót nem fogsz tudni kívülről használni (ahogy ciklusváltozót se cikluson kívül), így a fentebb említett osztályváltozó lesz a te embered.
Lehet hogy létezik rá favágó megoldás (joysefke köszi a kifejezést), de arról én nem tudok és nem is akarok tudni.
-
Keem1
veterán
válasz
leslie23 #8872 üzenetére
Az SQLite jó, könnyen kezelhető, könnyen elsajátítható, baromi gyors és könnyen egy akár meglévő programhoz is hozzákapcsolható. Én sokat használom, főleg olyan esetben, amikor sok és/vagy különböző módon elért/lekérdezett és/vagy gyorsan több adatot kezelő applikációról van szó.
Fontos! Az SQLite nem többfelhasználós. 1 app = 1 db (nyilván ez áthidalható, de akkor sem baba)! Ha ez nem hátrány, használd nyugodtan, mert szeretnivaló DBMS. -
Keem1
veterán
válasz
Balcsix #8841 üzenetére
Az alapok elsajátítása nem nyelvfüggő. Természetesen arra tökéletes a C, hisz a legtöbb mai, még magasabb szintű nyelvek onnan származnak (C++, Java, C#, PHP, csak hogy a legismertebbeket említsem).
Az algoritmusokat, programozás alapjait, objektumorientált szemléletet akár nyelv nélkül, pszeudo nyelven is meg lehet(ne) tanulni. Minél kevésbé fejlett/komplex nyelven sajátítja el valaki az alapokat, annál kevésbé rögzül benne az adott nyelv specifikussága, hülyeségei, annál könnyebben tanul újabbakat. -
Keem1
veterán
válasz
Hunter2 #8814 üzenetére
Tudsz, de ezt C-ben írták és nem C#-ban
Bár rég volt már, ehhez szükséged van egy C compilerre, visual studioval nem tudod (egykönnyen) használni, mivel nem VS projekt. Szerintem érdemes lenne C-vel (vagy hardverközeli programozással) foglalkozó topikban megkérdezni, mivel a C# elég erősen magasszintű nyelv, nem szoktak vele mikrokontrollert programozni. -
Keem1
veterán
válasz
user112 #8798 üzenetére
1.) Tranzakciót sok egyforma művelet (insert, delete, update) egymásutáni végrehajtásakor érdemes, sokkal gyorsabb lesz. Több külön lekérdezéseknél semmi előnye nincs. Ezt most adatbázistól függetlenül, általánosságban írtam.
2.) A try-catch a kivételkezelésnél használatos (kivételek elkapása), a using meg az idisposable objektumok kezeléséhez kell. Pl. memóriastream, filestream, adatbázis. Nem sok hasonlóság van köztük, ha együtt láttad őket, az valószínűleg azért, mert adatbáziskezelés közben (using) kivételkezelés is történt (try), mondjuk pl. csekkolják, hogy az adatbáziskapcsolat létrejött-e, tábla létezik-e, stb. Kismillió esetben fordulhat elő.
-
Keem1
veterán
Bocsánat, nem tudtam, hogy kezdő vagy.
Szóval, a random szám generátorral csak egy random tömbindexet készítesz, nem a tömb egy random indexét veszed ki.Tehát a séma:
- X legyen egy véletlen szám, ami legalább 0, legfeljebb a tömböd mérete.
- a keresett elem az X indexű elem a tömbbentomb[X]
. -
Keem1
veterán
Most csak nagy általánosságban fogok válaszolni, de szerintem segíteni fog (úgy, hogy PHP-ban igen, ASPX-ben nem vagyok járatos).
Alapvetően az oldal (és járulékos elemei) karakterkódolásán múlik a dolog. Amíg minden UTF8-at használ (HTML kód, C# kód, adatbázis kapcsolat, táblák, stb), addig semmi probléma nem lesz, és az utolsó pinjin karakterig minden a helyén lesz.Kb. itt kezdődik (HTML):
<meta name="charset" content="UTF-8" />
-
Keem1
veterán
És valóban! Hálás köszönet!
Már csak érdekességből kérdezem: mi az a két bájt, amit kitömörítéskor le kell szedni, betömörítéskor meg hozzá kell biggyeszteni?
Alapvetően a webszerver esetén is megvan, de egyrészt a JSON forrása eltérő is lehet, és ott nem biztos, hogy a HTTP-ben történik a tömörítés, másrészt a kliens által visszaküldött anyagot is tömöríteni kell.
-
Keem1
veterán
Srácok, egy jól működő sztring (php-tól kapott json) kitömörítőt próbálok megfordítani.
Ez a jól működő kitömörítő:
public static string GZDecompress(string compressedString)
{
MemoryStream memStream = new MemoryStream(Convert.FromBase64String(compressedString));
memStream.ReadByte();
memStream.ReadByte();
try
{
DeflateStream deflate = new DeflateStream(memStream, CompressionMode.Decompress);
string decompressedString = new StreamReader(deflate, System.Text.Encoding.UTF8).ReadToEnd();
return decompressedString;
}
catch
{
return String.Empty;
}
}Ez a betömörítési próbálkozásom:
public static string GZCompress(string decompressedString)
{
MemoryStream memStream = new MemoryStream();
byte[] input = Encoding.UTF8.GetBytes(decompressedString);
MemoryStream stream = new MemoryStream(input);
try
{
DeflateStream deflate = new DeflateStream(memStream, CompressionMode.Compress);
stream.CopyTo(deflate);
deflate.Close();
return Convert.ToBase64String(memStream.ToArray());
}
catch
{
return String.Empty;
}
}És így tesztelem:
string szoveg = "árvíztűrő tükörfúrógép";
Console.WriteLine(GZDecompress(GZCompress(szoveg)));A fenti kiírás üres.
-
Keem1
veterán
Amíg lockolva van, a többi kliens várakozásra kényszerül. Aztán folytatódik a dolog, mihelyst az író kliens feloldotta a lockolást.
Olyan nincs, hogy egyszerre. Az csak elméleti, gyakorlatban pl. az író előbb jön, akkor ő zárol, míg bárki érkezik bármivel mialatt zárolva van a db, az/azok várakoznak. És ha az író feloldotta a lockot, akkor a folyamat elölről kezdődik, a soron következő klienssel (feltéve, ha ő is írni akar).Bocs, hogy belevau
, de én is használok SQLite-ot.
-
Keem1
veterán
válasz
Alexios #8450 üzenetére
A probléma, hogy nem tudom, hogy az első dictionary elemei közül melyikben lesz, a keresett elemem.
Az első (kategória) kulcsainak száma 5-10 (partners, ...), ezeken belül elvben korlátlan int=>string páros lehet, de átlagosan 5-300 db.Ha tudnám, melyik kategóriában van, így keresnék:
properties["partners"].ContainsValue("blabla");
De sajnos nem tudom, hogy melyik külső dicionary tartalmazza azt a belsőt, amiben benne lesz a keresett sztring, sőt, lehet, hogy az adott kulcsszóra több kategóriából is lesz egy vagy több találat. Jól megbonyolítom, mi?
Alapból<int, string>
akart lenni, de valahol a programkódban hibánal vélte a compiler, és csak az string object-ra cserélése oldotta meg. -
Keem1
veterán
Srácok, a Linq nem az erősségem, ezért elakadtam
Ebben kéne szűrni:Dictionary <string, Dictionary<int, object>> properties = new Dictionary <string, Dictionary<int, object>>();
Adatbázisból kerül feltöltésre a tartalma, ilyesmi:Console.WriteLine(properties["partners"][15]); // kimenet: Kovács és Tsa Zrt.
Amit nem tudok összehozni: szeretném a
properties
-ből megtudni, benne van-e a "Kovács és Tsa Zrt.", ill. megtudni (ha létezik), hogy mi az ID-ja.A dictionary első eleme általában egy kategória, azon belül pedig egy ID és maga a megnevezés. Szóval (1) a megnevezés létezését keressük (2) a megnevezés (ha létezik) ID-ját kérem vissza int-ként.
Az hogy csinálok rá egy metódust és foreach-csel végigmegyek, nekem ágyúval verébre megoldásnak tűnik, így bízom abban, hogy a Linq segít (feltéve, ha megtanultam volna a használatát).
-
Keem1
veterán
válasz
Peter Kiss #8398 üzenetére
Csak tipp: Windows globális változók miatt?
-
Keem1
veterán
Nem jogosultsági hiba lesz, akkor azt írná ki. Valami miatt tényleg nem találja a fájlt. Próbáltad már esetleg szóköz nélküli path használatával?
Tudom, kicsit régimódi gondolkodásmód, de sosem használok a fájlok nevében és útvonalában szóközt, ékezetes vagy speciális karaktert.
-
Keem1
veterán
válasz
sztanozs #8341 üzenetére
Nagyon úgy fest az ábra, hogy a node-ba töltéskor meghívott
xmlReader
olvasott még egyet.
De a fentebb írt megoldással sikerült áthidalni.Sajnos muszáj volt így megoldanom, talán már nem emlékeztek rá, de örököltem a projekt továbbvitelét, arra viszont semmi időm nincs (egyedül kellene), hogy nulláról újraírjam az egészet. Így ahol tudok, javítok, fejlesztek, optimalizálok. Viszont a kiszedett
XmlNode
objektumokhoz nem éri meg hozzányúlni, mivel a kártyavár alján van.És épp ezért valószínűsítem, hogy ti is hallani fogtok még erről a projektről (
), biztosan elő fog kerülni újabb és újabb probléma. Ha belefognék, pár hét alatt kéne újraírni, arra (mivel nem csak ezt csinálom) semmi időm nincs.
-
Keem1
veterán
válasz
Peter Kiss #8338 üzenetére
A cél az lenne, hogy mindig, amikor egy új product node-hoz elérek, azt úgy egyben beolvassam egy XmlDocument-be.
Igen, sejtettem, hogy valami ilyesmi gond állhat mögötte.Viszont lehet, hogy megtaláltam a megoldást?
XmlNode node = xmldoc.ReadNode(xmlReader.ReadSubtree());
Látszólag azt csinálja, amit szeretnék, de nem mélyedtem bele, nem néztem meg, hogy minden szükséges adaton végigszalad-e így, viszont a csomópontok száma stimmel.
-
Keem1
veterán
Már megint elakadtam
A téma lehet hogy ismerős lesz a korábbi posztjaimból, de azért frissítem az emlékeket.Nagy (több GB-os) XML-ekkel dolgozunk, amit az xmlReader.ReadToFollowing("product") segítségével olvasok végig (így piszok gyors és szinte semmi memóriafogyasztása sincs a DOM-alapú megnyitáshoz képest).
XML struktúra:
<product-export>
<product>
<product>
<product>
</product-export>Amikor egy adott product node-on vagyok, akkor azt az egyet betöltöm egy DOM alapú objektumba, és azzal az eggyel már DOM alapon dolgozom. Így valójában hiába van az XML-ben több tízezer <product> node, mindig csak egyet töltök be DOM-ba és dolgozom vele. Ez eddig beválni látszott, ám úgy tűnik, egy óriási hiba van a gépezetben. Ugyanis onnan kezdve, hogy betöltöm az egy szem node-ot, rögtön szelektálni kezd a program, és kihagy egy csomó product node-ot. Nem jöttem rá, miért, és mi alapján. Van egy kicsi teszt fájlom, 35 node-dal, ebből 17-et lát ezzel a módszerrel. A DOM-részt kihagyva végigszalad mind a 35-ön.
Mutatom:
while (xmlReader.ReadToFollowing("product"))
{
if (xmlReader.Name.Equals("product") && (xmlReader.NodeType == XmlNodeType.Element))
{
// Számláló továbbléptetése
counter++;
Console.WriteLine(counter.ToString() + ". " + xmlReader.Name.ToString());
XmlDocument xmldoc = new XmlDocument();
XmlElement root = xmldoc.CreateElement("product-export");
xmldoc.AppendChild(root);
XmlNode node = xmldoc.ReadNode(xmlReader);A legutolsó kódsornál jelentkezik az anomália (
XmlNode node = xmldoc.ReadNode(xmlReader);
). Ha kikommentezem, ugyan üres lesz a DOM-om, de végigmegy az összes producton. Ezt a számláló utáni kiíratás mutatja.Kimenet, ha kikommentezem az említett részt:
0. product
1. product
2. product
3. product
4. product
5. product
6. product
7. product
8. product
9. product
10. product
11. product
12. product
13. product
14. product
15. product
16. product
17. product
18. product
19. product
20. product
21. product
22. product
23. product
24. product
25. product
26. product
27. product
28. product
29. product
30. product
31. product
32. product
33. product
34. product
35. productÉs ha benne hagyom:
0. product
1. product
2. product
3. product
4. product
5. product
6. product
7. product
8. product
9. product
10. product
11. product
12. product
13. product
14. product
15. product
16. product
17. productMit rontok el?
-
Keem1
veterán
válasz
alratar #8278 üzenetére
Ez nagyon feladatfüggő. Én használok SQLite adatbázist, és elégedett is vagyok vele. A program saját adatainak, meg a helyi munkaadatok tárolására (van pár tíz soros tábla is, kvázi registry helyett, de van százezres nagyságrendű is).
Viszont eszembe nem jutna többfelhasználós rendszerben használni, arra a DBMS a megoldás. Olyat is használok, viszont a feladat jellege miatt MSSQL helyett MySQL-t (vannak PHP alapú meg Delphiben írt kliensek is az adatbázison [az egyik programunkat még 2009-ben írták, azóta csak apró fejlesztésen esett át, de a legutóbbi is 2013-as, és még mindig csodásan teszi a dolgát]). -
Keem1
veterán
Srácok, mi a legjobb megoldás?
Van egy osztályom, ami a bemenő adatokkal egy csomó műveletet végez, a végeredmény pedig egy hash. Ez egy foreach-ben kap adatokat, egy egy ciklus megálló a többitől nem fut.Valahogy így:
foreach (valami)
{
Osztaly objektum = new Osztaly (valamik);
Eredmeny = objektum.eredmeny;
}Az nem jó, ha a foreach előtt példányosítok, mivel rengeteg az adat, és az objektumra később nincs szükségem (ezért nem teszem tömbbe se). Ha lenne
objektum.Dispose()
, akkor a ciklus belseje előtt simán felszabadítanám, és ahogy a példában is van, simán a cikluson belül létrehoznám. Egyébként így kipróbáltam, de nem működik jól, csak a foreach első lefutásakor.Mi lenne erre a legjobb módszer?
-
-
Keem1
veterán
válasz
sztanozs #8253 üzenetére
Úgy valóban kérdőjeles a szöveg, de csak ASCII karakterek esetén se egyezik a hash.
Azt hittem, hogy a crc32 univerzális, nem lehet máshogy generálniMD5 esetén nincs ilyen probléma, de ahová ez kell, ott fontos, hogy rövid ujjlenyomatot képezzek, a 32 karakter már sok.
Ezt módosítottam, de ekkor se egyezik a PHP-s eredménnyel:
string probaszoveg = "english alphabet only";
string hash = String.Empty;
Crc32 crc32 = new Crc32();
foreach (byte b in crc32.ComputeHash(Encoding.ASCII.GetBytes(probaszoveg))) hash += b.ToString("x2").ToLower();
Console.WriteLine("Szöveg: " + probaszoveg);
Console.WriteLine("Szöveg (byte): " + Encoding.ASCII.GetString(Encoding.UTF8.GetBytes(probaszoveg)));
Console.WriteLine("CRC32 hash: " + hash);Kimenet:
Szöveg: english alphabet only
Szöveg (byte): english alphabet only
CRC32 hash: b5c4fd8d
A folytatáshoz nyomjon meg egy billentyűt . . .PHP:
Szöveg: english alphabet only
CRC32 hash: e9032c43 -
Keem1
veterán
Szeretnék egy kis segítséget kérni, hogy miért tér el a PHP és a C# által generált CRC32 hash.
Fontos lenne, hogy megegyezzen.Forráskódok:
hash.php
Program.cs
System.Security.Cryptography.Crc32.csHa valakinek van ötlete, kérem, ne tartsa magában
-
Keem1
veterán
válasz
Peter Kiss #8176 üzenetére
Nem-nem.
Nem kell ezt túlmisztifikálni, ez egy relatíve egyszerűbb rendszer. Időpazarlás lenne az egészet újraírni oly módon, ahogy azt egy jó programozó hozná ki.
Biztos nem tökéletes, ehhez kétség nem férhet, még csak jó programozónak se tartom magam, de egyvalami biztos: ez a program jelenleg tökéletesen elvégzi a feladatát, és az adminisztrátor csajoknak rengeteg melót levesz a válláról, amiket excelben kellene utólag kivitelezni.
Amúgy naponta félmilliós nagyságrendű import van (ill. inkább csak az adatok ellenőrzése, mert végül nem kerül a rendszerbe az, aminél nem történt változás).Ez a partnerektől (kb. 150 db) származó nem egységes (=kb. 150-féle eltérő) adathalmazt, XML-t dolgozza fel és alakítja át a rendszerünk által emészthető formátumba. Minden ügyintézőnek meghatározott partnerei vannak, akiknek az adatait betallózza, majd ha a rendszerben megjenentek a friss árak, akkor napközben azzal dolgoznak.
Dióhéjban ennyiJa, egy szösszenet tavalyról. Szólt az egyik ügyintéző az egyik olasz partnernek, hogy kéne egy XML export. Vakarta a fejét, megkérdezte a webmestertől. Ő is vakarta. Majd kaptunk egy XML-t. A honlapjuk HTML kódjának valami XML-be erőltetett verziója volt
És nem akarták először elhinni, hogy mi nem erre gondoltunk.
-
Keem1
veterán
válasz
Peter Kiss #8172 üzenetére
Nem memóriában, diszken
És több feldolgozásét is, amikor az XML-ek már rég a levesben vannak. Nem mondom, hogy ez így tökéletes, de évek óta működik. Én csak javítani próbálok rajta, meg újításokat bevinni. -
Keem1
veterán
válasz
Peter Kiss #8169 üzenetére
Helyi cache
Nagy mennyiségű adat érkezik innen onnan, de azok xml-ben. A vélhetően ritkábban változó anyagot letároljuk SQL-ben. Mindenhez van crc32, így nyomon követhető a változás
Elég bonyolult a szitu, én is csak örököltem a feladatot. Programoztam azelőtt c#-ban, de az elmúlt kb 4 év szinte csak PHP volt -
Keem1
veterán
válasz
Peter Kiss #8165 üzenetére
Nem...
Egészen pontosan micsoda? -
Keem1
veterán
Skacok, ketten dolgozunk egymástól távol azon a bizonyos XML-es projekten.
Az van, hogy különböző XML-hez különböző osztályt használunk (pl. MarikaNéni.xml -> class ParserMarika).
Mindegyik specifikus osztály egy "csontváz" osztálytól öröklődik. A csontváz osztály csak XML fájloktól független metódusokat tartalmaz (SQLite adatbázis kapcsolat felépítése, online állapot ellenőrzése, alap üres változók, stb.), ezért valójában majdnem üres. Meg tudom tiltani, hogy "véletlenül" a kolléga egy eseménynél a csontváz osztályt példányosítsa? Tehát példányosítani ne, csak örököltetni lehessen.Nem életbevágóan fontos dolog, ha nincs ilyen, túléljük, de minden hibalehetőséget szeretnék kizárni.
-
Keem1
veterán
válasz
#40351744 #8146 üzenetére
502-es hiba, azaz szerver oldali.
Esetleg gond lehet, ha useragent string nélkül akarsz hozzáférni. (Mi szűrtük szerver oldalon bizonyos lapoknál a "noname" kliensek hozzáférését).Én azért megpróbálnám egy IE-re felparaméterezett webclient elérést is, teszt jelleggel - mintha böngésző lenne.
-
Keem1
veterán
válasz
Froclee #8141 üzenetére
Sajnos nem.
An unhandled exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll
F5-tel ezt kapom. 150 ms-ig nincs probléma egyik megoldással sem.
Viszont ennél a hibaüzenetnél nem jelzi a VS, hogy melyik programsor okozza a hibát.Megvan a hiba oka! Túl magas delay-nél a MouseLeave() esemény okozza, elmozdítom az egeret, amire össze kéne csuknia a menüt, ám mivel a panel még nem érte el a nyitott végértékét, hibát dob.
-
Keem1
veterán
Srácok, window 10-féle menüvel próbálokozom, nyitás-csukás animálva.
KódAmíg nem volt async a menü mozgatása, bármilyen animációs idővel működött, ám pl. egy életszerűtlen 1 másodperces időnél, amíg az animáció le nem futott, addig kb. kattintani se lehetett. Ilyennel még nem foglalkoztam, de gugli ugye a barátunk, rájöttem, tegyem az ilyen metódusokat async-é. Működik mondjuk 150 miliseccel, de pl. 300-zal vagy 500-zal már lefagy az egész.
Miért? -
Keem1
veterán
Srácok, bizonyára lesz olyan, aki emlékszik rá, hogy nagy xml-ekkel dolgozom.
A korábbi megoldásom az volt, hogy
XmlDocument
+XmlNode
, amíg az XML befért a memóriába. Mostanra sok lett az, ami nem fér be.
Új megoldást találtam ki: alapvetőenXmlReader
(ez a nagy XML), és amelyik node épp kell, azt beolvasom DOM-ba.using (XmlReader xmlReader = XmlReader.Create(docUrl))
{
while (xmlReader.ReadToFollowing("product"))
{
if (xmlReader.Name.Equals("product") && (xmlReader.NodeType == XmlNodeType.Element))
{
XmlDocument xmldoc = new XmlDocument();
XmlElement root = xmldoc.CreateElement("product-export");
xmldoc.AppendChild(root);
XmlNode node = xmldoc.ReadNode(xmlReader);
}
}
}Így elvileg egy node-ot tartok a ramban, mindig amivel épp dolgozom. Működne is a korábbi megoldásom az által, hogy a node nevű aktuális csomópont ugyanúgy megvan, csak eddig DOM-ból foreach-csel körbejárva, így meg mindig csak egy van beolvasva.
Igen ám, viszont előállt egy olyan gond, hogy midegyik node mellé társul egy#whitespace
elnevezésű üres cucc, amit az eddigi kód megpróbál feldolgozni.
Tehát most anode.ChildNodes.Count
= (régi)node.ChildNodes.Count *2
, mivel van egy#whitespace
nevű érvénytelen node-om is.
Ezt hogy tudnám kiszedni? És mitől keletkezett? Így kell elképzelni: [kép] -
-
Keem1
veterán
válasz
zsolti_20 #8078 üzenetére
Nem tudom, mennyire kell igényesnek lennie, de talán van egy tippem, ha annyira nem.
Pár éve mókoltam teszt jelleggel hasonlót én is, de nálam nem volt külön szerver program, hanem a kliensek egy DBMS adatbázissal kommunikáltak, oda ment a duma, a kliensek pedig időnként rácsekkoltak, van-e nekik új beszéd.
Nyilván nem a legelegánsabb, legigényesebb megoldás, sőt! De ha a feladat elvégzéséhez és nem díszdobozos prémium apphoz kell, ez egy működőképes, viszonylag gyorsan összehozható cucc lehet. Én amúgy MySQL-t használtam hozzá.Persze, ha nem ez a cél, nyugodtan tekintsd a javaslatomat tárgytalannak, úgyis jön nálam rutinosabb topiktárs hogy javasoljon neked jobbat
-
Keem1
veterán
válasz
joysefke #8022 üzenetére
Csak halkan kérdezem: egy zenestream szolgáltatás nem lenne egyszerűbb? Spotify, Google Play Music, Deezer, Apple Music, stb.
Ezres körüli előfizetési díj, több tízmillió zene, és sohat többet nem kell zenét nagy macerával előtúrni, letölteni, esetleg konvertálni.
Csak meg kell keresni, bekattintani (esetleg listához adni) és már hallgatható. Előfizus konstrukcióban van offline mód is. Ja, és vannak edzéshez, futáshoz való listák (is).Én két és fél éve vagyok előfizető, az elején még nem gondoltam így, de mostanra már az a véleményem, hogy youtube-bal, to..enttel bohóckodjon az, akinek két anyja van
-
Keem1
veterán
A stack egy olyan tárolási elv, amikor az először bekerülő adat a tároló aljára kerül, a többi rá. Mindig a legfelső adatot éred el, míg az alján lévőt csak akkor, ha kikerült a többi a tárolóból.
First in, last out.Huh mennyi memória számítási feladat volt a fősulin
De ezt progmat szakon nem tanítják? Én mondjuk mérnök informatikus szakot végeztem, ahol a hardver legalább olyan súlyos volt (ha nem súlyosabb), mint a szoftver.
-
Keem1
veterán
Maga az alkalmazás. Most a Load-ban vannak ezek a cuccok, de míg nem ért véget, a form meg se jelenik. Tudom, nem sok idő, nem másodpercekről van szó, de akkor is szeretném, ha előbb bejönne a form (userünk tudja, hogy él a program), majd a db dolgok, és végül hozzá lehet látni a munkához.
Sima WinForms applikáció. -
Keem1
veterán
Srácok, hová érdemes inicializáló dolgokat tenni? Olyan metódus kéne, aminél már a form betöltődött, de felhasználói interakció még nem kivitelezhető.
Ha letörlöm az adatbázis fájlt, akkor van, hogy 300-600 ms ideig is elszöszöl, míg létrehozza az adatbázist, az alap táblákat, meg az amúgy is szokásos alapbeállítások alkalmazódnak. A beállítások betöltése majd érint(het)i a form elemeit is (pl. listbox feltöltése).Egyébként egész megbarátkoztam az SQLite-tal
Alapvető különbségek vannak MySQL-hez, meg úgy általában a non-local adatbázisokhoz képest. Pl. a tranzakciókezelés jó barátom lett sok adat egyidejű módosításakor. Pl. amikor teszteltem, volt hogy 1000 db random string beírása külön-külön 7 másodpercet vett igénybe, tranzakcióval meg 2-300ms.Ha jól sikerülnek most a dolgok, akkor a saját későbbi munkámat könnyíthetem meg azzal, hogy kevesebb feladathoz hívnak személyesen oda.
-
Keem1
veterán
válasz
Froclee #7950 üzenetére
Stopwatch-csal mértem, igen, belevettem a Console.WriteLine() kiíratást is. Amúgy gyanúsan lassú volt előtte, SQL-ben ugyan nem vagyok istenkirály, de tán pár év PHP+MySQL után amatőrnek se számítok, így nagyon elgondolkodtam. Már jó, 40 millisec alatt van 10 és 350 elemű kiírással együtt is.
-
Keem1
veterán
Lehet, én voltam a hülye
A második táblára rátettem egy PK-t, így 30 ms ugyanaz a lekérdezés.
Hiába, nem sikerült tökéletesen importálni MySQL-ből néhány táblát. Ezen még dolgoznom kell.Ettől függetlenül azért érdekes, hogy a DB Browsernek simán ötöde volt így is. Most 40-50 ms, az én appomban pedig 30-40 ms a lekérdezés.
A MySQL megmaradt 100 körül, de ott alapból megvolt a PK, az csak a MySQL->SQLite importkor mászott le. -
Keem1
veterán
Szerintetek mitől van az, hogy egy SQLite lekérés ugyanazzal a queryvel C# appban sokkal lassabb, mint egy adatbáziskezelőben (DB Browser for SQLite 3.10.1)?
Az SQL valami ilyesmi:
SELECT T1.field1, T2.field2, T3.field3 FROM table1 T1 LEFT JOIN table2 T2... WHERE ... LIMIT 10
DB Browser: 4 rows returned in 237ms
C# console app: Kész! 00:00:01.29
MySQL (phpMyAdmin, böngészőben): Sorok megjelenítése 0 - 3 (4 Összesen, A lekérés lefutott 0.1508 másodperc alatt)Azért az is durva, hogy a MySQL böngészőben, másik gépről kevesebb mint fele idő alatt lefutott (150 ms), mint az aprócska, és helyben lévő SQLite (237 ms). Kezdek kiábrándulni a helyben tárolt adatokhoz használandó SQLite-ból.
-
Keem1
veterán
-
Keem1
veterán
válasz
Froclee #7906 üzenetére
Valóban érzékeny adat, így csináltam egy lecsupaszított verziót
Az alapötlet onnan származik, hogy az eddigi DOM parsert akarom átírni, mivel adott esetben több száz, vagy akár GB-on felüli XML is létezik, így a ram telítődés (és a swappolás) hátrányai rögtön jelentkeznek. Ez az előbb 26 másodperc alatt szaladt végig egy kicsit több, mint 1 GB-os példányon, csak épp működésre bírni nem tudom.Köszönöm a segítséged!
Basszus!
Szerintem rájöttem a hibára!travel_data[id].Add(xmlReader.Value);
HELYETT:travel_data[id].Add((XNode.ReadFrom(xmlReader) as XElement).Value);
Lassan kiderül, hogy én bizony csak egy kontár vagyok...
-
Keem1
veterán
Srácok, mit rontok el?
KódA
Dictionary<string, List<string>> travel_data = new Dictionary<string, List<string>>();
id-ját (string) ki tudom íratni, de aList<string>
elemeit már nem.Egyébként létezik olyan univerzális dump, ami a paraméter változó, objektum, stb. adatait strukturáltan kiírja, mint pl. php-ban a
print_r()
? Ilyen esetben nagy segítség lenne, hogy ténylegesen mi van az adott változóban.Ez a kimenet (az adat résznél (belső foreach) üres sorok):
Nyomjunk egy billentyűt a kezdéshez!
Beolvasandó fájl: TOROKORSZAG39.xml
=== Kész! 00:00:01.11 ===
YS4257=====
TMLMB4259=====
ADWP4282=====
SLR4284=====
TBRH4293=====
-
Keem1
veterán
Megint én.
Metódusnak paraméterként hogy tudnék átadni egy nem példányosított, adatokkal feltöltött dictionaryt?Valami ilyesmi kéne:
CsinaljValamit(Dictionary<string,string>() { {"kulcs","ertek}, {"kulcs","ertek"} })
A metódus egyetlen paramétere egy kulcs-érték párokat tartalmazó <string,string> Dictionary.
Köszönöm!
#7883 adam014:
Hűha, ez nagyon gyors volt, köszönöm!
Akkor jó felé kapisgáltam, "csak" a new maradt le. Tekintve az eddigi C# előéletemet, lehetek egy picikét büszke magamra? Rád pedig, persze nagyon -
Keem1
veterán
-
Keem1
veterán
Na ez magamtól nem jutott volna az eszembe.
A using deklarációval próbálkoztam, de nem fogadta el, most már tudom, hogy mert a class nem volt static.
Azzá tettem, így már működik.Szerk:
Elkiabáltam (nem fordítottam le), mégse működik.using static XmlProcess.Helper;
"Identifier expected; 'static' is a keyword"using XmlProcess.Helper;
"A using namespace directive can only be applied to namespaces; 'XmlProcess.Helper' is a type not a namespace"Jó ez a C#, de rengeteget kell még tanulnom.
A programozás, mint olyan nem idegen nekem, pláne 7 év (nem folyamatos) PHP után.
-
Keem1
veterán
Srácok, egész jól kiszerveztem a metódusokat egy class-be, sőt, egy helper osztályt is készítettem. Viszont eléggé bőbeszédű lett a kódom.
Így néz ki a kiszervezésem:
namespace XmlProcess
{
class Base
{
}
class Helper
{
public static void EzEgyMetodus()
{
}
}
}Viszont a Winformsból így tudom használni:
XmlProcess.Helper.EzEgyMetodus();
Lehet rajta egyszerűsíteni, hogy ne kelljen a namespace.class.metódus() szentháromságon mindig végigmenni, vagy fogadjam el, hogy a strukturálásnak, átláthatóságnak és a kiszervezésnek ennyi hátránya van?
-
Keem1
veterán
Már elkezdtem, csak eleinte ódzkodtam tőle, mert rengeteg esemény van (ahogy írtam, én is örököltem), de hosszútávon ez tűnik a logikus lépésnek. Ha minden igaz, exception kezelés rendben van, még a loggolást kell jobban átszerveznem. Ráadásul úgy tűnik, csak a legfontosabb funkciókat kell tudnia parancssorból indítva tudnia, így könnyebb lesz kicsit.
Bár nagyobb meló, de úgy tervezem, hogy a metódusokat kiteszem egy osztályba, ahogy javasoltad, a Form-éban csak a gombok kezelői, meg a parancssor lekezelése lesz.
Remélem, a kitartásom a közepén is megmaradAzt hogy tudnám megoldani, hogy egy nagyobb XML foreach-es végigjárása alatt is frissüljön a GUI és ne fagyjon be, míg végig nem szalad az állományon?
Durva példa (nem copy, itthonról, fejből):
foreach (XmlNode node in Blabla)
{
foreach (XmlNode child in node.ChildNodes)
{
}
}Addig, míg esetleg egy 100-150 MB-os fájlon a foreach végig nem megy, addig semmi visszajelzés nincs, hogy hol tart, mit csinál éppen.
-
Keem1
veterán
válasz
Alexios #7869 üzenetére
Ettől féltem én is. Fog majd utálni az, aki utánam kapja meg ennek a továbbvitelét
Hogy lehetne ezt becsületesen, szépen áthidalni?
Csináljam meg szépen a parancssoros metódusokat, ugye?Közben úgy tűnik, a legutolsóra találtam megoldást. Amúgy is van naplózás SQLite db-be, ami
MessageBox.Show()
stílusú üzenet, azokat kiszedem, és csak a naplóba megy (eddig egymás mellett volt mindkettő), így ha jól tippelek, aFromConsole()
végén lévőClose()
már nem lehet akadály, ha a hibák jól le vannak kezelve... -
Keem1
veterán
Srácok, iránymutatást kérnék. Előrebocsátom, hogy PHP-ban jobban otthon vagyok, mint C#-ban, de ez sem teljesen idegen számomra.
Megörököltem a cégnél egy "Terike néni feladatát megkönnyítendő" windows forms alkalmazást. Csak desktop, csak Windows 7/10, eddig egyszerű. A program a cégnél más, különböző alkalmazások, ill. a webes rendszer által generált egységes XML-ből szedi ki a szükséges adatokat és teszi be az adott gépen futó adatbázisba (kvázi innen-onnan gyűjtött XML-ből helyi adatot konvertál).
A program kezelője a formon csak simán bekkattintotta a fájlokat, mehet gomb, kilép gomb. Ez már működik.
Felmerült, hogy task schedulerből kéne időzítetten is működtetni, tehát parancssorral indíthatóvá kéne tennem.Valahogy így:
programom.exe bemeneti_file.xml mit_csinaljon_veleAmi eddig megvan:
Form1_Load(object sender, EventArgs e)
{
..
string[] args = Environment.GetCommandLineArgs();
if (args.Length > 1) FromConsole(args);
...
}Az
args
tömb első (0.) eleme az exe útvonala, ezért ha a mérete nagyobb 1-nél, akkor parancssorból kaptuk az adatokat, meghívjuk aFromConsole()
metódust. A második paraméter a fájl lesz, eddig pipa, az eddigi tallózás helyett (létezési ellenőrzéssel) már meg is van a fájlunk. A második az a művelet, amit szeretnénk tenni vele. Itt kéne optimális esetben az adott gomb eseményét meghívni, ennek végén pedig egyClose()
lesz.- tudok-e úgy hívni egy gomb eseményt, hogy a nevét ismerem sztringként (parancssori paraméter)?
- tudom-e ellenőrizni, hogy a metódus létezik-e?
- mennyire jó ötlet rögtön így hívni egy eseményt? és ha nem stimmelnek a metódus paraméterei?
- ha valami beüt (nem valószínű, de esetleg hibaüzenet, felhasználói interakcióra várás), kilép-e a program simán egy Close() esetén?
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Telefon felvásárlás!! Xiaomi Redmi Note 10, Xiaomi Redmi Note 10s, Xiaomi Redmi Note 10 Pro
- Azonnali A320 B350 X370 B450 X470 A520 B550 X570 chipset alaplap felvásárlás személyes/csomagküldés
- Új Dell 13 XPS 9315 Touch 4K+ HDR DolbyVision i7-1250U 10mag 16GB 512GB Intel Iris XE Win11 Garancia
- MacBook Pro 14" M3 Pro 18GB RAM 512GB MAGYAR BILL 1 év garancia
- Bezámítás! Lenovo Thinkpad T14 Gen 5 üzleti - Ultra 7 165U 16GB DDR5 512GB SSD Intel Graphics WIN11
Állásajánlatok
Cég: FOTC
Város: Budapest