Czy kod może wywoływać gęsią skórkę? Jasne, że tak! Zapytaliśmy znajomych programistów i prześledziliśmy różne historie złego kodu. Zebraliśmy to w całość, aby pokazać, ile horroru dzieje się na stronach, które odwiedzamy, czy programach, z których korzystamy na co dzień. Przygotujcie się na chwile grozy! ?
Na początek sławny irez.js. W 134kB JavaScriptu zmieściło się 4780 linijek i... 609 instrukcji if
, 134 charAt
, 153 &&
, 266 ||
, 56 pętli for
oraz 11 eval
. To imponujący wynik, który budzi strach w sercu niejednego programisty.
function tylko_litery(wyraz) {
var OK = 1
var NO = 0
wyraz = wyraz.toUpperCase();
var dlugosc = wyraz.length;
for(i = 0; i < dlugosc; i++){
if(wyraz.charAt(i) <"A" && wyraz.charAt(i) != "-" && wyraz.charAt(i) != " " && wyraz.charAt(i) != "." && wyraz.charAt(i) != "&" && wyraz.charAt(i) != "_" ) {
if(polska_litera(wyraz.charAt(i) ) == 0 )
return NO;
}
if(wyraz.charAt(i) >"Z" && wyraz.charAt(i) != "-" && wyraz.charAt(i) != " " && wyraz.charAt(i) != "." && wyraz.charAt(i) != "&" && wyraz.charAt(i) != "_") {
if(wyraz.charCodeAt(i) >188)
continue;
else
{
if(polska_litera(wyraz.charAt(i) ) == 0 )
return NO;
else
continue;
}
}
}
var licznik = 0;
for(i = 0; i < dlugosc; i++){
if(wyraz.charAt(i) == "-" || wyraz.charAt(i) == " " || wyraz.charAt(i) == "." || wyraz.charAt(i) == "&" || wyraz.charAt(i) == "_") {
licznik++;
}
}
if (dlugosc > 0)
if (licznik==dlugosc)
{
return NO;
}
return OK;
}
14 lat temu wyciekły źródła Windowsa 2000. Nie był to szczęśliwy czas w Microsofcie. W kodzie jest mnóstwo komentarzy w stylu "UGLY TERRIBLE HACK", a w jednym z nich także przestroga - tym bardziej groteskowa, że mieszają się tu spacje i taby.
/*
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* !!!!!!!IF YOU CHANGE TABS TO SPACES, YOU WILL BE KILLED!!!!!!!
* !!!!!!!!!!!!!!DOING SO FUCKS THE BUILD PROCESS!!!!!!!!!!!!!!!!
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*/
Kod e-puap straszy dużo mniej niż hit od PKP - mimo, że nie jest to szczyt możliwości technologicznych. Gdyby ktoś nie skumał, co się dzieje, to programista zostawił komentarze po polsku. No i kopię zapasową tej samej funkcji, z tymi samymi komentarzami w innym pliku (common.js). Chyba na wypadek, gdyby piekło pochłonęło pierwszy plik.
styleFileButton = function(el) {
var $this = $(el);
// ie8 fix
$this.addClass('the-file-input');
//pobieramy tekst dla buttona
var labeltext = ($this.attr('title')!='' && $this.attr('title')!=undefined)?$(this).attr('title'):'Wybierz plik';
//ca�o�� okryjemy divem, şeby wszystko stanowi�o ca�o��
// var $fileContainer = $('<div class="file-container"></div>');
var $fileContainer = $('<div class="file-container" />');
//input tekstowy
var $text_file = $('<input class="file-input-text" type="text" value="" disabled="disabled" />');
//button "przegl�daj" do którego wstawiamy text labelki pobrany powyşej
var $uploadbutton = $('<input class="file-input-browse" type="button" value="'+labeltext+'" />');
//input file okrywamy divem
$this.wrap($fileContainer);
//do diva wstawiamy input tekstowy i button
$this.parent('.file-container').append($uploadbutton).append($text_file);
//dla naszego ukrytego input file wywo�ujemy akcj�, która wstawi jego warto�� do inputa tekstowego
$this.bind('change focus click', function() {
//czemu nie sibling? jeĹźeli uĹźyjemy pluginu do stylowania formularz takiego jak jqtransform,
//wtedy nasz input text zostanie zmieniony w sito, dlatego musimy go wyszukiwa� w parencie.
$this.parent().find('.file-input-text').val($this.val().match(/[^\/\\]+$/));
});
}
Jedna z ciekawszych metod na czyszczenie inputu, jaką zobaczysz, i to w dodatku w czystym SQL. Bez pomocy bzdurnych bibliotek! Ostrzegamy - gdy doscrollujesz do końca linijki, możesz się przestraszyć.
UPDATE LOW_PRIORITY IGNORE products AS p, catalog AS c
SET p.url_default = LCASE(TRIM(BOTH '-' FROM REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(p.url_default, '_','777underscore777'), '-','777dash777'), '%ProductId%',p.product_id), '%ProductName%',p.title), '%ProductDbId%',p.pid), '%CategoryName%',c.name), '%CategoryKey%',c.key_name), '%CategoryDbId%',c.cid), '%CategoryPath%',c.category_path), '%CategoryURL%',IF(c.url_custom='', c.url_default, c.url_custom)), '~','-'), '`',''), '!','-'), '@','-'), '#','-'), '$','-'), '%','-'), '^',''), '&','-'), '*',''), '™',''), '®',''), '℠',''), '₤',''), '£',''), '¥',''), '€',''), '(','-'), ')','-'), ' ','-'), '_','-'), '-','-'), '+','-'), '=','-'), '{','-'), '}','-'), '[','-'), ']','-'), ':','-'), ';','-'), '"','-'), '\'',''), '<','-'), '>','-'), ',','-'), '?','-'), '-----','-'), '----','-'), '---','-'), '--','-'), './','/'), '/.','/'), '-/','/'), '/-','/'), '///','/'), '//','/'), '777underscore777','_'), '777dash777','-')))
WHERE p.cid = c.cid AND (p.pid='4711')
Wymaganie: musimy wiedzieć, ile klient ma lat. Implementacja? Prosta sztuczka, która bardzo upraszcza logikę - o ile klient zejdzie przed kolejnymi urodzinami.
CREATE TABLE `customers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
...
`age` int(11) NOT NULL,
...
)
Coś z dziedziny magii. Przykład z języka Ruby. Dużo efektywniejsze niż @key = options[:key]
napisane wprost dla spodziewanych kluczy.
def initialize(options)
options.each do |key, value|
instance_variable_set("@#{key}", value) if respond_to?(key)
end
end
Encoding, encryption - wszystko jedno. W razie wycieku odszyfrowanie haseł będzie z pewnością równie ciężkie jak znalezienie odpowiedzi na zagadkę Sfinksa.
function EncryptPassword($password)
{
return base64_encode($password);
}
Lepiej dwa razy sprawdzić, niż sprowadzić na siebie jakieś nieszczęście. Z takiego założenia musiała wyjść osoba, która napisała ten kod. Cieszy używanie precyzyjnego porównania wartości za pomocą ===
.
var show = true;
function toggleShow(){
if(show === true){
show = false;
return show;
}else{
show = true;
return show;
}
}
Może niektórych z Was to zdziwi, ale 15 lat temu to był bardzo popularny tag, którego używały nawet poważne instytucje. Najlepiej prezentował się w połączeniu z modnym układem opartym o 3 iframe'y. Dziś już wiemy, że ten tag szkodzi bardziej niż papierosy... i niejednego UX-owca wpędził do grobu.
<marquee>2spooky4me</marquee>
Masz jakieś skrypty grozy do podzielenia się? Daj cynk w komentarzu 🎃