wtorek, 8 grudnia 2015

Dlaczego język C# nie posiada operatora potęgowania

Powyższe pytanie przyszło mi jakiś czas temu do głowy, kiedy już znalazłem powód, dlaczego operacja zapisana jako:

int y = a^c;

nie dawała rezultatu zgodnego z oczekiwaniem.
Dla wyjaśnienia, w języku C# operator "^" jest operatorem logicznym XOR więc powyższy kod jest, z punktu widzenia kompilatora, poprawny.

Po zadaniu tego pytania jedynie słusznej wyszukiwarce internetowej, w wynikach pojawił się post z bloga MSDN - który wyjaśnia tę ciekawą sytuację (w wolnym tłumaczeniu):


Niektóre języki programowania udostępniają operator potęgowania, więc działanie może być zapisane jako:

float result = value^2;

zamiast wywoływania funkcji [potęgowania]. Nie mamy czegoś takiego w C#.

Możliwe byłoby dodanie do języka operatora potęgowania, ale w wielu programach taka operacja jest wywoływania niezmiernie rzadko i nie wydaje się być to uzasadnione, kiedy łatwo jest wywołać funkcję Math.Pow().

Dodatkowo martwię się nieco o implementację takiego operatora. Większość kompilatorów przetłumaczy powyższy przykład jako:

float result = Math.Pow(value, 2.0);

To zadziała, ale ma skutek uboczny w postaci zastąpienia prostego mnożenia (value * value) przez wywołanie złożonej funkcji.

Jakie to proste i oczywiste. Czytając jednak komentarze okazuje się, że większość osób, które poszukiwały odpowiedzi, ma na ten temat odmienne zdanie.
Bardzo ciekawa wydała mi się koncepcja zlikwidowania operatora mnożenia, zaproponowana przez jednego z komentujących (ponownie w wolnym tłumaczeniu):


Zaraz; co?
Użyjmy takiego samego "argumentu" dla operatora mnożenia:
 
"Niektóre języki programowania udostępniają operator mnożenia, więc działanie może być zapisane jako: 
float result = value*2; 
zamiast wywoływania funkcji [mnożenia]. Nie mamy czegoś takiego w C#. 
Możliwe byłoby dodanie do języka operatora mnożenia, ale w wielu programach taka operacja jest wywoływania niezmiernie rzadko i nie wydaje się być to uzasadnione, kiedy łatwo jest wywołać funkcję Math.Mult(). 
Dodatkowo martwię się nieco o implementację takiego operatora. Większość kompilatorów przetłumaczy powyższy przykład jako:
float result = Math.Mult(value, 2.0); 
To zadziała, ale ma skutek uboczny w postaci zastąpienia prostego dodawania (value + value) przez wywołanie złożonej funkcji." 
Może powinniście usunąć operator * ?
Wniosek : proste operacje są proste. Ale pisząc kod do obliczeń naukowych i mając formułę, gdzie wykładnik jest liczbą typu double zamiast "2", czytanie tej formuły używającej funkcji Math.Pow jest katorgą (i jest podatne na pomyłki). Powinniście raczej zaimplementować operator ** (czy "^" czy jakikolwiek inny), albo też napisać wyraźnie w pomocy online: "nie powinieneś używać C# do pisania jakiegokolwiek kodu do obliczeń naukowych".
I tym miłym akcentem można podsumować to, co i ja sobie pomyślałem o oryginalnym pomyśle nieimplementowania operatora potęgowania.

wtorek, 3 listopada 2015

Ratunku, Microsoft mnie szpieguje

Jakiś czas temu, internet obiegła wiadomość o tym, że Microsoft - korzystając z mechanizmu Windows Update - instaluje na komputerach użytkowników poprawki "szpiegujące".
Nie wdając się zbytnio w szczegóły, chodzi tu o poprawki instalujące w systemach Windows 7/8.1 tzw. telemetrię, czyli zbieranie i wysyłanie różnego rodzaju danych, które mają pomóc w ulepszaniu systemu. Taka telemetria jest już od początku obecna w Windows 10.

Nie byłoby z tym pewnie problemu - gdyż dane diagnostyczne zbierane są od dawna - gdyby nie fakt, że te konkretne "poprawki" są słabo udokumentowane. Niestety dla programistów Microsoft i Ska (bo dane są dostarczane nie tylko Microsoftowi i stąd też zapewne to larum), w internecie zaroiło się od odzewu ludzi, którzy zaczęli się bliżej przyglądać temu, co i gdzie Windows wysyła.
Dodatkowo, Microsoft wciska "na siłę" uaktualnienie do Windows 10 instalując poprawkę znaną jako GWX (oraz różne dodatkowe elementy niepozwalające pozbyć się GWX w prosty sposób z systemu - jak na przykład odświeżanie jego instalacji uruchamiane z poziomu harmonogramu zadań).
Kończy się to tym, że kolejną ważną poprawką, która jest dostarczana do systemu, jest uaktualnienie do Windows 10 i zwykły użytkownik nie bardzo ma szansę to obejść.

Dla większości użytkowników powyższe może nie mieć większego znaczenia - w końcu nowoczesna technologia jest na tyle obecna w codziennym życiu przeciętnego użytkownika internetu, że mając dostęp do informacji zbieranych np. przez Google, można zrobić - przy odrobinie złej woli - naprawdę wiele. Zgodnie z tym duchem, parę danych w tę czy wewtę nie powinno mieć znaczenia ;-). Nie mniej, prawda - jak zwykle - leży gdzieś po środku, a jeżeli można zrobić coś, żeby ten środek lekko przesunąć na bok, to dlaczego nie.
A i sam GWX jest lekko denerwujący dla użytkowników, którzy mogą jednak nie chcieć skorzystać z uaktualnienia systemu do wersji 10.

Dodatkowo frustrację podnosi informacja, jakoby Microsoft zaprzestawał publikować listy poprawek, które systemy Windows sobie pobierają (http://pclab.pl/news65440.html). Łącząc to ze szpiegującymi poprawkami telemetrycznymi, przyszłość może wyglądać ciekawie.

Tymczasem jednak, zajmijmy się rzeczami bardziej przyziemnymi, na które jeszcze mamy wpływ.

Aby pozbyć się powiadomienia o uaktualnieniu do Windows 10 (co manifestuje się piękną ikonką okien w zasobniku systemowym) i samego uaktualnienia, w rejestrze systemu należy utworzyć nowe klucze, które będą ten proces hamować.
Z poniższego kodu najlepiej jest utworzyć sobie plik tekstowy z rozszerzeniem .reg i klikając go dwukrotnie, potwierdzić dodanie kluczy rejestru do systemu.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\GWX]
"DisableGWX"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate]
"DisableOSUpgrade"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\OSUpgrade]
"AllowOSUpgrade"=dword:00000000
"ReservationAllowed"=dword:00000000

Po ponownym uruchomieniu systemu, uaktualnienie powinno bezpowrotnie zniknąć.

Z poprawkami telemetrycznymi będzie trochę większy kłopot, bo jest ich kilka. Jednakże powstały już narzędzia, aby pozbywać się ich w miarę automatycznie.
Osobiście nie lubię uruchamiać w swoim systemie oprogramowania, które wprowadza "jakieś" modyfikacje i dlatego uwagę moją zwrócił skrypt umieszczony pod adresem: https://github.com/WindowsLies/BlockWindows, który czyni całą operację bardziej transparentną dla kogoś, kto ma elementarne pojęcie o skryptach. Dodatkowo autor zachęca do ulepszania tegoż, co z pewnością będzie za jakiś czas konieczne.

Prawdopodobne jest, że system Windows zapobiegliwie zaczął, lub nawet już skończył, pobieranie instalacji uaktualnienia do Windows 10 "tak na wszelki wypadek".
Instalacja ta zajmuje ukryty katalog $Windows.~BT i znajduje się na dysku systemowym, zabierając kilka GB miejsca. Pozbyć się tego można uruchamiając systemowe narzędzie "Oczyszczanie dysku" i w głównym okienku klikając przycisk "Oczyść pliki systemowe".