Development z Zapomnianej Strony

..:: Paweł Hofman .NET Portal ::..

Podczas pracy nad konfiguracją dual-boota na MacBooku Pro, boot-manager zupełnie zgłupiał i obok opcji “Windows” zaczął jakąś wymyślną nazwą opisywać uruchamianie OS X Maverics.

Na szczęście istnieje to oto wymyślne polecenie, które potrafi pobłogosławić boot-managera i kazać mu z powrotem użyć nazwy dysku twardego, na którym zainstalowany jest MacOS:

sudo bless --folder /System/Library/CoreServices –bootefiOczywiście uruchamiany to polecenie w terminalu Maverics’a.



W końcu, po tylu latach czekania udało się! Gratulacje dla firmy Xamarin, wreszcie mamy Mono w wersji hardfloat na swoje Raspberry Pi.

Jak skompilować i zainstalować tę wersję można poczytać tutaj lub tutaj. Trochę czasu to trwa,  trzeba być naprawdę cierpliwym (niemal cały dzień, jeśli robimy to na urządzeniu).

Niestety sama kompilacja wymaga też zainstalowania poprzedniej wersji Mono, która hardfloat nie była. Kończymy więc z dwoma wersjami działającymi jednocześnie (stara v2.8 w /usr/bin/mono i nowa v3.2 w /usr/local/bin/mono), przy czym domyślą dla uruchamianych plików .NET .exe jest stara wersja.

Jeśli zatem mamy program, który wyświetla tylko aktualną datę, to po uruchomieniu:

./current_date.exeotrzymamy:

Current date: 0/735244/0001 1:26:16 AM

Z kolei uruchamiając:

mono current_date.exeotrzymamy spodziewaną aktualną datę:

Current date: 1/11/2014 1:27:20 AM

Ustawmy zatem nowszą wersję Mono jako domyślną:

sudo update-alternatives --install /usr/bin/cli cli /usr/local/bin/mono 50    
sudo update-alternatives --set cli /usr/local/bin/mono

Od tej pory oba sposoby uruchamiania dadzą ten sam, spodziewany wynik.



Nowy komputer to nowe problemy do rozwiązania. Dziwne, że to urządzenie miało w zamyśle twórcy służyć ich rozwiązywaniu ;) Najpierw zasilacz okazał się niestabilny i za każdym razem, gdy w systemie wzrastało zapotrzebowanie na moc, restart!

Później, po kilku dniach zabawy z Windows 8, niespodziewanie oczom moim ukazały się dość częste BSOD (dla niewtajemniczonych, Blue Screen of Death, niebieski ekran śmierci w Windows). Otóż płyta Asus P8Z77-V Pro posiada kontroler sieci LAN Intel 82579V. A kontroler ten posiada pewną nietypową właściwość. Po uśpieniu komputera zaczyna nagle przedstawiać się jako zupełnie inny sprzęt – 82579LM.

Aby ten problem rozwiązać, należy aktualizować EPROM tejże karty sieciowej. Odpowiednie narzędzie można pobrać ze strony Intela tutaj.

I życie staje się piękniejsze!



You want it, you got it!

Zabawa przy Windows Phone 8 zmusiła mnie do zmiany systemu na Windows 8. Wszystko zainstalowało się bez problemów. Co ciekawe udało mi się przy tej okazji obalić kolejny mit. Otóż wersja Windows 8 UPGRADE nie musi być wcale instalowana na istniejącą wersję Windows 7. Ta ostatnia musiała być po prostu kiedyś wcześniej przypisana do naszej maszyny. Po przypadkowym sformatowaniu partycji systemowej z poziomu instalatora i tak wszystko udało się pięknie aktywować.

No ale dosyć tego pięknego ;) Co zepsuło się tym razem? To proste – po zalogowaniu się z użyciem swojego identyfikatora Windows Live (przemianowanego na konto Microsoft, czy jakoś tak), lokalna nazwa katalogu domowego użytkownika wyglądała jakoś dziwnie. Zamiast spodziewanego:

C:\Users\Pawelzobaczyłem:

C:\Users\pawel_000Skąd się wzięły te zera na końcu i po co one komu. Nie mam pojęcia. Ale jak się ich pozbyć?

Na to odpowiedź znalazłem w tym wątku na StackOverflow.com.

Ponieważ już jesteśmy zalogowani na tym koncie, procedura wygląda następująco (w razie problemów zawsze można utworzyć innego użytkownika lokalnego z uprawnieniami administratora, przelogować się, wykonać to wszystko z jego poziomu i usunąć go na końcu):

  • Uruchamiamy “Zarządzanie komputerem” (“Mój komputer”, menu kontekstowe i “Zarządzaj”)
  • Przechodzimy do opcji “Użytkownicy i grupy lokalne”, a następnie “Użytkownicy”
  • Zmieniamy nazwę użytkownika z “pawel_000” na “Pawel”
  • Zmieniamy nazwę katalogu lokalnego z C:\Users\pawel_000 na C:\Users\Pawel
  • Przy użyciu regedit, zmieniamy lokalizację awatara dla naszego profilu tutaj (ProfileImagePath):
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\

 

HINT:

Jednak moja późniejsza praca na tym koncie uświadomiła mi, że nie wszystko jest jeszcze gotowe. Duża ilość programów podpowiadała źle folder, do którego chciała się zainstalować (zawierał on dalej pawel_000), nie potrafiła poprawnie zlokalizować niektórych ustawień lub ich zapisać. Okazało się, że w rejestrze istnieje jeszcze kilka wpisów, które trzeba poprawić. Są to lokalizacje wszystkich folderów specjalnych użytkownika. Należy je poprawić używając regedit w tej lokalizacji:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell FoldersGotowe!



Jak zrobić zrzut aktualnego ekranu na PlayBooku? Można oczywiście aparatem ;), ale jak uzyskać coś w oryginalnej rozdzielczości?

Wciśnij przyciski Volume+ i Volume- jednocześnie. A plik zostanie zapisany pośród innych utworzonych zdjęć na rolce aparatu. Niestety nie zostanie odegrany żaden dźwięk ani animacja w tym momencie, sygnalizująca wykonanie tej operacji.

Następnie używając QNX Momentics IDE i widoku Target File System Navigator, otwieramy folder, w którym obrazki te się znajdują:

    wifi:/accounts/1000/shared/camera/

i możemy je przegrać na swoją maszynę.



Jako szczęśliwy posiadacz Kindle Touch, pragnę wycisnąć maksimum z tego urządzenia. Wszystkich, którzy również borykają się z podobnymi problemami jak:

  • instalacja alternatywnych słowników (np. do języka niemieckiego)
  • poszukują źródeł darmowych książek w języku ojczystym
  • i chcą szybko opanować, co i jak

odsyłam do świata czytników. Warta uwagi strona.



Co nim może być? Otóż – polskie znaki! Pokarało mnie potwornie, bo wszędzie próbuję stworzyć użytkownika o imieniu ‘Paweł’ (aż żal, że tak nazwałem systemowego).

Och, jak ciężko w dobie powszechnej cyfryzacji, o wsparcie chociażby dla kilku głupawych znaków tu i tam. Poległ mi na tym system online FedEx, gdzie lepiej z definicji nie używać żadnych nie ASCII-7 znaków, następnie konsola do GITa, nie umie poprawnie wyświetlić mojego imienia, ani znaleźć katalogu domowego,  a teraz rady sobie nie dają narzędzia do Android na Windows 7.

I tylko jedno lekarstwo przychodzi do głowy – symlink tych wszystkich głupawych odmian, do mojego folderu. W Windows 7 junction robi się tak:

C:\Users>mklink /D "PaweĹ‚" "Paweł"

Znowu możemy poczuć się prawie jak w domu!



Nie wiem czemu, ale wydawało mi się, że czasy, gdy firmy telekomunikacyjne traktują klienta jak szmatę odeszły w niepamięć. Oj, jak bardzo się pomyliłem i jak dobitnie wykazała się firma Netia S.A., aby mi to uświadomić.

Cała historia zaczęła się w połowie sierpnia, gdy zmieniłem biuro i zamówiłem na infolinii pakiet “Internet + telefon” w swojej nowej siedzibie. Wszystko pięknie, szybko, kurier przywiózł umowę do podpisania, za 2 tygodnie przyszedł monter i “coś” zrobił, a tydzień później przyjechał ruter i nagle zdziwko.

“Brak sygnału DSL”. Hmmm…

Miało działać, a coś jest nie tak i nie działa, ale to wiem i rozumiem tylko ja. Szybki telefon na infolinię – “wszystko aktywowane i w systemie widać, że śmiga”. To zróbmy kilka prostych testów. Dzwonię z telefonu stacjonarnego do siebie. Brawo, udało się, ale numer jakiś nie ten, co w umowie. Hmmm…. dziwne. To zadzwońmy na ten mój z umowy. O! ktoś odebrał i okazało się, że mieszka 3 ulice dalej, i twierdzi, że nagle telefon, z którego zrezygnował kilka miesięcy wcześniej “reaktywował się”!

Dzwonię ponownie na infolinię, i informuję ich, że aktywowali MÓJ Internet i MÓJ telefon u kogoś “przypadkowego”. “Już rejestruję zgłoszenie awarii. Sprawa zostanie natychmiast załatwiona”. Gdy w ciągu kolejnych 3-ch tygodni dzwoniłem tam jeszcze 4 razy i słyszałem dokładnie to samo, czasem przeplatane tekstem, że “zaraz się z Panem skontaktuje ekipa naprawcza”, to zacząłem nabierać podejrzeń, że ktoś mnie zbywa tanimi tekstami.

Czekam, nic innego nie pozostało. Czekałem 46 dni. W tym czasie, nikt z Netii S.A. się ze mną nie skontaktował, nikt nie napisał maila, a sprawa nadal została nierozwiązana. W ciągu tych dni Netia nie zrobiła dosłownie nic. Cóż… może dlatego, że była zajęta przejmowaniem kolejnej firmy, ale tego nie jestem pewien. Może wszyscy byli na urlopie. Może takie zachowanie to ich najnowsza dewiza. W ten też sposób z klienta, który sam przyszedł do nich, stałem się najbardziej rozgoryczonym złośliwcem.

Po wspomnianych 46-u dniach, zgłosiłem reklamację, że nie chcę płacić rachunków za kogoś, jeśli przypadkiem miałbym dostać jakąś fakturę, i w tym samym piśmie wypowiedziałem umowę. No proszę was, ile może czekać klient biznesowy!

Teraz uwaga, bo to co się stało później, przerosło moje najśmielsze oczekiwania. Firma Netia S.A. ze swoim flagowym oddziałem obsługi klienta, postanowiła kontynuować swoją w pełni nie-profesjonalną postawę, odpowiadając na moją reklamację – NEGATYWNIE! Ale uwaga, zrozumieli, że Internetu i telefonu nie mam, zatem anulują rozmowy prowadzone przez osoby trzecie. Jednakże wg nich umowę wypowiedziałem za wcześnie i obciążą mnie kosztami aktywacji. Pytanie tylko jakiej – bo ja w umowie mam konkretną lokalizację, a tam jak nic nie było, tak dalej nic nie ma! A za wcześnie, bo niby powinienem odczekać 70dni! Na dobicie, konsultant rozpatrujący reklamację stwierdził, że nie mam prawa odwołania ani odpowiedzi i jego decyzja jest ostateczna.

Jak we dwa dni później pozbierałem szczękę z ziemi, to tylko zostało mi stwierdzić kilka faktów i odesłać je ponownie na piśmie na skrytkę pocztową Netii w Katowicach. (Tak są pewne biura lokalne, które sprzedają te usługi, ale to już jest Internetia i nie bardzo chcą obsługiwać klientów, którzy podpisali umowy przez infolinie. Także przestroga – wszystkie reklamacje wysyłajcie zawsze na piśmie!).

A to, co stwierdziłem to:

  • w umowie mam konkretny lokal, gdzie aktywacja powinna mieć miejsce
  • umowa definiuje 40 dni od daty podpisania, jako ostateczny termin wykonania przez Netię S.A. aktywacji
  • brak możliwości odpowiedzi na odpowiedź łamie postanowienia regulaminu, na który wielokrotnie powoływał się konsultant
  • to umowa jest obowiązująca, a regulamin; regulamin reguluje to, co nie jest powiedziane w umowie
  • to po prostu najzwyklejsza próba wyłudzenia pieniędzy za niewykonaną usługę
  • podoba mi się to myślenie, że “jesteśmy dużą firmą – PŁAĆ, bo w sądzie z nami nie wygrasz”

Na koniec – cóż, minęło 65dni. Internetu dalej nie mam, do wyboru mam jeszcze TP S.A., bo nikt inny nie obsługuje centrum miasta. Dobrze, że to Wrocław, duże miasto, dobrze, że 21. wiek i premier Pawlak mówi o informatyzacji kraju. Ha! Oby tak dalej!



Dziś ukazała się długo oczekiwana nowa wersja moich bibliotek CodeTitans Libs v1.5. Zawiera ona szereg poprawek oraz nowych funkcjonalności.

Niewtajemniczonym, podpowiem, że służą one do: obsługi odczytu i zapisu w formacie JSON, wymiany danych z użyciem protokołu Bayeux oraz zawierają inne funkcjonalności potrzebne przy przenoszeniu programów z iPhone’a do Windows Phone 7.

Zapraszam do pobierania tutaj.



Kolejną ciekawostką, którą chciałbym omówić są zdalne repozytoria i dostęp do nich. O ile są to repozytoria tego samego typu (czyli np. Subversion połączone z Subversion – jako externals, czy Git pracujący z Gitem – jako submodules), to nie ma to większego znaczenia i obsługa jest bezproblemowa.

Ciekawsze są oczywiście krzyżówki. Jeśli przyjrzymy się bliżej pracy w Git, który musi korzystać z zewnętrznego repozytorium Subversion, to już wcale nie musi wyglądać prosto. Weźmy choćby mój projekt CodeTitans Libraries (wspomagający użycie protokołu Bayeux, standardu wymiany danych tekstowych JSON, InversionOfControl oraz udostępniający niektórych funkcjonalności znanych programistom iOS SDK w .NET-cie). Codeplex.com udostępnia go jako Subversion.

Przyjmijmy, że repozytorium Git, ma bardzo prostą strukturę złożoną z branchy master oraz develop. Pierwszy służy to przechowywania referencji stabilnych wersji kodu oraz ich etykietowania. Drugiego używamy do rozwijania i pracy nad aktualnym kodem.

Cel: gdzieś w katalogu Externals/CodeTitans chcielibyśmy mieć kod z też projektu.

W tym celu przede wszystkich będziemy potrzebowali dodatkowego brancha. Nazwijmy go codetitans_develop. Wybiegając do przodu - Git tak naprawdę skopiuje pełny kod źródłowy zewnętrznego projektu i sam będzie go wersjonował. Niestety minus jest taki, iż będzie on ten kod próbował umieścić w głównym folderze swojego własnego repozytorium, generując niezły chaos, przy złączeniu obu projektów (tego pierwotnie trzymanego w Gicie oraz nowego). Praca na dodatkowym branchu pozwoli nam zatem na wprowadzanie lokalnych zmian, np.:

  • przeniesienia plików do wspomnianego folderu Externals/CodeTitans
  • dokonywania innych drobnych modyfikacji (np. gdy chcemy bezpośrednio dodać pliki do solution, bez referencjonowania projektów biblioteki CodeTitans Libraries, to może widoczność zmienić z ‘public’ na ‘internal’)

A zatem, po kolei:

  1. Dodanie nowego brancha:

    git checkout –b codetitans_develop
  2. Dodanie referencji do zewnętrznego repozytorium SVN:

    git svn init https://codetitans.svn.codeplex.com/svn -R codetitans --prefix Externals/CodeTitans/ --ignore-paths="^[^/]+/(?:branches|tags|bin)"

    - lokalizacja – codeplex.com
    - nazwa lokalna – codetitans
    - ponieważ repozytorium to ma standardową strukturę, a nas interesuje jedynie ‘trunk’ – ignorujemy pozostałe foldery
  3. Pobieramy historię zmian z repozytorium SVN:

    git svn fetch codetitans

    (za pierwszym razem pobrane zostanie pełna historia, co może trochę trwać; dla oszczędzenia czasu plecam dodanie opcji “-r <rev>” z numerem ostatniej rewizji, która jest dla nas istotna; później już oczywiście tylko ostatnie zmiany będą synchronizowane)
  4. Poprzednie polecenie, de facto, pobiera pliki, ale nie są one jeszcze nigdzie widoczne. Aby stały się widoczne, musimy połączyć je (operacją merge) z aktualnym branchem (tym utworzonym i ustawionym jako aktualny w kroku 1.).
    Pytanie pozostaje, co mamy teraz łączyć.

    Lista wszystkich branchy (git branch –a) ujawnia, że zostało dodane wskazanie zewnętrzne na kod SVN. Wygląda ono mniej więcej tak:

    remotes/Externals/CodeTitans/git-svn

    I łączymy kod:

    git merge –squash remotes/Externals/CodeTitans/git-svn

    Uwaga! W przyszłości to właśnie tutaj, podczas operacji merge będzie występowało najwięcej konfliktów. Tutaj też ładnie je rozwiążemy, a osobny branch gwarantuje nam, że nie mieszamy kodu (i zmian w nim) projektu zewnętrznego z naszym produkcyjnym.
  5. Wprowadzamy wszystkie niezbędne poprawki (przenosimy, zmieniamy treść plików…). Oczywiście operacje te kończymy pojedynczym:

    git commit –a –m “<komunikat>
  6. Wracamy z powrotem na nasz główny branch:

    git checkout develop
  7. I dodajemy do niego wypielęgnowany kod zewnętrznego projektu, który idealnie pasuje do naszej struktury:

    git merge --no-ff codetitans_develop

    - --no-ff – bardzo ważna opcja dla późniejszej graficznej wizualizacji repozytorium i zmian na nim; otóż wszystkie zmiany z brancha codetitans_develop nie zostaną wessane do brancha aktywnego w tym momencie brancha develop

    Tutaj już nie powinny wystąpić żadne konflikty, bo kod jest jednak rozdzielny, a wszystkie zmiany odnośnie zewnętrznej biblioteki prowadzone były na branchu “codetitans_develop”.
  8. Aktualizacja:

    Kiedy nasz projekt Subversion ulegnie zmianie, musimy je mozolnie dodać na repozytorium Git. Niestety, aby wszystko pięknie działało, należy wykonać wszystkie kroki od 3-ego włącznie.

Salute!



Autor

Paweł Hofman [CodeTitans]

ASP.NET
C/C++, C#, Objective-C
SQL

License and Disclaimer

Moje Gry i Aplikacje

Zobacz mnie na GoldenLine

Zobacz mnie na LinkedIn
Supported by Polish SQL Server User Group (PLSSUG)

Supported by WrocNet.org

Zine.net.pl

Wpisy

Projekty

Moje projekty open-source:

Sign in