Bardziej przyjazny pulpit.

Pisałem już wcześniej jaki sprzęt przyjde się w pracy programisty. Chyba każdy się jednak zgodzi, że dobry sprzęt nie wystarczy, jesli nie mamy odpowiednio skonigurowanego środowiska, można mieć 8GB ramu to jednak nie pomoże jeśli będziemy programowac w notatniku. Dzisiaj chciałbym podzielić się z wami kilkoma programami, które umilają pracę z Windowsem (poniekąd upadabniając go trochę do dystrybucji linuksa ;) ).

VirutalWin

Każdy kto pracował na którejś z dystrybucji linuksa na pewno zna feature wielu ekranów. Za czasów ubuntu 7.x kiedy to istniał jeszcze Beryl (dla tych, którzy nie pamiętają) robienie kostki z ekranów było pierwszą rzeczą na zaraz zainstalowanym systemie. Niewątpliwie jednak nie jest to potrzebne tylko żeby ładnie wyglądało, ale na pewno też zwiększa produktywność. Nie mając dwóch monitorów możemy sobie podzielic programy na grupy i trzymać je na oddzielnych pulpitach. Jest to bardziej przydatne niż przełączanie 4 programów za pomocą alt + tab. Aktualnie używam VirtualWin z dwoma zewnętrznymi monitorami, więc mam aż 8 pulpitów.

PS. Niestety VirtualWin nie umożliwia takich ładnych przejśc między pulpitami jak w linuksie.

F.Lux

Kolejnym programem, który instaluje zaraz po instalacji windowsa jest f.lux. Chociaż na codzień nie odczuwa się tego, że ten program działa, to na pewno odczuje sie jeśli wyłączymy go późnym wieczorem. F.lux zarząca jasnoscią oraz temperaturą ekranu w zależności od pory dnia. O ile rano zimne odcienie na ekranie nie przeszkadzają w codziennej pracy, to wieczorem ekran może nieźle zmęczyć oczy. F.lux podgrzewa nam trochę kolory na monitorze, robi to prawie niewidocznie a pozwala to na siedzenie późnymi wieczorami przed monitorem bez efektu zmęczonych oczu.

Fences

Wiele osób uważa, że najlepszym miejscem na przechowywanie dokumentów jest pulpit. Sam często zapisuje coś na pulpicie, który bo potrzebne jest mi to tylko na chwilkę, po czym okazuje się to całkiem przydatne i tak zostaje. Nim się obejrzymy nasz pulpit może zamienić się w straszny syf.

Fences to aplikacja, która pozwala pogrupować pliki na pulpicie oraz schować je jeśli nie są nam aktualnie potrzebne. Dwukrotne kliknięcie na pulpicie chowa lub pokazuje nasze ikony.

Sublime Text

Wiele razy szukałem odpowiedniego edytora tekstu dla programisty. Przez większość czasu używam Visual Studio, jednak są takie pliki, dla których nie chce odpalać specjalnie VS’a, chociażby pliki sql. Chciałbym jednak aby edytor tekstu podświetlał składnie oraz umożliwiał szybką edycję takich plików. Przetestowałem już wiele edytorów: Notepad++,Notepad2GVim, w końcu trafiłem na Sublime Text i przy nim chyba na razie zostanę. Sublime w wersji darmowej zawiera podstawowe funkcjonalności, można również kupić licencje i korzystać z dodatkowych feauterów. :)

Chocolatey

O apt-get pod windowsa było głośno jakiś czas temu, ostatnio trochę słuch o tym zanikł, a szkoda, bo jest to bardzo przydatne narzędzie zwłaszcza dla osób, które często reinstalują system. Nie powiem, że jest to odpowiednik debianowego apt’a, bo liczba programów nadal jest dosyć skromna w porównaniu z repozytorium debiana. Niemniej jednak możemy znaleźć ponad 1200 programów, w tym najniezbędniejsze do programowania (git, 7zip, node.js,  i wiele innych). Dzięki temu możemy w prosty sposób stworzyć skrypt, który instaluje chocolatey a następnie za jego pomocą dociąga nam najnowsze wersje programów i instaluje nam je.

Przedstawiłem tylko kilka przydatnych narzędzi, wiem że jest ich o wiele więcej, jeśli więc używacie jakiegoś programu, bez którego nie wyobrażacie sobie życia, to dajcie znać w komentarzu, chętnie przetestuje :)

Pierwsze zabawy z MongoDb

Już od dłuższego czas chciałem poznać jedną z baz NoSql-owych. Niestety zawsze jak się zabierałem za poznawanie jakiejś miałem nad głową termin skończenia projektu i wolałem zrobić coś szybko w znanych mi już relacyjnych bazach danych. Teraz zacząłem projekt, którego zakończenie przewiduje na marzec, więc mam jeszcze trochę czasu żeby pobawić się czymś nowy. Jedną z nowości, które zamierzam lepiej poznać to darmowa, NoSql-owa baza danych MongoDB. Jest to baza dokumentowa, więc wszystkie dane przechowuje w postaci plików json. Podejście to projektowania danych jest trochę inne niż w bazach takich jak MS SQL Server, ponieważ nie ma tutaj relacji. Oczywiście można sobie zamodelować przechowywanie kluczy, ale lepiej jest trzymać wszystko w jednym dokumencie.

Czego potrzebujemy żeby zacząć przygodę z MongoDB?

Przede wszystkim musimy pobrać bazę ze storny producenta (http://www.mongodb.org/downloads). Następnie rozpakowujemy pobrane archiwum i właściwie już możemy odpalić bazę. Aby to zrobić uruchamiamy konsole (cmd/powershell), wchodzimy do katalogu bin i piszemy:

.mongod.exe -dbpath sciezka_do_katalogu_z_danymi

Nie zamykamy konsoli, gdyż spowoduje to zamknięcie bazy. Domyślnie nasza baza zostanie uruchomiona na 127.0.0.1:27017. Niestety nie możemy uruchomić żadnego panelu admina ani nic co pomoże nam zarządzać bazą poprzez przeglądarkę. Do tych celów polecam program Robomongo. Dzięki niemu będziemy mogli podejrzeć dane, dodać, aktualizować czy wywoływać własne skrypty.

 

Czas połączyć to z .NET-em

MongoDB świetnie integruje się z .NET-em. Cała dokumentacja jak zrobić bardziej zaawansowane rzeczy znajdziecie na stronie http://docs.mongodb.org/ecosystem/drivers/csharp/ Przede wszystkim warto przeczytać CSharp Driver LINQ Tutorial, żeby zobaczyć jak używać LINQ do wyciągania danych z bazy.

Do używania mongo potrzebne są dwie biblioteki: MongoDB.Bson.dll oraz MongoDB.Driver.dll, obie można zainstalować poprzez Package Manager z lini poleceń:

PM> Install-Package mongocsharpdriver

lub poprzez wizualny manager NuGet’a (Official MongoDB C# Driver). Tyle wystarczy żeby móc już używać mongoDB w swoim projekcie.

Jako bonus dołączam moją implementację wzorca Repository skierowanego specjalnie dla MongoDB. Klasa ta posiada, kilka moich zdaniem kluczowych funkcjonalności takich jak:

  • zwraca nie cała listę obiektów, a obiekt IQueryable, który pozwala na tworzenie kwerend LINQ,
  • zwraca obiekt po jego Id,
  • przy dodawaniu nowego obiektu generuje mu nowe Id,
  • jeśli nie podamy nazwy kolekcji stworzy automatycznie kolekcje odpowiadającą nazwie typu obiektu, który zapisujemy w bazie.
/// <summary>
/// This class provides Id property
/// </summary>
public abstract class ModelBase
{
    public string Id { get; set; }
}

public class MongoRepository<T> 
    where T : ModelBase
{
    public MongoDatabase Database { get; private set; }

    private string _tableName;

    public MongoRepository(string tableName)
    {
        this._tableName = tableName;
        CreateDatabase();
    }

    public MongoRepository()
    {
        CreateDatabase();
    }

    private void CreateDatabase()
    {
        MongoClient client = new MongoClient();
        MongoServer server = client.GetServer();
        Database = server.GetDatabase("databasename");
    }

    public IQueryable<T> GetAll()
    {
        var col = GetTColection();
        return col.AsQueryable<T>();
    }

    public T GetById(string id)
    {
        var col = GetTColection();
        return col.AsQueryable<T>().Single(e => e.Id == id);
    }

    public void Add(T obj)
    {
        if (obj.Id == null )
        {
            obj.Id = ObjectId.GenerateNewId().ToString();
        }
        var col = GetTColection();
        col.Insert(obj);
    }

    public void Remove(string id)
    {
        var col = GetTColection();
        col.Remove(Query.EQ("_id", id));
    }

    public void Update(T obj)
    {
        var col = GetTColection();
        col.Save(obj);
    }

    private MongoCollection<T> GetTColection()
    {
        if (!string.IsNullOrEmpty(_tableName))
            return Database.GetCollection<T>(_tableName);
        else
            return Database.GetCollection<T>(typeof(T).Name);
    }
}