Sunday, March 27, 2022

Pływające poidło dla pszczół

Jakiś czas szukałem sensownego rozwiązania, aby dostarczyć pszczołom źródło wody, bez konieczności kopania oczka w ogrodzie albo cudowania z pompami.

Bardzo prostym rozwiązaniem jest podstawka doniczki z kamykami rzecznymi, wypełniona wodą do pewnego poziomu. Minus jest jednak taki, że (1) w lecie woda z takiej podstawki w moment wyparuje oraz (2) całkiem prawdopodobne, że pszczoły tak niedużą ilość wody po prostu szybko wypiją.

Krok dalej to kilkudziesięciolitrowa kastra z keramzytem, jednak keramzyt potrafi po jakimś czasie opaść na dno i wtedy pszczoły nie mają jak na nim wylądować, a wsypanie dużej ilości keramzytu sprowadza zagadnienie do konieczności uzupełniania wody, tak jak w przypadku wyżej wspomnianej podstawki.

Da się jednak połączyć zalety obu powyższych rozwiązań. Uważam, że w takim statycznym poidle ważny jest stały, powtarzalny dostęp do wody, naśladujący coś na wzór strumyka, w którym wygląd brzegu i poziom wody jest przeważnie stały.

Wody musi być więcej niż w podstawce, ale niekoniecznie aż tyle, co w kastrze, choć to w niczym nie przeszkadza.

Na niej musi znajdować się jakaś tratwa, która odpowiednio dociążona będzie zanurzona na stałą głębokość. Ja wykonałem to, używając arkusza twardego styropianu, odpadów z cięcia dachówki oraz tłucznia granitowego:

Odpadów z cięcia dachówki raczej nie kupisz, jeżeli sam/a sobie ich nie zrobisz, ale nie uważam, że są one tutaj konieczne (chociaż wyrazista symetria tego poidła może mieć znaczenie, o czym dalej). Zarówno tłuczeń granitowy jak i w miarę jednorodne w rozmiarze kamyki można kupić w centrach ogrodniczych albo marketach budowlanych.

Podstawą poidła jest miednica kuchenna o pojemności 12 litrów. Drugim istotnym elementem okazało się, że są kamyki. W toku poszukiwań wykonałem w sumie 4 różne poidła:

  • z granitem,
  • składające się z samych pasków dachówek,
  • bazujące na podstawce doniczki z kamykami rzecznymi,
  • podstawka + keramzyt.

Pszczołom najbardziej spodobały się poidła z granitem oraz keramzytem. Mocnym faworytem są kamyki rzeczne. Sprawia to wrażenie, jak gdyby pszczoły miały zakodowany wizerunek wodopoju i szukają w pierwszej kolejności takich wzorców.

W moim przypadku absolutnym hitem okazał się granit. Nawet jak było bardzo tłoczno, granit był pierwszym wyborem. Cechą wspólną mokrego keramzytu i granitu jest to, że obydwa materiały połyskują znacząco bardziej od pozostałych rozwiązań.

O szkodliwości styropianu pewnie można dyskutować, jednak widziałem pszczoły pobierające wodę z tak dziwnych miejsc (taczka z gruzem, ukiszoną wodą z glonami i nie wiadomo czym jeszcze), że nie mam zamiaru się tym przejmować. Wychodzę z założenia, że jeśli pszczołom coś nie będzie odpowiadało, to nie będą korzystały.

Być może bardziej ekologicznym podejściem byłoby wykorzystanie drewna jako tratwy, jednak odpowiedni dobór materiału może nie być wcale łatwy. Myślę też, że taka tratwa musiałaby mieć znaczne wymiary, aby utrzymała kamyki. Drewno ulega degradacji i samo uwalnia substancje, które nie wiem, czy pszczołom się spodobają (oczywiście zapomnij o płytach meblowych oraz drewnie impregnowanym).
Niemniej jednak, jeśli opracujesz rozwiązanie na bazie drewna, które pszczołom się spodoba to będę wdzięczny za informację.

W Internecie można poczytać o tym, że pszczoły zdają się rozróżniać obiekty z symetrią oraz bez (słowa kluczowe: bees radial symmetry, bees bilateral symmetry), co być może przyciąga je do tych, które ją mają. Nie wiem jednak, czy jest to w przypadku poidła decydujące albo nawet wspomagające.

Nie trzeba mieć pszczół, żeby je wspierać. Niekoniecznie pszczoły, ale inne rodzaje zapylaczy również potrzebują wody. Prawdopodobnie najprostsze poidło to słoik wypełniony wodą, niezakręcony do końca, postawiony do góry dnem. W szczególności w lokalizacjach mocno zurbanizowanych albo niemających w pobliżu stawów, jezior ani rzek taka pomoc przyda się tym bardziej, że (subiektywna opinia) mimo gwałtownie zmieniającej się pogody i krótkich, ulewnych deszczy jest z roku na rok coraz bardziej sucho.

Więcej zdjęć oraz nagrania opisywanego poidła w akcji znajdują się tam >> [Link Google Drive]

Sunday, December 22, 2019

Lampa z cegły i starego żyrandola

Co łączy cegłę klinkierową, gęsią szyję (peszel) i klosz ze starego żyrandola? To, że da się z nich zrobić lampę na stół. Nie lampkę, ponieważ ta, którą wam przedstawię, ma prawie metr wysokości oraz masę... lampy z cegłą w podstawie.

Oto inspiracja druciarsko-tryciarska w pełnej krasie:

Warto zacząć od tego, czy ktoś jeszcze miałby ochotę coś takiego skręcić, bo proces mimo, że jestem dłubaczem, uważam za aptekarski i upierdliwy. Tak wygląda podstawa lampy od spodu. Szczegółowo opisywać wszystkiego nie będę, bo post ma mieć charakter zajawki a nie instrukcji.

Otwory na przycisk oraz do przymocowania gęsiej szyi zostały wywiercone przy użyciu wiertarki i, jak można się domyślić, wierteł do betonu. Pierwszy otwór wiertłem fi 22, drugi — 12. W tym przypadku wykorzystałem wiertarkę z udarem, bo innej opcji nie miałem. Gdybym miał robić to drugi raz, ogarnąłbym wiertarkę bez udaru i wywierciłbym na wolnych obrotach. Skutkiem ubocznym zastosowania udaru są stożkowe wyrwania, które okazały się przydatne ze względu na łatwiejszy dostęp do "wnętrzności" podstawy lampy i większą swobodę w umiejscowieniu kabli.

Ścieżka między otworami została wycięta szlifierką z tarczą diamentową do cięcia gresu. Proces polegał na nacięciu kilku szczelin, następnie między szczelinami - kolejnych szczelin, do momentu w którym dało się delikatnie opukać i wykruszyć cienkie warstwy cegły. Poniższe zdjęcie, trochę wcześniejsze w chronologii tworzenia, przedstawia bliżej tę ścieżkę i jak została uzyskana.

Widok bebechów tuż przed przykręceniem pokrywy:

Włącznik kołyskowy (z prawej strony widoku) jest wciśnięty w otwór i opiera się na kołnierzu. Gęsią szyję (lewa strona) zamocowałem na dociętym nyplu fi 10. Nakrętki i gęsia szyja przymocowana do nypla przy użyciu kleju anaerobowego. Ponieważ otwór był szerszy od średnicy nypla, pustą przestrzeń i okolice nakrętek zalałem dodatkowo klejem, aby utrudnić poluzowanie się całej tej misternej konstrukcji. Między gęsią szyją a cegłą znajduje się poszerzana podkładka maszynowa, do zdobycia w markecie budowlanym. Unieruchomienie przewodów to klasyczne tryciarstwo, ale nie ma mowy o tym, żeby ktoś to niechcący wyrwał.

Pokrywa podstawy została wycięta z cienkiej sklejki i jest przymocowana wkrętami, wraz z nóżkami wykrojonymi z arkusza gumy grubości 8 mm.

Klosz jest obracalny. W gęsią szyję wkręcony jest krótki nypel, nań nałożony jest uchwyt klosza i na koniec nakrętka motylkowa, umożliwiająca utrwalenie pozycji.

Wierzchnia część podstawy prezentuje się następująco:

Dowód, że to ustrojstwo działa:

Chcę zrobić coś podobnego, co zrobiłbyś inaczej, gdybyś wykonywał to kolejny raz?

  • Wierciłbym powoli, bez udaru.
  • Użyłbym innego przełącznika kołyskowego, ponieważ ten ze zdjęć mimo, że został sprzedany jako na 230V AC (i tak jest podpisany), w rzeczywistości nie wygląda, aby różnił się wiele od takich na 12V DC, więc jeżeli mimo wszystko chcesz dokładnie taki sam włącznik to robisz to, tak jak wszystko, co zostało wspomniane w tym poście, na własne ryzyko.
  • Użyłbym prawdopodobnie krótszej gęsiej szyi, bo przy obecnej (80 cm) nietrudno jest uzyskać ustawienie, w którym lampa nie będzie stać w pożądany sposób.

Wesołych Świąt.

Sunday, January 6, 2019

karmnik dla ptaków na orzechy

Dzisiejszy post będzie o karmniku ze zdjęcia poniżej i generalnie będą to obrazki.

Jest to karmnik wieszany, wykonany z "tego, co było", czyli:

  • odcinka grubej rury plastikowej na wodę,
  • resztek arkusza siatki ocynkowanej,
  • laminowanego elementu meblowego ze sklejki,
  • starego drucianego wieszaka na ubrania,
  • odcinka wężyka akwarystycznego,
  • opakowania na płyty CD/DVD,
  • butelki po płynie do spryskiwaczy,
  • opasek zaciskowych (potocznie zwanych trytytkami) oraz wkrętów.

Ideowo nie różni się niczym od tamtego sprzed niemal 5 lat, niemniej ten jest mocniejszy i pomyślany pod orzechy.

Część, na której lądują orzechy składa się z elementu meblowego i dwóch kantówek. Arkusze dociętej siatki łączą się z nią przy użyciu wkrętów z dogiętymi podkładkami, natomiast siatki złączone są opaskami zaciskowymi. Dwie pary najdłuższych opasek służą jako prowadnice do rury - stanowią ułatwienie przy jej wkładaniu i wyjmowaniu. Daszek wykonany jest ze ścian butelki po płynie do spryskiwaczy; te są połączone przy użyciu zszywacza.


Rura jest przymocowana na pół-stałe, przy użyciu 8 małych wkrętów, w sposób przedstawiony poniżej (na zdjęciu tylko jedna ze stron):


Konstrukcja nie zakłada częstego wyjmowania tej rury - jeżeli już, to tylko w celu umycia lub regulacji wysokości zsypywania. Rurę "napełnia się" na miejscu, trzeba zdjąć dekiel wykonany z opakowania na płyty CD/DVD:


Dekiel jest osadzony luźno, na czterech wkrętach spoczywających w otworach wywierconych w rurze. Ich ustawienie jest celowo niesymetryczne, ma być jedna możliwość nasadzenia. Dwa otwory - było za luźno, trzy - dalej mi latało, stąd cztery w cudacznych odległościach, ze strzałką.
Wieszak na ubrania po odgięciu i nałożeniu wężyka akwarystycznego w swoim drugim życiu dalej robi za wieszak, a w pełnej okazałości widać go we wstępie.


Wymiarów nie ma i nie będzie, powyższy sukces został dokonany na kolanie w to popołudnie. Nie wiem tylko, czy ptakom spodoba się ten jaskrawy niebieski, ale podejrzewam, że jak mróz je przyciśnie, to z niebieskiej rury też zjedzą.

Thursday, August 30, 2018

[AKTUALIZACJA] Windows 7 na laptopie z 2017 roku? To może się udać


Jeżeli znasz już tę historię, przejdź do ciągu dalszego.


Dzisiejszy post będzie miał charakter rantu i jest skierowany do osób wybrednych, jeżeli chodzi o konfigurowanie sprzętu na własną rękę. Nie będę w nim unikał stwierdzeń technicznych jak też powtórzeń, dzięki którym będzie wiadomo explicite, do czego się odnoszę.

Każda moja przygoda z laptopem zaczyna się od świeżej instalacji, dlatego biorę laptopa bez systemu. I tak też radzę bliskim. Dlaczego? Masa laptopów dziś to reklamówki, na których jest zainstalowane całe mnóstwo aplikacji, gier, asystentów i generalnie rzeczy, z których końcowy użytkownik na 95% korzystać nie będzie. Laptop gdzieś po miesiącu zaczyna mulić do tego stopnia, że wykonanie prostych czynności graniczy z cudem. Osoba nieznająca się pomyśli, że laptop jest wadliwy, że trzeba iść z tym do serwisu. Niemniej, w poniższym przypadku będzie zgoła inaczej.

Casus znajomego: Lenovo Legion Y520. Wariant z dwoma dyskami: 128GB SSD i 1000GB HDD; karta graficzna NVIDIA GTX 1050 + zintegrowana intelowska. Osobnik bez systemu. System Windows 7 Home Premium kupiony na allegro. (Pssst! Jeżeli chcesz sobie jeszcze kupić to musisz się pospieszyć, bo jest ich coraz mniej!)

Coraz więcej laptopów nie ma napędu optycznego. Sam mam już laptopa bez takowego, nie pamiętam zresztą kiedy ostatni raz coś potrzebowałem z płyty. Powyższy również go nie ma, więc instalacja systemu musi odbyć się albo przez sieć albo z czegoś wyjmowalnego (np. pendrive).

Windows 7 na laptopie sprzed roku? Prawie 10-letni system!?

Część z Was może pukać się w głowę, ale Windows 7 to w mojej opinii jak dotąd, mimo wieku, najlepszy system Microsoftu. W kwestii bezpieczeństwa: prawda, już 3 lata nie ma podstawowego wsparcia i w instytucjach krytycznych należałoby najpewniej przemigrować na coś czynnie wspieranego, ale jest relatywnie najmniej awaryjny.

A słyszałeś może o Windows 8.1? Windows 10?

Tak, aż za dobrze. Zaliczyłem również kilka spotkań pierwszego stopnia z komplikacjami i XXI-wiecznymi kretynizmami w powyższych i nadal uważam, że polecanie komuś Windows 7 w 2018 roku ma swoje ugruntowane uzasadnienie. Narzekać na te systemy tutaj nie będę, świat od tego nie stanie się lepszy.

Mariaż z tytułu powiódł się, ale nie obeszło się bez tarcia.

Wracając do przytoczonego Lenovo: Windows 7 udało się zainstalować, ale ani BIOS, ani instalator nie widział dysku SSD. Nie wspomnę już o konieczności uprzedniego zintegrowania sterowników USB 3.0 z instalacją Win7, bo inaczej instalator szlocha przez brak sterowników... CD/DVD ROM. Microsoft być może postanowił taktycznie nie integrować sterowników USB 3.0 do fabrycznego obrazu siódemki, bo to by pewnie wielu ułatwiło downgrade z Win8.1/10. Integracja tych sterowników potrafi napsuć krwi.
Siódemkę udało się zainstalować, ale w systemie partycjonowania MBR i to na o wiele wolniejszym HDD. Tak zostać nie mogło, nie po to kupuje się miód, żeby lizać go przez słoik. Research wyłonił konieczność aktualizacji BIOSu. Ściągamy program do flashowania BIOSu z bakcylem od producenta, wszystko fajno. Odpalamy i dowiadujemy się, że flashowanie z systemów partycjonowania innych niż EFI jest niemożliwe.

Witaj przygodo!

Komponujemy bootowalnego pendrive'a z Windows 7 przy użyciu programu Rufus (gorąco polecam ;) z pożądanym systemem partycjonowania i sterownikami do SSD (szczerze pisząc, nie wiem na 100% czy to było konieczne, ale to wybiegnięcie do przodu nic nie kosztowało, więc...). Próbujemy rozruch z tego pendrive'a; loader instalatora dostaje obstrukcji jeszcze zanim zdąży się dobrze uruchomić. Obstrukcja objawia się tak (zdjęcie bezczelnie zerżnięte z neta, f**k GDPR):

Co robić? Jak żyć? Zainstalować Windows 8.1, bo ichniejszy instalator umie w EFI. Instalujemy 8.1 tylko na moment, żeby zaktualizować BIOS. :)

I wiecie co? To się udaje.

Po aktualizacji BIOSu laptop widzi SSD. Teraz dopiero instalujemy dziadzia (Win7) tak jak zamierzono. Na tym jednak problemy się nie kończą.

Sterowniki c.d. :)

Największym ananasem w tym wszystkim były sterowniki do karty graficznej (przyp. red. NVIDIA), których do teraz nie udało się zainstalować tak, jak Bozia przykazała. Cyrk zaczął się od tego, że instalator wymagał sterowników Intela. Jakich konkretnie? Pewnie sam nie wiedział, niemniej instalacja wszystkich możliwych sterowników intelowskich nie posunęła sprawy do przodu w tej kwestii. Próba instalacji starszej wersji sterowników również się nie powiodła, ale w tym przypadku instalator twierdził, że... nie wykrył karty. Finalnie, instalacja sterowników odbyła się częściowo, ręcznie, przez Menedżer urządzeń. Co nie zmienia faktu, że ściemnianie i rozjaśnianie ekranu nie działa.

Edit: Wszystkie pozostałe sterowniki udało się pięknie zainstalować.

Rezultat?

W sensie starań włożonych we wdrożenie - sukces: instalacja bez śmieci; patrząc przez pryzmat użyteczności - sukces 95-procentowy (patrz niżej).


Czy polecam?

Zależy czego się chce. Nie każdy będzie miał też czas i cierpliwość (i być może wiedzę), żeby przedsięwziąć coś takiego. Co na pewno należy zbadać przed takimi zakupami? To, czy dla każdego urządzenia będą odpowiadające sterowniki, w powyższym przypadku - Windows 7, który jest już starym systemem. Jednak nawet po obadaniu zagadnienia może się okazać, że instalator któregoś ze sterowników strzela focha i nara, więc to w pewnym sensie nadal ryzyko.

Jeżeli przeczytałeś/aś wszystko, dziękuję.

PS Polecam laptopy z SSD - warto wydać trochę więcej kasy. Przy odpowiedniej konfiguracji system chodzi jak rakieta.


Aktualizacja (13.09.2018)


Kontynuacja będzie wyłącznie o sterownikach do karty graficznej.
Kilka dni temu NVIDIA wydała kolejną wersję sterowników; podjąłem próbę zainkorporowania ich na opisanym wcześniej osobniku. Ten sam błąd, nadal żąda sterowników do Intela. Niemniej, ponowna inspekcja statusu sterowników intelowskich przy użyciu ichniejszego asystenta zwróciła uwagę na pewien istotny szczegół. Karta graficzna Intela widniała jako Standardowa karta graficzna VGA, przy czym po instalacji sterowników powinna być widoczna jako odpowiedni model karty graficznej Intela, ale tak w naszym przypadku nie było. Rzut okiem na szczegóły sterownika zdradza jego rok wydania: 2006. Nie ma w tym nic dziwnego, w końcu to sterownik generyczny, dzięki któremu system w ogóle wstaje, kiedy nie ma z góry zadanych odpowiadających sterowników do poszczególnych kart, których ogólnie jest sporo.

Dziwne natomiast jest to, że po wskazaniu nowszych, dedykowanych sterowników system twierdzi, że jego 12-letni jest aktualny, spoko i w ogóle.

Po przekonaniu systemu, że tak w istocie nie jest, udaje się zainstalować sterownik do karty Intela.

Wracając do tych ********* sterowników NVIDII

Odpalam instalator, wszystko fajno, napięcie rośnie. Mieli, mieli i pozwala kontynuować dalej. Poczyniamy największe kłamstwo na świecie, tzn. że zgadzamy się z warunkami licencyjnymi i takie tam, przeklikujemy do instalacji.

I instalacja się nie powodzi.

Okazało się, że instalator nie był w stanie odładować sterownika również z NVIDII, który połowicznie zainstalowałem ręcznie, przez Menedżer urządzeń. Wchodzimy do trybu awaryjnego (w Windows 7 jeszcze go nie skundlili), odinstalowujemy starszy sterownik NVIDII. Odpalamy kolejny raz instalację; udaje się. Uruchamiamy w normalnym trybie, niby wszystko spoko. Kolega sugeruje, żeby zobaczyć osiągi karty i odpalić Need for Speed Payback. Robi się czarny ekran, czekamy prawie minutę (choć na XXI-wieczne standardy czekanie kilkunastu sekund to przegięcie pały przy takich parametrach).

Zarzynamy proces gry, bo ile można czekać.

I wtedy doświadczamy

starego, dobrego niebieskiego ekranu śmierci (BSoD).

Po tych wszystkich staraniach, nasz ukochany sterownik dostaje rozwolnienia. Od tego momentu, system przy każdym uruchomieniu działa kilka sekund i zamraża się.

Jaki finał?

Ta bananowa powieść pełna treści kończy się odinstalowaniem karty NVIDII. Niemniej, delta wychodzi in plus, bo udało się zainstalować sterowniki do karty Intela, które przeoczyłem wcześniej ze względu na fakt bycia zastąpionymi generycznym microsoftowskim sterownikiem. Oprogramowanie wymagające akceleracji graficznej w końcu działa, można też ustawiać jasność ekranu. Nawet udaje się uruchomić wspomnianego Need for Speeda, a z NVIDII to ogólnie beka.

Friday, June 10, 2016

całkowanie numeryczne

W ramach zaliczenia pewnego przedmiotu trzeba było sobie wybrać zadanie i wykonać projekt. Wybrałem całkowanie numeryczne, bo uznałem to za ciekawy temat. Napisałem względnie prosty skrypt wyznaczający przybliżoną wartość całki oznaczonej funkcji jednej zmiennej czterema metodami. Projekt miał za zadanie wypisać obliczenia, błąd bezwzględny oraz czas wykonywania każdej z metod i wyniki miały zostać przedyskutowane. Do jednej metody (Romberga) wykorzystałem zewnętrzną bibliotekę oraz przyjąłem wartości zwracane przez tę funkcję biblioteczną za wzorcowe, ponieważ, według moich obserwacji, zdaje się ona podawać wynik najbliższy analitycznemu (kiedy to tylko możliwe).

Skrypt wykorzystuje 4 metody:
  • prostokątów
  • trapezów
  • Simpsona (parabol)
  • Romberga

Pomijając metodę Romberga, w przypadku 3 pozostałych metod przedział, w którym całka ma być wyznaczona, jest dzielony na N podprzedziałów. Skrypt zakłada przy tym, że funkcja, którą mu podamy istnieje i że jest ciągła w każdym punkcie przedziału < a ; b >, gdzie a oznacza dolną granicę całkowania a b - górną.

Metoda prostokątów i coraz dokładniejsze dopasowanie wraz ze wzrostem podziałów:


Credit: Khurram Wadee (https://en.wikipedia.org/wiki/File:Rectangle_rule.gif)

Metoda trapezów:



Skrypt przyjmuje 4 parametry: dolną (a) oraz górną (b) granicę całkowania, ilość podprzedziałów (N) oraz wzór funkcji jednej zmiennej.
Napisany w Perlu. Nie wrzucam tu wszystkich wzorów - jeżeli interesuje Cię ten temat, z łatwością odszukasz je w Internecie. Chciałbym bardziej skupić się na przykładowym rezultacie działania.


(Przypominam, że przyjmuję w swoich rozważaniach wartość metody Romberga jako wzorzec. Mowa o całkowaniu numerycznym, więc operujemy na przybliżeniach.)

Nasunęło mi się kilka wniosków w związku z powyższymi danymi:
  • pomijając metodę biblioteczną Romberga, metoda Simpsona daje najbardziej dokładny wynik
  • czas liczenia (za wyłączeniem metody Romberga) jest mniej więcej liniowy
  • z każdym 10-krotnym zwiększeniem ilości podprzedziałów wyniki stają się o 2 rzędy wielkości dokładniejsze
  • przy znacznie zwiększonej liczbie podziałów metoda prostokątów jest nieznacznie szybsza od pozostałych

To tylko mały "skrawek" zagadnienia. Funkcja, którą wykorzystałem jako przykład jest względnie gładka (zob. wykres). Problemem byłoby policzenie całki oznaczonej "stromej" funkcji, która "bardzo skacze" i do czego wymagana byłaby duża ilość podziałów, co wiązałoby się z wydłużeniem czasu trwania obliczeń. Wykorzystywane podejścia dzielą przedział na równe podprzedziały, bez badania przebiegu zmienności funkcji i "inteligentnego" ich ustalania lub dobierania metody w zależności od tego, jaki funkcja "ma mniej więcej kształt".

Do kodu nie roszczę sobie żadnych praw, możesz z niego korzystać w dowolny sposób, przy czym nie ponoszę odpowiedzialności za to, co nim zrobisz. Na pewno może być napisany lepiej, ale pierwotne założenie (przeważnie prostoty) spełnia.
#!/usr/bin/perl
use Math::Integral::Romberg qw(integral);
use POSIX;
use Time::HiRes qw(time);
use Scalar::Util qw(looks_like_number);

use constant PI => 4 * atan2(1,1);
use constant e => 2.71828182845904523536;

sub wrapper {
 my ($x) = @_;
 eval $funkcja;
}

sub rectangles {
 $lower = $_[0];
 $upper = $_[1];
 $intervals = $_[2];
 $step = ( $upper - $lower ) / $intervals;

 for($x = $lower; $x < $upper; $x += $step){
  $a = $step;
  $b = eval $funkcja;
  $sum += $a*$b;
 }
 return $sum;
}

sub trapezoids {
 $lower = $_[0];
 $upper = $_[1];
 $intervals = $_[2];
 $step = ( $upper - $lower ) / $intervals;

 $temp_sum = 0;
 $overall_sum = 0;
 $iterator = 0; #zliczanie "przebytych" podzialow; ich dlugosc nie musi (i najczesciej nie bedzie) liczba calkowita
 for($x = $lower; $x < $upper; $x += $step, $iterator++){
  $temp_sum = eval $funkcja;
  $overall_sum += ( $iterator==0 ? ($temp_sum/2) : ( $iterator==($intervals-1) ? ($temp_sum/2) : ($temp_sum) ) );
 }
 $overall_sum *= $step;
 return $overall_sum;
}

sub simpsons {
 $lower = $_[0];
 $upper = $_[1];
 $intervals = $_[2];
 $step = ( $upper - $lower ) / $intervals;

 $iterator = 0;
 $k = 0;
 $overall_sum = 0;
 for($x = $lower; $x <= $upper; $x += $step, $iterator++){
  $temp_sum = eval $funkcja;
  if($iterator==0 || $iterator==$intervals){
   $overall_sum += $temp_sum;
  } else {
   $k ^= 1;
   $overall_sum += ($k+1) * 2 * $temp_sum;
  }
 }
 $overall_sum *= $step/3;
 return $overall_sum;
}

sub parse_constants {
 $tempstr = $_[0];
 $tempstr =~ s/pi/PI/g;
 $tempstr =~ s/Pi/PI/g;
 $tempstr =~ s/pI/PI/g;
 #$tempstr =~ s/e/e/g;
 #print "\n $tempstr \n";
 $tempstr = eval $tempstr;
 return $tempstr;
}

sub call_redirector {
 $start = time;
 $sum = $_[0]($_[2], $_[3], $_[4]);
 $end = time;
 ${$_[1]} = ( $end - $start ) * 1000;
 return $sum;
}

sub wypisz_wynik_metody {
 print " metoda ", ($_[0]), "\t: ", (${$_[1]});
 if ($cmpval != 0) {
  $bl_bezwzgl = abs( ${$_[1]} - $cmpval );  
  print "\tblad bezwzgledny: $bl_bezwzgl";
  if ($bl_bezwzgl == 0) { print "\t\t"; }
 }
 print "\t\tczas: ", (${$_[2]}), " ms\n\n ";
 return;
}

$n_args = @ARGV;
if ($n_args < 4) { die "Za malo parametrow.\n"; }

$lower = parse_constants(shift); #$ARGV[0]
$upper = parse_constants(shift); #$ARGV[1]
$intervals = shift; #$ARGV[2]

$not_numeric1 = "Podana wartosc ";
$not_numeric2 = " zdaje sie nie byc wartoscia liczbowa.\n";

if(!looks_like_number($lower)) { die "$not_numeric1" . "dolnej granicy" . "$not_numeric2"; }
if(!looks_like_number($upper)) { die "$not_numeric1" . "gornej granicy" . "$not_numeric2"; }
if(!looks_like_number($intervals)) { die "$not_numeric1" . "ilosci interwalow" . "$not_numeric2"; }

unless ($intervals > 0) { die "Ilosc interwalow musi byc dodatnia.\n"; }

for($i = 0; $i < $n_args - 3; $i++ ) { #n_args minus 3, bo 3 parametry zostały już zdjęte z ARGV
 if ($i==0) {
  $funkcja = shift;
 } else {
  $funkcja = $funkcja . ' ' . shift;
 }
}
$_funkcja = $funkcja;
our $funkcja =~ s/x/\$x/g;

print "\n dolna granica calkowania: $lower\n";
print " gorna granica calkowania: $upper\n";
print " ilosc interwalow : $intervals\n";
print " funkcja: $_funkcja\n";

#tak sie sklada, ze wszystkie wlasciwe funkcje liczace przyjmuja po 3 parametry
$czas_prostokaty = 0;
$suma_prostokaty = call_redirector(\&rectangles, \$czas_prostokaty, $lower, $upper, $intervals);

$czas_trapezy = 0;
$suma_trapezy = call_redirector(\&trapezoids, \$czas_trapezy, $lower, $upper, $intervals);

$czas_simpson = 0;
$suma_simpson = call_redirector(\&simpsons, \$czas_simpson, $lower, $upper, $intervals);

$czas_romberg = 0;
$suma_romberg = call_redirector(\&integral, \$czas_romberg, \&wrapper, $lower, $upper);

our $cmpval = $suma_romberg; #funkcja biblioteczna zwraca bardzo dokladne wartosci; jej wyjscie posluzy jako wartosc wzorcowa

print "\n przyblizona wartosc calki oznaczonej:\n\n ";
wypisz_wynik_metody("Romberga", \$suma_romberg, \$czas_romberg);
wypisz_wynik_metody("prostokatow", \$suma_prostokaty, \$czas_prostokaty);
wypisz_wynik_metody("trapezow", \$suma_trapezy, \$czas_trapezy);
wypisz_wynik_metody("Simpsona", \$suma_simpson, \$czas_simpson);

Tuesday, January 13, 2015

Udało mi się

Jakiś czas temu pisałem o problemie, okoliczności odtworzenia którego nie były trywialne. Chodzi mi o okna/notyfikacje, które poruszają tematykę rzekomo niskiej wydajności komputera, a których nachalność stanowi udrękę. Najpierw zrobiłem patcha (łatkę) do systemu, a potem odkryłem, że w systemie istnieje funkcja pozwalająca na wyłączenie schematu kolorów. Nie przyszło mi do głowy, że Microsoft pozwoliłby ot tak zmienić kompozycję jednym wywołaniem: ma to skutek globalny, przy uruchamianiu "zasobożernych" aplikacji powoduje często zawieszenie się systemu a w niektórych przypadkach uniemożliwia niektórym programom funkcjonowanie (np. Fraps, z tego co mi wiadomo, nie jest w stanie nagrywać bez kompozycji z przeźroczystoscią okien). Ale. Najpierw odkryłem ("złamałem") to okno.



Analizowałem kod w debugerze i ustaliłem, jak trzeba ten proces (dwm.exe) "szturchnąć", żeby to okno się pojawiło. Wystarczy oknu Menedżera okien pulpitu wysłać odpowiednią wiadomość. Pokażę teraz, jak każdy z Was może sprawić, żeby to okno się pojawiło (Windows 7), wysyłając procesowi 3 liczby :). Będzie to też pewnego rodzaju dowód, że z czterech liter sobie tego nie wyjąłem.

Pobierz program WindowHack. Służy do manipulowania oknami, bardzo przydatne narzędzie, moim zdaniem must-have dla każdej osoby zajmującej się programowaniem pod Windows.

Rozpakuj program, uruchom go. Kliknij drugi przycisk od lewej na samej górze (Show available windows).


W oknie poniżej wyszukaj "DWM Notification Window", kliknij prawym przyciskiem myszy i wybierz Get window.


Następnie, wybierz opcję jak na obrazku poniżej:


Pojawi się okno, w którym wpiszesz tylko wartości MSG, WPARAM i LPARAM (pola HWND nie ruszaj, będzie ono miało u Ciebie na pewno inną wartość).


Kliknij "Send Message" i najpewniej pojawi się omawiane na samym początku okno:


Istotnie, w polu LPARAM możesz podać wartości 201, 203, 400, 401 lub 405. Jak nie wierzysz to sprawdź :).

Wracając do meritum. Odkrywszy sposób na błyskawiczne i wygodne wywołanie tego okna, wszystko dalej potoczyło się z górki. Szybko odnalazłem miejsce w kodzie, gdzie zachodzi zmiana schematu. Zrobiłem łatkę, która zapobiega tej zmianie. Potem dowiedziałem się, że system oferuje funkcję wyłączenia tego schematu. Nic nie straciłem poza czasem. Ale dzięki temu mam 100% pewność, że uderzyłem we właściwe miejsce.

Jak wywoła się systemową funkcję zmieniającą kompozycję (lub schemat kolorów, jak kto woli), to znika przeźroczystość okien, w zasobniku systemowym pojawia się taki balon informacyjny:


...którego kliknięcie powoduje otwarcie takiego okna:


Powyższa zmiana często zachodzi, jak uruchomi się "ciężką aplikację" (grę, odtwarzanie wideo bardzo wysokiej jakości). Główną udręką jest fakt, że niektóre z tych powiadomień występują losowo, bez uzasadnienia. Okazuje się, że faktyczne zasoby komputera nie mają znaczenia. Potwierdza to opinia gościa, który twierdzi, że także otrzymuje takie komunikaty; na komputerze z dwoma dwunastordzeniowymi procesorami, 128GB RAM, dwiema kartami Nvidia 670 i dyskami SSD.[1].

Najwięcej czasu zabrało mi wywołanie tego okna i nie mam "przepisu", jak je wywołać, wysyłając procesowi wiadomość.


Tak na marginesie, z mojej analizy wynika, że to okno nie powinno się w ogóle pojawiać. Po prostu jeden z argumentów pewnej funkcji jest wpisany na stałe (ang. hard-coded) i teoretycznie nie ma możliwości, aby się ono "naturalnie" pojawiło. A najśmieszniejsze jest to, że w Internecie są zrzuty ekranu wykonane przez osoby, którym się to okno pojawiło. Magia. Co prawda zmieniłem pamięć procesu tak, żeby łatwo wywoływać sobie to okno, jest to niesamoistny sposób wywołania. Faktyczną kwestię pojawiania się tego okna dalej badam i najprawdopodobniej zabiorę się niedługo do pisania kolejnego programu "badawczego" :).

Wersja beta mojej łatki wygląda obecnie tak:


Może trochę straszyć, ale nie ma się czego bać.
Niedługo zostanie wydana.

Thursday, August 7, 2014

Obrót sprawy

W poprzednim poście pisałem o swoim programie, wyglądzie jednego z jego okien (co było nawet przedmiotem głosowania).

Ufam, że zmiany poprzestaną na tym, co widzisz poniżej:



To "najbardziej pierwszy" z układów, wymyślony jeszcze zanim zacząłem pracę nad programem. Z jakiegoś powodu go odrzuciłem - okazało się, że niesłusznie.