piątek, 16 stycznia 2015

NancyFx Razor Wiele przycisków na jednej stronie (Multiple submit on one form)

Jeżeli zdecydujemy się porzucić stare "web.form" i w warstwie widoku przejść na syntaks Razor, to wtedy spotykamy się z problemem "wiele akcji w jednej formie". O ile podstawowa implementacja wygląda mniej więcej tak:

                <form name="xyzForm" id="xyzForm" class="xyzForm" action="/" method="post">
<input type="submit" value="Generuj raport" id="btnGenerate" class="btnGenerate" />
                </form>

Ten syntaks oznacza, że każde naciśnięcie każdego przycisku (input type="submit") wewnątrz tego form'a spowoduje wywołanie akcji kontrolera:        
        public MainModule(IDataStore dataStore)
        {
            Post["/"] = parameters =>
            {
                 return null;
            };
        }

A co jeśli chcemy, mieć kilka przycisków w jednej formie, odpowiedzialnych za kilka osobnych akcji? Z NancyFx oraz drobną pomocą Ajax'a nie stanowi to żadnego problemu:


                 <form name="xyzForm" id="xyzForm" class="xyzForm" action="/" method="post">
<input type="submit" value="Generuj raport" id="btnGenerate" class="btnGenerate" />
                    <input id="saveReportSpec" type="button" value="Zapisz ustawienia raportu dla klienta" onclick="saveReportSpecJs(); return false;" />
                </form>

        <script type="text/javascript">
            function saveReportSpecJs() {
                var $formData = $('#xyzForm').serialize();

                $.post('/Ajax/SaveReportSpec/', $formData, function (data) 
               {
              //TODO: jeżeli metoda coś zwraca, to tutaj działamy na 'data.'
                }
               );
            }

W przypadku html-a niewiele się zmieniło (dodaliśmy nowy przycisk, tym razem typu button) oraz ustawiliśmy wywoływanie javascriptu pod zdarzeniem "onClick".
Sam javascript, wywołuje nasz kontroler. Co ważne, jako parametr podajemy zserioalizowany formularz (form), dzięki któremu będziemy mogli później w osobnym kontrolerze posługiwać się danymi z formularza.
Prosty kod Modułu (kontrolera) dla tej akcji.

        public AjaxModule(IDataStore dataStore) : base("Ajax")
        {
            Post["/SaveReportSpec"] = _ =>
            {
                return null;
            }
        }

Jako parametr przekazujemy zserializowaną formę, abyśmy później mogli korzystać w kontrolerze z danych zawartych w formie, np.:

<input id="cbXYZ" name="cbXYZ" type="checkbox" />

Odczytujemy za pomocą:

            var cbXYZ= Request.Form.cbXYZ;




sobota, 3 stycznia 2015

Chocolatey , czyli.. taki windowsowy 'apt-get' ;-)

Chocolatey to jest manager pakietów, podobny do NuGet'a, ale operujący z poziomu systemu operacyjnego, czyli... taki windowsowy odpowiednik apt-get znanego z syst. Debian/Ubuntu.

Jego instalacja jest banalnie prosta, ponieważ wystarczy za pomocą wiersza poleceń uruchomić skryp powershela:


@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin

Teraz, posiadając zainstalowane chocolatey, możemy instalować pakiety, korzystając z jego pomocy np., aplikację o nazwie 'vlc' instalujemy wpisując w linii komand:
cinst vlc
Proste i przyjemne? Jak najbardziej, szczególnie, że samo sobie pociągnie wszelkie "zależności", czyli... jeżeli będzie potrzebować dodatkowej biblioteki, to spróbuje ją pobrać (podobnie jak NuGet).

Jedyne na co trzeba uważać, to czy podczas instalacji Chcolatey skorzystało z odpowiedniej zmiennej PATH (patrz kod instalacji), ale gdyby z jakiegoś powodu ta zmienna się nie dopisała, to warto ją ustawić ręcznie.

Linki:
Fajny art. z pcworld.com jak korzytać z chocolatey
Oficjalna strona projektu
Link do githuba

edit:
Windows 10 będzie posiadał swój własny "menager pakietów" o nazwie "OneGet"

czwartek, 1 stycznia 2015

KeePassX – przechowuj hasła bezpiecznie (i wieloplatformowo)

W jednym z moich poprzednich wpisów, z maja 2014 zrobiłem notkę nt. programu KeePass. Kto nie zna tego programu, niech się zapozna, ponieważ zwiększa on bezpieczeństwo haseł, jakie mamy na różnych serwisach internetowych.

Dzięki temu programowi, możemy mieć unikalne i bardzo bezpieczne hasła dla każdej z witryn, do których się logujemy. KeyPass sam w sobie jest fajny, ale posiadał pewne ograniczenie -> został napisany w .NET, a co za tym idzie, natywnie działał pod Windowsem lub za pomocą biblioteki Mono na Linuksach.

Teraz przedstawiam kolejną ewolucję tego oprogramowania, czyli KeePassX, który początkowo był portem KeePass na Linuxa, a obecnie został oddzielnym programem.

Linki:
Strona projektu: http://www.keepassx.org/
Adres na githubie: https://github.com/keepassx/keepassx

środa, 31 grudnia 2014

7a (7zip z comand line)

Kolejne przydatne narzędzie, które warto znać i używać podczas automatyzacji własnej pracy, to 7zip w wersji obsługiwanej z wiersza poleceń (comand line), czyli 7a. 7a jest osobną, samotną (standalone) instancją darmowej aplikacji do tworzenia plików z rozszerzeniem ".zip".
Warte jest zaznaczenia, że 7a nie jest dostarczane standardowo do 7zip, tylko trzeba je ściągnąć oddzielnie: link

Przykładowa komenda, to wykonania za pomocą skryptu typu "*.bat" z wykorzystaniem 7a

7za a -tzip foo_%DATE:~8,2%_%DATE:~5,2%_%DATE:~0,4%.zip bar

Gdzie: bar -> nazwa katalogu, który chcemy spakować.
Po wykonaniu tej instrukcji, otrzymamy przykładowy plik o nazwie: foo_31_12_2014.zip

Przykładowe linki z komendami:
http://www.dotnetperls.com/7-zip-examples

niedziela, 21 grudnia 2014

Wielowątkowy dostęp do zasobów "po polsku" :D

Jak każdy wie, samo programowanie jest wystarczająco trudne, a programowanie wielowątkowe jest trudne do kwadratu. O tym, że jest u nas z tym "krucho" można się było przekonać podczas tegorocznego DevDay 2014 w Krk, podczas którego Dan North wytknął to polskim programistom (głównie tym uczestniczącym na jego warsztatach).

Może ze świadomością wielowątkowości nie jest jakoś super, ale jednak pewna świadomość jest, co pokazała choćby sesja nt. "Modelu aktorów" na Warszawskiej grupie .NET.

A gdzie ja się z tym ost. spotkałem? Ano w aplikacji webowej, którą stworzyłem, a która do generowania raportów wykorzystuje SQL Server Reporting Services w trybie "local reports", tzn. do generowania raportów wykorzystywane są pliki ".rdlc" umieszczone na tym samym serwerze co serwer IIS hostujący stronę web (w moim konkretnym przypadku framework nancyfx).

I o ile przez większość czasu, te raporty generowały się poprawnie, o tyle przed wystawieniem aplikacji dla naszych doradców (pierwsza faza testów objęła ok 50-60 docelowych użytkowników systemu) razem z Adamem K. (osoba z "biznesu") postanowiliśmy przetestować to na x raportów wygenerowanych równocześnie. Zrobiliśmy tak i... klops. Pojawiły się błędy, jedne, te związane z użyciem słówka "static" udało się szybko wyeliminować, to pozostał jeszcze "concurrent access to file".

Stackoverflow.com  zaproponowało synchroniczny dostęp do plików za pomocą "lock". O ile na "początek" to miało sens, tj. wrzucam 'lock'a' "na szybko" i oddaję pierwszą wersję aplikacji użytkownikom do testów, o tyle w docelowej wersji (i kilka razy większej ilości użytkowników) taka wersja systemu była by bardzo niewygodna.

Z pomocą i pomysłem przyszedł mi Michał Kwiatos, który zaproponował rozwiązanie pt. "dla każdego requesta wygeneruj GUID, utwórz katalog z nazwą GUIDa, przekopiuj tam swoje pliki, wykorzystaj je do generowania raportu, a na koniec skasuj niepotrzebny już, śmieciowy katalog", co też zrobiłem i co... rozwiązało mój problem.

I tak sobie teraz myślę, że... najprostsze rozwiązania zwykle bywają najskuteczniejsze.

p.s. mój system docelowo będzie miał mniej niż 500 userów, czyli takie rozwiązanie wydaje się być optymalne. Gdybym tworzył system na +2k userów, to myślę, że na poważnie zastanowił bym się nad implementacją "modelu aktorów" w tym systemie.
p.s.2 wszelkie uwagi mile widziane

czwartek, 20 listopada 2014

user agent stylesheet

Wiedzieliście, może o istnieniu "user agent stylesheet" czyli o ukrytym pliku .css dokładanym przez przeglądarkę niejako "by default" ?? Ja się dowiedziałem o tym przed chwilą. I dzięki stackoveflow udało mi się temu zapobiec, dokładając plik reset.css.

Heh, taka mała ciekawostka, a jak bardzo potrafi wkurzyć :/

niedziela, 16 listopada 2014

dotPeek, czyli darmowe narzędzie do reverse engineering

dotPeek to nowe, darmowe narzędzie do deasemblacji (inżynierii wstecznej) od twórców ReSharpera, czyli JetBrains (link). Czym jest deasemblacja? Jest to próba odtworzenia kodów źródłowych na podstawie skompilowanych plików .dll lub .exe. O tym, że w .NET jest to możliwe wie każdy, kto zetknął się z mechanizmem refleksji, czyli... każdy szanujący się programista. Co jest fajnego w dotPeek, po za tym, że jest darmowe? To, że kod po deasemblacji wygląda na naprawdę zbliżony do tego, jaki widzimy w Visual Studio. Polecam zgrać i się nieco pobawić :)