- Magga: PLEX: multimédia az egész lakásban
- ubyegon2: Airfryer XL XXL forrólevegős sütő gyakorlati tanácsok, ötletek, receptek
- Sub-ZeRo: Euro Truck Simulator 2 & American Truck Simulator 1 (esetleg 2 majd, ha lesz) :)
- sziku69: Szólánc.
- eBay-es kütyük kis pénzért
- Luck Dragon: Asszociációs játék. :)
- sziku69: Fűzzük össze a szavakat :)
- zebra_hun: Hűthető e kulturáltan a Raptor Lake léghűtővel a kánikulában?
- gban: Ingyen kellene, de tegnapra
- f(x)=exp(x): A laposföld elmebaj: Vissza a jövőbe!
Új hozzászólás Aktív témák
-
Tomi_78
aktív tag
válasz
joysefke #10150 üzenetére
Köszönöm a tanácsokat és a hivatkozásokat; meg is nézem mindjárt azokat.
Egyébként arra is gondoltam, hogy az is okozhatja a hibát, hogy a programnak nem állítok be egy fő felbontást, hanem azt szeretném érni, hogy minden képernyőfelbontáson egyformán fusson, közel azonos kinézettel, tehát legfeljebb a monitor által lekicsinyítve vagy felnagyítva a képek. Lehet, hogy tévúton vagyok ezzel az elképzeléssel is... -
Tomi_78
aktív tag
válasz
joysefke #10148 üzenetére
Köszi, tehát a Count-1. Csak azt furcsállom, hogy olyan különösen viselkedik ezzel, ha másik névtérbe viszem át egy változóban a Count-1 értéket, mint most az elhelyez alprogramba, mert minden tankot elmozdít.
A másik, hogy igen, az induló Y koordinátáit akarom meghatározni a dolgoknak, de az nem olyan egyszerű, ha eltérő a képek mérete. Úgy meg tudom oldani, hogy a pályán legyen külön olyan lehetőség, hogy platform fölött a tank (van is), de ez fölösleges szaporítása az elemeknek. Az lenne az ideális, ha mindenhol csak a tank, stb. lenne és önműködően az alatta vagy felette (ami közelebb van) levő platformhoz igazodna, amikor létrejön. -
pmonitor
aktív tag
válasz
joysefke #10129 üzenetére
Nem trollkodni akartam. Az idézet előtt ezt írta:
Ez éppen egy nagyon jó példa arra, hogy még Asp.Net-en belül is annyiféle megoldás van, annyira szerteágazó, hogy rohadtul nem az a kérdés, hogy a byte array hány byte-on tárolódik, hanem lásd a fenti kérdést.
Azért Asp.Net-ben nem nagyon van byte array. C#-ban pl. annál inkább. Meg egyébként nem olyan elhanyagolható az, hogy a byte array hány byte-on tárolódik(persze nem Asp.Netben, hanem C#-ban). Ugyanis, ha biztosan belefér vminek az értéke 1 byte-ba, akkor sokkal jobban megéri a byte array, mint az int array. Mert ugyebár nem mindegy, hogy egy tömb 400 megát foglal le, vagy pedig 1600 megát!!! Ez azért elég jó optimalizáló tényező(mármint annak, aki ismeri, hogy mi hány byte-on tárolódik). Ha nem tudja, akkor hogy optimalizál??
Ezért bátorkodtam megjegyezni. -
(ex)Cat
senior tag
válasz
joysefke #10117 üzenetére
Igen, ez a probléma valószínűleg, de nem tudok átugrani rajta vmiért. Próbáltam amit írsz, de sajnos nem működik. Bármi hasonló megoldással kísérleteztem, kb. ez lett a végeredmény:
"_-* #\ ##0\ _F_t_-;-* #\ ##0\ _F_t_-;_-* "-"??\ _F_t_-;_-@_-"
Azaz a # ## részbe az első # után is beleteszi a \ jelet és ez teljesen elcseszi a formátumot. Egészen addig jó amúgy amíg konkrétan bele nem teszem a numberfomat-ba.
Range r = excelWS.Columns["E"]; r.NumberFormat = format;
Azt hiszem, ezt kénytelen leszek elengedni.
-
martonx
veterán
válasz
joysefke #10101 üzenetére
Persze, csak a sima Auth annotációval ráraksz valamit, ami fekete doboz, és fogalmad se lesz, hogy teljesül-e vagy nem, vagy egyáltalán jó helyen keresgélsz-e. Csak azt látod, hogy 401.
Vagy ha mázlid van, akkor azt látod, hogy beenged.
Ezért gondoltam elsőre annotáció nélkül megdebuggolni a metóduson belül, hogy WTF, aztán majd persze csinálni erre egy custom Auth attribute-ot. -
martonx
veterán
válasz
joysefke #10098 üzenetére
Szerintem ezt annotációval nem fogod tudni megoldani, no persze custom auth attribute-al szépen megoldható.
Elsőre elég lehet egy if az onGetAccountban, ami jól látod megvizsgálja a Usert. Remélhetőleg valahol látszódni fog a useren, hogy min keresztül lépett be.
És majd ha ez már szépen működik, majd ki lehet emelni egy custum Authentication attribute-ba. -
pmonitor
aktív tag
válasz
joysefke #10092 üzenetére
Azért ezzel vigyázni kell, mert igaz, hogy 1 byte-ak 1 int-et foglal le, viszont több byte-nak(pl. tömbnél 16 byte-nak nem 16 int-et foglal le, hanem csak 4-int-et). Persze azt azért hozzá kell tennem, hogy az én kijelentéseim MS VS C#-ra vonatkozik(általában x86-os platformon). Ez a C# kód:
byte[] bytes = new byte[] { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10 };
Erre fordul:64 19 df 08 10 00 00 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10
Itt az első 4 byte az object(mivel referencia típus), a következő 4 byte az int tömb hossza. Utána következnek az értékek(16 darab byte 4 intet foglal le. -
Tomi_78
aktív tag
válasz
joysefke #10090 üzenetére
S valóban. Hát, erre bizony nem gondoltam volna sosem, hogy egy konkrét szám maga is lehet valamilyen típusú. De köszönöm szépen a segítséget; az int típusra állítás tényleg megoldotta.
Amúgy csupán memóriatakarékossági okból lett volna szükségem a byte típusra, mert az id és idk nem lett volna több a programban, mint 255. -
pmonitor
aktív tag
válasz
joysefke #10079 üzenetére
a var kulcsszóval deklarált változód a stacken van (a futó metódus scopeján belül) ez a változó egy referencia ami a heapen lévő objektumra mutat.
Kösz, hogy leírtad azt, amit már ~12 éve írogatok: hogy az int-nek nem őse az object. Object NEM lehet a veremben(ott csak a referenciája lehet(a stack meg csak az érték típusok memóriája.
Legalább van 1 valaki, aki ezt írja. Jól esik!
Egyébként tudod, hogy melyik alapozó könyvben vannak leírva így részletezve ezek a dolgok? Mert én ilyent sajnos nem tudok. Mert én a legjobb ms vs c# könyvnek ezt tartom.. De még abban sincsenek ezek ilyen részletességgel leírva. Ezért is zártak ki 3 topikból is, mert én le mertem írni az igazat... Ők meg könyvben nem olvasták. -
Tomi_78
aktív tag
válasz
joysefke #10069 üzenetére
Sajnos nem, mert azt írja ki, hogy:
Inicializálatlan „palya” lokális változó használata (CS0165)Pedig egyszer már deklarálva van, csak éppen a switch() névtéren kívül, az előtt.
De nekem az kéne, hogy deklarálom egyszer a MainFormLoad() elején, és azon belül felhasználható legyen akármilyen belső szerkezetben. -
CPT.Pirk
Jómunkásember
válasz
joysefke #9920 üzenetére
Nincs és igazából soha nem is volt főállású .NET fejlesztőnk.
Mi hw fejlesztők vagyunk akik programoznak is, ebben a vonatkozásban meg jellemzően ha van is OS, akkor az nem Windows.
Mondjuk ezek a .NET-es progik belsős progik, saját használatra. Szóval belefér, hogy nem tökéletes, csak működjön.
-
CPT.Pirk
Jómunkásember
válasz
joysefke #9914 üzenetére
Jah, marad a 4.8 elsőre, mert az van alapból W10-en.
Unit teszt... hmm jah. Az a baj, hogy egyébként nem vagyok programozó, és melóban meg annyi az egyév projekt, hogy csak ritkán tudok ezzel foglalkozni, de közben meg kéne használni...
A programozás az nálam hardveresként csak jött a meló mellé, de akkor meg jellemzően beágyazott C, némi C++/QT, de leginkább Lazarus alatt freepascalban.
-
CPT.Pirk
Jómunkásember
válasz
joysefke #9908 üzenetére
Jaa, még ha tudnám minek kell ebből kijönnie. Sajnos nem készült dokumentáció a kódról pár soros szösszeneteken túl, így a "mire gondolt a költő" helyzet van mikor nézem mi lehet a gond.
Amúgy nálam nincs semmilyen Try-os lehetőség, se TryPop, se TryPeek. Ilyenkor mi van? Netes példákban én is láttam ezeket, de nem írták, hogy valamit kellene hozzájuk bekapcsolni.
-
CPT.Pirk
Jómunkásember
válasz
joysefke #9900 üzenetére
Egy CAD program projektjéhez tartozó kiexportált szabályrendszert tartalmazó szövegfájlt dolgoz fel és jeleníti meg grafikusan. Ez az ága a programnak nem volt korábban használva, mert egy bizonyos szabály típusnál fut csak ide, ami tartalmazza a % jelet és ilyen nem volt korábban.
A 43-as sorban lévő Pop() okozza az exceptiont. [link]
Amikor odaér a kód a 42-es sorhoz a while-al miután betöltöttem a fájlt, akkor a Count() értéke 2 és benne is van két szöveg részlet a fájl első sorából a debugger szerint.
A while egyszeri lefutásával elsőre lemegy a Pop(), a Count módosul 1-re de a következő körben mégis exception jön. Akkor is, ha ott a Pop() helyett Clear() van, arra is elszáll.Azt hiszem nincs több szálasítva a program, de bővebben egyenlőre nem ismerem a működését.
Hogy ez a Stack dolog miért jó azt nem tudom, én stringlist dolgokkal szoktam szövegeket kezelni de C# alatt még nem programoztam. -
Alcsi69
senior tag
válasz
joysefke #9867 üzenetére
Igazabol nekem sincsenek annyira nagy frontendes ambicioim, valahogy az ehhez a temahoz tartozo problemak nem tunnek szamomra annyira erdekesnek (pl. egy embedded rendszer problemaihoz kepest).
Viszont eleg sok allashirdetest lattam mar, ahol vagy elvaras, vagy elony volt a valamilyen szintu frontend tudas, annak ellenere hogy kifejezetten a NEM frontendes pozikat neztem.
Nem igazan tervezek sokaig maradni Magyarorszagon az egyetem utan, ezert a legtobbszor kulfoldi allashirdeteseket neztem linkedin-en, rengeteg C#-os van.
Felfedeztem a 'C# Yellow Book'-ot, ez mennyire szamit jonak a C# sajatossagainak az elsajatitasahoz?
-
-
ReSeTer
senior tag
válasz
joysefke #9828 üzenetére
1.
Igen, azt akarom, hogy egy másik classban lévő method változtassa meg a már megnyílt UI-ban lévő label-t. Ennyi. Nem tudom, hogyan férjek hozzá.
2. Na most ez már nekem magas, ilyen szinten még nem tartok, de szerintem egy kicsit túlbonyolítottad, vagy félreérthetően írtam le.
A logika ez:
Elindul a program, feljön egy főképernyő rajta 1 db. felirattal ("számolás még nem indult el") meg egy gombbal.
Megnyomja az user a gombot, elindul a "szamolas" method egy másik classbanpublic static void szamolas()
{
int a = 1;
int b = 8;
int valasz = a+b;
Főképernyő.felirat.text="számolás befejeződött"; // ez nem működik.
}Ez most csak egy gyors példa. Teljesen mindegy mi a method, az a lényeg, hogy nem UI-n belül lévő method-on belül akarom megváltoztatni az UI-n lévő feliratot.
Nem baj ha nem a háttérben csinálja, nem akarom én ezt túlbonyolítani, hogy több szálon fusson meg stb. Egyelőre. -
kingabo
őstag
válasz
joysefke #9791 üzenetére
Én régebben olvastam 7"-os ebook olvasón, megnövelt betűmérettel még bkv-n is jól olvasható volt. Ha pdf-et olvasol akkor olyan progit keress ami újra tudja tördelni a szöveget, ha megnöveled a betűméretet (vagy sokat kell scrollozni), de inkább vmi ebook formátummal jársz a legjobban
PS: egy 2012-es nexus 7-en tudtam kipróbálni, szerintem kevés hozzá méretben -
Keem1
veterán
válasz
joysefke #9780 üzenetére
Jó irányban gondolkodsz
Én is már túl egy sörön, szóval.."anélkül, hogy tudnám, hogy milyen frameworkben"
.NET 5.0Találtam a neten egy ötletadó samplet:
public void ChangeTheme(ColorScheme scheme, Control.ControlCollection container)
{
foreach (Control component in container)
{
if (component is Panel)
{
ChangeTheme(scheme, component.Controls);
component.BackColor = scheme.PanelBG;
component.ForeColor = scheme.PanelFG;
}
else if (component is Button)
{
component.BackColor = scheme.ButtonBG;
component.ForeColor = scheme.ButtonFG;
}
else if (component is TextBox)
{
component.BackColor = scheme.TextBoxBG;
component.ForeColor = scheme.TextBoxFG;
}
...
}
}
Ami pont jól jönne ahhoz, amit csinálok: a Windows 10 light/dark módjának implementálására.
Ahogy ezt a kódot néztem, igazából elég lenne egyszer a light színeket felvinni, aztán abból örököltetni a darkot (hisz a light a default), és nem hasalna el a motyó akkor se, ha közben bekerülne a light-ba egy új szín, de még a darkba nem (hisz akkor csak az eredeti maradna).De ott agyalok, hogy a ColorScheme osztályt egyelőre nem tudom implementálni, mert nem tudom neki megmondani hogy az light és dark is lehet igazából.
Aztán arra gondoltam, hogy legyen egy static class, de az meg azért nem jó, mert az nem lehet metódus paramétere.
Ez a ColorScheme egy olyan osztály lehet, amiben benne van a dark és a light is, és ezeknek csak propertyjei vannak.Lehet innom kéne még egy sört és ezen csak holnap agyalni.
-
martonx
veterán
válasz
joysefke #9774 üzenetére
"Kérdése alapján már a táblákban kódolva van a struktúra (ki-kinek gyermeke) ezt kéne dekódolni és meghatározni, hogy a gráf csúcsai hogyan nézzenek ki kódba öntve, illetve hogyan tárolják a köztük lévő relációkat."
Igen, ez elég egyértelmű volt
És erre küldtem a minimalista példa kódot, mert szemlátomást emberünk csak és kizárólag fix dimenziós tömbökben tud gondolkozni, ti meg rögtön gráf-os legbonylultabb esetek lekezeléséhez alkalmas módszerekkel kezdtétek bombázni, miközben jó eséllyel olyan bonyolultságú a gráfja, mint egy meghajtón lévő mappákban lévő file-ok szerkezete. Aminek leképezéséhez semmi spéci nem kell, csak az én példa classom.
Persze ez is csak feltételezés, mivel nem sok konkrétumot tudtunk meg. -
ReSeTer
senior tag
válasz
joysefke #9760 üzenetére
Azt az excel-t nem én irányítom, de ha változik is valami, általában csak annyi, hogy arrébb megy néhány oszlop, mert beszúrnak egyet, vagy törölnek egyet. Ez van.
Többiek:
Aki szerkesztené, az semmiféle programozási kódot nem tud olvasni, csak ha tényleg egyértelmű mint pl:példaoszlop = A
példaoszlop2 = BEzt könnyen lehetne szerkeszteni is. Ezért is jutott eszembe az ini, mert anno a játékokban is lehetett változtatni dolgokat rajtuk keresztül, és semmi programozási tudásom nem volt.
De ha az egy rémálom programozási oldalról, akkor hagyjuk.
Valami hasonló? Nem akarom én túlbonyolítani, egyszerű olvasásról van szó.A program amiről szó van, egy egyszerű exe, egyszerű userform-mal. Nincs semmiféle config fájlja, amit én beírtam neki eredetileg, azokat az értékeket használja.
Ha én csinálok neki egy userform-t ahol belehet írni, hogy éppen melyik oszlop melyik, akkor azt minden egyes indításnál be kellene írni tudtommal. Amint bezárod, következő indításnál megint az eredeti értékek lesznek.
Kezdő vagyok, javítsatok ki nyugodtan, ha hülyeséget írok. -
dqdb
nagyúr
válasz
joysefke #9730 üzenetére
Az "Add-Type" valami régi fordítót használ, régi C# verió támogatással és a hibaüzenetei borzalmasak.
A Roslyn előtt azt lehetett kihasználni, hogy a .NET Framework része a csc.exe. A futtatni kívánt snippetből generáltál egy teljes .cs fájlt, ahol a generált kódban #pragma line használatával el tudtad érni, hogy az eredeti fájl nevével és a megfelelő sorszámmal dobja a hibát a fordító, futtattad és parse-oltad az eredményt. Működött ugyan, de eléggé meh, a Roslyn ilyen téren megváltás volt a rugalmasságával. -
dqdb
nagyúr
válasz
joysefke #9726 üzenetére
Ha C# scriptelést szeretnél, akkor arra ott van a Roslyn, a .NET C#-ban írt C# fordítója, amelyet megfelelő objektummodellel ellátva be tudsz ágyazni saját projektekbe is.
Ez itt egy gyors bevezetés, ez pedig egy minimálisan mélyebb példa annak átlátására, hogy mit is lehet elérni Roslyn segítségével elérni.
Aztán hajrá a C# szintaktikájú saját DSL létrehozásához. Ha nem magadnak írod a cuccot, akkor szerintem érdemes a DSL-nek fluent felületet definiálni, az talán közelebb áll az átlagemberekhez.
-
leslie23
tag
válasz
joysefke #9711 üzenetére
Többször is átolvastam, emésztem az infókat, de érteni vélem az érveidet és logikusan is hangzik az általad felvázolt koncepció, szóval nagyon köszönöm az idődet és a segítséget!
GitHubon és demo tutorialokban főleg egyszerű, néhány oldalas CRUD appokat látok mindig, szóval nehéz olyan realworld cuccost találni, ami komplex, mégis jól átgondolt, és követ valamiféle helyes gyakorlatot. Lassan, de kezd tisztulni a kép, köszi még egyszer! -
joysefke
veterán
válasz
joysefke #9711 üzenetére
lemaradt:
Mivel DI-t és teszteket szeretnél használni (hogy az egész 1b arch egyáltalán értelmet nyerjen) ezért valahol össze kell állítanod a DI konténert (ez a composition root, a te esetedben a ConfigureServices metódus az ASP templétben).Magának az ASP projektnek értelemszerűen nem kéne sőtt nem szabadna dependenciája legyen mondjuk az Ef projekthez, de a composition rootnak (ConfigureServices metódusnak) szüksége van rá, mivel ez alapvetően a solutionben lévő összes függőséget referálja. Ez ezen az egy ponton rendben van. Ha zavar, akkor a DI-konténer összerakását kiszervezheted egy másik csproj-ba.
-
leslie23
tag
válasz
joysefke #9708 üzenetére
Igen, az mindenképpen cél, hogy a presentation layernek ne legyen EF Core dependenciája és ahogy Alexios is írta, ha éppen arra van szükség, gond nélkül cserélhető legyen a DataAccess layer akár Dapperre, sima ADO.NET-re, bármire.
Mivel saját hobbiprojektről van szó, így erre soha nem fog sor kerülni, de most valahol pont az elmélet érdekelne, hogy hogyan lehet és kell ezt jól megcsinálni. Olvastam a hivatkozott MS-os leírást is egyébként.„Ami nekem sokkal szimpatikusabb...”
Huhh, lehet, hogy valami nagyon hasonlóról beszélünk egyébként, próbálom értelmezni. Neten található projektek alapján most úgy legoztam össze, hogy a presentation layer egyIUnitOfWork
interfészt lát a DataAccessből, és aProgram.cs
-ben bele van rakva egy példánya aUnitOfWork
-nek DI konténerbe.IUnitOfWork
szintén interfészeket tartalmaz mint property-k (IPersonRepository
,IProductRepository
, stb.).
A generikus Repo-nak is van egy generikus interfésze (IRepository<T>
), ebben nincs pl. Update metódus, csak Add, Remove, GetAll, GetFirst.IProductRepository
örökölIRepository<Product>
interfésztől, illetve tartalmazhat specifikus metódusokat, mondjuk épp egy ilyet hogy:void Update(Product product)
.
A konkrét implementációk pedig pl.:ProductRepository : Repository<Product>, IProductRepository
,
vagyis öröklik a generikus repo metódusait, és implementálják az entitás-specifikus metódusokat, annak számít most mondjuk egy Update is.Ha jól értelmezem az általad írottakat, valami hasonlóra gondolsz, csak az interfészeket szerencsésebb lenne kiszervezni egy külön assembly-be, ami amúgy logikusan is hangzik.
Mondjuk ha jó a sejtésem, az EF Core-t teljesen nem lehet „száműzni” a presentation layerből, mert a DI miatt a kell a builder.Services.AddDbContext...Automapper témában sajnos csak másra tudok mutogatni, jómagam még nem kísérleteztem vele, így nem tudom mennyire validak az itt leírt ellenérvek...
-
Alexios
veterán
válasz
joysefke #9706 üzenetére
2,
Ha azért csomagolnád be a DbContext-et egy abszrakt, generikus UoW / Repository petternbe, hogy az EFCore egy absztrakció mögé kerüljön, és a felsőbb réteg ne dependáljon közvetlenül az EF felé, akkor ez nemes és jó indok, de saját tapasztalatom alapján nem működik jól.
Én ezzel szintén saját tapasztalat alapján nem értek egyet, nálunk pl. nagyon jól működött mikor legacy appot migráltunk ef6-ról ef core-ra, majd szintén mikor bizonyos részeket dapperre. A kliens kód oldaláról lényegében semmi változás nem történt csak az interfészek mögötti implementációk -
-
ReSeTer
senior tag
válasz
joysefke #9685 üzenetére
Köszönöm a próbálkozást, de én ezt az egészet nem tudom valós példához kötni. Ha én írok egy programot, nem tök mindegy, hogy a saját programom egy része hozzáfér-e a másik részéhez? Úgyis én írom az egészet, akkor olyanra írom, hogy csak azt módosítsa amit kell. A végfelhasználó meg nem kap felületet hozzá.
Értem, hogy forráskódon belül nem lehet hozzáférni meg minden, csak semmi értelmét nem látom. Mért ne lehetne public minden? Forráskódhoz én férek hozzá.
Valami itt elkerülte a figyelmem.
-
Keem1
veterán
válasz
joysefke #9619 üzenetére
Atyaég... Nem csak hogy a kérdés maga, de még annál is van lejjebb.. Ír egy Logout bejegyzést egy kérdésnek, ahelyett, hogy a topikjában kérdezne (oké, értem, ide ne jöjjön floodolni, de általánosságban). Vajon csak tényleg a topiknyitásra vonatkozik, hogy egyedi problémával ne nyisson újat, a Logoutra nem?
Én azért egy Logoutos moderátorral szívesen megnézetném, hogy ennek tényleg a Logouton van-e a helye
-
Keem1
veterán
válasz
joysefke #9547 üzenetére
Na, végre valami kezdeményezés
Egyébként ahogy most így utánaolvastam, van valami MS-féle kezdeményezés is (winget), de félek hogy ez is hamvába fog hullni. Kb. 900 package-et látok benne (ha jól látom), ami egy Windows, mint target esetén még naponta is kevés, nem hogy összesen...
Pedig ez első olvasatra olyan, amilyennek én szeretném hogy legyen. Azt írják, lesz külső repo is (vagy már van is, legalábbis github skeletont már találtam hozzá).
-
Keem1
veterán
válasz
joysefke #9517 üzenetére
Röviden? Megszüntették az API-t
Egyébként:dynamic responsejson = JsonConvert.DeserializeObject(Response);
if (responsejson != null && responsejson.Count != null && responsejson.Count > 0)
{
foreach (var item in responsejson)
{
returndata.Add(item.Name, item.Value);
}
}A lényegi része ez.
Kicsit hosszabban:
De időközben a remek Xiaomi-Yeelight páros szó nélkül kivette a 3rd party API-t a lámpáikból. Egyik este vettem észre, hogy a scheduled task szerint már kapcsolnia kéne, mégse teszi. Aztán miután rátaláltam rengeteg elégedetlen vásárlóra a szó nélkül, lapítva kivett funkció miatt, próbáltam szabadságharcosként én is részt venni benne. Miután a Pi-n deaktiváltam a lámpákat, hogy ne legyen tele a log a hibaüzenetekkel.
Még megy a szájkarate a gyártó fórumain, mert semmilyen 3rd party eszközzel nem mennek most a Xiaomi lámpák. Domoticz, Home Assistant, stb. kuka -
pmonitor
aktív tag
válasz
joysefke #9471 üzenetére
Készítettem az eredeti OOP kódodra egy kis módosítást. Meg Készítettem 2 nem OOP metódust(az egyik static, a másikhoz példányosítani kell). A nem OOP metódusokban Array.Sort()-ok helyett quicksort-ot használtam. Ezek a kódok hasítanak! A kódokban a kiíratásokat kommenteztem ki(na meg az Array.Sort-ok helyét):
using System;
using System.Diagnostics;
namespace TesztConsole
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(DateTime.Now);
//int i = 0;
int jmax = 25000;
Stopwatch sw = new Stopwatch();
long t_1 = 0, t_2 = 0, t_3 = 0, t_4 = 0, t_5 = 0, t_6 = 0, t_7 = 0;
sw.Start();
for (int j = 0; j < jmax; ++j)
{
var p = new Permutator("abcdananana".ToCharArray());
do
{
/*i++;
Console.WriteLine(new string(p.State));*/
}
while (p.Next());
//Console.WriteLine($"Nr of results: {i}");
}
t_1 = sw.ElapsedMilliseconds;
GC.Collect();
t_2 = sw.ElapsedMilliseconds;
for (int j = 0; j < jmax; ++j) new Program().Teszt_qsort("abcdananana".ToCharArray());
t_3 = sw.ElapsedMilliseconds;
GC.Collect();
t_4 = sw.ElapsedMilliseconds;
for (int j = 0; j < jmax; ++j)
{
var p = new Permutator_modositott("abcdananana".ToCharArray());
do
{
/*i++;
Console.WriteLine(new string(p.State));*/
}
while (p.Next());
//Console.WriteLine($"Nr of results: {i}");
}
t_5 = sw.ElapsedMilliseconds;
GC.Collect();
t_6 = sw.ElapsedMilliseconds;
for (int j = 0; j < jmax; ++j) stTeszt_qsort("abcdananana".ToCharArray());
t_7 = sw.ElapsedMilliseconds;
Console.WriteLine("Eredeti: {0}", t_1);
Console.WriteLine("Módosított: {0}", t_5 - t_4);
Console.WriteLine("Nem OOP: {0}", t_3 - t_2);
Console.WriteLine("Nem OOP static: {0}", t_7 - t_6);
}
static void QuickSort(char[] arr2, int p, int r)
{//quicksort
int Low, High;
char MidValue;
Low = p;
High = r;
MidValue = arr2[(p + r) / 2];
do
{
while (arr2[Low] < MidValue) ++Low;
while (arr2[High] > MidValue) --High;
if (Low <= High)
{
char T = arr2[Low];
arr2[Low] = arr2[High];
arr2[High] = T;
++Low;
--High;
}
} while (Low <= High);
if (p < High) QuickSort(arr2, p, High);
if (Low < r) QuickSort(arr2, Low, r);
}
int findCeilInt(char[] str, char first, int l, int h)
{
int ceilIndex = l;
for (int i = l + 1; i <= h; i++)
if (str[i] > first && str[i] < str[ceilIndex])
ceilIndex = i;
return ceilIndex;
}
void Teszt_qsort(char[] arr)
{
char[] tomb = (char[])arr.Clone();
int size = tomb.Length;
QuickSort(tomb, 0, size - 1);
//Array.Sort(tomb);
bool isFinished = false;
while (!isFinished)
{
int i;
/*for (int k = 0; k < size; ++k) Console.Write("{0} ", tomb[k]);
Console.WriteLine("");*/
for (i = size - 2; i >= 0; --i) if (tomb[i] < tomb[i + 1]) break;
if (i == -1) isFinished = true;
else
{
int ceilIndex = findCeilInt(tomb, tomb[i], i + 1, size - 1);
char temp = tomb[i];
tomb[i] = tomb[ceilIndex];
tomb[ceilIndex] = temp;
QuickSort(tomb, i + 1, size - 1);
//Array.Sort(tomb, i + 1, size - i - 1);
}
}
}
static int stfindCeilInt(char[] str, char first, int l, int h)
{
int ceilIndex = l;
for (int i = l + 1; i <= h; i++)
if (str[i] > first && str[i] < str[ceilIndex])
ceilIndex = i;
return ceilIndex;
}
static void stTeszt_qsort(char[] arr)
{
char[] tomb = (char[])arr.Clone();
int size = tomb.Length;
QuickSort(tomb, 0, size - 1);
//Array.Sort(tomb);
bool isFinished = false;
while (!isFinished)
{
int i;
//for (int m = 0; m < size; ++m) Console.Write("{0} ", tomb[m]);
//Console.WriteLine("");
for (i = size - 2; i >= 0; --i) if (tomb[i] < tomb[i + 1]) break;
if (i == -1) isFinished = true;
else
{
int ceilIndex = stfindCeilInt(tomb, tomb[i], i + 1, size - 1);
char temp = tomb[i];
tomb[i] = tomb[ceilIndex];
tomb[ceilIndex] = temp;
QuickSort(tomb, i + 1, size - 1);
//Array.Sort(tomb, i + 1, size - i - 1);
}
}
}
}
public class Permutator_modositott
{
public char[] State { get; }
int _size;
bool isFinished = false;
public Permutator_modositott(char[] symbols)
{
if (symbols?.Length > 0)
{
_size = symbols.Length;
State = (char[])symbols.Clone();
Array.Sort(State);
}
else
throw new ArgumentException("input must be non-empty");
}
public bool Next()
{
if (isFinished)
return false;
isFinished = !AdvanceState();
return !isFinished;
}
bool AdvanceState()
{
int i, j;
for (i = _size - 2, j = _size - 1; i >= 0; --i, --j)
if (State[i] < State[j])
break;
if (i == -1)
return false;
int ceilIndex = findCeil(State, State[i], i + 1, _size - 1);
char tmp = State[i];
State[i] = State[ceilIndex];
State[ceilIndex] = tmp;
Array.Sort(State, i + 1, _size - i - 1);
return true;
}
int findCeil(char[] str, char first, int l, int h)
{
int ceilIndex = l;
for (int i = l + 1; i <= h; ++i)
if (str[i] > first && str[i] < str[ceilIndex])
ceilIndex = i;
return ceilIndex;
}
}
public class Permutator
{
public char[] State { get; }
int _size;
bool isFinished = false;
public Permutator(char[] symbols)
{
if (symbols?.Length > 0)
{
_size = symbols.Length;
State = (char[])symbols.Clone();
Array.Sort(State);
}
else
throw new ArgumentException("input must be non-empty");
}
public bool Next()
{
if (isFinished)
return false;
isFinished = !AdvanceState();
return !isFinished;
}
bool AdvanceState()
{
int i;
for (i = _size - 2; i >= 0; --i)
if (State[i] < State[i + 1])
break;
if (i == -1)
return false;
int ceilIndex = findCeil(State, State[i], i + 1, _size - 1);
char tmp = State[i];
State[i] = State[ceilIndex];
State[ceilIndex] = tmp;
Array.Sort(State, i + 1, _size - i - 1);
return true;
}
int findCeil(char[] str, char first, int l, int h)
{
int ceilIndex = l;
for (int i = l + 1; i <= h; i++)
if (str[i] > first && str[i] < str[ceilIndex])
ceilIndex = i;
return ceilIndex;
}
}
}Az eredmény:
Eredeti: 46213
Módosított: 45772
Nem OOP: 14693
Nem OOP static: 14295Látszik, hogy a qsort alkalmazásával kb. harmada idő alatt lefutnak.
Érdemes lenne a rendezésre is csinálni teszteket.
De most nincs időm. -
pmonitor
aktív tag
válasz
joysefke #9468 üzenetére
Én így fordítottam át:
using System;
namespace IsmPerm
{
class Program
{
static int findCeilInt(int[] str, int first, int l, int h)
{
int ceilIndex = l;
for (int i = l + 1; i <= h; i++)
if (str[i] > first && str[i] < str[ceilIndex])
ceilIndex = i;
return ceilIndex;
}
static void Teszt_1(int[] tomb)
{ //https://www.geeksforgeeks.org/print-all-permutations-of-a-string-with-duplicates-allowed-in-input-string/
int size = tomb.Length;
Array.Sort(tomb);
bool isFinished = false;
while (!isFinished)
{
int x = 1, i;
for (int k = 0; k < size; ++k) Console.Write("{0} ", tomb[k]);
Console.WriteLine("");
for (i = size - 2; i >= 0; --i) if (tomb[i] < tomb[i + 1]) break;
if (i == -1) isFinished = true;
else
{
int ceilIndex = findCeilInt(tomb, tomb[i], i + 1, size - 1);
int temp = tomb[i];
tomb[i] = tomb[ceilIndex];
tomb[ceilIndex] = temp;
Array.Sort(tomb, i + 1, size - i - 1);
}
}
}
static void Main(string[] args)
{
int[] tomb = new int[] { 500, 500, 600, 600, 700};
Teszt_1(tomb);
Console.ReadKey();
}
}
} -
pmonitor
aktív tag
válasz
joysefke #9464 üzenetére
Átírtam C#-ba, meg összehasonlítottam az én kódommal. 5-ször gyorsabb amit Te linkeltél. Jól tudsz guglizni. Köszönöm!
De egyébként ezt is ugyanazzal a módszerrel teszteltem, mint a tömbök másolását. És itt is ugyanolyan konzekvensen mutatta az eredményt, mint ott. Úgyhogy a tesztelés sémájával nincs semmi gond. Azt teszteli, amit tesztelni szeretnék. Ezzel teszteltem:
static void Main(string[] args)
{
tomb = new int[] { 500, 500, 600, 600, 700 };
int max = 5000000;
Stopwatch sw = new Stopwatch();
long t_1 = 0, t_2 = 0, t_3 = 0;
sw.Start();
for (int i = 0; i < max; ++i) Teszt_1(tomb);
t_1 = sw.ElapsedMilliseconds;
GC.Collect();
t_2 = sw.ElapsedMilliseconds;
for (int i = 0; i < max; ++i) Teszt_2(tomb);
t_3 = sw.ElapsedMilliseconds;
Console.WriteLine("{0} {1}", t_1, t_3 - t_2);
Console.ReadKey();
} -
pmonitor
aktív tag
válasz
joysefke #9462 üzenetére
A teszt mér valamit, de nem azt amire te kiváncsi vagy.
Amíg konzekvensen ugyanazt az eredményt írja ki, addig nekem tökéletes. Ráadásul kipróbáltam. A Cutter programomban az Array.Copy()-t lecseréltem a CopyMemory()-ra, és ugyanazt a tendenciát mutatta, mint a teszt programom. Gyorsabb lett. Tehát sztem azt méri, amit szeretnék mérni. A Cutter program futásakor is "lutri", hogy mikor indul be a GC, tehát még ez is élethűen van a tesztben.
Csak az a baj, hogy(mint ahogy először jól mondtad), a stackalloc a stack-en allokál. Ezt pedig sajnos nem engedhetem meg magamnak(a stack is véges, és mivel nem tudom, hogy egyszerre mennyire van szükségem, ezért ez nem megoldás.), mindenképp a heap-ben kell allokálnom.
-
pmonitor
aktív tag
válasz
joysefke #9462 üzenetére
Ha nem kell a mélységi bejárás során keletkező összes tömböt megtartani, csak mindig 1-1 újabbra van szükséged és tudod hogy egy tömbre mikor nem lesz már szükség
Rekurzív hívásokról van szó. Tehát nem mindig csak egyet kell megtartani. Viszont még azt sem lehet előre tudni, hogy egyidőben mennyire van szükség.
-
pmonitor
aktív tag
válasz
joysefke #9460 üzenetére
Ha nagyot foglalsz a heapen akkor az triggerelhet egy GC futást is.
De ez az összes többi esetre is vonatkozik(teszt_1-teszt_5-ig). Nem állítom, hogy a teszt atompontos. De többször lefuttattam, és mindig hasonló eredményt adott az egymáshoz viszonyított idők tekintetében.
Csak másolni kell a tartalmat egyik helyről a másikra vagy allokálni kell és feltölteni? Elég jelentős a különbség.
Az optimalizálás 5letét az ismétléses permutáció algoritmusa adta. Ott nagyon sokat kell allokálni és feltölteni(bár a legjobb az lenne, ha csak feltölteni --tehát simán másolni-- kellene).
(nem ismerem a feladatot)
A webhelyemen lévő tesztben allokálok és feltöltöm. A konkrét feladat pedig az ismétléses permutáció algoritmusa(ami a teszthez az 5tletet adta).
-
pmonitor
aktív tag
válasz
joysefke #9455 üzenetére
Igaz. Közben rájöttem.
Ez lenne talán a reális:
static unsafe void teszt_6(int[] source, int n)
{
int[] dest = new int[n];
fixed (int* pSource = source, pdest = dest)
{
int* pSource_0 = pSource;
int* pdest0 = pdest;
int* pmax = pSource_0 + n;
for (; pSource_0 < pmax; ++pSource_0, ++pdest0)
{
*pdest0 = *pSource_0;
}
}
}Szerk.: És ez már megint csak akkor végez, mint az első esetben(tehát mégsem a leggyorsabb). Azért érdekes, hogy attól, hogy unsafe, még nem optimális kódot lehet vele írni.
-
-
martonx
veterán
válasz
joysefke #9435 üzenetére
Jaj, ne is mondd, most tárgyalok épp egy céggel, akikhez lehet átmennék, és mindenképpen laptopot akarnak adni, én pedig mindenképpen asztali gépet szeretnék (az nekem nem baj, ha adnak laptopot IS).
Itthonról Ryzen 5 3600-on dolgozok PCIe4-es SSD-vel, tuning ramokkal. Ezt a gépet összevetni a régi céges i7-6700, SATA SSD-vel, háááát ég és föld.
Nem értem miért kell a cégeknek úgy tenniük, mintha csak laptopról lehetne rugalmas (home office és irodai, mikor hogy) munkát végezni. -
Keem1
veterán
válasz
joysefke #9440 üzenetére
Mondjuk persze így más a leányzó fekvése, ha maga a gép szar.
A Lenovo-k minden téren jók, én amúgy meg vagyok velük elégedve, ha a civil életben is szükségem lenne laptopra, biztos hogy Lenovo lenne, hiába k*va drága.A vállalati Windows alatt azt értem, hogy nálunk egy külön enrollment image van, amit fel kell dobni a gépre. Ez gyalulja az SSD-t, titkosítja azt, beloggol a céges rendszerbe, ellenőrzi, hogy mid van (szoftver, windows, office), aztán felpakolja azokat, meg az alap céges dolgokat is, beállítja a vpn-t, proxy-t, és még sorolhatnám a listát sokáig.
Na, az enroll szoftverekben van ami rendkívül procizabáló, beleértve a nagyvállalati McAfee-t is. Nyilván az utolsó billentyűleütést is monitorozza, de azért mégis érdekes az, hogy egy sima konzumer windows-zal minden probléma eltűnik.
-
Keem1
veterán
válasz
joysefke #9435 üzenetére
Szerintem ez leginkább a vállalati Windowsok átka lesz.
Az én céges Lenovomban egy i7 8665U van, ami a cégesszemétfeature-ök miatt eléggé ki van hajtva. A régi gép, amit erre cseréltem, az i5 procival, mezei konzumer Windows-zal sokkal gyorsabb, mint az új a vállalatival. -
Keem1
veterán
válasz
joysefke #9404 üzenetére
Ez így jól hangzik, de a "gond" az, hogy az SSO már készen van
A beléptetés egy adott oldalon megvan, nekem az ott utazó access tokenre van/volt szükségem. A toolom alapvetően konzol app lett volna, de mivel kell az access már egy belső sitehoz, muszáj volt átírnom, hisz konzolon nem tudnám magam beléptetni.Unalmas háttérsztori:
Egy k*va nagy amerikai cégnél dolgozom, és a sokszázezer munkavállalóból mi, az a csapat, ahol dolgozom, csak kis hal. Csak miattunk a developer csapat nem fog olyan toolokat fejleszteni, ami a munkánkat könnyebbé tenné, vagy legalábbis már rég nyugdíjas leszek, mire elkészülne. API nincs. Marad az, hogy megcsináljuk mi, akik ugyan nem programozók vagyunk, de azért konyítunk hozzá kicsit. Az SSO-nk, amivel a céges dolgokat elérjük, már adott. Többek között a cookieban van egy kb. 10 km hosszú access token, erre van szükségem, hogy a megfelelő oldalon a webclientet beléptessem, ami aztán eléri a szükséges adatokat a fél internetnyi méretű intraneten.Szóval nem azért adom itt a hülyét és jobbnál jobb feladatokban kérem a segítségeteket, hogy fárasszalak benneteket, hanem mert a munkám megkönnyítése érdekében jobban járok, ha megcsinálok bizonyos programokat, így bár idő és fáradság mire megszülöm (a ti segítségetekkel), de utána ismétlődő feladatok válnak könnyebbé. Pl. egy rohadt nagy, több 10 ezres adathalmazt egy weboldalról lementeni és valahogy excelbe varázsolni kézzel is lehetséges, de már kész a tool hozzá, ami végigparsolja az összes oldalt, és dob belőle egy excel táblát.
Unalmas sztori vége
-
Raftsman
csendes tag
-
Keem1
veterán
-
vlevi
nagyúr
válasz
joysefke #9369 üzenetére
Háát, pl., ha MSSQL, és LINQ, akkor az pont meg tudja oldani, hogy beleszövi a where feltételbe. Persze, ha úgy kezdesz hozzá az egészhez.
Meg még inkább, de ebbe már ne menjünk bele, egy valódi rendszerben nem így van megoldva a bejelentkezés, de egy beadandó feladatnál ez még elmegy. Ha ez volt a feladat, akkor ez volt.
Persze, ha egy kicsit is komolyabb lenne a dolog, akkor az egyik rest requestnek annak kellene lennie, hogy jó-e a felhasználónév/jelszó. Ezt nem a kliens oldalon kell eldönteni.Jelen esetben is csak annyi a lényeges, hogy a response data-ban benne van-e a felhasználónév, jelszó.
Csak így nagyon csúnyán (bocsi, telefonon nincs VS telepítve
)
valami ilyesmit akartam mondani.if (response.Data.where(x => x.username.equals(edituser.text) && x.pass.equals(editpw.text)).firstordefault != null)
{
ShowMessage("Helyes válasz, nyalhat :)");
}
-
-
-
-
joysefke
veterán
válasz
joysefke #9332 üzenetére
Uhh az utolsó pontot visszavonom, látom, hogy a belső ciklus 4esével változik növeli a törzsön belül a ciklusváltozót. késő van na
Nyilván segít neki, hogy negyed annyi io van. De igazán jo szvsz akkor lesz ha nagy puffer mellett byte tömböt olvasol be addig amíg van mit olvasni. -
kiskornel
addikt
válasz
joysefke #9323 üzenetére
Köszönöm a válaszokat. A cél egy log fájl írása lenne. Bárhol a progiban ahol Catch ágra fut, ott meg kellene hívnom egy errorlog függvényt, aminek az első paramétere, egy int (hol száll el) ... ez tiszta. DE...
A eset: a második paraméter meg mondjuk egy string (név) , harmadik egy int (ciklusszámláló).
B eset: a második paraméter egy WebClient (maga az objektum), harmadik param. egy webclient response (a válasz, amit ad), negyedik egy string (URL, ahonnan meg lett az hívva).
C eset: stb...Tehát a paraméterek száma is változik (gondolom optional kell legyenek az elhagyható paraméterek) és még a típusuk is változik össze vissza. A függvény belülről nem gond, a típusazonosítás után már fel lehet dolgozni, de nem akarok tömböt definiálni, mikor hívom a függvényt, csak a paramétereket zárójelben bepakolni, átadni.
Az átadott paramétereket meg szétbontom, formázom, és kiírom a log fájlba.
Csak tanulás céljából kérdezem, mert túl sok macera, meg lehet kerülni, máshogy kivitelezni. (meg mert így szokták a nagyok).
Lenne kérdésem a válaszokkal kapcsolatban is, de ha felteszem, tutti elviszi a témát.
Még1x köszönöm a válaszokat, mindent átguglizok.
-
Keem1
veterán
válasz
joysefke #9316 üzenetére
Nem, dehogyis, nyitottam a solution-ön belül egy teljesen új .Net Core 3.1-es projectet, a már létező .Net 4.5-ös console és az ugyancsak 4.5-ös service mellé.
A service pojecten belül még van 4 db class-em, amik a tényleges munkát végzik, úgy vannak megírva, hogy ne függjenek az adott projecttől (példa: Ac, Bc, Cc, Dc, ezek a class-ek más-más feladatot csinálnak). A service is és a console is ugyanezeket használja.
A console pl. nem tartalmaz mást, mint 4 db szöveges menüpontot, az 1, 2, 3 és 4 gomb lenyomására voltaképp a fenti class-ek[Ac|Bc|Cc|Dc].Run()
nevű metódusát hívják meg és végrehajtják.
A service is voltaképp ugyanezt csinálja, csak időzítetten, mint egy crontab, megadott időben azAc.Run()
,Bc.Run()
, stb hívogatódik, de emellett persze mást is: compactolja az SQLite-ot, futtatja a mini webservert, backupolja a MySQL és az SQLite db-ket.Az eredeti elképzelés az volt, hogy a kettő egyben lenne (service-ként, amit a --console argumentummal lehet "menüsíteni"), Windows alatt simán működik is amúgy, alapvetően a --console arggal simán bedobja a console menüt, ketté is van választva a Main() (
if (--console) RunConsole(); else RunService();
), ez Windows alatt csodásan működik, de a Linux közli, hogy service programot csak service-ként lehet futtatni. Végül a Linux miatt készült egy pár soros Main()-ből álló console verzió is, aminek a tartalma a megírás óta nem változott (ahogy említettem, a menüt futtatja), de igazából a service Main()-je sem... hisz minden abban a 4 db class-ben módosul/frissül.Tehát, összegezve... van egy 4 db classből álló feladatcsomagom, amik a Raspberry Pi-n különböző feladatokat hajtanak végre. Emellett van egy console app, ami mauálisan ezeket a feladatokat futtatja, Win/Linux egyaránt. Van egy service-m, ami szintén ezeket futtatgatja, de időzítve, plusz a webes elérést biztosító webserver, plusz pár backup és hasonlók, minden olyasmi, amit egy állandóan a háttérben mozgó service kell hogy futtasson.
-
Keem1
veterán
válasz
joysefke #9302 üzenetére
Köszönöm. ezt kipróbálom
"élesben nyilván a console.Readkey helyett valami olyan szerver metódusod lesz, ami sosem ér véget, ezáltal a backgroundban futó futó webservice is életben marad"
Igen, ezt nagyon jól látod, a solution-ön belül két projectem van, a service, meg egy CLI verzió, próbálom mindkettőt életben tartani, mindkettőt tovább vinni. A CLI alapvetően teszteléshez, debuggoláshoz kell, amit bemásoltam, az onnan való, a service másképp működik.
Sematikusan:
---- Service (project)
---------- servicemethods.cs
---------- program.cs
---- CLI (project)
---------- program.cs (<--- servicemethods.cs)Itt válnak ketté
Windows alatt a service-t lehet CLI-ként is futtatni, sajnos Linux alatt nem.
Ha Linux alatt futtatom, ezt kapom:Use mono-service to start service processes
Ezért fordítok egy második exe-t is, ami gyakorlatilag a paraméterek alapján hívogatja a fő class motyóit. A két program.cs pedig ezeket használja. Az egyik serviceként a másik pedig programként.
#region Service class
public class Service : ServiceBase
{
public Service()
{
ServiceName = Program.ServiceName;
}
protected override void OnStart(string[] args)
{
Program.OnStart(args);
}
protected override void OnStop()
{
Program.OnStop();
}
}
#endregion
#region Main method, application's entry point
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main(string[] args)
{
AppInfo.UseLocalDatabaseFolder = true;
if (System.Environment.UserInteractive)
{
ics.logger.Info("Run as application");
bool showMenu = true;
while (showMenu)
{
showMenu = ConsoleApp.MainMenu();
}
}
else
{
ics.logger.Info("Run as service");
using (var service = new Service())
{
ServiceBase.Run(service);
}
}
}
#endregion -
Keem1
veterán
válasz
joysefke #9295 üzenetére
Mi lenne a proper way helyette?
A lényeg: Raspberry Pi-n futtatok egy .Net 4.5 alapú servicet, ami különböző automatizálási feladatokat hajt végre, adott esetben, ha a feladat jellege megkívánja, az adatok MySQL adatbázisban landolnak (localhost). Az egyszerű webes felületnek két célja van: ha időm és energiám engedi, később lesz egy Androidos app is hozzá, ehhez szolgáltatna JSON API-t, másrészt jelenleg böngészőből érek el pár infót erről a service-ről, a Pi különböző paramétereit is. Szóval erre kell nekem, ezért választottam "rendes" webszerver helyett ezt a megoldást.
-
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.
-
martonx
veterán
válasz
joysefke #9246 üzenetére
Hát én a helyedben Asp.Net Core 2.1-el állnék neki, ha már mindenképpen cél az ősi .Net Framework 4.7.2
Ugyanakkor nem értem, hogy miért erőlteted a netstandard2.0-át. .Net 4.7.2 netstandard 1.x-ig jó, én a meglévő komponensek esetében megelégednék netstandard 1.x-el, amit viszont zokszó nélkül tud használni a .Net Core 3.1 is. -
coco2
őstag
válasz
joysefke #9240 üzenetére
Elkerülendő a további félreértéseket, külön idemásolom a hivatkozott kódrészletet, mert az egész akkora égbekiáltó hazugság, hogy ihaj.
for (int ctr = 1; ctr <= 10; ctr++) {
lock (lockObj) { value = rnd.Next(0,101); }
if (value == 0) {
source.Cancel();
Console.WriteLine("Cancelling at task {0}", iteration);
break; }
values[ctr-1] = value; }
Ugyan had tegyem fel a költői kérdést, hol van annak a task kilépésnek bármi köze a cancel token változásához ?
(A teljes kód példa az előző hsz-ben a linken található.)
-
martonx
veterán
válasz
joysefke #9188 üzenetére
Pedig ez akkor is tipikusan olyan, amit semmi értelme tesztelni. Több idő, és macera teszteket készítened, ahhoz hogy leellenőrizd, hogy működik az, ami nyilvánvalóan működik.
Mondok egy példát:
public int Add(int a, int b)
{
return a + b;
}Elméletileg ezt is kellene tesztelned, de őszintén minek, pláne, hogy C#-ról beszélünk nem javascriptről, ahol ezt simán meghívhatod stringekkel is? Ha már endpointokat akarsz tesztelni, akkor azt teszteld, hogy model binding biztosan jól kezel-e le mindent, ne a TÖKÉLETESEN nyilvánvalót, miszerint ha meghívod a /Home/Index-et, akkor vajon melyik endpointba fog beesni.
Direkt sarkítottam, lehetnek trükkösebb routingok, amiket utána meg pláne még fájdalmasabb lesz tesztelni, miközben azok is a legelső meghíváskor ki fognak derülni, ha működnek, ha nem akkor javítod, és utána az ítéletnapig jó lesz.
Ráadásul kevered a unit teszt-et, a system test-tel. http://softwaretestingfundamentals.com/software-testing-levels/
Ne érts félre, nem kötözködni akarok, csak ha már precízen tesztelni akarsz - ami nagyon helyes hozzáállás - akkor olyanra fordítsd az erőforrásodat, aminek van értelme
-
martonx
veterán
válasz
joysefke #9105 üzenetére
Én ebbe nem folynék bele, mert azok alapján, amit leírtál két esetet tudok elképzelni:
1. ahol dolgozol, mindenki segg hülye, de azért szeretném hinni, hogy ennyire nem lehet rossz a helyzet
2. valamit végtelenül félreértesz az alatt, hogy a cég mit nevez inter kommunikációnakHa nem félreértés, és tényleg azt erőltetik, ami a leírásod alapján átjött, akkor meg ideje felmondani, és normális fejlesztő céget keresni
-
martonx
veterán
válasz
joysefke #9103 üzenetére
"Az ötletem az, hogy a REST API egy ASP .NET Core 3.1 projekt lenne amelyhez tartozó ASP WebHost objektumot az applikációból (annak a belépési pontját megkeresve) egy külön Thread-en indítanám el, az pedig a megadott porton fogadná a kéréseket."
He? Hogy mi? Miért? Addig, hogy Asp.Net Core API teljesen értek mindent, de ez a kókányolás ötlet ez minek?
Simán elfut egy Asp.Net Core Api, megcsinálja, amit kell, és ennyi? Mindenki, mindenkitől függetlenül éli a világát.
Szakadjunk már el a görcsös monolitikus megvalósítástól, ez pont az a helyzet, ahol nyugodtan be lehet vezetni egy független microservice asp.net core api-t. -
-
leslie23
tag
válasz
joysefke #8903 üzenetére
"Amiről beszélsz az egy extrém példa és azt feltételezi, hogy a munkafolyamatnak az adott "nem hivatalos" tool megkerülhetetlenül része lett, de szupport stb érdemben nem létezik rá. Tehát a valós munkafolyamat észrevétlenül(?) már annyira módosult, hogy a hivatalosan létező eszközökkel nem végezhető el (lol)."
ez itt a kulcskérdés, szerintem. jelenleg a saját irodai munkafolyamatainkat három fronton támadom:
1.) VSTO Add-ins: Outlookban, illetve Excelben néhány lépésből álló műveletek vannak összefűzve 1-1 custom gomb mögött a toolbaron. O365-tel tökéletesen működnek, de tegyük fel, hogy 1-2 éven belül jön egy frissítés, ami hazavágja őket és én már nem leszek itt. Egyszerűen törölni kell a bővítményeket és lehet csinálni úgy, ahogy korábban is ment, nincs szignifikáns különbség még csak időben sem, maximum egy picit bosszantóbb a feladat.
Bár az valóban gáz, amit sztanozs említett az ingyenes VS-sel kapcsolatban...
2.) AHK scriptek grafikus felülettel, exe-be fordítva, célszoftverek GUI-automatizációjának céljából. Itt is potenciális veszély, hogy a szoftver következő verziójában már eltérő lesz az ablakok vagy a menük felépítése, ergo használhatatlanná válnak a scriptek.
Ha így lesz, akkor ejteni kell az AHK-t, és manuálisan dolgozni, de minden feladat tökéletesen elvégezhető így is. Napi 5-10 perc intenzív kattintgatásról van szó, de ugyebár időveszteség nincs, hiszen az AHK sem gyorsabb, csak így nem szárad le az ember ujja a már a 15. másodpercben...
3.) VBA makrók - jelentések generálása, továbbítása Outlookon keresztül, illetve adathalmazok gyors átvizsgálása, fals adatok keresése.
Ha gikszer van, továbbra is minden elvégezhető manuálisan, a számolások és formázások, chartok beszúrása Excelben, mentés, az Outlookos e-mail megírása, a mentett fájl csatolása, e-mail küldése, korábban is így ment ez. Itt mondjuk van időveszteség, kb. 15 perc/fő, napi szinten, plusz ugyebár a hibalehetőségek száma egyértelműen magasabb manuális munka esetén.A mostani kis garázsprojekt (leltár adatbázis alapon) viszont valóban necces audit szempontból.
Mit gondoltok az Access használatáról? Azt meg tudnám oldani, hogy a mostani lapvédelmes meg hasonló borzalmakkal tuningolt ősrégi Excel doksit adattisztítás után átdobom Accessbe, ez lenne egy egytáblás adatbázis, ami csak jelszóval szerkeszthető (olvasási joga mindenkinek van jelenleg is). És akkor ezen felül építenék egy felületet, plusz egy másik adatbázist, ami tartalmazná az apphoz kapcsolódó további adatokat, amik pl. a jogosultságkezelés szempontjából fontosak. Nyilván nem szép megoldás az egy tábla redundancia szempontjából, viszont ez így egy független, bármikor elővehető nyilvántartás, aminek van egy kényelmesebb olvasási/szerkesztési módja is, a .NET alapú GUI... -
sztanozs
veterán
válasz
joysefke #8901 üzenetére
Nekem jó tapasztalataim vannak azokkal a cégekkel ahol az IT nem belső ellenségként tekint a felhasználókra és csoportokra akiknek a jogkörét a szükséges abszolút minimumra kell csökkenteni.
Nekem pedig rossz tapasztalatom van olyan helyzetekkel, ahol 1-1 kiváló képességű rejtett fejlesztő hegeszt össze olyan cuccokat, amelyek ideális esetben akár 100-1000%-al növelik a termelékenységet (manuális feladatok automatizálása), de kritikus esetekben (pl windows update, vagy forrásrendszerek módosulása után) az adott osztály napokig nem tud dolgozni, mert az egy darab kolléga épp szabin van.
Tök jók az ilyen helyzetek, csak amikor egy saját célra készített eszköz már üzleti folyamatokat támogat, akkor ennek supportját is rendesen meg kell oldani. Ilyenkor pedig előjönnek a sztenderd kérdések/problémák:
- felhasználókezelés (minek?)
- változásmenedzsment, verziókezelés? (mi az?)
- adatforrásokat elérése (az én jelszavam van belekódolva)
- hogy illeszkedik ez a sztenderd architektúrába (van ilyenünk?)
- ezt nem fejleszthetted volna free VS.NET-ben (most ez miért gond, szabadon letölthető volt)Nem csoda, hogy az IT nem szereti látni (átvenni) ezeket a zsivány fejlesztéseket...
Új hozzászólás Aktív témák
Hirdetés
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Bittorrent topik
- Facebook és Messenger
- Magga: PLEX: multimédia az egész lakásban
- Hónap végén érkezik a Xiaomi Band 10, ára is van
- Nvidia GPU-k jövője - amit tudni vélünk
- ASUS blog: Ideális olcsó utazós gép lett az új Vivobook S14
- Nintendo Switch 2
- AI-ra, játékra, mindenre kiváló lehet a Gigabyte új PC-je
- TCL LCD és LED TV-k
- Diablo 3
- További aktív témák...
- AKCIÓ! Lenovo Legion Slim 5 Gamer notebook - R7 7435HS 16GB RAM 1TB SSD RTX 4070 8GB GDDR6 WIN11
- ÁRGARANCIA!Épített KomPhone i7 14700KF 32/64GB RAM RTX 5070Ti 16GB GAMER PC termékbeszámítással
- Beszámítás! Sony PlayStation 5 825GB SSD digital konzol garanciával, hibátlan működéssel
- DELL T40 EMC Szerver
- AKCIÓ! Apple Macbook Pro 16" 2019 i7 9750H 32GB 500GB Radeon Pro 5300M hibátlan működéssel
Állásajánlatok
Cég: PC Trade Systems Kft.
Város: Szeged
Cég: PC Trade Systems Kft.
Város: Szeged