Чим я займався в Windows Phone, або Windows Update

З квітня 2012 по лютий 2014 я працював у Windows Phone в команді яка називалася Device Update. В цілому я пережив 2 великі реорги (це коли перетасовують структуру команд і продуктів щоб оптимізувати взаємодію), але весь час моя команда була частиною того що умовно можна назвати командою ядра Windows Phone. Організаційно моя команда була споріднена з наступними:

  • Core – команда яка займалася тим що вирізала все що можна з ядра Windows 8 і намагалася це примусити працювати на телефонах. Також в їх задачі входило примусити працювати, або знайти чому не працюють драйвери від сторонніх виробників таких якQualcomm.
  • Security – на телефоні кожна програма що не є частиною ОС працює в своїй жорстко обмеженій пісочниці і не те що не має доступу, але навіть і не бачить ресурси (файли, диск, пам’ять, реєстр, мережа, …) крім тих про які їй дозволено знати. Система безпеки телефону не покладається на механізми десктопної Windows, а по суті заміняє її. Це необхідно тому що вимоги до програм на смартфоні абсолютно інші ніж до десктопних програм.
  • Network and Drivers – на телефоні свій стек протоколів для WiFi, Bluetooth і усього іншого, але виглядає це як частина ОС.
  • Device Update – моя команда яка відповідала за оновлення на телефоні що рештою дівізіона сприймалося як частина ОС.

Ще в Windows Phone існують такі великі команди як UI, Developers Platform, Services та інші.

Тепер невеличкий відступ про механізми Windows Update. Технологія ця існує доволі давно і добре обкатана в самій ОС, а відносно недавно і інші продукти почали оновлюватися використовуючи цей механізм. Але важливо не плутати з механізмом оновлення програм з магазину – це зовсім інша сутність ніяк не пов’язана з ОС.

Працює Windows Update приблизно так:

  • клієнт питає у сервера щось типу “що в тебе є для категорії Windows/Windows Phone/XBox/Office/…”. Сервер повертає список версій: Windows 6, 6.1, 6.2 і так далі.
  • Клієнт каже “о, а я Windows 6.2, що там у тебе є для мене?”. До речі оте 6.2 це версія ядра ОС.
  • Сервер повертає список так званих детектоідів. Це такі логічні умови типу “значення ось цього ключа в реєстрі знаходиться між A та B”, або “версія ось такої DLL дорівнює ХХХ”, або “мова встановленна в українську”. Ну ви зрозуміли. Причому умови можуть бути які завгодно, а їх перевірку виконують так звані провайдери що реєструються на клієнті. Є провайдери для файлів, ресурсів (версія ОС, розв’язок екрану, версія драйверів), реєстру і інші. Таким чином клієнт не має уявлення як перевіряти детектоїди і що вони означають, а просто викликає відповідні провайдери. Імена детекоідів містять провайдерів, щось типу “./system/hardware/monitors/1/resolution/width”.
  • Для тих детектоідів умова яких істинна серверу повертаються ідентифікатори, а сервер повідомляє які файли відповідають цим детекоідам.
  • Клієнт викачує файли і робить з ними що хоче. Зверніть увагу що ні формат файлів ні що з ними робити протокол не диктує.
    Насправді там може бути кілька рівнів категорій і детектоідів, детектоіди можуть мати складні і навіть вкладені умови, один файл може бути пов’язаний з кількома детектоідами і таке інше. Але суть думаю зрозуміла.
    До речі коли ви встановлюєте Windows ваша машина отримує випадковий номер від 1 до 100 що використовується виключно механізмом оновлення. Коли ОС за розкладом перевіряє оновлення вона повідомляє серверу цей номер і той може сказати “у мене для тебе нічого нема”. Це зроблено для того щоб зменшити наватнаження на сервер який щодня без перебільшень смикають сотні мільйонів клієнтів. Також це дозволяє перевіряти оновлення на мешній аудиторії, скажімо перший тиждень віддавати його лише 1% користувачів. А от коли ви заходите в Панель Управління і натикаєте “Шукати оновлення” там то ваша ОС каже серверу “кажи що в тебе є і не дивись на мій номер”.

Коли було прийнято рішення оновлення Windows Phone зробити доступними за допомогою Windows Update (це дозволило уникнути реалізації серверної частини та деяких інструментів) то виникло кілька проблем специфічних для смартфонів, деякі з них:

  • через те що батарею треба економити не можна постійно тримати у пам’яті процес яки лише раз на кілька днів буде перевіряти чи є на сервері оновлення.
  • для зменшення трафіку дерево категорій та детекоідів має бути нижчим, але ширшим.
  • файли не мають бути надто великими щоб у випадку поганого зв’язку не качати заново один і той же файл знову і знову. Ні, докачувати не можна, а чому – залишу вам як домашню вправу для самостійних роздумів Smile Підкажу лише що весь сеанс від першого звернення до серверу до завершення розпакувування останнього файлу має бути транзакційним.
  • через обмеження пам’яті не можна скажімо розпакувати нову версію DLL і почати її використувавати для нових процесів в той час як старі використовують стару версію.
  • через обмеження дискового простору не можна розпакувати оновлення і чекати до наступного перезавантаження телефону щоб замінити ними старі файли.

Із секретів можу сказати таке що на смартфоні (і не лише Windows Phone) встановленно дві ОС, одна спеціально для того щоб встановлювати оновлення на іншу. Тобто зі сторони пристрою процес виглядає приблизно так:

  1. Знайти і викачати оновлення на сервері
  2. Запропонувати користувачу встановити їх
  3. Розпакувати оновлення (по суті це не нові файли, а лише те що треба змінити в існуючих)
  4. Перезавантажити телефон в другу ОС
  5. Пропатчити оновленнями файли на робочій ОС (на тому диску де встановлено робочу ОС)
  6. Перезавантажити телефон в робочу ОС
  7. В процесі завантаження виконати програми що зареєструвалися як мігратори даних зі старої версії в нову

До речі Apple так і не подужала зробити нормальні оновлення для iPhone і користувачі тупо викачують імідж (тобто цілий знімок диску) робочої ОС. Для цього їм треба тримати порожнім місце розміром таке саме як диск робочої ОС.

Із секретів можу сказати що функція “повернути до заводських настроєк” не відновлює оригінальні версії файлів, а просто стирає все з диска на якому зберігаються настройки і файли користувача, а робоча ОС залишається без змін. Таким чином якщо ви встановили хоч одне оновлення то повернути телефон у справді заводські настройки можна лише повною його перепрошивкою. Алетернативою було б мати ще один диск з оригіналами файлів, але на це ніхто з виробників не піде – робити пристрій дорожче заради сумнівної користі…

Одна з переваг переводу Windows Phone на Windows Update полягає в тому що теоретично (нижче детальніше чому теоретично) можна викладати оновлення коли Mictrosoft має їх готовими та протестованими. Десктопна Windows так і робить. Але у світі мобільного зв’язку волю диктують оператори. Жоден оператор не погодиться продавати телефони якщо вони не зможуть контролювати що саме на них встановлюється. Саме тому Microsoft не може самовільно робити доступними навіть критичні оновлення. Кожне оновлення має детекоід “оператор має бути Х”. Apple диктує свою волю операторам, у них інша ситуація. Що стосується Android то там шаленна фрагментація ринку і ніхто не зацікавлений робити доступними оновлення, краще продавати телефони з оновленою ОС і тому Google віддала оновлення на відкуп операторам та виробникам телефонів. Тобто вони їх звісно роблять, але публікацією не займаються, кому цікаво той сам робить оновлення доступними.

Я особисто вважаю що Microsoft має найвдалішу модель оновлень, але нажаль ситуація на ринку не дозволяє її задіяти.

А тепер зі сторони того хто публікує оновлення, звісно теж не всі особливості:

  • треба визначити між якими версіями мають існувати оновлення. Якщо для Windows нормально мати ланцюжок 1 оновлюється в 2, 2 оновлюється в 3 і так далі та ще й з перевантаженнями між оновленнями то для телефонів це не підходить: забагато викачувати, та і клієнти викинуть телефон якщо той почне перезавантажуватися кілька разів. Тому якщо вже опублікували оновлення з 1 до 2 то треба буде публікувати і 1 в 3 та 2 в 3. Ну і так далі.
  • після того як готова чергова версія (наприклад щоденний білд) треба не просто згенерувати оновлення для усих існуючих версій, але і розуміти які оновлення для чого та якось їх ділити на пакети. Наприклад у телефонів на відміну від десктопів розв’язок екрану фіксований, а тому оновлення для 600х800 та 600х1024 треба публікувати як окремі навіть якщо це єдине чим вони різняться. Додайте сюди мови (інтрефейсу, клавіатури, голосу і так далі), країну і ще багато всього і раптом з одного білда у вас виникає оновлень на кілька гігабайт.
  • до речі клавіатура (та деякі подібні речі) дуже цікавий приклад. Оновлення усіх можливих мов клавіатури ставити на кожен телефон не має ніякого сенсу, а коли користувач додає собі скажімо українську клавіатуру то її можна встановити лише з повної версії файлу, а не з патчу. Таким чином деякі оновлення містять як нові версії так і оновлення і використання того чи іншого визначається складними умовами.
  • оскільки смартфони захищені доволі серйозно то все що публікується має бути пошифровано і захищено сертифікатом який періодично закінчується (доволі часто).

Тепер подумає які ще є особливості в публікуванні оновлення. Скажімо MIcrosoft має нову версію до якої хоче обновити телефони. Будується імідж з якого виробники, наприклад Nokia, вибирають для кожної моделі саме те що їх цікавить. Десь не потрібна фронтальна камера, десь NFC, десь контроль трафіку, десь ще якісь фічі. Після тестування цієї версії виробник повертає імідж який вони модифікували і довопнили своїми компонентами. Тепер імідж треба підписати, згенерувати оновлення для попередніх версій і віддати операторам. Оператори вимагають гроші за тестування кожного оновлення (сотні тисяч долларів) і тому так часто як для десктопа виставляти оновлення не вийде. Власне з того що я бачив оновлення з’являються у доступі приблизно через рік після того як їх розробка завершена. Навіть зараз на наших Lumia 920 тa 1520 є не все що мав на своєму розробницькому телефоні 2 роки тому.

Так чим же займалася моя команада? А ось чим:

  • Інструменти які в процесі білду генерують оновлення для попередніх версій.
  • Публікація оновлень для усіх бранчів (їх було більше 150 на 2000 програмістів) теж в процесі білду. Таким чином розробники могли прошити свій телефон своїм бранчем і щоранку отримувати апдейти для нічного білда, або пропустити кілька днів і отримати апдейт що перестрибував кілька версій. Я в основному цим ось і займався.
  • на пристрої – частина що сканує, скачу і готовить оновлення
  • частина другої ОС що власне виконує оновлення
  • фреймворк для клієнтських міграторів данних

Ось, поки на цьому зупинюся. Хотів написати більше, але вже і так багато вийшло. Задавайте питання якщо є які.

2014/09/21–Kirkland Triathlon

Вже втретє робимо цей невеличкий тріатлон що проходить в нашому місті:

У порівнянні з минулим роком погода була трошки краща, а в цілому і за результатом і за відчуттями вийшло майже те саме що і минулого року.

Цього разу нам не повезло з фото і я знайшов лише пару своїх фотографій. А ще минулого року на цьому старті був присутній мій батько.

 

Почнемо з плавання. Знову було кілька хвиль і кожен бажаючий стартував у тій хвилі якій хотів. Минулого року я плив без гідрокостюму і за моїми враженнями це уповільнило мене на пару хвилин (дистанція спрінт, плавання 750 метрів), хоча і дозволило зберегти секунди на першій транзитній зоні. Результат це підтвердив: плавання вийшло 13:37 проти 15:17 минулого року. І транзитну зону я пройшов за 02:14 (минулого року за 1:44). Так що навіть на такій короткій дистанції гідрокостюм дає виграш.

 

Велоетап проходив в 2 кола де перші 6 кілометрів йшли в помітну гірку, а останні 4 це був крутий доволі спуск (на якому я боявся і гальмував більше ніж треба). Доволі нетиповий профіль для тріатлону де стараються зробити велоетап якомога пласкіше.

Час вийшов таким самим майже: цього року 23 км подолав за 45:06, минулого 45:01. І друга транзитка вийшла 53 секунди проти 52 секунд минулого року.

 

Що стосується бігу то в цей раз весь час було за ким тягнутися і з ким боротися, навіть вдалося прискоритися на останньому кілометрі. В результаті 5 км пробіг за 19:55 проти 19:59 минулого року Smile

 

У підсумку результат 1:22:03 і 4-те місце у своїй віковій групі, а рік тому було 1:22:51 і 3-тє місце. Вже наступного року на цьому старті потраплю в іншу вікову групу і з’явиться шанс боротися за перше місце Smile

 

А Олена нехай сама про свій старт напише як захоче, я вважаю що вона хоча і не з видатним результатом, але доволі непогано виступила. Проте вона своїм часом і місцем майже ніколи не цікавиться, їй більше цікаво участь приймати.

CppCon 2014

Короткий звіт про тиждень що я його провів на зльоті представників комітету зі стандартизації С++, розробників компіляторів та бібліотек, розробників що займаються оптимізацією коду та “промислових” представників галузі: розробників ігор, дослідників ведучих наукових закладів та представники найвідоміших компаній.

Усього було присутньо більше 600 людей. Щодня сесії на різні теми починалися 0 9 ранку, закінчувалися о 6 вечора з 2-годинною перервою на обід. О 8 вечора починалися воркшопи (класи) де можна було поговорити скажімо з авторами бібліотек boost, представниками комітету зі стандартизації С++ або іншими видатними людьми. Паралельно доповіді тривалістю в 1-1.5 години читалися у шести аудиторіях проіменаваних на честь видатних вчених: Паскаль, Ньютон, Ферма, Лейбніц, Декарт та Ейлер.

Цього року більшість доповідей було присвячено паралельному програмуванню (~80%) на відміну від попередніх років коли акцент робився на метапрограмування (шаблони).

Багато також говорили про новий стандарт С++14 в який увійде все те що було недороблено в С++11. А вже в С++17 буде багато нових змін які будуть підкориговані в С++20.

Ну і декілька речей які особисто мені запам’яталися.

Всюди auto

Сучасна рекомендація полягає в тому щоб використовувати auto де тільки можна. І суть в тому що це не лише коротший запис, але і безпечніший: скажімо при зміні типів в алгоритмах/інтерфейсах/структурах данних на відбувається прихованого приведення типів. Тому замість

for (list:const_iterator it = l.begin(); it != l.end(); ++it) {...use(*it);...}

В С++11 можна (і треба) писати

for (const auto& i: l) {...use(i);...}

А в С++14 стане можливим навіть

for (i: l) {...use(i);...}

Але авто-виведення корисне не лише для циклів та ітераторів, але і для лямбд, які за новим стандартом можуть повертати лямбди як результат:

auto plus = [](auto x){ retur [](auto y){ return x + y; } };
auto plus4 = plus(4);

auto s6 = plus4(2);
auto s10 = plus(4)(6);

Правила виведення типів

Через додання авто-виведення типів в мову довелося додати правила за якими це виведення відбувається. Усього цих правил більше 10 зараз і тим хто розробляє бібліотеки треба їх усі знати і розуміти дуже добре. І в цілому тенденція така що мова для тих хто пише біблітетеки мова стає складнішою і дозволяє робити тонкіші речі, а для тих хто користується бібліотеками мова навпаки стає простішою.

Так от для виведення типів треба враховавати що діють правила як для шаблонів, а для шаблонів тип шаблону залежить від параметрів методів. Крім того авто-типи втрачають константніть/волатильність. Ну і для типів-значень правила виведення завдяки слайсінгу складніші ніж для вказівників та посилань.

Нові рекомендації для програмістів:

  • для обов’язкових параметрів які не будуть змінюватися використовувати const &
  • для обов’язкових параметрів які будуть змінюватися використовувати &
  • для необов’язкових параметрів використовувати *
  • для оптимізаційних трюків і передачі прав володіння використовувати && та  std::move(). Але при цьому важливо на 100% розуміти що робиш бо такий код майже гарантовано вбиває всю оптимізацію яку міг би зробити компілятор.

 

Ніяких new/delete

Залиште new/delete людям які пишуть біблітотеки та аллокатори, почніть використовувати unique_ptr/shared_ptr. І не забувайте що unique_ptr є фактично безкоштовним і фактично це голий вказівник, але безпечний! А shared_ptr використовуйте коли у об’єкта може бути лише один власник.

Наприклад замість

widget* f();

void n(){
  widget* w = f();
  gadget* g = new gadget();
  use(*w, *g);
  delete g;
  delete w;
}

Треба писати

unique_ptr<widget> f();
void n(){
  auto w = f();
  auto g = make_unique>gadget>();
  use(*w, *g);
}

Небезпечний код

Це була довга доповідь з трьох частин що зайняла майже весь день і була присвячена тому як писати небезпечний код.

У короткому підсумку код

 

do_something();

cleanup();

Не є небезпечним через те що в ньому ніяк не перехоплюються та не оброблюються виключення і не даються гарантії що алоковані ресурси буде звільнено у правильному порядку. Із застосуванням методіки RAII (Resource Acquisition Is Initialization) небезпечний код має виглядати так:

do_something();

Досягається це дотриманням простих правил:

  • конструктор ніколи не кидає виключення та не викликає код який може кинути виключення само собою
  • так само і деструктор ніколи не кидає виключення
  • оператор присвоєння ніколи не кидає виключення і має бути транзакційним. Досягається це створенням тимчасового об’єкту який і ініціалізують як копію, а потім просто замінюють, щось типу такого:
class A {
  A& operator=(const A& a)
  {
    A tmp(a);
    using std::swap;
    swap(tmp);
    return *this;
}

До речі звернічть увагу що swap рекомендується використовувати саме так і не викликати std::swap() на випадок якщо swap() перевантажено для типу.

Ну і взагалі там неймовірно багато усього було. Наприклад розбір того чому код

f(shared_ptr(new A()), shared_ptr(new B());
}

є небезпечним. Ось тут https://github.com/CppCon/CppCon2014/blob/master/Presentations/Exception-Safe%20Code/Exception-Safe%20Code%20-%20Jon%20Kalb%20-%20CppCon%202014.pdf?raw=true файл з усіма слайдами з цієї доповіді.

С++ на Марсі

Виступав ведучий програміст проекту Куріосіті (http://mars.jpl.nasa.gov/msl/) і розповідав в основному те як працює система руху цієї машини. Той С++ що вони там використовують це дуже порізана мова: нема шаблонів, виключень, потоків, множинного успадкування, перевантаження операторів, тощо.

У них там кожна підсистема незалежна і продубльована. Наприклад система руху на останньому марсоході побудувана на платі з процесором PowerPC RAD750 (133 MHz), має 128 Мб пам’яті, використовує ОС VxWorks. В цій ОС є пакетна обробка задач і розділена пам’ять, тому вони написали свій менеджер пам’яті.

Взагалі цікаво що 4 з 19 камер марсоходу належать системі руху (по 2 на кожен комп’ютер) і використовуються майже як людина використовує очі. Максимальна швидкість складає 1.5 см на секунду, але після цього треба зупинитися, зробити стерео-фото двома камерами, розбити катринку на сітку врахувавши перспективу і оцінити кожну клітинку після чого вибрати оптимальний/найнебезпечніший маршрут. Прикол ще в тому що колеса можуть або крутитися, або повертати, одночасно і те і інше не можливо робити. За день марсохід може зробити максимум 100 метрів.

Прикольні баги там у них. Наприклад коли машинці довірили самостійно проїхати кілька десятків метрів вона зупинилася і відмовилася їхати далі тільки коли прокручування (сковзання) колес перевищило допустимий показник. З’ясувалося що заїхали в пісчану дюну і наступні 2 місяці витратили щоб вручну вивести машину з ловушки (так, кожну команду відсилали на Марс окремо). Тобто за 2 місяці щоденної роботи проїхали назад 20 метрів.

Ну і був у них там якийсь баг з пам’яттю через який комп’ютер почав перевантажуватися невпинно. На той момент коли баг знайшли і пофіксали Марс сховався за Сонцем і довелося чекати кілька місяців доки з’явиться пряма видимість Smile

 

С++ в іграх

Представники галузі говорили в основному про оптимізацію коду і на кожен слайд з С++ кодом у них було по 3-5 слайдів з асемблером. Всякі хитрі трюки оптимізації що вимагають знання принципів роботи заліза і таке інше.

Але ось вам кілька цікавих фактів: в коді Assassin’s Creed 6.5 мільйонів (!) рядків коду на С++ самої гри плюс 9 мільйонів рядків С++ інструментів (це різні редактори, пакувальники і таке інше) та 5 мільйонів рядків на С#. При цьому в коді гри нема RTTI, виключень, шаблонів (ні STL, ні boost).

 

Кілька нових фіч

Це все або ось-ось з’явиться, або вже підтримується деякими компіляторами (читайте у вікіпедії подробиці):

  • constexpr  дозволяють писати код який виконується в процесі компіляції.
  • бар’єри пам’яті (дуже складна тема сама по собі) неймовірно спрощують написання програм у паралельному стилі і є набагато дешевшими за синхронізацію: lock_guard, conditional_variable, atomic, compare_exchange_weak/compare_exchange_strong. Про це все треба читати, воно не те щоб складне, але треба якісь приклади писати для пояснення.
  • atomic<T> можна буде використовувати для shared_ptr. Звучить це як щось звичайне, але насправді така підтримка дозволить уникнути багатьох проблем у реалізації lock-free алгоритмів та значно скоротити і спростити код.
  • обмеження шаблонів – можна буде вказати що шаблон чи функція призначені, наприклад, лише для колекцій які можна сортувати:
template<typename S, typename T>

requires Sequence<S> &&

  Sortable<S> &&

  Equality_compare<Value_type<S>, T>

Iterator<S> sort(S& seq);
...
sort(vector{ 5, 4, 1 }); //Ok
sort(list{5, 4, 1 }); // Error: not Sortable

Ну або скоротити все це до

auto sort(Sortable& seq);

Можна буде писати свої обмеження якось ось так:

 

requires(C x){ { f(x)} –> int }

що означає “має бути можливим викликати функцію f для об’єкту типу С і потім привести результат до типу int”.

Зараз комітет працює над визначенням списку стандартних обмежень.

 

Звісно при всьому бажанні я не можу переказати всього що там було, ось вам кілька посилань щоб почитати самостійно:

  • відеозаписи доповідей буде викладено на http://cppcon.org/. Якщо ви будете дивитися усього по 2 доповіді на тиждень то якраз завершите перегляд перед початком CppCon 2015
  • слайди презентацій доступні на https://github.com/CppCon/CppCon2014
  • Книга Effective Modern C++ добре описує всі нововведення та механізми С++ – http://shop.oreilly.com/product/0636920033707.do
  • Нова книга Страуструпа дуже коротко описує сучасний С++ усього на 180 сторінках (офіційний опис стандарту мови зараз складає понад 800 сторінок) – http://www.stroustrup.com/Tour.html

2014-08-31–Martha Swim Lake

 

Щоб внести трошки різноманітності в наше спортивне життя яке якось уповільнилося останнім часом вирішили взяти участь в цьому крихітному старті з плавання. Два роки тому ми вже приймали участь в цьому старті що проходить недалеко від нас (15 хвилин машиною до озера) і в цілому залишилися задоволеними. Ось тут можна почитати: 2012-07-07-Martha Lake Swim та Ще кілька фото з Martha Lake Swim.

Цього року погода була не така сонячна, але було бажання поплавати і зробили ми це із задоволенням.

 

Також було меньше людей ніж у 2012-му і організотори вирішили запустити тих хто плив 2 та 1 милю разом. Оленка цього разу захотіла спробувати допливсти 2 милі.

Ну що ж, натягли костюми, умовно порозминалися… Все ж таки це дуже довга дистанція для нас і швидкості на ній не такі що прямо аж сильно розігріватися треба.

 

Вирішив підклеїти великий шматок лейкопластирю на шию там де костюм постійно натирає і на диво це спрацювало – шия ціла.

На старті невеличка штовханина і колотнеча, але метрів за 200 усі розтяглися в одну лінію і до кінця вже пливлося спокійно.

 

На відкритій воді можна пливсти за кимось і тим економити сили, отож і я прив’язався спочатку за одним хлопцем який наче і плив нормально, але потім я зрозумів що дарма вчепився в нього. Він плив якийсь час вільним стилем (дуже технічно і доволі швидко), потім повертався і робив кілька гребків на спині, а іноді різко зупинявся і робив кілька гребків брасом (мабуть коригував напрямок).

Коротше я помітив що ми відстали від тієї групи в якій спочатку були і вирішив наздоганяти сам.

 

А в плавані на відкритій воді на відміну від бігу треба не просто сильніше пливсти щоб наздогнати, але і пливсти у вірному напрямку. Час від часу кидаєш погляди з під лоба щоб глянути куди зносить і внести корективи… це реально втомлює.

Як там не було але наздогнав ту групку і плив за ними доки не повернули на друге коло (ми робили 2 кола по одній милі). А там вже стало помітно що вони сильніші за мене і повільно розрив почав зростати. На фінішу я програм мабуть метрів 50 останньому з тієї групи.

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

 

У підсумку мій час 56:39 що на 30 секунд гірше ніж 2 роки тому, але я задоволений результатом і самим стартом.

Олена ж усю дистанцію трималася за парочкою яка і вивезла її до самого фінішу де вже вдалося їх обійти. У Олени час 1:12:18. Головне що допливла, це була єдина ціль.

Крім того ми обоє були на четвертих місцях в загальному заліку Smile

Помер мій батько

Кілька днів тому помер мій батько…

Я довго думав чи писати цей пост чи ні. Сам не дуже добре відношуся до подібних постів, ніколи не можна придумати що сказати людині у відподівідь на таке. Одна з причин чому я це пишу в тому що за кілька років я звик таким чином (через написання постів у блоґ) фіксувати свої переживання. Тому не вважайте себе зобов’язаними писати коментарі у відповідь, сприймайте це як запис що її було призначено лише для мене і вас випадково вдалося побачити її. Ящо ж ви таки вважаєте це пост чимось таким що не  варто було б писати… що ж, може я і сам через деякий час його приберу.

Є ще одна причина чому я вирішив це написати. Є кілька людей які знали мого батька і регулярно читають мій блог, при цьому особисто давно з ним не перетиналися чи через те що живуть далеко, чи просто через зайнятість. Тому цей запис є також повідомленням друзям і знайомим мого батька про те що сталося.

Ті ж хто його не знав далі можете не читати – нічого хорошого далі не буде.

Взагалі думаючи про це я все ще ніяк не можу сприйняти його смерть як остаточний факт. Хвороба з’їла його за якісь два місяці. Рівно рік тому він був у нас в гостях, ми робили велоподорож у 50 км по Сіетлу, ходили в похід на місцеву гору, каталися на озері на дошках, гуляли Сіетлом та околицями…

Я пам’ятаю той дзвінок додому коли мама сказала що батькові щось не добре, мабуть тиск піднявся. А насправді йому вже як потім з’ясувалося було не по собі вже пару тижнів, але він нікому нічого не сказав. Не маючи ніяких серйозних хвороб за все життя, навіть не знаючи що таке головний біль він думав що це якась тимчасова недуга що сама з часом пройде.

А коли легше не стало пішли у лікарню де поставили діагноз інсульт і почали лікувати від нього. При цьому батькові ставало все гірше з кожним днем: спочатку порушилася координація, потім почала відніматися ліва частина тіла. Далі лікар сказала що потрбіне додаткове обстеження бо від лікування стає тільки гірше. Повезли у Дніпропетровськ, на той час він вже сам ходити не міг, а це усього тиждень пройшов як поклали у лікарню.

В Дніпропетровську просканували мозок і винесли вирок: рак 4-го ступеню з метастазами у мозок. Сказали що нічого вдіяти не можна і метастази неоперабельні – занадто глибоко у мозку і неможливо до них дістатися не вбивши паціента. Відправили додому.

Дома знову у лікарню, почали колоти ліки щоб позбавитися від результатів лікування. Батько хоча і не міг сам ходити (ліва сторона тіла була дуже слабка) проте почав почувати себе краще.

Я приїхав в Україну якраз коли його забирали додому. Сказали що “виписують”, а насправді ми йому діагноз так і не сказали до самого кінця.

Видно було як він швидко втомлюється: якщо з ранку він ще балакав, міг сам сісти, пробував з нашою допомогою ходити, то під вечір в нього вже не було сил ні говорити, ні навіть набік повернутися він сам не міг.

Проте ми сподівалися що діагноз було поставлено помилковий. По-перше, у нього нічого не боліло, а як правило на цій стадії раку людям вже регулярно колять опіати для знеболення. А, по-друге, щодні аналізи не виявили раку в жодному з органів. Лікарі між тим нам казали що сподіватися не варто і рак десь є в організмі, а те що знайти не можуть то мало суттєво.

Останні дні як мені мама казала у батька почалися болі і він жалівся на те що спина болить і ноги, практично перестав рухатися. Спочатку після “виписки” він ще дивився телевізор, слухав аудіокнижки, навіть пробував читати. Але через кілька днів перестав все це робити: його все втомлювало, картинка розпливалася і він просто мовчки лежав. Балакати теж не хотів. Під кінець йому вже почали колоти дімедрол і останні дні він хоча б був позбавлений бюлю.

А потім мені подзвонив брат і сказав що батька не стало. Поховали його через день, людей кажуть на похоронах було багато – у нього було багато знайомих, друзів, людей для яких він робив якусь роботу, людей з якими займався спортом, ті з ким вчився і працював, ті з ким просто товаришував. Я не став їхати, хоча може і дарма, просто не встиг би.

Вже потім сказали що діагноз рак не підтвердився, а те що побачили на знімках виявилося первісною пухлиною мозку – злоякісне утворення з невідомим походженням. Лікується хирургічним шляхом (видаляється), після чого роблять радіо- та хіміо-терапію. Але не цьому випадку, як я вже сказав занадто глибоко вони були і у таких ділянках що оперувати не можна.

Хотів написати щось на зразок прощальної промови, а вийшов якийсь переказ фактів. Все, більше писати не можу.

39

Треба ж щось написати, якийсь звіт чи що :)

Число якесь неймовірне… Не те що б мене шокувало те що вже скоро 40, просто з дня в день не думаю про те скільки мені років, а коли доводиться згадати то “ой, ну ніфіга ж собі”!

Якось так склалося що у мене і Олени, краще скажемо у нашої родини, більшість друзів помітно молодші за нас. Ну тобто у нас звісно є і друзі нашого віку, є і старші, але більшість все ж таки молодші. Про що це говорить? А хто його зна про що воно говорить. Хтось скаже що це показує що ми молоді духом, хтось скаже що ми ще не подорослішали. Я ж скажу що, по-перше, так склалося, а, по-друге, наші інтереси та вподобання переважно там де інтереси молодших за нас людей.

Що ще сказати? Дивлюся назад і в принципі є речі які приємно згадувати: люди, ситуації, події. Є таке чого якби давали другу спробу то намагався б уникнути, але якось усе погане розмилося з часом і особливих емоцій не викликає. І аж солодке тремтіння від того що ще чекає по переду. Що там буде не знаю, та і планувати більше ніж на кілька днів не люблю, але знаю що будуть ще приємні моменти і цікаві люди які згодом стануть приємними спогадами.

Також дякую усих хто мене читає, коментує, слухає та просто про мене знає. Без вас на цій планеті було б не так кльово проводити час :)

Прохання до вас є. Якщо знайдете натхнення написати кілька речень то напишість що з мої вчинків та слів вас колись здивувало. Без оцінки добре чи погано, прото те що викликало подив чи здалося не надто адекватним. Питаю з ціллю може пригадати щось про що забув давно. Буває от тобі розказують якусь історію з твоєю участю, чи що ти колись сказав що когось сильно зачепило, а ти навіть не пригадуєш такого. От і тут може щось таке буде.

2014/07/11–Ocean Shores Toughman Triathlon

Уього лише другий мій триатлон за цей рік, все ще не у дуже добрій фізичній формі після аварії, але дуже хотілося його зробити і перевірити свій загальний стан.

image

 

Місто Ocean Shores (Океанський Берег) розташоване за 2.5 години автомобілем від нас і як видно з назви розташовано на березі океану.

Приблизно остання третина дороги проходить у страшенній глушині де дуже мало людей і олені як у себе вдома переходять табунами дороги коли їм заманеться. Безпосередньо перед Ошен Шорс маршрут проходить через відносно велике (як для цієї місцевості) місто Абердін в якому народився і жив лідер Nirvana Курт Кобейн. На в’їзді в місто стоїть знак зі словами Come As You Are.

В Ошен Шорс же населення складає 5 тисяч людей які задіяні у обслуговуванні туристів – велетенські готелі вздовж пляжу і складають усе місто.

А океан без хвилерізів це скажу я вам така не надто привітна річ. Страшенний гуркіт, великі хвилі, сірий пісок. У місті доволі прохолодно – коли в Сіетлі вже кілька днів тривала спека в 95 градусів тут був туман і температура 65. Причому це звичайна погода для цього міста наскільки я зрозумів. Молочно білий туман вдалині зливається с сіруватим океаном і темно-сірим піском. Дуже непривітно все це виглядає, хоча і красиво.

Тепер щодо самого старту. Він був дуже невеличкий – на Half Iron Man дистанції стартувало меньше 100 учасників. Плавання було у вузенькому озерці – якраз від одного берега до іншого, розворот і назад. Пливлося добре і тим більше здивованим я був побачивши результат – 33:20, на пару хвилин повільніше ніж я сподівався.

Ну та нічого, моєю єдиною ціллю було закінчити дистанцію, а не зійти як на попередньому старті. А який вже там буде час то було діло десяте.

Після плавання (як і під час) не було холодно не дивлячись на те що сонце весь час було закрите туманом. Проте на відміну від інших стартів одежа так і залишалася мокрою майже до самого фінішу, як правило на велоетапі вона висихає за кілька хвилин. А в транзитці я провів 1:43 що непогано зважаючи на те що не надто поспішав.

Велоетап проходив у два кола кожне з яких було “туди і назад”. І треба сказати що усі 90 км (а за моїм комп’ютером вийшло усі 92) дорога була дуже хороша: гладенький асфальт без тріщин та сміття, плаский як стіл маршрут, вітер хоча і був проте не надто сильний. І хоча рух транспорту не було перекрито місцевість ця наскільки малолюдна що за весь велоетап може з пару десятків машин проїздили повз.

Почалося добре, їхалося легко і в задоволення, намагався економити сили. Десь вже за кілометрів 30 до фінішу почав відчувати що дистанція надто довга і я не готовий до неї, проте такого повного виснаження як на попередньому страрті не було. Все ж таки довелося терпіти до транзитки і останні кілометри крутилая думки “де вже той фініш”.

І якщо на початку етапу ще бачив інших учасників попереду і позаду то вже другу половину їхав сам. Проте двічі бачив Олену яка їхала мені на зустріч і радісно посміхалася.

Щодо результату то 2:43 не найкращий мій час (хотілося б ближче до 2:30), але непогано. Друга транзитка – 1:04 і я починаю біговий етап.

Треба сказати що весь час до цього я думав саме про біговий етап і чи зможу я його зробити взагалі, а якщо зможу то чи варто. Тут така річ що роблю я все це тільки через те що мені це подобається і важливо щоб не робити через силу, а то інтерес втратиться. Та і доцільність страждань коли не можеш показати нормальний результат сумнівна. Тому план був дивитися на самопочуття і залишати дистанцію якщо щось йде не так.

Скажу чесно – було важко і я не надто боровся. Спочатку зупинявся і проходив пішки метрів 20-30 через кожен кілометр. Потім якось легше пішло і кілька кілометрів пробіг без зупинки. Пив воду та енергетичні напої на кожній станції. Десь за 5 км до фінішу відчув виснаження і знизив темп майже до хотьби просто щоб бігти без зупинки.

Кілька кілометрів бігового етапу (2 км в кожен бік) проходили по пляжу. Тобто по піску. Пісок там як я вже казав сірий і щільний, втрамбований такий що сліди від бігунів залишалися ледь помітні. Взагалі той пляж не для купання, принаймні я не бачив щоб там купалися, а от машини там їздять – є спеціальні заїзди і виїзди. Прикольно було бігти паралельно хвилям що накочувалися на берег.

 

Олену зустрів десь коли подалав перші 2 км а вона вже бігла фінішувати.

А в цілому біг був важкий, повільний і нерадісний. Ну і час 1:59:55 для цієї дистанції (21 км) є у мене поки що найгіршим.

У підсумку: загальний час – 5:19:21, я на 19-місці в загальному заліку і на 7-му у своїй віковій групі. Але головне що дистанцію цю можу знову долати, а форма поступово відновиться сподіваюся.

Олена ж подолала свою олімпійську дистанцію за 3:02:17 і була 5-ю у своїй віковій групі.

 

 

Навіть є ось таке відео мого фінішу яке зробили Олена (так, вертикальне відео):

Ocean Shores Triathlon HIM Finish from 0lexandr on Vimeo.

Латте-машина

Для вас це може і звична річ, а для мене це була дивина дивна.

Для таких же як я селюків поясню що латте це такий напій де в гарячу молочну піну додають невеличку кількість кави – http://uk.wikipedia.org/wiki/%D0%9B%D0%B0%D1%82%D1%82%D0%B5. Напій в результаті виходить не такий гіркий як просто кава, хоча має смак і запах кави і так само бадьорить.

Коли машинку вмикаєш першим за день то треба почекати хвилини 3 доки вона щось там в собі нагріє до 200 градусів (далі всі градуси у фаренгейтах, для переводу в цельсії віднімайте 32 і діліть на 2).

У латте-машини в нашому офісі є кілька параметрів, але я знаю лише про два з них: дрібність помолу зерен та температура до якої доводиться молоко.

Заправляється машина смаженими зернами, але я у каві не розбираюся і смак різних зерен не розрізнюю. Хоча у нас купують дорогі зерна, може через це – усі дорогі однаково хороші, а погіні кожне погане по своєму :)

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

Температура ж молока на смак не впливає взагалі наскільки я розумію. Прото більше піни виходить тому що молоко довше готується.

Отже спочатку у спеціальну ложку мелемо каву. Робиться це дуже просто – вставили її в спеціальні пази, повернули і молотилка сама вмикається. Весь процес займає кілька секунд (залежить від виставленої дрібності помолу).

В результаті ложка щільно набита помеленеми зернами і її вставляємо в сусідні пази щоб через цей пил пропустити гарячу воду. Можна обрати скільки саме води пропустити церез “заварку” – чим менше води тим міцніше буде кава. Взагалі то якщо не готувати молоко, а пити лише приготовлену таким чином каву то можна сміливо називатися ман’яком – наскільки міцний і густий кавовий розчин виходить (десь 1/5 чашки за обсягом).

Для молока ж треба враховувати що у обсязі в результаті готовки воно збільшується вдвічі (знову ж залежить від обраної температури).

Різні типи молока (маю на увазі жирність) як не дивно дають дуже різний смак. Мені особисто подобається соєве молоко яке звісно і не молоко, а зі звичайного подобається знежирене. Так само різниться і піна з різного молока. Причому різниця більша ніж можна було б очикувати.

Наливаємо молоко у спеціальний глечик, в глечик встромляємо носик і через той носик в молоко напускаються дрібні бульбашки повітря і він же нагріває молоко.

Після того як напій приготовлено прибираємося. Таблетку що утворилася після заварювання кави вистукуємо з ложки у спеціальну коробочку. Спеціальна вона не тому що з кавою треба щось спеціальне робити, а тому що саме об неї зручно вистукувати ту таблетку. Глечик та ложку далі достатньо сполоснути водою, навіть терри нічим не треба, досить просто полити водою і вони чисті.

А от сама морока почистити носик який утворював піну – на ньому накипає молоко і його треба старанно відтирати. Коли його опускаєш на місце то він ще додатково чиститься самою машиною випусканням кількох струменів пари. Проте зрозуміло що для машинок які використовуються у кав’ярнях ніхто подібну ручну чистку не проводить.

Крім власне смачного напою мені ще подобається сама процедура. Каву п’ю раз на день – як тільки з’являюся на роботі.

Чи варто мати таку машину дома? Річ класна і мати її було б приємно, але не думаю що я б нею часто користувався, та і дороговато вони коштують. Тому ні. Те що вона є на роботі звісно добре, але б і без неї прожив би спокійно.

Цукру/лікерів додавати за власними вподобаннями. Смачного!

Концерт Kraftwerk

Для тих хто раптом не знає німецька команда Kraftwerk є родоначальниками електронної музики і виступають вже більше 40 (!) років. Хоча вони і починали як рок-команда свого часу, вірніше навіть як kraut-rock, але дуже швидко знайшли свій стиль і з формату “гітари-барабани” перейшли у формат “4 мужика за сінтезаторами”.

Концерт відбувався у сіетльському театрі Paramaunt, вартість квитка була від 70 долларів. Нам вдалося сісти в першому ряду на балконі прямо по центру зали, це десь метрів 20 до сцени, дуже кльові місця.

Формат виступу у команди не міняється кілька десятиріч, а саме: 4 вже лисі і старенькі дядьки непорушно стоять за клавіатурами синтезаторів, їх костюми світяться в темряві, бігають вогні по краях інструментів, а позану на великому екрані демонструється 3D шоу для якого нам усім видавали окуляри на вході.

Особисто я групу дуже люблю і у захваті слухав давно знайомі композиціх “Тур де Франс”, ” Автобан”, “Радіоактівіті” та інші шедеври. З іншого боку Олена якій ця група не сказати щоб сильно подобається порівняла усі їх пісні з ряднинкою: довгі, і навіть якщо добре зроблені у деталях все одно не цікаві. Я таку думку не поділяю, але розумію. Також погоджуся з тим що сьогодні є потреба у більш агресивній музиці, а весь цей вдумливий концептуалізм швидко втомлює публіку.

Ще я зрозумів що ніколи раніше не слухав електронної музики на правильних пристроях. Якщо метал, класику та навіть більшість джазу можна слухати більш-менш отримуючи правильні враження і на комп’ютерних колонках і на сумнівної якості навушниках то тут… Скажу що я наче вперше почув цю музику. А разом з відео-супроводом так взагалі бомба.

Кліп з кадрами з Чорнобиля:

Ще треба сказати про дуже дивну публіку яка була на концерті (спостерігав на виході). Дика суміш гіків, хіпстерів та фріків. Тунелі у вухах, волосся різних кольорів та стилів, наколки, шорти/джинси/піджаки, футболки з назвами електро- та індастріал команд. Як в паралельний світ поринув :)

Ось якось так їх концерти виглядають зараз:

А в цілому задоволений концертом неймовірно!