Niby prosta sprawa, a tak długo jak się tego nie sprawdzi to nie poczuje się różnicy.
Czym się różni Process.Start od AppDomain.ExecuteAssembly – a tym, ze to pierwsze uruchomi proces niezależny od rodzica. Podczas gdy druga opcja będzie działać we w tym samym procesie, w tej samej konsoli.
Tyle na dziś.
Uncategorized
C# nauka, materiały, etc
Każdy chciałby się szybko, przyjemnie i w interesujący sposób uczyć nowych technologi, języków czy bibliotek.
Nie da się tego wszystkiego tak łatwo osiągnąć, albo ja nie znalazłem jeszcze sposobu. Jeżeli wiecie to będę wdzięczny za podzielenie się taką informacją.
Nie ustając się w poszukiwaniu idealnego sposobu na naukę znalazłem jeden, który można uznać za prosty. Trzeba tylko posiedzieć przed monitorem i pooglądać kilka prezentacji przygotowanych przez ziomali z microsoft i firm z nimi współpracujących.
Ale first things first – podstawy:
Każdy porządny i szanujący się programista, powinien przebrnąć przez trochę książek (przynajmniej jedną) i napisać trochę linii kodu, aby w miarę płynnie posługiwać się językiem którego chce używać. Część z nas czyta wszystko od A do Z w oficjalnych książkach wydanych przez MS, inni lecą po łebkach i korzystają z różnego rodzaju kursów dostępnych na blogach. Rozumiem, każdy przyswaja wiedzę w inny sposób. Ważne jednak jest aby każdy rozróżniał klasę od obiektu, wskaźnik od referencji, czy inne słowa.
Próbowałem obu podejść (łebki vs książki) i moim skromnym zdaniem lepiej przeczytać książkę, tak aby dobrze opanować podstawy. Ja przeczytałem i mocno polecam (ten post dotyczy c#) Charles Petzold Programming MS Windows with C#, wcześniej czytałem też programowanie dla Win32 i też jest to dobra pozycja. Najmocniej przepraszam, ale nie mogę sobie przypomnieć nazwy książki, którą czytałem aby poznać podstawy C#.
Opanowałem podstawy i co dalej?
Namiętnie oglądam ostatnio serię “How do I” dla WPF i ogólnie C#. Wcześniej przejrzałem kilka dłuższych prezentacji z PDC i muszę powiedzieć, że dzięki temu w szybki sposób można poznać to co nowe (przynajmniej dla mnie, bo wciąż jestem początkującym programistą C#), oraz nauczyć się jak zrobi ficzera X.
PDC2008
PDC2009
PDC2010
How do I (wpf)
Naprawdę polecam zainteresowanie się tymi materiałami.
Czy coś jeszcze? Można się zapisać do różnych lokalnych grup wsparcia dla anonimowych programistów i tam się dalej rozwijać do czego także namawiam. Ja jak tylko znajdę czas i chęci to też się zapisze.
Pozdro
JS
ps.
Dzisiaj jakoś tak bez drwin.
Jak rysować w C#

Uczę się i uczę, sprawdzam wiedzę i sprawdzam i wyszło, że z rysowaniem sobie nie do końca poradziłem. Aby to poprawić chciałem coś napisać/narysować, od słowa (kluczowego) do słowa i zacząłem pisać prostego painta. W sumie nic skomplikowanego, a cieszy. Wyciosałem coś co może pretendować do miany prostego rysownika.
Można sobie wybrać kilka prostych opcji do rysowania plus kilka kolorów, nic fikuśnego. Później mnie trochę poniosło i dodałem opcje cofania edycji i zmiany rozmiaru okna do rysowania, co okazało się banalnie proste.
W zasadzie wszystko co powinna robić aplikacja to posiadanie listy kształtów i kolorów które trzeba narysować gdzieś na ekranie.
Potem pomyślałem o tym, że skoro ktoś spędzi przy mojej aplikacji tyle godzin rysując jakieś cuda, szkoda aby jego praca poszła na marne. Można więc zapisywać i odczytywać obrazek, ponad to można go nawet (wow!) wyeksportować do .png tak aby inne mniej zaawansowane programy mogły go odczytać. Mój paint nie zniży się do tego poziomu i działa tylko z własnym formatem pliku (zserializowana lista obiektów). Tak zamierzam wprowadzić nowy standard.
W między czasie przeczytałem krótki art o wzorcu odwiedzający (Visitor), jako że pasował trochę do koncepcji aplikacji, postanowiłem zrobić mały refactor, aby z niego skorzystać. Wzorzec działa całkiem sprytnie, ale wiadomo że nic nie przychodzi za darmo. Prosta zmiana z enum na odwiedzającego, spowodowała lawinę zmian, którą musiałem wprowadzić do aplikacji, aby przystosować do nowej logiki. Jeszcze jedno spostrzeżenie, ten wzorzec szybko zwiększa ilość klas w projekcie.
Od razu przychodzą rozważania nad oczywistą oczywistością – nic na siłę. Jeżeli rozwiązanie z którego korzystam jest zupełnie wystarczające, nie powoduje problemów, etc to nie widzę najmniejszej potrzeby zmiany. Może poza ciekawością lub celami czysto szkoleniowymi. Tak właśnie było w moim przypadku.
Przy okazji poćwiczyłem także XAML i UI, naprawdę sporą część aplikacji robi się właśnie w designerze – to dobre jest. Pisanie GUI całkowicie w kodzie, a potem zabawa w przesuwanie tego po ekranie, powiększanie i obsługa OnSize(…), OnMove(…), szkoda na to czasu, tym bardziej że można to wyklikać, dzięki czemu prawdopodobieństwo popełnienia błędu jest dużo mniejsze.
Jeżeli ktoś będzie ciekawy jak prosto napisać Painta w C# lub chciałby zobaczyć jak ja to zrobiłem. Lub chciałbym zobaczyć jak skorzystałem ze wzorca odwiedzający, lub chciałbym zobaczyć kod lub po prostu jest znudzony lub zbiera kod lub … To właśnie wtedy powinien skorzystać z tego linka xp-dev i zaciągnąć odpowiednie źródła.
Pytania, odpowiedz i drwiny w komentarzach (jak zawsze)
ps.
Poly nie dziala
ps2
Już weekend!
enkrypting, dekrypting, sajning, walidejting i chaszing
Uważni czytelnicy zapewne przerobili już poprzedni temat i wiedzą jak nie pozwolić nie powołanym osobom wykonać kodu, który nie jest dla nich przeznaczony. Ale może się zdarzyć, że zostaniemy przechytrzeni i ktoś nas perfidnie podsiądzie i skorzysta z sytuacji, gdy akurat zapomnimy zablokować swojego kompa. Ojej, co możemy wtedy zrobić? Nie peniajcie, albowiem z pomocą przychodzi technologia i geniusz matematyki. Nasze poufne dane możemy zaszyfrować i w ten sposób poczuć się jeszcze bardziej bezpieczni. Oprócz tego, można wygenerować sumę kontrolną, która będzie poprawna tylko dla jednej pliku. To na wypadek, gdyby ktoś chciał coś dopisać do listy zakupów. Nawet po najmniejszej zmianie jednego znaczka, hasz suma będzie całkowicie inna. Jeżeli nam tego mało, możemy wygenerować cyfrowy podpis dla pliku – tak wiem szaleństwo.
Jak tego wszystkiego dokonać?
Wystarczy skorzystać z jednego z gotowych rozwiązań, które oferuje nam Microsoft i C# (lub skorzystać z tego Truecrypt ale jakimi bylibyśmy programistami, gdyby nie skusiło nas napisanie własnej aplikacji, która też potrafi takie rzeczy lub przynajmniej podobne).
SZYFROWANIE
Aktualnie dostępne są dwa gotowe rodzaje szyfrowania symetryczne (szybsze) i asymetryczne (bezpieczniejsze, wolniejsze). zaimplementowane w C#. Symetryczne podejście do problemu możemy rozwiązać przy pomocy jednej z pięciu gotowych klas:
Jeżeli chcemy być bardziej pro i mamy więcej czasu, można skorzystać z Asymetrycznego rozwiązania przy pomocy klasy:
O ile dla ludzi prostszym (czytelniejszym) jest symetryczny, podajemy hasło i sól (za wiki: losowa wartość (ang. salt) modulująca wynik tak, by użycie tego samego hasła dawało w wyniku inny klucz), można korzystać z dowolnych rozmiarów bloków danych, jest naprawdę szybciej, ale jest tylko jedno hasło, które służy do obu operacji szyfrowania i odszyfrowania.
O tyle asymetryczne korzystają z automagicznie (nawet nie wiedziałem, że znajdzie się do tego wiki) generowanych kluczy, które nie należą do najbardziej czytelnych (oczywiście dla ludzi), mają ograniczone rozmiary bloków szyfrowania, co za tym idzie dla większej porcji danych należy stworzyć większy klucz, co trwa naprawdę długo, a najgorsze jest to (naprawdę jest to złe i nie dobre) to nawet nie można używać własnego hasła. Bezpieczeństwo kosztuje.
Dobrze, po krótkim wstępie chciałbym zapisać jak korzystać z poszczególnych rozwiązań, kod jest do pobrania jak zwykle z xp-dev, także tutaj nie będę przyklejać kodu, żeby nie powiększać i tak długiego wpisu. Można to potraktować jako swojego rodzaju ściągawkę.
SYMETRYCZNIE
- Tworzymy instancje klasy, która ma zaszyfrować nasze dane. Jedna z wymienionych powyżej.
- Korzystając z klasy Rfc2898DeriveBytes zapodajemy hasło i sól od użytkownika, oraz pobieramy losowe bajty wygenerowane dla nas. Tylko w przypadku szyfrowania symetrycznego.
- Należy pamiętać o poprawnej inicjalizacji KeySize, BlockSize, Key oraz IV (initialize vector)
- Otwieramy strumień z danymi, które chcemy zaszyfrować i zaczytujemy porcję danych
- Pobieramy interfejs do ICryptoTransform z klasy szyfrującej, tworzymy strumień wyjściowy szyfrujący, oraz otwieramy strumień do pliku wyjściowego
- Piszemy do strumienia szyfrującego, korzystając z pobranego wcześniej interfejsu, strumienia wyjściowego i zaczytanych wcześniej danych, powtarzamy dla kolejnej porcji danych
- Następnie trzeba już tylko wszytko pozamykać i powinno działać
- Jeżeli użyty został algorytm asymetryczny, warto wyeksportować klucz publiczny i prywatny, aby nie utracić możliwość ponownego odczytania zaszyfrowanych danych. W przypadku symetrycznego “wystarczy”, że zapamiętamy hasło i sól.
ASYMETRYCZNIE
- Stwórz klasę RSACryptoServiceProvider z rozmiarem klucza, z którego chcesz skorzystać. Tutaj trzeba uważać, jeżeli poda się za mały klucz, poleci wyjątek BadLength podczas próby szyfrowania
- Zaczytaj dane do bufora bajtów (lub strumień)
- Zaszyfruj dane
- Zapamiętaj klucz prywatny i publiczny. Dla tych, którzy nie wiedzą co to, na początku wpisu jest link do wiki
Podczas odszyfrowywania (deszyfrowania) postępujemy podobnie tylko, że w drugą stronę, należy także pamiętać o zaimportowaniu odpowiedniego klucza, który pozwoli nam poprawnie odczytać dane.
HASZ SUMY
Generowanie hasz sum to już prosta sprawa. Ciekawa (przynajmniej dla mnie to było ciekawe) sprawa do obliczania sum możemy także skorzystać z pomocy haseł. Suma bez hasła można wyliczyć za pomocą jednej następujących klas:
- MD5CryptoServiceProvider
- RIPEMD160Managed
- SHA1CryptoServiceProvider
- SHA256Managed
- SHA384Managed
- SHA512Managed
Jeśli chcemy skorzystać z hasła podczas generowania sumy, powinniśmy skorzystać z jednej z następujących klas:
Sposób działania jest banalnie prosty
- Stworzyć klasę haszującą, jeżeli korzystamy dodatkowo z hasła – przesłać do klasy w konstruktorze
- Wysłać do niej porcję danych do obliczenia (lub strumień)
- Zapytać się o hasz sumę i gdzieś sobie zapisać
- Posprzątać po sobie
PODPISYWANIE PLIKÓW (PODPIS CYFROWY)
I już ostatni ze sposobów na zabezpieczenie się przed elektronicznymi bandytami to podpisanie pliku, czyli kolejny ciąg bajtów, którym możemy oznaczyć nasz i tylko nasz plik. Także tutaj w cały proces możemy wciągnąć akcję z hasłem.
- DSACryptoServiceProvider – bez szyfrowania
- RSACryptoServiceProvider – z szyfrowaniem
Cały algorytm działania jest prosty
- Tworzymy odpowiednią instancje
- Ładnie prosimy o wygenerowanie podpisu dla zadanych danych (i ew. zaszyfrowanie)
- Pobieramy wyniczek i coś z nim robimy
- Zamykamy wszystko co zostało otworzone
W drugą stronę prawie tak samo, należy tylko zaimportować wynik poprzedniej operacji, zapewnić identyczny ciąg bajtów i poprosić o weryfikację.
Mam nadzieję, że to krótkie podsumowanie tematu choć trochę się to komuś przyda. Jeżeli są jakieś pytania, niejasności lub uwagi śmiało pisać.
JS
ps. Strach mnie bierze, gdy miałem kliknąć “publikuj posta” po napisaniu czegoś tak długiego.
autoryzowanie użytkowników
W życiu każdego z nas przychodzi taki moment, kiedy należy pamiętać o odpowiednim zabezpieczeniu się. W końcu nie możemy pozwalać wszystkim na wszystko – rajt?
Pisząc w C# mamy do dyspozycji pewien mechanizm, który może nam pomóc w udostępnianiu części kodu wybranym użytkownikom. Znajduje się on w:
using System.Security.Principal; using System.Security.Permissions;
Możemy korzystać ze sprawdzania kodu w sposób deklaratywny, poprzez atrybuty przy funkcjach, gdy chcemy odciąć całą metodę dla wybranej grupy użytkowników.
[PrincipalPermission(SecurityAction.Demand, Role = "user")] void foo(){}Lub w imperatywny sposób (nie do końca wiem, jak to przetłumaczyć). Zasadnicza różnica polega na możliwości wyłączenie części kodu.
try { PrincipalPermission pp = new PrincipalPermission(null, @"BUILTINAdministrators", true); pp.Demand(); MessageBox.Show("This message box should be only to admins", "Info"); } catch (System.Security.SecurityException sec_ex) { MessageBox.Show(sec_ex.Message, sec_ex.GetType().Name); }
Oczywiście są już gotowe klasy do tego wszystkiego PrincipalPermission.
Ale wiadomo że trzeba czasem zrobić coś inaczej/lepiej, wtedy trzeba wykorzystać dwa proste interfejsy
IIdentity IPrincipal
Prosta implementacja i wszystko gotowe.
Jednak! Czasem nie ma potrzeby implementacji tego wszystkiego (jak się jest niezdecydowanym jak wiadomo kto), a wystarczy najprostsza implementacja, wtedy nie ma potrzeby implementacja tych interfejsów, a skorzystać można z gotowego rozwiązania
GenericIdentity GenericPrincipal
Wszystko można obejrzeć i sprawdzić szczegóły korzystając z tego przygotowanego kodu, który jest dostępny jak zawsze na xp-dev.
Pisane późno w nocy, enyłej mam nadzieję że komuś się przyda.