Ludwig von Mises Institute

MVP

Twój adres IP to: 38.107.191.112
Przeglądarka: CCBot/1.0 (+http://www.commoncrawl.org/bot.html)

OE PowerTool
Wersja stabilna: 4.2.2

2 lutego 2010
Ostatnio dostaję takie oto wiadomości:
Użytkownik 17857063 próbował się z Tobą skontaktować. Niestety używasz starej wersji Komunikatora, która nie obsługuje numerów GG większych niż 17 milionów. Zaktualizuj swój Komunikator i rozmawiaj swobodnie: http://komunikator.gadu-gadu.pl
GG nie używam od chyba 7 lat i nadal nie zamierzam go instalować. Z użytkownikami GG rozmawiam przez transport na moim serwerze Jabbera. Ostatnio przekompilowałem ten transport z najnowszą biblioteką libgadu i znów mogą do mnie pisać wszyscy użytkownicy GG, nawet ci z wysokimi numerkami. Przy okazji chciałbym zauważyć, że jest mnóstwo komunikatorów i nie ma sensu siedzieć na GG, które z wersji na wersję robi się coraz gorsze.

25 stycznia 2010
Niedawno obudziłem się rano by stwierdzić, że w nocy Windows 7 zrestartował się w celu instalacji poprawek. Ja wiem, że poprawki powinny być jak najszyciej zainstalowane żeby użytkownik był jak najszybciej chroniony, szczególnie jeśli w sieci już są exploity na dziury łatane przez instalowne właśnie łatki. Tylko, że przecież w ten sposób użytkownik może bardzo łatwo stracić swoją pracę. Jeśli nawet wcześniej wszędzie gdzie trzeba kliknie "Zapisz" to i tak jeśli miał włączonych dużo programów to musi je potem mozolnie włączać i ustawiać różne rzeczy. Warto więc wiedzieć jak wyłączyć restarty. W tym celu trzeba uruchomić edytor zasad grup wpisując gpedit.msc do okienka Uruchom... W edytorze wybieramy: Konfiguracja komputera -> Szablony administracyjne -> Składniki systemu Windows -> Usługa Windows Update. Wybieramy opcję o wdzięcznej nazwie "Bez automatycznego uruchamiania ponownego dla zaplanowanych aktualizacji automatycznych przy zalogowanych użytkownikach". Zmieniamy jej stan na Włączone.

14 stycznia 2010
Ponieważ dawno nie było tu żadnego wpisu, warto by napisać coś ciekawego. Ostatnio zdarzyło mi się dwa razy dostać bana od mojego switcha Cisco, pochodziły z funkcji port security. Bany były za nieznany adres MAC. Było to bardzo dziwne, gdyż nie podłączałem żadnych nowych komputerów. Przyczyna mogła być jedna - to Windows sam zmienia sobie adres MAC. Trzeba było tylko ustalić który jego składnik to robi, po co i jak to wyłączyć. Adresy były następujące: 00:0D:3A:FD:EA:1B oraz 00:0D:3A:E1:C1:14. Przedrostek 00:0D:3A jednoznacznie identyfikował je jako należące do Microsoftu. Googlanie wykazało, że adresy te zostały wygenerowane przez usługę Link Layer Topology Discovery (LLTD), której Windows używa do wyznaczania topologii sieci. Zakres generowanych adresów to od 00-0D-3A-D7-F1-40 do 00-0D-3A-FF-FF-FF. LLTD składa się z dwóch komponentów, respondera i mappera. Można je łatwo wyłączyć przez group policy. Odpalamy więc gpedit.msc i klikamy: Konfiguracja komputera -> Szablony administracyjne -> Sieć -> Wykrywanie topologii warstwy łączy. Tam mamy możliwość wyłączenia mappera i respondera.

16 października 2009
Niedawno na grupach dyskusyjnych ktoś zapytał jak można wykonać drag & drop programowo. Chodziło o program, do którego okienka trzeba było przeciągnąć plik. Googlając natknąłem się na komunikat WM_DROPFILES, który można wysłać do okna programu i w ten sposób spowodować, że zachowa się on tak, jakby zostały na jego okno przeciągnięte pliki. Działa to np. z Notatnikiem. Niestety jednak WM_DROPFILES jest metodą dosyć starą i rzadko działa. Większość wpółczesnych programów pod Windows do obsługi przeciągania używa przeciągania OLE, które wymaga aby kursor został przesunięty i znalazł się na oknem będącym odbiorcą przeciąganych danych. Trzeba by więc programowo przesuwać kursor myszy a praktycznie nie zawsze chcielibyśmy tego uniknąć. Tak więc wychodzi na to, że programowo, bez machania kursorem można zrobić tylko przeciąganie i upuszczanie starego typu. Poniżej wklejam przykładowy kod źródłowy do przeciągania pliku, podanego jako parametr wywołania, do okna Notatnika:

#include <windows.h>
#include <iostream>
#include <shlobj.h>

using namespace std;

int main(int argc, char ** argv) {
if (argc!=2) {
cerr << "wrong number of parameters!" << endl;
return 1;
}
char file[MAX_PATH];
GetFullPathName(argv[1], MAX_PATH, file, NULL);
cout << file << endl;
DROPFILES s;
s.pFiles = sizeof(s);
s.pt.x = 1;
s.pt.y = 1;
s.fNC = false;
s.fWide = false;
HGLOBAL hDrop;
BYTE * p;
hDrop = GlobalAlloc(GHND, sizeof(s) + strlen(file) + 2);
p = (BYTE*)GlobalLock(hDrop);
CopyMemory(p, &s, sizeof(s));
CopyMemory(p + sizeof(s), argv[1], strlen(file)+1);
GlobalUnlock(p);
PostMessage(FindWindow("Notepad", NULL), WM_DROPFILES, (WPARAM)hDrop, NULL);
return 0;
}

12 października 2009
Inżynierkę udało mi się szczęśliwie obronić i mogę teraz kontynuować naukę na studiach magisterskich, na kierunku Elektronika i Inżynieria Komputerowa.
Od razu po obronie poleciałem do Bratysławy na spotkanie dziennikarzy z firmą Eset, będącą producentem znanego programu antywirusowego NOD32. Zrobiłem tam trochę zdjeć, relację zamieszczę w vortalu dobreprogramy.

10 września 2009
Udało mi się skończyć pisanie pracy inżynierskiej i złożyć ją w sekretariacie Instytutu Automatyki. Teraz czekam na wyznaczenie terminu obrony.

19 sierpnia 2009
Jest rzeczą normalną, że w prasie popularnej pisząc o zagadnieniach naukowych używa się pewnych uproszczeń. Niestety Onet i Dziennik bardzo mocno w tym temacie przeginają i często w dziale naukowym publikują zupełne bzdury. Wydaje mi się też, że wynika to nie tyle z uproszczeń co z zupełnej nieznajomości tematu przez dziennikarzynę z działu naukowego. Ktoś może powiedzieć, że w przypadku Onetu są to zwykle przedruki i oni sami tego nie piszą. Co z tego? To mogą już publikować wszystko bez jakiegokolwiek sprawdzania? Poniżej zamieszczam bzdurę roku opublikowaną dziś przez Onet:

Jak wyjaśnia Maria Geha z Uniwersytetu Yale, działa to na tej samej zasadzie, na jakiej dociera do nas światło słoneczne. Promieniom słonecznym zajmuje 8 minut, żeby dotrzeć na Ziemię, więc kiedy oglądamy wschód Słońca, tak naprawdę widzimy gwiazdę, która wzeszła kilka minut wcześniej. Podobnie, gdyby Słońce nagle zaszło, również nie wiedzielibyśmy o tym przez tych kilka minut.

WTF!? Wschód i zachód słońca są to efekty mające miejsce na ziemi! Jest to wyjście/wejście danego obszaru Ziemi w jej własny cień. Nie widzimy więc go z opóźnieniem 8 minut tylko bardzo krótkiego ułamka sekundy. Nawet gdyby więc walnął jakiś wielki meteoryt i kopnął Ziemię tak, że zachód nastąpiłby szybciej to zobaczylibyśmy to od razu.
Przyglądając się stronie z artykułem widzimy, że oznaczony jest on jako przedruk z CNN. Google wskazuje artykuł źródłowy. Czytamy w nim:

Looking so far back in time may sound like science fiction, but it's possible because light travels at a finite speed and takes a certain amount of time to get from one place to another, said Marla Geha, an assistant professor of astronomy at Yale University.
In our own cosmic neighborhood, it takes the light from the sun eight minutes to reach Earth, so when you look at a beautiful sunrise, you see the star as it appeared eight minutes ago. If the sun were to suddenly go dark, you wouldn't know it for those several minutes.

I tu jest wszystko OK. CNN pisze o tym, że obserwując wschód słońca widzimy je takie, jakie było ono 8 minut temu. A nie, że wzeszło 8 minut temu! Z kolei ostatnie zdanie nie ma nic wspólnego z zachodem Słońca tylko z hipotetyczną sytuacją jego nagłego zgaśnięcia. Faktycznie dowiedzielibyśmy się o tym po 8 minutach. Natomiast takie sytuacje jak zachód Słońca czy też jego zaćmienie przez Księżyc mają miejsce tak blisko nas, że opóźnienie jest poniżej sekundy. Poza tym pani z Yale wcale się nie nazywa Maria tylko Marla. Nawet imię zostało przekręcone. A więc jednak wina Onetu, a konkretnie jego pracownika, który nie dość, że nie potrafi tłumaczyć z języka angielskiego to brakuje mu szkolnej wiedzy z astronomii. Ale skoro na Onecie nikt nie ma czasu na poprawianie literówek, których jest mnóstwo, a nawet błędów gramatycznych, bo liczy się tylko szybkość publikacji, to nie ma się dziwić, że takie są efekty. A Onet nie ma i tak się czym przejmować, ciemny lud wszystko kupi.

18 sierpnia 2009
Dziś kolejny raz spotkałem się z przypadkiem podawania na forum różnych bzdurnych porad mających na celu przyspieszenie działania Windows. Chodziło o wartość NonPagedPoolSize w rejestrze, której ustawienie na 95% wielkości RAMu ma spowodować, że system będzie wykorzystywał całą pamięć a dopiero potem zacznie korzystać z pliku wymiany. Oczywiście nie jest to prawda, ponieważ wpis ten dotyczy niestronicowanej pamięci jądra a nie pamięci alokowanej przez aplikacje przestrzeni użytkownika. Ale nikt się nie zastanowi, nie pomyśli, nie poczyta, tylko przekleja "poradę" z forum na forum.
Inna popularna bezsensowna porada, żeby wielkość pliku wymiany ustawić proporcjonalnie do wielkości RAMu, ze współczynnikiem zwykle w okolicach 1,5. Już sama logika mówi, że to bez sensu. Wynika z tego zalecenia bowiem, że czym mamy więcej RAMu tym większy musimy zrobić swap. A po to przecież kupujemy RAM żeby komp nie musiał uciekać się do pliku wymiany tylko zawsze miał pod ręką pamięć fizyczną. Zgodnie z definicją, plik wymiany służy jako brakująca pamięć. Jego wielkość powinna być więc różnicą pomiędzy zapotrzebowaniem zgłaszanym przez nasze aplikacje a posiadaną pamięcią fizyczną. Nie mam pojęcia czemu tak prosta zależność jakoś uchodzi uwadze wielu ludzi i powtarzają bezsensowne brednie. Są też mniej ekstremalne porady, wynikające ze słabego rozumienia tekstu albo jakichś nieszczęśliwych skojarzeń. Można więc wyczytać np. że wartość SfcScan w rejestrze jest odpowiedzialna za uruchamianie chkdsk.exe podczas startu systemu albo że należy wyłączyć QoS bo zjada 20% pasma.
Problem z głupimi poradami jest nie tylko taki, że mogą one spowodować spadek wydajności systemu lub niestabilność. Na podstawie tych porad są potem tworzone programy, które mają powodować przyspieszenie pracy systemu. Zaznaczam wyraźnie, że nie chodzi mi tu o programy takie jak TweakUI, które pozwalają łatwo ustawić niektóre rzeczy i dostosować do swoich potrzeb. Mam na myśli aplikacje, których autorzy obiecują wzrost wydajności o kilkaset procent i chcą za te programy kasę. Nieraz w swoich opisach mają takie brednie, że aż naprawdę trudno uwierzyć, że ktoś to kupuje. Kiedyś widzialem program, który miał rzekomo instalować w Windowsie nowe, szybsze jądro. Bez komentarza. Tak więc nie dość, że ludzie mają potem porozwalane systemy to na dodatek za to płacą. Są też porady mówiące wprost o potrzebie instalacji jakiegoś programu: do czyszczenia rejestru, defragmentacji rejestru, defragmentacji pamięci itp. Ludziom potem puchnie głowa i myślą, że bez 10 specjalnych programików i 100 wpisów w rejestrze komp nie będzie działać.
Jak uporam się z inżynierką to pewnie napiszę jakiś większy tekst na temat różnych głupich windowsowych porad.

7 sierpnia 2009
Ostatnio jestem zajęty pisaniem pracy inżynierskiej. Opisuje ona urządzenie mające być pomocą dla elektroników, którzy budują układy korzystające z różnych interfejsów: RS232, 1-Wire, I2C, SPI czy RS485. Mój układ ma być swego rodzaju uniwersalną przejściówką podłączaną do komputera przez port USB i wyposażoną w wymienione interfejsy. Gdy elektronik stworzy prototyp swojego urządzenia mający np. interfejs SPI, będzie mógł za pomocą mojej przejściówki przetestówać poprawność działania tego interfejsu w swoim urządzeniu. Cały projekt składa się z kilku elementów: samego urządzenia wraz z firmwarem, sterownika dla Windows, bibliotek oraz przykładowych aplikacji. Pod względem sprzętowym układ opiera się o mikrokontroler STM32F103RB i jest dosyć prosty. Firmware oparty jest o standardowe biblioteki peryferiów oraz stos USB od ST. Sterownik działający w trybie jądra został napisany w oparciu o artykuł z CodeProject.

11 czerwca 2009
Zapewne niektórzy użytkownicy Internet Explorera 8 zastanawiali się od czego zależy liczba procesów iexplore.exe. IE8 używa funkcji Loosely Coupled IE (LCIE), w której IE działa używając kilku procesów połączonych w tzw. job. Widać to np. w Process Explorerze. Taki job to grupa procesów, które mogą być razem zarządzane i mogą mieć przydzielone limity zasobów. Domyślnie liczba procesów IE8 zależy od wielkości wolnej pamięci, liczby zakładek, powiązań między zakładkami oraz ilości sesji IE. Tworzone są minimum dwa procesy iexplore.exe: jeden dla głównego okna, drugi dla zakładki. Wraz z otwieraniem zakładek ilość procesów może się potem zwiększyć.
Liczbą procesów można zarządzać za pomocą wartości TabProcGrowth typu DWORD lub tekstowego w kluczu HKCU\Software\Microsoft\Internet Explorer\Main. Określa ona ile może maksymalnie działać procesów "zakładkowych". Jeśli ustawimy ją na 0, wówczas funkcja LCIE będzie wyłączona i całe okno IE będzie działać w jednym procesie. Gdy będzie ustawiona na 1, procesy będą dwa: dla okna i zakładki. Przy ustawieniu większej liczby liczba procesów "zakładkowych" będzie się zwiększała wraz z ilością zakładek ale nie przekroczy wartości wpisanej w rejestrze.
Zamiast wartości liczbowej można wpisać też wartość tekstową. Jeśli wpiszemy słowo small, utworzone zostanie maksymalnie 5 procesów zakładkowych a trzeci proces zostanie utworzony przy 15-ej zakładce. Gdy wpisane zostanie słowo medium, IE8 działać będzie w maksymalnie 9 procesach zakładkowych a piąty proces zostanie uruchomiony przy 17-ej zakładce. Z kolei słowo maximum ustawi limit na 16 procesów zakładkowych a dziewiąty proces zostanie uruchomiony przy 21-ej zakładce.
Opisane ustawienie w rejestrze przyda się szczególnie użytkownikom pluginu IE7Pro, który niestety nie jest dostosowany do IE8 i nie ładuje się na wszystkich zakładkach. Ustawiając TabProcGrowth na 1 można sprawić, że IE7Pro będzie się ładowało zawsze poprawnie. Minusem będzie brak odporności na zawieszenie, którą dawało LCIE - zawieszenie jednej zakładki spowoduje zawieszenie całej przeglądarki.

7 czerwca 2009
Kolejny kod stworzony przy okazji pytania zadanego na grupach: jak automatycznie wydrukować wiele plików DOC? Można w tym celu napisać proste makro dla MS Worda:

Sub PrintAllFirst()
   Dim myFile As String
   Dim strLooking As String
   strLooking = "C:\Documents and Settings\Grzegorz\Pulpit\word\"
   myFile = Dir$(strLooking & "*.doc")
   Do While myFile <> ""
      Debug.Print myFile
      Application.PrintOut FileName:=strLooking & myFile, _
      Range:=wdPrintRangeOfPages, Item:= _
      wdPrintDocumentContent, Copies:=1, Pages:="1", PageType:= _
      wdPrintAllPages
      myFile = Dir$
   Loop
End Sub

6 czerwca 2009
Niedawno na grupach dyskusyjnych pojawiło się pytanie o to, jak sprawdzić w którym z katalogów jest najwięcej plików. Pliki, które były w podkatalogach nie miały się liczyć, czyli przykładowo dla C:\ mogło być 10 plików a dla C:\Windows 200 plików. Jako rozwiązanie problemu wybrałem napisanie skryptu w PowerShellu, który zamieszczam poniżej:

ls . -force -recurse | Where-Object {
$_.PSisContainer -eq $true
} | ForEach-Object {
Write-Progress 'Examining Folder' ($_.FullName); $_
} | ForEach-Object {
$result = '' | Select-Object Path, Count;
$result.Path = $_.FullName;
$result.Count = @($_ | ls -force -ea SilentlyContinue `
| where {$_.PSisContainer -eq $false}).length; $result
} | sort Count -descending |foreach{$_.Path;$_.Count}

Co tu się dzieje? Najpierw za pomocą ls -r pobieramy strukturę plików i katalogów z której zostawiamy tylko katalogi. Dla każdego z nich rozpoczynamy od wyświetlenia jego nazwy za pomocą Write-Progress. Potem ze stringa $result tworzymy sobie strukturę o polach Path i Count. Do Path zapisujemy aktualny katalog. W Count chcemy mieć ilość plików. W tym celu znów odpalamy ls ale już nie rekurencyjnie. Dostajemy listę z której pobieramy jej długość i zapisujemy w Count. Następnie zostaje posortowanie wyników malejąco i wyświetlenie nazwy każdego katalogu i liczby jego plików. Znaczek @ jest konieczny ponieważ PowerShell automatycznie jednoelementowe tablice zmienia w pojedyncze obiekty a taki pojedynczy obiekt nie ma właściwości Length. Znaczek ten po prostu rzutuje obiekt na tablicę.

23 kwietnia 2009
Dziękuję wszystkim, którzy przyszli dziś na moją sesję o Singularity na ITAD. Prezentację zamieszczam tutaj.