Programistyczne WTF jakie Was spotkały

Programistyczne WTF jakie Was spotkały
2
not logged napisał(a):

Podczas próby kupienia biletu na pociąg pojawia się error

podczas kupowania biletu w biletomacie KŚ do lub z częstochowy na stronie potwierdzenia zamiast "częstochowa" widnieje "undefined"
Bilet drukuje się poprawnie

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:minuta
1

Cuda OS X-a (open dialog malejące sortowanie po dacie).
OsxOpenDialogBug.png
Zwróćcie uwagę jeszcze na scroll bara to jest koniec listy.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
5

Tymczasem, gdzies na produkcji...

Kopiuj
  class CanBuild21[A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21](m1: M[A1 ~ A2 ~ A3 ~ A4 ~ A5 ~ A6 ~ A7 ~ A8 ~ A9 ~ A10 ~ A11 ~ A12 ~ A13 ~ A14 ~ A15 ~ A16 ~ A17 ~ A18 ~ A19 ~ A20], m2: M[A21]) {
    def ~[A22](m3: M[A22]) = new CanBuild22[A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22](canBuild(m1, m2), m3)

    def and[A22](m3: M[A22]) = this.~(m3)

    def apply[B](f: (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21) => B)(implicit fu: Functor[M]): M[B] =
      fu.fmap[A1 ~ A2 ~ A3 ~ A4 ~ A5 ~ A6 ~ A7 ~ A8 ~ A9 ~ A10 ~ A11 ~ A12 ~ A13 ~ A14 ~ A15 ~ A16 ~ A17 ~ A18 ~ A19 ~ A20 ~ A21, B](canBuild(m1, m2), { case a1 ~ a2 ~ a3 ~ a4 ~ a5 ~ a6 ~ a7 ~ a8 ~ a9 ~ a10 ~ a11 ~ a12 ~ a13 ~ a14 ~ a15 ~ a16 ~ a17 ~ a18 ~ a19 ~ a20 ~ a21 => f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21) })

    def apply[B](f: B => (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21))(implicit fu: ContravariantFunctor[M]): M[B] =
      fu.contramap(canBuild(m1, m2), (b: B) => { val (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21) = f(b); new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(a1, a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21) })

    def apply[B](f1: (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21) => B, f2: B => (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21))(implicit fu: InvariantFunctor[M]): M[B] =
      fu.inmap[A1 ~ A2 ~ A3 ~ A4 ~ A5 ~ A6 ~ A7 ~ A8 ~ A9 ~ A10 ~ A11 ~ A12 ~ A13 ~ A14 ~ A15 ~ A16 ~ A17 ~ A18 ~ A19 ~ A20 ~ A21, B](
        canBuild(m1, m2), { case a1 ~ a2 ~ a3 ~ a4 ~ a5 ~ a6 ~ a7 ~ a8 ~ a9 ~ a10 ~ a11 ~ a12 ~ a13 ~ a14 ~ a15 ~ a16 ~ a17 ~ a18 ~ a19 ~ a20 ~ a21 => f1(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21) },
        (b: B) => { val (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21) = f2(b); new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(new ~(a1, a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21) }
      )

    def join[A >: A1](implicit witness1: <:<[A, A1], witness2: <:<[A, A2], witness3: <:<[A, A3], witness4: <:<[A, A4], witness5: <:<[A, A5], witness6: <:<[A, A6], witness7: <:<[A, A7], witness8: <:<[A, A8], witness9: <:<[A, A9], witness10: <:<[A, A10], witness11: <:<[A, A11], witness12: <:<[A, A12], witness13: <:<[A, A13], witness14: <:<[A, A14], witness15: <:<[A, A15], witness16: <:<[A, A16], witness17: <:<[A, A17], witness18: <:<[A, A18], witness19: <:<[A, A19], witness20: <:<[A, A20], witness21: <:<[A, A21], fu: ContravariantFunctor[M]): M[A] =
      apply[A]((a: A) => (a: A1, a: A2, a: A3, a: A4, a: A5, a: A6, a: A7, a: A8, a: A9, a: A10, a: A11, a: A12, a: A13, a: A14, a: A15, a: A16, a: A17, a: A18, a: A19, a: A20, a: A21))(fu)

    def reduce[A >: A1, B](implicit witness1: <:<[A1, A], witness2: <:<[A2, A], witness3: <:<[A3, A], witness4: <:<[A4, A], witness5: <:<[A5, A], witness6: <:<[A6, A], witness7: <:<[A7, A], witness8: <:<[A8, A], witness9: <:<[A9, A], witness10: <:<[A10, A], witness11: <:<[A11, A], witness12: <:<[A12, A], witness13: <:<[A13, A], witness14: <:<[A14, A], witness15: <:<[A15, A], witness16: <:<[A16, A], witness17: <:<[A17, A], witness18: <:<[A18, A], witness19: <:<[A19, A], witness20: <:<[A20, A], witness21: <:<[A21, A], fu: Functor[M], reducer: Reducer[A, B]): M[B] =
      apply[B]((a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8, a9: A9, a10: A10, a11: A11, a12: A12, a13: A13, a14: A14, a15: A15, a16: A16, a17: A17, a18: A18, a19: A19, a20: A20, a21: A21) => reducer.append(reducer.append(reducer.append(reducer.append(reducer.append(reducer.append(reducer.append(reducer.append(reducer.append(reducer.append(reducer.append(reducer.append(reducer.append(reducer.append(reducer.append(reducer.append(reducer.append(reducer.append(reducer.append(reducer.append(reducer.unit(a1: A), a2: A), a3: A), a4: A), a5: A), a6: A), a7: A), a8: A), a9: A), a10: A), a11: A), a12: A), a13: A), a14: A), a15: A), a16: A), a17: A), a18: A), a19: A), a20: A), a21: A))(fu)

    def tupled(implicit v: VariantExtractor[M]): M[(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21)] =
      v match {
        case FunctorExtractor(fu) => apply { (a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8, a9: A9, a10: A10, a11: A11, a12: A12, a13: A13, a14: A14, a15: A15, a16: A16, a17: A17, a18: A18, a19: A19, a20: A20, a21: A21) => (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21) }(fu)
        case ContravariantFunctorExtractor(fu) => apply[(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21)] { (a: (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21)) => (a._1, a._2, a._3, a._4, a._5, a._6, a._7, a._8, a._9, a._10, a._11, a._12, a._13, a._14, a._15, a._16, a._17, a._18, a._19, a._20, a._21) }(fu)
        case InvariantFunctorExtractor(fu) => apply[(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21)]({ (a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8, a9: A9, a10: A10, a11: A11, a12: A12, a13: A13, a14: A14, a15: A15, a16: A16, a17: A17, a18: A18, a19: A19, a20: A20, a21: A21) => (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21) }, { (a: (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21)) => (a._1, a._2, a._3, a._4, a._5, a._6, a._7, a._8, a._9, a._10, a._11, a._12, a._13, a._14, a._15, a._16, a._17, a._18, a._19, a._20, a._21) })(fu)
      }

  }

  class CanBuild22[A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22](m1: M[A1 ~ A2 ~ A3 ~ A4 ~ A5 ~ A6 ~ A7 ~ A8 ~ A9 ~ A10 ~ A11 ~ A12 ~ A13 ~ A14 ~ A15 ~ A16 ~ A17 ~ A18 ~ A19 ~ A20 ~ A21], m2: M[A22]) {
  }

}
Zobacz pozostałe 5 komentarzy
Shalom
Spoko, kiedyś w dość znanym i szanowanym laboratorium fizycznym widziałem tutorial "jak w pythonie zrobić metodę która ma więcej niż 256 argumentów".... ;]
Koziołek
@n0name_l, akurat ta składnia ma sens ponieważ pozwala na użycie niejawnego konwertowania (implicit) pomiędzy obiektami różnych klas przy okazji uwzględniając rzutowanie. Dla ciekawych scaladoc > http://www.scala-lang.org/api/current/index.html#scala.Predef$
n0name_l
Ale to nie skladnia ma sens, tylko trick z ta funkcja.
Koziołek
Emulacja funkcji N argumentowej :) W JVM inaczej się nie da.
KR
Fakt, nie jest to szczyt elegancji, ale to są rzeczy, które w innych językach w ogóle nie są możliwe. Podejrzewam, że niedługo da się takie coś zrobić całkiem ładnie makrami, o ile już się nie da.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
1

przed chwilą popełniłem coś takiego

Kopiuj
vector<pair<const wchar_t*,vector<pair<unsigned,const wchar_t*>>>>
Koziołek
eee.... bez przesady... jak w javie wygląda
Shalom
@Azarien też mi się kilka razy zdarzyło aż nie wbiłem sobie do głowy żeby nigdy nie używać prymitywów i klas standardowych w ten sposób. Zrób sobie tą przyjemność i obejmi to wszystko w klasy dziedzinowe tak żebyś potem nie musiał pisać komenarzy / rozkminiać co jest czym. Dużo lepiej czyta się vector&lt;Pietruszka&gt; niż taki potworek jaki naipsałeś.
spartanPAGE
aliasy i wszystko jest do przełknięcia
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

Unity...

Byl kod ktory wykonywal sie 25tys razy (petla for). 25k razy porownywal stringi + dodawal odpowiednie rzeczy do Animacji (tak zwane klucze).
Czas wykonania 0.25s
Zostal zmieniony algorytm na mniej wiecej cos takiego (wykonywal sie jedynie 500 razy)

Kopiuj
double[] values = new double[mTargetTransformations.Count];
Array.Clear(values, 0, values.Length);
HashSet<int> used = new HashSet<int>();

for (int mappingIdx = 0; mappingIdx < mAnimation.retargeting.get_number_of_blendshape_mappings(); mappingIdx++)
{
	string mappingSource = mAnimation.retargeting.get_blendshape_mapping_source(mappingIdx);
	string mappingTarget = mAnimation.retargeting.get_blendshape_mapping_destination(mappingIdx);

	int targetIdx;
	if (mBlendIndexLookup.TryGetValue(mappingTarget, out targetIdx))
	{
		int sourceIdx = mAnimation.clip.rig().shape_index(mappingSource);
		if (sourceIdx >= 0)
		{
			double mappingWeight = mAnimation.retargeting.get_blendshape_mapping_weight(mappingIdx);
			values[targetIdx] += mAnimation.clip[stateIdx].blendshape_coefficient(sourceIdx) * mappingWeight;
			used.Add(targetIdx);
		}
		else
		{
			Debug.Log("Could not find source blend shape '" + mappingSource + "'");
		}
	}
}

foreach (int i in used)
{
	if (curves[i] == null) curves[i] = new AnimationCurve();
	curves[i].AddKey(time, (float)values[i] * mBlendShapeWeightGlobalScale);
}

czas wykonywania 0.30 sec. WTF jakim cudem?
Zakomentowanie linijki addKey... 0.19 sec
Czyli addKey wykonuje sie 0.1sec...
Nigdy nie zgadniecie co pomoglo... przeniesienie tego foreacha (tych dwoch linijek) do tego ifa

Kopiuj
if (sourceIdx >= 0)

czas wykonywania 0.19 sec

zeszlismy jeszcze do 0.05s wiec nie tak zle zakladajac ze unity robi dziwne optymalizacje ...

edytowany 1x, ostatnio: fasadin
somekind
No foreach może być dość wolny przy wielokrotnym wykonywaniu, w końcu wywołuje sporo metod. Możliwe, że for byłby lepszy w tym przypadku.
fasadin
az sprawdze jutro :) zamienie ta petle na foreach
n0name_l
Drugim wtf'em jest tutaj konwencja nazewnictwa...
fasadin
nie wszystko pochodzi od nas ;) wszystkie nazwy z _ pochodza z innego frameworka
KR
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
0

Podsumowanie dnia z poprawianiem kodu... Mamy sobie raport w TeamCity, który wypluwa nam listę testów oznaczonych @Ignore. Zazwyczaj są to rzeczy, które mają ADHD i nie wiadomo dlaczego. Zastanowił mnie jednak jeden z testów na tej liście. Otóż nazwyał się jak się nazywał, ale nazwa kończyła się na UnitTest. rzadko spotykana konwencja. Zazwyczaj wyróżnia się testy integracyjne czy seleniowe, a unity to po prostu Test. Wchodze do środka, a tam na dzień dobry 100 linii javadoca z dokładnym opisem co też ten nasz UnitTest robi.

Po czym okazuje się, że test jednostkowy:

  • podnosi kontekst springa w wersj full-wypas (20 plików jakieś 80% aplikacji)
  • przygotowuje pełną testową bazę danych
  • wywołuje raptem dwie metody na krzyż z testowanego obiektu i w dodatku bez uwzględnienia warunków brzegowych.

Myślę sobie, że pewno jakiś hindus się rozpędził, zostawił nazwę i polecial dalej... SVN log, a tam... pewien gość z londynu, anglik od 40 pokoleń co najmniej...

Wniosek - robienie geolokacji kodu na bazie jakości nie daje 100% gwarancji poprawnego wyniku... hej!


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
edytowany 1x, ostatnio: flowCRANE
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:minuta
0

http://msdn.microsoft.com/en-us/library/system.double.epsilon%28v=vs.110%29.aspx
WTF zawsze mi się wydawało, że epsilon powinien mieć taką praktyczną definicję "Difference between 1 and the least value greater than 1 that is representable." taki jest powszechny standard definicji EPSILON a MS zafundował taką niespodziankę.
Nie widzę zastosowania Epsilon podanego przez MS, a co gorsza nie ma stałej, która pasowała by do normalnej definicji Epsilon.

C# http://ideone.com/u4yaiC
C++ http://ideone.com/kEwmMQ
Python http://ideone.com/2cZ1u8


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22
Azarien
a na co komu ten epsilon oparty o jedynkę?
MarekR22
jak to po co? Tak zdefiniowany epsilon określa błąd względny reprezentacji zmiennoprzecinkowej liczby, więc stosuje się to szacowania błędu obliczeń. Np na tej podstawie można policzyć jaka powinna być tolerancja uznania liczb zmiennoprzecinkowych za równe.
datdata
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 7 lat
  • Postów:957
2

Pobije ktoś to, co znalazłem w kodzie od podwykonawcy z Dalekiego Wschodu?

user image


"A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly. Specialization is for insects." Robert Heinlein.
P4
Chyba gościu jest zakochany w JS do granic możliwości. :D
AlfaLeporis
Siostro, chyba go straciliśmy.
Koziołek
Ostatnio coś takiego trafiłem...
Atlas500
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 8 lat
  • Postów:82
0

Wczoraj widziałem metodę na 1200 linijek kodu. Strukturę też miała ciekawą: zagnieżdżone ify, elsy case-y.
Po tolkienowskiemu można by to ująć, że ten kod jest tak stary że kości ludzi którzy go pisali już dawno zamieniły się w proch.


"Jeżeli człowiek to wymyślił, człowiek może to zrozumieć." Sochacki
ShookTea
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Wrocław
  • Postów:629
0

Spotkane w kodzie źródłowym pewnej biblioteki - skróciłem, bo piszę z pamięci.

Kopiuj
public long jakasFunkcja(int ax, int bx, int cx, [...], int xx, int yx, int zx) {
if (ax < 0 || bx < 0 || cx < 0 || [...] || yx < 0 || zx < 0) {
 return -1;
}
else {
 for (int ay = 0; ay < ax; ay++) {
  for (int by = 0; by < bx; by++) {
    [...]
     for (int zy = 0; zy < zx; zy++) {
      return ay - by + cy - dy + [...];
     }
  }
 }
}
}

Nie mam najmniejszego pojęcia, czemu miałby służyć ten kod ani komu by się on przydał.

EDIT:
Znalazłem "rewelacyjne" zastosowanie tej funkcji: jeśli dowolny z argumentów jest mniejszy od zera, zwraca -1, w przeciwnym wypadku zwraca... zero.


edytowany 2x, ostatnio: ShookTea
Zobacz pozostałe 3 komentarze
ShookTea
szczerze mówiąc, nie pamiętam, spotkana dość dawno i od razu wywaliłem (hmm, ciekawe, dlaczego?). @bogdans ???
bogdans
@ShookTea, return wewnątrz (zagnieżdżonych) pętli for jest bez sensu - zwraca wartość wyrażenia dla pierwszych wartości zmiennych sterujących). Oczekiwałbym czegoś takiego: if(warunek) return ....
ShookTea
EDIT: Znalazłem &quot;rewelacyjne&quot; zastosowanie tej funkcji: jeśli dowolny z argumentów jest mniejszy od zera, zwraca -1, w przeciwnym wypadku zwraca... zero.
bogdans
@ShookTea, odpowiadam z opóźnieniem. Odpowiedziałem od razu, ale nie widzę tej odpowiedzi i nie wiem czy Ty ją widziałeś. Twoje EDIT widziałem, pytałem czy dobrze zapamiętałeś kod, czy na pewno nie było if'a przed return?
ShookTea
Na sto procent.
0

Przeglądam wycenę zmiany w systemie.

W jednym podpunkcie:
"Zmiana nazwy ekranu - 0,003125 MD"

Dokładność mnie powaliła :)

Zobacz pozostałe 3 komentarze
MI
a ja liczę i liczę i wychdzi mi 4.5 minuty ;)
Wibowit
Założyłem, że MD to 8 godzin.
Marooned
A MD to skrót od? Obstawiałbym "dzień roboczy" albo "working day" ale nie pasuje.
Koziołek
@Krolik, zależy od tego jaką granulację chce mieć klient. Znajomy prawnik fakturuje np. "kserowanie dokumentów - asystentka - 5 min" i później klient dostaje fakturę "co do minuty".
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
1

WTF 1.

Skompilowanej własnoręcznie biblioteki Qt nie można przenosić (musi zostać tam gdzie została zainstalowana w ostatnim etapie kompilacji) bo niektóre exeki (np. qmake.exe) mają hardkodowaną ścieżkę do swojej lokalizacji (jakby nie można było pobierać bezwzględnej ścieżki przy uruchomieniu). Tfurcy zalecają rekompilację Qt i nie przenoszenie jej na inny dysk ani do innego katalogu.

Jakiś miły człowiek napisał program "Qt Path Corrector" patchujący qmake.exe, co miałoby rozwiązać problem, ale

WTF 2.

Jeśli podamy ścieżkę do exeka nie wymagającego patchowania, program wywala błąd i zeruje plik (pozostawia go o rozmiarze 0).
Kopii przed patchowaniem oczywiście nie zrobiłem, więc długa rekompilacja szykuje się mimo wszystko.

EDIT: pseudokod programu:

Kopiuj
open(fileForPatching.c_str(), ios::binary | ios::in);
read(content.data(), length);
close();

open(fileForPatching.c_str(), ios::binary | ios::out);
if (matchings.empty()) {
        printNoMatchingError();
        return false; // <--- !!!!
}
patch(content);
write(content.data(), content.size());
close();

Czyli: plik otwieramy...czytamy...zamykamy...otwieramy do zapisu...błąd! return!

edytowany 2x, ostatnio: Azarien
MarekR22
WTF3 to pisanie takiego patchera zamiast poprawić kod źródłowy qmake.
JA
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:Białystok
  • Postów:258
6

W sumie WTF może nie stricte programistyczny, ale powiązany.

Pracujemy aktualnie w firmie nad pewnym projektem. Implementujemy system dość skomplikowany, specjalistyczny, o którym w sumie nikt nie wie w pełni jak działa, toteż posiłkujemy wymaganiami i ogólną dokumentacją otrzymaną od zewnętrznej organizacji, która jest na bieżąco modyfikowana i uzupełniana o odpowiedzi na nasze wątpliwości.

Pewnego dnia ze zdziwieniem zauważyliśmy, że zbiór wartości przyjmowanych przez pewno pole zmienił się z {0,1,2,4} na {1,2,3,4}. Wprawiło nas to w lekką konsternację, zwłaszcza, że opisy tych wartości pozostały na swoim miejscu - stary opis 0 dotyczył teraz 1, a analogicznie zmieniły się pozostałe. Sprawa głupia, bo w nowej formie nie trzyma się to kupy w żaden sposób i nie daje się powiązać z pozostałymi częściami.

Dopiero po dłuższej chwili znaleźliśmy przyczynę - zewnętrzna organizacja nie mogła zachować się jak cywilizowani ludzie i przysłać dokumentacji w pdf-ach czy html-ach, zamiast tego użyto .doc(x)'ów. A LibreOffice gdzieś tam przypadkiem z miłą chęcią automatycznie poprawił "błędne" numerowanie opcji na, według niego, poprawne...

wasiu
To samo miałem przy drukowaniu pewnym dokumentów do urzędu pracy. Numeracja została w magiczny sposób poprawiona... i jak tu nie kupić office'a?
Marooned
Administrator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 11 godzin
  • Lokalizacja:Poznań
5

Dostałem urgent buga do poprawy w nieznanym wcześniej projekcie.
Widzę taki kod:

Kopiuj
  $.fancybox([
      
   'http://foo.com/images/uploads/',
      
   'http://foo.com/images/uploads/',
      
   'http://foo.com/images/uploads/',
      
   'http://foo.com/images/uploads/',
      
   'http://foo.com/images/uploads/',
      
   'http://foo.com/images/uploads/'
...

Myślę se - WTF.. zaglądam do źródła, a tam... Spaghetti code level ZEN! SQL w JS

Kopiuj
<script type="text/javascript">
$(document).ready(function() {
...			
   $.fancybox([
      <?php $foo = $db->query("select * from $table where x='y' and id=".mysql_real_escape_string($_GET['id']));
...
      ?>
       '<?php echo $config["sitename"];?>images/uploads/<?php echo $row["name"];?>'
...

edytowany 2x, ostatnio: Marooned
Marooned
Samo $table też jest nieźle budowane. Coś w stylu $table = 'podstawa'; if ($_SESSION['lang'] == 'xp') $table .= '_xp'; Vivat pakistańscy programiści!
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
0

Zastanowiło mnie, dlaczego biała strona bez grafiki, z jedną tabelą i szczątkową ilością treści w tabeli (większość komórek pusta) po zapisaniu zajmuje 600 kB na dysku.

Kopiuj
<td valign="bottom" style="font-size: 8pt;white-space: nowrap;text-indent: 2px;border-left-width: 1px;border-bottom-width: 1px; height: 32px;"></td>
<td valign="bottom" style="font-size: 8pt;white-space: nowrap;text-indent: 2px;border-bottom-width: 1px; height: 32px;"></td>
<td valign="bottom" style="font-size: 8pt;white-space: nowrap;text-indent: 2px;border-bottom-width: 1px; height: 32px;"></td>
<td valign="bottom" style="font-size: 8pt;white-space: nowrap;text-indent: 2px;border-bottom-width: 1px; height: 32px;"></td>
<td valign="bottom" style="font-size: 8pt;white-space: nowrap;text-indent: 2px;border-bottom-width: 1px; height: 32px;"></td>
<td valign="bottom" style="font-size: 8pt;white-space: nowrap;text-indent: 2px;border-bottom-width: 1px; height: 32px;"></td>

Odpowiedź: ktoś jeszcze nie poznał CSS.

edytowany 1x, ostatnio: Azarien
KR
może w jakimś edytorze robił tabelkę i mu samo wygenerowało
0

Ja niedawno wlasnie dostalem takie pliki HTML do zintegrowania pod Androida (user guide aplikacji). Byly to generowane z words pliki html, wygladaly podobnie jak ten powyzszy, lub nawet gorzej. Inne z kolei, kodowane w utf-8, dla jezyka Greckiego, kazda literke mialy zakodowana jako entity. Nie dalo sie z tym pracowac.

Azarien
hmm. otwierasz plik w przeglądarce i robisz copy-paste tekstu z przeglądarki do notatnika :-)
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:około 2 godziny
  • Postów:8399
1

ja bym gdybym miał pracować z takimi plikami, najpierw przepuściłbym je przez jakiś parser HTML i trochę zrefaktoryzował (np. nie byłoby chyba trudno napisać skrypt, który by wyłapywał identyczne deklaracje w style, i generował automatycznie na podstawie tego klasę CSS. Albo skrypt, który parsuje dane z tych tabelek i generuje na ich podstawie nowy widok (jeśli większość komórek pusta, mógłby je przerabiać na divy z position:absolute chociażby... i tym samym z 600kB mogłoby się zrobić np. 10kB).

edit:
albo po prostu:
parsowanie HTML --> sparsowanie contentu i zapisanie go do zmiennych --> przepuszczenie przez szablon (czyli generowanie nowego widoku od zera i karmienie go starym contentem).


edytowany 2x, ostatnio: LukeJL
Azarien
"pracować z takimi plikami" - to co podałem to była strona z internetu, zastanowiło mnie dlaczego taka duża skoro treści jest na 1 kB góra… oczywiście, wystarczyłoby zdefiniować kilka klas zamiast powtarzać style przy każdym elemencie.
0

@Azarien sam tekst wiadomo, ale tam byly spany, divy tabelki itp. Zostalo jak jest (w sensie, entity) i klient po prostu ma powiedziane ze jak chce ladniej to musi przyslac pliki z ktorymi sie da cos zrobic. I ze worda i excela nalezy wyrzucic z naszego toolsetu ;d

@LukeJL pliki sie nie walidowaly w zadnym walidatorze, nawet byly krzaki typu niedomkniete body (<body

blah...), nie bede pisal skryptu ktory takie html umie parsowac. Ale zrobilem co mozna, w sensie popisalem kupe sedow i doprowadzielm to momentu ze tresc wygladala tak samo ale sie walidowaly. Reszta mnie nie interesuje, to ma byc dostarczone w formie uzytecznej. Dostali tez info od PM ze to co nam przeslali sprawilo ze w sprincie nie zdarzymy zrobic innych rzeczy bo to zabralo czas, i nastepnym razem albo nie bedziemy takiego gowna integrowac, albo znowu bedzie kosztem czegos. Na co PM od strony klienta bardzo sie zezlil na swojego podwladnego ktory nam takie cos dal.

RE
Parsery HTML z takim kodem sobie radzą.
Marooned
Administrator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 11 godzin
  • Lokalizacja:Poznań
6

Pamiętacie mój poprzedni post sprzed tygodnia?
Dziś projektu ciąg dalszy. Kod to scheda po pewnym Pakistańczyku, którego nie ma już z nami (w sensie firmy, nie tego świata).

Kopiuj
...
	mysql_set_charset( "utf-8" );

	$db = new Database($config['server'], $config['user'], $config['pass'], $config['database'], $config['tablePrefix']);
	$db->connect();

	$db1 = new Database($config['server'], $config['user'], $config['pass'], $config['database'], $config['tablePrefix']);
	$db1->connect();

	$db2 = new Database($config['server'], $config['user'], $config['pass'], $config['database'], $config['tablePrefix']);
	$db2->connect();

	$db3 = new Database($config['server'], $config['user'], $config['pass'], $config['database'], $config['tablePrefix']);
	$db3->connect();

	$db4 = new Database($config['server'], $config['user'], $config['pass'], $config['database'], $config['tablePrefix']);
	$db4->connect();

	$san = new Sanitize();
...

Pan nie wiedział, że jak robi kilka selectów, to nie musi mieć kilku połączeń...


edytowany 1x, ostatnio: Marooned
Koziołek
wysadził się czy go normalnie zwolnili?
Marooned
@ShookTea - nie wzywaj Allaha na daremno; @Koziołek - nieznane mi są szczegóły, a im mniej wiesz tym lepiej śpisz, więc nie dociekałem
fasadin
pokazalem to koledze. On na to. "you just don't know, this is very common technique.. it is for winter time, you should heat up server room and keep it warm"
Loxiney
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 9 lat
  • Postów:18
0

Ja miałem taką sytuację xD Jakby co dopiero się uczę C++. Ale jakoś sobie poradziłem.
I jeszcze podrzucam screenshot kolegi (również początkujący): http://screenshu.com/static/uploads/temporary/9u/ky/y0/22i51b.jpg

  • jpg.png (31 KB) - ściągnięć: 168
edytowany 1x, ostatnio: Loxiney
ShookTea
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Wrocław
  • Postów:629
0

Po prostu twój błąd, żadne większe WTF. Skoro C++, to oznacza to, że zapewne dałeś = zamiast == w ifie lub coś w ten deser.


Loxiney
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 9 lat
  • Postów:18
0

Nie dlatego. Jakoś słabo zapętliłem.

edytowany 1x, ostatnio: Loxiney
ShookTea
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Wrocław
  • Postów:629
6

Dlatego czy nie dlatego?


msm
Hah, czujność jest najważniejsza
Marooned
Administrator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 11 godzin
  • Lokalizacja:Poznań
8

blockUI requires jQuery v1.3 or later! You are using v1.11.1
Testowanie jednej cyfry po kropce rządzi.

Kod blockUI:

Kopiuj
		if (/^1\.(0|1|2)/.test($.fn.jquery)) {
			/*global alert:true */
			alert('blockUI requires jQuery v1.3 or later!  You are using v' + $.fn.jquery);
			return;
		}

edytowany 1x, ostatnio: Marooned
LukeJL
trochę jak to testowanie wersji windowsów po cyfrze 9...
Shakaz
  • Rejestracja:ponad 10 lat
  • Ostatnio:9 miesięcy
  • Postów:184
0

Może to nie związane z kodem, ale poniekąd z programowaniem... Znajomy(praktyk programista), rozmawiając w towarzystwie o swojej pracy, wspomina, że ma płacone za tyle godzin, ile przerobi w miesiącu. W trakcie tej rozmowy pada z jego ust komentarz, że "w korpo płacą Ci od linijki kodu". Oczywiście łebki z roku uwierzyły i zachwyceni. Ahh, te studia... przynajmniej konkurencja mała :)
W sumie zastanawiam się co gorsze, rozumowanie tego 'programisty', czy naiwność tych ludzi? ;o

KR
  • Rejestracja:prawie 16 lat
  • Ostatnio:4 miesiące
  • Postów:2514
2

Dzisiaj mnie spotkalo.

Stworzylem folder na pulpicie i w nim kolejny folder:
dektop\A\B

otworzylem konsole, wszedlem do dektop\A\B i stworzylem junction directory do poprzedniego folderu:
dektop\A> mklink /J C ..

pozniej chcialem przeniesc ten junction dir do folderu B... Zniknely mi wszystkie ikony z pulpitu (sa w folderze B)

EDIT:
strach to cholerstwo usunac teraz...


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq
msm
Rany, co Ty za czarną magię uprawiasz ze swoim systemem plików? :P Obowiązkowe xkcd: http://xkcd.com/981/
KR
Sprawdzalem czy sie da linka zrobic do poprzedniego folderu i potem chcialem go przesunac gdzies indziej, ale nie spodziewalem sie efektow :D
Azarien
przenieś ikony w bezpieczne miejsce i usuń A. zrób to pod Total Commanderem.
KR
do kosza wrzuciłem i nie dotykam
3

Z jednym, wielkim, programistyczno-projektowym WTF spotykam się za każdym razem, gdy chcę zapoznać się z repertuarem Cinema City na ich stronie. Oczojebitny, wymagający flasha i potwornie "ciężki" latajacy misz-masz na ekranie, w którym bardzo nieprzyjemnie szuka się treści. A przy probie przejrzenia tego na smartfonie, człowiek ma ochotę popełnić sepuku.

Endrju
Strona Cinema-City to koszmar.
Marooned
Administrator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 11 godzin
  • Lokalizacja:Poznań
1

Ahahahahahahaha
Post napisany 5 minut temu, haha...
15 minut temu sprawdzam repertuar i mówię do lubej: strona cinema city to najbardziej popieprzona strona w necie, absolutnie niefunkcjonalna i dłuższa seria inwektyw. Bezczelnie dodałem na końcu robię stronki, to wiem co mówię ;)

Tak! Zgadzam się w 100%! Jeszcze ze 2 lata temu była spoko, miałem link do repertuaru w moim mieście, bo co mnie obchodzi co grają 400km dalej. Teraz to jest single page z wielką mrygającą kupą przysłaniającą pół strony; za każdym razem muszę wybierać miasto i kino, ale ścieżka jest totalnie inna gdy a) chcę zobaczyć co aktualnie grają lub b) chcę zarezerwować seans na konkretny film.

Perma-linków do filmów też nie ma, więc nawet nie mam jak wysłać mailem listy w stylu "na co dziś idziemy?".

Na smartfonie obsługa tej strony wymaga zdolności ninja.

Hmm, może jakaś petycja? A może poszukiwania na szeroką skalę choć jednego zadowolonego użytkownika by zrozumieć, czego my pojąć nie możemy?


edytowany 1x, ostatnio: Marooned
Zobacz pozostałe 4 komentarze
somekind
Widzę dwa rozwiązania - Multikino i Helios.
Marooned
@somekind - sęk w tym, że tylko CC ma IMAXa. Mam też do nich 5x bliżej, ale fakt, że częściej bywam w MK.
RE
Bardziej przystępny widok dla programistów: http://www.cinema-city.pl/presentationsJSON
Marooned
Hmm, to jednak niepotrzebnie śmiałem się z @szopenfx :)
0

Tia... Ze stroną Cinema City mierzyłem się kilka razy na przestrzeni ostatnich lat. Faktycznie, jeszcze kilka lat temu było to znośne, kolorowe coś. Teraz to tylko kolorowe coś, któremu jest w stanie podołać mocny pecet, choć o ergonomii użytkowania i tak nie ma mowy.
Może faktycznie przydałoby się, żeby ktoś tam przemyślał ten wodotrysk ;)

Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
3

Wkleję link, bo choć nie jest to programowanie, a elektronika to jednak jest to pewnego rodzaju WTF http://audiovoodoo.org/dopieszczony-zarowno-pod-wzgledem-budowy-jak-i-dzwieku/

  1. użyte komponenty - spoko jak na ładnie zapakowanego DIY
  2. ale ja już umiem to lepiej zlutować...

Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
Zobacz pozostały 1 komentarz
Marooned
Dzisiejszy hit
somekind
Nagle stali się tacy popularni, że im strona www padła. :D
VarrComodoo
Kiedyś znajomemu "audiofilowi" wkręcaliśmy, że niedługo wychodzą najlepsze kable głośnikowe - rtęciowe, najlepsze ze względu na sposób przenoszenia sygnału przez płynny metal, ale na razie jeszcze ich nie ma na rynku bo są problemy z zarabianiem tych kabli. Prawie łyknął ;)
szalonyfacet
wedlug mnie to porazka ten koles z high-fidelity... eh...
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)