•  

    A ja trochę dokupiłem. Nawet jka spadnie do 0 to i tak spoko.
    #bitcoin

  •  

    Tldr; jak ktoś ma asus rog gl702zc i miał problemy z overheatingiem, słabą kontrolą i wsparciem dla chłodzenia na linuxie, to zapraszam do lektury, bo teraz problem powinien zniknąć.

    Manjaro i Asus GL702ZC - konfiguracja chłodzenia Ryzen 7 1700 na Linuxie

    W tym roku wymieniłem swój stary, leciwy już laptop, chodzący na Pentiumie jeszcze, na nowiutkiego, 8 rdzeniowego potwora z Ryzenem 7 1700, 32 GB RAM i 256 GB SSD PCI-E M2 na pokładzie.

    Przeskok oczywiście niesamowity, niemniej jednak zaniepokoiło mnie coś, o czym pisałem już w innymi wpisie - wysokie temperatury i ogólne problemy ze wsparciem sprzętu.

    W skrócie - kernel jeszcze nie obsługiwał tej konkretnej konfiguracji zbyt dobrze, przez co laptop rozgrzewał się do temperatur o wiele wyższych, niż mógłbym sobie tego życzyć.

    Jednakże niedawno, mimo całego zamieszania wokół świata Linuxa, wyszła wersja 4.19 jądra. Przeglądając changelog natknąłem się tam na wzmiankę o czymś takim jak steronwnik k10temp, oraz rzekomo lepsze wsparcie dla pewnych procesorów z rodziny Ryzen/Threadripper. Zaświeciła mi się lampka.

    Nie zrozumcie mnie źle, Windows nie jest zły - jak pisałem, to tylko narzędzie, ale fajnie by jednak było móc siedzieć sobie na Linuxie jako hoście. Oj tak.

    A więc postanowiłem się trochę pobawić i sprawdzić, czy faktycznie coś się zmieniło.

    # Manjaro to the rescue!

    Dystrybucje, które najszybciej adaptują nowe kernele bez większych problemów, to zazwyczaj te, które mają cykl wydawniczy Rolling Release - oznacza to tyle, że nia ma tam jakiś konkretnych wersji, które są wspierane przez X czasu, nasz system jest ciągle aktualizowany po prostu.

    Jedną z takich dystrybucji jest dystrybucja Manjaro. Świetna sprawa, ogółem super system, polecam.

    W każdym razie. Zainstalowałem i zacząłem bój. I co?

    Otóż, wyobraźcie sobie, udało się. Niżej przedstawiam jakie kroki podjąłem - jeśli ktoś z was również korzysta z tej konfiguracji sprzętowej, to być może skorzysta.

    Pierwszą rzeczą, którą musiałem zrobić, to upewnienie się, czy posiadam zainstalowane dwie paczki tak w zasadzie - lm_sensors oraz lib32-lm_sensors.

    Jeśli takowe posiadamy, (ja miałem je zainstalowane domyślnie), to wskakujemy do kochanej konsoli i wpisujemy:

    sudo sensors-detect

    Po czym wszystko potwierdzamy. Na koniec moim oczom ukazała się taka oto wiadomość:

    Driver `k10temp' (autoloaded):

    - Chip `AMD Family 17h thermal sensors' (confidence: 9)


    Wiedziałem, że jestem w domu. Po tem jeszcze wpisałem sensors , które faktycznie wydrukowało mi wskaźniki temperatur!

    Po chwili googlowania, wyczytałem, iż dobrze by było zainstalować jeszcze: asus-fan-dkms-git

    Kluczem do sukcesu okazała się jednak paczka nbfc

    Zainstalować ją można prosto z AUR'a, ale do wyboru są dwie paczki - nbfc i nbfc-git

    Ja wybrałem tą drugą, gdyż może ona być kapkę nowsza czasem, a mi zależało na jak najświeższej wersji.

    Jak instalować z AURa? Potrzebny nam yaourt

    Czyli:

    sudo pacman -Syu yaourt
    yaourt nbfc-git


    W zależności od potrzeby, czasem do tego yaourta trzeba dorzucić sudo, ale z tym bym uważał, bo to paczki z AUR'a jednak, a potrafią być one niebezpieczne (bardzo, bardzo rzadko), ale jednak.

    Zgodnie z dokumentacją nbfc , odpalam serwis.

    systemctl start nbfc.service


    Potem już tylko

    nbfc config -r


    które ma mi zasugerować jaki config powinienem wybrać dla mojego sprzętu. Niestety dla laptopa GL702ZC takowy nie istniał, ale dostałem rekomendację zbliżonego - GL702VM, który co prawda sprzętowo jest zupełnie inny, ale cóż... A może zadziała?

    Odpalam zatem następujące polecenie:

    nbfc config -a "Asus ROG GL702VM"


    Niestety, rzuca mi błędem. Podobnież znany problem, wystarczyło wpisać:

    mv /opt/nbfc/Plugins/StagWare.Plugins.ECSysLinux.dll /opt/nbfc/Plugins/StagWare.Plugins.ECSysLinux.dll.old


    I ponowić próbę.

    Chwila prawdy i.... Działa. Wiatrak zaczyna pracować inaczej. Sukces.

    Teraz tylko problem, bo dalej nie chodzi tak, jak chciałem - a to wiatrak od GPU się nie załącza kiedy trzeba, a to wiatrak od CPU za szybko i głośno chodzi. Coś ten config mi nie odpowiadał i to bardzo. Cóż miałem zatem zrobić, jak nie napisać swój. Biorę się do roboty zatem.

    Okazało się to nie za trudne - jedynie męczące było ustalenie odpowiednich rejestrów Embedded Controllera, które odpowiadają za kontrolowanie prędkości wiatraczków, niemniej jednak narzędzie ec-probe przyszło mi z pomocą. Jak? A no albo rzucasz ec-probe monitor —clearly lub co jakiś czas ec-probe dump to wyświetla nam rejestry, tylko skąd wiedzieć, który jest odpowiedni?

    Wybrałem prostą metodę - obciążając mocno CPU/GPU wymuszałem szybszą pracę wiatraków, wtedy też od razu zmieniały się wartości w rejestrze, co sugerowało, że to ten poszukiwany. Jak to zrobić? Do obciążania CPU/pamięci/dysku jest fajna paczka - stress , po jej instalacji wystarczy wpisać, w przypadku ryzena 7:

    stress --cpu 16 --timeout 60


    I już przez 60 sekund nasze CPU będzie w 100% obciążone, co wymusi szybkie odpalenie się wiatraczków. Rejestr ustalony.

    Dla GPU analogicznie, tylko zamiast stress, korzystam z glmark2 .

    Jak się okazuje, za wiatraczki odpowiadają rejestry spod adresów 0xA0 i 0xA6, czy też raczej 160, 166. No to wstawiam je do configu, metodą prób i błędów ustalam jakie prędkości będą dobre przy jakich temperaturach tak, żeby za głośno laptop nie chodził przypadkiem jeśli temperatura jest niska, ale i żeby na wyższych dobrze chłodził. Ostatecznie coś takiego mi wyszło:

    ```
    <?xml version="1.0"?>
    <FanControlConfigV2 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <NotebookModel>GL702ZC</NotebookModel>
    <Author>grski</Author>
    <EcPollInterval>500</EcPollInterval>
    <ReadWriteWords>false</ReadWriteWords>
    <CriticalTemperature>90</CriticalTemperature>
    <FanConfigurations>
    <FanConfiguration>
    <ReadRegister>151</ReadRegister>
    <WriteRegister>151</WriteRegister>
    <MinSpeedValue>0</MinSpeedValue>
    <MaxSpeedValue>8</MaxSpeedValue>
    <IndependentReadMinMaxValues>false</IndependentReadMinMaxValues>
    <MinSpeedValueRead>0</MinSpeedValueRead>
    <MaxSpeedValueRead>0</MaxSpeedValueRead>
    <ResetRequired>true</ResetRequired>
    <FanSpeedResetValue>8</FanSpeedResetValue>
    <FanDisplayName>CPU</FanDisplayName>
    <TemperatureThresholds>
    <TemperatureThreshold>
    <UpThreshold>30</UpThreshold>
    <DownThreshold>0</DownThreshold>
    <FanSpeed>0</FanSpeed>
    </TemperatureThreshold>
    <TemperatureThreshold>
    <UpThreshold>45</UpThreshold>
    <DownThreshold>40</DownThreshold>
    <FanSpeed>12.5</FanSpeed>
    </TemperatureThreshold>
    <TemperatureThreshold>
    <UpThreshold>65</UpThreshold>
    <DownThreshold>50</DownThreshold>
    <FanSpeed>37.5</FanSpeed>
    </TemperatureThreshold>
    <TemperatureThreshold>
    <UpThreshold>70</UpThreshold>
    <DownThreshold>60</DownThreshold>
    <FanSpeed>50</FanSpeed>
    </TemperatureThreshold>
    <TemperatureThreshold>
    <UpThreshold>75</UpThreshold>
    <DownThreshold>65</DownThreshold>
    <FanSpeed>75</FanSpeed>
    </TemperatureThreshold>
    <TemperatureThreshold>
    <UpThreshold>79</UpThreshold>
    <DownThreshold>72</DownThreshold>
    <FanSpeed>100</FanSpeed>
    </TemperatureThreshold>
    <TemperatureThreshold>
    <UpThreshold>85</UpThreshold>
    <DownThreshold>75</DownThreshold>
    <FanSpeed>100</FanSpeed>
    </TemperatureThreshold>
    </TemperatureThresholds>
    <FanSpeedPercentageOverrides />
    </FanConfiguration>
    <FanConfiguration>
    <ReadRegister>152</ReadRegister>
    <WriteRegister>152</WriteRegister>
    <MinSpeedValue>0</MinSpeedValue>
    <MaxSpeedValue>8</MaxSpeedValue>
    <IndependentReadMinMaxValues>false</IndependentReadMinMaxValues>
    <MinSpeedValueRead>0</MinSpeedValueRead>
    <MaxSpeedValueRead>0</MaxSpeedValueRead>
    <ResetRequired>true</ResetRequired>
    <FanSpeedResetValue>8</FanSpeedResetValue>
    <FanDisplayName>GPU</FanDisplayName>
    <TemperatureThresholds>
    <TemperatureThreshold>
    <UpThreshold>30</UpThreshold>
    <DownThreshold>0</DownThreshold>
    <FanSpeed>0</FanSpeed>
    </TemperatureThreshold>
    <TemperatureThreshold>
    <UpThreshold>45</UpThreshold>
    <DownThreshold>40</DownThreshold>
    <FanSpeed>12.5</FanSpeed>
    </TemperatureThreshold>
    <TemperatureThreshold>
    <UpThreshold>65</UpThreshold>
    <DownThreshold>50</DownThreshold>
    <FanSpeed>37.5</FanSpeed>
    </TemperatureThreshold>
    <TemperatureThreshold>
    <UpThreshold>70</UpThreshold>
    <DownThreshold>60</DownThreshold>
    <FanSpeed>50</FanSpeed>
    </TemperatureThreshold>
    <TemperatureThreshold>
    <UpThreshold>75</UpThreshold>
    <DownThreshold>65</DownThreshold>
    <FanSpeed>75</FanSpeed>
    </TemperatureThreshold>
    <TemperatureThreshold>
    <UpThreshold>79</UpThreshold>
    <DownThreshold>72</DownThreshold>
    <FanSpeed>100</FanSpeed>
    </TemperatureThreshold>
    <TemperatureThreshold>
    <UpThreshold>85</UpThreshold>
    <DownThreshold>75</DownThreshold>
    <FanSpeed>100</FanSpeed>
    </TemperatureThreshold>
    </TemperatureThresholds>
    <FanSpeedPercentageOverrides />
    </FanConfiguration>
    </FanConfigurations>
    <RegisterWriteConfigurations>
    <RegisterWriteConfiguration>
    <WriteMode>Set</WriteMode>
    <WriteOccasion>OnWriteFanSpeed</WriteOccasion>
    <Register>160</Register>
    <Value>10</Value>
    <ResetRequired>true</ResetRequired>
    <ResetValue>10</ResetValue>
    <ResetWriteMode>Set</ResetWriteMode>
    <Description>CPU FAN</Description>
    </RegisterWriteConfiguration>
    <RegisterWriteConfiguration>
    <WriteMode>Set</WriteMode>
    <WriteOccasion>OnWriteFanSpeed</WriteOccasion>
    <Register>166</Register>
    <Value>10</Value>
    <ResetRequired>true</ResetRequired>
    <ResetValue>10</ResetValue>
    <ResetWriteMode>Set</ResetWriteMode>
    <Description>GPU FAN</Description>
    </RegisterWriteConfiguration>
    </RegisterWriteConfigurations>
    </FanControlConfigV2>

    Teraz już tylko zapisanie tego pliku do "/opt/nbfc/Configs/Asus ROG GL702ZC.xml"

    oraz odpalenie

    nbfc config -a "Asus ROG GL702ZC"


    Finito. Działa wszystko tak, jak chciałem. A jak działa, to czemu by się z kimś nie podzielić - zrobiłem zatem PR'kę do repo nbfc i czekam teraz na odpowiedź.

    Na koniec przydałoby się jednak jeszcze to, by ta usługa odpalała się automatycznie po uruchomieniu komputera, a więc jeszcze:

    systemctl enable nbfc.service


    Teraz już serio gotowe. Śmiga, lapek raczej poniżej 60 trzyma, co jak na to cpu jest spoko podczas pracy.

    Męczący, to był dzień i wyzwanie, zajęło mi to kilka godzin, ale fajnie. Lubię takie przygody.

    Jak coś to zajrzeć można też do mnie na bloga: grski.pl albo na steemit - tam też piszę.

    #programowanie #linux
    pokaż całość

  •  

    Ma ktoś z was okulary do komputera? W sensie takie filtrujące światło niebieskie or sth?
    Coś do zadbania o te oczy, ktoś coś?
    #programowanie #optyka #okulary

    +: Cronox
  •  

    Ostatnio obserwuję obrzydliwy proceder. Proceder upolityczniania świata IT i wytwarzania oprogramowania jako całości.

    Co mam na myśli? Regularny proces niszczenia naszej społeczności polityczną poprawnością. Od dłuższego czasu obserwuję ten proces, ostatnio jednak gdy zobaczyłem, iż do oficjalnego repozytorium Pythona zmergowane zostały branche pull requestów, których jedynym zadaniem było… Zmienienie terminologii master/slave w kontekście procesów i tak dalej. Jakby tego było mało, to dość niedawno w grupie tworzącej jądro Linuxa pojawił się obowiązkowy CoC – Code of Conduct, który brzmi… Cóż, dość specyficznie. Sam Linus, który znany jest ze swojego ‘charakterystycznego’ zachowania, oraz tego, że każdemu potrafi powiedzieć co myśli, a często myśli dość ostro, ogłosił, że na razie robi sobie przerwę, by ‘popracować nad swoim charakterem w świetle pewnych zmian’. No ludzie kochani.

    Te dwa wydarzenia sprawiły, że postanowiłem napisać swoje dwa słowa o tym temacie.

    Otóż wielce mi się to nie podoba. Uważam za kompletnie obrzydliwe, wstrętne i nieakceptowalne, by robić z procesu wytwarzania IT oraz naszego społeczeństwa, jakąś politycznie poprawną abominację, która w niczym nie przypomina piękna swej oryginalnej formy.

    Z czym konkretnie mam problem? Oto lista kilku rzeczy.

    Zacznijmy może od omawianego przykładu zmiany terminologii Pythona. To nie jest odosobniony przypadek. Podobna sytuacja miała już miejsce kilka lat temu, tyle, że w kontekście kodu frameworku Django. Jak widać, zaczyna być to trendem. Mocno niepokojącym i głupim tak szczerze.

    Otóż jak pewnie wszyscy wiemy, mamy w świecie IT pewien swoisty słowniczek pojęć, które mają bliżej określone, znane wszystkim, znaczenie. Widząc niektóre słowa, niezależnie od języka, w jakim występują, możemy w dość znacznym stopniu domyślić się, co robi dana funkcja, dana zmienna czy ogółem, dany kod. Te terminy istniały przez wiele lat, cała nomenklatura na nich bazuje i ich używa, często dość trafnie opisują to, jaką abstrakcję przedstawiają.

    I teraz pojawia się problem. Bo przychodzi ktoś, kto w imię politycznej poprawności zaczyna zmieniać te terminy, bo być może kogoś one urażą, mimo tego, że nie mają prawa, gdyż używane są w innych kontekstach, innych znaczeniach, których używa się też w słownikach i tak szczerze to nikt się tym nie przejmuje, poza kilkoma głośnymi krzykaczami, którzy dali się pewnym kwestiom zwariować. Niestety z tego, co widzę, w świecie IT raczej więcej jest osób nieco pasywnych, niezbyt dominujących. Typ introwertyka, intelektualisty, który chce mieć spokój. O ile ktoś nie wejdzie aż tak bardzo w jego strefę komfortu i jej nie zaburzy, to taka osoba nie będzie się zbytnio czemuś sprzeciwiać raczej. W tym problem. Bo pewne kręgi to widzą i wykorzystują ten fakt na swoją korzyść, by pchać wszędzie swą agendę. To smutne.

    Jak dla mnie jest to kompletna głupota, która wprowadza tylko niepotrzebne zamieszanie. Co, jeśli we wszystkich językach zaczną się takie rozterki? Co, jeśli nagle zacznie funkcjonować kilka różnych nazw zastępczych na ‘niewygodne’ terminy, bo jedne będę lepsze niż inne? Mniej/bardziej poprawne politycznie? Przecież to jest receptura na katastrofę. To tak jakbyście w kodzie opisywali jeden obiekt kilkoma różnymi nazwami. Nie jest to dobra praktyka, prowadzi do złego kodu i problemów z utrzymaniem, debugowaniem i wszystkim w zasadzie. Ja właśnie tak widzę skutki tych zmian.

    Na pewno nie pomoże tutaj fakt, że Guido przecież zaczyna się wycofywać ze świata Pythona, oddał stery.

    Następna do omówienia jest utworzenie regulaminu dla społeczności tworzącej jądro Linuxa. Nowo powstały regulamin brzmi jak paplanina wyjęta prosto z mokrego snu wojującej aktywistki LGBT

    Doskonale pasuje tu obrazek:

    xdd

    Z założenia te nowo powstałe zasady brzmią okej, problem jednak w tym, jak zostaną one wdrożone, bo historia pokazała już, jak to się zazwyczaj dzieje. Coś, co ma być narzędziem wolności dla wszystkich, staje się aparatem ucisku. Chodzi zwyczajnie o to, że SJW (Social Justice Warriors) zyskują tutaj potężne narzędzie, które umożliwi im kompletne pozbywanie się osób, które im nie przypadną go gustu. A im do gustu nie przypada raczej większość niż mniejszość. W zasadzie to panuje tam zasada ‘kto nie z nami, tam przeciw nam’. Widzicie tę rozbieżność? Ten dysonans? W teorii mają oni walczyć o sprawiedliwość społeczną, a praktyce są oni często tyranami, którzy niszczą ludzi. Często dobrych ludzi, kompetentnych ludzi.

    Jeśli nawet na Linusa udało się wpłynąć, który to jest raczej uparty i kontrowersyjny w swoich poglądach, to co będzie z innymi osobami? Co, gdy jakiś naprawdę porządny deweloper ‘urazi’ kogoś albo podpadnie kaście SJW

    Czy naprawdę potrzebujemy gdziekolwiek komisji ludzi, którzy będą mówić nam jak się zachowywać, co by przypadkiem kogoś nie urazić? Poważnie?

    Idźcie mi z tym cholerstwem stąd, idźcie z naszego świata IT. Wracajcie do swoich wysypisk na uniwersytetach i innych miejscach. Tam sobie bytujcie ze swoją polityczną poprawnością, nie u nas, w świecie IT. Paszoł won! Nie psujcie czegoś pięknego, bo świat IT taki jest. Piękny, inkluzywny i otwarty, sam w sobie.

    Popatrzcie, jak on wyglądał od początku stworzenia – losowi ludzie z Internetu, bez względu na cokolwiek, wiek, pochodzenie, kolor skóry, religię, pracowali razem nad różnymi projektami, tworzyli oprogramowanie, które rozwiązywało kolejne problemy tego świata, te mniejsze i te większe. Po co robić w tym bałagan, mieszać się i narzucać jakieś ramy?

    Idźmy dalej. Pomówmy o tak zwanej ‘dyskryminacji pozytywnej’, czy jak to tam teraz nazywają. O co chodzi? A no o to, że jak jesteś białym, heteroseksualnym mężczyzną, jeszcze nie daj Boże, chrześcijaninem, to trzeba ci jakoś życie utrudnić, bo jesteś uprzywilejowany, ‘check your privldż!’.

    Rozumiecie tę hipokryzję?

    Kolejny punkt – parytety w IT. Co raz, to więcej firm zaczyna rekrutować na stanowiska tylko i wyłącznie kobiety/czarnych/gejów/łatever, by spełnić normy ‘diversity’, ‘różnorodności’.

    Wydawać się wam może, że to przecież Polski nie dotyczy, że to jakieś amerykańskie problemy. Nic bardziej mylnego. Wyobraźcie sobie, że na naszym podwórku również mają miejsce takie rzeczy. Inne, jeszcze bardziej przerażające, też – jak np. sponsor wycofujący się z finansowania danego wydarzenia, bo normy ‘diversity’ nie zostały zachowane, czyli na darmowe wydarzenie, na które każdy przychodzi z własnej woli, zapisało się zbyt mało kobiet. Czemu ich nie zmusiliście do przyjścia, co to ma być?!
    Psychoza.

    Ile opowieści słyszałem o tym, że na dane stanowisko przyjęto kobietę, mimo że była mniej kompetentna od innych kandydatów?

    Nie mówię tu, że kobiety są mniej kompetentne. Absolutnie. Po prostu porównując dwóch kandydatów, jeden ma lepsze umiejętności, będzie lepszym pracownikiem, drugi nie. Logiczne jest zatrudnianie lepszej osoby. W momencie, kiedy robimy z tej logiki prostytutkę i zatrudniamy kogoś słabszego tylko dlatego, że np. jest kobietą, albo jest czarny/żółty/zielony, to coś jest nie tak. Św. Tomasz płacze gdzieś po cichu.

    Takie rzeczy właśnie, takie ruchy w open source, w firmach, w społeczności, doprowadzą ostatecznie do pogorszenia jakości kodu, odejścia filarów i oryginalnych propagatorów ruchów open source. Nie widzę przyszłości wesoło, jeśli się nie sprzeciwimy tej zarazie.

    Patrzmy tylko na jedno. Na wiedzę, na to co ktoś mówi i jak prawdziwe to jest. Na nic więcej. Tylko to niechaj się liczy i koniec.

    Wpis można też przeczytać na moim blogu.
    Na Steemit również.
    #programowanie
    pokaż całość

  •  

    Lubie bardzo mocne, męskie zapachy, takie, że pryśniesz raz i pół osiedla czuje
    W kierunku jakich marek zacząć szukać? Jakieś intro into perfumy?
    Jakieś perfumerie/sklepy łateva gdzie ktoś mi doradzi w tym kierunku w Warszawie?

    Budżet <= 300 zł
    #perfumy

    +: Cronox
  •  

    Mam dla kogoś spod tagu #gotowanie #kuchnia fuchę na 1 dzień w tygodniu żeby dorobić, miejsce pracy Warszawa.

    Otóż sprawa jest taka, że mniej więcej od połowy września potrzebuję kogoś, kto raz w tygodniu (czy tam dwa/trzy, jak sobie rozłożysz pracę to nie moja sprawa) nagotował by mi żarcia w pojemniki XD

    Generalnie proste jak sam skurczesyn - idziesz, robisz zakupy potem cyk proste dania z nich gotujesz u siebie (w Internecie są gotowe rozpiski na całe tygodnie, poza tym ja mogę dostarczyć jakieś potrawy które do tej pory tak robiłem i które mogą długo leżeć, są proste w przygotowaniu) pakujesz w słoiki/pojemniki, łatever.

    W zasadzie jak ktoś gotuje sam dla siebie to może nawet po prostu to samo robić, tylko więcej po prostu i ta nadwyżkę dawać w słoje dla mnie. Mnie to rybka.

    Głównie zależy mi na obiadach/kolacjach, śniadania coś tam se mogę zrobić w 5 minut, czyli około 20 posiłków na tydzień, przy czym to nie oznacza robienia 20 różnych dań - ja zazwyczaj te 20 porcji biorę z max 2-3 potraw.

    Potem gotowane dania podrzucasz mi gdzieś - albo do pracy, albo umawiamy się gdzieś w centrum, przy okazji dostarczenia nowych posiłków, odbierasz puste pojemniki z poprzedniego tygodnia.

    Mnie takie coś, zakupy+gotowanie+zmywanie, schodzi z 5 h, ale ja dania robię naprawdę banalne typu podsmażona pierś z jakimś gotowym sosem, spaghetti, pasty, itd.

    Nie przeszkadza mi jedzenie monotonne, nie jestem wybredny.

    Ile za taką usługę to w sumie nie wiem, nie znam rynku. Za godzinę chyba najlepiej się rozliczać. Jak ktoś będzie zainteresowany to PW z info o tym, ile by sobie za godzinkę pracy życzył czy generalnie nie wiem, za tydzień/miesiąc.

    Oczywiście ceny zakupów po mojej stronie - przedstawiasz paragon i zwracam kasę.

    To taka robotka bardziej dla studentów/studentek co chcą dorobić sobie paręset złotych na miesiąc. Nie jest to jakiś rocket science a kasa może niektórym się przyda. Nie jestem chyba januszem, nie wyskocze z ofertą 10 zł/h czy coś także pisać śmiało różowe i niebieskie paski co umiecie gotować.
    pokaż całość

  •  

    Co tu sie odwaliło. Guido van Rossum (autor Pythona) zrzucił swój tytuł jako BDFL w świecie Pythona, powoli przechodzi w stan spoczynku. I mówi: radźcie sobie sami. No to tak jakby taki Jobs wpadł do Ejpla i rzekł: XD no to siema, elo.

    Wszystko to spowodowane reakcją społeczności na PEP 572. Artykuł i tłumaczenie e-maila guido na blogu
    Piszę też na steemit - tam też można zobaczyć: tu link
    #python #programowanie #naukaprogramowania
    pokaż całość

    +: Freakz, MQs +14 innych
  •  

    Zanim przejdziesz dalej, to czysto opiniowy wpis, zero w nim rzeczy technicznych a jedynie moje narzekanie na pewien temat i moja perspektywa. Jeśli zaglądasz tu tylko dla tematów technicznych, to ten wpis możesz odpuścić, bo to subiektywne podejście w pewnej sprawie.

    O co mi chodzi? Popatrzcie na to, jak duża część witryn, zwłaszcza tych polskich, dziś wygląda. Bez AdBlocka są niemożliwe do przeglądania, bo zwyczajnie większość ich powierzchni stanowią reklamy. Jedne w formie video, inne - zwykły obrazek. Automatycznie odtwarzające się reklamy z dźwiękiem. To dopiero zmora. Tak samo jak to, ile transferu potrafi to całe dziadostwo zeżreć.

    Milion ciasteczek i szpiegowanie na każdym kroku tego, co robisz, byle tylko zdobyć o tobie dodatkowe informacje, które można sprzedać.

    Nachalne zgody na newsletter, ciasteczka, powiadomienia na desktopie, rodo, srodo, popupy z serii: wyłącz adblocka gnoju bo ni momy piniendzy.

    Dodawnie wszędzie pluginów fejsbuka, instagrama, snapa czy czego tam jeszcze.

    Nieskompresowane grafiki ważące po kilka mega. Tony niepotrzebnego JS'u, który sprawia, że strona ładuje się w ślimaczym tempie.

    Dla mnie jest to po prostu okropny brak szacunku do czytelnika. Jak tylko napotykam na taką stronę, to o ile nie muszę, nie korzystam z niej. Dlatego staram się prowadzić swoją w sposób przeciwny do tych opisanych wyżej.

    Na moim blogu nie ma żadnych zintegrowanych pluginów do fejsika, instagrama czy czegokolwiek innego, nie ma komentarzy, bo też nie są potrzebne akurat w moim wypadku. Grafik w newsach też raczej nie, chociaż może się coś gdzieś znajdzie, ale na dobrą sprawę jedyny obrazek, który tutaj jest, to moja gęba, która, moim zdaniem, tu być jednak powinna - piszę różne rzeczy, czasem mądre, czasem mniej mądre, ale nie wstydzę się podpisywać pod nimi swoim imieniem, nazwiskiem jak i wizerunkiem.

    Na rzecz tego jestem w stanie porzucić anonimowość i sympatię do prywatności - by mój czytelnik wiedział, kto pisze to, co on czyta. Poza tym blog to też dla mnie możliwość budowanie wizerunku profesjonalnego, także dodatkowy plus.

    Nie ma tu też, i nigdy nie będzie, reklam. Są jedynie linki do moich profili na linkedinie czy gitlabie. Tylko tyle.

    Cała moja strona waży 243 kB, a by ją pobrać, wystarczy 11 requestów, z czego aż 5 to czcionki. Załadowanie jej zajmuje około sekundy. Wszystko serwowane po https. W dzisiejszych czasach to konieczne. I tak, wiem, że ktoś zaraz mi powie, iż to nie jest rok 2005, gdzie każdy kB się liczy, ale to nieważne. Dlaczego ja, jako użytkownik, mam marnować czas, czekając aż twoja super nowoczesna strona w pięknym frameworku się załaduje po 10 sekundach? Nie ma opcji.

    Całość jest też cachowana za pośrednictwem cloudflara.

    Nie znajdziecie również tutaj google analytics, czy jakiegokolwiek innego ustrojstwa do śledzenia tego, ile osób czyta ten blog i co tutaj robicie. Nie ma to dla mnie znaczenia - w sumie to w ogóle nie ma znaczenia w przypadku blogów osobistych. Jedyne ciasteczko, które ode mnie dostajecie, to chyba to z cloudflara.

    Jestem w stanie znieść artykuły czy treści sponsorowane, spoko, jakiś product placement. Normalna sprawa, trzeba zarobić. Są różne formy monetyzacji zasięgów czy treści, których można użyć, które sprawią, że i twórca zarobi, i czytelnik coś z tego wyniesie. I o to się rozchodzi, bo gdy jest inaczej, jest to po prostu nic innego, jak brak szacunku do czytelnika i tyle. Takich rzeczy nie szanuję.

    To tak konkretnie, o cóż chodzi? O to, byś zastanowił się czasem, jako twórca, czy naprawdę potrzeba tej dwu megowej grafiki jako tło twojego bloga. Czy koniecznie wszędzie muszą być buttony do udostępniania na fejsie, insta, snapie albo łerewer. Czy koniecznie trzeba atakować użytkownika reklamami, newsletterami i innymi bzdetami.

    To taki mój apel. Dbajmy o Internet, jak on wygląda i jak się prezentuje. To nasze wspólne dobro.

    #mlodyprogramuje
    pokaż całość

  •  

    Kolejny dzień, kolejny wpis o #python

    Przeczytać też można na moim blogu lub steemit
    # Zalety

    ## Ekspresywność

    Python jest bardzo ekspresywny. Co to znaczy? Otóż w Pythonie za pomocą relatywnie niewielkiej ilości kodu, można osiągnąć to, co w innych językach zajęłoby czasami kilka razy tyle. Żeby nie być gołosłownym, popatrzmy na przykład klasycznego programu, którym zaczyna się naukę programowania – Hello World, czy po polsku, Witaj Świecie.
    W Pythonie wygląda on tak:

    print(‘Hello World’)


    Dość proste i zrozumiałe, prawda? Jedna linijka i gotowe.
    Przyjrzymy się natomiast innym językom.
    Zacznijmy od Javy:

    public class HelloWorld{
    public static void main(void) {
    System.out.println(”Hello World”);
    }
    }


    Tu dalej w miarę jasno, mimo kilku pozornie tajemniczych komend, wciąż można łatwo odczytać, co dany program robi, ale weźmy, załóżmy, na celownik C++:

    #include <iostream>
    using namespace std;
    int main() {
    cout << "Hello World!";
    return 0;
    }


    Tutaj już troszkę mniej oczywistym jest, co dany program robi, prawda? W dodatku popatrzcie na ilość linii użytych do wykonania zadania. Nie ma porównania. Zaznaczam jednak, że w obu tych językach można by wydrukować hello world’a za pomocą krótszego kodu, niemniej jednak chodzi mi tutaj o samo pokazanie idei.

    Czy to znaczy, że te języki są gorsze, a Python jest królem? Absolutnie nie, nigdy tak nie myśl.

    Każdy język jest jak narzędzie – ma swoje zastosowania, w których jest dobry, wyśmienity, ale ma też takie, do których kompletnie się nie nadaje. Tak jest i tutaj. Tak jest wszędzie. Owszem, czasem zdarzają się fanatycy danych technologii czy rozwiązań, którym językowo-technologiczne zapalenie opon mózgowych przyćmiewa obiektywny osąd, ale to nic. My nie chcemy tacy być. Bądźmy mądrzy i rozsądni, ułatwiajmy sobie życie, używając odpowiednich narzędzi do odpowiednich zadań.

    Niemniej jednak Python pozwala nam pisać więcej w mniejszej ilości kodu. To oczywiście przychodzi w zamian za pewną cenę, którą trzeba zapłacić, i która sprawia, że Python dobry jest w pewnych sytuacjach a w innych już nie.

    ## Prostota
    Wróćmy do poprzedniego punktu – jak popatrzymy na kod Pythona, to można by rzec, że to w zasadzie po prostu zapisane polecenie po angielsku. Cóż bowiem znaczy słowo print? Nic innego jak drukuj/wydrukuj.

    Od razu można się domyślić, że programiście chodzi o to, by komputer coś wypisał na ekran. Podobnie sprawa się ma z innymi elementami języka, naprawdę, wystarczy znać angielski i już prawie możemy zrozumieć sporą część Pythona. W dużej ilości języków jest podobnie, ale nie aż tak bardzo podobne są one do angielskiego, jak Python. Naprawdę, drugiego tak prostego języka jeszcze nie spotkałem, a trochę ich, przynajmniej pobieżnie, zdarzyło mi się używać – czy to JavaScript, Java, C, C++, Dart, Scala.

    Jedynym językiem, który może konkurować z Pythonem prostotą, jest chyba C – ale to z racji tego, że core tego języka jest po prostu malutkie. Gdy przyjdzie nam do zarządzania pamięcią, wskaźników i innych, równie fajnych rzeczy z C, to zaczyna się tęsknić za Pythonem.

    ## Python językiem dynamicznie typowanym
    Co to znaczy? Cóż, jeśli jesteś nowicjuszem w programowaniu, to możesz kompletnie nie mieć pojęcia, o co chodzi, ale to nic.

    W skrócie sprawa tyczy się faktu takiego, że w statycznie typowanych językach, podczas deklaracji zmiennych, należy podać, jakiego typu dane będzie ta zmienna przechowywała. Za przykład niech posłuży nam tutaj Java:

    int someNumber = 123;


    Zapis powyżej mówi ‘javie’, że chcemy utworzyć zmienną o nazwie someNumber, która będzie zawierała dane typu intinteger, czyli nic innego jak liczby całkowite.

    A co to w ogóle znaczy, że ma utworzyć zmienną? A no coś takiego:

    Słuchaj komputer, tu masz jakieś dane, (w tym wypadku ‘123’), zapamiętaj sobie tę wartość, zapisz ją gdzieś, i od teraz, za każdym razem, gdy napiszę w programie `someNumber`, to wiedz, że chodzi mi właśnie o wartość zapisaną w tamtym miejscu.


    Próba zapisania innych danych do tej zmiennej, załóżmy, tablicy czy liczby rzeczywistej, nie skończy się zbyt dobrze lub po naszej myśli.

    W Pythonie takich obostrzeń i wymogów nie ma. Po pierwsze, podczas inicjalizacji zmiennej, nie musimy podawać jej typu, a po drugie później, możemy bez problemu zmieniać rodzaj danych, jaki przechowujemy w danej zmiennej, zatem ekwiwalentem zapisu wyżej w Pythonie, byłby kod:

    some_number = 123


    Później bez problemu zaś, możemy wpisać sobie:

    some_number = ‘Hi there’


    Z czego to wynika, dowiesz się już w nieco innym artykule.

    ## Społeczność
    Python ma jedną, naprawdę dużą zaletę. Jest to jego społeczność, która raz, że jest naprawdę pomocna, dwa, że jej rozmiar jest imponujący. Dzięki temu ilość dostępnych materiałów, poradników, bibliotek, frameworków i skryptów potrafi po prostu pozytywnie zaskoczyć.

    Dzięki otwarto-źródłowej kulturze Pythona wiele niesamowitych narzędzi codziennie jest oddawanych w nasze ręce do użytku, zupełnie za darmo, tak po prostu.

    Powoduje to, że często nie musimy wymyślać koła na nowo – wystarczy import jakiejś biblioteki, którą ktoś już kiedyś napisał. Oszczędza to często czasu i zmartwień, pozwalając się skupić na tym, co w naszej implementacji ważne.

    Poza tym, co zrobić, kiedy utkniemy w którymś miejscu pisania programu i nie wiemy co dalej, gdy napotkamy jakiś błąd, którego nie potrafimy rozwiązać? Cóż, z racji wieku samego Pythona oraz rozmiaru jego społeczności, można w większości przypadków założyć, że ktoś przed nami napotkał już podobny problem i zapytał o to w Internecie, lub opisał rozwiązanie danego problemu.

    Ludzie chętnie dzielą się wiedzą wbrew pozorom. Dzięki temu nie musimy sami szukać rozwiązania godzinami, grzebiąc w dokumentacji, źródłach czy po prostu eksperymentując. Możemy najzwyczajniej w świecie kogoś zapytać, bo jest względnie dużo osób znających Pythona, albo znaleźć odpowiedź innych, którzy rozwiązali ten problem przed nami. Nie zawsze tak jest.

    Jako kontr przykład, podam język Dart. Dość nowy język, niezbyt popularny, ogółem mała społeczność. Niemniej jednak czasem tworzę w tym języku i zdarza się nierzadko, iż napotykam jakiś problem, o którym informacji nie znajdę nigdzie, bo po prostu akurat nikomu innemu się nie przydarzył jeszcze, lub też nikt inny go nie opisał, więc muszę sam szukać rozwiązania, przeczesując dokumentacje, źródła i po prostu eksperymentując.

    Do tego czasami dochodzi niedogodność w postaci tego, że niektóre rzeczy, które np. w Pythonie czy Javie zostały już napisane przez kogoś innego, ładnie zapakowane w jakąś paczkę i rozpowszechnione do użycia, w Darcie niekoniecznie są i trzeba je napisać samodzielnie.

    Podobnie, jeśli chodzi o samą naukę języka – materiałów jest znacznie mniej, często są one przestarzałe z racji tego, że Dart jest językiem ciągle się rozwijającym i to mocno, co tydzień wychodzą nowe wersje samego języka, a z racji niskiej popularności mało osób o nim pisze, jeszcze mniej tworzy o nim książki czy poradniki. To nie ułatwia nauki, zwłaszcza początkującym programistom. Dobrze, że chociaż dokumentacja jest całkiem dobra, co prawda nie tak dobra, jak dokumentacja np. Django, ale i tak – nie jest źle.

    Dlatego też twierdzę, że społeczność Pythona jest jego największą zaletą i to ona, dosłownie, tworzy ten wspaniały język, czyniąc go tym, czym jest.

    ## Mnogość zastosowań
    Python jest językiem ogólnego przeznaczenia. Można w nim stworzyć praktycznie wszystko, poza pewnym, raczej wąskim gronem zastosowań, do których kompletnie się nie nadaje i do których nie był projektowany. Niemniej jednak znając Pythona, możemy tworzyć aplikacje desktopowe, gry, aplikacje webowe, skrypty, emulatory, interpretery, kompilatory, aplikacje do obliczeń naukowych, aplikacje do wizualizacji danych i ich scrapowania z sieci, uczenie maszynowe i tak dalej. Lista jest naprawdę długa.

    Oczywiście, do jednych zadań Python jest lepszy, do innych gorszy, bo na przykład rzadko zdarza się, że aplikacje desktopowe czy gry tworzy się w Pythonie, gdyż są do tego lepsze języki, ale w każdym razie, jest to możliwe i niezbyt trudne tak szczerze.

    W tym, że Pythona można wykorzystywać do wielu rzeczy, pomaga to, o czym pisałem wyżej – czyli duża społeczność tworząca ogromne ilości bibliotek, frameworków i gotowych skryptów.

    Pozwala to na wygodne użycie Pythona w różnych dziedzinach i to dzięki temu oraz samej prostocie języka, zdobywa on szturmem inne pola, poza webdevem, jak Data Science, Artificial Intelligence, Neural Networks czy na ogół obliczenia naukowe.

    Po prostu czasem utworzenie programu w Pythonie sprowadza się tak naprawdę do zaimportowania jakiegoś modułu i dodaniu kilku drobnych komend mówiących mu, co ma dla nas zrobić. Prościej się nie da.

    ## Czytelność
    Python projektowany był z czytelnością w zamyśle. W Pythonie przynależność kodu do danego bloku oznaczamy za pomocą wcięć, czyli nieco inaczej, niż w większości języków, gdzie zazwyczaj używa się do tego celu klamer lub nawiasów, ewentualnie słów kluczowych jak BEGIN czy END.

    W Pythonie zaś liczą się wcięcia, których niepoprawne użycie powoduje błędy uruchomienia. Daje to efekt w postaci tego, że praktycznie każdy poprawny kod Pythona jest w miarę elegancki i łatwo czytelny. Oczywiście, istnieją odstępstwa od tej normy, ale mówię o ogóle ludzi, którzy stosują dobre praktyki czy standardy, takie jak PEP8, chociażby, o którym to pomówimy jeszcze później.

    Gdy dodamy do tego prostotę i ekspresywność samego języka, to szybko wyjdzie nam na to, że kod w Pythonie jest często po prostu ładny, łatwy do odczytania, zmodyfikowania i przyjazny nowicjuszom.

    Owszem, osobom przechodzącym z innych języków może się to wydać, przynajmniej na początku, dziwne, że w Pythonie używamy wcięć zamiast nawiasów czy klamer, ale jest to ładne rozwiązanie moim zdaniem.

    Dodatkowo brak w Pythonie jeszcze jednej rzeczy – średniki na końcu wyrażeń nie są konieczne. Mniej pisania i czystszy kod.

    Oczywiście, czasem stosujemy średniki w Pythonie, niemniej jednak są to sytuacje rzadkie i z góry określone, naprawdę nieliczne.

    To chyba też kolejna rzecz, która może dziwić programistów innych języków, chociaż w obecnych czasach nie jest to aż taka rzadka praktyka, by w języku nie były konieczne średniki.

    Dlaczego w ogóle jednak czytelność jest ważna? Czas programisty jest drogi, nasze mózgi mają mocno ograniczone zdolności. Dobrze jest, gdy pewne rzeczy od razu widać, gdy nie musimy się nad czymś zastanawiać, bo jest to oczywiste.

    Jeśli program jest bardzo czytelnie napisany, to szybciej uda nam się go zrozumieć, a to jest krytyczne w tym, by wykonać zadanie.

    ## Automatyczne zarządzanie pamięcią
    W Pythonie zarządzanie pamięcią odbywa się automatycznie – programista nie ma w tym udziału, robi to za nas sam język za pomocą takich mechanizmów jak Garbage Collector, dba on o odpowiednie uwalnianie zasobów i pamięci po obiektach, których już nie używamy.

    Także nie musimy przejmować się takimi rzeczami jak alokacja i de-alokacja pamięci, jak to ma miejsce np. w C czy C++. Dlaczego to zaleta? Z racji tego, że niepoprawne zarządzanie pamięcią może doprowadzić do bardzo poważnych błędów, które narażają na szwank cały system, a to, by takowe nie wystąpiły, jest na głowie programisty i często nie jest to rzecz prosta, ba! Czasami banalne konstrukcje związane z alokacją i de-alokacją pamięci, rzeczy, które wydają się oczywiste, mają skomplikowane podłoża, które doprowadzają do poważnych błędów, jeśli źle zrozumiane.

    W przypadku Pythona tak nie ma – programista na ogół nie ma nawet dostępu do bezpośrednich operacji na pamięci. Jest to bardzo mądre ograniczenie, przydatne w tego typu języku. Podobnie jest, chociażby w Javie.

    ## Bezpieczeństwo
    Z wyżej wymienionego powodu Python jest też językiem względnie o wiele bezpieczniejszym niż wspomniany C czy C++. To oczywista zaleta.

    ## Wspieranie różnych paradygmatów programowania
    Są języki, które wspierają mocno w zasadzie tylko jeden paradygmat programowania – jak np. Java, czy Smalltalk, które zaprojektowane są, by ściśle spełniać założenia paradygmatu obiektowego, czy Haskell, który jest językiem funkcyjnym i tylko funkcyjnym, ale są też takie jak Python, które wspierają wiele paradygmatów. O co z tym chodzi, tak po ludzku?

    W Javie czy Haskellu masz nieco z góry narzucone to, jak masz ‘myśleć’ i w jakim kluczu powinieneś realizować rozwiązania pewnych problemów za pomocą kodu. Co to znaczy tak dokładnie, omówimy innym razem.

    W Pythonie natomiast masz wolność wyboru. To ty sam decydujesz o tym, które podejście Ci się podoba i którego chciałbyś użyć. Uważam to za zaletę, gdyż ponownie - w jednych sytuacjach lepiej sprawdzają się jedne rozwiązania, w innych drugie. Mając wybór, możesz użyć tego właściwego i już.

    ## Wiele wspieranych platform
    Jak już wspomniałem gdzieś wcześniej, Python obsługuje praktycznie dowolną używaną dziś platformę. Windows, Linux, AIX, IBM, iOS, OS/390, z/OS, Solaris, VMS, HP-UX. Co sobie kto zażyczy, prawie na pewno jest.

    ## Dojrzałość
    Python jest językiem, który powstaje od roku 1991 – obecnie ma on 27 lat. Przez ten czas jego ekosystem, narzędzia i biblioteki zdążyły dojrzeć, przejść przez problemy wieku dziecięcego, które niektóre języki mają jeszcze przed sobą.

    Znaczy to mniej więcej tyle, że Pythonowi zazwyczaj można ufać. O ile sam programista czemuś nie zawini, to język raczej nas nie zawiedzie, z racji tego, że przetrwał próbę czasu, a większość błędów i rażących bugów, została już dawno wyłapana, załatana.

    Czy to znaczy, że to język idealny czy bez błędów? W żadnym razie. Niemniej jednak, z racji tego, że wykorzystywany był/jest on w setkach tysięcy ważnych aplikacji biznesowych, można śmiało stwierdzić, że pewną dozą zaufania można naszego węża obdarzyć.

    ## Prostota w integracji z innymi językami
    Pythona dość łatwo można integrować z innymi językami na różnych platformach. Programy napisane w Pythonie zazwyczaj dość łatwo współpracują z innymi programami, napisanymi, chociażby w odmiennych językach.

    Nie każdy język ma tę cechę, gdyż niektóre języki tworzą dość hermetyczną, specyficzną i zamkniętą kulturę, gdzie połączenie czy integracja ich z innymi środowiskami jest nad wyraz lub niepotrzebnie trudna.

    Dodatkowym atutem Pythona jest to, że można pisać do niego ‘rozszerzenia’ w języku C czy C++, które będą działały o wiele szybciej, niż sam Python. Dzięki temu możemy mieć większość aplikacji napisaną w Pythonie – kod prosty, krótki i przyjemny tam, gdzie może być, a akurat jakieś wąskie jej gardło, które musi wykonywać się naprawdę szybko, w C czy C++. Raczej się tego nie stosuje, ale czasem pojawiają się różne, dziwne powody, dla których warto.

    ## Szybkość tworzenia kodu
    Z racji prostoty i mnogości bibliotek w Pythonie, aplikacje, jak i sam kod, można w nim tworzyć wręcz błyskawicznie. To niewątpliwa zaleta, zwłaszcza w czasach, kiedy większość klientów chce, by ich produkt był zrobiony na wczoraj, a terminy zawsze gonią.

    Mało tego, zazwyczaj ten zrobiony na szybko kod jest też dość przyzwoitej jakości.

    No i faktem jest też, że nawet jeśli nie chcemy wykorzystać Pythona produkcyjnie, tylko stworzyć malutkie MVP – minimal viable product, czy jakiś prototyp po prostu, w Pythonie możemy zrobić to błyskawicznie, sprawdzić, czy dane rozwiązanie działa, jeśli tak, to cóż, zawsze można wersję produkcyjną zaimplementować w innym języku.

    # Wady

    ## Python językiem dynamicznie typowanym
    Chwila, moment, przed sekundą jeszcze, pisałem, że jest to zaleta. Co jest? Dynamiczne typowanie Pythona to zaleta, która umożliwia nam tworzenie pewnych świetnych mechanizmów, ale i również, w rękach niedoświadczonego programisty, wada.

    Umożliwia ona bowiem stworzenie kodu, który spowoduje kompletnie nieoczekiwane, trudne w debugowaniu błędy, którym można by zapobiec w języku statycznie typowanym, w którym to taki kod w ogóle by nie został skompilowany.

    W Pythonie, czy innych dynamicznie typowanych językach, takiego mechanizmu nie ma, więc trzeba tutaj nieco uważać, by nie stworzyć błędu, który będzie później trudny do zdiagnozowania i zdebugowania.

    Oczywiście obecnie mamy narzędzia, które nam ułatwiają to zadanie, czy nawet upodobniają w pewnym stopniu Pythona do języków statycznie typowanych, gdyż istnieją, chociażby, adnotacje typów, pozwalające nam podawać to, jaki typ powinna mieć zmienna/funkcja. Niemniej jednak nie jest to obowiązkowy czy konieczny element języka i nie spowoduje on błędu podczas próby uruchomienia aplikacji, a jedynie co najwyżej ostrzeżenie, które można zwyczajnie zignorować.

    Zatem dynamiczne typowanie jest nieco jak nóż, z jednej strony możesz użyć go do zrobienia czegoś fajnego, dobrego posiłku na przykład, a z drugiej strony, musisz żyć, ze świadomością, że należy zwracać szczególną uwagę, gdy się z nim obchodzisz, bo możesz się skaleczyć.

    Jednakże czy z tego faktu należy rezygnować z korzyści i zastosowań, jakie on ma? Nie w tym wypadku.

    ## Wydajność
    Jedno jest jasne – jeśli chodzi o kwestie ściśle wydajnościowe, Pythonowi daleko do miana króla.

    Oczywiście, obecnie się to zmienia, ale sama natura Pythona jako języka interpretowanego sprawia, że nigdy nie będzie on tak szybki, jak kompilowany do natywnego kodu C, czy inne języki tego typu. Trzeba się z tym pogodzić i już.

    Oczywiście nie twierdzę tutaj, że Python jest bardzo powolny, czy ociężały. Nie. Python nie jest wolny, wręcz przeciwnie – dzięki różnym optymalizacjom poczynionym na przestrzeni lat, Python naprawdę zyskał na szybkości i dziś śmiało stwierdzam, że jest to język wystarczająco szybki, ale mocno należy zaznaczyć, że nie jest to język najszybszy. I tyle.

    A jak już o wydajności mówimy to i o rozmiarach wspomnę – wymagania sprzętowe Pythona sprawiają, że na niektórych platformach go po prostu nie uruchomimy. Są pewne obszary świata embedded, gdzie króluje C czy assembler, Python tam nie istnieje i nie ma co z tym dyskutować.

    Oczywiście są też projekty jak RaspberryPi, gdzie faktycznie, Python również rządzi wszystkim.

    Czyli jeśli chcesz pisać wysoce wydajne gry z piękną grafiką, czy też może wielowątkowe aplikacje, które w rzeczywistym czasie obsługują ogromne ilości obliczeń, albo może malutkie mikro-kontrolery, to cóż, Python nie jest raczej zbyt dobrym wyborem w takim razie.

    W innych przypadkach raczej śmiało można Pythona używać i nie przejmować się szybkością wykonania/zasobami. Dlaczego? Otóż żyjemy w takich czasach, że czas serwera jest znacznie tańszy niż czas dewelopera. To znaczy lepiej, żeby język był może i kapkę wolniejszy, ale za to, jeśli pisze się w nim znacznie szybciej, to go wybieramy. Tak jest po prostu taniej, lepiej, zdrowiej.

    Tak to przynajmniej się ma w znacznej większości projektów, gdyż tych, które nie mogą sobie pozwolić na to minimalne zwolnienie, jest niezbyt dużo.

    ## GIL
    W Pythonie mamy coś takiego jak GIL – Global Interpreter Lock. Nie będę się tutaj rozwodził nad szczegółami tego mechanizmu, wystarczy, że będziesz wiedział, iż to przez niego Python nie do końca jest idealnym wyborem, kiedy przyjdzie nam rozmawiać o wielowątkowych aplikacjach, gdyż tylko jeden wątek w danym momencie może mieć dostęp do interpretera, bo GIL blokuje resztę.

    Co prawda da się to teraz w miarę łatwo obejść, ale wciąż coś takiego pozostaje i trzeba nauczyć się z tym radzić.

    ## Wysoka ekspresywność
    Ponownie, coś, co jest zaletą, jest również troszkę wadą. Dlaczego? Python ukrywa pewne rzeczy przed tobą, programistą, co powoduje, że nie zawsze wiesz, jak jest to zrobione ‘od podszewki’. Nie jest to do końca dobre, bo czasami przydaje się wiedzieć, jak pewne rzeczy zostały zaimplementowane i dlaczego akurat tak.

    Sporo to wyjaśnia. Prostym tego przykładem jest częste pytanie – dlaczego indeksujemy listy czy tablice od 0? Jeżeli jesteś programistą C/C++, najprawdopodobniej znasz odpowiedź.

    Programiście języków wysokopoziomowych zaś nie zawsze ją znają. Nie bój się, jeśli nie wiesz, ten temat poruszymy w innym artykule.

    Jest to jednak mała cena, jaką trzeba za płacić w porównaniu z tym, co ta ekspresywność i wysoka abstrakcja oferuje. Po prostu to problem łatwy do naprawienia – wystarczy trochę chęci, by poczytać kapkę więcej. A czas, który poświęcimy na zgłębienie tych różnych tematów, jest o wiele krótszy niż czas, który poświęcilibyśmy, pisząc swój program w języku o niższym stopniu abstrakcji/ekspresywności.
    Python nie istnieje w świecie mobile
    Aplikacje mobilne i Python to raczej dwa odmienne światy. Tak po prostu i już. Na pewno istnieją projekty próbujące coś w tym zakresie wskórać, ale nie ma co się łudzić.

    ## Python jest zbyt… wygodny
    Często może być tak, że po tym, jak zaczniesz pisać w Pythonie, przesiadka na inne języki, gdzie pewne rzeczy musisz zrobić zupełnie inaczej, jest troszkę bolesna. To również potencjalna wada Pythona.

    #programowanie
    pokaż całość

  •  

    # Python 3.8

    Niedawno miała miejsce premiera Pythona 3.7, który przyniósł ze sobą kilka ciekawych rzeczy, jak async, await, opóźnioną ewaluację adnotacji typów czy breakpoint(). Pisałem już o tym na blogu. jak i na Steemit.

    Prace nad nowymi wersjami jednak nie ustają i nadchodząca wersja - Python 3.8 prawdopodobnie również przyniesie ze sobą coś ciekawego, o czym ostatnio sporo się rozmawia.

    # Co to takiego?

    Otóż chodzi o możliwość przypisywania zmiennych nie tylko w stwierdzeniach a również i w wyrażeniach. Cóż to takiego znaczy?

    Mała notka, nie jestem pewien, czy poprawnie przetłumaczyłem te zdania. Raczej nie korzystam z polskich źródeł i nie wiem, czy takich też używają polscy autorzy. Dla pewności chodzi mi o statement i expression.

    # PEP 572

    W tym dokumencie, tej propozycji wprowadzenia zmiany, którego autorami są Guido van Rossum, Chris Angelico czy Tim Peters, proponowane jest, by od wersji 3.8 Python wspierał przypisywanie zmiennych nie tylko w stwierdzeniach, ale również i wyrażeniach, za pomoca operatora NAME := expr.

    No dobrze, ale co to znaczy w praktyce. Spójrzmy na kod.

    data = None
    if our_function_getting_json(some_arg) is not None:
    data = our_function_getting_json(some_arg)
    data.do_stuff()


    Raczej proste do zrozumienia, zasadne, racja? Przykład z pewnego kodu wzięty. Przykład brzydki. Powyższy kod ssie w tym kontekście.
    Jak można by go poprawić?

    data = our_function_getting_json(some_arg)
    if data is not None:
    data.do_stuff()


    Możemy zrobić coś takiego, ale czy to najkrócej jak się da, najlepiej jak się da? Obecnie raczej tak, ale...

    Fajnie by było, gdyby można było zadeklarować tą zmienną tam w tym ifie - zapisać po prostu wynik funkcji tam, gdzie jest ona pierwotnie używana. Ważne jest to tam, gdzie chcemy później np. wykonać jakieś operacje na wyniku wyrażenia, które wykonaliśmy, np. w warunku, ale przez to, że w wyrażeniach obecnie nie można zapisywać zmiennych, to musimy zapisać ją sobie sami, wcześniej. Czy to w pętlach, czy w list comprehensions, lambda functions czy w innych.

    Obecnie inaczej się nie da. To znaczy, w tym wypadku:

    if (data = our_function_getting_json(some_arg)) is not None:
    data.do_stuff()


    Jedyne co otrzymamy, to błąd. Taki zapis jest nieprawidłowy.

    Od Pythona 3.8 najprawdopodobniej będziemy jednak mogli zrobić coś podobnego:

    if (data := our_function_gettin_json(some_arg)) is not None:
    data.do_stuff()


    Krócej, czyściej, lepiej.

    Popatrzmy na inne przykłady.

    if (match := pattern.search(data)) is not None:
    match.do_stuff()


    Ponownie, zamiast musieć wcześniej definować zmienną, zapisać do niej dane wyrażenie, sprawdzić ją potem, możemy zrobić to w jednym miejscu.

    while (value := read_next_item()) is not None:
    ...


    Alternatywa do 2 argumentowej wersji inwokacji iter().

    Teraz coś ciekawego - użycie tego w list comprehensions. Wydaje mi się, że to tutaj ten proponowany element języka będzie błyszczał.

    filtered_data = [y for x in data if (y := f(x)) is not None]


    Inny fajny przykład, gdzie można użyć tego operatora:

    results = [(x, y, x/y) for x in input_data if (y := f(x)) > 0]
    # lub też coś takiego jak niżej
    stuff = [[y := f(x), x/y] for x in range(5)]


    # Gdzie to nie przejdzie?

    Na razie podałem wam przykłady tego, gdzie nowego operatora := można by użyć, ale gdzie będzie to zakazane?

    Zacznijmy od pierwszego obostrzenia - := nie będzie można używać po prostu jako zamiennika =. To by było bez sensu - dwa operatory wykonujące tą samą czynność w tych samych miejscach. Skąd wtedy wiedzieć, którego lepiej użyć?

    Zatem, jeśli wcześniej mieliśmy kod:

    something = 'lalala'
    something2 = 'hey'


    I zmienimy go na:

    something := 'lalala' # BŁĄD
    something2 = 'hey' # OK


    Bo tak po prostu jakoś nam się uwidzi, to kod taki nie zadziała. Nie ma zatem takiego miejsca, gdzie operator := i = byłyby jednocześnie poprawne. Zwykłe, tradycyjne przypisanie? =. Miejsce, gdzie nie możesz użyć =, czyli domyślnie wyrażenie? :=. Prosta sprawa, nie inaczej.

    Nie będzie ich też można 'łączyć ze sobą.' Co to znaczy?

    y = y1 := f(x) # BŁĄD


    Taki zapis nie przejdzie. Ponownie byłoby to niepotrzebne, mylące i zbędne. Nie chcemy redundancji w Pythonie. Wszystko ma być czytelne, dlatego też taką operację można zastąpić następującym zapisem:

    y = (y1 := f(x)) # OK


    Innym tego przykładem mogło by być:

    bar(x = y := f(x)) # BŁĄD
    bar(x = (y := f(x))) # OK


    To również nie zadziała - bez nawiasów nie wolno używać przypisania w wyrażeniu jako wartości dla keyword-argument. Ponownie - żeby czytelność była.

    Dyskusja toczy się, czy zapis poniżej powinien być dozwolony

    foo(x=0, y := f(0))
    bar(x := 0, y = f(x))


    Czyli używanie keyword-arguments i przypisania w wyrażeniu jednocześnie w wywołaniu funkcji. Co z tego wyjdzie, to się okaże.

    Przypisania w wyrażeniu nie będzie można też użyć podczas definiowania domyślnych wartości argumentów funkcji czy też w pośrednich jego wyrażeniach. Co to znaczy?

    def foo(answer = p := 42): # BŁĄD
    def bar(answer = (p := 42)): # BŁĄD
    def baz(callback = (lambda arg: p := arg)): # BŁĄD


    To chyba tyle, jeśli chodzi o główne przypadki gdzie można, a gdzie nie można będzie użyć :=. Oczywiście, to, że dana konstrukcja jest dozwolona, nie znaczy, że należy jej używać w każdym miejscu, gdyż większość z tych możliwości wymienionych wyżej, jest niepotrzebnie komplikującym elementem kodu i raczej nie powinno się ich tak wykorzystywać, := powinien byc używany tam, gdzie faktycznie uprości on kod, a nie wszędzie, bo to jakaś fajna nowinka technologiczna.

    # Różnice między dwoma operatorami

    Różnice są widoczne chociażby wtedy, kiedy chcemy przypisać wartości do wielu zmiennych jednocześnie. Jak to wygląda?

    x = y = z = 0
    (x := (y := (z := 0)))


    Bardzo brzydki konstrukt, racja?

    Przypsanie w wyrażeniu może być tylko w postaci NAME := exp, to znaczy, że takie operacje jak:

    x[0] = 0
    some_obj.prop1 = 'something'


    Nie będą wspierane przez NAME := exp.

    Podobnie +=, -=, *= itd. również nie zadziała podczas używania :=.

    x += y


    Trzeba będzie to zrobić tak:

    (x := x + y)


    # Podsumowanie

    Nowego operatora przypisania w wyrażeniu, będzie można użyć do uproszczania list comprehensions, zapisywania wartości warunków czy innych wyrażeń.

    Oczywiście nic nie jest jeszcze pewne, wciąż prowadzi się dyskusje na temat tego, jak to wszystko ma wyglądać i działać, zmienić się może nawet sam operator, bo rozważane, zamiast :=, są jeszcze as albo -> itd., ale taki mniej więcej będzie tego obraz.

    Artykuł można przeczytać też na moim blogu, o tutaj. O tyle tam ładniej, że kolorowanie składni jest.
    Albo na steemit, tu, jeśli ktoś korzysta.
    #programowanie #mlodyprogramuje #python
    pokaż całość

  •  

    Obudziłem się dziś o 2 w nocy bo mi się zachciało #programowanie i tak siedzę od nocy jak pajac i piszę XD

  •  

    Dlaczego indeksujemy od zera?

    Sprawa jest dość prosta.

    #include <stdio.h>

    int main(void) {
    int numbers[] = {1,2,3,4};
    printf("numbers in general: %p -- %p\n", &numbers, numbers+0);
    for (int i = 0; i < sizeof(numbers)/sizeof(numbers[0]); i++) {
    printf("number no. %i: %p -- %p -- value: %d\n", i, &numbers[i], numbers+i, *(numbers+i));
    }
    printf("int size: %d\n", sizeof(int));
    return 0;
    }


    Powyższy kod wyświetli nam w konsoli coś takiego:

    numbers in general: 0x7ffc9f728f20 -- 0x7ffc9f728f20
    number no. 0: 0x7ffc9f728f20 -- 0x7ffc9f728f20 -- value: 1
    number no. 1: 0x7ffc9f728f24 -- 0x7ffc9f728f24 -- value: 2
    number no. 2: 0x7ffc9f728f28 -- 0x7ffc9f728f28 -- value: 3
    number no. 3: 0x7ffc9f728f2c -- 0x7ffc9f728f2c -- value: 4
    int size: 4


    Przeanalizujmy troszkę o cóż tu chodzi.

    Zanim to zrobimy, zaznaczę tylko, że Ty, jeśli uruchomiłeś ten kod u siebie, mogłeś dostać nieco inne wyniki. To normalne.

    Dla większości osób nieznajomych z C/C++ ten kod może wydawać się nieco kryptyczny, ale w gruncie rzeczy jest dość prosty.

    # Co znaczy ten kd?

    Zacznijmy może od linijki

    printf("numbers in general: %p -- %p\n", &numbers, numbers+0);


    Zakładam, że pierwsza część printa jest zrozumiała dla każdego, może poza %p - to po prostu nam mówi, że argument do wyprintowania będzie specyficznym typem danych.

    # & - co to jest?

    &numbers - znaczek & zaś mówi, że chcę otrzymać adres danej zmiennej - czyli jej lokację w pamięci. Bo jak dobrze wiemy, zmienne alokowane są w pamięci, w pewnym miejscu wybranym przez komputer. To miejsce zazwyczaj opisuje się jako 'adres' - czyli liczba bajtów od 'poczatku' pamięci, którą procesor musi 'przeskoczyć', by dotrzeć do danej zmiennej.

    Nasza tablica (czyli taka jakby lista z Pythona, ale nie do końca), znajduje się pod adresem: 0x7ffc9f728f20 (zapis szesnastkowy), i jest to tym samym adres naszego pierwszego elementu.

    Kompilator musi musi jednak wiedzieć, pod jakim adresem znajduje się następny element naszej tablicy. Skąd? Otóż prosta sprawa.

    Zadeklarowaliśmy, że elementy naszej tablicy będą typu int. Typ int na komputerze, z którego korzystam, jest akurat 4 bajtowy, czyli 32 bitowy. Jest to w zasadzie standard, ale czasami są odstępstwa od reguły, zależnie od architektury, stąd też ten sizeof(int) w kodzie - zwraca on rozmiar danego typu w obecnym środowisku.

    Dlatego też, jeśli 0x7ffc9f728f20 jest adresem pierwszego elementu, który zajmuje w pamięci 4 bajty o adresach: 0x7ffc9f728f20, 0x7ffc9f728f21, 0x7ffc9f728f22, 0x7ffc9f728f23, to możemy wnioskować, że następny element tej tablicy będzie po nim, pod adresem 0x7ffc9f728f24, czyli 4 bajty dalej. Następny znowu kolejne 4 bajty i tak dalej, aż do ostatniego elementu.

    # Prosty wzór

    Zatem adres konkretnego elementu tablicy można określić wzorem adres_pierwszego_elementu+(index*rozmiar_typu). Z takiego też wzoru korzysta komputer - za każdym razem, gdy piszesz numbers[index] kompilator tłumaczy to sobie wewnętrznie na *(numbers+(index*rozmiar_typu)). Co znaczy *? Nic innego, jak 'idź pod dany adres i weź wartość znajdującą się pod tym adresem.'

    Zatem gdy napiszemy numbers[0], to nasz kompilator przetłumaczy to na *(0x7ffc9f728f20+0), czyli *(0x7ffc9f728f20), co z kolei znaczy: weź wartość z tego adresu i wstaw ją tutaj.

    W przypadku np. numbers[1], będzie to *(0x7ffc9f728f20+(1*sizeof(int))) = *(0x7ffc9f728f20+(1*4)) = *(0x7ffc9f728f20+4), czyli *(0x7ffc9f728f24). Jasne? Jak dla mnie tak. Jeśli masz problem ze zrozumieniem tego konceptu, nie przejmuj się, wiele osób nie do końca rozumie wskaźniki, adres i pamięć. Ja też miałem z tym problem. Przynajmniej na początku.

    Możesz wspomóc się filmikami Gynvaela czy wykładami z CS50 - kursu z Harvardu oni, jako osoby o znacznie większej wiedzy, tłumaczą całe zagadnienie znacznie lepiej niż ja.

    # Jak by to wyglądało, gdybyśmy indeksowali od 1?

    Załóżmy, że indeksujemy od 1. Wtedy wzór musiałby ulec modyfikacji - i wyglądałby on tak:

    adres_pierwszego_elementu+((index-1)*rozmiar_typu)


    Innym rozwiązaniem byłoby przesunięcie lokacji pierwszego elementu tablicy o 4 bajty do przodu względem adresu samej tablicy, ale wtedy nasza tablica zajmowała by dodatkowe miejsce w pamięci i to niepotrzebnie, gdyż te pierwsze x bajtów, gdzie x to rozmiar danego typu danych, byłoby po prostu puste. To raz, dwa, że trzeba by pamiętać, że adres tablicy nie jest adresem pierwszego jej elementu.

    Oba te rozwiązania są bezsensowne, bo o ile nie jest to niby dużo - kilka bajtów na każdej tablicy, czy jedna operacja odejmowania, to gdy pomnożymy to sobie przez ilość takich zmiennych, które mamy w pamięci, to już wyjdzie całkiem pokaźna sumka bajtów/operacji, które w istocie rzeczy, są zbędnie zajmowane.

    Dodatkowo ileż kodu bazuje już na indeksowaniu od 0. Niemożliwym by było to wszystko zmienić.

    Oczywiście, są również inne argumenty, by indeksować czy liczyć elementy od zera, jak chociażby te, głoszone przez Dijsktrę. To taki raczej znany i ważny Pan, dla tych, którzy nie kojarzą ;)

    # Podsumowanie

    Jak widać powyżej, indeksowanie od 1 jest nieco absurdalne, kiedy wiesz, jak proces dostępu do elementów tablicy wygląda od środka.

    We wpisie użyłem troszkę 'uproszczeń', także za niedokładności z góry przepraszam.

    Kto chce, może też wpaść na mojego bloga, podbić mi wyświetleń, o tutaj: https://grski.pl/indexing-from-zero.html
    Albo na steemit, o tutaj: https://steemit.com/pl-artykuly/@grski/dlaczego-w-programowaniu-indeksujemy-od-zera

    #programowanie #gruparatowaniapoziomu #informatyka
    pokaż całość

  •  

    przepraszam za złe formatowanie, ale cannot into mirko

    Hej! Ekscytujący dzień, wczoraj premierę miała miejsce nowa wersje Pythona o numerze 3.7, w której troszkę się dzieje, dlatego dziś po krotce opiszę, cóż nowego przyniosły nam kolejne PEPy.

    # Zacznijmy od czegoś, na co czekałem: async i await

    Te dwa wyrazy są od teraz zarezerwowane jako słowa kluczowe, jest to zmiana łamiąca kompatybilność wsteczną, ale to nic!

    Te keywordy wprowadzają do Pythona piękne ułatwienie co do programowania asynchronicznego, dzięki którym kod wykonywany asynchronicznie można pisać praktycznie tak, jak kod wykonywany tradycyjnie.

    Rozwiązane znane, chociażby z Darta, gdzie robi piękną robotę, czy nawet JS'a. Cieszy mnie, że i w Pythonie teraz oficjalnie to mamy.

    # PEP 563 - opóźniona ewaluacja adnotacji typów

    Python jest językiem typowanym dynamicznie, niemniej jednak od jakiegoś czasu już, mamy w nim coś takiego jak adnotacje typów - możemy dać znać programiście, jaki typ dana metoda powinna zwracać. Zwrócenie innego co prawda nie spowoduje, że nam się program wysypie, co najwyżej jakieś ostrzeżenie, ale wciąż, to jakaś pomoc przy debugowaniu.

    Do tej pory adnotacje typów negatywnie wpływały na czas startu pythonowych skryptów - wydłużały go. Naprawiono ten błąd. To pierwsza sprawa.

    Druga, nie mniej ważna, to fakt, że do tej pory w adnotacjach typów można było używać jedynie istniejących w chwili deklaracji typów/nazw. Co to znaczy?

    `
    class C:
    @classmethod
    def from_string(cls, source: str) -> C:
    ...

    def validate_b(self, obj: B) -> bool:
    ...

    class B:
    ...

    Żeby ten kod kiedyś zadziałał, to musiałby wyglądać tak:

    class B:
    ...
    class C:
    @classmethod
    def from_string(cls, source: str) -> C:
    ...

    def validate_b(self, obj: B) -> bool:
    ...
    `

    To tak jakby w Pythonie coś niżej miało powodować błąd.
    `def fa():
    f
    b()

    def f_b():
    ...`

    Z racji tego, że powyższy zapis jest poprawny, bo metody mają opóźnioną ewaluację, to i do adnotacji typów trzeba było to dodać. Dokładniej, o co chodzi?

    Po prostu w adnotacjach typów dostępne były jedynie te nazwy, które są wbudowane, lub były dostępne już w lokalnym scope w 'linijce' dodawania adnotacji. Od teraz nie ma takiego problemu, gdyż ewaluacja adnotacji została opóźniona.

    Dodatkowo warto wspomnieć, że ten PEP został przygotowany przez Polaka - Łukasza Langa

    # PEP 538: poprawiona obsługa strategii 7-bitowego ASCII i tekstu na starych platformach

    Python jako język jest starszy od Unicode. Nieźle, co? Przez to w jego pierwszej implementacji nie było domyślnego wsparcia dla Unicodu, a wszystko siedziało w ASCII. Obecnie jednak, w czasach globalizacji, nie jest to rozwiązanie możliwe do utrzymania, stąd obecnie zarówno Python2 jak i Python3 wspierają UTF-8, przy czym wersja nr 3 domyślnie używa utf'a. Python2 ze względów kompatybilności wciąż na ASCII głównie siedzi, ale to nic. Do 2020 przestanie być w końcu wspierany także fajnie : )

    # PEP 540: Wymuszanie tryby uruchomienia UTF-8
    Używając argumentu -X utf8 czy też zmiennej środowiskowej PYTHONUTF8, można wymusić na CPythonie tryb UTF-8. Wtedy CPython ignoruje kompletnie lokalne ustawienia systemu i wali sobie wszystko w UTF-8.

    Wada: to wymuszanie nie ma wpływu na niektóre moduły (np. GNU readline), procesy potomne nie-Pythonwych appek i procesy potomne wywołujące starsze wersje Pythona.

    # PEP 553: Wbudowany breakpoint()
    Nowa wbudowana metoda - breakpoint(). Łatwy i nowy sposób na to, jak sobie w danym fragmencie kodu przejść do debuggera.

    Robi on nic innego, jak wywołuje metodę 'sys.breakpointhook()', tyle, że ta metoda domyślnie importuje 'pdb' natomiast 'breakpoint()' może wywołać dowolnie wybrany przez nas debugger.

    Można wyłączyć poprzez ustawienie PYTHONBREAKPOINT w env variables na 0.

    # PEP 539: Nowe C API dla Thread-Local Storage

    Cóż, tutaj za dużo się nie będę rozpisywał, tak jak mówi sam tytuł.

    # PEP 562: Zmieniony dostęp do atrybutów modułów

    Mówiąc krótko - zmiana tego jak i gdzie można używać geattr() na modułach.

    # PEP 564: Nowe funkcje z dokładnością co do nanosekundy.

    Jak wam kiedyś brakowało dokładności w mierzeniu czasu pythonem, to teraz już chyba nie.

    PEP 564 dodaje 6 nowych wariantów istniejących już funkcji z modułu 'time', które pozwalają operować na nanosekundach.

    time.clock_gettime_ns()
    time.clock_settime_ns()
    time.monotonic_ns()
    time.perf_counter_ns()
    time.process_time_ns()
    time.time_ns()


    Na Windowsie i Linuxie dokładność tych funkcji jest ponad 3 razy lepsza niż np. time.time().

    # PEP 565: wyświetlanie DeprecationWarning w main
    Jeśli w naszym skrypcie znajdzie się jakiś kod, który jest już zdeprecjonowany, i będziemy go używać, chociażby w jakimś naszym skrypcie, w ciele main, od teraz będziemy widzieć powiadomienia o deprecjacji danego rozwiązania.

    Głównie chodzi tutaj o jakieś proste skrypty czy sytuacje gdy używamy Pythona interaktywnie.

    Ostrzeżenia wywołane przez zaimportowane moduły czy biblioteki wciąż pozostaną domyślnie ukryte.

    Wcześniej 'DeprecationWarning' było widoczne tylko podczas uruchamiania testów. Not anymore! I dobrze.

    Dlatego od teraz w Pythonie, a konkretniej w bibliotece standardowej, mamy trzy różne warning deprecation o różnych zachowaniach.


    FutureWarning: domyślnie zawsze wyświetlany
    DeprecationWarning: domyślnie wyświetlany, tylko jeśli kod uruchomiony w __main__ i kiedy uruchomimy testy
    PendingDeprecationWarning: domyślnie wyświetlany, tylko jeśli kod uruchomiony jest w testach i mówi nam to o tym, że w przyszłości będzie dane zachowanie zmienione


    # PEP 560: wsparcie core języka dla modułu typing i Generic Types
    Nic dodać, nic ująć.

    # Nowy tryb runtime: -X dev
    -X dev czy też zmienna środowiskowa PYTHONDEVMODE sprawia, że w CPythonie włączy się development mode, który zaś powoduje, że CPython wykonuje pewne dodatkowe operacje, sprawdzenia, podczas uruchomienia, które jednak zajmują za dużo czasu, więc by default są wyłączone.

    # PEP 552: pliki .pyc oparte na Hashu!
    Wcześniej było tak, że python sprawdzał sobie to, czy bajtkod jest aktualny poprzez porównanie nagłówków zcachowanych plików (.pyc) do metadata plików źródłowych - data ostatniej modyfikacji i rozmiar. Był z tym problem, kiedy zmiany były na tyle blisko siebie w czasie lub na tyle małe, że Python ich 'nie widział', zatem nie kompilował sobie ponownie kodu źródłowego do bajtkodu, co mogło okazać się problematyczne, np. w odtwarzaniu bugów z produkcji czy coś.

    Od teraz sprawdzanie będzie po hashu zamiast po timestampie czy rozmiarze, jednakże nie jest to opcja domyślna - runtime Python dalej będzie używać timestampów, jednakże możemy wygenerować sobie .pyc walidujące po hashu za pomocą 'py_compile' czy 'compileall'.

    # Yield w comprehensions i generator expressions
    Dostał deprecated. Na razie tylko DeprecationWarning, ale od 3.8 wyrzuci nam już SyntaxError, także uważajcie na nowy kod. Chodzi o to, by nie mieszać tam, gdzie nie trzeba i żeby lisit comprehensions zawsze zwracał jakąś listę a nie np. właśnie generator.

    # Nowe moduły

    Kilka nowych modułów też wpadło, opisujemy!

    ## contextvars
    Wsparcie dla context variables - podobne są one dla zmiennych lokalnych dla danych wątków, jednakże w przeciwieństwie do nich, poprawnie obsługują one kod asynchroniczny. Kolejna zmiana, która mnie cieszy.

    'asyncio' i 'decimal' od teraz domyślnie używają i wspierają context variables.

    ## dataclasses
    Coś, co mi się podobało od dawna - dzięki temu dekoratorowi możemy zaoszczędzić sobie pisania sporej ilości bojlerkodu. Co prawda w Pythonie i tak jest go niedużo, ale wciąż.

    Ten dekorator generuje dość standardowy konstruktor, czy metody takie jak 'repr(), eq(), hash()' za nas. Oczywiście sami możemy wybrać, co konkretnie wygeneruje a co nie.

    Poczytajcie, bo ciekawy temat.

    ## importlib.resources
    Nowe APi i jedna nowa ABC (Abstract Base Class) do obsługi resourców z innych paczek.

    # Zmiany w modułach

    ## argparse
    Nowa metoda 'ArgumentParser.parseintermixedargs()' pozwala na mieszanie ze sobą w kolejności opcji i argumentów pozycyjnych.

    ## asyncio
    Tutaj sporo zmian, nowych ficzerków i upgrejd jeśli chodzi o wydajność.
    Jest ich tu na tyle dużo, że raczej zachęcam do zapoznania się z nimi samodzielnie.

    ## fpectl został usunięty

    ## FreeBSD 9 i starszy już nie są oficjalnie wspieranymi platformami

    # Pomniejsze zmiany

    Od teraz w konsoli można przekazywać więcej niż 255 argumentów, podobnie funkcje mogą mieć również więcej niż 255 parametrów.

    'bytes.fromhex()' oraz 'bytearray.fromhex()' od teraz ignorują wszelakie whitespace z ASCII - nie tylko spacje.

    'str, bytes, bytearray' od teraz obsługują nową metodę 'isascii()', która sprawdza czy string albo bajty zawierają tylko znaki ASCII.

    od teraz 'object.format(x. '')' będzie znaczył to samo co 'str(x)' a nie tak jak wcześniej 'format(str(sefl), '')'

    sorted() i list.sort() jeszcze szybsze - dla pewnych określonych przypadków te metody działają nawet 40-75% szybciej.

    Podobnie dict.copy() - on jednak jest 5.5 raza szybszy obecnie.

    Zmieniono również sposób generacji bajtkodu, dzięki którym wywołania metod będą 20% szybsze!

    Czas uruchomienia Pythona na linuxie zmniejszono o 10% a na macu o 30%!

    OrderedDict został ogłoszony jako oficjalna część specyfikacji core Pythona!

    # Podsumowanie

    W pythonie 3.7 zmieniło się to i wiele, wiele więcej, jednakże ja sam nie jestem w stanie tego wszystkie opisać. By dowiedzieć się więcej zachęcam do zajrzenia do dokumentacji.

    to samo można przeczytac u mnie na blogu: grski.pl lub steemit
    #python
    #programowanie #mlodyprogramuje
    pokaż całość

    +: Duze_piwo, n.........e +34 innych
  •  

    Jak przeglądam oferty pracy z #programowanie to zaczynam zastanawiać się cyz istnieje firma, która nie jest liderem w branży z młodym, dynamicznym zespołem.

  •  

    mała ankieta, jak ktoś chce może uzasadnić w komentarzu
    #programowanie

    +: Cronox

    Z jakiej konfiguracji OS korzystasz przez większość czasu w pracy?

    • 22 głosy (26.83%)
      Linux
    • 31 głosów (37.80%)
      Windows
    • 3 głosy (3.66%)
      Linux(host)+Windows(guest)
    • 13 głosów (15.85%)
      Windows(host)+Linux(guest)
    • 13 głosów (15.85%)
      macOS
    •  

      @kafapre: Pół roku grzebałem i poddałem się. Lepiej działa to w virtualboxie na windowsie, niż jako główny system. No cóż ¯\_(ツ)_/¯ Teraz jestem leniuchem i wolę gotowy funkcjonalny i szybki system bez zbędnego grzebania, konfigurowania. Nie mam na takie zabawy już czasu.

    •  

      @kafapre: Pół roku grzebałem i poddałem się. Lepiej działa to w virtualboxie na windowsie, niż jako główny system. No cóż ¯\_(ツ)_/¯ Teraz jestem leniuchem i wolę gotowy funkcjonalny i szybki system bez zbędnego grzebania, konfigurowania. Nie mam na takie zabawy już czasu.

    • więcej komentarzy (6)

  •  

    Ma ktoś może Ryzena i może wypowiedzieć się nieco w kwestii wydajności jeśli o programowanie chodzi?
    #programowanie Standardowo - vm'ki, terminale, ide, przeglądarka+milion tabów itd.
    Interesuje mnei też jedno - czy ma ktoś z was porównywalnego konfiguracyjnie lapka i desktop - jaka % różnica w benchmarkach wydajnościowych?
    Wciąż dylemat czy brać lapka czy jednak desktop głównie + jak trzeba mobilnie to ze starego lapka łączyć się remote z desktopem. Budżet ~6k pokaż całość

    +: Cronox

    Na czym pracujesz?

    • 17 głosów (56.67%)
      Desktop
    • 13 głosów (43.33%)
      Laptop
    •  

      @11001100110O11: ram i dysk ssd bardziej wpływają na to co będziesz robił niż ten cpu tak naprawdę :D

      Nie zauważysz różnicy między intelowymi i amd w codziennej pracy.

      Co do destkop vs laptop, jeden rabin powie tak drugi rabin powie nie. Ja pracuję i na laptopie i na desktopie bo się nie mogłem zdecydować :)

    •  

      @11001100110O11: @aseeon_: no procesor też daje kopa, ale powoli coraz fajniejsze te procki robią, w najnowszej generacji nawet te U są dość spoko, w poprzedniej to lapek z U vs cokolwiek innego jak desktop czy lapek z HQ to była ,masakra a praca to mordowanie się z samymi ścinkami :D

      Ale do pracy zdecydowanie wole dobrego laptopa, nawet jak drożej, bo zwyczajnie laptopa też chce mieć a oba sprzęty tylko wadzą i trzeba sie pierdolić z syncem co nigdy nie jest wygodne - więc wole jeden ale porządny.
      No ale aktualnie i tak skończyłem z laptopem służbowym i prywatnym.
      pokaż całość

    • więcej komentarzy (2)

  •  

    Siema #mikrokoksy i #silownia
    Siłka na Woli, najlepiej gdzieś blisko ronda daszyńskiego/spira? Wolne ciężary muszą być koniecznie.

    Do tego jeszcze pytanie do innych ludzi z #warszawa #mma czy #sztukiwalki znacie jakieś miejsce gdzie można iść się posparować kulturalnie, czegoś nauczyć może przy okazji? Nie chodzi mi o rzeczy typu aikido, jiujitsu czy karate i tak dalej, raczej dyscypliny uderzane typu boks czy kickboxing albo muay thai. pokaż całość

  •  

    Szukam jakiejś uczelni, prywatnej najlepiej, z tokiem niestacjonarnym, gdzie za samo płacenie czesnych będą mnie trzymali na liście studentów, najlepiej bez mojego pojawiania się tam.
    Oczywiście, czy będą przepuszczać, czy cały czas na 1 roku, to bez znaczenia. Kierunek też.
    Ktoś jakieś rekomendacje?
    #studia #studbaza najlepiej okolice #warszawa #radom pokaż całość

  •  

    Internet w liczbach: Polska i świat
    W nawiązaniu do poprzedniego posta Internet w liczbach: czym jest CDN i dlaczego jest ważny dziś napiszę trochę więcej o tych konkretnych liczbach właśnie.

    Liczba użytkowników

    Zacznijmy od tego, ile osób korzysta z Internetu. Na podstawie badań firmy eMarketer, przeprowadzonych na początku 2016 roku, przedstawiono przewidywania, według których liczba użytkowników Internetu miała przekroczyć 4 miliardy dopiero gdzieś w 2019 roku, osiągając 4,17 miliarda w roku 2020. Dziś wiemy już, że te modele sprzed dwóch lat są mocno nieaktualne - prognozy na rok 2020 osiągnęliśmy już dziś.

    Świat
    Obecnie użytkowników Internetu jest ponad 4 miliardy, a liczba ta została przekroczona już dawno temu, przynajmniej jak na standardy Internetu - bo aż kilka/kilkanaście tygodni minęło od tego wydarzenia. Porównując to do 1,73 miliarda użytkowników w roku 2009 czy równego miliarda z roku 2006, wyraźnie widać wzrost praktycznie wykładniczy.

    Oznacza to, że około 60% populacji w jakiś sposób jest użytkownikami Internetu. Jak sprawa ma się w Polsce?

    Polska
    W Polsce sprawa ma się nieco lepiej - na 38 milionowy naród, aż 29,75 milionów naszych obywateli korzysta z Internetu, co daje wynik 78%. To dość sporo powyżej średniej a ten wskaźnik ciągle rośnie.

    Z tych prawie 30 milionów aż 17 milionów jest aktywnych na mediach społecznościowych, a 14 milionów korzysta ze społecznościówek za pomocą smartfonów i innych urządzeń mobilnych.

    Można też na to spojrzeć jednak z innej strony - żyje sobie gdzieś w Polsce 8 milionów ludzi, którzy nie mają styczności z Internetem, a obok nich kolejne 13 milionów tych, którzy z nich aktywnie nie korzystają, a mimo to są obecni w sieci.

    Oprócz tego warto wspomnieć, że mamy około 30 milionów użytkowników nowoczesnych telefonów. Łatwo można zauważyć tu pewną korelacje - liczba osób korzystających z komórek, jak i z Internetu jest podobna, nic dziwnego, gdyż z tych dwóch technologii nie korzystają już raczej tylko i wyłącznie osoby starsze, które po prostu są odcięte od postępu technologicznego.

    Sieci komórkowej zaś używa około 96%, jak widać, spora część osób wciąż broni się przed smartfonami, ale to raczej osoby starsze.

    Urządzenia
    Około 70% osób ma smartfony, 80% laptopy lub pcty.

    Tablety co ciekawe, tylko 27%

    Przy tych urządzeniach spędzamy około 5h i 5mm minut dziennie, 1h i 42 minuty na mobilkach i około 3 godziy na tv, przy okazji słuchając muzyki online przez 50 minut.

    Spada również ilość posiadaczy TV - obecnie 88%, a wzrasta ilość osób posiadających smart TV.

    Warto dodać, że Polacy troszczą się o swoją prywatność, przynajmniej z założenia, a w sumie to i w praktyce - 90% uważa, że prywatność jest bardzo ważna, a ponad 40% korzysta z adblocka. Dotarliśmy też do momentu, gdzie już większość, bo 55%, woli załatwiać co tylko możliwe przez Internet - jak najmniej wychodzenia z piwnicy!

    Przy okazji mobilki jak zwykle dominują - prawie 60% ruchu na stronach generują już użytkownicy mobilni. Koniecznością jest liczyć się z nimi. W zasadzie obecnie strony powinno tworzyć się przede wszystkim z myślą o userach mobilnych.

    Dane
    Obecnie dziennie przez sieć przalatuje około 51 miliardów GB dziennie, jest to jednak liczba zapewne znacznie niedoszacowana z racji tego, że nie uwzględnia pewnych czynników a jedynie sztywne skalowanie liniowe danych z roku 2016, a doskonale wiemy, że transfer dzienny rośnie w tempie wykładniczym, a nie liniowym. Niemniej daje to jednak jakiś pogląd.

    Jak już o mobilkach mowa - warto wspomnieć, że ilość danych komórkowych wykorzystywanych przez userów mobilnych potroiła się od 2014 roku, sięgając wielkości 8 exabajtów. Ile to jest? 8 miliardów gigabajtów. Troszkę mi się w głowie te liczby nie mieszczą, a wam?

    Szacuje się, że do 2025 ta liczba zwiększy się 10-krotnie i osiągnie około 500 miliardów GB/dzień. Jak to nie jest zachęta do zajrzenia w Big Data, Data Science, to nie wiem co jest - zapotrzebowanie na specjalistów z tej dziedziny znacząco wzrośnie - skąd ich jednak wziąć, skoro już obecnie ich brakuje?

    Wzrośnie też moim zdaniem liczba osób potrzebnych do zarządzania cała infrastrukturą - hardware, te sprawy. Będzie to coraz większym problemem by obsłużyć ciągle rosnącą sieć. Ciekawe wyzwania stoją przed nami.

    Emaile
    W 2017 przez sieć przeleciało 270 miliardów wiadomości e-mail każdego dnia z których ponad połowa była spamem.

    Do 2021 tych wiadomości ma być 320 miliardów.

    SMS
    Nie jest to może internet, ale też ciekawe.
    Dziennie wysyłamy tych smsów łącznie 22 miliardy. Porównując to, do 11 miliardów z roku 2014. Cóż. Trzy lata różnicy a liczba się podwoiła. Niesamowity wzrost.

    Socjalki
    650 milionów tweetów na dzień. Ogarnijcie jakie serwery, jakich technologii trzeba użyć, żeby tyle syfu obsłużyć. Nie pojmuję.

    A co do reszty - to łącznie socjalki typu snapchat, fb, insta co minutę zyskują ponad 840 userów. 1200000 dziennie.

    Na fejsbuku co minutę pojawia się 510000 nowych komentarzy, 293000 nowe statusy i 136000 nowych zdjęć.

    W tym samym czasie google jest o coś pytany 3607080 razy.

    Prędkość
    Średnia prędkość połączenia kablowego w Polsce wynosi 44 MBPS. Nieźle. Na mobilce wynik nieco mniejszy - 22 MBPS.

    Czuję tu trochę niedosyt, bo sam u siebie mam 10 na kablu i tyle samo na mobilce. : (

    Podsumowanie
    Rzuciłem w was garścią statystyk, pora jednak wyciągnąć jakieś wnioski. Jakie?
    Mobilki rosną tak jak Internet. Nie powstrzymamy tego - trzeba skupiać się na responsywnych stronach mobile-friendly, ale nie zapominać wciąż o desktopach - ~40% to wciąż ogromna ilość. Do tego warto pomyśleć o karierze w Big Data czy generalnie rzeczach związanych z przetwarzaniem czy obsługą danych, bo tak naprawdę dane będą stawały się (a może już są) nową walutą, którą często płacisz, tylko nawet o tym nie wiesz

    Źródło: badania firmy hootsuite,
    https://blog.microfocus.com/how-much-data-is-created-on-the-internet-each-day/
    https://www.slideshare.net/wearesocial/digital-in-2018-in-eastern-europe-part-1-west-86864848
    własne wykresy
    #mlodyprogramuje #gruparatowaniapoziomu
    pokaż całość

  •  

    Czym jest Content Delivery Network i dlaczego to ważne?
    CDN - Content Delivery Network, to taki cichy bohater, z którego praktycznie każdy z nas korzysta, ale mało kto cokolwiek o nim wie, no, chyba że jesteś sieciowcem, czy programistą, chociaż w sumie to i wśród programistów zdarzają się tacy, którzy skrótu tego nie kojarzą. A powinni, bo to w zasadzie dzięki nim mogą bez problemów korzystać z mobilnej sieci, mniej płacić za Internet, to dzięki CDNom nie zacina ci się film ze śmiesznymi kotkami na youtubie, a twój operator może obsłużyć obecną liczbę klientów zamiast np. połowy. Wiem, trochę przesadzam, ale no tak troszkę tylko.

    Wprowadzenie
    Najpierw jednak garść informacji, by zyskać nieco perspektywy. Żyjemy w czasach, gdzie egzystencja bez Internetu jest praktycznie niemożliwa, a na pewno bardzo niewygodne. Większość dzisiejszych luksusów w jakiś sposób bazuje/korzysta z tego wynalazku. Często jednak nie zdajemy sobie sprawy z tego, jak ogromny ten Internet jest i jak szybko się rozwija, pozwólcie, że wyjaśnię.

    W tym roku przekroczyliśmy kolejną barierę - obecnie na Ziemi żyje 4 miliardy ludzi korzystających z Internetu, czyli to aż 53% populacji. Jest to wzrost niesamowity, biorąc pod uwagę fakt, że jeszcze 4 lata temu użytkowników Internetu było około 2,4 miliarda, a to dopiero początek roku w zasadzie.

    W 2016 dziennie przez Internet przelatywało 44 miliardów GB danych na dzień. Biorąc pod uwagę fakt, że wtedy userów było znacznie mniej, to uwzględniając użytkowników obecnych, daje to nam około 51 miliardów GB dziennie. Oczywiście jest to mocno niedoszaczowany wynik, gdyż nie dość, że użytkowników przybywa, to i jeszcze pochłaniają oni coraz więcej danych, ale na potrzeby tego artykułu wystarczy, gdyż jakiś obraz to nam daje.

    Średni użytkownik smartfona zużywa w ciągu miesiąca 2.9 GB transferu mobilnego (dane ze stycznia). To 50% więcej niż rok temu. Sieć rozwija się w zatrważającym tempie. Dlaczego w zatrważającym? Cóż, o ile chodzi o połączenie kablowe, to aż takiej tragedii nie ma, no bo można dołożyć kabel czy dwa, chociaż to też wszystko skomplikowane i kosztowane, to prawdziwy problem rodzi sieć danych komórkowych, gdyż jest ona mocno ograniczona przez fizykę, a biorąc pod uwagę ciągły rozrost... Cóż, mamy się troszkę o co martwić albo nasza sieć nieco się zapcha.

    I wtedy wchodzi CDN, cały na biało

    Tak. Sytuację całą łagodzi właśnie CDN. Cóż to takiego? To takie serwery, które cachują najpopularniejsze treści w Internecie, by ogólnie odciążyć sieć, skrócić czasy ładowania i zapobiec pewnym problemom, poprawić bezpieczeństwo. Serwery te rozrzucone są po całej Ziemi w miejscach strategicznych geograficznie dla sieci.

    W sieci mamy dostawców treści. Te treści są różne, tekst, obrazki, filmy, multimedia. Dostawcy treści umieszczają je na swoich stronach, serwerach i jest spoko. W momencie, kiedy chcesz sobie coś w Internecie przeczytać czy obejrzeć, to twoje urządzenie łączy się poprzez Internet z serwerem dostawcy treści i przesyła do Ciebie określoną treść. Wszystko spoko, prawda? No nie. Problem pojawia się, kiedy tych danych i użytkowników przybywa na całym świecie. Problem wynika z architektury Internetu. Gdy oglądasz odcinek swojego ulubionego serialu, to twój komputer nie łączy się bezpośrednio z serwerem dostawcy, nie. Zanim się to stanie musi się on przejść przez dziesiątki innych serwerów, które skierują go we właściwe miejsce, tak samo odpowiedź od tego serwera.

    Wyobraź sobie, że jesteś w urzędzie i żeby załatwić określoną sprawę potrzebujesz podpisu dziesięciu różnych urzędników a na koniec jeszcze podpis przełożonego z Ameryki, do którego jest długa kolejka. Zabiera to dużo czasu, energii i tak dalej, prawda? Tak. Skomplikowana sprawa ogółem. Rolą CDN'a jest skrócenie tej listy potrzebnych podpisów do jednego urzędnika, który jest akurat w lokalnym urzędzie.

    Czyli jak z serwerami - twoje zapytanie zamiast tłuc się do serwera w Azji czy Ameryce i męczyć jeden serwer, spyta najpierw lokalnego gościa, który jest miasto obok. W 99% przypadków on wystarczy.

    Szczegóły
    Z serwera Dostawcy Treści do CDNów przesyłane i cachowane tam są pewne dane - jakie? Te, które są najbardziej popularne - to bardzo ważne, by na CDNach utrzymywać głównie te dane, które są najbardziej popularne, gdyż dzięki temu CDNy przejmują większość ruchu, redukując obciążenie sieci osiągając wysoki hit rate.

    Jest to skomplikowany proces, bo przecież w różnych regionach popularne są różne treści, a to jak się one zmienią, nie jest banalne do przewidzenia.

    Algorytmy, które się tu wykorzystuje do tego, by przewidzieć co i gdzie będzie popularne, to naprawdę bardzo ciekawa sprawa i ważna - przestrzeń i zasoby CDNów są ograniczone, zatem wybór tych treści jest trudny. Niesamowity przykład takiej optymalizacji i przewidywanie tego, co będzie akurat popularne, można zaobserwować na przykładnie Netflixa i tego, jak oni to rozwiązują.

    Czym jest hit rate, lifetime?
    Użyłem wcześniej wyrażenia hit rate. To termin, który określa jaki procent requestów userów może być przetworzona przez CDN i tylko CDN, a jaka potrzebuje pomocy z serwera Dostawcy Treści. Obecnie niektórzy potrafią tak zoptymalizować swoje serwery, by hitrate do cache wynosił nawet w okolicach 99%. Niesamowite wyniki.

    Do tego dochodzi jeszcze określenie czasu, przez który raz wgrane treści mają być dostępne - lifetime - po jego wygaśnięciu cache jest 'usuwany' z serwera i na jego miejsce wskakują nowe (albo wciąż te same, jeśli dalej są popularne) dane. Jest on zupełnie różny, zależnie od danych, regionu, samego dostawcy usługi.

    Czy CDN to jeden ogromny serwer?

    Nie, to często całe klastry rozproszonych geograficznie serwerów. Setki tysiące maszyn, które mają pewną hierarchię i według niej działają. Jak?
    Mniej więcej taką. Serwer dostawcy treści to CP.

    Następnie mamy CD & LCF - to taka centrala można by rzec.

    Potem jest CCF a pod nim CDPF. CCF to lokalny urząd, a CDPF to urzędnik.

    Domyślnie, kiedy robisz jakiś request danej treści, to ląduje on w CCF'ie, CCF sprawdza sobie, czy to, czego potrzebujesz, jest gdzieś w jego zasobach, czyli na serwerach CDPF, gdzie trzymane są zcachowane treści.

    Jeśli na jednym nie ma, to leci do kolejnego z CDPFów pod swoją kontrolą. Co, jeśli nie znajdzie na żadnym ze swoich CDPFów? Wtedy zgłasza fakt do CD & LCF, który pyta się kolejno pozostałych CCFów.

    Jeśli każdy CCF stwierdzi, że tego contentu nie ma na CDPFach pod ich kontrolą? Wtedy CD & LCF robi request do serwera twórcy treści, stamtąd sobie dane pobiera. Także oryginalny serwer jest męczony w bardzo niewielkiej ilości przypadków, dzięki czemu sam serwer jak i jego okoliczna sieć jest znacznie odciążona, ruch zostaje rozrzucony po lokalnych i rozproszonych CCFach zamiast być skupiony w jednej lokalizacji.

    To między innymi dzięki takim rozwiązaniom (lub podobnym) GitHub z pomocą firmy Akamai, byli w stanie sprostać niedawnemu rekordowemu atakowi DDOS skierowanymi przeciwko tej popularnej platformie, który w szczytowej fazie przybrał rozmiar 1.35 Tbps - prawie półtora Tb na sekundę. Niesamowite.

    Podsumowanie
    Wiele rzeczy jest, dzięki którym nasze dni są łatwiejsze, a nawet tego nie wiemy. CDNy były pewnie dla większości z was czymś właśnie takim. Oczywiście w tekście sporo jest uproszczeń, także bear with it.

    Dziękuję za przeczytanie i pozdrawiam
    #mlodyprogramuje #gruparatowaniapoziomu
    pokaż całość

  •  

    Kolejna część programistycznych historii

    Dziś o pierwszych dniach w robocie 8)

    pokaż spoiler Jakby miało być jakieś tldr to mniej więcej tak: nie bój się prosić o pomoc, przyznawać do niewiedzy, bądź szczery i niech !matka trochę bigosu na uspokojenie zarzuci bo niepotrzebne te nerwy.


    Zacznę może od tego, że zanim rozpoczęła się moja praca, miałem w głowie kilka obaw. Pierwszą z nich chyba było to, że sobie nie poradzę czy, że obowiązki mnie przytłoczą. Naturalne, chociaż niesłuszne. Dlaczego?

    To zadaniem firmy i jej procesu rekrutacyjnego jest sprawdzenie, czy się nadajesz. Jeśli dostałeś się do pracy, a w CV nie kłamałeś i mimo tego sobie nie radzisz, to jest to wina firmy, nie twoja. Proste, zawiodła tu procedura rekrutacyjna, a nie ty.

    A co do zwykłego stresu, to chyba jest on normalny, nie ma się co przejmować. Jestem zdania, że wszędzie są ludzie, a z ludźmi idzie się dogadać.

    Dobra, to jak to w końcu było?

    Cóż, wbrew pozorom… Tak szczerze to spokojnie.

    Pierwsze dni w swojej pracy tak naprawdę spędziłem na instalowaniu potrzebnych mi rzeczy, czekaniu na dostęp do odpowiednich miejsc, ustawianiu środowiska, poznawaniu struktury firmy i tego, jak pracujemy, swoich współpracowników. Generalnie jeśli o programowanie chodzi to praktycznie nic. Naprawdę, pierwsze dni to spokój.

    Dopiero gdy wszystko miałem już ustawione, to zacząłem coś programować. Na sam początek mój Project Leader, żeby mnie niejako wdrożyć do technologii, których używamy, przydzielał mi kolejne, stopniowo trudniejsze, zadania do zrobienia. Bardzo fajna sprawa. Dzięki temu później, gdy już zacząłem coś robić przy samym projekcie, to pewne rzeczy były znajome, to pozwoliło mi się czuć pewniej i spokojniej, to pomocne, zwłaszcza kiedy zaczynasz w nowym środowisku, uczysz się nowych rzeczy i chcesz dobrze wypaść.

    Tutaj o technologiach nie będę się rozpisywał, bo są one inne dla każdego – zależy jakie stanowisko, jaki projekt i tak dalej. Jednak napiszę niżej o pewnych rzeczach, które chyba są uniwersalne. W każdym razie.

    Tutaj wychodzi też, jak ważny jest dobry Project Leader czy też przełożony/mentor. Ja trafiłem dość dobrze akurat, dzięki czemu naprawdę, moim zdaniem, moje wdrożenie w nowej rzeczywistości i pracy poszło dość przyjemnie. Wiadomo, trochę stresu mi towarzyszyło, bo zależało mi na tej pracy, ale mimo wszystko czułem się dobrze.

    Zaskoczeniem była nieco dla mnie atmosfera i sposób komunikacji w firmie. Otóż na początku miałem wyobrażenie, że będziemy wszyscy sobie nieco ‘panować’ na początku – per pan/pani, oficjalna mowa i tak dalej, ale… Nic bardziej mylnego. Od samego początku dość luźna atmosfera mnie ogarnęła. Nie wiem, jak wygląda to w innych firmach, gdyż ja pracuje w raczej średniej wielkości firmie, gdzie w sumie po prostu większość ludzi znasz i tak to właśnie wygląda.

    Nikt się tu też raczej nie denerwuje. Ludzie są po prostu… pomocni. Był to dla mnie mały szok, bo wcześniej pracowałem trochę w budowlance, a tam ludzie bywają, no cóż, różni, ale nie tu. Dlatego też

    Na samym początku miałem nieco wrażenie, zanim zacząłem, że będę trochę tak zdany na siebie – po prostu dostajesz zadanie i koniec, rób. Nie umiesz? Wypad.

    Otóż po zaczęciu pracy okazało się, że nie – nic bardziej mylnego. Po pierwsze od czegoś są osoby starsze stażem i często chętnie pomagają, dzielą się wiedzą. Ba, częściej niż rzadziej za to mają przecież płatne. Można o pomoc poprosić.

    Wiadomo, nie można latać i pytać o najdrobniejszą rzecz, ale gdy już naprawdę nie ma innego wyjścia, sami nie jesteśmy w stanie znaleźć rozwiązania i marnujemy czas, okazuje się, że są osoby chętne a nawet wyznaczone do pomocy.

    Nie bójcie się zatem. Pytajcie. Nikt głowy ci nie ukręci za to, że czegoś nie umiesz, nie wiesz. Spokojnie. Jak pójdziesz, powiesz ‘Hej, pomożesz mi z X? Próbowałem już tego i tamtego, ale jakoś mi nie wychodzi.’ to problemu nie będzie raczej, ale jeśli będziesz latał do swojego przełożonego czy innego członka zespołu z najdrobniejszą pierdołą i liczył na gotowca, to… No cóż, będzie to irytujące na pewno.

    Pamiętaj tylko żeby jakoś tam zapisywać rozwiązania tych problemów. Głupio jest pytać po raz któryś o to samo. Robienie notatek to świetna sprawa. Czasami wystarczy też po prostu przejrzeć historię wiadomości.

    To oczywiste, że czegoś nie będziesz umiał
    Jako juniorzy czy generalnie młodzi programiści, mamy raczej pewien zapas dystansu od szefa w prezencie. Chodzi mi o to, że raczej oczekiwane jest, iż nie będziemy wiedzieć wszystkiego, czasem zdarzy się jakiś błąd, czy w jakimś temacie trzeba cię będzie dokształcić. Wydaje mi się, że każdy poważny pracodawca bierze to pod uwagę, zatrudniając nowicjusza/juniora.

    To też powód, dla którego należy dostosować swoje wymagania. Wiadome jest, że trzeba mieć nieco szacunku do samego siebie i coś zarobić, po pracować za przysłowiowe dwa złote, to nie można, ale błędem jest też myślenie, że nauczysz się pisać Hello Worlda w JS’ie i ktoś ci potem da 15k netto za samo oddychanie. No nie, tak to nie działa.

    W każdym razie.

    Dlatego, jeśli czegoś nie umiecie, coś zrobicie źle, to nie próbujcie nieudolnie maskować swoich błędów czy niewiedzy, tylko mówcie szczerze i przyznawajcie się do błędów.

    Szczerość
    Właśnie o szczerości chciałem jeszcze coś powiedzieć. Nigdy nie kłamcie. Po prostu. Nakłamiesz w CV? Wyjdzie na rozmowie. Potem wieść się niesie, IT to wbrew pozorom wąskie grono, i będziesz spalony. Coś zepsujesz, nakłamiesz i to zatuszujesz? Też wyjdzie, prędzej czy później, zazwyczaj prędzej. Czegoś nie umiesz, ale oficjalnie to w sumie twoje zadanie jest już prawie zrobione? Nie zadziała, bo ostatecznie go nie skończysz i tylko sprawisz, że wszystko się niepotrzebnie przedłuży.

    Wydaje mi się, że dużą częścią obowiązków w pierwszej pracy, to po prostu bycie szczerym i odpowiedzialnym za swoje czyny, nic więcej.

    Chciałbym tutaj wspomnieć o pewnych rzeczach, które możesz sobie obczaić nawet przed przyjściem do pracy, bo na 90% w twojej firmie też będą używane. Zazwyczaj to proste rzeczy, które od razu ogarniasz, ale im więcej znajomych interfejsów, tym pewniej się poczujesz i łatwiej będzie ten cały natłok informacji ogarnąć, więc wspomnę o kilku technologiach, z którymi warto się zapoznać gdzieś tam. Ba, może nawet na rozmowie jakoś tym zaplusujesz ;)

    Jira
    Z tego co wiem, dość popularnym systemem zarządzania taskami, jest Jira. Jak ona wygląda i co warto o niej wiedzieć, możesz łatwo znaleźć na internecie. Generalnie rocket science to tu nie ma – po prostu taki dashboard do łatwiejszego ogarniania co kto ma do zrobienia.

    Git/VCS
    W każdej firmie używany jest jakiś VCS, powinieneś już o tym wiedzieć. Jak trafiłeś gdzieś, gdzie się takich rzeczy raczej nie używa, a projekty przekazuje np. w archiwach czy wysyła mejlem, to… No coś jest nie tak. Generalnie VCS to konieczność i standard.

    Obecnie takim standardowym VCS’em jest Git. Chyba większość go używa. Zdarzają się inne, ale to raczej rzadkość.

    Do Git’a są różne ‘serwisy’, które świadczą usługi utrzymywania repozytoriów, czasami firmy robią to same, na swoich serwerach. W każdym razie najprawdopodobniej będziesz korzystał z repo na GitHubie, GitLabie czy BitBucketcie. Możesz sobie przejrzeć, jak wyglądają te serwisy i zajrzeć co i jak.

    Tak swoją drogą, to jeśli jeszcze nie masz konta na GitHubie czy gdzieś, ze swoimi projektami i kodem, to polecam ci się weń szybko zaopatrzyć. Podobnie, jeśli Gita nie znasz. Podstawy powinno się znać.

    Slack/Skype/Google Hangouts
    Standardowe narzędzia do komunikacji. Do tego dochodzi jeszcze firmowy e-mail, który też pewnie otrzymasz, więc przed możesz sobie ogarnąć jak ustawia się Thunderbirda czy innego klienta pocztowego.

    Tak właśnie wyglądały moje pierwsze dni w pracy. Czy w każdym przypadku tak to wygląda? Nie wiem, ale raczej podobnie. Rzeczy, które tu opisałem, mogą się co niektórym wydawać oczywiste, ale… No nie dla wszystkich takimi są.

    Wrzucam arty też na steemit, wiec jak ci sie spodobało to możesz dać upvota czy zajrzeć i podbić wyświetlenia 8)
    O tutaj
    A no i generalnie to taki tag se zakładam: #mlodyprogramuje
    #naukaprogramowania #programowanie #it
    pokaż całość

  •  

    Hej znacie jakieś godne polecenia (albo takie, na które uważać) agencje pracy z #katowice które organizują pracę w #zagranico a konkretnie #holandia ? Szukam pracy dla mamuśki i by się przydało kilka opinii
    #emigracja

    +: Freakz, Wrobel_1111 +1 inny
    •  

      @turok2016: Sorry że Cię tak wypytuję ale ciekawi mnie jak to wygląda praca w Holandii przez agencje.
      Umowę na jak długo się podpisuje? Można w każdej chwili zrezygnować bez ponoszenia kosztów do Polski?
      Wypłaty w systemie 2 tygodniowym czy co miesiąc?
      Ile osób w pokojach jest?
      Do jakiej miejscowości Ciebie wysłali i czym się zajmowałeś?

    •  

      @Marcinowy długość umowy zależy od konkretnej oferty, tak samo to czym się zajmujesz, większość to produkcja i magazyny, miejsce pracy też zależy od konkretnej oferty.
      Umowę wypowiedzieć chyba można ale chyba tydzień przed i wtedy kosztów brak.
      Wypłata co tydzień, nie wiem czy w każdej firmie ale większość, więc po przepracowanym tygodniu we wtorek kasa na koncie.
      Ile osób w pokojach? Przeważnie chyba 2 ale można trafić i jedynkę i trójkę.
      Sam będę pewnie jechał znów więc jak coś uderzaj na PW.
      pokaż całość

    • więcej komentarzy (7)

  •  

    Jakie ciężary, w relacji do masy ciała, są w miarę 'zdrowe' czy 'bezpieczne'? Czy w ogóle istnieje taka granica? Oczywiście zakładamy, że ktoś wykonuje ćwiczenie poprawnie technicznie.

    #mikrokoksy

    +: Freakz, Cronox
  •  

    gdzie kupię btc bez podawania dowodu, za przelew?
    #bitcoin

    +: Cronox
  •  

    no, to teraz cel dobić do 500 kg w trójboju i zbić z wagi w końcu
    #mikrokoksy

    +: V.......l, z3t4 +6 innych
  •  

    Jaka będzie najtańsza dieta? Na czym ją oprzeć? Poza czokoszokami ( ͡° ͜ʖ ͡°)
    #mikrokoksy

  •  

    #android
    Hej, polecicie jakiś telefonik do 300-400 zł? Zadania ma trzy: dzownić, otworzyć mesendżera, przeglądarke, wytrzymać jeden dzień na baterii przy niedużym używaniu.

    +: Cronox
  •  

    Fiat Albea 1.2 16v ma ktoś może, jeździł benz+lpg? Jakieś opinie? Generalnie pierwszy samochód się szykuje i pytam bo mam atrakcyjną ofertę w okolicy w dobrym stanie. Zadanie ma proste: jeździć, skręcać i hamować ( ͡° ͜ʖ ͡°) przez najbliższy rok albo dwa, bez większych wkładów.
    #motoryzacja

    +: Cronox
  •  

    6 października będzie miała miejsce premiera kolejnej fazy projektu #basicattentiontoken - dość fajny, stoi za nim twórca javascriptu i współzałożyciel mozilli, szykuje się więc niezła pompka ( ͡° ͜ʖ ͡°)
    BAT'ki można zakupić na bittrexie
    #kryptowaluty

  •  

    Hej, jeśli ktoś gra o #spotify z leszkiem, to macie niżej kilka kodów

    pokaż spoiler UYJKEW5X
    VUCNEKPL
    9X7JH3W2
    T6KN4WXF
    TEHPEWU5
    398U6DT2
    EYDTX4FF
    XWYJD3FF
    4CMUEE2I
    TY3R7WXM
    K989VCHN
    5TXE6EWW
    UWC8F7RT
    6YTUCF2P
    3XCNHHL7
    2UW628K7
    JY2FN8MV
    E5HFJEYX
    LKVJPE46
    8NNERR9W
    4W2DYWMN
    3PTY34MR
    8PKE54WW
    59FVXXKT
    WV4PKMH6
    5P2EKUCR
    2CK5EDML
    EETPD942
    YP4TXWLL
    NLDEEKLF
    pokaż całość

  •  

    właśnie byłem na siłce i biegać
    czuje się dumny

    +: Cronox
  •  

    Hej, mam pare złociszy wolnych, lubie zwierzaczki i z chęcią wspomógł bym jakąś fundacje/schronisko/whatever, mirki ktoś zna jakąś godną zaufania?

    #psy #zwierzaczki
    #schronisko

  •  

    Koleżanka z #niemcy żali mi się, że nie może oglądać serialów z nieoficjalnych stron bo się boi, z racji tego, że ostatnio im przepisy zaostrzyli w tym względzie XDDD Słszeliście coś o tym, by oglądanie 'pirackie' na Internecie zrobiło się u nich nielegalne?
    #niemcy

    +: Cronox
  •  

    Ten uczuć kiedy czytasz, że na GPW krwawy dzień do WIG spadł AŻ O 0,4 % XDDDDDDDDDDDD
    #bitcoin

...to tylko najnowsze aktywności użytkownika 11001100110O11

Zobacz wszystkie dodane znaleziska, komentarze i wpisy korzystając z menu powyżej.

Osiągnięcia (6)