• This is a usual time of the year for summaries so let’s keep the tradition alive and write one. Here’s my 2017 achievements split between months. January Blogging for 18 days straight – nothing near gutek’s achievement (whole year!) but still a nice streak Microsoft MVP title (thx Konrad Kokosa for pointing this one ;)) February […]

  • “Advent of Code is a series of small programming puzzles for a variety of skill levels.” Each day was a fun an interesting coding challenge. I’ve decided to practice and code this in python to learn the skill. Some of them might not be the best python scripting as I was short on time in […]

  • Some time ago I’ve attended a .net developer days 2017 conference. I was quite busy since (traveling, teaching .net, working) that only now I got some time to share some thoughts about it. As a bonus I’m including a short interview I did during the event. I need to state here, just to be clear, […]

  • We developers don’t like documentation. We don’t like to read it, and we even more we don’t like to write it. But sometimes it is worth to read it. Like when you find out that by using datetime in SQL DB you got a milliseconds precision but only if it ends on 0,3,7 (link). That […]

  • In the previous post we’ve removed some of the technical debt that could be found in our NetDeveloperPoland Website application. In this one we will remove it even more. We can even maybe reach a B? Let’s see where we’ll end up at the end of this part.

We wtorek miałem przyjemność wygłosić prelekcję prelekcję na temat Mono.Cecil na Wrocławskiej Grupie .NET.

— Byłeś na tej prezentacji? – Oceń ją


W sesji starałem się zaprezentować czym jest Mono.Cecil oraz jakie daje nam możliwości jeśli chodzi o przeglądanie, modyfikację plików assembly. Mam nadzieję, że za pomocą przykładów: generatora statystyk, automatyczną implementację INotifyPropertyChnaged wraz z użyciem MSBuild task pokazałem jak możemy wykorzystać Mono.Cecil, aby ułatwić naszą pracę. Dodatkowo poprzez zaprezentowanie prostego AOP (logowanie WE/WY do metody) oraz napisanie prostego obfuskatora kodu mam nadzieję pokazałem jak możemy wykorzystać tę bibliotekę do ciekawych rozwiązań wzbogacając nasz kod.

Jak bawić się ze źródłami? Solucja podzielona jest na 5 folderów: AOP, INotifyPropertyChanged, MsBuild.Task, Obfuscate oraz Statistics.

Zabawę polecam od Statistics. Prosty projekt, który pokazuje jak można przejrzeć assembly i zliczyć wystąpienia typów, metod, właściwości itd.

Następnie można zapoznać się z INotifyPropertyChanged. Jest tam pokazane rozwiązanie naiwne z jawnym wołaniem OnNotifyPropertyChnaged w setterze oraz trochę ładniejsze z wykorzystaniem Expression. 3 przykład w tym projekcie wykorzystuje mono Cecil. Wystarczy do bindowania użyć właściwości Header3 i zbudować aplikacje. Następnie uruchomić Mono.Cecil.INotifyPropertyChanged a po jego zakończeniu uruchomić (nie z VS) projekt WPF.INotifyPropertyChanged. Binding powinien działać wyśmienicie. Po tym warto zagłębić się w kod źródłowy projektu, aby zobaczyć jak za pomocą Mono.Cecil możemy dodać niezbędny kod.

Jak już rozpracujemy ten przykład warto zerknąć do MSBuild.Task jest to ulepszenie poprzedniego tak aby cała “magia” Mono.Cecil działa się przy każdym budowaniu projektu w VS. Dzięki temu nie będziemy musieli odpalać zewnętrznych aplikacji.

Dalej warto zapoznać się z folderem AOP. Jest tam pokazane jak za pomocą Cecil wygenerować dodatkowe instrukcje logowania na konsole każdego WE/WY do/z metody wraz z aktualnym czasem. Jest to swojego rodzaju Aspect-Oriented Programming.

Na sam koniec polecam zerknąć na projekt Obfuscate. Pokazuję tam jak możemy choć trochę zaciemnić nasz kod i co niektóre łańcuchy znaków w nim występujące, aby nie były tak łatwo dostępne dla osoby przeglądającej zdekompilowany nasz kod.

Uwaga: Przykłady zawierają dość spore ilości ILa – Nie odpowiadam za uszkodzenia wynikające z nadmiernego napromieniowania się tymi niskopoziomowymi instrukcjami 🙂

Do przeglądania skompilowanych źródeł polecam IlSpy’a, dotPeek’a, JustDecompile’a czy Reflector’a (ehh wisi mi jeszcze post porównujący te narzędzia…)

Link do prezentacji i przykładów i slajdów znajduje się na stronie grupy na portalu Wss/Codeguru.

Mile widziane uwagi i sugestie – sam już widzę, że chyba warto też przygotować, choćby krótką prezentację pt. Wstęp do IL, bo część osób nie jest w temacie.

Kolejny z serii postów odnośnie sesji pojawiających się na konferencji BUILD. Dziś sesja pod tytułem:

What’s new in Visual Studio 11

VS & MetroUI

Z sesji dowiadujemy się, co ciekawego przygotował dla nas Microsoft w najnowszej wersji narzędzia. Na początek prezentacja nowego UI – MetroUI, którego będziemy mogli użyć w wersji 11 Visual Studio. Dostępne będą szablony, które w prosty sposób pozwolą utworzyć nam wspomniane wyżej aplikacje. Nie będzie znaczenia, który język wybierzemy. Dostępne będą one zarówno w VB, C#, C++ oraz HTML5/JS. Dodatkowo będzie można tworzyć oprogramowanie niskopoziomowe – driver’y.

Nowy Solution Explorer, który przypomina trochę Solution Navigator obecnie dostępny w Productivity Tools. Szybka wyszukiwarka, za pomocą której będzie można odnajdywać rzeczy zarówno w kodzie, jaki i wśród poleceń Visual Studio.

IntelliSense dostał zakładki, dzięki którym będziemy mogli segregować podpowiedzi na grupy – te najczęściej używane oraz pozostałe.

Z poziomu VisualStudio będziemy mogli dodawać deklaracje, które nasza aplikacja wspiera. Dla przykładu jeśli wybierzemy Search, użytkownik systemu wyszukując elementy będzie także korzystał z szukania dostępnego w naszej aplikacji.

Programowanie aplikacji DirectX

Będzie wsparcie dla języka HLSL (High Level Shared Language) dające możliwość debugowania oraz funkcję podpowiedzi w Visual Studio.

Model czołgu renderowany przy pomocy VS.

Ogólnie możliwość otwierania modeli i śledzenia, jakie transformacje i tekstury są nakładane aby uzyskać końcowy efekt. Zapowiada się interesująco szczególnie dla wszystkich, którzy dotychczas w inny sposób musieli radzić sobie ze zrozumieniem, dlaczego jakaś część modelu 3D nie renderuje/działa prawidłowo. Będzie również możliwość testowania kodu DirectX’a.

Programowanie sterowników w VisualStudio

To zapowiada się niezwykle interesująco.Od najnowszej wersji VS umożliwi również pisanie sterowników. Po zainstalowaniu SDK będziemy mieli dostępny nowy typ projektu – Driver. Dodatkowo będzie możliwość uruchamiania kd z poziomu VisualStudio oraz debuggowanie jądra/sterowników z jego poziomu.

Programowanie Azure & HTML5 & ASP.NET

Oczywiście Microsoft nie zapomina o swoim chmurowym rozwiązaniu i najnowsze Visual Studio będzie wspierać tworzenie takowych rozwiązań.

HTML 5 jak i JS stają się pełnoprawnymi obywatelami w VisualStudio. Dostępne będą snippety, które usprawnią pracę z tą technologią. Oczywiście IntelliSense oraz kilka nowych funkcji np. Go To Definition. W VisualStudio dostaniemy jeszcze znane z IE Developers Tools (F12), za pomocą których będziemy mogli odkryć dlaczego nasz kod nie działa tak jak powinien.

ASP.NET będzie zawierać w MVC4 z wykrywaniem uruchamiana strony na telefonie (i zapewne renderowaniem w trybie kompaktowym). Oczywiście nadal będzie wsparcie jQuery. Za pomocą Page Inspector’a będzie można na podstawie kodu HTML/CSS/JS odnaleźć pliki po stronie serwera odpowiedzialne za wygenerowaną treść.

ALM

Cykl życia aplikacji w VisualStudio dzięki współpracy pomiędzy developerem, testerem oraz menadżerem za pomocą jednego narzędzia pozwoli na szybsze tworzenie oprogramowania. Planowanie Sprintu, tworzenie makiet, testy – to wszystko będzie się zawierać w nowym VisualStudio.

Cykl życia aplikacji

VS 11 będzie wspierać narzędzia takie jak review kodu przez innego programistę wraz z notatkami “na kodzie” wewnątrz Visual Studio (ale to chyba dostępne będzie tylko z TFS’em), uruchamianie aplikacji z funkcją IntelliTrace na produkcji oraz zarządzanie projektem za pomocą strony internetowej. Będzie dostępne także sprawdzanie ilości kodu napisanego za pomocą metody Copy’iego & Paste’a :).

Z ciekawostek dowiadujemy się, że jest około 4000 poleceń w Visual Studio :].
Sesja wymagana.

Miłego oglądania.

Jak pewnie wszyscy wiedzą niedawno skończyła się konferencja BUILD, na której zaprezentowano przede wszystkim najnowszego Windows’a 8. Jednak nie tylko. W kilku nadchodzących postach postaram się pokazać filmy warte obejrzenia.  Dziś na pierwszy ogień:

Future directions for C# and Visual Basic

Anders Hejlsberg prezentuje, co czeka nas w przyszłości w C# i VB. Nazwisko, którego nie trzeba przedstawiać nikomu – twórca języka.

Pierwsza część prezentacji skupia się na przedstawieniu async (znanego od jakiegoś już czasu), potem pojawiają się nowości. Hejlsberg używa tego nowego słowa kluczowego w aplikacji pobierającej informacje z NetFlix’a. Trzeba przyznać, że async oraz await dość znacznie poprawią czytelność kodu. Gdyby ktoś chciał już w chwili obecnej pobawić się tą technologią to jest ona dostępna.

Kolejną zaprezentowaną nowością będą CallerInfo attributes. Umożliwią one pobranie w runtime’ie informacji o kodzie, który wywołuje naszą metodę. Coś jak makra z C++.

Zostaną wprowadzone trzy nowe atrybuty [CallerFilePath], [CallerLineNumber] oraz [CallerMemberName], które możemy nadać dla parametrów metody. Jeśli metoda taka zostanie wywołana bez któregoś z parametrów oznaczonego nowymi atrybutami, zostanie on automatycznie wypełniony odpowiednią informacją.

Kolejną zaprezentowaną nowością jest Roslyn – “upublicznienie” kompilatora C#. Kompilator jako usługa – jak to jest reklamowane. Kompilator nie będzie już czarną skrzynką a zestawem API, który będziemy mogli wykorzystać do jego rozszerzania. Konwersja kodu z VB do C# w Visual Studio? Będzie to możliwe już niedługo za pomocą “skryptu”, który sami sobie napiszemy. Interaktywna konsola w VisualStudio z podpowiadaniem i wprowadzaniem zmian na bieżąco? Proszę bardzo.

Struktura kompilatora w Roslyn

Zobaczymy co z tego wyjdzie, bo pierwsze CTP ma być za około 4 tygodnie. Zapowiada się ciekawie.

Sesja zdecydowanie warta obejrzenia dla wszystkich programistów .NET, choć jeśli ktoś ma dość dobre obycie z async może przewinąć film do mniej więcej 35 minuty.

Miłego poznawania nadchodzących nowości.

For English…scroll down :).

Dziś 13. września – 256. (2^8, 0x100h, 100000000b) dzień roku 🙂

Wszystkim programistom tym na co dzień kodującym w C#, VB, C++ czy Fortranie – wszystkiego najlepszego. Oby nasza praca za rok nadal była (o ile jest?) dla nas przyjemnością.

Miłego programowania w nasze święto!

English version

Today is 13th of September – 256th (2^8, 0x100h, 100000000b) day of the year 🙂

To all programmers – whatever your language of choice is. C#, VB, C++ or Fortran – happy dev’s day :] Let’s hope, in one year’s time, it will still be our passion not only our job!
Happy programming during Programmer’s day!

SysInternals to pakiet znakomitych narzędzi wychodzących spod ręki Marka Russinovicha oraz Bryce’a Cogswella . Choć w nazwie mają Sys – co sugerowałoby ich przeznaczenie administratorskie, to my, skromni programiści także możemy skorzystać z ich funkcjonalności i użyć ich do swoich celów. Dziś pokażę, jak 3 z nich mogą wspomóc pracę developera-poszukiwacza błędów.
Produkcja
Jak wszyscy wiemy jest to takie specyficzne środowisko, że nie zawsze mamy dostęp do swoich ulubionych narzędzi (patrz Visual Studio). Oczywiście nie jesteśmy pozbawieni metod sprawdzenia się co się stało (Debugging na produkcji – VSRD, MDbg, WinDbg). Jednakże podpięcie się debuggerem do naszej aplikacji spowoduje jej zatrzymanie, co niestety nie jest czasem możliwe (czasem nawet wadliwie działająca aplikacja jest lepsza niż nic).

Process Explorer

Czyli Menadżer zadań na sterydach :). Umożliwia przejrzenie procesów i wszystkiego co z nimi związane.
ProcessExplorer
Do czego go zatem możemy wykorzystać? Przede wszystkim w dolnym panelu (jeśli jest niewidoczny trzeba go włączyć View->Show Lower Pane) możemy zobaczyć wszystkie powiązania jakie ma nasza aplikacja. Pliki, klucze rejestru, mutex’y, wątki – etc. Takie szybkie podsumowanie tego, z czego korzysta nasza aplikacja. Prawdziwe jednak morze informacji znajduje się po wyświetleniu właściwości procesu. Naszym oczom ukażą się zakładki eksponujące informacje o procesie aż do bielizny :). Od podstawowych informacji o pliku, przez wydajność procesu (pamięć, CPU, operacje I/O) do listy wątków; a w przypadku .NETowych pokaże nam jeszcze .NETowe mierniki wydajności (jak np. kolekcje GC i inne). Lista wątków dokładnie pokaże nam co w danej chwili robi nasza aplikacja i co zajmuje jej dużo cykli procesora.
Do pobrania ze stron Technet’u – Process Explorer.

Process Monitor

To zastępnik takich narzędzi jak FileMon oraz RegMon. Łączy on w sobie funkcjonalności obu i dodaje multum dodatkowych (obserwowanie ruchu sieciowego czy wątków).
ProcMon
Do czego się przydaje? Pozwala w prosty sposób, po wcześniejszym skonfigurowaniu (bez tego przeglądanie set-tysięcy zdarzeń jest bezcelowe) zobaczyć, co dzieje się w naszej aplikacji podczas jej działania. Tj. jakie pliki są szukane, odczytywane i zapisywane przez nią. Jakie klucze rejestru są przeszukiwane i jakie dane są z nich odczytywane. Dość przydatne aby zdiagnozować powód niedziałania aplikacji.
Ostatnio miałem taką sytuację, że aplikacja na pewnej maszynie nie uruchamiała się wyrzucając tajemniczy wyjątek ‘File Not Found’ w bibliotece zewnętrznej. Brak informacji o tym, jakiego pliku brakowało nie przeszkadzał w jego odnalezieniu. Uruchomienie Process Monitora wraz z jego konfiguracją, tak aby zwracał nam tylko zdarzenia związane z naszą aplikacją oraz tylko te dotyczące plików zajęło mniej niż minutę. Po zebraniu materiału dowodowego został on pogrupowany po rezultacie a następnie wyświetlone zostały tylko te zdarzenia, które miały status ‘Name Not Found’. Bardzo szybko okazało się, że brakującym winowajcą był winusb.dll. Solved!
Do pobrania ze stron TechNet’u – Process Monitor.
Miłego używania i debuggowania!

Wszystko zaczęło się od posta na meta.devmedia.pl (Pytania z devPytań publiczne),
w którym zapytałem o możliwość uzyskania danych, które cała społeczność devPytań stworzyła przez cały czas istnienia portalu. Prośba została dość szybko spełniona (O pewnym sukcesie) i dzięki temu można było usiąść i zobaczyć co też te dane skrywają. Format, w jakim zostały one udostępnione to xml (dzięki temu, można z nich skorzystać, bez względu na bazę danych). Ja jednak zaimportowałem je sobie do MS SQL’a (jak to robiłem pokazane jest w poście – Ku pamięci – Jak zaimportować dane XML).
Aby nie przeciągać – zamieszczam poniżej statystyki, które obliczyłem na dzień dzisiejszy. Być może w przyszłości pojawią się kolejne.

Aktywni użytkownicy portalu (zdobyli choć 1 punkt):

839

 

Suma reputacji wszystkich użytkowników:

119429 – i niestety jest to mniej niż ma sam jeden Jon Skeet ze StackOverflow 🙂

 

Aktywność użytkowników (godzinowa):

godzinki
Widać, że większość preferuje godziny pracy na przesiadywanie na devPytania. Oczywiście w celu poszukiwania informacji na potrzeby pojawiających się problemów.

Odznaki, które nie zostały jeszcze wykorzystane

badges

  • Generalist – Active in many different tags
  • Guru – Accepted answer and voted up 40 times
  • Good Question – Question voted up 25 times
  • Great Question – Question voted up 100 times
  • Good Answer – Answer voted up 25 times
  • Great Answer – Answer voted up 100 times
  • Famous Question – Asked a question with 10,000 views
  • Hacker – Conctributed to Stack Overflow in an unusual way
  • Favorite Question – Question favorited by 25 users
  • Stellar Question – Question favorited by 100 users
  • Populist – Provided an answer that outscored an accepted answer with 10 votes by 2x
  • Pundit – Left 10 comments with score of 10 or more
  • Reversal – Provided answer of +20 score to a question of -5 score
  • Mortarboard – Hit the daily reputation cap for the first time
  • Epic – Hit the daily reputation cap on 50 days
  • Legendary – Hit the daily reputation cap on 150 days

Coś czuję, że z aktywnością naszych użytkowników ciężko będzie osiągnąć te odznaki. Ciekawe, za co można dostać odznakę Hacker? Może za takie posty? 🙂

Procentowy udział użytkowników w całkowitej reputacji portalu

procent

  1. Koziołek    3,99 %
  2. Paweł Łukasik    3,91 %
  3. Gutek    3,66 %
  4. dario-g    3,12 %
  5. Robert Olechowski    2,61 %
  6. Marcin    2,33 %
  7. Procent    2,26 %
  8. Jurek Kozyra    2,04 %
  9. uirapuru    2,02 %
  10. noisy    1,78 %

Widać, że pierwsza dziesiątka użytkowników odpowiada za trochę ponad 27% całości.

Średnia liczba punktów na dzień (w stosunku do czasu na portalu)

pktday

  1. Gutek    8,86
  2. Koziołek    8,78
  3. Paweł Łukasik    8,6
  4. Robert Olechowski    8,00
  5. Jurek Kozyra    7,22
  6. dario-g    6,98
  7. mykhaylo    6,68
  8. Marcin    5,76
  9. Procent    5,07
  10. noisy    5,05

Wbrew pozorom nie zawsze dłuższy staż == więcej punktów na dzień.

Średnia punktów na użytkownika

89,90

Top 10 ilości odznak

top-user-badges

  1. Robert Olechowski  26
  2. Gutek    22
  3. Jurek Kozyra    22
  4. Marcin    22
  5. Eagle    21
  6. andrzejp    20
  7. Koziołek    19
  8. bodziec    18
  9. rafek    18
  10. Paweł Łukasik    18

Top 5 up-vote’ów

21    Procent – Po co to wszystko
20    Koziołek – Lepiej zwracać bool czy rzucać wyjątek
20    wit – Po co to wszystko  
19    vigrid – Ile zarabiacie na freelancingu 
18    Procent – Jakie jest twoje wymarzone miejsce pracy jako programista
Procent z dwoma wiadomościami na czele…. 🙂

Top 5 postów down-vote’ów

-20    MakabrycznyBoo – Książki do nauki programowania na żywych programach   
-11    EWA – Tablica decyzyjna
-9    Inga PITT Bordeaux – Choroby zawodowe programistów? Jak sobie z nimi radzić, jaka profilaktyka?   
-9    Roo – Czy znacie skrypty podobne do stron jak mmwarszawa.pl, naszemiasto.pl/ lub wiadomosci24.pl  
-9    funandmobile – Szukam programistów .NET [zamknięte]

Interesują cię takie statystyki? Chcesz wiedzieć więcej? Zostaw komentarz pod postem.

Ostatnio w komentarzu do posta o IE8 crash pojawił się komentarz o tym, czy możliwe jest takie skonfigurowanie systemu, aby automatycznie wykonywał się dump procesu, który przedwcześnie zakończył swój żywot w systemie. Oczywiście da się coś takiego osiągnąć i w tym poście pokaże jak.

Gdy proces umiera…

Crash
To, co dzieje się w systemie po tym jak aplikacja umiera nie jest na sztywno zaszyte – wręcz przeciwnie bardzo konfigurowalne. Za to, co nam się uruchomi gdy aplikacja przestanie działać odpowiada klucz w rejestrze a dokładniej:
64 bit:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug
32 bit:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

W polu Debugger, możemy wpisać nasz debugger, który może zostać uruchomiony w przypadku wystąpienia crashu aplikacji. Jeśli chcemy, aby były wykonywane zrzuty aplikacji w momencie, gdy przestanie ona działać, wystarczy w polu tym wpisać:
Path\WinDbg.exe” -p %ld –c “.dump /ma /u \CrashDump.dmp;q” -e %ld –g

Dzięki takiemu ustawieniu dump procesu zostanie zrzucony do pliku, a dodanie ;q spowoduje, że WinDbg zakończy działanie. Więcej informacji odnośnie Postmortem debugging można znaleźć w Enabling Postomortem Debugging. Jak prezentuje się całość:

Unable to display content. Adobe Flash is required.

Miłego crashowania!

Bawię się ostatnio publicznymi danymi udostępnionymi z serwisu devPytania (info tutaj O pewnym sukcesie) i już zanim przystąpiłem do próby analizy tych danych pojawił się problem.
Dane zostały udostępnione w formacie XML, który oczywiście mimo wszystkich swoich zalet o przenoszalności i dowolnego jego wykorzystania jest średnio zrozumiały przez MS SQL, które to chciałem zaprząc do tejże analizy. Tak więc pierwszą trudnością było to, jak wczytać takie dane do tabel.
Na sieci można znaleźć sporo postów mówiących, jak rozwiązać ten problem ale większość mówi jak XML’a wczytać po prostu do jednej kolumny bez analizy zawartości i stworzenia tylu wierszy w tabeli, ile głównych node’ów mamy w XMLu.

W końcu po prawie godzinie zmarnowanej na próbowaniu tego czy innego rozwiązania udało się znaleźć działający sposób (OPENXML). Prawie idealny.

DECLARE @idoc int
DECLARE
@doc varchar(max)
SET @doc =''
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement that uses the OPENXML rowset provider.
INSERT Posts SELECT *
FROM OPENXML (@idoc, '/Posts/row',1)
WITH (Id int, PostTypeId int, CreationDate datetime2(7),
Score int, ViewCount, Body ntext, OwnerUserId int, DeletionDate datetime2(7))

Co tu robimy? Na podstawie zmiennej @doc tworzymy dokument XML a następnie za pomocą OPENXML wybieramy odpowiednie elementy. Parametrami tego polecenia są: dokument XML, XPATH do wzorca wiersza jaki będziemy importować oraz flaga mapowania. Ten ostatni parametr zasługuje na krótkie przyjrzenie się mu. Odpowiada on za ustawienie tego, w jaki sposób będą mapowane dane z XMLa na kolumny w bazie.

0 – domyślnie; takie samo jak 1
1 – dane odczytywane z atrybutów
2 – dane odczytywane z elementów
8 – dane nie będą kopiowane do pola @mp:xmltext, które jest wykorzystywane w celach parsowania

Wartości można łączyć logiczną alternatywą. Czyli wg dokumentacji dozwolone są zarówno wartości 1,2 jak i 3,9 oraz 10.

Po wykonaniu takiego zapytania wiersze z pliku znajdą się w tabeli w bazie danych.
A czemu to prawie idealne rozwiązanie? Z dwóch powodów. Po pierwsze zawartość XML’a trzeba wkleić i podstawić do zmiennej @doc. Nie dałem rady zmusić T-SQL’a do zaczytania pliku i podstawiania wartości do tej zmiennej.
Drugi problem to wielkość danych. varchar to w T-SQL 8000 bajtów, tak więc przy większych plikach (a takowym był plik pytań i odpowiedzi) dane należało podzielić na mniejsze paczki ręcznie. Zmiennej typu text nie da rady utworzyć oczywiście.
Ktoś wie jak można to zrobić lepiej/ładniej/szybciej i ominąć te dwa powody?

W pracy często spotykamy się z koniecznością logowania się do wielu serwerów zlokalizowanych w różnych miejscach. A to jakiś sewer buildów w jednej lokacji, a to produkcyjny w drugiej. Do dziś w tym celu miałem odpowiednio skonfigurowane i zapisane skróty do zdalnych pulpitów, ale takie rozwiązanie nie było zbyt wygodne. Ciężko też zarządzać grupą kilkunastu skrótów.

Od dziś przerzuciłem się na narzędzie mRemote. Pozwala ono zebrać w jedno miejsce wszystkie nasze zdalne pulpity, połączenie VNC, SSH i inne (lista obsługiwanych protokołów na stronie). Dzięki niemu, będziemy mogli zdefiniować wszystkie nasze połączenia w jednym miejscu i z niego nimi zarządzać.

mRemote - praca

Aplikacja także umożliwia zrobienie screenshotu ze zdalnego pulpitu (normalnie trzeba się trochę nagimnastykować) a dość często z tego korzystam.

Oczywiście nic nie stoi na przeszkodzie, aby mieć otwarte na raz kilka połączeń i w wygodny sposób przełączać się miedzy nimi za pomocą tabów. Aktualnie siedzę sobie z otwartymi dwoma zdalnymi pulpitami, zakładką pokazującą mi konfigurację mojego NAS’a oraz rutera. Oczywiście narzędzie darmowe. Sweet :).

Kolejny wpis z kategorii ‘nieznanych’. Dziś będzie o okienku Immediate Window. Wszyscy wiemy (?), że można w nim wykonywać wszelkie polecenia, jakie można by napisać w kodzie czyli np. var builder = new System.Text.StringBuilder() i będziemy mogli na tej zmiennej działać.
Ale za pomocą tego okna można napisać także .load sos (było to także możliwe w VS 2008). Co to nam da?
W większości przypadków wyświetli nam komunikat taki jak poniżej.
enable_unmanaged
Aby załadować SOS musimy włączyć unmanaged debugging w ustawieniach projektu.
managed-debugging
A to już da nam więcej. Będziemy mieli dostęp do wszystkich poleceń SOS!
Wtedy będziemy mogli wyświetlić stertę naszej aplikacji. Wystarczy wykonać polecenie !dumpheap –stat i gotowe. Czyli tak naprawdę wyświetlić informacje o wszystkich obiektach w naszym programie.
dumpheap_thumb7
Potem już z górki. Możemy wyświetlić informacje o konkretnej klasie, czyli !dumpheap –mt .
dumpheap2
Schodząc jeszcze niżej konkretnego obiektu: !do 02a0cbbc.
do
Lista poleceń nie ogranicza się tylko do tych wymienionych wyżej i daje dostęp do wszystkich poleceń modułu. Możemy analizować obiekty, kod i stos, struktury runtime’u oraz kilkanaście poleceń diagnostycznych. Pełna lista na zrzucie poniżej lub pod tym linkiem na MSDN.
help
Nice. Miłego SOS’owania.