- VoLTE/VoWiFi
- iPhone topik
- Samsung Galaxy A56 - megbízható középszerűség
- Megérkezett a Google Pixel 7 és 7 Pro
- Profi stratégiára vált a Galaxy S26
- Hivatalosan is bemutatta a Google a Pixel 6a-t
- Újabb magyar banknál elérhető a Xiaomi Pay
- One mobilszolgáltatások
- Samsung Galaxy S25 - végre van kicsi!
- Samsung Galaxy Watch7 - kötelező kör
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
válasz
martonx #10190 üzenetére
Végül rájöttem a megoldásra...
Itt találtam a következőt, ez oldotta meg nálam is a problémát.
services.AddSession(options => {
options.IdleTimeout = TimeSpan.FromHours(12);
options.Cookie.Name = ".yourApp.Session"; // <--- Add line
options.Cookie.IsEssential = true;
});Az "add this line" bekerülésével, majd cookie törlésével helyreállt a rend és működik minden.
-
Keem1
veterán
Srácok, segítséget szeretnék kérni: ASP.Net Core Razor
A probléma autentikáció során van, fórumokat, tutorialokat tekintve nem találtam problémát, a leírt 2-3 common troubleshooting mindegyikét megcsináltam.Az autentikáció még erősen fejlesztés alatt áll, és két részre bonthatjuk: az egyik a klasszikus, jelszó+pw lokálisan tárolt user, a másik pedig az OAuth2 login, több provider (Google, Facebook, Microsoft, Spotify, ...) de egy kaptafára.
Mi maga a probléma? Login után (egyelőre a külsős van kész, de ez a probléma szempontjából mellékes) megkapom a login adatokat, az auth látszólag sikeres, van User.[...], vannak claimek, van access tokenem, látszólag minden van. De csak addig, míg nem navigálok el/töltök újra bármit, mert akkor a felhasználói session rész elvész. A session amúgy megmarad, bármit letárolok a sessionben, megmarad. A sample kódban látszik, hogy ideiglenesen az access tokent lementettem sessionbe, az megmarad. De a User.[...] nem érhető el, HttpContext.SignInAsync() többé false-szal tér vissza (pedig rögtön a login után, a Response metódusban tökéletesen fel volt populálva, tehát nem arról van szó, hogy a providertől nem jön meg a data), nincsenek claimek, stb.
Több helyen írták, cookie problem, töröljem őket. De töröltem, két gépen is próbáltam, MS Azure-ben hostolva is próbáltam, a probléma perzisztens.Annyi még, hogy van egy ilyen warningom, nem tudom, közrejátszik-e, de igazából "csak" warning.
Ja, és bármelyik identityvel próbálkozom, ugyanez.info: AspNet.Security.OAuth.Spotify.SpotifyAuthenticationHandler[12]
AuthenticationScheme: Spotify was challenged.
warn: Microsoft.AspNetCore.Session.SessionMiddleware[7]
Error unprotecting the session cookie.
System.FormatException: The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.
at System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength)
at System.Convert.FromBase64String(String s)
at Microsoft.AspNetCore.Session.CookieProtection.Unprotect(IDataProtector protector, String protectedText, ILogger logger)Mit rontok el?
Előre is köszi a helpet.
Source kódok:
- Startup.cs
- Pages/Account.cshtml.cs -
Keem1
veterán
válasz
petyus_ #10164 üzenetére
Igen-igen, a Spotinál egy string az ID.
Spotify ID The base-62 identifier found at the end of the Spotify URI (see above) for an artist, track, album, playlist, etc. Unlike a Spotify URI, a Spotify ID does not clearly identify the type of resource; that information is provided elsewhere in the call.
Example: 6rqhFgbbKwnb9MLmUQDhG
Nálam a DB-ben az Id az egy autoincrement int, és a Spoti-féle Id-t egy Username stringben tárolom.
@martonx:
Innen indultam ki, amit írsz, csak míg egy object inicializálásakor megy ez:
var _obj = new Obj()
{
property1 = value1;
}... addig sajnos már létező objectnél (amit kiköp létező userként a DB) már nem lehetséges, muszáj az existinguser.Property1 = value1; minden egyes módosítandó adatnál, tehát a problem, hogy mindegyik elé mehet az object neve is. Tök jó lenne, ha ugyanez működne a már kiolvasott adatnál is, és ha pl. van 10 property, de én csak 4-et módosítok, akkor a blockban csak azt a négyet sorolom fel, míg az object nevét csak egyszer, a blokk elején.
-
Keem1
veterán
válasz
martonx #10161 üzenetére
&& Alexios
A redundanciát a következőre értem, illetve amit én szeretnék (egyszerűsíteni):
userdata jön az API response-ból, mivel ez egy API (abból is a Spotify-nál beloggolt user), így nekem kell eldönteni, hogy saját DB-mben létezik-e már.
Bárhogy is legyen, a userdata ojjektum adott, a friss, ropogós, API-ból érkező aktuális adat.
Ha létezik, ezt csak update-elni akarom a saját kópiámban, ha még nem, értelemszerűen létrehozni.Sematikusan valahogy így:
// userdata a method paraméterében
var existing = db.SpotifyUsers.Where(x => x.Username == userdata.Id); // Ezt még módosítom ahogy javasoltátok
if (existing != null && existing.Count()>0) db.SpotifyUsers.Update(userdata); //De ez nem megy, pedig jó lenne
else db.SpotifyUsers.Add(userdata);Tehát kvázi mindegy, hogy új adat-e vagy sem, nem kell új vagy update esetén sem újra értéket adnom ugyanannak a propertynek. Ha új data, akkor a teljes object az API returnból jön (userdata), ha létező, akkor pedig a kiindulási állapot a DB-ból lekért adat, és a különbséget (a userdata-hoz képest értve) tárolom le.
Ehelyett valami ezeréves szar trükközéssel próbálkoztál
Ez alatt amúgy mit értettél egészen pontosan? -
Keem1
veterán
válasz
martonx #10158 üzenetére
Van egy Spotify playlist automatizált motyóm, ami a Spotify API-val dolgozik.
Bár az elv több része is hasonlóan fog működni, most még a loggolt user (ketten csináljuk) DB-be letárolása megy, de a playlisteké is ugyanezen elv mentén fog.EF vagy EF Core?
EF Core 8Sajnos terjedelmi és egyéb okok miatt nem tudom bemásolni, de a logic a következő:
Van egy metódus: SpotifyLogin(SpotifyUser user)public DbSet<SpotifyUser>SpotifyUsers {get;set;}
[Table("spotifyusers")]
public class SpotifyUser()
{
[Key, Column("id")]
public int Id { get; set; }
[Column("tstamp")]
public DateTime? TimeStamp { get; set; } = DateTime.Now;
[Column("username")]
public string? Username { get; set; }
[Column("displayname")]
public string? Name { get; set; }
[Column("email")]
public string? Email { get; set; }
[Column("accesstoken")]
public string? AccessToken { get; set; }
[Column("followers")]
public int Followers { get; set; } = 0;
[Column("image")]
public string? Image { get; set; }
[Column("profileurl")]
public string? ProfileUrl { get; set; }
[Column("lastlogin")]
public DateTime? LastLogin { get; set; } = DateTime.Now;
}Ha az API-val sikerült beloggolnia (ennek a mikéntje jelenleg mindegy is), akkor lesz egy objektumunk, kb. ilyen:
var user = new SpotifyUser()
{
//itt az API által átadott adatok
}és ezután kerülünk abba a metódusba, ahonnan idéztem is már: SpotifyLogin(SpotifyUser user)
Éééés itt pedig ketté ágazik a dolog, de mint mindent, ezt is próbálom minél egyszerűbbre, univerzálisabbra, és ha lehet, a legkevésbé redundánsra csinálni.
Szóval letároljuk a usert DB-be, van egy user objectünk, amiről még nem tudjuk, hogy új-e vagy régi.
Ha új, egy új entry lesz a DB-ben, ha régi, akkor aktualizáljuk, de az ID-ja az változatlan marad.Innen már ismerős:
using (var db = new MySqlContext())
{
var existing = db.SpotifyUsers.Where(x => x.Username == userdata.Id);
if (existing != null && existing.Count()>0)
{
// Ez a bajos, ha létezik a user
// Ide valami olyan lenne jó, hogy:
// db.SpotifyUsers.Update(userdata);
// De erre csak egy új entry-t hoz létre a DB-ben
}
else
{
//Ez működik, ha még nincs ilyen user
db.SpotifyUsers.Add(userdata);
return (db.SaveChanges()>0? true : false);
}
}Szóval eddig jutottam, és a playlistek kezelése is kb ugyanígy fog kinézni, ha már létezik, akkor csak updateljük a followereket, a trackek számát, stb. Ha még nincs ilyen a DB-ben, akkor meg újként elmentjük teljes egészében.
Az update amúgy működne úgy, hogy igazából lekérem a létező usert, és soronként/propertynként "lemásolom" a datát, és úgy egy Update, de nem akarok ennyi redundanciát.
Ja, és meghagynám annyira univerzálisnak, hogy jelenleg működik MySQL és Sqlite DB-vel is, ami maradna, MySQL a fő cél, de backupnak meghagynám az SQLite-ot is.
Érthető valamennyire?
-
Keem1
veterán
Srácok, EntityFramework, lekérek egy entry-t a DB-ből, pár property-t módosítok, majd save-elném, de hiba jön.
var existing = db.SpotifyUsers.Where(x => x.Username == userdata.Id).SingleOrDefault();
db.Entry(existing).CurrentValues.SetValues(edited);Erre kapom azt, hogy:
The property 'SpotifyUser.Id' is part of a key and so cannot be modified or marked as modified. To change the principal of an existing entity with an identifying foreign key, first delete the dependent and invoke 'SaveChanges', and then associate the dependent with the new principal.Hogy tudnám megmondani neki, hogy az Id-t hagyja békén, ne akarja módosítani (én se teszem, nincs ilyen property az edited-ben)?
-
Keem1
veterán
Srácok, 2 await 1 metódusban mennyire OK? Működik amúgy, de lehet bármi gond vagy akármilyen ellenvetés?
Mutatom:
var groups = await API.GetGroups("");
var items = await API.GetItemsByGroup(groups.FirstOrDefault().GroupId);
-
Keem1
veterán
Srácok, szeretnék helpet kérni.
ASP.Net Core Razor. Van két Oauth authentication-öm: Google, Spotify.
Van a Spotify pagemoldelen belül egy OnGetAccount(), amit értelemszerűen ha a Spoti login ok, akkor jelenjen meg. Nem logged off, nem Google logged in, hanem csakis ha Spoti logged in.
Hogy tudom rávenni a /Spotify/Account oldalt, hogy ha logged in akkor OK, amúgy /Spotify/Login redirect?Valami ilyesmit találtam a metódus fejhez:
[Authenticate]De ez hatástalan, semmi nem történik.
Előre is köszi.
-
Keem1
veterán
válasz
petyus_ #10007 üzenetére
De-de, jó, igazából most is .net 6-ot használok, csak mivel a webapp jelenleg teljesen kompatibilis mindhárom jelenlegi verzióval, gondoltam, kicsit tervezek a jövőre is, így pl. windowson lebuildelem mindhármat, hátha valami inkompatibilitás állna elő. De jelenleg csak pár warning csúfítja az outputot. Azure-on is 6.0-n fut, pont azért, mert a legrégebbi a linux jelenleg. És mivel a VPS ownere nem én vagyok, nem sok befolyásom van a dotnet upgrade-re (lassú lenne a folyamat, ha ráállnék).
-
Keem1
veterán
Srácok, ASP.Net Core (.Net 6.0), Azure deploy Githubról.
Ez az error:
The current .NET SDK does not support targeting .NET 7.0. Either target .NET 6.0 or lower, or use a version of the .NET SDK that supports .NET 7.0.A csprojban ez van: <TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
Az Azure web app runtime stack-je .Net 6.0
Ha a fenti multi FW-t kicserélem erre: <TargetFramework>net6.0</TargetFramework>, akkor működik a deploy (természetesen ha végigzongorázom 6-tól 8-ig, ugyanez, single FW ok, multi FW failure).
Ha windowson, linuxon buildelek, akkor az összes FW verzióval megy.Hogy tudom rábírni az Azure-ra hogy a neki tetszőt válassza ki, a többit hagyja figyelmen kívül?
Szerk: sajnos kell a multi FW, mert fut windowson, tesztelek Azure-on és megy egy linux szerveren is, ahol sajnos csak .NET 6.0 van. Külön fejleszteni nem akarok, mert tuti egyszer elfelejtek vmit, így meg githubról automatikusa deployódik. És a kód fordul/fut mindhárom verzión
-
Keem1
veterán
Sracok, egy nagy anomaliaba utkoztem.
Csinaltam egy szuz ASP Razor porjectet, en populaltam fel, de hibaba utkoztem.Alapesetben ezt kapom:
PS C:\Users\ik\source\repos\nuup> dotnet run -c Release -f net6.0
Building...
C:\Program Files\dotnet\sdk\7.0.405\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.DefaultItems.Shared.targets(213,5)
: error NETSDK1022: Duplicate 'Content' items were included. The .NET SDK includes 'Content' items from your project di
rectory by default. You can either remove these items from your project file, or set the 'EnableDefaultContentItems' pr
operty to 'false' if you want to explicitly include them in your project file. For more information, see https://aka.ms
/sdkimplicititems. The duplicate items were: 'wwwroot\css\site.css'; 'wwwroot\errors\error.html'; 'wwwroot\robots.txt'
[C:\Users\ik\source\repos\nuup\nuup.csproj::TargetFramework=net6.0]
The build failed. Fix the build errors and run again.
PS C:\Users\ik\source\repos\nuup>Ha beteszem ezt:
<EnableDefaultContentItems>false</EnableDefaultContentItems>
akkor viszont minden oldal 404-es lesz, a full kezdolapot is beleertve.Ez a csproj file-m:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFrameworks>net6.0;net7.0</TargetFrameworks> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <EnableDefaultContentItems>false</EnableDefaultContentItems> </PropertyGroup> <ItemGroup> <Folder Include="Data\"/> <Folder Include="Models\"/> <Folder Include="Classes\"/> <Content Include="wwwroot\**\*"> <CopyToPublishDirectory>Always</CopyToPublishDirectory> </Content> </ItemGroup></Project>Mit rontok el?
-
Keem1
veterán
Srácok, ebben kérnék helpet.
Részletek: .NET 6.0 console, VS CodeOutput Windowson:
NewGen v1.1.124.1223
Album
Artist
Customer
Employee
Genre
Invoice
InvoiceLine
MediaType
Playlist
PlaylistTrack
Track
Press any key...Output Linuxon:
NewGen v1.1.124.1223
Unhandled exception. System.IO.FileLoadException: Could not load file or assembly 'System.Diagnostics.DiagnosticSource, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The located assembly's manifest definition does not match the assembly reference. (0x80131040)
File name: 'System.Diagnostics.DiagnosticSource, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'
at MySql.Data.MySqlClient.MySqlConnection.OpenAsync(Boolean execAsync, CancellationToken cancellationToken)
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
at MySql.Data.MySqlClient.MySqlConnection.OpenAsync(Boolean execAsync, CancellationToken cancellationToken)
at MySql.Data.MySqlClient.MySqlConnection.Open()
at NewGen.NewGenHelper.MySQLHelper.Tables() in C:\Users\kincs\source\repos\NewGen\NewGenHelper.cs:line 193
at NewGen.NewGen.Main() in C:\Users\kincs\source\repos\NewGen\Program.cs:line 34
FélbeszakítvaKód:
public List<string> Tables()
{
var tables = new List<string>();
using (var conn = new MySqlConnection(ConnectionString))
{
conn.Open();
using(var cmd = new MySqlCommand())
{
cmd.Connection = conn;
cmd.CommandText = "SHOW TABLES;";
var reader = cmd.ExecuteReader().Cast<IDataRecord>();
tables = reader.Select(x => x.GetString(0).ToString()).ToList();
}
conn.Close();
}
return tables;
}Mi okozhatja az exceptiont Linuxon úgy, hogy Windowson nem?
Így fordítottam: dotnet publish -c Release --arch arm --os linuxElőre is köszi
-
Keem1
veterán
válasz
martonx #9973 üzenetére
@martonx és @joysefke
Ahogy látom, mindketten átszervezést javasoltok. Úgyhogy akkor ebbe az irányba kell elindulnom.A logger azért pihent itt. hogy az egész webapp során egyszer kelljen felparamétereznem és könnyebben használhassam.
Az SQLite dettó, a db file természetesen configból jön, igen, nincs hardcodeolva.
Köszi srácok, akkor kicsit átalakítom a kódot.
-
Keem1
veterán
Srácok, logical loopba kerültem
Van egy ASP.Net Core Razor webappom. Próbálom a megértést elősegítendő leírni, mim van:- CommonService, különböző, webapp-wide nyalánkságok, pl. logger, config fileok handlere, konstansok
- SpotifyService : CommonService, Spotify API, a Commonból származtatva, pl. ne kelljen újabb logger instance, stb., ami már a commonban is megvan
- WeatherService : CommonService, kb mint a fenti
- SQliteService.. na itt jön a baj, ebben példányosítottam egy commont: var common = new CommonService();
Szintén azért, hogy pl loggert használhassak
A probléma az, hogy szeretnék SQLite-ot a commonban is, de ha var sqlite = new SQLiteService(); akkor exceptiont kapok, feltételezem, jogosan, a keresztbe példányosítás miatt.Tudom, hogy kb a logikával ellentétes dolgot akarok, deee ...
Hogy tudnék mégis egy SQLiteService instancet létrehozni? -
Keem1
veterán
válasz
martonx #9941 üzenetére
Igen, vmi ilyesmi (leegyszerűsítve).
Az ASP.Net-et még csak most kezdtem el behatóan tanulmányozni, mivel az előző melóhely óta (idestova 4 éve) nincs szükségem igazán PHP-re, C#-ra viszont igen, így arra gondoltam, a webes tudásomat is .NET alapokon kamatoztatom, tekintve hogy a .NET 6 + ASP.Net Razor már frankón megy linuxon is (Apache mögött), így megvan minden téren az érdeklődés.namespace LearnASPNETCoreRazorPagesWithRealApps.Pages { public class IndexModel : PageModel { [BindProperty] public string Username { get; set; } [BindProperty] public string Password { get; set; } public string Msg { get; set; } public void OnGet() { } public IActionResult OnPost() { if (Username.Equals("abc") && Password.Equals("123")) { HttpContext.Session.SetString("username", Username); return RedirectToPage("Welcome"); } else { Msg = "Invalid"; return Page(); } } } }
-
Keem1
veterán
Srácok, mennyire jó ötlet sessionnel loginolni? PHP-érában azt szoktam meg, de látom, ASP-ben van vmi saját auth megoldás is. Mennyire obsolete vagy unsecure a sessionös login manapság?
-
Keem1
veterán
válasz
martonx #9937 üzenetére
Deee, az.
Még nem jöttem rá a megoldásra, de keresem..
Kicsit más: hogy tudok egy foldert buildeléskor az exe mellé tenni? Van egy www nevű folder, pár HTML template-tel, és azt is be kéne tennie fordításkor/publishkor oda, ahova a többi file megy.
Túrom a StackOverflow-t, de még nem találtam rá megoldást.
Ja, ez már nem ASP.Net, hanem Net 6.0 service -
Keem1
veterán
Még egy kérdés az ASP.Net Core Razor dologban.
Adott egy view (Proba.cshtml), és benne egy@using tesztnamespace
A view-ban, ha az adott namespaceből (tesztnamespace.tesztclass.tesztmethod()
) valamit használnék, ezt kapom: tesztmethod is inaccessible due to its protection level.
Miért?
Modelből simán megy, viewből nem.Szerk: ja, igen, mind a class, mind a method public.
-
Keem1
veterán
Srácok, ASP Net Core 7, hello world app... 🙈
Hol tudok konkrét portot definiálni (a default :5000 helyett) aProgram.cs
-ben az app.Run(); előtt?
Gugliztam egyapp.UseUrls()
-t, de aWebApplication
classnek nincs ilyen metódusa.Köszi
-
Keem1
veterán
válasz
sztanozs #9893 üzenetére
Nem-nem, csak ide loggoltam most, a kerékpározó hód javaslatára, hogy meddig jut el a kódban.
Így derült ki, hogy a service ojjektum létrehozásánál hasal el, tovább nem megy. De hogy miért, azt eddig nem sikerült kideríteni.Nlogot használok amúgy, de ez csak egy teszt cucc, mert egyedül a service-t nem sikerült átemelni 4.5-ből 5.0-ba, és a kicsontozott példa service se megy, szóval ugyanez a baja az éles motyónak is.
-
Keem1
veterán
válasz
sztanozs #9890 üzenetére
public class Service : ServiceBase
{
public Service()
{
File.AppendAllLines(Logfile, new string[] { "Service init" });
ServiceName = Program.ServiceName;
}
protected override void OnStart(string[] args)
{
File.AppendAllLines(Logfile, new string[] { "Service start" });
base.OnStart(args);
}
protected override void OnStop()
{
File.AppendAllLines(Logfile, new string[] { "Service stop" });
base.OnStop();
}
} -
Keem1
veterán
Megnöveltem 500 secre, de továbbra is tök ugyanaz...
Szokás szerint eljut a "Running as service" pontig, aztán annyi... Tovább nem megy.PS C:\Windows\System32> sc start TestSrv
[SC] StartService FAILED 1053:
The service did not respond to the start or control request in a timely fashion.
PS C:\Windows\System32> -
Keem1
veterán
Igazad van, így viszont van némi infó...
if (!Environment.UserInteractive)
{
File.AppendAllLines(Logfile, new string[] { "Running as service" });
// running as service
using (var service = new Service())
{
// Ez a log entry már nem kerül be a logba
File.AppendAllLines(Logfile, new string[] { "Servicebase run" });
ServiceBase.Run(service);
}
}Itt a Running as service még benne van a logban, a Servicebase run már nincs. Tehát a service disposable már nem jön létre, ezek szerint.
-
Keem1
veterán
Srácok, ez nektek meg .NET 5 alatt?
[link]Simán lefordul, tudom serviceként installálni, de indítani már nem tudom.
Nálam ezt produkálja:
The Service did not Respond to the Start or Control Request in a Timely FashionKöszi, ha valak megnézné.
-
Keem1
veterán
Srácok, Google API-ban valaki otthon van?
A Keep apihoz szeretnék segítséget.Futtatáskor böngészőből bejön a consent screen, leokézom, majd a következő exception fogad:
Google API Sample
====================
https://www.googleapis.com/auth/userinfo.email
https://www.googleapis.com/auth/keep.readonly
Unhandled exception. The service keep has thrown an exception.
HttpStatusCode is Forbidden.
Google.Apis.Requests.RequestError
Request had insufficient authentication scopes. [403]
Errors [
Message[Insufficient Permission] Location[ - ] Reason[insufficientPermissions] Domain[global]
]
Google.GoogleApiException: The service keep has thrown an exception. HttpStatusCode is Forbidden. Request had insufficient authentication scopes.
at Google.Apis.Requests.ClientServiceRequest`1.ParseResponse(HttpResponseMessage response)
at Google.Apis.Requests.ClientServiceRequest`1.Execute()
at Testing.Program.Main(String[] args) in C:\Users\blahh\Visual Studio\ConsoleTest\Testing\Program.cs:line 46Ha minden igaz, akkor insufficient scope az oka. Ami azért érthetetlen, mivel elvileg két scope kell neki e szerint, de mégse elég.
Valakinek van esetleg ötlete?
-
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.
-
Keem1
veterán
Srácok, elakadtam, segítséget kérek.
Van egy basic classem, kb 10 környéki color propertyvel, nevezzük ezt Light-nak.
Van még egy, ennek neve legyen Dark, ami a Lighttól öröklődik.Amit szeretnék:
- egyrészt a Light-tól bizonyos propertyket overrideolni, tehát mondjuk aColor Magenta { get; } = ColorTranslator.FromHtml("#FF333337");
lesz, és ha a Dark.Magenta kerül meghivatkozásra, akkor innentől az ő propertyje lesz érvényes.
- másrészt, ha a Dark-ban egy property nem létezik, de a Light-ban igen (pl. Green), akkor aDark.Green
is érvényes lesz, csak megegyezik majd aLight.Green
színnel (mindaddig, míg a Dark-ban is nem kerül overrideolásra a Green).Már az elsőnél elakadtam
-
Keem1
veterán
Srácok...Itt kérnék egy kis helpet.
GZipStream responseStream = new GZipStream(wc.OpenRead(page_url), CompressionMode.Decompress);
StreamReader reader = new StreamReader(responseStream.Length > 0 ? responseStream : wc.OpenRead(page_url));
ResponseHtml = reader.ReadToEnd();Adott a fenti kód, célja, hogy a kapott JSON-t gunzippeli-e vagy sem. Sajnos van, ami nem gzippelt. Viszont, mint rájöttem, a GZipStream Length propertyje nincs implementálva, mindig exceptiont dob.
A fenti kód működik gzippel, ha tutira gzipes JSON-t kérdezek le, és szintén működik, ha a JSON uncompressed.
A kettőt kéne összegyúrni úgy, hogy valahogy lekérdezhessem, hogy gzip-e vagy sem.
A HTTP header felejtős, az minden esetben gzipet ad vissza. Magából a streamből kell kitalálnom, hogy melyik.Szerk: annyi még, hogy ha pl. a tutira nem gzipes url-re ráengedem a gzipes megoldást, akkor valahol infinite loopba kerül, sose fut le a kódrészlet.
-
Keem1
veterán
válasz
Alexios #9629 üzenetére
Ezt a controlt (ListView) szerintem még nem is használtam, de lecsekkolom
Igazából azért merült fel, mert PHP+HTML+CSS témában eléggé otthon vagyok (nem profi szinten), csináltam már pár hobbi web appot, amire az igénylő konkrétan natív mobilos appot akart eredetileg, és nem hitte el, hogy ami elkészült, az konkrétan egy weboldal, nem egy app. És ugye ez ráadásul ment desktob böngészőben is, nem csak mobilon.
Nyilván ez eddig mind webszerveren, böngészőben.Most a desktop app adott, amúgy .NET 5.0 a FW, a lista, a forrás API kezelése, ez mind kész.
A listát szeretném csinosítani, használhatóbbá tenni, és valahogy elfedni azt a hiányosságot, hogy ez (még) nem web app (később az lesz, talán pár év[tized] múlva).De a ListView-t megnézem, nem sűrűn találkoztam vele, így nem ismerem.
Szerk:
Rákerestem, és találtam ilyesmit.
Kb a bal oldali kép az, amit nagyjából én is össze szeretnék hozni. -
Keem1
veterán
Srácok, egy fancy listát ti hogy jelenítenétek meg?
Adott egy tool, ami egyszer talán valamikor átköltözik intrawebre, de addig is az én kreálmányom van használatban.Van egy mostani lista (szerverek, customerek, adatok, stb), amik irtó rondán, egy multiline textboxban vannak most.
Csinosítanék rajta, ez weben nem lenne kérdés de most desktop app van, ebből kell építkezni.
Lenne kis profilfotó, cím, adatok, stb. Ha nagyon közelíteni kéne, hogy mit szeretnék, akkor kb. a Spotify playlist kinézete. Balról fotó, mellette fent kiemelve megnevezés, alatta kisebbel basic infó, és így tovább.Hogy csinálnátok meg?
- webbrowserben HTML+CSS?
- egy scrollozható panelben child panelek (egy-egy entry) és rajta dinamikusan a fotó, infók (label)?A tartalom mennyisége filterezés kérdése. Van eset, amikor 1-2, de akár több száz is. Mivel a query lapozható, így azért több tízezres listáról nem lenne szó.
-
Keem1
veterán
Srácok, loop helpet szeretnék kérni
Kódrészlet:
int limit = 50;
int offset = 0;
int loopcounter = 0;
List<string> tracks = new List<string>();
do
{
loopcounter++;
tracks.Clear();
tracks = spoti.MyTracks(limit, offset);
textBox1.AppendText(Environment.NewLine + $"OFS: {offset} :: TRK: {tracks.Count} :: CNT: {loopcounter}" + Environment.NewLine + String.Join(Environment.NewLine, tracks));
offset += limit;
}
while (tracks.Count > 0 || loopcounter < 10);Tehát adott a ciklus, aminek le kell állnia, HA elfogyott a track (tehát a tracks list üres) VAGY elértük az engedélyezett max loopot (ez most 10), hogy ne menjen át infinite loopba.
Viszont, a kiírás szerint végigmegy az összes tracken, a loop counter a végére 21. Tehát 10-nél nem áll le. Miért nem? -
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
Srácok, a Linq képes arra, hogy egy List<dictionary<string,string>>-ből megkeressem a list azon elemeit, amiknél egy adott dictionary key-re vagyok kíváncsi?
Tehát van egy nagy listem:
List<dictionary<string,string>> nagy
Amiből kéne egy olyan
List<dictionary<string,string>> kicsi
partial list, ahol a nagyból egy bizonyos kulcsot adok meg szűrési feltételként.Pszeudo:
List<dictionary<string,string>> kicsi = nagy.Where(item => item.Key = "blabla").ToList();
Valami ilyesmi
Szerk: igazából a fontos, hogy a dictionary bármi lehet, akár <string,object> is, de a key az mindenképp string. És a nagy list szerkezetét kellene visszakapjam, csak azokra az elemekre, ahol a key matchel a keresési stringre.
Szerk2: foreach-csel megvan, meg lenne, de nekem most Linq-re lenne szükségem.
-
Keem1
veterán
Srácok, regex helpet szeretnék kérni.
Kaptam PHP oldalról egy csomó kulcs-érték párost (sok ezer db) így (minden új sorban, tehát a vége line feed):
[kulcs] => értékMost van egy ilyenem, amivel az érték megvan, de a kulcs sajna hiányzik:
System.Text.RegularExpressions.Regex expression = new System.Text.RegularExpressions.Regex(@"(\[[a-zA-Z]{1,15}\]\s=>\s(.*)[\r|\n|\r\n])");
var results = expression.Matches(pet);foreach (System.Text.RegularExpressions.Match match in results)
{
Console.WriteLine($"Ertek: {match.Groups[2].Value.Trim()}");
}Hogy kaphatnám meg a szögletes zárójelben lévő kulcsot is?
-
Keem1
veterán
válasz
martonx #9564 üzenetére
Hátöö...
1.)
Már lassan én is elvesztem a fonalat...Egyrészt nem értem ezt az ide-oda tilitolit, az egyikben ez benne van, a másikban meg valami más. Tudom, én vagyok megrögzött, régimódi, de én ha valami jól működik, azon nem változtatok (tehát én ezt a frameworkök közti váltást teljesen visszafelé kompatibilis módon oldottam volna meg).
Szóval eddig többnyire a .Net Framework 4.6, újabban 4.8-at használtam, mert ami nekem kellett, vagy kényelmesebben lehetett megoldani ebben (lásd a kókányolásnak nevezett console+window egy időben), vagy valami hibára futottam a Core 3.1-gyel, és miután sokadjára se sikerült megoldanom, visszaváltottam 4.8-ra, ahol az előbbi hibakeresés idejének egytizede alatt megoldottam.
2.)
Lehet hogy te kókányolásnak nevezed, én rugalmatlanságnak. Nem értem, mi a probléma egy hibrid programmal, ahol van konzolod és ablakod is. De ha elmagyarázod nekem, hogy mi ebben a kókányolás, akkor elfogadom. Például a goto-t kókányolásnak gondolom én is, hisz a kód átláthatatlan, a program működése meg kiszámíthatatlan lesz tőle.Nálunk amúgy aki még konyít a fejlesztéshez (értsd: cloudos, de tud programozni, viszont nem hivatásos programozó), az Pythonban csinálja ugyanezt. Én a Pythont nem ismerem, biztos jó, de én nem ismerem. Ott abszolút elfogadott ez a hibrid megoldás is. Ha kell, a console kikapcsolható, marad az ablak. De a console is hasznos néha.
-
Keem1
veterán
válasz
Alexios #9561 üzenetére
.... és #9562 fatal`
Nagyon baba
Elő is ásom a már retired (de a covid miatt le nem adott) régi céges laptopomat, amin tutira nincs ez a betegség (.Net Core) és kipróbálom rajta.
Ellenben... A régi .Netben volt olyan hogy átjárhatóság a wines és a console-os appok között. Tudtam ablakot nyitni console esetén és ablakos projectnél megjeleníthettem a console felületét is, ez az ilyen, általam írkált toolokat még kényelmesebbé tette. Ezt most nem sikerült megcsinálom. Működhet? Vagy ezt már felejtsem el?
A .Net lehet hogy őskövület, de rugalmas és mindent meg tudtam benne csinálni, ezért nehéz a váltás -
Keem1
veterán
-
Keem1
veterán
válasz
Alexios #9554 üzenetére
Nekem már ez is egész jól hangzik. Hónapok óta elfailelt a beépített update (VS 2019 Community), így most az installerrel tettem fel, meg leszedtem a .Net 5.0-t is. Először megszokásból a .Net FW között kerestem, de a Core-nál találtam meg végül
Tesztelgetem. Eddig .Net 4.6 volt szinte mindenre nálam (mostanában meg már inkább 4.8), meglátjuk, benne vannak-e mindazok az 5.0-ban, amire nekem szükségem van. -
Keem1
veterán
válasz
martonx #9552 üzenetére
"A .Net 5.0 az a .Net Core-ra épül, viszont több mindent átemeltek a régi .Net Frameworkből, vehetjük úgy, hogy összeolvadtak."
Tehát vehetjük úgy, hogy a jövőben a .NET és a Core összeolvadva akármilyen néven (felőlem maradhat .NET, Core vagy Jóskapista is) fog folytatódni úgy, hogy az új framework tartalmazza mindkettő korábbi platform motyóit?
Ilyen jó hírt is régen hallottam... ha igaz.Egyébként a Core valaha része lesz a Win10-nek, mint most a .NETFW? Írnék én Core toolokat, ha rajtam kívül senki nem tudja futtatni. Telepíteni bármit csak ezért senki nem fog, akkor keresnek más megoldást. Ilyenek az emberek. Ráadásul a Mono miatt a régi FW-s cuccok még egy kaputelefonon is elfutnak. A Core meg nagyon válogat az eszközök között (ARM procira gondolok).
-
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
Srácok, szerintetek a Windowsnak miért nincs már végre egy normális package managere? Nem, a Windows Store nem az... bár az ötlet jó, a megvalósítás egy vicc kategória. Csak UWP appok vannak, külső forrás nuku, azt se tudom, hogyan lehet ott appot publikálni (sehol semmi említés, ingyenes-e vagy sem), és szerintem jellemzően MS által preferált fejlesztők/projektek vannak jelen, és maga a store tárolja egyedül a csomagokat.
Nekem inkább a Winstore az Android Store itteni megfelelője, jellemzően mobilos appokkal (hol vannak már a Wines telefonok...). Miért nem kerülhet oda be egy régebbi app, ha tökéletesen működik? Ne kelljen már összevadászni az installert. No meg miért csak az általuk engedett appok mehetnek, külső források miért nem? A Win Store ötletben zseniális, megvalósításban nem hogy kapufa, inkább öngól. Ja, és lehetne különböző láthatóság: publikálok egy appot, akkor mondhatom azt, hogy bárki elérheti, vagy mint a YouTube esetén, privát (csak én, mondjuk gépeim között), vagy nem listázott (akinek a linkjét átküldöm, az elérheti). Nagyon kétlem, hogy ezek a jó gondolatok csak nekem jutnak eszembe, és az MS zsenijeinek nem...Én inkább valami olyasmire gondolnék, mint a Debian alapú linuxokban az APT. Nem csak egy forrás, hanem ami alá van írva, bármi lehet a forrás, akár mirror site is. Bármilyen app mehet, a megfelelő platformra valót installálja, az update is pofonegyszerű.
-
Keem1
veterán
Srácok, egy webclientes kódrészletet kéne kiegészítenem. Túl sok, bonyolult és fontos kód része, így csak a várt működéshez szükséges kóddal egészíteném ki.
Ami kéne, egy json stringet kéne az alábbiakkal együtt elküldenem POST-ként. UploadString jó lenne, de az alábbiakat átírni nem akarom. Muszáj ezzel kezdenem valamit, mert már működő kód.
GZipStream responseStream = new GZipStream(wc.OpenRead(page_url), CompressionMode.Decompress);
StreamReader reader = new StreamReader(responseStream);
ResponseHtml = reader.ReadToEnd(); -
Keem1
veterán
válasz
sztanozs #9534 üzenetére
A már sokat emlegetett céges team toolomat egészítem ki egy auto dark switcherrel.
Van egy cron lib, aminek a joblistje szabványos crontab stringet és a futtatandó metódust kéri.
Aztán start() és innentől már nem az én dolgom a jobok futtatása, megoldja ez a lib a háttérben külön threadekként.
A dark mode on és a dark mode off kerül bele két fix taskként, és ehhez generálom a cron stringet.
Erre két opció megy: kézzel megadja a delikvens (dark on xx:xx-kor, dark off yy:yy-kor) vagy automatikusan lekért földrajzi hely szerinti napkelte/napnyugtakor.
Ha ez elég lenne, egyszerű lenne a két cron string: "xx xx * * *" illetve yy yy * * *". De nem elég, a napokat is bele akarom mazsolázni: az utolsó csillag a days of week, ami lehet * (minden nap, ha vagy egyik nap sincs kiválasztva, vagy mind a hét be van kattintva), vagy pedig a napok sorszáma/rövidítése vesszővel felsorolva (1,2,5 vagy Mon, Tue,Fri).Dióhéjban ennyi.
* Igen-igen, tudom, hogy van egy csomó kész megvalósítás (még egyiket se próbáltam), de céges gépre nem tehető fel külső forrásból semmi.
-
Keem1
veterán
Köszönöm, megnézem ezt is
Időközben találtam egy megoldást, de félve merem leírni, mert eléggé gány
Lett egy ilyenem: List<DaysOfWeek> dayschecked
Aztán a DaysOfWeek.TryParse segítségével csekkolom a LINQ által kiköpött checkbox texteket, amik (optimális esetben) azonosak egy nap nevével. És a dayschecked végül így a kiválasztott napokat tartalmazza. A cron string készítésekor pedig a napok első 3 karakterét joinoljaGány... de működik. A cron elfogadja a napok számait és a napok 3 betűs rövidítéseit is. Ez utóbbit lovagoltam meg.
-
Keem1
veterán
A lista egy crontabszerűséghez lenne.
A lényege, hogy Monday=1, ... Sunday=7
A formon fenn vannak a napok, amikből készül a crontab string utolsó szekciója.
Az megvan, hogy ha a bekattintott elemek száma = 7, akkor ez * lesz. Ha pl. csak a hétfő, akkor 1. Ha hétfő-kedd, akkor 1,2. És így tovább.Szóval a cél az, hogy:
- ha a bekattintottak száma 0 vagy 7, akkor a(string)cronweek = "*"
. Itt mindegynek veszem, hogy mind be van-e kattintva vagy egyik sem, az a teljes hetet fogja jelenteni.
- ha 1-6 van bekattintva, akkor azok numerikus indexei kerüljenek bele vesszővel elválasztva, pl:(string)cronweek = "1,5,6"
Az adott stringemnek kötelezően vagy egy csillagnak, vagy 1-től 6-ig vesszővel elválasztott felsorolásnak kellene lennie a bekattintott checkboxokból azzal a megkötéssel, hogy ha mind be van kattintva vagy egyik se, akkor kötelezően csillag legyen.
Szóval ez a cél.
-
Keem1
veterán
Srácok, van a formon egy groupbox, azon pedig 7 db checkbox (vizuálisan beragadó gomb formájában). Ezek a hét napjait reprezentálják.
Addig eljutottam, hogy a bekattintott napokat (egyelőre a control neveit stringként) bedobom egy listbe:List<string> days = new List<string>(gbDays.Controls.OfType<CheckBox>().Where(chk => chk.Checked).Select(chk => chk.Name).ToList());
Nekem viszont olyan kéne, hogy a groupboxban betöltött indexük szerint (ahol az első checkbox a 0., az utolsó a 6.) kellene inkább egy List<int>. Feltéve ha egyáltalán van ilyen indexük.
Szerintetek?Közben rájöttem, hogy elvileg a fenti LINQ kódot lehetne továbbvinni úgy, hogy a mostani listában szereplő index kerülne bele a végső, int listbe. Ugye?
Pszeudo:
int[] dayindexes = ListOfControls().WhereChecked().ToList().IndexesFromSourceList().ToList();
Nem tudom, ez mennyire érthető így.
Szerk2: ez nem biztos hogy jó ötlet. Összezavarodtam
-
Keem1
veterán
válasz
sztanozs #9519 üzenetére
Valahogy úgy...
De semmi nem tart örökké, majd az ő tündöklésük is alábbhagy. Nekem sose kéne olyan IoT megvalósítás, ahol egy szem mobilappot tukmálnak.
Egyrészt miért csak mobil? Miért dedikált app? Desktop miért nem? Otthonlevés érzékelése? Sehol.. Napkelte-napnyugta? Sehol.Jobban preferálom az átjárható megoldásokat, mindenki azt használhatja, ami szimpatikus. Szerencsére sok ilyen van. Az én Smart Home-om felülete is alapvetően HTML5+JS. Gyors, szép, mobilon és desktopon is tökéletes. És érzékeli ha hazaértem, és lámpát gyújt. Meg sötétedés után kapcsol. De a többi hasonló is ilyen, pl. a Domoticz.
A saját megoldás egyedüli erőltetése beszűkült látásmódot és az innováció teljes hiányát jelenti.Na mindegy, befejeztem az offot.
-
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 -
Keem1
veterán
válasz
sztanozs #9515 üzenetére
Ó hogy azanyáját
Ha már tényleg fontos a platformfüggetlenség, vajon miért nem lenne jó egy full univerzális
Environment.DetectYourOSVersionWhateverYouUse()
metódus...Na mindegy, vannak dolgok, amik szerintem a józan ésszel ellenkeznek, de ez legyen az én bajom.
Köszönöm, így már működik
Amúgy azt se értem, hogy a Dark/Light módhoz a registry-t kell b*szatnom, egy univerzális (akár WinAPI) motyó helyett. Már látom előre a rögtönítélő őtiszteletreméltó McAfee ferde nézését a folyamatos registry b*zerálás miatt
-
Keem1
veterán
Srácok, életemben először kell Windows verziót megállapítanom (néhányan kértek tőlem egy scheduled dark/light theme switchert, amit érdekes módon a Windows még magától valamiért nem tud).
Viszont ez Windows verzió függő (ha valaki nem jó OS-t használ, akkor nem fog működni).
Ámde azEnvironment.OSVersion
nem jó Windows verziót jelez.Több gépen is tesztelve az output - ez bizony egy Windows 8:
Microsoft Windows NT 6.2.9200.0Míg valójában az én rendszerem:
Microsoft Windows [Version 10.0.19042.867]Mi az oka a bugnak?
-
Keem1
veterán
Srácok, mi a legjobb módja egy nem fix tartalmú JSON feldolgozásának?
A legjobb alatt értem, hogy tökéletes része legyen egy már meglévő robosztus programnak, ne f*ssa magát össze ha új entry kerül a JSON-ba vagy kerül onnan ki.A legjobb módja nyilván a szerializáció lenne, használtam már ilyet, de ott 1:1 megfeleltetés volt a JSON tartalma és a célobjektum között. Ez most nem ilyen, ez egy webes response, és a kutya füle se tudja, mikor mi kerül épp oda bele. A helyzetet bonyolítja, hogy multidimenziós a response. Nekem nem kell minden bele, de egy full háttérben futó eszközön menne (kijelzés nincs, log persze van), így nem túl szerencsés, ha egy-egy query alkalmával összehugyozza magát a program.
A Newtonsoft.Json library-t használom, valamennyire ismerem, de ott nem találtam erre biztonságos megoldást erre. A legegyszerűbb egy multidimenziós, bejárható objektum lenne, fogalmam sincs, létezik-e ilyen C#-ban. A dynamic nevű "adattípus"-t
ismeremhallottam róla, de ahogy tudom, eretnekség használni.Ha nem létezik ilyen, amit én keresek, megoldom máshogy (pl. felbontom a kapott JSON-t rész-objektumokra és szerializálom belőle azt, amire nekem szükségem van), csak ez egyrészt kicsit macerásabb, másrészt nehezebben vihető tovább, ha később kiderül, más adat is kell a response-ból.
Egyébként ha nem multidimenziós lenne, akkor valószínűleg egy dictionary-t használnék.
-
Keem1
veterán
válasz
Atomantiii #9485 üzenetére
Nem fogod megbánni
Én még egy korai verzióján tanultam meg a C# alapokat (úgy, hogy már egyéb programnyelvből - delphi, php - voltak alapjaim).
Bár nem vagyok programozó, sőt, de C#-ban egy komplett kis utazási irodai rendszert készítettem úgy 5-6 év alatt, webes szinkronnal, mögöttes MySQL adatbázissal, 3-4 alkalmazott egyidejű használatára. Működött, de azóta lettek jobbak a piacon, különben még ma is működne, és ha én is ott dolgoznékAz jó, ha a konzolos alapok már megvannak, sőt, az is, ha esetleg korábbról más programozási nyelvi alapok is vannak, hisz akkor sokkal könnyebb egy új nyelvet elsajátítani.
Nézd, csak hogy tudd, nem vicceltem
-
Keem1
veterán
válasz
Atomantiii #9483 üzenetére
Ez esetben nem ártana egy C# alapok könyvet forgatni, ugyanis a *.designer.cs fájlokat az editor módosítja, nyilván a form vizuális módosításakor felülírja amit kézzel bele szerkesztesz.
Ez [link] egy elég jó alapot adó könyv, ha magyarul kellene ajánlani valamit.
Ja, és még egy jó tanács: egy új nyelv elsajátítását nem GUI programmal kezdjük, hanem konzolossal. Ha már mennek az alapok, alap programozási dolgok, objektumok, iterációk, öröklődés, streamek, stb, jöhet a gui
Ez azért is fontos, mivel akkor érsz el jó eredményt, ha tudod, mit csinál a vizuális editor egy gomb felhelyezésekor. Hisz mögötte az is kód. Akkor tanultad meg jól, ha már megy akár notepadból is egy form és a rajta lévő controlok felrakása kódból. -
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
sztanozs #9411 üzenetére
Most egyelőre ez így műxik, átírtam egy registry értéket, így már IE 11 az embedded browser. Néha még megpattint egy-egy javascript hibaüzenetet, de működik. Megy amúgy is, csak idegesítő lekattintani egymás után vagy 8-10 db errort.
A dolognak nincs akkora súlya hogy tovább agyaljak rajta, egyelőre így marad.
Köszi srácok, mindenkinek.
-
Keem1
veterán
válasz
martonx #9409 üzenetére
Persze, de a kollégákban nem ébresztene bizalmat, hogy az SSO-jukat elkéri a programom, ami aztán bármit kezdhet vele, akár tárolhatja is.
Nyilván ha akarnék, ezzel a módszerrel is vissza tudnék élni, de egy fokkal bizalomgerjesztőbb, hogy a szokásos login page jön be, jobbklikk-properties és látják a megszokott https://blablabla.com/login.jsp-t.
Ezért az ötlet az OAUTH2-féle login, ahol csak az access tokent (jelen esetben a cookie-ból) megkapva mehet minden tovább. -
Keem1
veterán
válasz
martonx #9406 üzenetére
Az ám, csak kell a login page, és utána a kapott cookie. A logina adataimat meg be kéne írni a webes login oldalon.
Nem elegáns, de a jobb megoldás megtalálásáig olyat csináltam, hogy a registryben egy dword-öt átírtam, így most IE 11 az emulált browser. A script hibák már elmentek.Amúgy nekem az az érzésem, hogy ez a WebBrowser control igazából legacy. Ami azért érdekes, mivel szerintem ilyenre sok esetben lehet szükség. Az Android erre kiváló példa: korábban ott is custom WebViewer volt, ami merőben más volt mint az általad böngészésre használt bármelyik webböngésző. Aztán ugye a WebKit alapú lett, amivel már gyakorlatilag bármelyik weboldal ugyanúgy működik, mintha a Chrome-ot használnád.
Az Androidos appok jelentős része használja 3rd party loginhoz. Pl. én se szívesen adom meg a Google accom adatait egy custom űrlapon, hanem teszem inkább a Google-nek, aki majd tájékoztatja a hívó weboldalt/applikációt arról, hogy sikerült-e a login, és amilyen adatokra neki szüksége van.
Nyilván egy ilyen embedded browserrel nem szörfölni akarok a neten, hanem ugyanilyen loginhoz akarom felhasználni. Ez szerintem fontos és nem hinném, hogy csak én hiányolom.
Most hogy megvan a cookie, már megy minden, a httpclientet simán felparaméterezem, még a user agentet is testre szabom. Cookie élettartam, stb. Ha a webbrowser is ugyanazt tudná, mint a httpclient (csak nyilván vizuális felülettel együtt), akkor nem lenne itt semmi gond.
-
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
-
Keem1
veterán
Voltaképp megoldottam, a WebBrowser built-in client képes rá, de sztem IE 6.0 alapokon nyugszik és egy modern page egyrészt fosul néz ki rajta, másrészt a rengeteg jQuery, Javascript dobálja a hibákat.
Pedig van a gépemen Edge is, meg lehetne válogatni böngészőmotort Chrome, Firefox közül is.Ezekre valakinek megoldás? Vagy másik engine dobja a login page-et, vagy valahoy letiltani a kb. 15 db JS hibát?
De a lényeg: bent vagyok SSO-val és megvan a token is.
-
Keem1
veterán
Srácok, szokásos céges tool...
Adott egy olyan access, ahol céges SSO-val kellene beloginolni, pl. mint amikor 3rd party site átdob a Google loginra. A dolgot úgy képzeltem el, hogy valamilyen, akár egy beépített, akár külső böngészővel behozni a login oldalt, ahol a user beloggol, majd ha sikerült a login, ebből kéne egy session ID-t elkapni a cookieban. Ezzel már menni fog az, amit voltaképp megvalósítanék (most is megy, de nagyo bénán, a Chrome dev toolsból kell kimásolni).Azt nem tudom, hogy induljak neki. Van valami beépített browser, használjak külsőt és számomra egyelőre ködös módon szedjem ki valahogy a tokent?
Lenne javaslatotok, merre kezdjem?
Mielőtt valaki céges biztonságot kritizálná, gyorsan hozzá kell tennem, hogy csak VPN-en megy, anélkül a login oldal 404-et dob.
-
Keem1
veterán
válasz
Dexter74 #9390 üzenetére
Kifutottam a szerkesztési időből, de ez kipróbálva, 100% működik. Lehet ezt még variálni, van hozzá helper (amivel akár még egyszerűbb), de ez egy teljesen alap és tutira működő megoldás, akár GUI-s, akár console-os appról legyen szó.
Azt azért hozzáteszem, hogy form-os app esetén biztos van szebb, elegánsabb, jobb megoldás, de én console és webappot használok, formra nincs szükségem.
string connstr = "Server=yourmysqlserver;Port=3306;Database=yourdatabase;Uid=yourmysqluser;Pwd=yourmysqlpass";
using (MySqlConnection conn = new MySqlConnection(connstr))
{
conn.Open();
using (MySqlCommand cmd = new MySqlCommand("SHOW TABLES;", conn))
{
MySqlDataReader reader = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(reader);
// Ha van DataGrid a window-n (mert nem console app), akkor még:
dataGridView1.DataSource = dt;
}
conn.Close();
}
-
Keem1
veterán
Egyetértek, én is használok REST API-t, persze éles rendszeren, de eszembe se jutna ilyesmi. Szerveroldali az access check, ráadásul https csatorna, de emellett a kliens nem küld még plain text passwordöt sem, csak hash-t.
És ez semmi NASA vagy bank vagy ilyenek, hanem webshop.
-
Keem1
veterán
-
Keem1
veterán
Srácok, ha .NET Core projectet szeretnék Linux-ARM-re publish-olni, ezt kapom:
A probléma gyökere, ha ezt a MySQL NuGet package-et telepítem (akár úgy, hogy a kódban semmi hivatkozás nincs hozzá, még a using által sem, tehát csak szimplán telepítem hozzá).
A hivatkozott fájlban semmi érdemi infó nincs. Ha ténylegesen használatba veszem a motyót, és nem publish-sal, hanem simán felmásolással a céleszközre teszem, akkor a dotnet program.dll paranccsal olyan szépen futtatható, hogy a MySQL is gyönyörűen megy. Tehát nem inkompatibilis, vagy bármi hasonló, mert működik, egyszerűen a publish-nál valami miatt elvérzik.Azért lenne jó, ha így sikerülne platform-dependent módon fordítani, mert akkor a dotnet program.dll helyett sima Linuxos paranccsal (./program) menne (és megy is, ha kiszedem a MySQL package-et). Ja, és megy az SQLite Nuget package-dzsel, meg sok más egyébbel is, csak ezzel nem.
Hogy találhatnám ki, hogy mi a baja?
Szerk: továbbmegyek, a "Portable" opción kívül semmi mással nem megy. Se win64, se win86, se linux64, semmi. Csak Portable
-
Keem1
veterán
válasz
Tomi_78 #9342 üzenetére
Ahogy látom, nem csak C#, hanem úgy általában objektumorientált programozási alapok is csiszolásra szorulnak. Én nem vagyok tanár, és a topik témája is bőven kimerül a tanításban, de én a következőket javasolnám neked:
- rengeteg jó forrás van (leginkább angol nyelven), mégis egy egyszerű, könnyen tanulható és magyar nyelvű könyvet javasolnék: Sipos Marianna: Programozás élesben - C# (megadja a kezdő löketet, az abszolút alapokat)
- kezdésnek én WinForms helyett console-ban gyakorolnék, alapoznék. Ha ez flottul megy, akkor jöhet az ablakozás. Az ablakozás mindaddig várhat, míg a nyelv alapjait meg nem ismered: keywordök, objektumok, névterek, metódusok, láthatóság, öröklődés, stb.Tényleg csupa jó tanácsként szánom a fentieket, és elnézést, ha tévedtem, rosszul mértem fel, hogy nem csak C#-ban, de úgy alapból OO programozásban is abszolút kezdő vagy.
Amúgy meg a C# szerintem egy szuper nyelv: egyszerű, könnyen kezelhető, de mégis sokoldalú. Főleg a rengeteg forrásanyag, tutorial, 3rd party libraryk miatt. -
-
Keem1
veterán
Srácok, Linq segítséget kérnék.
Ez így az objektumot adja vissza:
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList.Where(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).Select(ip => ip.ToString()).ToList();
Addig jó, hogy ha lehagyom a végéről a selectet, akkor ugye az eredmény List<IpAddress>, viszont nekem List<string> kellene, de nem az ojjektum nevéről
-
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
Ok meggyőztetek. Viszont elakadtam, még egy egyszerű tutorial se megy. Windowson oké, Linuxon nem. Mutatom, légyszi segítsetek.
Úgy néz ki, hogy a kis projektem minden egyéb eleme megy Linuxon is, csak a service nem működik. Amúgy tök jó ötlet volt megszabadulni 41 warningtól (unused variable) meg kikukáztam pár, már sehol nem használt metódust is
Valahogy ezt a nyamvadt service-t kéne megszülni. Az átoperálás után Windowson az eredeti service .Net Core 3.1-en is megy, és megy az alábbi példa is. Linuxon egyik se.
Ja, és console appként Linuxon is kiválóan megy, az SQLite is
Csak a service nem...Eredmény Linuxon ( .Net Core 3.1)
Unhandled exception. System.PlatformNotSupportedException: ServiceController enables manipulating and accessing Windows services and it is not applicable for other operating systems.
at System.ServiceProcess.ServiceBase..ctor()
at Testing.LoggingService..ctor()
at Testing.Program.Main(String[] args) in E:\..\Program.cs:line 39
Félbeszakítva -
Keem1
veterán
válasz
martonx #9306 üzenetére
Nem, Linuxon nem ezt a path-t használtam
Viszont megvan a hiba, nem a Microsoft.Data.Sqlite.Core kell, hanem a Microsoft.Data.Sqlite. Úgy műxik.
Vannak névkonvencióbeli eltérések a hivatalos verzió és a Microsoft sajátja között, azt már észrevettem. Na de ez a hülyeség, hogy nem mondhatom meg, hogy a DB-m milyen verziójú, ez nonszenszDe úgy tűnik, ezzel tényleg működik ARM alatt.
No offense, de ha már itt tartunk. Mi az a fő indoka annak, hogy a(z elvileg még maintained) .Net xxx használata eretnekségnek minősül, és ami nincs Core alatt, az felejtős? Tehát mi az az ok, ami miatt a Core mindenképp használandó, más meg kerülendő?
Én úgy tudtam, az adott programnyelv, környezet csak egy eszköz, semmiképp sem határozza meg a végtermék minőségét. Akár lyukkártyával is megoldhatnám az adott feladatot - más kérdés, hogy meg tudom-eIgen, tudom, a Core eleve opensource-nak, végre platformfüggetlennek készült (más kérdés, hogy eredetileg a .Net is, a Java babérjaira akart törni a 2000-es évek elején), de miért gáz jelenleg .Net-et használni helyette, ha egyébként tökéletesen működik és fejlesztik is?
-
Keem1
veterán
válasz
Alexios #9301 üzenetére
Köszönöm a tanácsot, de úgy néz ki, ez is elfailel, bár ez más miatt.
Már akkor elkezdtem ijedezni, mikor még Windows alatt is belebotlott a bicskája a connection stringben átadott "version" paraméterben, aminek eddig sem PHP, sem .NET 4.5, sem Java alatt nem volt baja
Ez az én kis teszt kódom SQLite teszteléshez:
using (SqliteConnection conn = new SqliteConnection($@"Data Source=F:\chinook.db;Version=3"))
{
conn.Open();
using (SqliteCommand cmd = new SqliteCommand("SELECT `name` FROM sqlite_master WHERE type='table';", conn))
{
SqliteDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
System.Console.WriteLine(reader.GetString(0));
}
}
}
És Linux alatt ezt kaptam:
Unhandled exception. Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 14: 'unable to open database file'.
at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc, sqlite3 db)
at Microsoft.Data.Sqlite.SqliteConnection.Open()
at Program.Main(String[] args) in ...\Program.cs:line 24 -
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
martonx #9297 üzenetére
Ezen már sokat gondolkodtam, de sok Nugetes motyóm nem kompatibilis vele. Pl. az SQLite (System.Data.Sqlite) sem, ARM-re nem volt 4.5-re sem, de oda simán fordítottam egyet az eszközön forráskódból. .Net Core-ra viszont eddig még nem sikerült.
(#9298) joysefke:
A Task-on már én is agyaltam, de amikor próbálkoztam, valahogy nem jött össze. Már nem emlékszem, hogy egy statikus metódussal gyűlt-e meg a baja, vagy azon aztán átlendültem és máshol akadtam el. Aztán végül a Bgwk lett az első, ami működött.Sajnos nem vagyok programozó, csak egy lelkes amatőr, így ha valahol elakadok, hajlamos vagyok rövidebb utat választani
Viszont a C#-ot szeretem, így néha olyan célra is ezt választom, ami szkriptnyelvből, Powershellből is megoldható lenne (melyekhez még a C#-hoz képest is kevésbé mozgok otthonosan).
-
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.
Ú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!
- Milyen billentyűzetet vegyek?
- Komolyan ráállt a csúcs-GeForce-ok átalakítására Kína
- VoLTE/VoWiFi
- Kínai és egyéb olcsó órák topikja
- gban: Ingyen kellene, de tegnapra
- iPhone topik
- Samsung Galaxy A56 - megbízható középszerűség
- Milyen videókártyát?
- OpenWRT topic
- Megérkezett a Google Pixel 7 és 7 Pro
- További aktív témák...
- Okosóra felvásárlás!! Samsung Galaxy Watch 6, Samsung Galaxy Watch 7, Samsung Galaxy Watch Ultra
- i7 Gamer konfig bővítési lehetőségekkel! - GARANCIÁVAL
- Szinte új, minőségi, állítható ritkítóolló
- Wilbur Smith könyvek (15 db) egyben
- LG 27UL550-W - 27" IPS / 3840x2160 4K / 60Hz 5ms / HDR10 / AMD FreeSync
Állásajánlatok
Cég: FOTC
Város: Budapest