Skocz do zawartości
Zamknięcie Forum PC LAB

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:

  1. 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
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. 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
  4. 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.
  5. 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ń.

Matt91111

Forumowicze
  • Liczba zawartości

    785
  • Rejestracja

  • Ostatnia wizyta

Odpowiedzi dodane przez Matt91111


  1. Najrozsądniej wygląda Vivobook, tylko to CPU mnie martwi :/

    Cytat

    Witaj, 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


  2. 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 :E ("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


  3. 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


  4. 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

    Cytat

    Dopuszcza 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.


  5. W dniu 19.05.2021 o 06:54, NieUmiemProgramowac napisał:

    @Matt91111

    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.

     

    Cytat

    I 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

    Cytat

    Do 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.

    Cytat

    uż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 :)


  6. 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.


  7. 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

    • Upvote 1

  8. 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


  9. 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 3

    i 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]);
       }
    }                                  

     


  10. 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.

    • Thanks 1

  11. @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 :E


  12. 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 :E 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"


  13. 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.


  14. 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 :E ) 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;
          }
    }

  15. 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.


  16. 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ć

×
×
  • Dodaj nową pozycję...