Development z Zapomnianej Strony

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

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!



wrz
01

Kody Pocztowe v1.0

by Paweł | Tags: ,

MarketplaceIcon

W ten weekend miała miejsce publikacja mojej aplikacji “Kody Pocztowe” na Windows Phone 7. Umożliwia ona przeglądanie i wyszukiwanie kodów pocztowych bez połączenia z Internetem.

Zapraszam do instalacji pod tym adresem w Windows Phone Markecie.

 

Pobierz z Windows Phone Marketplace

.



Jakiś czas temu pokazałem jak skompilować dystrybucję Mono 2.10.9 na swój NAS. Jednak dlaczego nie posunąć się o krok dalej i nie uruchomić stron ASPX na naszym urządzeniu?

Jak zatem skompilować testowy serwer XSP i uruchomić go? Równie dobry opis znajduje się tutaj (tyle, że po rosyjsku).

 

Zacznijmy zabawę od pobrania i wypakowania źródeł dla serwera XSP:

wget http://download.mono-project.com/sources/xsp/xsp-2.10.2.tar.bz2
tar -xvf xsp-2.10.2.tar.bz2 cd xsp-2.10.2

Upewnijmy się, że kompilator mono jest widoczny, tworząc odpowiednie dowiązania do /opt/bin:

ln -s /opt/mono-2.10.9/bin/dmcs /opt/bin/dmcs
ln -s /opt/mono-2.10.9/bin/gacutil /opt/bin/gacutil
ln -s /opt/mono-2.10.9/bin/mdoc /opt/bin/mdoc

I przechodzimy do konfiguracji (w razie potrzeby instalujemy brakujące pakiety - ja musiałem chociażby pkgconfig). Tutaj tak samo, jak w przypadku instalacji Mono, nie pozwalamy na bezpośrednią instalację do katalogu /opt/bin, tylko wymuszamy folder “mono-2.10.9”. Pozwoli to trzymać serwer XSP razem z odpowiadającą mu wersją Mono, jak i w przyszłości na szybką deinstalację (razem z Mono) poprzez proste usunięcie tego folderu.

ipkg install pkgconfig
export PKG_CONFIG_PATH=/opt/mono-2.10.9/lib/pkgconfig/
./configure --prefix=/opt/mono-2.10.9 --disable-docs

Budujemy i instalujemy:

make
make install


Build Environment
Install prefix: /opt/mono-2.10.9
Datadir: /opt/mono-2.10.9/share
Libdir: /opt/mono-2.10.9/lib
Build documentation: no
Mono 2.0 compiler: /opt/bin/gmcs
Mono 4.0 compiler: /opt/bin/dmcs
Target frameworks: .NET 2.0, .NET 4.0
Build SQLite samples: yes

Na koniec tworzymy jeszcze niezbędne dowiązania, aby łatwiej uruchamiać testowe strony:

ln -s /opt/mono-2.10.9/bin/xsp2 /opt/bin/xsp2
ln -s /opt/mono-2.10.9/bin/xsp4 /opt/bin/xsp4

Finał! Uruchamiamy przykład:

cd /opt/mono-2.10.9/lib/xsp/test
xsp4 --port 8888 --applications /:.
A w oknie przeglądarki wpisujemy: http://my_nas:8888/. Nic prostszego.

Gotowe!



Synology NAS pozwala za pomocą panelu administracyjnego w bardzo łatwy sposób skonfigurować domyślną stronę WWW dla naszego urządzenia. Tak samo możemy tam włączyć strony domowe dla użytkowników.

Do wybranego katalogu serwera WWW (np. /volume1/web) wrzucamy cały kod strony html/css/php i to w zasadzie wszystko.

Problem pojawia się niestety, gdy chcemy ograniczyć dostęp do tych zasobów za pomocą najprostszego logowania. Ponieważ pod maską chodzi Apache wydawać by się mogło, że wystarczy dorzucić odpowiednio przygotowane pliki .htaccess i .htpasswd.

Nic bardziej mylnego. Tzn. one zadziałają, ale zaraz po wpisaniu hasła zostaniemy automatycznie przekierowaniu z portu 80 (lub 8080) na port 5000 albo 5001, gdzie uruchomiona jest konsola administrowania urządzeniem. Podsłuchując, co się wtedy dzieje od strony protokołu HTTP okazuje się, że zaraz po zalogowaniu otrzymujemy klasyczny “redirect” (tj. odpowiedź z kodem 302 (3xx)).

Rozwiązanie jak uniknąć przekierowania znalazłem tutaj. Polega ono na edycji pliku PHP strony próbkowania Synology Manager, który gdy nie znajdzie nic w domyślnym folderze stron WWW, to właśnie przekierowuje na panel administratora (lub definitywnie zmieniamy mu nazwę na sample.php.bak).

vi /usr/syno/synoman/phpsrc/web/sample.php

i wykomentowujemy na samym końcu tego pliku:

# else
# {
#    header("Location: ".$admin_link);
# }

A na koniec restartujemy serwer Apache:

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

Podpowiedzi:

  • Ponieważ .htaccess wymusza logowanie dla całego podrzewa katalogów, dlatego lepiej użyć podfolderu w katalogu głównej witryny WWW i w nim umieścić dostęp przez hasło.
    Użycie np. katalogu “secure” i umieszenie tam .htaccess, spowoduje, że domyślny folder http://www.mój-nas.pl będzie miał dostęp wolny, natomiast http://www.mój-nas.pl/secure/ będzie wymagał logowania.
    Jest to o tyle pomocne, że inne aplikacje (jak chociażby PhotoStation nie będą wymagały podania tego hasła!)
  • Zwyczajowo w pliku .htaccess umieszczamy lokalizację do pliku z hasłami bez podawania pełnej ścieżki, czyli np.

AuthUserFile .htpasswd

ale, nie oznacza to, że katalogiem, w którym poszukiwany będzie ten plik jest folder witryny WWW!. Wręcz przeciwnie, domyślnie jest nim katalog: /usr/syno/apache

I tak oto uzyskaliśmy dostęp za hasłem!



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