- QT += core gui script network
Są już znane szczególy kolejnej edycji, w tym agenda konferencji, która odbędzie się 21-23 października.
Organizacja tegorocznej edycji przerosła nasze najśmielsze oczekiwania – pojawią się słynne nazwiska, choćby Derick Rethans, któremu zawdzięczamy świetne narzędzie, jakim jest xDebug; David Coallier odpowiedzialny za PEAR oraz – uwaga, uwaga, fanfary odegrać proszę – Lorna ‚LornaJane’ Mitchell członek projektu PHPWomen. Nie dość, że wreszcie płeć piękna zagości w naszych progach, to jeszcze do nas przemówi. [;
Zainteresowanie zagranicznych prelegentów było naprawdę duże – do tego stopnia, że PHPCon mógłby potrwać przynajmniej tydzień, na samych prelekcjach. A trzeba też porozmawiać, czy też popływać w basenie.
Jak wspomniałem już wcześniej, agenda jest już znana. Swoje trzy grosze również umieszczę, będę mówił o Bezpieczeństwie aplikacji webowych dla zielonych i trochę czerwieńszych.
Dlaczego taki temat pośród innych, naprawdę ambitnych? Ponieważ nauczony doświadczeniem zeszłorocznego odzewu po prezentacji dotyczącej systemów cache’owania, warto wzbudzać wśród programistów świadomość pozornie kwestii oczywistych. A temat bezpieczeństwa jest zawsze „na czasie”, mam nadzieję, że każdy coś z tego wykładu przyswoi dla siebie. ;)
Ale gdzie to, do @#*&# jest? – tak jak w zeszłym roku – okolice Kielc, dokładniej: Mąchocice. Jeśli zdążysz się zapisać do 6 sierpnia jako osoba indywidualna, dostaniesz 100zł zniżki, co sumarycznie daje 250zł z zakwaterowaniem w hotelu.Do zobaczenia!
]]>Ostatnio marudziłem na temat systemów POSIX-owych, dzisiaj znowu będę marudził – co w Windows mi nie pasuje.
Że co? Ty marudzisz na Windows?! – Tak, tak. Mam do czynienia z oboma środowiskami (POSIX i Windows), ale do popełnienia tego wpisu popchnęło mnie to, że niektórzy po prostu bezkrytycznie chwalą Okienka, nawet jeśli nie mają ku temu powodów. Aż chce się powiedzieć, It’s not a bug, it’s a feature!
No to co, zaczynamy!
Organizacyjnie – nie będę się rozczulał nad konkretnymi edycjami (serwer/klient) – po prostu będę poruszał to, co mi się nawinęło.
Że co proszę? Albo jestem jakoś kiepsko poinformowany, albo instalując edycje serwerowe Windows nie obejdzie się bez środowiska graficznego. Dla mnie to porąbany pomysł – dlaczego marnować zasoby na coś, z czego skorzysta się – przynajmniej w teorii – kilkakrotnie? Przy instalacji, konfiguracji, ew. łataniu. (taka mała dygresja, uwaga – trzymać się mocno krzesła – post na forum PHP.pl)
Ja rozumiem, zdobyć użytkowników. Ale po kiego grzyba marnować pamięć? Kompromisem byłoby jakieś API administracyjne, które BOFH wykorzystuje przez jakąś aplikację kliencką, nawet graficzną. Ale na właściwym serwerze, na którym stoi tylko, np. IIS + SQL Server? Usługi Terminalowe, to trochę inna para kaloszy.
Im dalej w las, tym więcej drzew. Nie rozumiem jednego – przez te ~15 lat nie można było wypracować jakichś sensownych narzędzi do przeprowadzania pewnych operacji z poziomu Wiersza Poleceń? Tak samo z samym WP – w porównaniu do POSIX-owego basha, zsh, czy nawet standardowego sh wypada wręcz fatalnie. O innych narzędziach służących do operacji na plikach, czy tekście – już nie wspomnę. Choćby pierdołowaty grep, czy sed. Owszem, są pakiety (Cygwin, msys, etc), które pozwalają na zmniejszenie dystansu do środowisk POSIX, ale dość często są one nie do końca działające, np. wspomniany wcześniej sed. Pod Windows nie sprząta plików tymczasowych. Peszek.
Żeby nie było – przy konfiguracji systemu wykorzystuję narzędzia net, czy netsh. Ale tym przecież wszystkiego się nie da zrobić. WSH też ma sporo ograniczeń.
Brakuje obsługi nagłówka skryptowego dla plików, np. #!/bin/bash, ale to jest do przeżycia – w końcu filozofia rozszerzeń w nazwach plików miast typów MIME.
Ja tego nie rozumiem – tylu producentów firewalli na rynku, tylu posiada certyfikaty zgodności z systemem, a żaden nie posiada możliwości konfigurowania ustawień przez narzędzia konsolowe. Oczywiście pomijam aplikację systemową, bo to firewall tylko z nazwy.
Fakt, może istnieje taki, o którym mówię, ale jeszcze się na niego nie natknąłem. Wszystko muszę klikać, niczego nie oskryptuję, co bardzo często by się przydało. A grzebanie w ustawieniach na żywca jest trochę dziwne albo pilnowane.
Nie wiem, czy to jest związane z następnym punktem, ale – z tego co pamiętam – to nawet gdy komp coś spokojnie robił, to po iluś tam godzinach zaczynał fiksować. A to GUI wariowało, a to niektóre programy wywalały setki błędów (z tego co pamiętam, to zwykle „pamięć nie może być READ/WRITE” – no to jaka może być, do jasnej ciasnej?!). Po restarcie wszystko wracało do normy. Pewnie zaraz ozwą się fanatycy, że musiałem mieć jakieś uwalone sterowniki. Odpowiem – próbowałem wszystkich kombinacji. Najnowsze też, tylko certyfikowane też – niezależnie od platformy sprzętowej. Przykro mi, przydałoby się wreszcie nad tym popracować.
Kolejna kwestia, która na przestrzeni lat nie została prawidłowo zaprojektowana. Jak sięgam pamięcią, to stan wstrzymania wprowadzono już w Windows 95. Hibernacja w Windows XP albo może w 2k.
To nie można było tego w końcu dopracować? Po kilku wybudzeniach z systemem dzieją się podobne rzeczy jak wyżej. Przez 15 lat się nie dało…? Z tego co wiem, to POSIX-y sobie z tym jakoś radzą.
Chwała tym, którzy w końcu przeforsowali UAC do Windows. Wszystko fajnie, super. Tylko mimo odrobienia pracy domowej z Visty, w Siódemce nadal ten mechanizm jest upierdliwy. Najbardziej daje popalić brak możliwości zdefiniowania listy aplikacji, które zostaną uruchomione z podwyższonymi uprawnieniami bez upierdliwych potwierdzeń. Dlaczego np. uruchomienie Menedżera Urządzeń nie powoduje wyświetlenia okienka UAC? No jasne, pewnie – jak zwykle – kwestia podpisów.
Kopałem trochę w Sieci, znalazłem. Dla mnie to jest zwyczajna wymówka – przecież firewalle w jakiś sposób rozpoznają, które aplikacje posiadają jaki poziom uprawnień. Da się? Da się. W POSIX-ach sobie poradzili, w Windows też by mogli. Dlaczego nie można było po prostu wykorzystać już istniejącego mechanizmu i dodania kolejnej przystawki do Konsoli Zarządzania, w której można by było zarządzać taką listą? No i – oczywiście – prostego czekboksa „uznaj tę aplikację za zaufaną/niezaufaną i nie pytaj w przyszłości”.
To samo z brakiem narzędzia su/sudo. Ile by to uprościło życie. Ktoś w ogóle testował UAC w normalnych warunkach użytkowania? Czy to jest upierdliwe albo nie? Tak BTW, gdyby ktoś potrzebował sudo pod Windows, to coś takiego istnieje.
Nie jest to rozwiązanie idealne, ale zawsze jakieś.
Nie mam pojęcia, od czego się tak robi, ale w pewnych warunkach Aero-Peek przestaje kompletnie działać – nie są wyświetlane żadne miniaturki, a dymki podpowiedzi po pokazaniu pozostają widoczne nawet po przejechaniu kursorem w inne miejsce i ciężko się ich pozbyć. Po zrestartowaniu Eksploratora wszystko wraca do normy. WTF?
Cyz spotkaliście się y tak yapisanzmi ydaniami? Na pewno. A ile osób za pierwszym razem miało „banię”, w jaki sposób się to stało? Komuś z Redmond przyszło do głowy, żeby – oprócz podstawowego – instalować jeszcze jeden, kompletnie bezużyteczny układ polskiej klawiatury. Mało tego, do przełączania bieżącego układu użyto skrótu klawiaturowego, który można dość często wcisnąć zupełnie przypadkiem. Kochany lewy ALT + lewy Shift. Człowiek instalujący Windows po raz n-ty już z automatu wyłącza to ustrojstwo. Ludzie, tak ciężko przyporządkować do ustawienia regionalnego konieczność aktywacji paska języka…? Rozumiem w przypadku azjatyckich. Ale dla polskiego…? Po co?
Skoro przy projektowaniu Siódemki tak mocno się inspirowano KDE, to czemu nie można było jeszcze zainspirować się wirtualnymi pulpitami…? Owszem, ktoś się odgrozi, że w PowerToys jest coś takiego. No jest. Tylko że z użytecznością za wiele wspólnego to nie ma.
Tego już nie wybaczę! Nie ma mowy, aż poświęcę osobny punkt. Jak to można w ogóle opublikować system bez narzędzia pozwalającego na prostackie pobranie pliku z Sieci? RIAA/MPAA? Jest system, który nie ma wget/fetch na pokładzie? Oczywiście – Windows. Dlatego w paczce „must-have” jest wget. Nie wiem, co to za cud, że zostawili ftp, chyba to były problemy dla tzw. ZU w posługiwaniu się tym narzędziem.
Po instalacji Siódemki wklepuję sobie kulturalnie „hypertrm” i zonk. Pozwólcie, że jedynym komentarzem w tej sprawie będzie fragment ze stron Microsoftu:
„Jeżeli program HyperTerminal był wcześniej używany do sterowania urządzeń szeregowych, możliwe jest zwykle znalezienie w Internecie wersji programu HyperTerminal do pobrania, która jest bezpłatna do użytku domowego.”
Osobiście tego nie doświadczyłem, ale Pavlick ostatnio dość często „męczy mi ucho” odnośnie bardzo niskiego limitu liczby jednoczesnych połączeń SMB w nie-serwerowych edycjach systemu.
Zrobię proste porównanie. Jako użytkownik nie znoszę Javy ze względu na jej ospałość. Ale za to system uaktualnień działa bardzo sprawnie – mogę spokojnie wywalić stare wersje bibliotek bez obawy, że aplikacje przestaną działać. Na dodatek, instalka też nie jest ciężka. Z tego co pamiętam, to dużo mniej niż 50 MiB. A .NET Framework? Kilka różnych wersji niekompatybilnych wstecznie, które pożerają setki megabajtów miejsca. Dlaczego nie mogę zainstalować najnowszej wersji, a staroci wywalić?
Podczas instalacji każdego POSIX-a można wybrać punkty montowania dla każdego elementu drzewa. W Windows tego, niestety, nie ma. Żeby chociaż była możliwość przeniesienia katalogu z ustawieniami użytkowników w inne miejsce… Problem zrobić tryb instalacji dla zaawansowanych?
Słyszałem, że ponoć da się zwyczajnie przenieść ten katalog po instalacji. Jednak tego nie testowałem.
Aplet Dodaj/Usuń Programy nie zmienił się, tak naprawdę, od lat. Może przeszedł tylko face-lifting, żeby było widać, że coś z tym robią. Dla Windows Phone zrobili Marketplace, czy świat by się zawalił, gdyby był i dla systemu na trochę większe urządzenia? Tak samo zarządzanie zainstalowanymi bibliotekami. Zrobili jakieś WinSxS, które kopiuje wszystkie możliwe wersje tej samej biblioteki. I katalog puchnie, i puchnie, a Microsoft twierdzi, że gdy system ustali, iż dana biblioteka nie jest używana, to jej kopia zostanie skasowana.
To tak samo, jak z Yeti – wszyscy słyszeli, a nikt nie widział. Ilość postów na różnych forach na temat puchnięcia WinSxS chyba o czymś świadczy…
Ekhm, najpierw skopiować do folderu tymczasowego, potem zrobić z tego obraz i dopiero potem wypalić. Przynajmniej tak było w WXP. Ok, rozumiem, zrobić obraz, to jeszcze jestem w stanie przetrawić. Ale po co tyle kopiować? Nawet jeśli fizycznie jest to ten sam dysk? Ale dysk jest tani. Zaraz, to było z CPU chyba, czy z RAM-em? No jasne, wszystko jest tanie. Taniusie. Szczegół, że potrzebujemy pierdyliarda megabajtów.
„Ale przecież ktoś może nagrywać coś z sieci…” – to nie ma funkcji, która pozwala na sprawdzenie, czy coś takiego ma miejsce? Jest na pewno. Ciekawe, ile statystycznie osób wypala coś bezpośrednio z zasobu sieciowego. Nazbiera się 10%?
W POSIX-ach uaktualnieniami zajmuje się menedżer pakietów. No ok, w Windows mamy Windows Update, alerty połowicznie w Centrum Zabezpieczeń, czy jak to się tam nazywało. Ale nie można było otworzyć jakoś tego API dla innych programistów i programów? Byłby mniejszy chaos no i sam system byłby odpowiedzialny za odpowiednie powiadomienia i przeprowadzanie aktualizacji. Np. jeden DLL do aplikacji, a nie dziesiątki mini-programików, które siedzą koło zegarka tylko po to, aby pilnowały, czy są jakieś łatki. No i pozostaje jeszcze kwestia uprawnień, która jest – w większości przypadków – nie do przeskoczenia bez dodatkowych kombinacji, np. instalacja dodatkowej usługi.
Za każdą instalacją różnej wersji Windows jedna z pierwszych czynności, które wykonuje, to wyłączenie Windows Update. Po instalacji Siódemki stwierdziłem, że dam szansę. I to był błąd, który dał ponownie popalić – unieruchomiony przez łatkę system. Miałem podobnie na innych platformach, na innych systemach, a z tego co rozmawiałem, to nie tylko ja. Nie wiem, dlaczego pod POSIX-ami nie ma z uaktualnieniami takich problemów… Moim zdaniem, developerzy powinni poważnie przemyśleć samą logikę aktualizacji. W zbyt wielu przypadkach jest wymagany restart systemu (często z powodu lenistwa niektórych programistów), zbyt często się zdarza, że bez powodu wszystko kończy się unieruchomieniem systemu w zasadzie bez powodu. Jedyny plus, że próbowano pomóc rozwiązać mój problem, ale niestety, nie znalazłem wówczas chwili czasu na zebranie wymaganych danych..
Masz potrzebę chwilowego podpięcia pendrive’a, którego dostałeś w łapy pierwszy raz. I potem go raczej nie ujrzysz. Mimo to, sterownik zostanie w systemie. Najgorzej jest z kartami sieciowymi – wywalić nieistniejące sterowniki, to dopiero jest wyzwanie…
Z cachem ARP jakoś system sobie poradził (rzadko używane wpisy są kasowane, reszta przetrzymywana)…
Standard w POSIX-ach, a w Windows? Taka prosta rzecz – wybór poziomu przezroczystości oraz zwijanie całego okna do wyłącznie paska tytułu. Wiem, że bzdet, ale…
Nie wiem, czy byłoby tych punktów więcej. Gdyby wyeliminować chociaż połowę z tych – moim zdaniem – niedoróbek, to Windows byłby chyba idealny…
Oczywiście całość jest tak obiektywna, jak mokra jest pustynia.
Zapraszam do dyskusji.
]]>Ale zdziwiony byłem, jak potężne się stało to narzędzie na przestrzeni różnych wersji Windows. Odkryłem to przypadkowo – chciałem odpalać aplikację zaraz po wybudzeniu komputera ze stanu uśpienia. Nie da się? Błąd: da się!
W innych systemach jest od dawna coś takiego – ktoś z użytkowników systemów POSIX-owych nie słyszał o Cronie? No właśnie. Sęk w tym, że windowsowa edycja tego potworka ostatnio służy do czegoś więcej niż tylko do uruchamiania zadań o podanej godzinie.
Od ostatnich wersji Windows, Harmonogram potrafi reagować na zdarzenia dopisywane do systemowego Dziennika Zdarzeń. Zupełnie jak skrypty monitorujące dzienniki w POSIX-ach. Przyznam, że do Windows XP DZ był traktowany przez niektóre aplikacje po macoszemu i nie było czegoś ujednoliconego jak to jest w przypadku np. Linuksa. Jednak obecnie wreszcie udaje się ogarnąć cały ten chaos.
Harmonogram zadań jest dostępny w Zarządzaniu Komputerem (compmgmt.msc).
Dodawanie nowego zadania nie jest specjalnie trudne – pod warunkiem, że wiemy, czego chcemy. Wszystko jest dość intuicyjnie zaprojektowane, co mnie początkowo trochę zdziwiło, ponieważ tego typu narzędzia zwykle były nieprzyjemne w użytkowaniu…
Ktoś powie, po co?
. Może być multum różnych sytuacji – czy zrestartowanie programu, zapisanie nowego IP, wiele innych. Najbardziej mnie przerażała kwestia wykorzystania osobnej aplikacji do sprawdzania, czy komputer został wybudzony, bądź nie.
Aż w pewnym momencie doznałem oświecenia – przecież Harmonogram był ostatnio odpicowany. Pogrzebałem co nieco, czy nie było zdarzenia pozwalającego na wykonanie akcji przy wybudzeniu. Niestety, nie było. Znalazłem za to innego potwora:
Co oznacza ten zrzut? Ano to, że możemy monitorować systemowe Dzienniki Zdarzeń na podstawie konkretnego wystąpienia, źródła oraz rodzaju. Również po XML (dla mnie trochę przerost formy nad treścią, ale…). I w tym momencie pozbierałem żuchwę z podłogi, ale zaraz – mam już czym sprawdzać, czy wybrane zdarzenie wystąpiło, czy nie, ale czy system dopisuje coś nam odpowiadającego. No to zajrzyjmy do dzienników (eventvwr.msc):
Okazuje się, że system jednak tworzy zdarzenie przyporządkowane wybudzeniu komptera. To teraz wykorzystajmy je do własnego celu. Tworzymy nowe zadanie, ale jako wyzwalacz wybieramy zdarzenie. Teraz pozostaje podać jego parametry.
I tu nie kumam jednego – w Dzienniku Zdarzeń nazwy są nieco inne od tych, które mamy dostępne na liście wyzwalacza. Aby uruchomić zadanie po wybudzeniu komputera ze stanu uśpienia/hibernacji, podajem parametry:
Zatwierdzamy metodą cegły-na-enterze nasze zadanie i dokonujemy jazdy próbnej. Działa?
Sam sposób sprawdza się wyśmienicie, jednak interfejs jest, momentami, trochę niedorobiony – np. przy zaawansowanym filtrowaniu zdarzeń, po zapisaniu, mamy możliwość wyłącznie edycji zapytań XPath, już nie wyklikamy ustawień. Warto o tym pamiętać.
]]>Niestety, chcąc korzystać z usług innych operatorów, dość często trzeba uiszczać opłatę za tzw. „utrzymanie łącza”. Żeby było zabawniej – najtańszy abonament kosztuje mniej o – bodajże – 10zł.
Z papierowymi fakturami każdy abonent jest za pan brat. Ale z e-fakturami już nie do końca. Jak to zwykle z operatorami usług telekomunikacyjnych bywa – pomarudzę.
Jakiś czas temu Telekomunikacja wprowadziła coś zwanego „e-fakturą”, czy też „elektronicznym obrazem faktury”. Trudno było się o tym nie dowiedzieć – z rachunkiem przychodzi przecież mnóstwo spamu o usługach TP. Średnio na trzy kartki w kopercie co miesiąć, tylko jedna to rachunek. Zdarzy się czasem jakaś decyzja, czy informacja o zmianie jakiegoś przepisu, ale zazwyczaj są to śmieci, w dodatku złożone kilkakrotnie. Najwięcej ekologii jest w kopertach – kiedyś na tych szarych, „eko”, widniał napis na języku: nie jestem szara, tylko ekologiczna!
. Czego na pewno nie można powiedzieć o zawartości…
Niestety, nie wpadłem wcześniej na to, aby porobić zdjęcia najzabawniejszych „cyrków” obrandowanych logo France Telecom, ale aby podsumować – Oręż wciska klientom kit, że w celu zadbania o ekologię, lepiej jest korzystać z e-faktury. No mimo wszystko, mam powody, aby z tego nie korzystać (chyba nie wszystkie instytucje w PL już dojrzały do korzystania z wyłącznie elektronicznych faktur, poza tym – same powiadomienia o fakturach przychodzą nawet tydzień po wystawieniu) – więc świadomie tego nie wybieram.
Ale załóż sobie konto na tp.pl, w celu bieżącej kontroli stanu usługi. Pierwsze, co ujrzały moje oczy, to ogromna „plansza” namawiająca do aktywacji e-faktury:
Ok, ja to rozumiem. Słabo widoczny guzik do zamknięcia też rozumiem. Ale tego, że pokazuje się to okno przy każdym logowaniu już (…) nie! Skoro zdążyłem zamknąć to coś dziesiątki razy, mogliby się w końcu nauczyć, że nie jestem zainteresowany kopią elektroniczną. Gdybym był, to sam bym podjął odpowiednie kroki.
To przeboleję, zablokuję sobie w jakimś filtrze wyświetlanie tego badziewia i będzie git.
Jednak kilka dni temu otrzymałem maila:
W trosce o ekologię, miło nam poinformować Państwa, że od 1 stycznia 2011 r. zamiast papierowej faktury VAT za usługi telekomunikacyjne będą Państwo otrzymywać ekofakturę – elektroniczny obraz faktury. Od tej pory faktura będzie wysyłana do Państwa co miesiąc na niniejszy adres e-mail, najpóźniej pierwszego dnia po jej wystawieniu.
Jakim prawem korporacja decyduje, co jest dla mnie lepsze?! Na 100% (marketingowe 101%) nie wyrażałem chęci ani zgody na rezygnację w moim imieniu z tradycyjnej, papierowej faktury.
W dalszej części maila:
Jednocześnie informujemy, iż od 1 stycznia 2011 roku wchodzi w życie nowe rozporządzeniem Ministra Finansów z dnia 7.10. 2010 w sprawie przesyłania i przechowywania faktur w formie elektronicznej.
Tylko nie rozumiem tu dwóch rzeczy – po „kiego” oni wspominają o jakiejś ustawie oraz – jakie są jej parametry?
Czyżby akcja w stylu wysyłania regulaminów wydrukowanych maczkiem? Śmiem twierdzić, że jednak tak – Dziennik Ustaw oraz jego nowelizacje do lekkich i krótkich lektur nie należą, więc po co podawać? Nikt się przecież nie pofatyguje, żeby przekopać całość. Skoro poparte tekstem wchodzi w życie nowe rozporządzeniem
(dopiero teraz dostrzegłem literówkę), to pewnie szara owieczka uzna, że tak ma być.
Ekologia, do jasnej ciasnej… Teraz wszystko można zrobić pod pretekstem ekologii nawet, jeśli coś z ekologią ma wspólną wyłącznie nazwę.
Niech TP najpierw przestanie wciskać tony śmieci do kopert, przykład najpierw musi iść z góry. Reklam nie drukują na papierze z odzysku. Summa summarum – całe szczęście, że można wyrazić sprzeciw co do decyzji zmiany formy faktury, co niezwłocznie uczyniłem…
]]>Ale nie o tym chcę napisać. Wspomniałem, że programowanie, to stan umysłu. Czyli zgodnie z definicją, osobnik ów posiadający powinien potrafić zrealizować postawione przed nim zadanie niezależnie od języka.
Z własnego doświadczenia – coś w tym jest. Tak się się stało po bliższej przygodzie z C++ i Qt. Notka trochę filozoficzna.
Przedmiot zwany Programowaniem w C++. Jak to zwykle bywa, laborki, do tego projekt. I ten ostatni, przy prawidłowym napisaniu aplikacji, umożliwiał uzyskanie zaliczenia z całego przedmiotu.
Przyznam, że wyzwanie było dość ciekawe. Można powiedzieć, że jest dość sporo różnic między językiem typowanym dynamicznie a typowanym statycznie. Choć pozory mylą – jeśli ktoś pisał już parę lat w PHP i operator === nie jest mu obcy, wraz z praktycznym wykorzystaniem, to – w pewnym sensie – pracował z pewnego rodzaju hybrydą.
A jeśli, siadając do C++, się trochę zapominał, to o dobrych manierach natychmiast przypominał mu kompilator. Czasem też i access violation, co się nieraz zdarzało.
Wracając – z mojego punktu widzenia najbardziej dawało popalić tworzenie międzymordzia (GUI) poprzez WinAPI. Litości, dziesiątki funkcji, parametrów, których składnia miała chyba tylko zwiększyć zarobki programistów, nieraz i dziwnych nazw. Arghhh…
No i ogromnym nieporozumieniem byłoby, gdybym nie wspomniał tu o MFC. Nie bardzo pałam chęcią gadania o MFC, bo jak tylko pomyślę o Visual Studio, o tym, jaki śmietnik robi w systemie podczas instalacji… Ech, teraz nie zasnę, na pewno nie. Developerzy MSVS chyba zapomnieli o regule KISS… Dlaczego dobre IDE nie mogą być pisane po ludzku – Eclipse/NetBeans w Javie, VisualStudio też kobyła…
Szukając jakiegoś remedium, przypomniałem sobie, że obiło mi się kiedyś o uszy coś takiego jak Qt. Fani KDE pewnie teraz przetarli oczy.
Co ciekawe, prowadzący w ogóle nie słyszał o Qt, co mnie zdziwiło…
Po moich dotychczasowych przygodach z C/C++ nie podchodziłem do projektu z jakimś szczególnym entuzjazmem. Jednak perspektywa zwolnienia z egzaminu sukcesywnie popychała do rozgrzebania tematu na części pierwsze i kolejnych prób. Poczytałem trochę na temat Qt z nakierowaniem na fakt, że międzymordzie projektowało się prawie jak w Delphi – graficznie.
Ale nie przesadzajmy, to nie może być wyznacznik wyboru biblioteki (choć na pewno to miało jakiś wpływ).
Urzekło mnie, natomiast, dodawanie obiektów oraz widgetów (w windowsowej nomenklaturze – kontrolek). To było dokładnie to, czego szukałem:
Nie dość, że bardziej intuicyjnie, to tego typu forma od razu przypomniała mi zasłyszaną refleksję: jednym z najlepszych jest samodokumentujący się kod. I powyższy, moim zdaniem, spełnia to założenie – patrzę i widzę, co kod robi. No to teraz zobaczmy, jak w MFC wygląda kod realizujący podobną funkcję:
Im więcej patrzę na ten kod, tym bardziej czuje się głupi. Hmm, rozpracowując to teraz metodą naukową na-zdrowy-chłopski-rozum: no ok, tworzę sobie obiekt zwany CStatic. Hej, ale po kiego Create, skoro konstruktor już wywołałem? Eeee, muszę go dodatkowo pokazywać, skoro w 90% przypadków ten tekst będę chciał wyświetlić od razu? No cóż, każdy ma swoje własne upodobania, ale zdecydowanie wolę tę pierwszą filozofię wstawiania obiektów.
Wracając do Qt. Zanim zabrałem się do pisania czegokolwiek, postanowiłem przejrzeć listę dostarczanych klas. Złapałem się za głowę. Aż tyle? Jest scyzoryk? Nie ma?
Najlepsze jest to, że większości z nich nie trzeba jakoś specjalnie inicjować. Wystarczy zadeklarowanie zmiennej typu danej klasy. Naprawdę nie trzeba stawać na głowie, żeby np. zapisać ustawienia naszego programu. Wystarczy klasa QSettings, a ona wykona całą brudną robotę polegającą na obsłudze kontenera ustawień (czyli dodawanie, kasowanie, pilnowanie formatu, etc), czy zwracaniu odpowiednich danych na potrzeby naszej aplikacji.
Co najważniejsze, Qt pozwala na uniezależnienie aplikacji od systemu operacyjnego.
Coś, co mnie z początku zdziwiło/zaskoczyło/może i zniesmaczyło, to filozofia sygnałów i slotów. A gdybym zamiast tego powiedział event binding, to czy, drogi javascriptowcu, znajdziemy wspólny język? No pewnie, że się dogadamy.
O ile w MFC są osobne metody dla każdego zdarzenia, to w Qt działamy na zasadzie sygnałów i slotów. Nazwa koszmarna, ale w działaniu równie sympatyczne, co podpinanie akcji w JS. Sygnał, to zdarzenie, slot – handler. Czyli trzeba uwzględnić dość istotny aspekt – sposób projektowania naszego programu musimy uzależnić od tego, że kod danej funkcji/metody nie będzie wykonywany synchronicznie.
Czyli np:
nie sprawi, że do okienka debugowania tekst zostanie dodany dopiero po zakończeniu żądania sieciowego. Zostatnie dodany wg wywołania w kodzie. Ma to swoje zalety (m.in. możliwość podpięcia kilku slotów do jednego sygnału, łatwość zmiany zdarzeń), ale też i wady, jak konieczność zagnieżdżania wielu funkcji między sobą. Jeśli zgłębiłeś zagadnienie kolejek animacji w jQuery, to pewnie myślisz teraz o queue()/dequeue(). Dobrze myślisz.
Długo się zastanawiałem nad tym, jakiego środowiska użyć. Visual Studio odpada, DevCpp stare i jakieś toporne, Code::Blocks jakoś mnie nie przekonało. Początkowo, człowiek głupi (czytaj: bez wiedzy), ściąga całe SDK. Jak się okazało, pierwotna głupota jednak popłaciła. W paczce jest, bowiem, twór nazwany QtCreator. Słyszałem kiedyś o graficznym narzędziu do projektowania międzymordzia, ale całym IDE już nie. A to miła niespodzianka.
Zaraz po uruchomieniu, środowisko sprawia bardzo dobre wrażenie – jest po prostu estetyczne.
Na pewno nie jest to jakiś wyznacznik – w końcu Photoshop też na początku wydaje się toporny, ale po nauce jego obsługi – staje się bardzo wygodny.
Qt Creator jest po prostu minimalistyczny. W zupełności wystarczające do napisania jakiejś aplikacji. Sprawia wrażenie dość prostego, ale można się doszukać wszystkich niezbędnych opcji. A najbardziej zaskoczyła mnie wbudowana obsługa Doxygen, Git oraz Mercurial. No i można wszystko rozszerzać wtyczkami.
Moim zdaniem, dużo lepiej została tu rozwiązana kwestia zintegrowania dokumentacji. Jest to po prostu kolejny panel w oknie programu. Szkoda tylko, że nie bardzo się da zmienić jego lokalizację.
Oczywiście podpowiadanie i uzupełnianie kodu musi być. Inaczej by nie można było określić Qt Creatora mianem IDE.
Patrząc na listę wtyczek, nie sposób oprzeć się wrażeniu, że Qt Creator jest czymś w stylu Eclipse – tak naprawdę, to platforma dla rozszerzeń obsługujących konkretne języki/środowiska. Choć QTC brakuje jednak popularności. Szkoda, gdyż środowisko jest bardzo przyzwoite i nie zdarzyło mi się, aby „zamulało” (jak to bywało nieraz w przypadku Eclipse/NetBeans).
I na koniec, kosmetyka środowiska. Delikatne animacje interfejsu po prostu cieszą oko. Na dodatek, nie obciążają procesora.
Niech ktoś zrobi plugina do PHP…
Nosiłem się kiedyś z zamiarem napisania natywnego klienta Blipa. Postanowiłem połączyć oba zadania – zaliczenie projektu oraz napisanie aplikacji dostępowej do tego serwisu. Udało mi się namówić kolegę z roku, Vandervira i tak zaczęliśmy prace nad QBlipem. I nawet coś zaczęło z tego wychodzić. Zapraszam na stronę QBlipa na Google Code. Źródła na licencji Apache.
Więcej nie ma się chyba co rozpisywać w tym miejscu.
Pisanie w Qt ma z pewnością sporo zalet. Ale nie ma ideałów, pora na wady.
O Qt napiszę pewnie jeszcze nieraz, ale mogę z pewnością powiedzieć jedno: Delphi właśnie odeszło w odstawkę.
]]>Mając parę chwil spokoju, postanowiłem się (w końcu :P) przesiąść na platformę 64-bitową. Dość długo siedziałem na wersji 32-bitowej Windows 7, a to dlatego, żeby wypróbować trochę ten system i pomęczyć zakamarki konfiguracji. Nie jest tak świetnie, jak w Uniksach, trzeba się trochę pomęczyć. Jedną z modyfikacji, którą koniecznie chciałem przeprowadzić, było przeniesienie katalogu domowego na inną partycję. Ale Outlook popsioczył.
O ile Outlook stał się naprawdę wygodnym narzędziem (co jak co, ale GUI jest dopracowane), to pewne rzeczy są – dla mnie – co najmniej dziwne. Na pewno można tak określić choćby sposób zapisu ustawień programu, a zwłaszcza informacji o położeniu plików zawierających dane konta (czyli maile, wpisy kalendarza i ogólnie – wszystko).
Cytyjąc jeden z kabaretów:
ale nieeeeeeeeeeeee!
Informacje dotyczące haseł do serwerów, położenia plików PST są trzymane w rejestrze. Mało tego, w kluczu, którego nie sposób się domyśleć? Skończyłem? Nie. Najdziwniejszy, w tym wszystkim, był sposób zapisu danych. Nie był normalny reg_sz, nie był inny format.
A teraz uwaga: reg_binary. I to w taki sposób, jakby pliki konfiguracyjne były wpakowane bezpośrednio do rejestru. No rozumiem, że dane binarne są lepiej przetwarzane przez programy, ale nie mówią do nas po ludzku. Czyste zuo, nie wiem, co brał projektant Outlooka, który maczał w tym palce.
Ale gdybać, to sobie możemy i możemy, co z tym fantem zrobić?
Można, oczywiście, utworzyć ręcznie konta i potem zaimportować z pliku? Ale PO CO? O ile w przypadku kont POP3 sprawa jest dość prosta i sprowadza się do wskazania odpowiedniego zbioru pst w konfiguracji konta, to z IMAP nie jest już tak łatwo. A po co resynchronizować całość, skoro kopia jest już zrobiona?
Próbowałem również oszukać PIM-a poprzez dodanie kont i późniejszą podmianę plików, ale ten numer nie przeszedł.
Bez zewnętrznych narzędzi się nie obejdzie. Przekopywałem Google przez kilka godzin sprawdzając chyba wszystkie frazy, jakie przyszły mi do głowy. Niestety, nic nie znalazłem, więc piszę ten artykuł ku pamięci oraz innym śmiałkom, którzy chcieliby przenieść pliki pst w inne miejsce.
Czego potrzebujemy?
Wiemy już, czego trzeba użyć, teraz przydałoby się opisać, co trzeba zrobić. Najpierw zamykamy Outlooka, o tym nie trzeba chyba przypominać, ale warto – na wszelki wypadek.
Poprzenosiłeś już pliki pst? Nie? To na co czekasz? Aha, pliki domyślnie leżą w Dokumentach i \Users\użytkownik\AppData\Local\Microsoft\Outlook.
Otwieramy edytor rejestru i szukamy klucza:
Hmm, kto by się spodziewał, że to tutaj siedzi? Mamy w nim sporo kluczy i wartości o wyczerpujących nazwach:
Ta, wyczerpujących… To, co nas czeka, to mozolna podmiana starych ścieżek do plików na nowe. Jak je namierzyć? Trzeba przejrzeć wszystkie wartości reg_binary w kluczu ustawień Outlooka i jego podkluczach. Żeby się nie narobić jak głupi, wystarczy uwzględnić tylko te, których rozmiar przekracza 100 bajtów.
Teraz uruchamiamy Notepad2 i wprowadzamy w oknie edytora nową ścieżkę do wybranego pliku pst. Przełączamy kodowanie na Unicode Big Endian. Zapisujemy w jakimś dogodnym miejscu.
W Registry Workshopie edytujemy odpowiedni klucz. Po czym go poznać? Jeśli przewiniemy podgląd zawartości, to po prawej stronie będzie można dostrzec ścieżkę do pliku, z kropkami pomiędzy znakami (podgląd jest w ANSI, nie Unicode). Jeśli ścieżki tam nie ma (a zdarzy się kilka takich wartości), pomiń.
Jeśli jednak jest ciąg zakończony .pst, kliknij na Export i zapisz w dogodnym miejscu.
Odpal HxD i otwórz w nim oba zapisane pliki – jeden wyeksportowany przed chwilą, a drugi – ze ścieżką w formacie Unicode BE. Teraz trzeba zamienić ścieżkę w wyeksportowanym pliku. Zaznaczam, że może się ona powtórzyć kilkakrotnie, ale postępujemy analogicznie.
Zawartość „bufora” z nową ścieżką jest dokładnie potrzebną nam zawartością. Potrzebujemy jedynie pominąć trzy początkowe bajty, które są sygnaturą danych. W naszym zastosowaniu jest ona jednak zbędna. Wygląda to mniej więcej tak:
Kopiujemy zaznaczenie do schowka poprzez CTRL+C. Przełączamy się do pliku z zawartością wartości rejestru (tak, po polsku dziwnie to brzmi) i zaznaczamy dokładnie starą ścieżkę. Co do joty, ani mniej, ani więcej. Żeby było łatwo odróżnić – jest ona zwykle otoczona pustymi bajtami (w podglądzie szesnastkowym – czyli po lewej – ma kod 00. To ważne – kropka może się nam pomylić z pustym znakiem). Wszystko wygląda mniej-więcej tak:
Gdy mamy już zaznaczone to, co trzeba – CTRL+V i zapisujemy zmiany. Następnie, w Registry Workshop, w tym samym okienku edycji wartości, klikamy import i wskazujemy ścieżkę do pliku edytowanego przed chwilą.
Po mozolnym zmienianiu ścieżek, odpaliłem Outlooka… DZIAŁA. Kilka dobrych „chwil” poświęconych na przekopanie Google, rejestru i przegrzebania dziesiątek kluczy (ich ilość jest wprost proporcjonalna do liczby obsługiwanych kont).
Jeśli ktoś chciałby się pokusić o napisanie programu pozwalającego na mniej czasochłonne przenoszenie zbiorów Outlooka – ma opis algorytmu.
I na koniec: to, co opisałem – wykonujesz na własną odpowiedzialność. Nawet nie zabieraj się za modyfikację żadnego z kluczy rejestru, jeśli nie posiadasz jego kopii zapasowej i nie wiesz, jak z niej skorzystać.
]]>Chciałbym się podzielić z Wami moim listem pożegnalnym, jaki kilka chwil temu wysłałem do działu Obsługi Kretyna. Ups, miało być Klienta.
Jeśli potrzebujesz inspiracji, śmiało korzystaj.
początek pożywki dla dr Copy&Pastiego
Piszę w odpowiedzi na rozpatrzenie mojej reklamacji OKR/bleble. Dotyczyła ona blokady połączeń zastrzeżonych-przychodzących oraz aktywacji połączeń oczekujących na moim numerze.
Spodziewałem się odmownej odpowiedzi, nie zawiedliście mnie. I mojego znajomego również. I pewnie setki osób, które denerwują telefony od osób, które nie chcą bądź, boją się ujawniać swój numer. Fakt ten nie jest moim problemem, chcę wiedzieć, z kim rozmawiam – czy z jakimś dowcipnisiem wyłącznie tracącym mój czas, czy z osobą, od której oczekuję telefonu. Nie życzę sobie również rozmów z telemarketerami, którzy chcą – jak zwykle – na coś (nie)świadomego konsumenta naciągnąć.
Przyznam, że odpowiedź, iż usługa blokady połączeń przychodzących z numerów zastrzeżonych jest w trakcie wdrażania technicznego sprawiła, iż spadłem z dość wygodnego fotela i tarzałem się chwilę ze śmiechu. Z co najmniej dwóch powodów:
Dlaczego wciśnięto mi taki kit?
Czyżby abonamentowcy korzystali z innych BTS-ów, bądź serwerowni? Proszę mnie nie rozśmieszać – wszak przejście z taryfy przedpłaconej na abonamentową odbywa się w przeciągu kilku minut. Zabawne.
Skoro Polkomtel miał mnie gdzieś i nie chciał polubownie zakończyć sprawy, napisałem skargę do UKE (Urząd Komunikacji Elektronicznej, jeśli ta definicja nie jest Panu jeszcze znana), a ten przyznał mi rację. Jedyny Urząd, który zmusza zmianę orientacji operatorów z ja na klient. Proszę przeanalizować historię zgłoszeń dla mojego numeru, a na pewno Pan znajdzie tam odpowiednie adnotacje (oprócz trudny klient, bo chyba tak nazywacie osoby, które egzekwują swoje prawa). Ach, proszę tylko nie zapomnieć, że Polkomtel poczuł się w obowiązku zrekompensowania mi strat, średnio rozgarnięta osoba chyba zrozumie, co ten fakt znaczył.
Mógłbym – równie dobrze – zgłosić i tę sprawę do Urzędu, gdyż ustawa, której parametrów nie podam (bo nie pamiętam, a ten tekst nie jest wart aż takiego zachodu, aby ich poszukać), zrównała prawa abonentów obu rodzajów (usług post- i pre-paid), a Polkomtel się do tego nie dostosowuje. Jednakże zwyczajnie nie chce mi się, a znająć postępowanie Urzędu – pewnie zostałaby przyznana mi racja (a z UKE już miałem wystarczająco dużo do czynienia, aby tak sądzić). Wolę ten czas poświęcić na poznawanie nowych funkcji, takich jak połączenia oczekujące, czy dowolna modyfikacja przekierowań połączeń.
Wracając jeszcze do kwestii inwestycji. Najzabawniejsze jest to, że w tak małej mieścinie jak Szczebrzeszyn, inni operatorzy posiadają znacznie większy zasięg (w chwili pisania tego tekstu Orange stawia drugi BTS – nie wiem po co, bo zasięg jest idealny) oraz udostępniają usługi 3G (Orange od kilku lat, Play od jakiegoś czasu, w tym HSDPA).
Uznałem więc, iż odpowiedź na moją reklamację była wypowiedzeniem słów odp*&$# się w sposób oficjalny. Przyjąłem te słowa z wielką przyjemnością. Zakupiłem starter Play w celu przetestowania usług i byłem zaskoczony jakością oraz stawkami. Moje zdziwienie było tym większe, że na wyświetlaczu telefonu pojawiło się H oznaczające dostępność usług szybkiego dostępu do Internetu.
W związku z Pańską prośbą od…lenia się, uznałem że nie ma problemu, wypełniłem odpowiedni wniosek o przeniesienie numeru do P4 sp. z o.o. Od teraz mogę wreszcie swobodnie korzystać z telefonu, a nie pilnować cały czas pakietów, zwłaszcza na rozmowy (wcześniej korzystałem z taryfy 36i6), płatnych dodatkowo za określone numery, w ograniczonej ilości.
Uprzedzę odpowiedź (o ile jakakolwiek nadejdzie) Plus oferuje również atrakcyjne oferty abonamentowe
. A guzik prawda. Lubię swój kilkuletni telefon i nie mam konieczności się z nim rozstawać; korzystam z niego zarówno do SMS, rozmów jak i transmisji danych. Nawet gdybym chciał skorzystać z oferty abonamentowej Polkomtela bez aparatu w „promocji”, to – w celu pełnego wykorzystania potrzebnych mi usług – musiałbym płacić kilkukrotnie wyższe rachunki niż było to do tej pory.
A tak, z pre-paidowej taryfy P4 jestem co najmniej zadowolony, przewiduję iż się to nie zmieni.
No, jedną zrzędę mniej – cóż – skoro tak chcecie zatrzymać klientów u siebie, pozwolę sobie na przedstawienie jednego z faktu. Będąc w salonie Play (nota bene, czekając w kolejce), oprócz mnie, numer z Plusa przenosiło kilka innych osób. Wcale się temu nie dziwię, zarówno z powodu własnych doświadczeń jak i pewnych statystyk:
http://media2.pl/telekomunikacja/67443/komentarze/4.html
Proszę sobie również poczytać komentarze pod newsem. 7%, to jest nic? Ciekawe.
PS. Znajomi też zaczęli się zastanawiać nad migracją, gdy opowiedziałem im o moich doświadczeniach.
Były abonent Plusa
]]>Jednakże w naszym kraju pewne nawyki pozostały jeszcze z poprzedniej epoki, więc nie jest tak różowo. Ale zaraz, przecież jeszcze był Play?
Znacie pewnie moje batalie z operatorami. Stali czytelnicy na pewno. Goście mogą sobie o nich poczytać. W tej całej tragikomedii najzabawniejsze jest to, że w każdym przypadku UKE przyznawał mi rację, więc…?
Dopominać się każdorazowo o swoje? No bez przesady.
Ostatnio na tapecie był Plus. Całkiem niedawno Ustawa Prawo Telekomunikacyjne zrównała uprawnienia abonentów usług przedpłaconych z taryfami abonamentowymi. Zażyczyłem sobie wprowadzenia blokady połączeń przychodzących z numerów zastrzeżonych. Konsultant na BOK stwierdził, że usługa jest dostępna wyłącznie dla „popłaconych”.
Znając życie – na BOK jak zwykle nic nie wiedzą, więc napisałem reklamację.
Jako że wziąłem parę dni wcześniej, na próbę, starter z Playa, nie omieszkałem napisać również o połączeniach oczekujących.
A odpowiedź na reklamację – oczywiście – w stylu Wielkiej Trójcy.
Dowiedziałem się, że nie ma możliwości technicznych dla klientów pre-paid oraz iż Polkomtel nad tym pracuje. Jasne. A co do połączeń oczekujących – cóż, stwierdzili mniej więcej tak: ustawa nie nakłada na nas obowiązku bleble.
Odebrałem te słowa jako zwykłe (uwaga, kolokwializm) odp…l się, mamy cię gdzieś. Nie ma problemu, jak prosili tak uczyniłem.
Pardon, ale gdy pierwszy raz przeczytałem, że pracują nad możliwością aktywacji blokady połączeń zastrzeżonych, podczas gdy abonamentowcy włączają to samodzielnie, w eBOK, to mój wzrok zamienił się w trzy wielkie litery, które umieściłem w nagłówku.
No bez przesady – jak karciarz chce się przerzucić na abonament, to jest obsługiwany w ciągu paru minut, w salonie, a gdy wymaga czegoś, co mu się należy, to są czynione problemy. Jakoś nie bardzo chce mi się wierzyć, że Polkomtel posiada osobne bazy danych dla jednych i drugich klientów. Jeśli jednak tak jest i ktoś zna sytuację – proszę mnie poprawić.
Kilka dni później stałem już w kolejce, w salonie Play.
Oczywiście, nie tylko z powodu niechęci aktywacji przydatnej usługi – na decyzję złożyło się kilka czynników, przede wszystkim – koszty połączeń do numerów poza promocjami w 36i6. Dlatego postanowiłem darować sobie wezwanie posiłków z UKE.
Kiedyś też rozważałem przejście do Play, ale – szkoda mi było fajnego numeru, poza tym – oferta nie była jakoś mocno atrakcyjna, by uciekać z mojego ówczesnego operatora. No i najważniejszy problem – zasięg i BTS-y. Wcześniej znaczną siłą Playa był roaming krajowy na nadajnikach Polkomtela. Żeby się teraz nie przejechać, testowałem sieć przy użyciu najtańszego starter i nie mogłem uwierzyć własnym oczom: w nie za dużej mieścinie, jaką jest Szczebrzeszyn, mój PDA pokazał wyraźne H na wyświetlaczu, co oznaczało dostępność HSDPA. Sprawdziłem kilkukrotnie – wzrok mnie nie zmylił.
A że szkoda mi trochę baterii, wyłączyłem 3G, zasięg GSM pełny. Co ciekawe, BTS Ery jest w dokładnie tym samym miejscu, jednak zasięg już nie jest tak silny. Kompletny zonk, gdyż – prócz Playa – tylko Orange ma zasięg 3G w Szczebrzeszynie. Era i Polkomtel w plecy.
Generalnie na trasie Szczebrzeszyn-Zamość nie ma problemów z zasięgiem w ramach macierzystych BTS-ów P4. Będąc kilkukrotnie w dalszych trasach jedynie w kilku miejscach zaszła konieczność przełączenia się na Plusa.
P4 jednak ostro stawia BTS-y. Nie przypuszczałem, że w aż takim stopniu.
Tak, nie przejęzyczyłem się – stałem w kolejce. Niespecjalnie mi to przeszkadzało, ale grafik tamtego dnia był ciut napięty, więc postanowiłem przyjść wieczorem. Tak na marginesie, czekałem, bo… też ktoś przenosił numer?
Przychodzę drugi raz – też parę osób siedzi – również przenoszą numery. Przychodzi moja kolej, konsultant miał problem, bo… nie mógł znaleźć kart SIM przeznaczonych dla osób zmieniających operatora, bo najprawdopodobniej skończył mu się zapas. To jest do wybaczenia, nie dziwię się.
Pewnie każdy, kto się zastanawia nad przeniesieniem numeru do jakiegokolwiek operatora, wie jakich dokumentów potrzebuje, ale na wszelki wypadek wspomnę: zarejestrowany numer u poprzedniego operatora oraz dowód osobisty. Oczywiście dane w obu miejscach muszą być identyczne.
Do podpisania jest upoważnienie oraz oświadczenie, iż abonent jest świadomy konsekwencji rozwiązania umowy u poprzedniego operatora. Karciarzy to nie obchodzi, więc formalność.
Nie wiem, jak jest w przypadku innych operatorów, ale konsultant zapytał wprost, przy rejestracji konta abonenckiego, czy wyrażam zgodę na otrzymywanie materiałów marketingowych. Kolejne zaskoczenie… Więc – jeśli ta opcja ma faktycznie odzwierciedlenie w rzeczywistości – nie przeczytacie o moich ew. bataliach nt. blokowania spam SMS w Play.
O ile Ustawa wspomina o tym, iż cała operacja przenoszenia numeru powinna zająć w granicach 24h, to w praktyce jest inaczej – Plus oddał numer dobę później. Wcale się nie dziwię, że gra na zwłokę, ale o tym nieco dalej.
Po rozmowach ze znajomymi, okazało się, że wielu z nich zastanawia się nad przejściem do Play. Powód? Koszty połączeń. I przyznam, że cała tendencja zmiany na P4 działa coś na wzór efektu kuli śniegu, ale jest to usprawiedliwione – operator będący dość niedługo na rynku, startował przy wysypie kilku MVNO, które raczej nie odniosły sukcesu.
Pierwszy tydzień w Play z właściwym numerem – na razie jest ok. Ale – cytując klasyka – nie chwal systemu przed pierwszym padem
, więc nie gwarantuję przyszłości. Jednak koszty utrzymania konta spadły. I to jest widoczne. Oczywiście, konkretów nie podam, bo te dane byłyby z pewnością przydatne dla marketingowców.
Najzabawniejsze w tym wszystkim jest to, że Play zyskuje przeważnie kosztem Plusa (a ten dostarcza roaming krajowy dla Playa). Na Media2 jest wykres, który jest wart więcej niż dziesiątki słów na ten temat.
a czemu nie abonament? – bo mi się nie opłaca? Wszyscy marketerzy operatorów, którzy dzwonili do mnie w celu przekabacenia na abonament, grzecznie dziękowali za rozmowę po przedstawieniu moich potrzeb.
Ale teraz inni mają do ciebie drożej!
Szczerze? To nie jest mój problem – każdy może wybierać takiego operatora, jaki mu odpowiada. Na tym polega demokracja.
Tekst nie był sponsorowany przez żadnego z wymienionych w nim operatorów. Jest to wytwór własny, nie przymuszony, nie powstały pod niczyją presją. Dziękuję za uwagę.
]]>Zapraszam do przejrzenia moich typów. Niekoniecznie powiązanych z przewodnią tematyką mojego dziennika.
Czyli genialne wynalazki, które swoją prostotą i pomysłowością wręcz powalają.
Autor zbiera najdziwniejsze zdjęcia publikowane przez użytkowników portali społecznościowych.
Serwis niewątpliwie został stworzony przez samego MacGyvera. Obowiązkowa pozycja dla każdego Polaka.
Tzw. #korpo okiem grafika. Genialne pomysły.
Niezbędne dla każdego programisty PHP. Agregator treści z kilku blogów poświęconych zaawansowanym zagadnieniom tego języka.
To by było na tyle.
]]>Jeśli nie da się czegoś rozwiązać wprost, zawsze można spróbować to… obejść. Wbrew pozorom, w programowaniu zdarza się to nierzadko.
A o czym chcę napisać? O wyrzucaniu błędów przez PHP zamiast wyjątków.
Na Blipie, na tagu #php zawrzała dyskusja: Python vs. PHP. Przytaczanie całej dyskusji byłoby raczej bezsensowne i bym się zajeździł z kopiowaniem wypowiedzi wszystkich użytkowników. W pewnym momencie na tapecie znalazł się temat totalnego non-sensu PHP w postaci wyrzucania błędów zamiast wyjątków. I tu się w zupełności zgodzę – przecież funkcje np. otwierania pliku muszą najpierw sprawdzić, czy ten plik istnieje, a i tak wyrzuci błąd.
Aby uniknąć błędów, które nieraz ciężko wyłapać (bo przecież nie wpływają na dalsze działanie kodu), trzeba albo „wyciszyć” wypluwanie warningów korzystając z małpiszona przed funkcją, albo sprawdzić poprzez file_exists istnienie obiektu źródłowego oraz jego uprawnienia przez is_readable. Po kiego, skoro jest to ponowne wykonanie czegoś, co zostało już sprawdzone.
Ok, skoro są błędy, to PHP pozwala też coś z nimi zrobić – albo schować, albo zignorować, albo wyłapać. Zajmiemy się tym ostatnim przypadkiem. set_error_handler chyba większość Czytelników już zna (albo właśnie poznaje). Pozwala na przechwycenie wypluwanego przez wszystkie funkcje błędu i ew. zalogowanie, etc. Oczywiście, z np. PARSE_ERROR już nie jest tak różowo (bo błędu parsowania kodu się nie da przechwycić – co by było w sytuacji, gdyby ów znajdował się w algorytmie przechwytywania? ;)).
„Najprostsze rozwiązania są zwykle najlepsze”. Przeanalizujmy poniższy kawałek kodu.
Otrzymamy warning: … failed to open stream. No ok, ale to przy aktywnym wyświetlaniu błędów. Zwykle podobny kod jest wykorzystywany z innymi przydatnymi funkcjami (celowo tutaj nie uwzględniam file_get_contents, etc):
Otrzymamy już więcej niż jeden błąd. Na serwerze produkcyjnym nie wyświetli się żaden (przynajmniej nie powinien), jeśli administrator nie pilnuje serwisu, nikt może nawet nie zauważyć, że coś jest nie tak.
Ale nasz admin, czy programista jest jednak trochę bardziej łebski i zastosował dodatkowo poniższy kawałek kodu:
Fajnie, cacy, logujemy sobie to do pliku, czasem admin zajrzy i znajdzie błędy. Ok, tylko że idealny kod wyglądałby tak:
Aż się prosi o wyjątki. Zamiast tego mamy w chorobę sprawdzania i tak naprawdę – jest to spora część tego, co chcemy zrobić. Oczywiście, jeśli są to błędy, to można pójść na lenia i zrezygnować ze sprawdzania oraz to wyciszyć.
Idealnie by było jednak to wpakować w blok try..catch i obsłużyć wyjątkiem, ale standardowe funkcje PHP ich nie wyrzucają. Dopiero biblioteki, które powstały w późnych latach programowania PHP5 zaczęły ich używać. W innych językach, to standard, coś w stylu IOException, czy pochodne. Dlaczego PHP tego nie ma?!
Miałem okazję rozmawiać z gościem na roku, który już nieco programował, ale wątpił w filozofię wyjątków. No ok, jego sprawa, ale rozważmy prostą sytuację:
No i nasza zmienna $f zawiera albo zasób, albo false. A skąd mamy wiedzieć, czy to był błąd timeoutu, czy brak uprawnień, czy po prostu nie istniejącego pliku? Użyjmy bardzo prostego przykładu (fakt, trochę naginany, ale zobrazuje moją myśl bez zbędnego owijania):
Aby zrealizować ten hipotetyczny kawałek kodu, należałoby użyć mniej więcej:
Noż w mordę!
Wymyślanie koła na nowo. A jeśli jest, do tego, takich miejsc w kodzie kilkanaście albo i więcej? Koszmar. Niektórzy pewnie napisali już swojego obiektowego wrappera, który załatwia takie rzeczy. Jednak nadal kuszą te wyjątki. Ciekawe, ile ticketów w tej sprawie wisi na bugtracku developerów PHP…
Wpadł mi jednak do głowy pewien pomysł.
Najlepiej niech kod przemówi:
Myślę sobie, za cholerę nie będzie działać. Jednak przyzwyczajony do niektórych dziwactw tego języka postanowiłem odpalić podobny do powyższego kawałek kodu:
Jakież było moje zdziwienie, gdy przeglądarka wyświetliła:
Wyświetliło się tylko raz i zrzutowany na stringa wyjątek. Przecież to ustrojstwo… Działa?! A stąd już krótka droga do rozróżnienia, który błąd wystąpił.
Tak, do tej pory jakoś do mnie nie trafia, że:
Owszem, na pewno jest to rozwiązanie wolniejsze niż prawdopodobna implementacja w kodzie interpretera. Jednak zyskujemy coś, co pozwala nam na lepszą i wygodniejszą kontrolę kodu. Już sam fakt, że został wypluty wyjątek – tak naprawdę – ma dość duże znaczenie.
Pozostaje jeszcze dostosowanie funkcji wyłapującej błędy tak, aby wypluwać poszczególne rodzaje wyjątków.
Nie jest to może idealne sprawdzanie w wyjątku, ale… działa.
Przyznam szczerze, że do tej pory nie bardzo mieści się to wszystko w moim małym rozumku, że dość prowizoryczne rozwiązanie po prostu działa. Pewnie znalazłyby się lepsze metody wykrywania rodzaju błędu w wyjątku, ale chciałem zaprezentować tylko ogólną ideę.
Zapraszam do dyskusji.
]]>