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.



Dla niektórych może jest to i zbytnia perwersja, ale lubię, gdy używając jakiegoś narzędzia, stosuję się do sugerowanych przez nie konwencji. Dzięki temu wszystko to, co robię nie odstaje od siebie. I tak patrząc na repozytorium w SVN, każdy commit przypisany był do użytkownika systemowego i oznaczany po prostu jego loginem (a często i jakimiś magicznymi przy- i przedrostkami – wystarczy spojrzeć na przykład z codeplex.com: “SND\FeydRauth_cp”). GiT z kolei próbuje opatrzeć wszystko właścicielem w formacie “<login> <email>”.

Jak zatem przenosząc repozytorium utrzymać jednolite nazwy autorów tak, aby nie dało się odróżnić, która część pochodzi z czasów, gdy używany był jeden system kontroli wersji, a które już po przeprowadzce?

Odpowiedź jest bardzo prosta – użyć opcji “-A <nazwa_pliku_txt>” podczas klonowania repozytorium SVN, która zapewni translację autorów. W pliku tym zapisujemy reguły, każda w osobnej linii, w postaci:

<nazwa_autora_svn> = <nazwa_autora_git>Czyli np.:

pawel = pawel <pawel@email.com>
pawelh = pawel <pawel@email.com>

Dodatkowo, jeśli nie zależy nam na jakiejkolwiek późniejszej synchronizacji możemy dodać również opcję “--no-metadata”, która zapobiegnie doklejaniu dodatkowych danych w komentarzach, które opisywałyby źródłowe commity SVN, już docelowo w GiT-ie.

Całe polecenie wygląda wtedy tak:

git svn clone svn+ssh://<svn_url> <local_name> -A authors.txt --no-metadata

Oczywiście zakładamy tutaj, że:

- svn+ssh:// – to wykorzystywany schemat do repozytorium SVN (równie dobrze może to być samo svn:// lub http://)

- svn_url – to pełny adres gałęzi, którą będziemy klonować

- local_name – to nazwa lokalnego folderu, w którym zostanie utworzone repozytorium GiT

- authors.txt – to nazwa pliku z regułami translacji autorów opisanymi powyżej.

 

Teraz pozostaje tylko upewnić się, że ustawiliśmy w konfiguracji GiTa ten sam login i email dla nowego autora i ładnie wypchnąć nowe repozytorium.



Poniższa prosta procedura gwarantuje odzyskanie dużej ilość miejsca zajętego przez dynamiczne dyski VHD maszyny wirtualnej utworzonej w Hyper-V w Windows 8 Pro:

1. Włącz system, który będzie optymalizowany.
2. Opróżnij kosz, usuń pliki z katalogów ‘temp’, usuń zbędne punkty przywracania systemu, wyłącz hibernację, zmniejsz plik stronicowania.
3. Defragmentuj dysk (najlepiej x3 w Windows XP)
4. Wyzeruj wolne miejsce używając sdelete.exe (dostępne tutaj od SysInternals).
5. Wyłącz system.

6. W Hyper-V kompaktuj rozmiar dysku VHD.

Gotowe!



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!



Dzisiaj moja gra na PlayBooka przeszła pomyślnie certyfikację i jest oficjalnie do pobrania ze sklepu BlackBerry AppWorld.

Zasady są proste. Układamy 5 kulek w tym samym kolorze w linii, pod dowolnym kątem. Dodatkowe bonusy punktowe przyznawane są za zamiatanie linii seriami pod rząd, przemieszczając przy tym kolejno tylko jedną kulkę.

Wciągająca zabawa gwarantowana!

Zachęcam do pobierania tutaj.



Kolejny kamień milowy osiągnięty. Od dzisiaj biblioteka JSON@CodeTitans dostępna jest jako pakiet NuGet. Obsługiwana jest większość dostępnych aktualnie platform .NET.

Instalacja:

PM> Install-Package codetitans-jsonZapraszam do korzystania.



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!



Święta, czas lenistwa i objadania, a może by tak w międzyczasie zrobić coś pożytecznego albo czegoś się nauczyć?

Zgodnie z poprzednimi wpisami, najnowsza wersja Synology DSM dostarcza pakiet Mono, który oprócz możliwości uruchamiania aplikacji napisanych w .NET, pozwala też tworzyć własne strony ASP.NET. Co ciekawe obsługuje też ASP MVC, a że wsparcie bazy danych MySQL jest wbudowane i nic nie trzeba robić, żeby z niej korzystać (no może oprócz zainstalowania pakietu phpMyAdmin), to już jest małe pole do popisu dla kogoś, kto nie chce dodatkowo płacić za zewnętrzny hosting. Lub po prostu szuka rozrywki i chce zobaczyć, czy to faktycznie działa, a swoich wrażliwych danych udostępniać poza własne podwórko.

O zwykłych stronkach ASP.NET oraz MVC piszą wszyscy, zatem zaproponuję coś innego. Chcę, aby każdy (w rozumieniu dowolny, o który zapyta przeglądarka) plik z rozszerzeniem “.echo” w dowolnym folderze zwracał tekst “echo” jako odpowiedź z serwera. Proste?

http://<host>/test-site/site.echo ---> “echo”    
http://<host>/test-site/wei475kra/aka2kdfhwawo24id09hg.echo ---> "echo"

Ktoś zaraz powie, że to głupie i bezsensowne, ale dla mnie nie do końca. Bo jak mamy taką usługę działającą, to już niewiele trzeba, aby z URLa zrobić REST, a proste zwracanie tekstu “echo” przerobić na odpowiedź z serwera potwierdzającą (lub nie) wykonanie zadanej akcji. Innymi słowy rozszerzona wersja, zapytania zwracałaby uwagę na sam kształt URLa, nazwy pliku oraz danych przesłanych (przy żądaniach HTTP POST request):

http://<host>/test-site/psy/list.echo ---> lista psów
http://<host>/test-site/psy/<id>/details.echo ---> szczegóły konkretnego psa
http://<host>/test-site/psy/<id>/delete.echo ---> usuwa zwierzaka z bazy
Adnotacja: dostęp do bazy MySQL otrzymamy pobierając Connector/Net v6.6.4 i używając w projekcie MySql.Data.dll dla .NET Frameworka v2.0.






Przejdźmy wreszcie do sedna, jak to wszystko poskładać:

1. Tworzymy nowy projekt ASP.NET Application w Visual Studio dla .NET Frameworka 2.0

2. Tworzymy własny IHttpHandler, który będzie niedługo obsługiwał zwracanie tekstu ‘echo’ dla wszystkich plików “.echo”. Przykładowo może on wyglądać tak:

public sealed class EchoService : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        var response = context.Response;
        response.ContentType = "text/plain";
        response.ContentEncoding = Encoding.UTF8;
        response.Clear();
        response.BufferOutput = false;
        response.Write("echo");
    }

    public bool IsReusable
    {
        get { return true; }
    }
}

3. Zmieniamy plik Web.config, a dokładnie dodajemy sekcję httpHandlers w system.web tak, aby przekierować obsługę plików z rozszerzeniem “.echo” do naszego nowego serwisu (w miejsce <namespace> należy wstawić dokładną przestrzeń nazw klasy w wynikowym assembly):


<system.web>
   ...

   <httpHandlers>
     <add path="*.echo" verb="*" type="<namespace>.EchoService"/>
   </httpHandlers>
</system.web>

Wydawać by się mogło, że to już wszystko. I faktycznie tak by było, gdybyśmy używali produktów Microsoftu (Cassini, IIS, IIS Express). Jednak w naszym świecie Mono + Synology musimy jeszcze troszkę się pomęczyć.

A mianowicie, gdy spróbujemy teraz wgrać naszą aplikację do folderu /volume1/web/test-site, okaże się, że otrzymujemy błąd serwera. Z pomocą przychodzi oczywiście dokumentacja modułu Mono i połączenie go z serwerem WWW Apache. Szczegóły tutaj.


4. Logujemy się z konsoli na Synology i edytujemy plik: mod_mono.conf, dodając do niego między innymi wymuszenie obsługi żądań HTTP dla plików “.echo” przez moduł Mono oraz definiując prywatną aplikację wewnątrz Mono, która sama sobą będzie zarządzać. Bez tego ostatniego kroku Mono po prostu będzie serwować pliki z dysku z zadanej lokacji i oczekiwać, że pliki “.echo” fizycznie istnieją, co przecież nie jest prawdą. Czyli w naszym przypadku cały czas po prostu zwracałoby błąd.

cd /usr/syno/apache/conf/extra
vi mod_mono.conf


I dodajemy w nim na końcu:

AddType application/x-asp-net .echo
Alias /test-site "/volume1/web/test-site"
MonoApplications "/test-site:/volume1/web/test-site"
<Location /test-site>
     SetHandler mono </Location>

5. Na koniec już tylko restart sewera Apache WWW

/usr/syno/etc/rc.d/S97apache-user.sh restart

I gotowe! Wesołych świąt!



Kilka dni temu miała miejsce premiera najnowszej wersji systemu operacyjnego Synology DSM 4.1. (do pobrania tutaj). Nie ma więc na co czekać. Aktualizujemy swój NAS i oto oczom naszym ukazuje się pakiet opcjonalny “Mono 2.11.1 (beta)”, który po zainstalowaniu dostarcza nam pełną funkcjonalność .NET Frameworka. Czyli jest wszystko to, co opisywałem wcześniej (oczywiście bez etapu kilkugodzinnej kompilacji) i coś ekstra dostarczone przez Synology. Dodatkowo aktualizuje się wewnętrzny serwer Apache tak, że w katalogu “web” możemy od razu tworzyć w pełni funkcjonalne stronki ASPX i MVC!



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