Loading...
massbless avatar massbless 5 Точки

Мисли относно "Judge" системата

Здравейте!

Пише ви колега, който е записал "Programming Fundamentals" редовна форма, но поради лични / здравословни причини няма възможност да посещава занятията и реално се обучава онлайн. Това прави живота доста по-труден в онези вълшебни моменти, когато Judge дава 80/100 на решението ти, а наоколо няма ментори или колеги, до които да се допиташ. Когато това се случи, започваш да си мислиш:

"Защо, по дяволите, Judge не ми показва при какъв input решението не дава верен резултат?!" 

Известни са ми историческите съображения зад това решение. Знам, че преди системата е показвала желаната информация, докато не са се намерили тарикати, които са решили, че ще е много хитро да си вземат 100-те точки с решение от типа на "if (input) --> Console.WriteLine(output)". Разбирам и позицията, че за нас е полезно сами да си търсим грешката, защото после в реалния живот никой няма да стои до рамото ни с верния output под ръка, така че да можем лесничко да си сверим резултатите.

Но в сегашния си вид системата (поне според мен) не работи добре, понеже задачите често имат некоректно зададени условия - с липсваща или подвеждаща (а понякога и откровено грешна) информация. Това, в комбинация със скриването на грешните тестове, води до огромна загуба на време (и нерви) на много от участниците. Не знам как точно стоят нещата при другите колеги, но за себе си мога да кажа, че времето, което губя в опити да си докарам "решена" задача от 90 до 100 точки е в пъти повече от това, което прекарвам в писане на решения по други задачи. Дори когато проблемът не стои в условието на задачата, а просто има някой много крив тест, проверяващ частен случай, за който трудно бихме се досетили сами... Не смятате ли, че за един студент би било по-добре да открие грешката в кода си след подсказка, но със спестеното време да реши N на брой допълнително задачи и да натрупа опит, чрез който в бъдеще сам да идентифицира подобни критични точки?

Знам, че показването на input-а при грешните тестове би било покана към всички cheater-и с оглед на това, че до 20% от оценката идва от резултатите на домашните. Затова искам да попитам, не може ли да се премахне тежестта на домашните от крайната оценка? Така или иначе, всеки сам за себе си решава дали иска да се упражнява или смята, че е достатъчно добър. Да не говорим, че няма никакъв контрол над това дали домашното на Пешо е написано от него. Нека оценката зависи изцяло от изпита (и активността във форума - колегите, които помагат на другите, трябва да бъдат поощрявани!), а домашните да останат това, което трябва да бъдат - нещо, което правим сами за себе си. Така никой няма да има стимул да cheat-ва и Judge ще може да показва input-а за онези, които искат да го ползват добросъвестно. А ако все пак продължават да се въдят тарикати - пожелавам им късмет на реалните изпити, или по-късно на интервютата за работа, защото с техните умения ще им е необходим.

Благодаря ви за вниманието!

 

Тагове:
4
Въпроси за SoftUni
massbless:
Липса на интерес към темата.
Излишни спорове, породени от обидни коментари.
IskrenPenev avatar IskrenPenev 177 Точки

Идеята на тези "криви, завъртяни частни случай" е да се провери дали решението ти е адекватно в по широк спектър. Точно заради това на изпита си имаш Ограничения в които ясно са посочени границите в които се иска твоето приложение да работи. 

Проверяването на домашни в джъдж системата е горе-долу от Февруари месец тази година. Колкото до това че преди е можело да се гледа входа който системата ти дава - поне в послената година за такова нещо не съм чувал. Да - можеш да видиш тестовете от отминали изпити, заедно с авторските решения, но както се сещаш и за отминалия изпит от вчера след няколко дни ще бъдат качени тестовете.

Между другото  когато се гледа дали 1 задача е решена - се взима предвид дали изобщо имаш някакви точки на нея, независимо дали  са 10 или 100 (относно тежестта върху крайната оценка). Това беше казано от лекторите при откриването на Advanced C#, предполагам важи и за останалите курсове.

2
13/06/2016 19:15:22
massbless avatar massbless 5 Точки

Никой не се оплаква от "кривите частни случаи" - разбира се, че такива трябва да има, за да може да се отсеят пълните решения от онези, които работят само в ограничен спектър. Но когато един такъв случай ти отнеме половин (или дори цял) ден за да го съобразиш, идва на дневен ред въпроса "Заслужаваше ли си? Знанието, което добих от тази задача, по-ценно ли е от това, което можех да добия решавайки още 10 задачи?".

Не казвам, че една задача е решена само когато имаш 100 точки на нея. Но за мен е важно да имам пълния брой точки навсякъде, защото резултат под 100 означава, че някъде съм пропуснал нещо. Това нещо може да е съвсем тривиално, но може и да е фундаментален пропуск, който да има отношение към бъдещото ми развитие. Затова, докато не разбера какво е, не мога просто да го подмина и да си кажа "Голяма работа, нали имам 90%!".

Относно това, че преди е можело да се гледа входа - това е нещо, което чух в едно от първите видеа на Наков от началото на курса. Ако по погрешка съм извадил думите му от контекст, се извинявам. Това е моето разбиране по въпроса към днешна дата.

0
13/06/2016 20:07:42
Svetoslav.Gadzhanov avatar Svetoslav.Gadzhanov 10 Точки

Попринцип съм съгласен. И аз се дразня като получавам по-малко от 100/100, но чак пък "Фундаментален пропуск, който да има отношение към бъдещото ти развитие" :)

0
massbless avatar massbless 5 Точки

Хаха, верно звучи малко пресилено :)

Може би не избрах правилната формулировка. Това, което имах предвид е, че има разлика между малък пропуск, причинен от бързане или моментно разсейване (в някой цикъл си сложил < вместо <=) и грешка в логиката на решението. И двете могат да дадат разлика от 10 точки в крайния резултат (ако имаш достатъчно късмет само един тест да гърми заради логическата ти грешка), но второто е много по-сериозно. Защото ние идваме тук за да се научим да мислим като програмисти, съответно ако не изчистваме алгоритмите си от грешки, а се успокояваме с добър резултат, полагаме лоша основа. Затова и използвах думичката "фундаментални". Така де - сигурен съм, че разбираш какво се опитвам да кажа :)

0
13/06/2016 20:20:59
RoYaL avatar RoYaL Trainer 6849 Точки

А не може ли просто да оставиш задачата на 90 точки, да минеш на следващата, а през това време онлайн да попиташ някого какъв според него е проблемът? Било то да пишеш тук във форума, да тормозиш някой ментор на имейли/фейсбук или просто с някои колеги от курса да си направите общ чат. Пък като получиш отговор, тогава се върни на тази задача и оправи тези 10 точки.

0
stambi4a avatar stambi4a 126 Точки

Предполагам, че няма човек който в даден момент да не е откачал заради judge-a. В реалният живот ще се молим да имаме такава система, която да ни казва кога сме направили всичко перфектно. Да, ще имаме юнит тестове, но те рядко покриват всички случаи. А относно губенето на време не съм съгласен, аз лично се уча повече от трудните неща, от тези които ме изкарват от равновесие, от тези за които не съм подготвен. Ако изпробваш докато уцелиш учиш нови хватки, ако пък си нямаш идея какво да направиш, както казаха по-горе, остави го за после.

Освен това след време ще придобиеш умението да питаш judge-a и той да ти казва, например слагаш определени стойности за аутпут, закоментираш и гледаш резултата само от даден код, сменяш типове. Разбира се, има и магически случаи, когато има ограничения за judge-a, за които не знаеш, например ограничение за размер на матрица по измерение в c# да не надминава 10000, и за които ограничения никой нищо не казва. В тези случаи си просто прецакан, ти и другите които са се мъчили със същата задача.

Относно упраженията, да, кофти е, че условията не са в такъв вид както на изпитите, но пак е по-добре от преди когато решаваш домашно само по нулеви тестове и  проверката е 2-3 изречения от общо 5 думи,  съдържащи успех, браво, коректно решени, даже когато си качил грешният проект. За мен включването на judge-a за оценяването на домашните е едно от големите предимства на softuni 3.0. За тези които трябва да ги правят, предполагам не е така, но дори и те сигурно имат какво да научат покрай тази дейност. А това е най-важното.

0
massbless avatar massbless 5 Точки

Здравей,

Благодаря ти за въпросчето - очаквах някой да го зададе. Наистина звучи много простичко, но на практика нещата не стоят точно така.

Представи си, че си решаваш задачки сам вкъщи и попадаш на съответната 90/100. Пробваш първите няколко неща, които ти идват наум, но никое не сработва. Ясно ти е, че това съвсем не означава, че не става въпрос за нелепа грешка (за пример - yours truly на кандидатстудентския си изпит написа 5х5=10 и дори след 4 проверки не можа да си го намери!). Затова не бързаш да пускаш допитване във форума, докато не се убедиш, че не става въпрос за някакъв нелеп пропуск (ако започнеш редовно да пускаш такива въпроси, накрая никой няма да ти отговаря), а е нещо, което просто не можеш да разрешиш със знанията / опита си към момента. Блъскаш си главата 2 часа, за да откриеш, че смяната от int към long на една данна решава всичко. Чудесно - минаваш на следващата задача, където забиваш на 86/100. Повтаряш процедурата, но този път дори след двучасови напъни не можеш да откриеш проблема. Надявайки се все пак да не е нещо нелепо, се отправяш към форума и пускаш темичка. Преди лягане решаваш още една задача и си правиш равносметка - днес за 5-те часа, отделени за упражнения, си решил 3 задачи от планираните 12. Чудейки се как си успял да оглупееш толкова от гимназията насам, заспиваш и сънуваш кошмари за безкрайни цикли.

Сега си представи същия сценарии по време на упражненията в СофтУни. На първата задачка отделяш не повече от 5-10 мин в опити да си намериш грешката, след което питаш някое човече до теб. Ако е нещо елементарно, то бива открито почти веднагически. Минаваш на по-злобната втора задача, където отново зацикляш на 86/100, но този път колегите до теб също не могат да преборят съответната проверка в Джъдж. Викате ментора и той ви спасява. Всичко за по-малко от 30 мин. С подобни темпове можеш да решиш всички задачи още на място, в краен случай може да остане някоя за вкъщи.

Майтапът настрана - сигурен съм, че разбираш съпоставката. Човек не може да пита за щяло и нещяло, а сам не винаги може да прецени от какво естество е проблема и дали външната намеса е наложителна. А при известен вход на Джъджа, отсяването на "нелепите" грешки става веднага. Дори не е необходимо да показва "expected output" - ако само знам при какъв вход гърми, аз сам ще си дебъгна и ще открия проблема (много по-полезно занимание от двучасови опити да развивам способности на медиум).

Надявам се обяснението да не е прозвучало съвсем безсмислено :)

0
massbless avatar massbless 5 Точки

Разбирам позицията ти и съм съгласен, че онези проблеми, "които са те изкарали от равновесие" оставят най-силен отпечатък в съзнанието ти. Знанията, придобити от тях, са като слонска памет и ще останат доживот. Но когато цената, която се плаща за тях е недостатъчна практика (защото цялото ти време и енергия е отишло за разрешаването им), това се превръща в проблем. На изпита Programming Fundamentals от 12 юни загубих един час още в началото на едната от задачите, защото бях пропуснал да си декларирам array във вътрешния цикъл на матрица от елементи тип string. Съответно по-късно, когато се опитах на елемент от матрицата да придам за стойност substring от входните данни, ми даваше грешка. Ако преди това бях имал възможност да реша повече задачи, може би в някоя от програмите щях в момент на разсейване да направя същия пропуск, който направих от притеснение на самия изпит, съответно щях да съм запознат с грешката и бързо да я открия. А ако бях решил дори още повече задачи, може би щеше да ми стане втора природа да си декларирам масива без дори да се замислям и грешката никога нямаше да се случи. При всички положения, отговорът е да се решават много задачи. Защо аз не бях решил достатъчно задачи? Ами може би заради огромното количество време, което губя над гореспоменатите проблеми...

За всеки, който споделя позицията ти и иска да се помъчи над решението на задачата, винаги съществува опцията да не кликва на бутончето, което показва входните данни. Аз самият бих избягвал да го правя. Но вярвам, че когато човек сметне, че е хвърлил достатъчно усилия и е инвестирал достатъчно време в една задача, е хубаво да има възможност да види защо решението му не работи, след което в приемливо време да го коригира и да продължи да решава, и да решава, и да решава...

0
Filkolev avatar Filkolev 4482 Точки

Идеята на това да не виждаш какъв вход се подава е да се научиш да мислиш по-гъвкаво. Ако виждаш при какви данни програмата ти бърка това става упражнение по дебъгване, което само по себе си е полезно, но не ти развива мисленето в такава степен. Едно е да ти се каже, че програмата ти не работи правилно, когато ти се подаде 2 000 000 000 на входа, съвсем друго е да ти кажат ограниченията и ти сам да стигнеш до заключението, че трябва да си създадеш някакви тестови сценарии с различни крайни случаи и да тестваш какво става ако ти подадат 2 000 000 000. Самият факт, че ясно и изцяло се описват ограниченията за всяка задача, е неимоверно улеснение. И с малко практика 10-те точки бързо се съобразява къде се губят.

2
massbless avatar massbless 5 Точки

@Filkolev, не съм съгласен с твърдението:

"Самият факт, че ясно и изцяло се описват ограниченията за всяка задача..."

Ето ти един прост пример от последната задача, с която се занимавах днес - 04. Extract Sentences от упражненията към темата за стрингове, речници и ламбда. Нередностите просто с лопата да ги ринеш - обяснява се, че разделителят между изреченията е точка, удивителна или въпросителна, но нищо не се споменава относно това какви символи могат да присъстват в тялото на текста. Казва се, че за сепаратор между думите се ползват non-letter characters, и после в hint-овете се предлага всички символи, които не са букви, да се заменят със спейсове. Което е крещящо невярно, защото в тестовия вход, зададен като пример, ясно се виждат запетаи, тирета и числа (всички от които са non-letter characters), тоест още тест ръна би гръмнал ако се следват инструкциите. Тук човек се замисля, щом тези трите символа са "легални", какво правим с кавичките, скобите, процентите и прочие? Започват едни последователни submission-и в Judge с по един нов символ добавен всеки път към Regex-а, с цел да се види дали проклетият последен тест не гърми, защото в текста му присъства такъв. След това човек започва да си мисли "Чакай бе, ами ако накъде из изреченията има текст в скоби и първата дума в него ми е ключовата думичка, тогава "(keyWord" няма да ми го хване и да принтира изречението!" (или пък ако е числото "50" и някъде из текста има "50%"?).  И започват да се добавят нови проверки и да се пускат нови submission-и. Цялото решение до момента си го написал за 5 минути, а сега от два часа пробваш какви ли не щуротии в опит да хванеш какво точно е подал Judge на входа, та кодът ти не сработва. С какво това е по-полезно за обучението ти от решаването на 4 други задачи през това време?

И това не е някакъв изолиран случай! Не соча никого с пръст и не се оплаквам от качеството на условията. По време на изпит нямаш информация за входа, но това е компенсирано с ясни инструкции относно ограниченията. В упражненията като не могат да се осигурят условия със същото качество като тези от изпитите, поне да се даде възможност на студентите да виждат данните на входа.

"И с малко практика 10-те точки бързо се съобразява къде се губят"

Точно там ми е проблемът - не мога да си набавя необходимото количество практика, защото губя прекалено много време над този вид проблеми.

0
13/06/2016 23:50:06
Filkolev avatar Filkolev 4482 Точки

@massbless,

Щом е казано, че всички символи, които не са букви, се считат за разделител, значи трябва да потърсиш по-интелигентно решение. В ASCII таблицата има 127 символа, от които по-голямата част са printable, т.е. може да очакваш, че е възможно да ги има. Не знам доколко се очаква да знаете регулярни изрази на този етап, но едно търсене със сигурност би ти показало, че може да сплитнеш или реплейснеш по този патърн: [^a-zA-Z]+

Има и други възможни подходи. Може да обърнеш стринга в масив от символи с метода ToCharArray(). След това пускаш един цикъл през масива и всеки символ, който не е буква, заменяш със спейс, както е дадено в хинта. 

for (int i = 0; i < arr.Length; i++)
{
    if ((arr[i] >= 'a' && arr[i] <= 'z') || (arr[i] >= 'A' && arr[i] <= 'Z'))
    {
        continue;
    }

    arr[i] = ' ';
} 

След това правиш масива пак на стринг, сплитваш по спейс и махаш празните елементи, което подозирам, че е показвано някъде; ако не е също може да се намери бързо.

Подходи колкото искаш. Но задачата те кара да мислиш, да ползваш текущите си знания, за да решиш проблем, който не си срещал, или пък да потърсиш нови знания, които да ти помогнат. Не е логично да се даде задача, в която да трябва да се обработват поотделно 50+ специални случая, нали? Значи има по-ефикасни начини, които или знаеш и трябва да се сетиш да приложиш, или просто трябва да намериш. Не виждам в случая нещо неясно, подвеждащо или непълно в условието, което цитираш.

1
quickben avatar quickben 966 Точки

Ти за 10 точки ли си? (шегувам се)

На изпита ми по ООП, умния ReSharper ми autocomplete-на единия case във switch-a и буквално за една дума имах 22 вместо 100 точки :) А това нищо не е, един колега буквално за една точка на неговия ООП изпит вместо 100 имаше 0 от Judge-a, не го знам колко месеца е псувал човека, добре, че там оценяването е ръчно и си беше направил всичко като хората и взе изпита с над 5.00, както стана и при мен. Та по-темата, Judge-a е като демокрацията, не е най-доброто решение, но за сега "човек" не е измислил по-добро ;) Тезата, да оставим cheat-arite да cheat-ват според мен е тотално грешна, защото тези хора после ще представят сертификати, че са взели даден курс и нищо няма да знаят, да не говорим, че и сега има доста такива случай. Въобще няма да коментирам факта, че много "хора" казват, че са завършили СофтУни и нямат един взет изпит с оценка над 3.50 и после когато на един работодател му дойдат 10 такива симпатяги не ще и да чува за СофтУни, но си е негов проблем, че не се е поинтересувал, че сертификати се издават само за много добри оценки ;)

Просто всички сме минали през този филм с Judge-a и сме се оправяли някак си, свиква му се.

DiffChecker tools-a ти е най-добрия приятел там.

0
massbless avatar massbless 5 Точки

@Filkolev, не знам защо ми обясняваш за съществуването на регулярни изрази, когато в предишния си коментар съм споменал:

"Започват едни последователни submission-и в Judge с по един нов символ добавен всеки път към Regex-а, с цел да се види дали проклетият последен тест не гърми, защото в текста му присъства такъв."

Това ме навежда на мисълта, че доста отгоре-отгоре си прочел написаното от мен преди да отговориш...

Също така съм обяснил как в input-а, даден като пример, фигурират запетаи, тирета и цифри - все символи, които биха били затрити от стринга ако се следват инструкциите. В началото моят Regex изглеждаше почти като това, което ти предлагаш (вътре имаше и 0-9, спейс и тире). Judge даваше 40/100. След това добавих запетаята и оценката скочи на 80/100. В този момент започнах да се чудя какви ли още други весели символи може да има в текста, които ако не включа в Regex-а ще бъдат заменени със спейс и няма да излязат в output-a. Някой ще каже, че не си длъжен да подаваш на output-а изменения масив, където те за затрити, а можеш да принтираш оригиналното изречение. Е да, но какво правим, ако ключовата дума е "50%"? Навсякъде в тялото на масива от думички знакът за % ще е затрит и ще е останало само "50", което няма да даде съвпадение. Затова започнах да добавям нови и нови символи към pattern-а на Regex-а. Така знам, че ако на новия тест получа по-малко точки от преди, значи съответният символ е бил използван за разделител между думите. И обратното - ако получа повече точки знам, че символът е бил част от редовния текст (като запетаите, тиретата и цифрите).

Извинявам се ако предишното ми обяснение е било малко недодялано, но се афектирам само като се сетя за задачата.

0
14/06/2016 02:25:53
massbless avatar massbless 5 Точки

@quickben,

Вече обясних, че за мен не са важни самите точки, а това, което стои зад тях. Ако знам че 10-те точки, които не съм хванал, са заради някаква нелепа грешка в бързината, няма да го мисля толкова. Въпросът е, че аз не го знам, защото нямам информация за естеството на грешката. Това означава, че може да става въпрос за сериозна грешка в логиката на решението ми, а просто да съм имал късмет само един от тестовете да е пряко свързан с нея. Това вече не е ОК. Искам когато премина към следващата тема и започна да надграждам знания да съм сигурен в тези, които имам до момента. Makes sense, right?

"да оставим cheater-ите да cheat-ват" е нещо, с което съм съгласен само ако:

   1. Те могат да cheat-ват само на домашните (на изпитите input-ът очевидно трябва да остава скрит!)

   2. Домашните са лишени от всякаква тежест при формирането на крайната оценка (те са само за нас - един начин да видим доколко добре сме усвоили материала и да преценим дали имаме нужда да полагаме повече усилия в определена посока)

Мисля, че това става ясно от написаното от мен, след като им пожелавам "късмет на реалните изпити"? Така че не разбирам параграфчето, посветено на разни идиоти, които са развявали флага на SoftUni пред работодатели. Подобни хора чисто и просто не трябва да имат сертификат. 

-1
14/06/2016 01:31:26
massbless avatar massbless 5 Точки

@Filkolev,

Моля игнорирай последния ми коментар относно задачата. Не искам да навлизам в спорове. Разбирам каква е идеята и че на изхода трябва да печатаме оригиналните изречения, а не тези, които сме "изчистили" от специални знаци. Просто не виждам как задачата би сработила с ключа, който дадох за пример, но предполагам такъв не фигурира сред тестовете на Джъджа. Факт е, че условието можеше много по-ясно да определи какви "думи" могат да бъдат използвани за ключ и какви символи могат да се срещат в input-a в качеството на редовен текст, а не на разделител.

Edit: В този ред на мисли трябва да призная, че не бях прав когато казах, че при тест ръна би дало грешка ако се следват инструкциите. Запетаите, тиретата и числата от примерния вход биха били затрити по време на проверката, но на изхода биха се виждали.

-1
14/06/2016 02:24:20
stambi4a avatar stambi4a 126 Точки

Всъщност условието е много ясно, както и хинтовете. Решава се за 5 минути без Regex със 100/100 в judge.

Затова са казали "keep cool and..."

Гледам, че вече си я решил. Абе, да не те болеше зъб или нещо друго?

1
14/06/2016 02:29:07
massbless avatar massbless 5 Точки

Наистина?

Тръпна в очакване да видя решението ти при ключова дума "50%" и знакът за процент, използван като разделител между думите в текста.

И не го казвам със сарказъм - наистина ми е много интересно как ще стане.

0
stambi4a avatar stambi4a 126 Точки

Очевидно е, че такъв случай няма, а при положение, че времето ти е ценно, защо търсиш "под вола теле"? Иначе това е моето решение http://pastebin.com/9JNpfpbg . Закоментирано е много по-бързото решение с regex, който е доста прост. Честно казано, първо използвах него, така, че "5-минутното решение без Regex" не отговаря на истината. Беше 5-минутно решение с Regex. Другото решение стана по-бавно, но трябваше да покажа, че може и без Regex. В advanced C#, в https://judge.softuni.bg/Contests/190/Regular-Expressions има подобна задача - 6-та, където Regex-a e по-дълъг.

П.С. Надявам се, че не оставаш с лоши чувства от коментарите ми. Аз се кефя на дискусии, където нещата се изравят докрай.

Успех!

 

0
massbless avatar massbless 5 Точки

Не бери грижи - не съм човек, който ще се засегне само защото някой не споделя неговата позиция.

Чакам само quickben да дойде и да си остави двата цента, след което ще заключа темата. Съдейки по активността и изказаните досега мнения, огромното болшинство от хора явно са доволни от сегашния вид на нещата.

 

0
quickben avatar quickben 966 Точки

На някой хора все някой друг им е виновен, поради една или друга причина :)

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.