Не всем очевидно, что духота и жара — разные вещи. Да, когда жарко, часто бывает душно, но вовсе необязательно. Бывает душно и в холоде. Бывает свежо в жару. Часто свежо в холоде.

Я знаю про существование машины для управления температурой воздуха — кондиционер. А есть такая для свежести воздуха? Это освежитель воздуха?

А увлажнитель это что? Влажность — третья характеристика воздуха, о которой я не знаю, по всей видимости.
Выделяют два основных вида федеративных сетей: pull-based и push-based. Для ясности повествования и элемента юмора буду первое называть всасывательным подходом, а второе — выплёвывательным.

Федеративные сети делят на эти две категории в зависимости от того, как в этих сетях узлы (сервера, ноды, инстансы, ...) узнают об изменениях в других узлах.

Выплёвывательные узлы о своих изменениях расскажут сами. Когда я пишу очередной туут в очередном форке Мастодонта, мой инстанс постучится в двери каждого инстанса, которому хочется получать мои тууты и расскажет о новом тууте. Таким образом, другие инстансы получат новости быстро. В идеале сразу, но на деле в моменты пиковой нагрузки бывает, что событиям надо дождаться своей очереди.

Всасывательные сети устроены по-другому. Здесь не сразу сообщают о каждом новом изменении. Когда мой инстанс хочет получить новые сообщения, он постучится к тем, кто эти сообщения выдаёт. В своём темпе. Задержки в распространении информации заметные. Примерно таким образом анонимный читатель подписывается на RSS-ленты любимых блогеров. Читалка анонимного читателя сама ходит на сайты и берёт новые версии ленты.

Можно сочетать элементы обоих подходов. Так и делают. Например, в ИндиВебе есть очевидно всасывательные элементы (вся вот эта микроформатная движуха) и очевидно выплёвывательные элементы (ВебМенции и подобное).

Какой подход лучше — мне непонятно. Однако мне кажется, что выплёвывательные сети могут делать больше разных штук, но всасывательные сети гораздо менее требовательны к ресурсам (вычислительным и сетевым) и проще архитектурно. Именно всасывательной я хочу сделать федерацию Бетул и Микориз. Рабочее название проекта — Миковерс (аллюзии ясны). Этим летом я хочу приступить к реализацию федеративной Бетулы. По-моему, возможность смотреть закладки ваших друзей и репостить их прикольна! Разработка будет вестись на стримах.

Подписывайтесь на мою Бетулу через RSS, кстати: https://links.bouncepaw.com. Ну, можно ещё вручную заходить.
Уютная тумбочка
🌳 Бетула 0.7 Новый выпуск Бетулы, свободной программы для организации закладок. Среди изменений: добавлены настройки, автодополнение категорий, переименование категорий, можно задать описания сайта и категорий. Также исправлено много багов, включая связанные…
🌳 Бетула 0.8

Новый выпуск приложения для организации закладок.

В этом релизе появились RSS-ленты, категории переименовались в теги, названия сохраняемых страниц достаются сами (вписывать их самому больше не обязательно).

Про остальные изменения читайте на сайте: https://betula.mycorrhiza.wiki/v0.8.0.html

Также ставьте звёздочки в мастодонте!

Мы приближаемся к 1.0. Кто-нибудь хочет помочь с опакечиванием Бетулы? Это программа на Go без рантайм-зависимостей, опакетить должно быть легко.
Тестировать софт важно! В Бетуле у меня две системы тестирования. Одна дурацкая и скучная: она написана с нативными гошными средствами тестирования. У меня их CI бегает на каждый пуш и патч.

Другая — весёлая и интересная. Она написана на POSIX Shell. Как известно¹, никакие другие шеллы использовать не стоит, поэтому я использую именно POSIX вариант. Этим скриптом я тестирую веб-морду. Такое тестирование вроде бы называется поведенческим тестированием.

Кто сразу хочет посмотреть этот волшебный скрипт, заходите на сурсхат.

Наверху файла всякая берёзовая оркестрация: вырубаю другую Бетулу, запускаю новую для теста, подчищаю грязь. Потом я определяю процедуры, нужные для тестов. С 75-ой строчки уже идут тесты! Показываю фрагмент кода:

Test 'First screen'
ExpectStatus 200
Get '/'
Check

Test 'Register on first screen'
ExpectStatus 303
Post '/register' -F name=bo -F pass=un
Check

Test 'Access non-existent post'
ExpectStatus 404
Get '/1'
Check

Test 'Create a post'
ExpectStatus 303
Post '/save-link' -F url=
https://bouncepaw.com -F title=Bouncepaw
Check

Test 'Save link: non-URL text to URL'
ExpectStatus 400
ExpectContent 'Invalid link'
Post '/save-link' -F url=Bouncepaw -F title=
Check


И ещё десяток таких. Получился красивый DSL для тестирования! Хорошо подходит для проверки status quo и огранки новых фичей. Сегодня наверное вот так ограню фичу, которую вчера написал (поиск). Правда мне придётся опять расширить число вспомогательных процедур. Как будто уже пора переписать на Рубине весь этот скрипт. Наверное, так и будет когда-нибудь.

1: https://j3s.sh/thought/write-posix-shell.html
Live stream started
Live stream finished (2 hours)
Шесть лет назад я написал Оду электрочайникам. Это мой классический блог-пост, который всё ещё можно прочитать на моём старом сайте, ссылку на который я не буду предоставлять.

Сегодня я её переопубликовал в цифровом саду с дополнением!

https://garden.bouncepaw.com/hypha/ода_электрочайникам

Мои старые читатели наверняка узнают эту статью. Я думаю пройтись по многим старым публикациями и так вот их переопубликовать.
В 2019 году с февраля по март у меня был проект — Агидель. Обратил внимание на это, когда изучал свои старые репозитории на гитхабе, пока передвигал их на сурсхат. В старом блоге нашлась интересная статья про это. Переопубликовываю! С комментариями и дополнениями!

https://garden.bouncepaw.com/hypha/агидель
ISO 216 определяет стандарты бумаги, имеющие отношение сторон 1 : √2. Хорошее отношение сторон! Если разрезать лист А4 пополам, то получим А5. Если рядом два А4 положить, получим А3.

Формат А5 имеет длины 148 мм на 210 мм. Тут не надо договариваться и додумывать, договорились уже.

Но по неведомой мне причине, почему-то выпускаются тетради, блокноты и иные скетчбуки, гордо заявляющие о своей А5-ности, но нагло врущие.

У меня есть красивый скетчбук с горами. В нём очень плотная бумага — 190 г/м³. И обещает формат А5! Но почему-то размер листа у него 145 мм на 212 мм. Одна сторона меньше, другая больше правильной!

Беспредел на этом не кончается.

Существуют ученические тетради. Они не стандартизованы! У меня сейчас на столе несколько тетрадей разных производителей: все разной высоты и ширины. Но не это плохо.

Большинство из них не врёт о своём формате. Пишут, как есть. А вот восемнадцатилистовая тетрадь в линейку компании «Хатбер» заявляет, что она А5. Замеряем: 166 мм на 204 мм. Ну это вообще нелепо! 2 сантиметра нарастили, и типа ок. Ок, конечно, но зачем врать?! Не пишите просто эти заветные два символа (А5), и всё будет хорошо. #бесит

Если бы я ещё был в школе, я бы обьявил бойкот тетрадям, которые врут. Линейкой бы измерял тетради прямо в канцелярских магазинах. Благо, линейки там в наличии. К счастью, школу я закончил, а большинство тетрадей, которые у меня остались, не врут о своей идентичности. Большинство из них произведены Архангельским целлюлозно-бумажным комбинатом, который мне полюбился за использование моего любимого шрифта в оформлении — PT Sans.
Уютная тумбочка
🌳 Бетула 0.8 Новый выпуск приложения для организации закладок. В этом релизе появились RSS-ленты, категории переименовались в теги, названия сохраняемых страниц достаются сами (вписывать их самому больше не обязательно). Про остальные изменения читайте…
🌳 Бетула 1.0

Этот день настал. Стабильный релиз! Можно поставить и больше никогда не обновляться.

В этом релизе появился букмарклет для добавления закладок в Бетулу без перехода в собственно Бетулу. Очень удобно.

Был реализован поиск. Можно искать по тегам.

Можно настроить кастомный CSS.

В саму программу теперь встроена документация. И другие нововведения, исправления и обновления.

См. страницу релиза и ставьте звёздочки в мастодонте.
Live stream started
Live stream finished (2 hours)
Вчера в секретном+приватном канале для лучших подписчиков выразил свою фрустрацию по поводу оплаты проезда в автобусах. Половина подписчиков немедленно дополнила мои переживания.

Я знаком с автобусами в Казани и в Уфе. Знаете, чем Казань лучше? Там кондукторы!

В Уфе вот так:. Зашёл в автобус, а когда надо выйти, стоишь в дурацкой очереди на выход [1], где водитель (sic!) принимает оплату. В половине случаев они не принимают карты и желают перевода через банк по номеру телефона! Ну вот мне делать больше нечего, кроме как номер твой дурацкий переписывать. Мне выйти надо! Ещё и Эзбэпэ не всегда подключен. #бесит

Ещё бывает, что оплата картой, когда она есть, не проходит. Неприятно! В Уфе я редко больше одной карты ношу. И приходится доставать телефон и оплачивать по номеру. Кто пользуется телефоном, знает, что сделать что угодно на телефоне не моментальная задача. А за тобой очередь! Вот так стресс и накапливается.

Вообще-то в Башкортостане есть проездные карты Алға. У меня в школе что-то такое было, но сейчас нету. Я так понимаю, не все перевозчики принимают Алғи.

А в Казани как с оплатой? Зашёл в автобус. Едешь. Выходишь когда надо через любой выход [2]. А решение об оплате полностью делегировано. К тебе подойдёт специально обученный кондуктор, примет оплату и всё [3].

Иной возразит, что в час пик кондуктор к тебе не успеет подойти, да и вообще он ходит и тесно. На это я скажу, что в часы пик на популярных маршрутах надо пустить больше автобусов! Тогда и кондукторы не будут на кроссовки наступать, и сесть будет легче. Невыгодно экономически?! А транспорт не про выгоду, а про транспортировку. Пускай каждый едет куда нужно, выгодность — приятный бонус для перевозчика.

Ещё кондукторы являются справочниками по маршруту.

Анонимные читатели подсказали, что есть система с оплатой на входе. В автобусе турникет, где прикладываешь штучку и проходишь, а потом выходишь красиво. Звучит удобно! Когда я был в Москве, я прошляпил возможность заценить местные автобусы и электробусы. Там вроде бы так! Ладно, в другой раз.

Ещё бывает оплата по терминалу на поручнях с проверкой оплаты контроллёром раз в иногда. Возможно, самое удобное решение! Но мало где на такое решатся, потому что транспортники не любят верить в честность людей [citation needed]. Хотя я пару лет назад такое видел в Уфе. Но больше не видел. Может, всё ещё есть?

Также я слышал что-то про оплату билетиками, которые покупаются заранее. Я про это мало знаю. Наверное, такое уже везде заменили на транспортные карты [4].

В общем, резюмирую. Кондукторы, когда автобусов достаточно. Терминалы, когда верим в честность людей. Турникет на входе надо посмотреть. Про билетики надо узнать. Оплата водителю на выходе — ерунда.

1: Я как-то наблюдал ситуацию в Уфе, когда парень встал в очередь для остановки, а автобус на ней не остановился. Я наблюдал ситуацию, когда не вся очередь успевала пройти. Надеюсь, это редкие события!

2: Однажды в Казани мне не открыли выход в час пик. Быстро нажал на кнопку экстренной остановки. Знаете, что произошло? Ничего. Автобус поехал дальше.

3: В Казани маршруты без кондукторов (то ли 47, то ли 74, я уточню). Терпеть их не могу.

4: Казанская транспортная карта — смешное явление. Цена проезда такая же, как по банковской карте! Ну и с чего мне напрягаться с её сложным пополнением? Из преимуществ только мгновенная оплата. Алға вроде покруче даже.
Я часто слышу мнение, что сейчас везде у всех есть быстрый круглосуточный интернет, а если у кого-то и нету, то и ладно, таких немного. Может, их действительно немного, но вот что-то я в это «немного» вхожу!

Вот, например, последние пару дней я был под Казанью. Не в самой Казани, а где-то под ней. Медленный интернет!

Часто посещаю вуз. Что там? Плохой интернет. Вайфай работает унизительно нестабильно. Четыре-чжи ловит лишь в избранных местах, иногда. Центр мегаполиса!

В вуз я еду обычно на троллейбусе, но вот обратно предпочитаю метро. А что в этом метро? А не ловит там! Разве что на самих станциях, да и то не на всех. На Аметьево вот не ловит вроде. Хотя казалось бы: единственная наземная станция. Посмотрим, что на новой ветке будет.

Да даже дома в другом регионе у меня в комнате плохо ловит вайфай, потому что роутер в другом конце квартиры.

Вот так потихоньку везде и набирается, что плохая связь — что-то частое и обычное, чем нельзя пренебрегать. А мы берём и пренебрегаем! Пишем сайтики свои, которые не грузятся толком. Вот сайт моего вуза с большим трудом загружается с вайфая моего вуза! Ну сделайте стопроцентное покрытие в здании, в чём проблема?

Над современным вебом много шутят, я ничего более смешного уже не придумаю. Надо только думать, как учитывать тот факт, что интернет не всегда интернет, при разработке ПО.

1. Страницы должны быть лёгкими.

2. Страница должна быть полностью загруженной после загрузки. Звучит очевидно, но много сайтов дозагружаются яваскриптами и ещё не пойми как.

3. Сеть должна использоваться как можно меньше вплоть до полного её неиспользования.

В Микоризе и Бетуле с 1 и 2 я неплохо справляюсь. Можете поизмерять и порадоваться за меня. А вот с 3 не справляюсь. Почему Микориза не приложение на устройстве, а сервер какой-то где-то? Конечно, можно много причин придумать, и они все будут разумны, но вот без интернета в дневник я записать ничего не могу. А в приложение заметок могу. Поэтому у Обсидиана сотни тысяч установок, а у Микоризы просто сотни. Конечно, не только поэтому, но всё равно!

Хочу похвалить Телеграм за хорошую работу без интернета! Всё смотрится и пишется, хотя ничего нового и не приходит и сообщения не уходят.

В общем, в своём следующем опен-сорс-проекте, который я ещё не придумал и не планирую делать, точно будет offline-first mindset. Интернализированную коннективность надо искоренять.
Электрическая почта! Люди используют её для накопления чеков и рекламы с тысячами непрочитанных сообщений. А я иногда через неё общаюсь 😳

Напомню этикет общения: plain text, soft wrap, bottom posting. Напомню правила: отписываться от ненужных рассылок, иметь 0 непрочитанных.

0 непрочитанных это просто. Удалять письма просто. Но вот что делать, когда переписка нравится? Оставить в ящике? Ещё чего!

У меня вообще-то есть многолетняя многотысячегифная вики, куда я складываю что попало, включая достойные переписки. Раньше я делал это вручную, но во время недавней хорошей переписки понял, что это никуда не годится!

Оказывается, из маковского приложения для почты письма прекрасно экспортируются драг-н-дропом в формате .eml, который почему-то из коробки прекрасно понимается Питоном. Написал скрипт, который превращает .eml файлы в документ в Микоразметке. Можно почитать парный пост на английском, там скрипт в конце приведён:

https://garden.bouncepaw.com/hypha/email_archiving

Скрипт пока такой, простенький, на каких-нибудь письмах он сломается с грохотом. Ну и ладно, там ручками скопирую. Аллаберса однажды у меня будет 0 писем на почте. Вообще пустые ящики. Мечта!

У меня ещё есть несколько ссылок про электрическую почту, если хочется ещё почитать:

https://links.bouncepaw.com/tag/email

Пишите письма!
Уютная тумбочка
🌳 Бетула 1.0 Этот день настал. Стабильный релиз! Можно поставить и больше никогда не обновляться. В этом релизе появился букмарклет для добавления закладок в Бетулу без перехода в собственно Бетулу. Очень удобно. Был реализован поиск. Можно искать по тегам.…
🌳 Бетула 1.1

В этом релизе появились репосты! Если понравилась закладка в Бетуле друга, то её можно взять и репостнуть. На оригинальном посте все репосты также будут перечислены. Реализовано через, внезапно, ActivityPub. Я, конечно, говорил, что буду на чём-то другом делать федерацию, но очень хорошо подумав, выбрал всё-таки этот протокол. С остальным федиверсом пока не работает, но будет.

См. страницу релиза и ставьте звёзды в мастодонте.
Я же люблю челленджи всякие. Четвёртый год участвую в Инктябре, второй год пытаюсь не участвовать в Нанораймо. В этом году всё же решил принять участие в Декабрьском приключении, потому что не участвовать оказалось сложно. Что это? Об этом ниже.

Многие программисты почему-то любят Адвент кода. Это когда на сайтике выкладывают какие-то заковыристые задачи на алкгоритмику, а участники пишут код для решения, и чем необычнее получилось, тем круче. Многие считают этот челлендж отличным поводом изучить новую технологию! Но мне вот Адвент никогда не нравился. Во-первых, слишком уж он high-effort для декабря, когда всё горит, да и там алгоритмика, и вообще там авторизация только через проприетарные сервисы (Микрософт Гитхаб, Гугл, Реддит и один буквенно-птичий сайт). Ещё чего!

В прошлом году товарищу Эли этот Адвент надоел, и он придумал свой челлендж: Декабрьское приключение. Суть проста: надо что-то программировать каждый день декабря. И это сразу гораздо лучше! Правила простые и свободные, челлендж длится весь месяц, а не один Адвент. Никакого давления от конкурса нету!

Что самое приятное: поскольку в вузе у меня специальность программистская, что-то кодить каждый день мне так или иначе всё равно приходится. То есть челлендж выполняется сам собой!

Во время челленджа предполагается вести свой журнал приключений, ссылки на которые Эли приводит на странице челленджа. Я там восьмой. Новые журналы всё добавляются и добавляются. Как это водится, все эти журналы на личных сайтах приключенцев.

Мой журнал описывает, как я пишу задания по Яве. Мои любимые подробные отчёты Крысиного фактора приятно читать. Как всегда, интересно у Девина лу Линвеги: Девин описывает создание многооконной графической среды для своего свекольного компьютера. Каффеин что-то музыкальное пишет. Анонимный читатель наверняка что-то для себя найдёт в списке журналов.

Многие пишут на ассемблере Uxn или на Hare. Я со своей Явой наверное как-то даже выбиваюсь. Ладно! Мне потом ещё и на Питоне делать задания.

Приглашаю подписчиков-программистов принять участие. Я вот буду просто задания делать: зачётная сессия скоро. Своими приключениями можно делиться в комментариях или где угодно.
И вот на канале 512 подписчиков. Олды помнят, что на каждое круглое число подписчиков я пишу какой-нибудь пост, который это освещает. В прошлый раз, на 256 подписчиков, я, к сожалению, пропустил пост. А ещё я очень долго шёл от 256 до 512, так что уже разучился такие посты писать!

«Уютная тумбочка» была создана 7 лет назад. Контент и стиль канала много раз менялись, но последние три года это по большей части анонсы новых версий моих программ, какие-то размышления на технические темы и общечеловеческие темы.

Этот канал далеко не единственное место, где я пишу. Вообще-то у меня есть куча других каналов поменьше! Ссылки на них я здесь не привожу, но, возможно, я их приведу в комментариях к этому посту. Если их там нету, значит они есть в другом месте. Или я эти ссылки удалил уже. В общем, попасть в них не так просто.

Ещё у меня есть сайты. Обычно я там пишу по-английски. Вот сайт-визитка: bouncepaw.com. Ну это не очень интересно. Там ссылки на другие сайты и гитхабы всякие. Весь сок в моём цифровом саду: garden.bouncepaw.com. Там есть статьи, рисунки, описания всякие. Есть, что почитать. Работает на Микоризе! А Микориза это мой вики-движок, наверное, самый популярный мой проект: mycorrhiza.wiki. Другой мой проект — менеджер закладок Бетула. Вот сайт проекта: betula.mycorrhiza.wiki. А моя Бетула с сотнями закладок на links.bouncepaw.com. А ещё можно репостить с Бетулы на Бетулу, так что ставьте все по Бетуле поскорее, будем дружить там.

Вообще-то ещё я есть в Федиверсе. Столкнулся с тем, что не все знают, что это такое. Это распределённая социальная сеть. С одной стороны это микроблоги, с другой макроблоги, с третьей вообще видеохостинг, с четвёртой всё сразу. Ещё Бетула там каким-то боком притянута? Ну ладно. Мой микроблог на merveilles.town/@bouncepaw. Я там тоже в основном по-английски пишу. У меня ещё пара аккаунтов есть. Анонимный читатель их найдёт при желании.

Многие меня ещё помнят по клавиатурам, которые я раньше делал из пенокартона и дешёвых свичей. К сожалению, из-за более мобильного образа жизни от хрупких самодельных клавиатур пришлось отказаться, у меня сейчас вообще ноутбук. Однажды вернусь в клавиатурное дело, вы только дождитесь.

Совсем уж редкие люди помнят меня по всяким лингвистическим штукам. Ещё кто-то может помнить тревелблогинг мой. Немножко будет всего.

А что дальше? Я нередко предрекаю конец Телеграма. Этот конец действительно настанет, я не сомневаюсь. Но писать сюда прекращать не планирую. Я продолжу писать так же редко, как и в последнее время. ~Раз в месяц нормально в принципе? Если хочется больше моего контента, то его надо искать в других местах, ссылки приведены.

А, точно, я же донаты ещё принимаю: boosty.to/bouncepaw.

Я сказал, что каналу 7 лет. Именно сегодня день рождения у канала. В честь этого долгожданный подарок: я включу реакции в канале! Но только три. К сожалению, не смог выбрать, какие, поэтому предлагаю написать варианты в комментарии. Выберу самые смешные.
Уютная тумбочка
🌳 Бетула 1.1 В этом релизе появились репосты! Если понравилась закладка в Бетуле друга, то её можно взять и репостнуть. На оригинальном посте все репосты также будут перечислены. Реализовано через, внезапно, ActivityPub. Я, конечно, говорил, что буду на чём…
🌳 Бетула 1.2

Теперь на Бетулу можно подписываться с других Федиверсовых серверов, например с Мастодонтов и магически выразительных Акком. Мне пришлось узнать многое об ActivityPub и сопутствующих стандартах, чтобы это заработало.

Ещё поменял дизайн самих закладок. Теперь туда больше всякого влезает.

См. страницу релиза и ставьте звёзды в Мастодонте. Ну и подписывайтесь на @[email protected], конечно.
Когда возникает вопрос, какого вида софт я разрабатываю, я отвечаю «нишевый и скучный». Вообще, для многих людей оба слова имеют негативные коннотации, но я их не вкладываю.

Слово нишевый. Понятно, что у всего есть своя ниша. Имеется в виду, что у Микоризы с Бетулой ниша специфичная. Self-hosted уже маргинальщина в нашем мире SaaS. Ещё и не WYSIWYG-редактор. Ладно бы разметка, так ведь не Маркдаун! Да кому вообще надо столько закладок хранить? Чем Обсидиан не угодил? А федерация закладкам зачем?! Такие вопросы задают или хотят задать многие, что показывает нишевость этих программ. Но эта ниша действительно есть, что подтверждается тем, что раз в иногда нахожу восхищённые отзывы о Микоризе или репощу кое-кого в Бетуле.

Но что за скучность? Я вот никакой скуки не испытываю, когда пишу чего-то. Мне почти всегда интересно. У кого-то нестандартные решения наверняка вызывают агрессию или истерику, какая же тут скука? А я про разработческую скучность. И то, и то написано на Го, есть ли язык программирования скучнее? Там вроде до сих пор нету функции Мап, которая уже есть примерно везде. Ещё и Сиквелайт этот. И Доккер не использую. Ну, кто-то поверх контейнеры разворачивает, конечно, но это всё неофициально. Ещё и этот безнадёжно серый дизайн. Ладно хоть скругления есть, немножко игривости дал.

Но наибольшую скуку я ощутил совсем недавно, когда понял, что последний релиз Микоризы на данный момент (1.14) был почти год назад. Обалдеть! Вот в честь этого пост и пишу.

За всё это время накопилось пару десятков коммитов. Я в марте планирую выпустить новый релиз с этими улучшениями, и ещё раз на долгий срок остаться без новых версий. Ежегодные релизы!

Вот помню, как четыре года назад, когда только начинал Микоризу, посмотрел на частоту релизов ДокуВики. Там вот ежегодные релизы были. Тогда не понимал, как так может быть. Сейчас понимаю. Познал скуку.

Хочется переписать там всё вообще, перелопатить. Но уж нет. Держим режим скуки.

В интернете помню были статьи про boring tech. Хорошая штука.
2024/04/28 02:06:10
Back to Top
HTML Embed Code: