.NET i takie tam

Archive for the ‘Aplikacje’ Category

Sudoku Solver in C#

2 komentarze

Another breakable toy, my variation of Sudoku solver. I’ve created it without previously googling the topic, and I was quite surprised when latter I realized that most solutions out there use just dumb trial and error. I was also glad that I can re-invent backtracking algorithm 😉

Ok. let’s start, from having a Sudoku that we want to solve:

sudoku

After a little consideration I decided to solve it by elimination of possible values. Let’s consider first block (by block I mean inner 3×3 cells squares), possible values for empty cells:

Cell \ Value

1

3

6

7

8

9

A1

x

x

x

x

A2

x

x

x

x

A3

x

x

x

x

B2

x

x

x

B3

x

x

x

x

C3

x

x

x

We can see that value 1 can be only in A1 cell so fill it in. Check remaining cells and no single value in a row or column. So we evaluate next block:

Cell \ Value

1

2

3

4

6

A5

x

x

x

B3

x

x

x

x

B4

x

B5

x

x

x

x

C3

x

x

Now value 1 and 6 are only possible in cells B5 and B4 so we fill them in. Check remaining cells after reduction – no single possible values – we go to the next block.

We cycle through all blocks until all cells are filled in (will happen only for very simple Sudoku) or number of empty cells is not changed after a cycle. In the second case, we filled what we could using simple elimination and it’s time for more advanced solving techniques or guessing. This time I choose guessing, maybe later I’ll implement something more original. So we take first empty cell pick its first possible value fill it in and use recursion and backtrack algorithm to check if we can complete the puzzle. If not go back pick next possible value and try again.

That’s it the whole working solution can be found on github. To test the solution I’ve used online solver at http://www.sudokuwiki.org/sudoku.htm . Beside of detail description of different techniques of solving Sudoku, it allows to import and export puzzle as string of numbers which is really helpful.

Next step for me is to implement the same algorithm using less familiar languages. I think of Python, Ruby, JavaScript and Dart, F# and maybe Haskell.

Written by sakowicz

Styczeń 2, 2012 at 10:22 pm

Napisane w .NET, Aplikacje

Tagged with , , , , , ,

Performance Counters i ich kategorie

leave a comment »

Performance Counters to taki mechanizm Windows, dzięki któremu możemy oszacować wydajność naszej aplikacji (i nie tylko naszej). Świetnie się również sprawdzają, przy identyfikacji wszelkich problemów z wyciekami pamięci lub przy poszukiwaniu niezamkniętych połączeń do bazy danych. Pełną listę odstępnych ‚liczników’ podzielonych na kategorie można zobaczyć uruchamiając Performance Monitor umieszczony Control Panel -> Administrative Tools.

image

Wszystkie liczniki podzielone są na kategorie – i właśnie z tymi kategoriami miałem problem. Otóż przykładowo, aby stworzyć nową kategorię i dodać do niej nasze liczniki, wywołamy następującą metodą:

CounterCreationDataCollection counters = new CounterCreationDataCollection();

counters.Add(new CounterCreationData("Counter 1",
                                        "Counter 1 Description",
                                        PerformanceCounterType.NumberOfItems32));
counters.Add(new CounterCreationData("Counter 2",
                                        "Counter 2 Description",
                                        PerformanceCounterType.NumberOfItems32));

PerformanceCounterCategory.Create("Nowa Kategoria",
                                    "Nowe Kategoria Description",
                                    PerformanceCounterCategoryType.Unknown, counters);

Fajnie, a co jeśli teraz chcemy dodać nowy licznik do naszej kategorii? No cóż klops – nieco skostniałe API nam tego nie umożliwia, przynajmniej nie bezpośrednio. Otóż, co możemy zrobić to pobrać wszystkie istniejące liczniki, skasować kategorie i utworzyć ja ponownie wzbogacona o nowe liczniki. Przykładowo:

string categoryName = "Nowa Kategoria";

CounterCreationDataCollection counters = new CounterCreationDataCollection();

if (PerformanceCounterCategory.Exists(categoryName))
{
    PerformanceCounterCategory pcc = PerformanceCounterCategory.GetCategories()
                      .Where(c => c.CategoryName == categoryName).FirstOrDefault();

    if (pcc != null)
    {
        var existingCouters = pcc.GetCounters().
                        Select(c => new CounterCreationData()
        {
            CounterName = c.CounterName,
            CounterHelp = c.CounterHelp,
            CounterType = c.CounterType
        }).ToArray();

        counters.AddRange(existingCouters);
    }

    PerformanceCounterCategory.Delete(categoryName);
}

counters.Add(new CounterCreationData("Counter 3",
                                     "Counter 3 Description",
                                     PerformanceCounterType.NumberOfItems32));

PerformanceCounterCategory.Create(categoryName,
                                  categoryName + " Description",
                                  PerformanceCounterCategoryType.Unknown, counters);

Powinno grac i buczeć. Jedno, na co trzeba zwrócić uwagę to, ze możliwy jest mały poślizg z ‚publikacja’ nowego licznika przez Windows. Co może powodować problemy? Gdy instalujemy cos np. serwisy windowsowe z pliku batch – licznik z jednego serwisu jeszcze nie został opublikowany a drugi serwis juz pobiera ich listę, aby je zmodyfikować.

Więcej o Performance Counters można znaleźć tutaj.

Written by sakowicz

Marzec 14, 2011 at 9:39 pm

Napisane w .NET, Aplikacje

Tagged with , , ,

Problem z localhost

with one comment

Dostałem nową maszynę w pracy z świeżo wgranym image systemu. Zdążyłem sobie ją skonfigurować, zainstalowałem co trzeba, pobrałem kod z repozytorium – wszystko fajne się buduje, działa jak należy – do czasu … pierwszego restartu.

Po ponownym uruchomieniu – strona nad którą jeszcze chwilę wcześniej pracowałem odmawia współpracy wyświetlają błąd 404. Ok. pewnie coś ze ścieżkami nie tak, ale nie, wszystko jest tak jak być powinno. Strona nadal wyświetla 404 – dziwne, robię iisreset nadal nic.

Wszystko idealnie się składa – za chwilę mam spotkanie z analitykiem i potrzebuję działającej strony – awaryjnie włączam laptopa i nadal szukam problemu.

Próbuję załadować inną stronę – problem ten sam 404. Ok. to już coś z IIS’em – działa (bo wyświetla 404). Czytam stronę błędu nieco dokładniej i mamy Status Code 101 – ok. sprawdzamy w Google co to znaczy – http://support.microsoft.com/kb/943891

101 – Switching protocols.

Niewiele mi to mówi ale zaczynam- grzebać w konfiguracji IIS’a – i w sumie od razu, widzę problem:

clip_image001

Próba ponownego startu, zwróciła kolejny wyjątek:

IIS Manager Error: The process cannot access the file because it is being used by another process. (Exception from HRESULT: 0x80070020)

Jakiego pliku? Dalszych poszukiwaniach w Internecie – okazało się, że może tu chodzić nie tyle o plik co o port 🙂 Teraz już było z górki – z linii komend, wystukałem:

netstat -ano

aby sprawdzić czy coś korzysta z portu 80 – Bingo! Przechodzę do Process Explorera i sprawdzam PID procesu korzystającego z mego portu i … okazuje się, że to Chrome 🙂 OK. zamykamy przeglądarkę, restartujemy IIS’a i znowu wszystko gra!!

Wszystko było by pięknie, gdyby nie zmarnowana godzina i uczucie, że już kiedyś chyba walczyłem z podobnym problemem.

Written by sakowicz

Styczeń 26, 2011 at 12:03 am

Napisane w Aplikacje, Misc, Tools

Tagged with , , ,

Aplikacyjne Alternatywy

with one comment

Natknąłem sie na fajna stronę: AlternativeTo – być może sie komuś się przyda, bo mi na pewno. Idea serwisu jest prosta, umożliwia wyszukiwanie aplikacji o podobnym zastosowaniu. Przykładowo szukamy aplikacji funkcjonalności podobnej do Adobe Photoshopa, oto co otrzymamy:

image

Niby podobne funkcje oferują, że tak je nazwę ‚agregatory’ oprogramowania jak tucows czy nasz rodzimy dobreprogramy.pl. Jednak AlternativeTo przejrzystością i prostotą bije je na głowę.

Written by sakowicz

Kwiecień 16, 2009 at 9:16 pm

Napisane w Aplikacje, Tools

Tagged with , , ,