lqc

Reputacja

3,965

Głosów ogółem

użytkownik głosował za tyle razy
142
Użytkownik głosował przeciw tyle razy
95
  • Popularne pytanie
  • Roczniak
  • Niezła odpowiedź
  • Samouk
  • Cofnął głos
  • Autobiograf
  • Patrol obywatelski
  • Komentator
  • Student
  • Krytyk
  • Wsparcie
  • Redaktor
Prawdziwe imię
Łukasz
Członek od
2 lata, 4 miesiące
Ostatnio widziany
4 miesiące, 2 tygodnie temu
Witryna
http://www.goog...
Miejscowość
Warszawa
Wiek
26

O mnie

Ostatnio webdeveloper Django :)

Pytania: 1

Odpowiedzi: 152

  • 2010-02-07 00:14:07 Czy używacie repozytorium kodu?

    Jeśli sobie pomyślisz, że jutro twój dysk twardy padnie, komputer zaleją ci sąsiedzi lub nastąpi inna katastrofa to chyba odpowiedź jest jasna. Jeszcze są ukryte katastrofy pt. "Wczoraj działało, zmieniłem tylko jedną linijkę, nie działa i nie mogę naprawić".

    Dlatego od dłuższego czasu korzystam z VCS również w prywatnych projektach (w pracy to praktycznie obowiązek). Aby się uchronić przed utratą danych związaną z awarią mojego komputera (jestem za leniwy, żeby robić backupy na płytki) polecam któryś z tych serwisów:

    Update: tutaj jest wersja Git dla Windows nie wymagająca Cygwina.

  • 2010-02-02 11:59:41 Znajdowanie zależności w tablicy

    Jeżeli nie masz jakiegoś ograniczenia na to jaka jest ta zależność (np. linowa, wielomiany, funkcje elementarne), to problem jest raczej nierozstrzygalny, a już na pewno nie jest jednoznaczny, bo w końcu to tylko 100000 elementów.

    Niech pod indeksem k, znajduje się wartość a_k. Weźmy:

    L_k(x) = (x-1)(x-2)...(x-k+1)(x-k-1)...(x-100000)/(k-1)(k-2)...(k-100000)
    L_k(i) = 0, dla każdego i != k
    L_k(k) = 1
    

    Wystarczy wziąć ∑k100000akLk(x) i już masz wielomian opisujący tę tablicę.

    Jest to algorytm generowania tablicy jak każdy inny. Ma po prostu 100000 parametrów, tylko które mogłem sobie wziąć z sufitu.

    Seed i losowe liczby

    Nadal tego jakoś nie widzę. Szansę na sukces masz tylko jeśli okres tego PRNG jest mniejszy niż 100000. Wtedy możesz znaleźć cykl w tej tablicy. Ale w sumie też nie masz pewności, bo może raz na 300000 elementów seed jest przesuwany cyklicznie o 1. Pewności nigdy nie możesz mieć.

  • 2010-03-13 01:58:30 Własne wycinki w Pythonie

    Istnieje typ wbudowany slice. Jest on używany w następujący sposób.

    slownik[1:10:2]
    

    Zamieniane jest na:

    slownik.__getitem__(slice(1, 10, 2))
    

    Ma on trzy atrybuty: start, stop, step i metodę indices(N), która dla danego N (np. długości listy, której mają dotyczyć indeksy) zwraca trójkę nadającą się do przekazania dla range().

    Tak więc, jeśli chcesz obsługiwać wycinanie:

    class A(object): # new-style class
        def __getitem__(self, index):
            if isinstance(index, slice):
                #oblicz wycinek
            elif isinstance(index, int):
                # oblicz n-ty element
            else:
                raise TypeError # nie obsługuj indeksów innych typów, np. napisów
    

    Tak naprawdę nie ma żadnego ograniczenia na argumenty dla __getitem__. Zapis [:] to tylko skrót. Na przykład dla macierzy wielowymiarowych wygodnie jest wprowadzić zapis typu:

    M[1, 2, 9]    
    M[..., 5] # elementy w wierszu 5 w ostatnim wymiarze
    

  • 2010-02-12 12:01:16 Odświeżenie starego kodu HTML

    Nie rozumiem zbytnio idei poprawiania dla samego poprawiania. Te tagi są zupełnie poprawne zarówno w HTML4 jak i XHTML1.0. Zostały one usunięte dopiero w HTML5 (i XHTML1.1, ale jakoś wątpię, aby ci był potrzebny do szczęścia), więc myślę, że nie musisz się martwić, iż strona przestanie działać przez następne 10 lat.

    Sama zamiana nie poprawi też wyglądu strony w żaden sposób, no bo chcesz zamienić na dokładnie to samo.

    Weźmy np. tag <center>. Robi to samo co <div align="center">, ale align też jest "Deprecated", więc powinieneś to zamienić na styl: <div style="text-align: center">. Poza faktem, że align w stylu nie zadziała na tabele (bo to wyrównanie tekstu), to właściwie nic nie zyskałeś.

    Twój HTML nadal nie oddziela treści od wyglądu. Jest tak samo zły, przestarzały i niesemantyczny jak był na początku. Należałoby wyciągnąć te style do zewnętrznego szablonu - zrobienie tego automatycznie da ci jakieś koszmarne szablony w których będzie się ciężko połapać (o ile w ogóle będą działać).

    Lepiej poczekać na decyzję pt. "Zmieniamy wygląd strony" i wtedy przepisać szablony. Tak to się zupełnie nie opłaca. HTML4 jest dobrym sprawdzonym standardem. Może, że potrzebujesz HTML5, ale wtedy i tak chcesz pewnie zmienić layout.

  • 2010-02-17 12:25:31 Django + bazy danych SQLite i MySQL

    Ad 1. Problem z SQLite nie leży w samej wydajności, bo ta jest całkiem niezła, ale w skalowalności: gdy jeden proces piszę do bazy, nikt inny nie może z niej czytać. Przy większym ruchu zaczynają się problemy.

    Ad 2. Myślę, że możesz spróbować i zobaczyć co wyjdzie. Podmiana backendu w Django jest bardzo łatwa.

    Ad 3. Plik z bazą należy trzymać poza bezpośrednim zasięgiem serwera WWW, podobnie jak samą aplikację Django. Przyładowo, to nie Apache ma czytać bazę, tylko proces odpalony przez mod_python/mod_wsgi.

    Ad 4.

    Jeśli chcesz korzystać z ORMa (a pewnie chcesz, żeby mieć admina), to musisz przenieść schemat istniejącej bazy na definicję w Pythonie.

    Edit: za radą mrbox, dobrym wyjściem jest użyć ./manage.py inspectdb.

  • 2010-02-17 18:29:41 Wyjątki PHP - różnice między wyjątkami z SPL

    To są wyjątki, których używa biblioteka standardowa PHP. Oczywiście jest sens używać tych samych wyjątków w pewnych typowych sytuacjach, które masz opisane w dokumentacji.

    Tworzenie własnych wyjątków jest jak najbardziej na miejscu jeśli dodają one więcej semantyki do istniejących. Zauważ np., że LogicException jest dość ogólny. DomainException i BadFunctionCallException to szczególne przypadki LogicException. Tworzą one pewne drzewo od najbardziej ogólnych do bardziej szczegółowych.

    Powinieneś się przejmować, co rzucasz. W końcu możesz chcieć zrobić coś innego, gdy jest błąd jest w kodzie, a co innego jak baza danych się wywali.

  • 2010-02-21 19:47:43 Python 2.6.4 nie wspiera mod_python ?

    Najlepiej mod_wsgi. WSGI = Web Server Gateway Inteface - pythonowy standard do odpalania usług WWW. Ewentualnie mod_fcgi.

    Instrukcja do mod_wsgi dla Django.

  • 2010-03-19 23:01:34 Czy to php?

    Tak, to jest standard PHP:

    http://www.php.net/manual/en/control-structures.alternative-syntax.php

  • 2011-01-16 21:42:21 Dodawanie w JavaScript.

    Jest to konsekwencja sposobu reprezentacji liczb w Javascript.

    Typowym sposobem reprezentacji liczb zmiennoprzecinkowych jest trzymanie ich w postaci wykładnik (E) + mantysa (M) (patrz IEEE-754). W uproszczeniu dostajesz wtedy następujący wzór:

    x = (1 + m1*2-1 + m2*2-2 + ... + m52*2-52) * 2E

    gdzie m1, m2, ... to kolejne bity mantysy (która w Javascript ma 52 bity), a E jest liczbą całkowitą. Aby zapisać liczbę 0.4 musisz znaleźć odpowiednie M. Okaże się, że nie da się tego zrobić i dlatego wartość która dostajesz jest "prawie" jak 0.4. Błąd jest tak mały, że można go pominąć przy wyświetlaniu. Podobnie z 0.2 i zresztą z 0.6 też.

    Po dodaniu, błąd się kumuluje i zaczyna być znaczący, a więc i widoczny przy wypisywaniu. Zauważ też, że:

    0.2 + 0.4 != 0.6 // ale:
    0.5 + 0.25 == 0.75
    

    Ponieważ drugi ciąg wartości to ujemne potęgi dwójki.

  • 2010-01-21 16:04:47 Zadanie na długie zimowe popołudnie

    Rozwiązanie w Prologu. Niestety nie udało mi się znaleźć przenośnego modułu do arytmetyki na liczbach wymiernych, więc jest dłuższe niż mogłoby być:

    :- op(500, 'xfx', '--').
    
    expr([A|T]--X, A) :- T == X.
    expr([A|B]--T, E) :- B \== T, expr([A|X]--X, B--T, E).
    
    expr(LHead--LTail, RHead--RTail, E) :- 
        LHead \== LTail, RHead \== RTail,
        expr(LHead--LTail, E1),
        expr(RHead--RTail, E2),
        myop(X), E =.. [X, E1, E2].
    
    expr(LHead--LTail, RHead--RTail, E) :-
        LHead \== LTail, RHead \== RTail,
        RHead = [A|B],
        LTail = [A|X],
        expr(LHead--X, B--RTail, E).
    
    
    myop('+').
    myop('-').
    myop('*').
    myop('/').
    
    eval(X, r(X, 1) ) :- integer(X).
    eval(A + B, r(L, M)) :- 
        eval(A, r(AL, AM)), eval(B, r(BL, BM)),
        L is AL * BM + BL * AM,
        M is AM * BM.
    
    eval(A - B, r(L, M)) :- 
        eval(A, r(AL, AM)), eval(B, r(BL, BM)),
        L is AL * BM - BL * AM,
        M is AM * BM.
    
    eval(A * B, r(L, M)) :- 
        eval(A, r(AL, AM)), eval(B, r(BL, BM)),
        L is AL * BL,
        M is AM * BM.
    
    eval(A / B, r(L, M)) :- 
        eval(A, r(AL, AM)), eval(B, r(BL, BM)), BL \= 0, 
        L is AL * BM,
        M is AM * BL.
    
    year(E, V) :- 
        expr([1,2,3,4,5,6,7,8,9|X]--X, E),
        eval(E, r(L,M)),
        0 is L mod M, % ulamek skracalny do liczby calkowitej
        V is L // M, V >= 2011, V =< 2100.
    
    :- findall(E, (year(E, V), format('~p = ~d~n', [E, V])), _), halt.
    

    Poprawka

    Poprzednia wersja miała trochę zbyt zachłanną metodę nawiasowania. Teraz powinno być już dobrze. Wyszło mi 32386 wyników (trochę sporo). Oczywiście nie uwzględniam takich rzeczy jak łączność dodawania, więc (1+2)+3 jest różnym nawiasowaniem od 1+(2+3).

    Rozwiązanie nie jest zbyt eleganckie, bo wykonanie zajęło przerażające 4.5min :P Jak można przyśpieszyć ? Zamiast liczyć kolejne podproblemy od nowa, należałoby je spamiętywać jako szablony, tzn. nawiasowań 3-ch elementów za pomocą 4-rech operatorów jest 32, nie zależnie od tego jakie to elementy. Żeby wygenerować szablon dla czterech elementów wystarczy odpowiednio połączyć szablony dla 3-ch,2-ch i jednego elemenu. Itd... Oczywiście zużycię pamięci wzrośnie, ale obliczenia będą dużo krótsze.