michu

Reputacja

3,526

Głosów ogółem

użytkownik głosował za tyle razy
297
Użytkownik głosował przeciw tyle razy
33
  • Popularne pytanie
  • Taksonom
  • Samouk
  • Nauczyciel
  • Organizator
  • Zdyscyplinowany
  • Niezła odpowiedź
  • Komentator
  • Student
  • Autobiograf
  • Patrol obywatelski
  • Cofnął głos
  • Krytyk
  • Wsparcie
  • Redaktor
Prawdziwe imię
Michał Chaniewski
Członek od
7 miesięcy, 3 tygodnie
Ostatnio widziany
1 miesiąc temu
Witryna
http://michu3ci...
Miejscowość
Gdynia
Wiek
33

O mnie

Programista od 8 roku życia. Przez pierwsze dwa lata pisałem programy w BASICU na platformie "brulion A4". Przez następny rok rozgryzałem, dlaczego moje programy nie działają po wklepaniu w Atari 65XE. Potem już jakoś poszło...

Motto: "Walking on water and developing software from a specification are easy if both are frozen."

Pytania: 1

Odpowiedzi: 172

  • 2010-02-18 11:56:16 MySQL: kopiowanie pola

    O ile dobrze zrozumiałem, pytanie jest raczej o zmiany w strukturze tabel, a nie o samą replikację danych.

    Tak naprawdę to jest szerszy temat, określany czasem jako zarządzanie konfiguracją (configuration management) - proces którego zadaniem jest utrzymanie spójności systemu w całym jego cyklu życia. W takim najbardziej rozbudowanym zakresie to jest ściśle okreslony proces, składający się ze zdefiniowanych procedur, środowisk testowych itd. Ale nie o tym tutaj, więc tylko sygnalizuję i zachęcam, żeby sobie poczytać.

    Odpowiadając na samo pytanie - ja tego typu rzeczy robię w ten sposób, że każda zmiana na bazie danych jest opisana skryptem SQL. Nieważne czy zaczynam od skryptu pisanego "z palca", czy jest on tworzony za pomocą narzędzia do porównywania struktury baz danych - każda zmiana wersji w moim środowisku programistycznym powoduje powstanie skryptu. Skrypty te zawierają nie tylko instrukcje manipulujące strukturą tabel, ale też np. odpowiednie polecenia update czy insert, które dopasowują w razie potrzeby dane do nowej struktury, czy wypełniają nowo dodane słowniki, itd.

    Taki skrypt ma w nazwie numer wersji, tak zapisany z dopełnieniem zerami, żeby domyślne sortowanie systemu operacyjnego powodowało uporządkowanie w odpowiedniej kolejności (to się przydaje jak musi to przeglądać żywa osoba). Podniesienie bazy danych w środowisku testowym lub produkcyjnym sprowadza się wówczas do wykonania przygotowanych skryptów w kolejności numeracji.

    Do tego dochodzi zapisanie numeru wersji w bazie danych w oddzielnej tabeli - gdy wgrywam nową wersję aplikacji, to porównuje ona wersję bazy danych ze swoją aktualną wersją i automatycznie wykonuje te skrypty wprowadzające niezbędne zmiany.

    Wraz z aktualizacją aplikacji dystrybuuję zawsze wszystkie skrypty przyrostowe począwszy od początkowej wersji bazy danych. To pozwala na aktualizację do najnowszej wersji niezależnie od tego, w jakim stanie, w jakiej wersji znajduje się aktualizowane środowisko.

  • 2010-02-17 08:51:26 Konkurs - wyniki 3 etapu

    Gratulacje chłopaki. Dobra robota :)

  • 2010-02-16 14:36:54 MySQL - szybkość zapytania.

    COUNT(*) i COUNT(kolumna) są równoważne jeżeli na kolumna jest NOT NULL. W przypadku COUNT(kolumna2), jeżeli kolumna2 dopuszcza wartości NULL, to silnik bazy danych wykona full table scan lub skorzysta z indeksu, aby podać liczbę wierszy dla których kolumna2 nie jest pusta.

  • 2010-02-15 10:50:10 Generowanie CSS

    Samo dynamiczne generowanie CSS w sumie ma trochę sensu - choćby dlatego, że można wówczas używać choćby i zmiennych, co pozwala na łatwe zmodyfikowanie koloru w kilku miejscach itd...

    Rzuć okiem na ciekawy preprocessor do CSS o nazwie Less - wersja dla PHP jest tutaj.

    Jeżeli zaś chodzi o samo prezentowanie różnych arkuszy stylów dla różnych przeglądarek, to moim zdaniem najlepiej jest przygotować bazowy arkusz dla wszystkich, a potem za pomocą tzw. komentarzy warunkowych dołączać tylko arkusz nadpisujący to, co w przypadku IE modyfikacji wymaga. PHP do tego akurat nie potrzeba. Składnia wygląda tak:

    <!–[if IE 6]>
    <link href=”../ie6.css” rel=”stylesheet” ………. />
    <![endif]–>
    

    Więcej, z przykładami jak rozpoznawać różne wersje IE, tutaj.

  • 2010-02-06 16:38:53 Server dedykowany - win IIS7

    Nigdy nie miałem problemów z ofertą OVH i szczerze polecam. Powinieneś się zmieścić w budżecie. Ta sama firma ma też markę "niskobudżetową" kimsufi - oferty różnią się nieco budową maszyn i opcjami supportu. Tam jest jeszcze taniej, a w sumie też całkiem dobrze (używałem, problemów nie stwierdziłem).

  • 2010-02-06 16:30:27 [C#] Wykorzystanie BindingSource w module logowania.

    Trochę masz niewłaściwy design tego czegoś. Bindowanie pól służących do wprowadzenia nazwy użytkownika i hasła do datasetu nie ma najmniejszego sensu - naprawdę chcesz zaciągnąć wszystkich użytkowników wraz z hasłami do aplikacji i sprawdzać lokalnie, czy któraś z par nazwa/hasło się zgadza?

    (BTW, wiesz że DataSet to lokalny cache danych, offline względem bazy, a nie odpowiednik kursoro-podobnych klas z Delphi?)

    W .NET Framework nie ma klas, które by miały funkcjonalność zbliżoną do Locate z Delphi. Tu raczej musisz przygotować zapytanie - czy to za pomocą SqlCommand, czy to przez LINQ - i wywołać je względem bazy danych, po czym sprawdzić co dostaniesz w rezultacie. Po prostu inaczej to działa.

    Tak czy inaczej - jak zawsze zachęcam do przyjrzenia się jakiejś bibliotece ORM z prawdziwego zdarzenia, np. NHibernate, która zdejmuje z głowy wiele problemów związanych z dostępem do danych.

  • 2010-02-06 00:17:56 Uniemozliwienie wywolania konstructora kopiowania w C++

    Nie jestem specem od C++, w C# można mieć prywatne konstruktory - w C++ nie?

  • 2010-02-06 00:15:07 Na ile sposobów można wydać 100 zł? :)

    Najprościej chyba przez rekurencję. Zaczynasz od 0, w pętli jedziesz po nominałach które nie powodują przekroczenia sumy i dla każdego z tych nominałów wywołujesz rekurencyjnie przekazując jako parametr bieżącą sumę i listę dotychczasowych nominałów. Po osiągnięciu sumy 100 zł wypisujesz listę.

    Głębokość rekurencji nie przekroczy 100, więc nie ma problemu ze stosem. Jedyne co może być problematyczne, to że wyniki będą się powtarzać, różniąc tylko kolejnością nominałów. Możesz ten problem zniwelować zaczynając pętlę wewnątrz procedury rekurencyjnej od ostatniego nominału użytego na poprzednim poziomie rekurencji - wtedy ciągi będą zawsze malejące.

    EDIT: Rozwiązanie w C# wygląda jakoś tak:

    class Kasjer
    {
        private readonly int[] _nominaly = new int[] {1, 2, 5, 10, 20, 50, 100};
    
        public void Wydaj(int suma)
        {
            Wydaj(suma, 0, new int[suma], -1);
        }
    
        private void Wydaj(int suma, int wydane, int[] ostatnie, int liczba)
        {
            foreach(int nominal in _nominaly)
            {
                if (liczba != -1 && nominal < ostatnie[liczba])
                    continue;
    
                if(wydane + nominal > suma)
                    break;
    
                if(wydane + nominal == suma)
                {
                    for(int i=0; i<=liczba; i++)
                    {
                        Console.Write(ostatnie[i] + ",");
                    }
                    Console.Write(nominal);
                    Console.WriteLine();
                    Console.WriteLine();
                    break;
                }
    
                ostatnie[liczba+1] = nominal;
                Wydaj(suma, wydane + nominal, ostatnie, liczba+1);                    
            }
        }
    }
    

    Wywołanie rzecz jasna przez

    Kasjer k = new Kasjer();
    k.Wydaj(100);
    

  • 2010-02-05 23:02:26 Co po pracy...?

    Chyba oczywiste... sex, drugs & rock'n'roll :)

    A tak na serio to kilka rzeczy - lubię pomajsterkować (począwszy od modeli, przez kolumny głośnikowe, po coraz to kolejne zabudowy wnęk, znaczy się szafy, dla coraz to kolejnych znajomych).

    Muzyka. Choć ona towarzyszy mi zawsze, również w pracy.

    Fotografia. W zasadzie na pierwszym miejscu.

    No i ciekawe spotkania w dobrym towarzystwie :)

    A do tego czasem dobra książka, sauna, jazda na rowerku, podróże...

    Natomiast to czego nie robię, to oglądanie telewizji - już dobre 15 lat. Czasem tylko jakiś wyselekcjonowany film.

  • 2010-02-05 22:06:28 Czy robicie wireframe i w czym?

    Używam regularnie Balsamiq Mockups - program jest wart każdego wydanego nań dolara. Pozwala na szybkie naszkicowanie interfejsu, nawet podczas posiedzenia z klientem. W zasadzie żaden projekt posiadający interfejs użytkownika nie może się obyć bez jakiejś fazy projektowania - dla mnie to jest idealne narzędzie.

    Szkicowy wygląd zaprojektowanego w nim interfejsu to ogromna zaleta - nie zdarza mi się już że klient przyjdzie i będzie chciał oglądać coś, co nie jest jeszcze zrobione, bo "jak to, już mi pan przecież pokazywał"...

    Co do workflow - na ogół pracuję w niedużych zespołach, gdzie z klientem siedzi analityk lub programista i sobie w tym dłubią. Często jestem to po prostu ja. To jest narzędzie do szkicowania, nie projektowania - za konkrety zabiera się potem designer (lub ktoś z zespołu, znów, czasem ja) jeżeli nie ma potrzeby (lub budżetu) na profesjonalne projektowanie graficzne.