Ost. czasy, całe moje dane prywatne, włączając w to zdjęcia oraz filmy, kręcone podczas różnych okazji przerzuciłem z dysku twardego na dysk zewnętrzny i... pewnego dnia przypadkowo usunąłem z tego dysku pliki startowe. Efekt? Zarówno windows, jak i ubuntu linux nie były w stanie się dobrać do tych danych :(
Ponieważ te dane były dla mnie cenne, postanowiłem spróbować je odzyskać. Po przetestowaniu kilku przeznaczonych do tego celu programów, w końcu trafiłem na cgsecurity test disk
Dzięki temu, konsolowemu programikowi, udało mi się skopiować dane z dysku zewnętrznego, na inny dysk twardy, czyli udało mi się odzyskać dane, na czym mi najbardziej zależało, a że program jest dodatkowo udostępniony za darmo na mocy Licencji GNU to polecam go dalej.
czwartek, 16 stycznia 2014
poniedziałek, 13 stycznia 2014
Simple.Data
Simple.Data, to nowy "ORM bez ORM", czyli nowy, mocno uproszczony sposób połączenia aplikacji z bazą danych. Sposób jest bardzo prosty, i pozwala na zaoszczędzenie linii kodu (im mniej tym lepiej), ale kosztem braku sprawdzania poprawności składni podczas kompilacji. Coś za coś. Dla małych, prostych aplikacji, ten ORM może być nawet sensowny, ale w dużych aplikacjach, z rozbudowanymi bazami danych, na których równocześnie pracuje wiele os. zwyczajnie się nie sprawdzi.
Dużo więcej, nt. tego ORM można przeczytać w art. na www.dobreprogramy.pl/. Tam też znajduje się mini tutorial dla tego rozwiązania (więc nie będę się powtarzał).
Rozwiązanie znajduje się na GitHub
Najłatwiej wersje "dla aplikacji" pobrać z NuGet
Dokumentacja z przykładami znajduje się: Simple.Data.Doc
Dużo więcej, nt. tego ORM można przeczytać w art. na www.dobreprogramy.pl/. Tam też znajduje się mini tutorial dla tego rozwiązania (więc nie będę się powtarzał).
Rozwiązanie znajduje się na GitHub
Najłatwiej wersje "dla aplikacji" pobrać z NuGet
Dokumentacja z przykładami znajduje się: Simple.Data.Doc
czwartek, 2 stycznia 2014
NancyFx
O nancy pierwszy raz usłyszałem 28.11.2013r. podczas 70 spotkania Warszawskiej Grupy .NET (WG-.NET). Prezenterem był nie kto inny, jak sam Maciej 'Procent' Aniserowicz, czyli obecnie najpopularniejszy bloger/programista .NET. Tak się składa, że blog Maćka czytam/przeglądam ze zmienną regularnością od dłuższego czasu, więc nie mogło mnie na tym spotkaniu zabraknąć. A co prezentował Maciek? Nowy, lekki, otwarty (github z kodem źródłowym), web framework, oparty na zasadzie KISS nazwanej tutaj "super-duper-happy-path".
Autorzy sami o swoim dziele napisali kilka słów pod tym linkiem ;)
A więc co tak naprawdę daje nam nancy?
- jest lekkie i wymaga od użytkownika minimum kodu. Przykład? Cały kod potrzebny do napisania aplikacji webowej:
- jest całkiem fajnie przemyślany, więc pisze się w tym stosunkowo szybko i wymaga to od programisty naprawdę mało kodu. Dlaczego mała ilość kodu jest ważna rozpisywało się już mnóstwo osób, np: Jeff Atwood - Najlepszy kod to brak kodu w ogole
- jako widok można używać zarówno html, xhtml, aspx, razor jak i wielu innych widoków
- jako kontener standardowy wykorzystywany jest tinyIoC, ale można wykorzystywać też inne
- kod jest łatwo testowalny, co pokazał Christian Horsdal w swojej książce "Instant Nancy web development" (przykłady z wykorzystaniem xUnit oraz fakeItEasy)
- aplikacje można hostować zarówno w .NET jak i Mono
- logowanie błędów jest dziecinnie proste i zajmuje znacznie mniej miejsca niż w innych aplikacjach
- dużo lepsze (i łatwiejsze) routingi niż w ASP MVC 4
- bardzo łatwo można przekształcić aplikację webową w konsolową, a nawet w projekt, w którym będą solucje: "core", "web", "console", "test".
Generalnie, po prelekcji Maćka Aniserowicza oraz przerobieniu książki Christiana Horsdala, jestem wielkim optymistą jeżeli chodzi o NANCY. Aż się nie mogę doczekać momentu, w którym będę miał nieco wolnego czasu, aby przerobić jeszcze jakiś tutoriale związane z tą technologią, oraz... zastosowania tej wiedzy w praktyce, w jakimś komercyjnym projekcie.
Autorzy sami o swoim dziele napisali kilka słów pod tym linkiem ;)
A więc co tak naprawdę daje nam nancy?
- jest lekkie i wymaga od użytkownika minimum kodu. Przykład? Cały kod potrzebny do napisania aplikacji webowej:
public class SampleModule : Nancy.NancyModule- jest w pełni konfigurowalna, tzn. praktycznie wszystko można skonfigurować/nadpisać. W ost. zawsze można napisać do autorów maila, lub znaleźć odpowiedni fragment kodu i go samemu poprawić (w końcu to open source ;))
{
public SampleModule()
{
Get["/"] = _ => "Hello World!";
}
}
- jest całkiem fajnie przemyślany, więc pisze się w tym stosunkowo szybko i wymaga to od programisty naprawdę mało kodu. Dlaczego mała ilość kodu jest ważna rozpisywało się już mnóstwo osób, np: Jeff Atwood - Najlepszy kod to brak kodu w ogole
- jako widok można używać zarówno html, xhtml, aspx, razor jak i wielu innych widoków
- jako kontener standardowy wykorzystywany jest tinyIoC, ale można wykorzystywać też inne
- kod jest łatwo testowalny, co pokazał Christian Horsdal w swojej książce "Instant Nancy web development" (przykłady z wykorzystaniem xUnit oraz fakeItEasy)
- aplikacje można hostować zarówno w .NET jak i Mono
- logowanie błędów jest dziecinnie proste i zajmuje znacznie mniej miejsca niż w innych aplikacjach
- dużo lepsze (i łatwiejsze) routingi niż w ASP MVC 4
- bardzo łatwo można przekształcić aplikację webową w konsolową, a nawet w projekt, w którym będą solucje: "core", "web", "console", "test".
Generalnie, po prelekcji Maćka Aniserowicza oraz przerobieniu książki Christiana Horsdala, jestem wielkim optymistą jeżeli chodzi o NANCY. Aż się nie mogę doczekać momentu, w którym będę miał nieco wolnego czasu, aby przerobić jeszcze jakiś tutoriale związane z tą technologią, oraz... zastosowania tej wiedzy w praktyce, w jakimś komercyjnym projekcie.
niedziela, 1 grudnia 2013
Diffuse - Tool for easy find differences between text files
"Diffuse to narzędzie do porównywania i łączenia tekstów. Dzięki widokowi w kilku panelach i kolorowym zaznaczeniom możesz dojrzeć różnice między tekstami w mgnieniu oka. "*
Zdarza nam się porównywać różnice, pomiędzy różnymi plikami tekstowymi. Najczęściej służy nam do tego, nasze narzędzie kontroli wersji (takie, jak np. Git, SVN lub TFS), jednak czasami, zachodzi potrzeba porównania ze sobą 2 tych samych plików, które nie są umieszczone w repozytorium (np. nowa wersja specyfikacji wymagań dostarczona przez analityka biznesowego). Dobrze, jest mieć wtedy pod ręką, jakąś darmową i wygodną "porównywarkę" plików tekstowych. Takie wymagania bardzo dobrze spełnia Diffuse, dostępny pod licencją GNU 2.0.
- Link nr.1 - Opis programu (PL) z możliwością ściągnięcia z softonic.pl/
- Link nr.2 - Strona projektu, na sourceforge.net
* - opis pochodzi z link nr.1
Zdarza nam się porównywać różnice, pomiędzy różnymi plikami tekstowymi. Najczęściej służy nam do tego, nasze narzędzie kontroli wersji (takie, jak np. Git, SVN lub TFS), jednak czasami, zachodzi potrzeba porównania ze sobą 2 tych samych plików, które nie są umieszczone w repozytorium (np. nowa wersja specyfikacji wymagań dostarczona przez analityka biznesowego). Dobrze, jest mieć wtedy pod ręką, jakąś darmową i wygodną "porównywarkę" plików tekstowych. Takie wymagania bardzo dobrze spełnia Diffuse, dostępny pod licencją GNU 2.0.
- Link nr.1 - Opis programu (PL) z możliwością ściągnięcia z softonic.pl/
- Link nr.2 - Strona projektu, na sourceforge.net
* - opis pochodzi z link nr.1
sobota, 16 listopada 2013
Javascript for intermediate with D.Crockford
Dobrze jest znać język, w którym się programuje. Jego założenia, filozofię, składnię, mocne i słabe strony. Jest to szczególnie ważne, gdy specyfika języka jest inna niż specyfika języka, do którego jesteśmy przyzwyczajeni. Takim osobnym, często niezrozumiałym językiem, jest Javascript, który mimo iż posiada podobną składnię do takich języków jak Java czy C# jednak znacznie się od nich różni. Warto więc poświęcić nieco czasu i trochę się nieco o tym języku dowiedzieć (czy to z książek, czy też filmów). Jednym ze źródeł wiedzy o javascript są wykłady Douglasa Crockforda (swoją drogą bardzo znana postać w środowisku Javascropt).
wtorek, 5 listopada 2013
Send SMS message by Mobitex API (HttpWebRequest)
Jedną z podstawowych funkcjonalności niemal każdej aplikacji jest możliwość wysyłania powiadomień mailowych. Coraz częściej zdarza się jednak, że klient chce mieć również możliwość wysyłania krótkich powiadomień tekstowych (tzw. SMS) na telefon komórkowy. Usługę taką w praktyce realizuje się poprzez zewnętrznych partnerów, którzy, w zamian za stosowną opłatę wystawiają nam API, z którym możemy się połączyć. W przeszłości widziałem rozwiązania kilku producentów i... każdy miał na to "swój" sposób (od wystawienia web service, poprzez web request z parametrami wiadomości przesłanymi poprzez URL, na wysyłaniu specjalnie skonstruowanego maila na podaną skrzynkę email ;)).
W takich chwilach jak ta, gdy o tym wspominam zaczynam żałować, że tak późno zacząłem prowadzić mojego bloga ;)
Ale do rzeczy. W tym konkretnym poście opiszę sposób integrowania się z API dostarczonym przez firmę Mobitex. Firma mobitex, wystawia publicznie dostępną specyfikację swojego API (specyfikacja_mt.pdf). Specyfikacja jest krótka, zwięzła i na temat.
W tym konkretnym przypadku, wysyłanie SMS odbywa się poprzez zwykły WebRequest z parametrami przekazanymi w querystringu, a w zamian dostajemy odpowiedź w strumieniu (Stream) za pomocą standardowego WebResponse.
Całość jest całkiem prosta i może być zrealizowana, za pomocą klasy z jedną metodą (co najwyżej należy skonfigurować parametry wedle naszych potrzeb):
Mobitex posiada też możliwość sprawdzenia stanu konta. Czytając dokumentację techniczną brakuje mi natomiast jakiegoś raportu podsumowywującego wszystkie sms wysłane w danych (sparametryzowanym) okresie czasu z danego konta (gdybym chciał zobaczyć datę, status oraz num. tel na jakie wysłałem wszystkie sms powiedzmy w poprzednim mieś.) i myślę, że w najbliższym czasie im takie pytanie zadam.
p.s. W przypadku korzystania z sieci korporacyjnych, należy się upewnić, aby mieć odblokowany port 443 dla serwera 213.5.10.22.
p.s.2 Uwaga. Nr. tel. w parametrze powinien być w formacie 4860X123456
p.s.3 ServerCertificateValidationCallback dostępny jest dopiero w .NET 4.5
W takich chwilach jak ta, gdy o tym wspominam zaczynam żałować, że tak późno zacząłem prowadzić mojego bloga ;)
Ale do rzeczy. W tym konkretnym poście opiszę sposób integrowania się z API dostarczonym przez firmę Mobitex. Firma mobitex, wystawia publicznie dostępną specyfikację swojego API (specyfikacja_mt.pdf). Specyfikacja jest krótka, zwięzła i na temat.
W tym konkretnym przypadku, wysyłanie SMS odbywa się poprzez zwykły WebRequest z parametrami przekazanymi w querystringu, a w zamian dostajemy odpowiedź w strumieniu (Stream) za pomocą standardowego WebResponse.
Całość jest całkiem prosta i może być zrealizowana, za pomocą klasy z jedną metodą (co najwyżej należy skonfigurować parametry wedle naszych potrzeb):
using System;Całość rozwiązania sprowadza się, do utworzenia odpowiedniego querystringa, w którym przekazujemy wszystkie interesujące nas parametry (patrz dokumentacja), a nast. tworzymy web request. Przed wykonaniem dodajemy obsługę eventu "ServerCertificateValidationCallback". Jest to spowodowane tym, że mobitex posiada nieprawidłowy certyfikat bezpieczeństwa i w trakcie wykonywania httpWebRequest dostajemy pytanie czy jesteśmy tego świadomi i mimo to chcemy kontynuować naszą akcję. Po wszystkim, dostajemy odpowiedź z mobitexu, która wyglada mniej więcej tak:
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Text;
using System.Web;
namespace sms
{
public class MobitexApi
{
public static List<KeyValuePair<string, string>> SendSms(string number, string text)
{
List<KeyValuePair<string, string>> keyValueResponse = new List<KeyValuePair<string, string>>();
try
{
string user = "userName";
string pass = "passInMD51a2bc4f3f52dac6d872ae12";
string type = "sms";
string from = "fromUserName";
string ext_id = "1234";
string encodedText = HttpUtility.HtmlEncode(text);
string requestStringUrl = string.Format("https://api.mobitex.pl/sms.php?user={0}&pass={1}&type={2}&number={3}&text={4}&from={5}&ext_id={6}",
user, pass, type, number, encodedText, from, ext_id);
HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create(requestStringUrl);
//handle error code: ssl_error_bad_cert_domain
HttpWReq.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(
delegate
{
return true;
});
HttpWebResponse HttpWResp = (HttpWebResponse)HttpWReq.GetResponse();
Stream response = HttpWResp.GetResponseStream();
StreamReader reader = new StreamReader(response);
string responseString = reader.ReadToEnd();
HttpWResp.Close();
var respStringTable = responseString.Split(',');
for (int i = 0; i < respStringTable.Length; i++)
{
string keyValue = respStringTable[i];
if (!string.IsNullOrEmpty(keyValue))
{
string key = keyValue.Substring(0, keyValue.IndexOf(':'));
string value = keyValue.Substring(keyValue.IndexOf(": ") + 1);
keyValueResponse.Add(new KeyValuePair<string, string>(key, value));
}
}
}
catch (Exception ex)
{
//TODO:
//Error handling in here (for example NLog)
}
return keyValueResponse;
}
}
}
Status: 002, Id: 03a72a49fb9595f3737bc4a2519ff283, Number: 4860X123456więc parsujemy ją do nieco bardziej przyjaznego w obsłudze typu danych, czyli kolekcji obiektów typu "KeyValuePair".
Mobitex posiada też możliwość sprawdzenia stanu konta. Czytając dokumentację techniczną brakuje mi natomiast jakiegoś raportu podsumowywującego wszystkie sms wysłane w danych (sparametryzowanym) okresie czasu z danego konta (gdybym chciał zobaczyć datę, status oraz num. tel na jakie wysłałem wszystkie sms powiedzmy w poprzednim mieś.) i myślę, że w najbliższym czasie im takie pytanie zadam.
p.s. W przypadku korzystania z sieci korporacyjnych, należy się upewnić, aby mieć odblokowany port 443 dla serwera 213.5.10.22.
p.s.2 Uwaga. Nr. tel. w parametrze powinien być w formacie 4860X123456
p.s.3 ServerCertificateValidationCallback dostępny jest dopiero w .NET 4.5
sobota, 2 listopada 2013
Chrome DevTools
Jak powszechnie wiadomo, każda praca wymaga specyficznych dla tej pracy narzędzi. W przypadku hydraulika jest to klucz francuski, w przypadku nauczyciela jest to tablica, a przypadku web developera są to tzn. 'DevTools'. Osobiście, do tej pory, jako 'DevTools' używałem narzędzi dostępnych w Internet Explorer (od wersji 8.0). Owszem, byłem świadomy "firebuga" występującego w 'mozilla firefox', jednak siła przyzwyczajenia była zbyt silna, aby się przemóc.'Narzędzia developerskie IE' pokazał jeden z kolegów z pierwszej pracy i... tak jakoś zostało. Do dzisiaj.
Pod wpływem kilku ost. wykładów Gutka (więcej info w moim poprzednim wpisie), postanowiłem poszerzyć moją wiedzę o to, co zaserwował nam Gutek podczas swoich wykładów.
Jednym z miłych zaskoczeń są narzędzia developerskie dostarczone nam przez firmę Google dla ich przeglądarki Chrome o nazwie "Chrome DevTools".
To co jest naprawdę fajne, to fakt, iż google, oprócz dostarczenia nam porządnych narzędzi udostępnia również mini-tutorial, w którym oprócz "wykładów" (filmiki) mamy też do wykonania część praktyczną (ponieważ jak to mówi miły pan na filmiku "nic nie zastąpi praktyki" ;)).
To co mnie najbardziej urzekło w "Chrome DevTools", to możliwość sprawdzania wydajności stron i sposób konkretnego wyszukiwania "wąskiego gardła" (tzw. "bootle neck"), z dokładnością do linii kodu, zarówno przy ładowaniu strony do przeglądarki, jak i późniejsza obsługa tego kodu w przeglądarce.
Link do samouczka z Chrome DevTools
p.s. W kursie jest również odnośnik do innej strony hostowanej przez google (closure-compiler), służącej do minimalizowania objętości plików js (w celu zwiększenia wydajności stron, które tworzymy).
Pod wpływem kilku ost. wykładów Gutka (więcej info w moim poprzednim wpisie), postanowiłem poszerzyć moją wiedzę o to, co zaserwował nam Gutek podczas swoich wykładów.
Jednym z miłych zaskoczeń są narzędzia developerskie dostarczone nam przez firmę Google dla ich przeglądarki Chrome o nazwie "Chrome DevTools".
To co jest naprawdę fajne, to fakt, iż google, oprócz dostarczenia nam porządnych narzędzi udostępnia również mini-tutorial, w którym oprócz "wykładów" (filmiki) mamy też do wykonania część praktyczną (ponieważ jak to mówi miły pan na filmiku "nic nie zastąpi praktyki" ;)).
To co mnie najbardziej urzekło w "Chrome DevTools", to możliwość sprawdzania wydajności stron i sposób konkretnego wyszukiwania "wąskiego gardła" (tzw. "bootle neck"), z dokładnością do linii kodu, zarówno przy ładowaniu strony do przeglądarki, jak i późniejsza obsługa tego kodu w przeglądarce.
Link do samouczka z Chrome DevTools
p.s. W kursie jest również odnośnik do innej strony hostowanej przez google (closure-compiler), służącej do minimalizowania objętości plików js (w celu zwiększenia wydajności stron, które tworzymy).
Subskrybuj:
Posty (Atom)