Szanowny Użytkowniku,
Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.
Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.
Administrator Serwisu Forum PC LAB informuje, że:
- Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
- Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
- Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
- Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
- Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności
Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.
-
Liczba zawartości
785 -
Rejestracja
-
Ostatnia wizyta
Odpowiedzi dodane przez Matt91111
-
-
Najrozsądniej wygląda Vivobook, tylko to CPU mnie martwi
CytatWitaj, Macbook Air/Pro 13,3" są już dostępne z procesorem M2 i lada chwila ma pojawić się 14-stka; Apple MacBook Pro M2/8GB/256/Mac OS Silver 7499 zł
Jak wyżej napisał @manuelos, nie opłaca się spoglądać na M2 póki co, zresztą w tej samej konfiguracji 16/512 koszty są zbliżone do M1 14", który jest sporo sensowniejszy (ekran, magsafe, przepustowość ssd, wsparcie dla > 1 ekranu zew)
Teoretycznie wszystko z integrami i tak leży przy grach, a to w sumie główny powód aby nie brać maca
Nie mniej dzięki
-
Zastosowanie: Webdev, okazjonalna obróbka grafiki 2D, czasem gry (online FPSy, RTSy, nic wybitnie wymagającego)
Wymagania:
- względnie dobra klawiatura
- ekran minimum 2K oraz sRGB 100%
- waga: im lżej tym lepiej, idealnie 1,6kg - max 1,8kg
- czas pracy na baterii 4h-5h+ (średnio obciążony)
- Thunderbolt / DisplayPort
- Nie może świecić jak choinka w boże narodzenie
("gameingowe" odpadają)
- 16 / 512 lub więcej
- idealnie 13" / 14" max 15"
- obsługa 2 monitorów zewnętrznych
Budżet (planowo max): 11k
Da się znaleźć coś takiego z windą? Ubezpieczenie od obijania laptopa to duży "+" (nie wliczone w budżet)
Na razie najsensowniejsze co znalazłem to: Macbook Pro 14" i Surface Laptop Studio
Surface laptop studio były idealny gdyby nie CPU który delikatnie mówiąc nie powala, szczególnie przy odłączonym zasilaniu. Konstrukcyjnie też wygląda co najmniej dziwnie, a po doświadczeniach z zawiasami z tej serii urządzeń to zapewne jest kwestią czasu aż coś chrupnie.
Na macu będę skazany na mocno przestarzały desktop do grania
Budżet jest lekko elastyczny chociaż wolałbym taniej niż obecny pułap
Z góry dzięki
-
Czy rok produkcji jest ważnym czynnikiem przy zakupie używanego GPU? Czy nie warto się tym sugerować, bo eksploatacja karta i OC mają dużo większe znaczenie dla żywotność?
Rozważam R9 270X oraz RX 560, 560 jest sporo młodsza stąd pytanie czy powinienem się tym sugerować?
Wiadmo, że zakup używki nigdy nie jest pewny, ale fajnie by było jakby z rok podziałała do czasu aż ceny się trochę ustabilizują
Z góry dzięki
-
Godzinę temu, sabaru napisał:Czy ten spis musi wypełnić każdy z domowników czy tylko jedna osoba, która jest właścicielem domu?
Wychodzi na to, że można podać informację za domownika(ów) i jest on wtedy zwolniony z wpisu, aczkolwiek trzeba wypełnić za niego kwestionariusz.
https://samorzad.infor.pl/wiadomosci/5232631,Narodowy-Spis-Powszechny-GUS-odpowiada-na-pytania.html
CytatDopuszcza się możliwość udzielenia odpowiedzi za osoby zamieszkałe w danym mieszkaniu – za ich zgodą – przez dorosłą osobę również zamieszkałą w tym mieszkaniu. Osoba ta podaje informacje o mieszkaniu i wszystkich osobach w nim zamieszkałych, ustala skład osobowy mieszkania, określa relacje rodzinne pomiędzy osobami oraz udziela odpowiedzi na pytania zawarte w kwestionariuszu mieszkaniowym i osobowym.
-
W dniu 19.05.2021 o 06:54, NieUmiemProgramowac napisał:robisz to samo co ja tylko piszesz więcej kodu bo ExpandoObject to tak naprawde dictionary
No i nie odwołujesz sie do obiektu innych osób tak osoba.osoby.Mariusz tylko osoba.osoby["Mariusz"], a OP chciał inaczej.
Zgadza się, tylko, że taka implementacja jest pozbawiona sensu, nieczytelna i błędy wyjdą na wierzch dopiero w trakcie działania programu, co szczególnie dla osoby początkującej może być problematyczne.
CytatI czemu robisz protected na setterze? Przecież nic nie dziedziczysz. I chyba ta properta powinna być private a nie public nie? Nie używasz jej nigdzie na zewnatrz
Rozpędziłem się, o ile dobrze pamiętam to zrobiłem copy/paste z poprzedniego przykładku
CytatDo tego używasz metody Add z dictionary, co jeśli ktoś stworzy dwie osoby o tym samym imieniu? Podpowiem: ArgumentException
Wypadało by zacząć od tego, że klucz Dictionary powinien wskazywać na unikalną wartość, którą na pewno nie jest imię, wypadało by użyć tutaj np. numeru pesel/jakiegokolwiek unikalnego id osoby, bazowałem na kodzie z twojego przykładu, aby pokazać inną możliwość implementacji.
Cytatużyj albo string.Format (które jest już przestarzałe) albo najlepiej po nowemu $"tekst w stringu {nazwaZmiennejZTekstem}"
Zgadzam, się nie mniej uważam, że na potrzeby przykładu nie ma to znaczenia.
Z "Tuplami" spoko sprawa, za pewne będę używał ich teraz w ten sposób
-
W dniu 14.05.2021 o 06:37, NieUmiemProgramowac napisał:Oczywiście, że to anty wzorzec, pytanie było czy mozna i jak coś takiego zrobić.
Choćby tak:
class Osoba { public string Imie { get; set; } public int Wiek { get; set; } public Dictionary<string, Osoba> Osoby { get; protected set; } public Osoba(string imie, int wiek) { Imie = imie; Wiek = wiek; } public static Tuple<Osoba, Dictionary<string, Osoba>> CreateOsoba(string imie, int wiek, Dictionary<string, Osoba> osoby) { var osoba = new Osoba(imie, wiek); //używa kolekcji podanych osób jako źródło, lub tworzy nową osoba.Osoby = (osoby != null) ? new Dictionary<string, Osoba>(osoby) : new Dictionary<string, Osoba>(); osoba.Osoby.Add(imie, osoba); //dodaje najnowsza osobe return Tuple.Create(osoba, osoba.Osoby); } } class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); var osobaWrapper = Osoba.CreateOsoba("jan", 30, null); var osoba = osobaWrapper.Item1; var listaOsob = osobaWrapper.Item2; } }
Albo jeszcze prościej:
class Osoba { public static Dictionary<string, Osoba> Osoby { get; protected set; } static Osoba() { Osoby = new Dictionary<string, Osoba>(); } public string Imie { get; set; } public int Wiek { get; set; } public IReadOnlyDictionary<string, Osoba> osoby; public Osoba(string imie, int wiek) { Imie = imie; Wiek = wiek; osoby = new ReadOnlyDictionary<string, Osoba>(Osoba.Osoby); Osoby.Add(imie, this); } } class Program { static void Main(string[] args) { var osobaJan = new Osoba("jan", 30); var osobaPawel = new Osoba("pawel", 33); var osobaMateusz = new Osoba("mateusz", 22); Console.WriteLine("wiek mateusza (pytama o to jana): " + osobaJan.osoby["mateusz"].Wiek); } }
W obu przypadkach kod jest czytelniejszy a błędy łatwiejsze do ustalenia i spora ich część będzie widoczna na etapie kompilacji.
-
14 godzin temu, NieUmiemProgramowac napisał:Może coś w tym stylu dla c#:
class Osoba { private static ExpandoObject _osoby { get; } = new ExpandoObject(); public string Imie { get; set; } public int Wiek { get; set; } public dynamic Osoby => _osoby; public Osoba(string imie, int wiek) { Imie = imie; Wiek = wiek; ((IDictionary<String, Object>) _osoby)[imie] = this; } } class Program { static void Main(string[] args) { var osobaMain = new Osoba("Hehe", 102); for (int i = 0; i < 5; i++) { new Osoba($"Stefan{i}", i); } Console.WriteLine($"Imie: {osobaMain.Osoby.Hehe.Imie}, Wiek:{osobaMain.Osoby.Hehe.Wiek}"); Console.WriteLine($"Imie: {osobaMain.Osoby.Stefan0.Imie}, Wiek:{osobaMain.Osoby.Stefan0.Wiek}"); Console.WriteLine($"Imie: {osobaMain.Osoby.Stefan1.Imie}, Wiek:{osobaMain.Osoby.Stefan1.Wiek}"); Console.WriteLine($"Imie: {osobaMain.Osoby.Stefan2.Imie}, Wiek:{osobaMain.Osoby.Stefan2.Wiek}"); Console.WriteLine($"Imie: {osobaMain.Osoby.Stefan3.Imie}, Wiek:{osobaMain.Osoby.Stefan3.Wiek}"); Console.WriteLine($"Imie: {osobaMain.Osoby.Stefan4.Imie}, Wiek:{osobaMain.Osoby.Stefan4.Wiek}"); Console.ReadLine(); } }
Mnie to wygląda na anty wzorzec, nie mówiąc o tym, że dla osoby nie znającej C# to wprowadzi więcej zamieszania niż przyniesie pożytku
-
1
-
-
31 minut temu, Áltair napisał:Ciekawi mnie to zdanie: "Dwie trzecie osób niechętnych szczepieniom mówi, że nie zmieni zdania, nawet gdy po pierwszych miesiącach potwierdzi się, że szczepionka jest bezpieczna i skuteczna." A mogło się wydawać, że niechęć przed szczepieniem wynika wyłącznie ze strachu przed nieznanym (nowym). Wtedy normalne by było, że ludzie nie chcieliby się szczepić za pieniądze czy bony na zakupy.
A mało to się narobiło specjalistów od wszystkiego wciskających wszystkim swoje teorie/produkty/zamienniki? A, że ludzie nie potrafią weryfikować informacji, to niestety jest jak jest
-
23 godziny temu, WebCM napisał:Niektórych nie stać na ogrodzenie i w tym też jest problem.
Ale na utrzymanie psa stać? Zawsze można w domu trzymać
-
Schematy blokowe, tam odszukaj start, stop, if oraz switch i skleisz z tego schemat blokowy
E: zakładam, że rozumiesz kod programu
-
No to niestety jest możliwe, win 7 nie wspiera bodajże aplikacji z Microsoft Store (UWP), reszta rzeczy powinna działać (Forms/WPF/Web ASP Net Framework/Web ASP Net Core)
-
"VS nie kompiluje w tym systemie" co to konkretnie oznacza?
co chcesz konkretnie skompilować?
jakie błędy dostajesz?
-
-
Więc tak:
- Chcąc zainicjować tablicę potrzebujemy znać jej "wymiary":
czyli musimy odczytać ilość wierszy oraz kolumn.
Ilość elementów w wierszu to:
string matrix1String = Textbox1.Text; //macierz w textboxie: // 2 8 10 // 5 7 9 // 3 5 23 var matrix1RowLenght = matrix1String .Split('\n') //matrix1String.Split('\n') - zwróci: //wiersze[0] = ["2", "8", "10"]; //wiersze[1] = ["5", "7", "9"]; //wiersze[2] = ["3", "5", "23"]; .First() //zwróci z tablicy wyżej element o indeksie "0": //["2", "8", "10"]; .Split(' '); //zwróci: //element[0] = "2"; //element[1] = "8"; //element[2] = "10"; .lenght; //zwróci ilość elementów w tablicy wyżej czyli 3 //pomijamy tu już oczywiście sprawdzenie czy wszystkie wiersze mają tyle samo elementów
Ilość kolumn to:
//cały czas ta sama macierz: //macierz w textboxie: // 2 8 10 // 5 7 9 // 3 5 23 var matrix1ColumnLenght = matrix1String .Split('\n') //matrix1String.Split('\n') - zwróci: //wiersze[0] = ["2", "8", "10"]; //wiersze[1] = ["5", "7", "9"]; //wiersze[2] = ["3", "5", "23"]; .lenght; //zwróci 3i odpowiednio wymiary są w zmiennych:
"matrix1ColumnLenght" oraz "matrix1RowLenght"
Chcąc się odwołać do konkretnej wartości wystarczy:
var elements = matrix1String.Split('\n'); //inicjalizacja tablicy // var tablicaIntow = // ... for(var i = 0; i < matrix1RowLenght; i++) { for(var j = 0; j < matrixColumnLenght; j++) { //a tutaj upychasz tablicaIntow[i, j] = int.Parse(elements[i, j]); } } -
No cóż jak wykładowca każe to nie ma rady
. Trzeba na tablicach zrobić.
String.Split() to funkcja która wykonuje operację bezpośrednio na zmiennej typu string:
string matrix = Textbox1.Text; string[] podzielone = matrix.Split(...);Więcej o string.Split() https://docs.microsoft.com/en-us/dotnet/csharp/how-to/parse-strings-using-split
-
4 minuty temu, Kyle_PL napisał:Zainteresowałeś mnie
Co byś teraz polecił zamiast WPF? (i jakie to ma zalety wzgl. WPF)
Electron, kod jest super przenośny. Wiadomo, że jeżeli się zna WPFa i pisze tylko pod windowsa to nie ma jakiejś dużej konieczności przesiadki, ale Electron + downolny popularny framework frontendowy to już jest chyba nowy trend. Wiadomo, że ma to pewne ograniczenia i sporo aplikacji wykorzystuje (tak gdzie to konieczne) natywne biblioteki pisane pod dany OS (c/c++) + Electron.
-
1
-
-
@Auberon najwięcej sensu pewnie miało by stworzenie "extension class" ale celowo nie chcę komplikować autorowi jeszcze bardziej zadania
Ja uważam, że lepiej jest wykorzystać MatrixField z kilku powodów:
- łatwiejsze zarządzanie obiektami z listy, nie musimy deklarować wielkości tablicy
- możliwość wykorzystania LINQ
- możliwość "dopisania" do klasy matrix metod typu Add(...) oraz wykonywanie sprawdzeń i walidacje macierzy
- notacja tablic w C# to jest tragedia
Nie mniej dla autora to faktycznie chyba trochę za wcześnie i będzie musiał zostać z tablicami
2 minuty temu, Kyle_PL napisał:Windows Forms teraz cisną w szkołach? Technologia sprzed 20 lat, która nie nadaje się do użytku na wyświetlaczach HiDPI. Niech ktoś uświadomi Twojego nauczyciela/doktora/profesora by się zainteresował C# WPF z XAML (nie ma problemu z wyświetlaniem).
Idzie się przyzwyczaić do WPF

Ja bym powiedział, że teraz już WPF ma coraz mniej sensu (a co dopiero formsy), ale reformowanie wykładowców to ciężka sprawa
-
@michalaf wrzuć co masz, jeżeli IDE wyświetla Ci błędy to daj znać jakie.
Ja bym się tego nie podejmował bez poznania zasad obiektowości, wykładowca nakierował was chociaż w jaki sposób do tego podejść?
-
Ogólne uwagi do kodu:
Używaj komentarzy aby kod był czytelny:
int[,] matrix = new int[,] {{5, 6}, { 5, 6} }; string matrixString = ""; //Formatujemy macierzy for (int i = 0; i < matrix.GetLength(0); i++) { for (int j = 0; j < matrix.GetLength(1); j++) { matrixString += matrix[i, j].ToString(); //konwertujemy int na string matrixString += " "; } matrixString += Environment.NewLine; } textBox1.Text = matrixString; //przypisujemy wartość textboxa
Wstawiaj całe metody(funkcje):
void Oblicz_OnClick(...) { //.... }Teraz do tego kodu który wrzuciłeś:
- Umieszczasz gotowe macierze z poziomu kodu, to nie zadziała chcąc je przeczytać z "textboxa"
- StringToMatrix.FromString() jest niepubliczny (moja wina
tak jak mówiłem nie testowałem)
- Sugeruję użyć funkcji String.Split('\n') oraz String.Split(' ') do iteracji wartości macierzy tak jak zrobiłem to w StringToMatrix
Ponadto: dobrze by było umieścić w klasie matrix możliwość odwołania się do konkretnego elementu:
public Class Matrix { readonly List<MatrixField> fields = new List<MatrixField>(); public List<MatrixField> Fields => fields; //proste sprawdzenie czy element o danym x, y nie istnieje już w macierzy public bool Contains(int x; int y) { return fields.Where(field => field.X == x && field.Y == y).lenght > 0; } public int GetAt(int x; int y) { if(!Contains(x, y)) throw new InvalidOperationExceptin($"Macierz nie zawiera elementu na: X ${x} Y ${y}"); return fields.Where(field => field.X == x && field.Y == y).First(); } }
I kilka pytań kontrolnych:
Wiesz jak działają metody (funkcje): podstawowe typy danych które zwracają, paramatery?
Wiesz jak działają klasy, dlaczego się ich używa, konstruktory, dostępność (public, protected, internal, private)?
Sposób użycia z mojego przykładu:
var matrixString1 = Textbox1.Text; var matrix = StringToMatrix.FromString(matrixString1); var matrixResult = new Matrix(); //wykonywanie działań w moim podejściu for(var i = 0; i < matrix.Fields.Max(field => field.X); i++) { for(var j = 0; j < matrix.Fields.Max(field => field.Y) j++) { var wartosc = matrix.GetAt(i, j).Value; //wartosc elementu na x, y //dzialanie // var nowaWartosc matrixResult.Add(new MatrixField(i, j, nowaWartosc)); } }I dopiero matrixResult trzeba by było sformatować tak jak Ty to zrobiłeś i umieścić w wynikowym textboxie.
Operator =+ w przypadku string służy do dopisania do już instniejącej zawartości:
string zdanie = "Ala";
zdanie =+ " ma";
//wartosc zmiennej zdanie: "Ala ma"
zdanie =+ " kota";
//wartosc zmiennej zdanie: "Ala ma kota"
-
Sęk w tym iż w moim przykładzie "MatrixField" jest pojedynczym polem co będzie wymagało zmiany podejścia w obliczeniach, alternatywnie kod StringToMatrix.FromString(...) można by przerobić tak aby na początku zainicjalizować tablicę a później przypisać do niej wartości. Kod który dzieli Ci stringi na rzędy w sumie już masz w tej metodzie. Jedyne co trzeba zrobić to pobranie ilości wierszy i kolumn aby zainicjalizować tablicę.
StringToMatrix.FromString(tekst) powinien wypluć Ci macierz z dowolnego stringa, obojętnie czy jest to pole tekstowe czy cały plik.
-
Chcąc się jak najmniej bawić z UI to pewnie trzeba by było zrobić 4 kontrolki:
Textbox - macierz 1
Textbox - macierz 2
Textbox - macierz 3 (wynikowa)
Button - Policz
Macierz była by pobierana ze stringa i wyznaczana przez znaki nowej linii oraz spacji.
Poniżej prosty kod (na brudno pisałem, więc nie wiem ile z tego działa
) na sparwsowanie macierzy z textoboxa (texbox musi mieć możliwość wstawiania znaku nowej linii)
public Class MatrixField { public MatrixField(int x; int y; int value) { X = x; y = y; Value = value; } public int X { get; private set; } public int Y { get; private set; } public int Value { get; private set; } } public Class Matrix { readonly List<MatrixField> fields = new List<MatrixField>(); public List<MatrixField> Fields => fields; //proste sprawdzenie czy element o danym x, y nie istnieje już w macierzy public bool Contains(int x; int y) { return fields.Where(field => field.X == x && field.Y == y).lenght > 0; } } public static Class StringToMatrix { static Matrix FromString(string @string) { var matrix = new Matrix(); var rows = @string.Split('\n'); //dzieli stringi przy użyciu nowej znaku linii for(var i = 0; i < rows.lenght; i++) { //wartosci wiersza var row = rows[i].split(' '); //dzieli stringi przy użyciu spacji for(var j = 0; j < row.lenght; j++) { //todo: dobrze by było przechwycić wyjątki parsowania, nie chcemy literek ani innych śmieci var value = int.Parse(row[j]); //todo: wypadało by się upewnić czy elementy się nie powtarzają, patrz Matrix.Contains(...) matrix.Fields.Add(j, i, value); } } return matrix; } }
-
Ja bym stawiał na Electrona, pełno teraz tego na desktopach a sporą ilość kodu można mieć wspólną z aplikacją webową (rozmawiamy tu o frontendzie) i da się zintegrować z wszystkimi popularnymi frameworkami (React, Angular, 'poniekąd' też Vue)
Nie mam pojęcia jak sprawa wygląda z mobilkami
-
1
-
-
54 minuty temu, Áltair napisał:Jest różnica między usługą płatną, gdzie dochodzi do obrotu gotówki (tu trzeba podawać dane), a darmowym portalem w internecie służącym for fun, którego przeznaczenie było jasne od początku. Poza niezbędnymi danymi do logowania powinno być zakazane zbieranie jakichkolwiek danych (chyba że dochodzi do przepływu gotówki, jak z opłacaniem zasięgów na FB). Potem są takie akcje jak wciskanie spersonalizowanych, agresywnych reklam, których sobie nie życzysz.
No właśnie o to chodzi, te reklamy są personalizowane po to aby mogły zostać odpowiednio dopasowane i nikt nie mówi, że nie ma nadużyć na tym polu, ale jak sam zaznaczyłeś w większości nie płacimy za te usługi, więc ciężko oczekiwać czegoś innego.
Poza tym duża ilość danych jest używana do optymalizacji oraz poprawiania jakości usług i nie ma w tym nic dziwnego, np. gmail potrafi określić czy dany email jest próbą wyłudzenia danych (phishing), że nie wspomnę już o automatycznym segregowaniu kategorii.
-
4 godziny temu, napisał:Właśnie to jest najdziwniejsze Altair, na innym kanale jak i na apce Youtube Vanced nie mam tej 'weryfikacji'. No cóż, jedno konto G razem z Drive usunąłem, powoli chce się pozbyć chrome. Myślałem o FF ale im też odwala, TOR odpada bo to jest prędkość netu 512kb przeglądając neta.
I niby co Ci wujek gugiel zrobi z tymi danymi, boisz się że cie pracownicy zaczną stalkować? rozumiem że jak robisz zakupy w internecie to podajesz adres sąsiada? z części usług googla można zrezygnować, ale dla wyszukiwarki ciężko o lepszą alternatywę.
btw w przypadku TORa możesz sobie ustawić entry i exit node'y i puścić ruch przez niemcy/polskę powinno szybciej śmigać

Przenośny i względnie wydajny laptop do 11k
w Komputery przenośne (notebooki, netbooki, palmtopy)
Napisano
Ze względu na wydajność i baterie stanęło na macu, dzięki za pomoc