Month: April 2016

Git – bardzo duża zmiana/migracja/grzebanie w gównie – jak sobie poradzić

Posted on Updated on

Zaletą GITa jest commitowanie lokalne krok po kroku. Taki powtarzający się w kółko schemat:

– kodujemy kawałek
– sprawdzamy czy działa
– commitujemy (dodatkowo dając coś mówiący opis)

Gdy to coś co zmieniamy jest duuuże i trudno ogarnialne bo będą występować sytuacje gdzie:
– doszliśmy do miejsca, które jest ślepą uliczką – trzeba się wrócić kilka commitów bo w ten sposób “się nie da”
– inna rzecz się wywaliła która nie powinna – wtedy możemy przejść wstecz historię lokalnych commitów i zobaczyc w którym miejscu coś się wywala (jeszcze lepsze jest szukanie połówkowe git-bisect)

Use cases

Podniesie do kolejnej wersji GoogleMaps – kolega miał kiedyś coś takiego. Na starej stronie było GoogleMaps api w wersji 1, a Google zarzucił już wsparcie. Trzeba było podnieść do wspieranej wersji. Kod był taki, że można się ciąć – zero reużywalności kodu, logika JavaScript zawarta na stronach ASP.NET Web Forms (brak oddzielnych plików *.js). Coś napisanego ponad dekadę temu, nieużywanego od lat o czym wszyscy chcieli zapomnieć, a tu klientowi się wysypało i trzeba zrobić. Bez chodzenia krok po kroku, commit po commicie nie wyobrażam sobie tego zadania.

Migracja do Entity Framework Code First – też krok po kroku, wiele rzeczy może nie zadziałać, Research, poprawanie, etc.

Z jakim kodem zakończyć?

Na koniec gdy juz mamy ostateczny efekt możemy zrobić kilka rzeczy
– zrobić z tego jeden wielki commit – wygląda na brute force, ale nie jest to taka zła opcja. Oczywiście przeglądamy taki commit czy nie powinniśmy czegoś poprawić czy wyrzucić.
– powiązać commity w sensowe kilka commitów zmieniających jakieś oddzielne componenty – jest to trudniejsze, bo wymaga wprawy w operowaniu gitem.

GitKraken – wreszcie dobry UI dla GITa

Posted on

Wreszcie jest dobry klient GITa dla klikaczy – https://www.gitkraken.com. Dopiero co wystartowała wersja 1.0. Więc jeszcze nie ma wszystkich feature które ma np Source Tree, jak na przykład “rebase interactive”, ale wkrótce zostaną dodane. Myślę tutaj o takich bardziej zaawansowanych rzeczach bo do zwykłej pracy jak commit, amend, przechodzenie między branchami, cherry-pick, przeglądanie historii, stage wybranych fragmentów pliku nadaje się znakomicie.

Instalacja

Ściągamy najnowszą wersję i konfigurujemy. W zasadzie konfiguracja sprowadza się do wpisania emaila i nazwy użytkownika. Pozostałe rzeczy warto przeklikać tam gdzie nas prowadzą strzałki tylko po to żeby wiedzieć później że takie ustawienia są. Nie przejmujemy się niczym więcej.

Czy jest darmowy

Na tą wersję tak. Kod nie jest open source. Jak sama firma o tym pisze to pewnie kiedyś zrobią wersję płatną która będzie mieć dodatkowe bajery. Zakładam więc, że dla zwykłych zastowowań (czyli i tak 300% tego użytkownik co SVN wie o sposobach pracy z kodem), wersja zawsze będzie darmowa.

GeneratedCodeAttribute

Posted on Updated on

Korzystam właśnie z EntityFramework-Reverse-POCO-Code-First-Generator. Ten tool generuje do każdej klasy atrybut mówiący, że kod był wygenerowany. Wygląda to tak:

[GeneratedCode("EF.Reverse.POCO.Generator", "2.19.1.0")]
public class User
{
}

I nawet mimo że wiem że będą ostatecznie przerabiać te klasy to zostawię ten atrybut, żeby następni developerzy którzy może kiedyś zajrzą, wiedzieli o takim toolu. Rozwiązanie godne polecenia 🙂

TypeScript – pierwsze kroki

Posted on Updated on

Piszę w Angularze 1.5 korzystając z TypeScript. Adoptuję TypeScript. Opiszę rzeczy które mi się przydarzyły przydarzają.

  • Update EcmaScript, z es5 na es6. Więcej fajnych rzeczy można wykorzystać np ‘let’ i ‘const’. Trzeba było całkowicie wyrzucić plik es6-promise.d.ts., po prostu toole czasem mają problem i R# trzeba explicite ustawić wersję TS z której korzystamy, rozwiazanie: http://stackoverflow.com/questions/34127195/false-positive-lexical-declarations-require-ecmascript-6-and-typescript-1-x-f
  • Korzystanie ‘let‘ vs ‘var‘. Let daje name block scope zamiast function scope (var). Jest to bardziej naturalne i unika się wielu problemów. Nigdy nie stosować ‘var’.
  • Korzystanie ‘const‘ vs ‘let‘. Const nie jest immutable w ten sposób w jaki rozumiemy to z języków funkcyjnych. Jedyne przed czym chroni to powtórne przypisanie czegoś do stałej, ale już wszystkie jej właściwości zmieniamy do woli. Używam ‘let’ do obiektów i tablic, natomiast ‘const’ do typów prymitywnych. Inspiracja How much should I be using ‘let’ vs ‘const’ in ES6? . Trzeba też wyłączyć sugerowanie let->const w R# czy tam VS.
  • Konwencje nazewnicze: http://stackoverflow.com/questions/15748734/angular-js-naming-conventions-camelcase-and-pascalcase, PascalCase (z Wielkiej) dla Controllerów i innych które mają konstruktor i będa instancjonowane poprzez new – jest to zgodne z ogólną praktyką w JS. Pozostałe camelcase (z małej).
  • git i traktowanie *.ts jako nietekstowych
  • Konwencje i sposoby organizacji kodu z https://github.com/toddmotto/angular-styleguide
  • controllerAs ‘vm’ syntax, opisane w rozdziale o kontrollerach z poprzedniego punktu, ale jest to bardzo ważne więc powtarzam
  • należy unikać przypisywania zmiennych do i ze $scope (co rozwiązują powyższe punkty), jeśli już jednak nie mamy innych możliwości to warto “przetypować” sobie wszystkie zmienne od razu. Np
    this.controller = function ($scope) {
        let article: ArticleViewModel = $scope.article;
        let articleLink: ArticleLinkViewModel = $scope.articleLink;
        
        // typesafe using of variables
    }
    

Double vs single quotes – jakie ciapki w TypeScript/JavaScript

Posted on

W HTMLu zawsze podwójne:

href="/edit/2" class="btn btn-primary"

W JSON zawsze podwójne:

{name: "Marek"}

Chyba będę w JS poczytał z pojedynczych. Większość przykładów i kodu który ściągam korzysta właśnie z pojedynczych cudzysłowów (ciapków).
Dzięki temu też można w takich pojedynczych ciapkach pisać kod html który będzie miał podwójne ciapki:

let element = '<div class="wide"><a href="/edit">Edit</a></div>';

Jak to rozwiązał team rozwijający TypeScripta

Why use double quotes for strings
i dwie najciekawsze odpowiedzi:

But to specifically answer your question, we occasionally work in languages other than TypeScript. All those languages either require double quotes for strings (e.g. C#, C++, F#) or at least allow double quotes for strings (e.g. Python, Ruby). It’s easier not to ask people to shift their muscle memory when switching back and forth between languages.

One of the most common head-scratching problems with JSON is “why can’t my JSON file be parsed?” and an hour later you’ll find out single-quoted strings aren’t part of the JSON standard.

So double quotes have the least cognitive burden for us on the team. Hope that answers your question!

we decided to ban single quotes after a day of full text searching for
“width” in code and not being able to find it because it was written ‘width’

Project “Utils” w solucji

Posted on

Gdzieś na samym szczycie zależności między projektami w naszej solucji mógłby się znaleźć projekt narzędziowy “Utils” (lepsza nazwa niż “Helpers”). Wszystkie inne projekty powinny mieć do niego dostęp. W takim projekcie powinny się znaleźć rzeczy NIE-zależne od naszej domeny, czyli niezwiązane bezpośrednio z zadaniami jakie nasza aplikacja ma spełniać. Kilka przykładów.

  • Extension methody. Np metody rozszerzające jakieś biblioteki, przykład https://gist.github.com/kmorcinek/64641a11a4cd5b8c18d8 – te metody nie mają nic wspolnego z żadną konkretną aplikacją.
  • Metody logujące dodatkowe rzeczy, mierzące czasy itp (Diagnostyka)
  • to me done, wip