Что будет, если у программиста появится хобби кулинария

Предыстория

Начну издалека, то есть с самого начала. Готовить сам для себя я умел и раньше (до описываемых событий): сварить суп, борщ, пожарить яичницу, картошку — нет проблем. Но готовить что-то конкретно и целенаправленно, да еще и получать от этого удовольствие, мне в голову не приходило. Как-то ползал я по ютубу, пересматривал любимые мультики и попался мне пиксаровский «Рататуй», а в рекомендациях после него выпали ссылки на теоретический ролик про рататуй И. Лазерсона с канала ТВЕда, как сейчас помню. Посмотрел один ролик, другой и понеслась. Лазерсон отличный пропагандист «мужской кулинарии», у него есть настолько завлекательные ролики, после просмотра которых любой мужик, до этого даже не имевший мыслей про кухню, побежит готовить вприпрыжку, я уверен на сто процентов.

Ну вот и я втянулся, начал с капустных салатов, потом собственно рататуй (классический, а не Confit Byaldi из мультика), потом различные блюда с курицей и пошло-поехало. Пересмотрел кучу теоретических Лазерсоновских роликов, потом его же кухни народов мира, классические рецепты, потом начал перелезать на других кулинарных блогеров (Обломова, Емельяненко и др.), короче закончилось это тем, что у меня появилась бумажка, на которую я скрупулезно выписывал названия рецептов, которые в будущем хочу готовить, безотносительно каких-то конкретных кулинарных видосов и блогеров (большая часть от Лазерсона конечно, уж так вышло, потому что он среди меня стал первым «кулинарным гуру»).

У меня даже сохранился этот бумажный теперь уже раритет.У меня даже сохранился этот бумажный теперь уже раритет.

Долгий путь к мобильному приложению

Моя «кулинарная бумажка» довольно быстро подошла к концу, и в этот момент я осознал, что надо было изначально завести хотя бы текстовый файл сразу со ссылками на нужные ролики, чтобы не шариться потом по ютубу и не искать заново. Сказано — сделано, файл с линками готов и заполняется со страшной скоростью, готовить так же быстро, как смотреть кулинарные ролики я никогда не сумею, кстати ради экономии времени я примерно в то же время заимел привычку смотреть вообще все на удвоенной скорости (кроме Урганта, его не получается, ну и музыки конечно).

Далее алгоритм кулинарный развивается следующим образом. Вот собрался я что-то конкретное готовить и мне надо идти в магазин — открываю ссылку, пересматриваю ролик, переписываю (опять на бумажку) ингредиенты, кстати, для тех кулинарных блогеров, у которых состав блюда не указан в описании ролика, приготовлен в аду отдельный котёл, да да. Потом с этой новой бумажкой в магазин и домой, потом пересматривать опять ролик, ну и готовить наконец, и еще в процессе бегать туда-обратно из кухни к компу уточнять рецепт. Дотошный читатель в этот момент наверное захочет спросить меня — «А что ж ты, мил человек, ролики-то смотришь, заходил бы на кулинарные сайты и искал рецепты там! Там же все текстом и статьями сразу есть!» Ну вот я в то время не дозрел до кулинарных сайтов и форумов (сотни их) и готовил «по видосам». Кстати, если бы не видосы, я бы изначально и не запал на кулинарию, текстом хоть в интернете, хоть в кулинарных книгах для меня было не вкусно и не интересно и это точно.

Ну так вот, бегать туда-сюда с бумажками и постоянно пересматривать видосы и переписывать состав мне быстро надоело, особенно когда я готовил одно и тоже блюдо (например борщ или машхурду или курицу, тушеную в овощах по-турецки) по второму разу. Теперь читатель думает — вот тут он наконец допёр, что надо делать мобильное приложение. Нее, тогда я сначала завел канал на яндекс-дзене, для себя же самого, чтобы писать максимально краткие статьи как готовить и из чего и не тратить время на пересмотр роликов. Да и мобилка с андроидом появилась у меня только в начале 21-го года, до этого ходил со старьём Samsung WiTu на виндоус мобайл, пока жена не решила «хватит это терпеть» и не задарила мне новую трубу на день рождения. Это я все к тому, что всего через полгода после того, как у меня появился смартфон на андроиде я уже написал для него свое первое кулинарное приложение и до этого никакого опыта в мобильной разработке не имел. Можете считать, что тут я похвастался.

Дошел до идеи мобильного приложения

Итак, на тот момент кулинария окончательно стала моим хобби, некоторые кулинарные видосы перекочевали в дзен-статьи и пересматривать их больше было не нужно, но для любого нового рецепта никто не отменил ни пересмотр, ни бумажку с ингредиентами, кроме того я осознал одну банальную истину: если идешь в магазин и собираешься готовить несколько блюд, так уж будь любезен подобрать их близко по составу и не бегай в магаз за отсутствующей специей, в общем не надо делать из каждого блюда поход в магазин, а надо чтобы один поход — несколько блюд, так и удобнее и время экономится и продукты в холодильнике быстрее убывают и потому меньше портятся. Кстати, я теперь полюбил ходить по продуктовым супермаркетам (полезная кулинарная побочка).

Короче, на этапе поиска рецептов под похожие ингредиенты я наконец-то дозрел до идеи мобильного приложения. Естественно, инет предварительно был прозондирован на тему уже готового, вердикт — все не то, что мне надо. Я отмел сразу большую часть кулинарных сайтов, форумов и приложений, одни по причине «немобильности», другие по причине неудобства. Почти везде при поиске рецептов по составу предлагается вбивать текст ручками (тыркать на картинки я нашел только в одном месте), не говоря уже о качестве источника. Я ничего не имею против хозяек, которые постят свои рецепты на различные кулинарные сайты и форумы, но сам предпочитаю все-таки готовить проверенное. А как проверенное — это либо если рецепт презентует шеф с репутацией, либо если у блюда есть название и соответственно народная слава и популярность, приобретенная может быть даже и за века (борщ, уха, ну вы поняли).

И возвращаясь к набору текста, я сразу решил, что у меня никто и ничего набирать не будет и все продукты я сделаю картинками и разобью по категориям, чтобы обеспечить максимально быстрый и простой поиск. Собственно исходная идея крайне простая — есть кнопка категории, например МЯСО, тычем на нее, открывается набор картинок: Говядина, Свинина, Курица, и др. тычем на картинку, получаем ингредиент, потом тычем на картинки из других категорий, если надо, и наконец кнопкой «Найти рецепт» выдаем список всех рецептов, где есть указанные ингредиенты, а под каждым рецептом картинками его состав.

Вот как-то так это и должно было выглядетьВот как-то так это и должно было выглядеть

Реализация SystemCook

Я справедливо решил, что поскольку ничего сверхъестественного от приложения мне не нужно, то не стоит ударяться в «программирование для андроид», а стоит набрать в поисковой строке «конструктор мобильных приложений». Угадайте, кто получил первый приз? MIT App Inventor 2.

image-loader.svg

Он гугловский, бесплатный, работает прямо в браузере, проекты хранятся на собственных серваках, есть уроки на ютубе и не только и на хабре есть несколько обзорных статей. Я обозревать его не буду, расскажу свой опыт, особенности и подводные камни. Забегая вперед, скажу сразу, что до сих пор я не пожалел о своем выборе, конечно есть нюансы, но в целом отличная среда разработки, подходящая для моей задачи целиком и полностью, и это вы еще не знаете про масштаб, в который эта самая задача расширилась. Ну, в общем день-другой на «аппинвенторовские» мануалы и через недельку у меня уже была готова первая версия.

Что касается названия — придумалось почти сразу как-то само собой, потому что я хотел привести свое хобби в систему от того и ударился изначально в мобильную разработку.

Масштабирование приложения и грабли App Inventor’а

Этот абзац пишу больше для разработчиков и программистов, тут будут технические моменты для тех, кто тоже ковыряет App Inventor 2, пригодится, вам этого может никто больше и не расскажет.

  • Если, к примеру, в приложении задаете размер картинки 32×32, то берите источник 64×64 или больше, иначе на смартфоне она будет выглядеть «замыленной»

  • Приложение перестает компилироваться по разным причинам, основные это превышение неких лимитов — размер проекта (не более 8 мб), размер apk-файла (что-то около 25 мб, в конкретных цифрах могу ошибаться), которые вам никто не скажет, наоборот будет сказано, что не компилируется не из-за ошибки в приложении (DX stage failed not because an error of your program…).

  • Чтобы снова стало компилироваться вам придется делать оптимизацию, хотите вы этого или нет (и на самом деле за этот садизм я очень люблю App Inventor) и опять же что именно оптимизировать вам сама среда не подскажет.

  • Оптимизация это: вынесение всех массивов за приложение, максимальное сокращение повторяющегося кода, «облегчение» графических файлов, сокращение элементов интерфейса — да да, нельзя будет запихать все что вам захочется, буквально так, проект перестанет компилироваться и точка, что хотите то и делайте, а делать вам скрипя зубами придется например это — убирать из интерфейса все только что добавленные финтифлюшки, например картинки и облегчать его насколько возможно. Если столкнетесь с этим и будете искать на форуме, то прямо так и напишут — удаляйте картинки.

  • Если не компилируется попробуйте попереключаться между экранами и режимами и запустить компиляцию еще раз — иногда помогает.

  • ОБЯЗАТЕЛЬНО имейте копии проекта в aia файлах или в проектах с другим именем.

  • Если нужны внешние базы данных, то не тратьте время на TinyWebDB или FireBaseDB, а сразу подключайте Google Sheets — на ютубе есть импортные уроки. И вот тогда…)))

Приведу пару примеров из своего собственного опыта. Изначально я держал базу внутри приложения — длиннющий Dictionary из рецептов на весь экран сколько убралось, а убиралось около 30, потому что если массив выпирает за размеры экрана, то неудобно добавлять в него новые элементы, потом еще следующий такой же массив простыней и еще один и еще и вот я уперся в 99 рецептов и все — приложение отказывается компилироваться. Да, вот так до смешного, я хочу добавить сотый рецепт и зарелизить новую версию, а оно не дает.

Я тогда выкрутился через сокращение какого-то другого кода и сотый рецепт таки добавил, но уже на сто четвертом мне все равно пришлось делать внешнюю базу и вычищать из кода все простыни массивов рецептов и продуктов. И это правильно, с внешней базой проект залетал во всех отношениях. Держи данные отдельно от логики и интерфейса — с апп инвентором вы это правило максимально быстро прочувствуете на себе в полной мере.

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

Другой пример. Добавляю я в интерфейс картинки (кстати я их все тупо и старательно надергал из интернета), добавляю и в один непредсказуемый момент все перестает компилироваться. Стал искать — в одном случае оказалось, что я зачем-то тащу за собой еще с первой версии файл test.png, который добавил для тестов, когда только начинал, и который никакого отношения к проекту не имеет и нигде не используется, но занимает целый 1 мб места (а другие картинки у меня по 10–20 кб), в другом случае мне пришлось заменить картинки на текст (красивую зеленую стрелку на обычный текстовый восклицательный знак, 40 стрелок оказалось перебор), т.е. уже слишком много картинок напихал.

И третий пример касательно возможности потерять проект. В режиме интерфейса есть неочевидная фича «копи-пасты», т.е. можно сделать Ctrl-C Ctrl-V на выделенном элементе и он скопируется с именем по инкременту. А выделенный элемент может быть таблицей в которой есть вложенные элементы, я этим очень удачно пользовался, потому что не с руки таскать в табличку 20+ картинок одну за другой, когда ее можно просто скопировать. И вот как-то раз я на автомате «скопипастил» одну суровую табличку, которая-то мне особо-то и не нужна была. И ведь мелькнула же в голове мысль — неплохо было бы сначала сохраниться. Но нет.

Короче через какое-то время ожидания (такая процедура вложенного копипаста там притормаживает) я получил окошко There is a bug in your program и зависший на нем проект. И все — ни при каких перезагрузках и переоткрытиях оно никак не убиралось. Видимо проект автосохранился в процессе бага и тютю. В итоге я потерял день и то только потому, что вчерашний проект был сохранен в файле на компе, а если бы этого файла не было, то я бы потерял все — пару месяцев работы, почти все, что собственно было сделано в апп инвенторе, кроме внешних баз и файлов картинок.

Вот так выглядит примерно половина моего Вот так выглядит примерно половина моего «кода»

В чем прелесть программирования в MIT App Inventor 2

Наверное эту часть можно распространить на все подобные среды разработки, но я не проверял, поэтому утверждать не буду.

  • Никаких проблем с кодировками и обращением к внешней базе. Вообще. Русский текст на кнопках UI, надписях, обращение к внешней базе в Google Sheets, где есть русский текст — все включено из коробки, мало того, даже код для этого не нужно писать. Вспоминаю, сколько я в свое время трах… мучился с этим в C# — мама дорогая.

  • Никаких проблем с переименованиями, в одном месте название поменял — оно поменялось везде во всем проекте.

  • Среда дисциплинирует, что попало куда попало писать, точнее совать, тебе не дадут.

  • Меньше кода здесь выгодно и надо.

  • На экране зараз помещается больше информации, чем в традиционном текстовом коде, отладка и навигация проще, но надо привыкать. Кто-то говорил, что за таким программированием будущее и я практически готов согласиться.

В блоках есть практически все, что нужно, быстрой сортировки правда нет, но я вот сам написалВ блоках есть практически все, что нужно, быстрой сортировки правда нет, но я вот сам написал

Что бесит в MIT App Inventor 2

  • Каждую новую картинку надо грузить отдельно, нельзя скопом загрузить в проект сразу кучу картинок

  • Каждую картинку надо удалять отдельно, нельзя скопом удалить кучу ненужных картинок

  • Каждый новый элемент надо добавлять отдельно, ну или «копи-паст» через интерфейс, что иной раз может быть чревато

  • Масштабирование картинок слетает при перезагрузке, это не влияет на скомпилированный проект, только на отображение в апп инвенторе

  • Нельзя рамкой выделить несколько блоков и перетащить на нужное место, каждый блок таскай мышой отдельно

  • Нельзя в массивах добавить сразу несколько элементов — таскай мышой по одному

  • Если какая-нибудь мелочь потеряется под другим блоком — разгребай, сдвигай и ищи

  • Проект временами не хочет компилироваться, импортироваться, сохраняться под новым именем и не говорит почему

  • Линковка «пазлов» иногда криво срабатывает

  • Если интерфейс большой и длинный и поэтому есть промотанная полоса прокрутки, то при добавлении элемента она дергается и перематывается

Картинки слетелиКартинки слетели

Продолжение разработки, выход на патреон и плеймаркет

Далее проект развивался следующим образом: были само собой добавлены новые продукты и категории, сохранение рецептов в избранные, поиск по исключенным продуктам и кнопки перемотки — нельзя выложить сразу сотню рецептов, апп инвентор не даст и приложение тормозит чем дальше тем больше, поэтому в выдаче у меня по 5–10 рецептов и постраничная перемотка. Где-то в середине этого процесса добавления новых фич я подумал — «а ведь крутая штука у меня получается, не попробовать ли на ней заработать». И зарегил сначала патреон и стал постить там этапы разработки и планы на следующие версии — каждые новые 25 рецептов версия увеличивается, рецепты я добавляю руками в базу на полуавтомате, скажем так, плюс новые фичи.

Пишу SystemCook в первую очередь для себя, поэтому было сразу решено, что никакой рекламы мне там не надо, а для пользователей будет патреон и/или платная версия и бесплатная само собой. Отличие платной версии от бесплатной изначально планировалось только в выдаче — там 10 рецептов, а тут 5. Но с патреоном пользователям надо скачивать и вручную устанавливать apk-файлы, они этого боятся и не умеют, посему без плеймаркета никак. 25 баксов в цепких лапах гугла и я теперь разработчик в плеймаркете. Но не все так просто. Угадайте, к чему придрался гугл:

  • Низя ссылку на патреон из приложения — убрал.

  • Низя картинку бокала с вином в разделе Алкоголь — объяснил, что алкоголь не пить, а использовать в рецептах, где весь спирт из него так и так выпаривается, ну и впоследствии на всякий случай поставил для приложения 18+. Пропустили!

Низя алкоголь, дитям мороженоеНизя алкоголь, дитям мороженое

Кстати, для «аппинвенторовцев»: при добавлении в плеймаркет новой версии приложения она должна быть с тем же названием. Никакие переименования не прокатят. Именно в апп инвенторе должен быть проект с заданным названием, его компилировать и загружать в плеймаркет. Это может быть проблемой, потому что апп инвентор бывает не дает сохранить проект под другим именем. Вот не дает и все, говорит «сервак занят, попробуйте попозжей». Т.е. если вы сохранили в апп инвенторе по каким-то причинам проект под новым именем и работаете в нем, а старое «плеймаркетовское» имя не используется, то придется как-то суметь сохранить проект под этим же пользователем под старым именем. Подсказка (может быть проект слишком большой, для компиляции прокатывает, а для сохранения под другим именем нет, но про ограничения на количество проектов и общий размер я нигде не читал).

Дальнейшее развитие. Эногастрономия

Кто без гугла знает, что означает это слово, тому приз. Среднестатистически ленивый читатель, дойдя до этого места моего повествования, наверное думает — ну паренек пиарится на хабре, придумал свою кулинарную прогу для мобилки, на плеймаркете и без него тысячи их, накой оно мне надо, я же ведь сам готовить не собираюсь, нас и в ресторанах неплохо кормят. А я вам тогда вот что покажу. Опа:

aeeb378d4865d2aa330027700557e0a9.jpg

Опа:

95647fc94dd184c7a1874dbc1a15e839.jpg

Опа:

39f809a2cd4259703df47204823c75e5.jpg

Естественно в процессе поиска разных блюд я попадал на блюда, где используется вино в качестве ингредиента, закономерно узнал, что есть блюда, которые полагается запивать определенными винами и наоборот вина которые положено пить с конкретными блюдами, следовательно я попал на каналы и ресурсы различных сомелье и винных экспертов и само собой разумеется, что я загорелся добавить вино к себе в приложение и сделать огромный шаг в сторону философии гурмана. Кто скажет навскидку, что пил ресторанный критик Антуан Эго из «Рататуя»? Шваль Блан. Сомелье знают.

Кстати, про сомелье. В процессе добавления винной темы в SystemCook я перелопатил огромное количество инфы из разных источников и это только начало. На ютубе наиболее популярные и раскрученные «винные персоны» это Игорь Черский (первый алкогольный канал), Денис Руденко (шикарные теоретические ролики про вино, очень рекомендую ролики про историю виноделия даже трезвенникам, особенно про бочки и бутылки, заслушаетесь) и Татьяна Селиванова (книжку написала и очень вкусно и складно рассказывает, ее у Черского в роликах можно найти).

Ну так вот, писал Черскому комментарии на канал, комментарии пропадают, писал другим двум экспертам на мыло — ответов нет. О чем писал — о своем приложении, вот так и так, не поможете как эксперт и ответите на пару вопросов, а с меня ссылки на ваши ресурсы, буду признателен, все вежливо и с уважением — тишина. Кстати, когда писал И. Лазерсону, что вот мол хочу из своего приложения ссылки на ваши рецепты давать и спрашивал откуда лучше — он сразу ответил без проблем, бери, говорит, откуда хочешь и можешь даже на меня не ссылаться. А винные эксперты то ли слишком гордые, то ли слишком скромные, то ли почту не смотрят.

В общем по винной теме многое пришлось додумывать самому, разве что разбиение вин на 6 типов взял у Марии Чеботовой (у Руденко одних легких белых типов аж 12 штук это для меня пока перебор, программисты столько не выпьют). Короче, алгоритм автоподбора блюда к вину я таки сделал без помощи сомелье, не являясь сомелье и даже не пробуя ни этих блюд, ни этих вин. Не хочу сказать, что всю работу сомелье может заменить пара скриптов, но львиную её долю — почему бы и нет? Если кто будет следить за каналами, где обозревают вина, то сам увидит, что огромная часть вопросов это что к чему подходит, «каким вином запивать пельмени» и все в таком духе. Ну и подобная совместимость прекрасно алгоритмизируется и предпочтения тут далеко не индивидуальные, даже по обычной аналогии, просто имея в базе заранее заданные связки блюдо+вино можно для аналогичных блюд также определить совместимость, а мой алгоритм помимо этого учитывает массу других параметров, вплоть до кухни и какие продукты с какими сочетаются: «К блюду с зеленым базиликом подают итальянское вино, которое не подходит к морепродуктам» — это как пример формулы.

И по-моему такого автоподбора нигде больше нет. А кто найдет — кидайте в меня ссылки. В общем у меня 200 блюд и 40 вин, 19 белых и 21 красное и на этом я пока остановился ненадолго. Планов на будущее громадьё, идей полно, но первая задача это поиск вина под конкретное блюдо. Все детали по тому, что и как работает на данный момент — в обзорных роликах.

Ссылки на приложение

Бесплатная безалкогольная: https://play.google.com/store/apps/details? id=appinventor.ai_aqua_dna_net.SystemCook

Платная с винной картой: https://play.google.com/store/apps/details? id=appinventor.ai_aqua_dna_net.SystemCookExt10

Патреон тут: https://www.patreon.com/systemcook? fan_landing=true

Спасибо за внимание. Я кон… выговорился.

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

з.з.ы. Разница между нами и ими в том, что у них едят и запивают, а у нас пьют и закусывают. © И.И. Лазерсон

© Habrahabr.ru