13 maja 2009, 00:07 developer@dario-g.com Komentarze (0)

Nowe Allegro - czekamy na gruntowne poprawki

Poniżej kilka wybranych fragmentów nowego wyglądu Allegro.pl, który wymaga gruntownych poprawek. A może nawet i całkiem nowego tym razem poprawnego layout'u?
 
 
 
 
 
  Rozumiem chęć odświeżenia, ale... nie w ten sposób. :/ Czy będzie powrót do starego wyglądu czy nowy-nowy projekt? Sądząc po ilości nieprzychylnych komentarzy myślę, że powinno to nastąpić w miarę szybko.

Tagi:

27 kwietnia 2009, 23:59 developer@dario-g.com Komentarze (0)

Ikonek nigdy dość

Ikonek nigdy dość. Nie wiadomo kiedy będą potrzebne, dlatego warto mieć w swoich ulubionych zakładkach linki do takich stron jak VistaIcons.   
  Drugą stroną, z której ściągniecie ciekawe zestawy ikon to We Love Icons. Wiele z nich to małe dzieła sztuki.    
     Zobacz także inne zestawy, które prezentowałem wcześniej:  

Tagi:

26 marca 2009, 01:05 developer@dario-g.com Komentarze (0)

Kilka przydatnych metod - extension methods 2

Przedstawiam kolejną porcję przydatnych metod :) Trim Dodatkowe przeciążenie, które zwraca nie wiekszą ilość znaków niz maxLength.
   1:  public static string Trim(this string value, int maxLength)
   2:  {
   3:      if (!value.IsNullOrEmpty() && value.Length > maxLength)
   4:      {
   5:          return value.Substring(0, maxLength);
   6:      }
   7:      return value;
   8:  }
Przykład:
   1:  string a = "Ala ma kota";
   2:  string b = a.Trim(3); // b będzie zawierać 'Ala'
  IsNullOrEmpty To samo co string.IsNullOrEmpty, ale szybciej i wygodniej.
   1:  public static bool IsNullOrEmpty(this string value)
   2:  {
   3:      return string.IsNullOrEmpty(value);
   4:  }
 Przykład:
   1:  string a = "";
   2:  bool result = a.IsNullOrEmpty();
  Format To samo co string.Format, ale szybciej i wygodniej.
   1:  public static string Format(this string value, params object[] args)
   2:  {
   3:      return String.Format(value, args);
   4:  }
   5:   
   6:  public static string Format(this string value, object arg0)
   7:  {
   8:      return String.Format(value, arg0);
   9:  }
  10:   
  11:  public static string Format(this string value, object arg0, object arg1)
  12:  {
  13:      return String.Format(value, arg0, arg1);
  14:  }
  15:   
  16:  public static string Format(this string value, object arg0, object arg1, object arg2)
  17:  {
  18:      return String.Format(value, arg0, arg1, arg2);
  19:  }
 Przykład:
   1:  string f = "Ala {0} kota";
   2:  string x = f.Format("ma");
  RegexReplace Pozwala na szybkie zastąpienie ciągu znaków innym ciągiem znaków znalezionych na podstawie wyrażenia regularnego. Dodatkowo metoda ta zapamiętuje w pamięci podręcznej wcześniej utworzone wyrażenia.
   1:  private static Dictionary<string, Regex> regexCache = new Dictionary<string, Regex>();
   2:  public static string RegexReplace(this string value, string pattern, string replacement)
   3:  {
   4:      return RegexReplaceInternal(value, pattern, replacement, RegexOptions.Compiled);
   5:  }
   6:   
   7:  private static object rriLocker = new object();
   8:  private static string RegexReplaceInternal(string value, string pattern, string replacement, RegexOptions regexOptions)
   9:  {
  10:      bool isInCache;
  11:      lock (rriLocker)
  12:      {
  13:          isInCache = regexCache.ContainsKey(pattern);
  14:      }
  15:      if (isInCache)
  16:      {
  17:          return regexCache[pattern].Replace(value, replacement);
  18:      }
  19:      lock (rriLocker)
  20:      {
  21:          Regex rx = new Regex(pattern, RegexOptions.Compiled);
  22:          regexCache.Add(pattern, rx);
  23:          return rx.Replace(value, replacement);
  24:      }
  25:  }
  26:   
  27:  public static string RegexReplace(this string value, string pattern, string replacement, RegexOptions options)
  28:  {
  29:      return RegexReplaceInternal(value, pattern, replacement, RegexOptions.Compiled | options);
  30:  }
 Przykład:
   1:  string a = "    aaa     ";
   2:  string b = a.RegexReplace("\s", ""); // b będzie zawierać 'aaa'
  ToSlug Tak ogólnie służy do budowania permalinków. :)
   1:  private static Regex slugAllowed = new Regex("[^a-zA-Z0-9\\s]", RegexOptions.Compiled | RegexOptions.CultureInvariant);
   2:  private static char[] slugPLChars = new char[] { 'ą', 'ę', 'ó', 'ś', 'ł', 'ż', 'ź', 'ć', 'ń' };
   3:  private static char[] slugProperChars = new char[] { 'a', 'e', 'o', 's', 'l', 'z', 'z', 'c', 'n' };
   4:   
   5:  public static string ToSlug(this string value)
   6:  {
   7:      StringBuilder sb = new StringBuilder(value.ToLower());
   8:      for (int i = 0; i < slugPLChars.Length; i++)
   9:      {
  10:          sb.Replace(slugPLChars[i], slugProperChars[i]);
  11:      }
  12:      string[] good = slugAllowed.Split(sb.ToString());
  13:      for (int i = 0; i < good.Length; i++)
  14:      {
  15:          if (good[i].Length > 0)
  16:          {
  17:              good[i] = good[i].Trim().RegexReplace(@"\s", "-") + "-";
  18:          }
  19:      }
  20:      return String.Join("", good).Trim('-');
  21:  }
 Przykład:
   1:  string a = "Aluśka ma kocięta!!!";
   2:  string b = a.ToSlug(); //b będzie zawierać 'aluska-ma-kocieta'
  ToPhysical Zamienia ścieżkę wirtualną na fizyczną.
   1:  public static string ToPhysical(this string value)
   2:  {
   3:      return value.Replace("~/", HttpRuntime.AppDomainAppPath).Replace("/", "\\");
   4:  }
 Przykład:
   1:  string a = "~/App_Data";
   2:  string b = a.ToPhysical(); //b będzie zawierać 'c:\projects\test\App_Data'
  RemoveHtmlFormating Czyści zadany ciąg znaków z formatowania HTML. Dodatkowo można zaznaczyć czy ma pozostawić HTMLowe znaki przejścia do nastepnej linii.
   1:  public static string RemoveHtmlFormating(this string value, bool leaveLineBreaks)
   2:  {
   3:      StringBuilder output = new StringBuilder(value);
   4:      output
   5:          .Replace("\r", "")
   6:          .Replace("\t", "")
   7:          .Replace(" /", "/")
   8:          .Replace("</p>", "\n")

   9:          .Replace("<br/>", "\n");
  10:
  11:   
  12:      return RegexReplace(output.ToString(), "<.*?>", "").Replace("\n", leaveLineBreaks ? "<br/>" : "");
  13:  }
 Przykład:
   1:  string a = "<p>Ala ma kota</p><p>Kot ma Alę</p>"

   2:  string b = a.RemoveHTMLFormating(true); // b będzie zawierać 'Ala ma kota<br/>Kot ma Alę'
  Ostatni przykład nie napisałem sam, ale dosyć często używam i tutaj go prezentuję, bo jest naprawdę ciekawy (a sam kod działa naprawdę szybko). FormatNamed Metoda służy do zamiany w treści ciągu znaków na podstawie właściwości przekazanego obiektu.
   1:  private static string OutExpression(object source, string expression, bool ignoreNotFound)
   2:  {
   3:      string format = "";
   4:      string orygexpression = expression;
   5:   
   6:      int colonIndex = expression.IndexOf(':');
   7:      if (colonIndex > 0)
   8:      {
   9:          format = expression.Substring(colonIndex + 1);
  10:          expression = expression.Substring(0, colonIndex);
  11:      }
  12:   
  13:      try
  14:      {
  15:          if (String.IsNullOrEmpty(format))
  16:          {
  17:              return (DataBinder.Eval(source, expression) ?? "").ToString();
  18:          }
  19:          return DataBinder.Eval(source, expression, "{0:" + format + "}") ?? "";
  20:      }
  21:      catch (HttpException)
  22:      {
  23:          if (!ignoreNotFound)
  24:          {
  25:              throw new FormatException();
  26:          }
  27:          else
  28:          {
  29:              return orygexpression;
  30:          }
  31:      }
  32:  }
  33:   
  34:  public static string FormatNamed(this string format, object source)
  35:  {
  36:      return FormatNamed(format, source, false);
  37:  }
  38:   
  39:  public static string FormatNamed(this string format, object source, bool ignoreNotFound)
  40:  {
  41:      if (format == null)
  42:      {
  43:          throw new ArgumentNullException("format");
  44:      }
  45:   
  46:      StringBuilder result = new StringBuilder(format.Length * 2);
  47:   
  48:      using (var reader = new StringReader(format))
  49:      {
  50:          StringBuilder expression = new StringBuilder();
  51:          int @char = -1;
  52:   
  53:          State state = State.OutsideExpression;
  54:          do
  55:          {
  56:              switch (state)
  57:              {
  58:                  case State.OutsideExpression:
  59:                      @char = reader.Read();
  60:                      switch (@char)
  61:                      {
  62:                          case -1:
  63:                              state = State.End;
  64:                              break;
  65:                          case '{':
  66:                              state = State.OnOpenBracket;
  67:                              break;
  68:                          case '}':
  69:                              state = State.OnCloseBracket;
  70:                              break;
  71:                          default:
  72:                              result.Append((char)@char);
  73:                              break;
  74:                      }
  75:                      break;
  76:                  case State.OnOpenBracket:
  77:                      @char = reader.Read();
  78:                      switch (@char)
  79:                      {
  80:                          case -1:
  81:                              throw new FormatException();
  82:                          case '{':
  83:                              result.Append('{');
  84:                              state = State.OutsideExpression;
  85:                              break;
  86:                          default:
  87:                              expression.Append((char)@char);
  88:                              state = State.InsideExpression;
  89:                              break;
  90:                      }
  91:                      break;
  92:                  case State.InsideExpression:
  93:                      @char = reader.Read();
  94:                      switch (@char)
  95:                      {
  96:                          case -1:
  97:                              throw new FormatException();
  98:                          case '}':
  99:                              result.Append(OutExpression(source, expression.ToString(), ignoreNotFound));
 100:                              expression.Length = 0;
 101:                              state = State.OutsideExpression;
 102:                              break;
 103:                          default:
 104:                              expression.Append((char)@char);
 105:                              break;
 106:                      }
 107:                      break;
 108:                  case State.OnCloseBracket:
 109:                      @char = reader.Read();
 110:                      switch (@char)
 111:                      {
 112:                          case '}':
 113:                              result.Append('}');
 114:                              state = State.OutsideExpression;
 115:                              break;
 116:                          default:
 117:                              throw new FormatException();
 118:                      }
 119:                      break;
 120:                  default:
 121:                      throw new InvalidOperationException("Invalid state.");
 122:              }
 123:          } while (state != State.End);
 124:      }
 125:   
 126:      return result.ToString();
 127:  }
 128:   
 129:  private enum State
 130:  {
 131:      OutsideExpression,
 132:      OnOpenBracket,
 133:      InsideExpression,
 134:      OnCloseBracket,
 135:      End
 136:  }
 Przykład:
   1:  class Foo
   2:  {
   3:      public string Kto {get; set;}
   4:      public string Co {get; set;}
   5:  }
   6:   
   7:  Foo f = new Foo { Kto = "Ala", Co = "kota" };
   8:  string a = "{Kto} ma {Co}";
   9:  string b = a.FormatNamed(f); //b będzie zawierać 'Ala ma kota'
 Źródło: http://haacked.com/archive/0001/01/01/named-formats-redux.aspx

Tagi:

17 marca 2009, 20:51 developer@dario-g.com Komentarze (0)

Jestem gadżeciarzem - mam iPhone

Wygląda na to, że jestem gadżeciarzem. Trzy tygodnie temu popsuł mi się stary SonyErricson Walkman. Lubiłem w sumie ten telefonik. Miał zawrotną ilość pamięci wielkości 512MB i fajnie odtwarzał empetrójki. Niestety zawiódł. Zacząłem się rozglądać za nowym telefonikiem. Na początku myślałem, aby kupić HTC Touch Pro (ma wysuwaną klawiaturę) lub HTC Touch HD (duży ekran, ale bez klawiatury). Niestety oba modele niedostępne w przestępnej cenie. Jako, że abonament mam w sieci Era, więc zajrzałem do cennika,, aby spawdzić ile kosztuje iPhone. Okazało się, że cena dla mnie (stałego abonenta) bez zmiany taryfy (obecnie mam na firmę) wynosi tylko 149zł. To co było napisane na stronie mi nie wystarczyło, bo nie byłem tego na 100% pewny, więc szybko pojechałem do pobliskiego punktu Ery. Tam ku wielkiemu zaskoczeniu przemiły Pan zaproponował mi iPhone16GB ze standardowym przedłużeniem umowy na kolejne 24 miesiące już za nie całe 70zł netto.  
  W ten oto sposób znalazł się po chwili w mojej kieszeni. Od tego momentu kupa zabawy, wypróbowywanie możliwości, ściąganie gierek i aplikacji (darmowych ;)) z AppStore. :) Rozczarowanie przyszło niedługo po tym jak padła bateria :) Pomyślałem - trzeba zrobić pierwsze ładowanie. Ładował się całą noc. Rano znów w obroty. Działał przez kolejne 48 godzin. Fakt, prawie ciągle był w użyciU, jak to zwykle z nową zabawką bywa. :) Minęło już trochę czasu od zakupu i pierwszych zachwytów. Przyszedł czas podsumowania. Bateria mimo iż niekorzystam z 3G, bo większość czasu spędzam w domu (bo tu pracuję) i głównie działam poprzez domowe WiFi, mimo wyłączonego GPS'a, korekcji dźwięku, zmniejszonej jasności ekranu wytrzymuje jakieś 3 dni. W tym czasie wykonuję połączenia, jakieś ze ~3 SMS'y, kilka różnych aplikacji. Na pierwszy rzut oka nie jest źle, ale w sumie to tylko 3 dni. Wymieniając wszystkie wady w punktach:
  • ogólnie słaba bateria
  • brak MMS'ów
  • brak kamerki
  • brak Copy/Paste
  • brak "wolnego" Bluetooth
Pewnie by się jeszcze znalazło kilka... :/ Braku klawiatury nie krytykuję, bo jak widać taki trynd i inni producenci także wypuszczają takie produkty. A jednak... Spodobał mi się ten telefonik, gdyż akurat jak dla mnie ma też on swoje zalety. Poza tym właśnie trwa (lub dobiega końca) prezentacja nowej wersji iPhone OS 3.0. Już wiadomo, że część rzeczy, których do tej pory nie posiadał (w każdym bądź razie nie posiadał z "pudełka") w nowej wersji będą dostępne i to za darmo. Mowa jest tutaj następujących funkcjonalnościach:
  • Połączenia Peer to Peer pomiędzy tymi samymi aplikacjami (granie w kilka osób na kilka urządzeń może być zabawne)
  • Korzystanie z map będzie możliwe wewnątrz danej aplikacji bez wychodzenia do zewnętrznej, dedykowanej aplikacji
  • Push notification
  • Streaming Videodostosowane do aktualnej przepustowości
  • Cut, Copy, Paste
  • "Pozioma" klawiatura we wszystkich aplikacjach
  • Wsparcie dla MMS'ów
  • Notatki głosowe
  • Dwa dodatkowe typy kalendarza
  • Stereo Bluetooth
Źródło: http://www.mactropolis.com
Aplikacje Poniżej wypisałem kilka aplikacji, z których bardzo często korzystam. Pomijając "wbudowane" Safari pozostałe są to aplikacje darmowe pobrane z AppStore. Safari Tak, tak... Jestem maniakiem i gadżeciarzem. Jak nie mam dostępu do kompa, czy chociażby jak ostatnio leżałem chory w łóżku dosyć często odpalałem Safari ;) RssRunner Super fajny programik do przeglądania Rss'ów. Można zaciągnąć OPML'a ze swojego Google Reader'a, dodać kanał z ręki, itp. Zaciągnięte notki są zapisywane w pamięci podręcznej i można je przeglądać bez dostępu do sieci. Dodatkowo w każdej chwili można zaciągnąć cały artykuł i przeczytać na stronie dzięki wbudowanej przeglądarce www. Files Lite Świetny programik dzięki któremu możemy poprzez Wifi wgrać na iPhone różne pliki. Począwszy od PDF, XLS, DOC, HTM, GIF, JPG, etc. Ostatnio wgrałem nowy szablon strony, którą robię dla brata mojej Sylwi. Mogłem go pokazać bez targania kompa. W prosty sposób można przenosić pliki dokumentów między komputerami (bez kabelków). iMoney Kryzys zrobił swoje i wielu krwi zespuł. Mi także, gdyż aktualnie posiadam i jeszcze dłuuugo będę posiadał kredyt na mieszkanie w CHF. Od czasu pojawienia się tej aplikacji ślędzę non-stop kursy walut. iTranslate Prosty programik od Google do tłumaczenia wyrazów, fraz, etc. Nie powiem, że przydał  mi się kilka razy :) Akurat byłem poza domem/pracą. ;) Podsumowując Jestem świadomy wielu wad tego urządzenia, ale mimo wszystko te kilka zalet przekonują mnie do dalszego korzystania. Ktoś zapyta, co ma z tym tekstem wspólnego ASP.NET MVC? Nie napiszę na niego aplikacji w .NET, bo nie ma SDK pod Windowsy. Nie mam także obecnie ~6000zł gotówki wadium, jakie trzeba zapłacić za kupno Mac'a, bo tylko na nim da się tak naprawdę napisać aplikację, która mogła by zaistnieć w AppStore. Ale za to napisać mogę aplikacje internetową z przeznaczeniem dla iPhone co już nie jeden pokazał: http://www.hanselman.com/blog/The...ASPNETMVCEdition.aspx http://dotnetslackers.com/articles/ aspnet/DevelopingForTheiPhone.aspx http://dotnetslackers.com/articles/aspnet/AdvancediPhoneDevelopment.aspx http://weblogs.asp.net/aaronlerch/archive/2008/06/08/rock-the-iphone-with-asp-net-mvc.aspx Jak widać jakieś pole do popisu jest ;) Może przy okazji jakiegoś projektu dla klienta będzie można pochwalić się wersją dla iPhone. Telefon ten nie jest dla wszystkich. Kto tak naprawdę potrzebuje telefonu biznesowego (pełną gębą) wybierze coś innego. Mi narazie wystarcza i nie zapowiada się, aby w najbliższym czasie mogło się to zmienić. Jeśli jednak to się stanie to nie omieszkam poinformować ;)

Tagi:

28 lutego 2009, 12:06 developer@dario-g.com Komentarze (0)

Małe odświeżenie blogu i dotnetomaniak

Odświeżyłem z lekka wygląd strony. Tytuł artykułu jest teraz "lżejszy" i bardziej przejżysty. Zdjąłem boldowanie i lekko powiększyłem wielkość czcionki do 28px. Dodatkowo pozbyłem się gwiazdek z systemu blogfrog, gdyż ten nie działa ostatnimi czasy zbyt wydajnie. Powodowało to, że moja strona nie ładowała się poprawnie, a czasami wręcz wogóle. Ponadto teraz każdy artykuł posiada linki do dzielenia się informacją w agregatorach na końcu tekstu, a nie jak do tej pory u góry w nagłówku. Doszły dwa nowe linki: do linkologii i przede wszystkim  dot.net.o.maniaka :) Nowy i chyba pierwszy tego typu agregator treści o programowaniu w .NET i tematów około.netowych. Fajnie, że coś takiego powstało. Teraz wszystkie polskie treści dotnetowe w jednym miejscu. dotnetomaniak oparty jest o darmowy klon Digg'a zwany Kigg'iem. Kigg napisany jest w ASP.NET MVC. Zawiera wiele elementów Ajax'owych ułatwiających poruszanie się po serwisie. Niestety Kigg jako proste narzędzie posiada także kilka błędów. Najbardziej denerwujący jest błąd, który powoduje, że za każdym razem muszę się logować, gdyż system nie zapamiętuje sesji na dłuższy czas.  Mam nadzieję, że wszelkie niedociągnięcia zostaną poprawione i dotnetomaniak zyska popularność wśród .NETowej społeczności. :)

Tagi:

O autorze

Dariusz Gil - projektant i programista aplikacji internetowych budowanych na platformie Microsoft w technologii ASP.NET (C#) oraz MS SQL Server. Obecnie właściciel (narazie :)) jednoosobowej firmy Softio.

Filtruj używając APML