piątek, 29 sierpnia 2014

SQL Update dst set xyz, from src

Jest to wzór przykładowego update tabeli w t-sql, w oparciu o wyniki innej tabeli, z innej bazy danych. Często go stosuję,  a ciągle zapominam tej składni, więc... postanowiłem to sobie zachować "na przechowanie".


USE [dstInstancja]
GO

UPDATE dst
   SET [zakup] = src.[zakup]
          ,[oplata] = src.[oplata]
 FROM [dbo].[typ_transakcji] dst join [SRVxy\NazwaSerwera].[srcInstancja].[dbo].[typ_transakcji] src
 on dst.Id = src.Id

GO

środa, 20 sierpnia 2014

??

Od jakiegoś czasu mam okazję korzystać z ReSharpera (kto jeszcze nie zna tego pluginu, to niech jak najszybciej nadrobi zaległości) i dzisiaj podpowiedział mi pewną fajną, nieznaną mi wcześniej konstrukcję języka C#

Zamiast klasycznego:
var y = x.ProductName != null ? x.ProductName : string.Empty;

Można zastosować
var y = x.ProductName ?? string.Empty;

Krótszy i czytelniejszy kod zawsze na propsie, więc jak dla mnie jest git.

sobota, 2 sierpnia 2014

Console2, czyli ulepszony cmd.exe

Jak to napisał Roy Osherove na swoim twitterze:
If you’re using git from the vs menus, you’re not getting out of your comfort zone and not really learning a new skill.

Konsola i skrypty bashowe to potężne narzędzie. Wiedzą o tym linuksiarze, ale również i w świecie M$ ręczne wpisywanie komend powoli wraca do łask. Zaczynając od informacji administracyjnych, poprzez korzystanie z Git'a oraz Bash'a, na korzystaniu z NuGet'a kończąc (wewnętrzna konsola VS). Konsola w wielu przypadkach potrafi być bardzo użyteczna. Ale czy skazani jesteśmy na standardowe cmd.exe? Nie koniecznie. Na szczęcie są dostępne na rynku różne nakładki, które rozbudowują jej funkcjonalność. Jedną z takich nakładek na cmd.exe, jest opisana przez Scotta Hanselmana 'Console2'.

Po więcej informacji szczegółowych, odsyłam do bloga Scotta: Console2ABetterWindowsCommandPrompt

Od siebie dodam jeszcze, że w połączeniu z Git-em sprawuje się naprawdę fajnie (swobodny resize, konfigurowanie kolorów pod Git'a i wiele innych bajerów).
Generalnie, takie nowe, fajniejsze cmd.exe.

P.S. Do korzystania z konsoli przekonał mnie Mateusz, czyli mój nowy kolega w zespole
P.S.2 Krótki "mini tutorial" jak dodać skrót "git'a" do cmd (Mój komputer -> zaawansowane ustawienia systemu -> Zaawansowane -> Zamienne środowiskowe -> Path -> dopisujemy naszą ścieżkę, w której mamy Gita).


P.S.3 Plik konfiguracyjny, zachowany dla potomności:


<?xml version="1.0"?>
<settings>
    <console change_refresh="10" refresh="100" rows="36" columns="104" buffer_rows="500" buffer_columns="0" shell="" init_dir="C:\Users\zchpit" start_hidden="0" save_size="1">
        <colors>
            <color id="0" r="0" g="0" b="0"/>
            <color id="1" r="0" g="0" b="128"/>
            <color id="2" r="0" g="150" b="0"/>
            <color id="3" r="0" g="150" b="150"/>
            <color id="4" r="170" g="25" b="25"/>
            <color id="5" r="128" g="0" b="128"/>
            <color id="6" r="128" g="128" b="0"/>
            <color id="7" r="192" g="192" b="192"/>
            <color id="8" r="128" g="128" b="128"/>
            <color id="9" r="0" g="100" b="255"/>
            <color id="10" r="0" g="255" b="0"/>
            <color id="11" r="0" g="255" b="255"/>
            <color id="12" r="255" g="50" b="50"/>
            <color id="13" r="255" g="0" b="255"/>
            <color id="14" r="255" g="255" b="0"/>
            <color id="15" r="255" g="255" b="255"/>
        </colors>
    </console>
    <appearance>
        <font name="Consolas" size="15" bold="0" italic="0" smoothing="0">
            <color use="0" r="0" g="255" b="0"/>
        </font>
        <window title="Console" icon="" use_tab_icon="1" use_console_title="0" show_cmd="1" show_cmd_tabs="1" use_tab_title="1" trim_tab_titles="20" trim_tab_titles_right="0"/>
        <controls show_menu="0" show_toolbar="0" show_statusbar="0" show_tabs="1" hide_single_tab="1" show_scrollbars="1" flat_scrollbars="0" tabs_on_bottom="1"/>
        <styles caption="1" resizable="1" taskbar_button="1" border="1" inside_border="2" tray_icon="1">
            <selection_color r="255" g="255" b="255"/>
        </styles>
        <position x="-1" y="-1" dock="-1" snap="0" z_order="0" save_position="0"/>
        <transparency type="1" active_alpha="215" inactive_alpha="215" r="0" g="0" b="0"/>
    </appearance>
    <behavior>
        <copy_paste copy_on_select="1" clear_on_copy="1" no_wrap="1" trim_spaces="1" copy_newline_char="0" sensitive_copy="1"/>
        <scroll page_scroll_rows="0"/>
        <tab_highlight flashes="3" stay_highligted="1"/>
    </behavior>
    <hotkeys use_scroll_lock="1">
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="83" command="settings"/>
        <hotkey ctrl="0" shift="0" alt="0" extended="0" code="112" command="help"/>
        <hotkey ctrl="0" shift="0" alt="1" extended="0" code="115" command="exit"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="84" command="newtab1"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="113" command="newtab2"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="114" command="newtab3"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="115" command="newtab4"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="116" command="newtab5"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="117" command="newtab6"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="118" command="newtab7"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="119" command="newtab8"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="120" command="newtab9"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="121" command="newtab10"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="49" command="switchtab1"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="50" command="switchtab2"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="51" command="switchtab3"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="52" command="switchtab4"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="53" command="switchtab5"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="54" command="switchtab6"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="55" command="switchtab7"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="56" command="switchtab8"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="57" command="switchtab9"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="48" command="switchtab10"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="9" command="nexttab"/>
        <hotkey ctrl="1" shift="1" alt="0" extended="0" code="9" command="prevtab"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="87" command="closetab"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="0" code="82" command="renametab"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="1" code="45" command="copy"/>
        <hotkey ctrl="1" shift="0" alt="0" extended="1" code="46" command="clear_selection"/>
        <hotkey ctrl="0" shift="1" alt="0" extended="1" code="45" command="paste"/>
        <hotkey ctrl="0" shift="0" alt="0" extended="0" code="0" command="stopscroll"/>
        <hotkey ctrl="0" shift="0" alt="0" extended="0" code="0" command="scrollrowup"/>
        <hotkey ctrl="0" shift="0" alt="0" extended="0" code="0" command="scrollrowdown"/>
        <hotkey ctrl="0" shift="0" alt="0" extended="0" code="0" command="scrollpageup"/>
        <hotkey ctrl="0" shift="0" alt="0" extended="0" code="0" command="scrollpagedown"/>
        <hotkey ctrl="0" shift="0" alt="0" extended="0" code="0" command="scrollcolleft"/>
        <hotkey ctrl="0" shift="0" alt="0" extended="0" code="0" command="scrollcolright"/>
        <hotkey ctrl="0" shift="0" alt="0" extended="0" code="0" command="scrollpageleft"/>
        <hotkey ctrl="0" shift="0" alt="0" extended="0" code="0" command="scrollpageright"/>
        <hotkey ctrl="1" shift="1" alt="0" extended="0" code="112" command="dumpbuffer"/>
        <hotkey ctrl="0" shift="0" alt="0" extended="0" code="0" command="activate"/>
    </hotkeys>
    <mouse>
        <actions>
            <action ctrl="0" shift="0" alt="0" button="1" name="copy"/>
            <action ctrl="0" shift="0" alt="0" button="1" name="select"/>
            <action ctrl="0" shift="0" alt="0" button="3" name="paste"/>
            <action ctrl="1" shift="0" alt="0" button="1" name="drag"/>
            <action ctrl="0" shift="0" alt="0" button="2" name="menu"/>
        </actions>
    </mouse>
    <tabs>
        <tab title="Console2" use_default_icon="0">
            <console shell="" init_dir="" run_as_user="0" user=""/>
            <cursor style="0" r="255" g="255" b="255"/>
            <background type="0" r="0" g="0" b="0">
                <image file="" relative="0" extend="0" position="0">
                    <tint opacity="0" r="0" g="0" b="0"/>
                </image>
            </background>
        </tab>
        <tab title="PowerShell" use_default_icon="0">
            <console shell="C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" init_dir="C:\Users\zchpit" run_as_user="0" user=""/>
            <cursor style="0" r="255" g="255" b="255"/>
            <background type="0" r="0" g="0" b="0">
                <image file="" relative="0" extend="0" position="0">
                    <tint opacity="0" r="0" g="0" b="0"/>
                </image>
            </background>
        </tab>
    </tabs>
</settings>

Polecane laptopy/netbooki

Całkiem niedawno miałem problem z moim laptopem. Całe szczęście, problem dotyczył jedynie modułu zasilania mojego laptopa i  do przywrocenia go do stanu używalności wystaczyła wizyta w serwisie komputerowym. Nie zmienia to jednak faktu, że przez moment liczyłem się z koniecznością zakupu nowego sprzętu. I powiem, miałem z tym niemały ból głowy. Jaki laptop wybrać, skoro zgodnie z prawem Moora moc obliczeniowa komputerów podwaja się co każde 2 lata?

Co więc zrobiłem? Zapytałem się znajomego z "help desku", który w sprzęcie siedzi na co dzień. I jaką odp. dostałem? Że nawet on tego wszystkiego nie ogarnia bo zmiany idą za szybko. Za to skierował mnie na fora branżowe. Pomocny okazał się mój nowy kolega w zespole , który podesłał mi link do forum PC FORMAT, na którym to analizują aktualnie dostępne komputery i analizują na bierząco co się opłaca kupować link.

Dodatkowo, na tym forum raz w mieś. pojawia się temat z "zestawieniem miesiąca". Link do aktualnego zestawienia (lipiec 2014)

P.S. Gdyby ktoś potrzebował namiary na sprawdzony serwis komputerowy na Mokotowie, to polecam Centrum Serwisowe MAGNUS  na Puławskiej 107D

Trello

Kolejnym fajnym narzędziem, którego stosowanie warto jest rozważyć jest trello. Trello jest darmową aplikacją internetową, spełniającą rolę znanej i lubianej "tablicy z mazakami/karteczkami". "Tablica z karteczkami" to nic innego, jak stojąca w pokoju tablica z karteczkami, ewentualnie tablica z pisakami, na której wpisuje się zadania (najczęśniej są to nr. zgłoszeń z bugtrackera), osoby do których są przypisane, oraz stan danego zadania (todo, doing, done). W ten sposób, managment wchodząc do pokoju, jest w stanie ocenić "stan aktualnych prac" bez przerywania pracy programisty. Z zastosowaniem trello, nawet nie musi wchodzić do pokoju :D

O ile niektóre, rozbudowane 'bugtrackery" posiadają wbudowaną podobną funkcjonalność lub można ją dokupić (np jira), o tyle wielu z nich nadal im tego brakuje. Jedną z zalet trello jest fakt, ze w podstawowej wersji jest w pełni darmowe (syst. płatności oparty o mikropłatności za rozszerzenia).

Kolejną zaletą, która mi się osobiście spodobało, to pełna integracja z kontem  google (gmail), dzięki czemu nie muszę pamiętać dodatkowego hasła. Wprawdzie przy stosowaniu keepass teoretycznie nie muszę, ale mimo wszystko dla mnie takie rozwiązanie jest dużo wygodniejsze ;)).

P.S. Trello można też używać w życiu prywatnym, np. do kontrolowania prac związanych z remontem/zakupem mieszkania lub innych czynności dających podzielić się na mniejsze, skończone taski ;-)

MS SQL - DEADLOCK

Czasami zdarzy nam się, że procesy pracujące na bazie danych mogą się zakleszczyć. Nie wdając się w szczegóły, chodzi o równoczesne blokowanie jednych zasobów, oczekując na zwolnienie pozostałych. Szerzej to zagadnienie zostało opisane jako problem ucztujących filozofów.

A co, gdy taka syt. zdarzy nam sie na bazie danych?
a) dobrze by było się dowiedzieć, dlaczego dochodzi do zakleszczeń (np. sql profiler)
b) pomyśleć nad zmianą poziomu izolacji tranzakcji
c) wyśledzić odpowiedni proces za pomocą sp_who2 a nast. ubić zawieszony process, odblokowując tym samym zasoby dla innych procesów
exec sp_who2
kill SPID
 

czwartek, 31 lipca 2014

Rekruter

W czerwcu oraz na pocz. lipca miałem okazję uczestniczyć podczas rozmów kwalifikacyjnych na stanowisko młodszego programisty .NET (junior developer). Było to dla mnie spojrzenie na proces rekrutacji z tej nieco innej strony.  Jako, że od mojej opinii o kandydacie również nieco zależało, więc postaram się opisać moje wrażenia z tego procesu po "tej drugiej stronie".

Najpierw umieściliśmy ogłoszenie na kilku przeznaczonych do tego stronach oraz ulotki na kilku Warszawskich uczelniach. Po jakimś czasie, gdy pojawiła się grupa na fb o wdzięcznej nazwie netDevelopersPolandJobMarket to umieściłem tam nasze ogłoszenie z "widełkami płacowymi" oraz nieco większą ilością szczegółów nt. tego stanowiska (stos. technologia, zakres obowiązków itp. itd.).

A jak wyglądała sama rozmowa?
a) krótka, 5-20 min. rozmowa, podczas której my (Ja oraz dyrektor IT) opowiadaliśmy o firmie, naszym dziale IT, tym czym ewentualnie zajmował by się kandydat. Zadawaliśmy też kilka pytań nt. CV, które podesłał nam kandydat.
b) 30 min. codding test na laptopie w mojej obecności
c) "pytania z kartki", czyli mniej lub bardziej szczegółowe "pytania otwarte" nt. C#, .NET, MS SQL itp. itd.
d) ewentualna dalsza rozmowa z szefem IT

Zadania praktyczne były 4. Dwa z SQL oraz dwa z C#. Zadania były o zróżnicowanym stopniu trudności. Wydawało mi się, ze te z C# są trudniejsze, ale tylko do momentu, gdy jeden z kandydatów przyznał się, ze jedno z zadań mieli w SGGW na egaminie ;-)
To co mnie osobiście mocno zaskoczyło to... bardzo słaba znajomość T-SQL wśród kandydatów, którzy byli przepytywani. Dwie os., które "kumały cza-czę" zrobiły oba zadania w ok. 5-6 min. (mniej więcej ok 2-3 min. na zadanie). Niestety ponad połowa kandydatów nie zrobiła zadań z SQL w ogóle.

Z pytaniami "otwartymi" zazwyczaj było całkiem nieźle. Była to też okazja do "bardziej wnikliwego" porozmawiania z kandydatami (tymi co przeszli codding test). Podczas tej rozmowy, oprócz samych odp. na pytania, celem było też zwykłe poznanie kandydata. Tego, czy się interesuje technologią i w czym czuje się mocny, ale też, czy można z nim normalnie porozmawiać i czy da się z nim wytrzymać 8h*5 dni w tyg.

Jak ktoś przeszedł wszystkie etapy w miarę ok (codding test, pytania otwarte, sposób bycia) to zostawał na rozmowę z dyrektorem IT.

Wnioski:
a) 30 min. siedzenia i patrzenia jak ktoś koduje, to jednak zdecydowanie zbyt dużo zmarnowanego mojego czasu. Dobrze było by ten proces jakoś zautomatyzować, ale pozostając przy zadaniach praktycznych. Może jakieś codility, ale któreś z tych podst. poziomów trudności (ponieważ te wyższe zazwyczaj niewiele mają wspólnego z praktyką zastaną później w realnym życiu).
b) najlepszy możliwy kandydat, jaki nam się pojawił, przyszedł na rozmowe po umieszczeniu ogłoszenia o pracę na grupie fb (ogłsozenie z zakresem obowiązków, stos. technologią oraz widełkami płacowymi).