Что будет, если у программиста появится хобби кулинария
Предыстория
Начну издалека, то есть с самого начала. Готовить сам для себя я умел и раньше (до описываемых событий): сварить суп, борщ, пожарить яичницу, картошку — нет проблем. Но готовить что-то конкретно и целенаправленно, да еще и получать от этого удовольствие, мне в голову не приходило. Как-то ползал я по ютубу, пересматривал любимые мультики и попался мне пиксаровский «Рататуй», а в рекомендациях после него выпали ссылки на теоретический ролик про рататуй И. Лазерсона с канала ТВЕда, как сейчас помню. Посмотрел один ролик, другой и понеслась. Лазерсон отличный пропагандист «мужской кулинарии», у него есть настолько завлекательные ролики, после просмотра которых любой мужик, до этого даже не имевший мыслей про кухню, побежит готовить вприпрыжку, я уверен на сто процентов.
Ну вот и я втянулся, начал с капустных салатов, потом собственно рататуй (классический, а не Confit Byaldi из мультика), потом различные блюда с курицей и пошло-поехало. Пересмотрел кучу теоретических Лазерсоновских роликов, потом его же кухни народов мира, классические рецепты, потом начал перелезать на других кулинарных блогеров (Обломова, Емельяненко и др.), короче закончилось это тем, что у меня появилась бумажка, на которую я скрупулезно выписывал названия рецептов, которые в будущем хочу готовить, безотносительно каких-то конкретных кулинарных видосов и блогеров (большая часть от Лазерсона конечно, уж так вышло, потому что он среди меня стал первым «кулинарным гуру»).
У меня даже сохранился этот бумажный теперь уже раритет.
Долгий путь к мобильному приложению
Моя «кулинарная бумажка» довольно быстро подошла к концу, и в этот момент я осознал, что надо было изначально завести хотя бы текстовый файл сразу со ссылками на нужные ролики, чтобы не шариться потом по ютубу и не искать заново. Сказано — сделано, файл с линками готов и заполняется со страшной скоростью, готовить так же быстро, как смотреть кулинарные ролики я никогда не сумею, кстати ради экономии времени я примерно в то же время заимел привычку смотреть вообще все на удвоенной скорости (кроме Урганта, его не получается, ну и музыки конечно).
Далее алгоритм кулинарный развивается следующим образом. Вот собрался я что-то конкретное готовить и мне надо идти в магазин — открываю ссылку, пересматриваю ролик, переписываю (опять на бумажку) ингредиенты, кстати, для тех кулинарных блогеров, у которых состав блюда не указан в описании ролика, приготовлен в аду отдельный котёл, да да. Потом с этой новой бумажкой в магазин и домой, потом пересматривать опять ролик, ну и готовить наконец, и еще в процессе бегать туда-обратно из кухни к компу уточнять рецепт. Дотошный читатель в этот момент наверное захочет спросить меня — «А что ж ты, мил человек, ролики-то смотришь, заходил бы на кулинарные сайты и искал рецепты там! Там же все текстом и статьями сразу есть!» Ну вот я в то время не дозрел до кулинарных сайтов и форумов (сотни их) и готовил «по видосам». Кстати, если бы не видосы, я бы изначально и не запал на кулинарию, текстом хоть в интернете, хоть в кулинарных книгах для меня было не вкусно и не интересно и это точно.
Ну так вот, бегать туда-сюда с бумажками и постоянно пересматривать видосы и переписывать состав мне быстро надоело, особенно когда я готовил одно и тоже блюдо (например борщ или машхурду или курицу, тушеную в овощах по-турецки) по второму разу. Теперь читатель думает — вот тут он наконец допёр, что надо делать мобильное приложение. Нее, тогда я сначала завел канал на яндекс-дзене, для себя же самого, чтобы писать максимально краткие статьи как готовить и из чего и не тратить время на пересмотр роликов. Да и мобилка с андроидом появилась у меня только в начале 21-го года, до этого ходил со старьём Samsung WiTu на виндоус мобайл, пока жена не решила «хватит это терпеть» и не задарила мне новую трубу на день рождения. Это я все к тому, что всего через полгода после того, как у меня появился смартфон на андроиде я уже написал для него свое первое кулинарное приложение и до этого никакого опыта в мобильной разработке не имел. Можете считать, что тут я похвастался.
Дошел до идеи мобильного приложения
Итак, на тот момент кулинария окончательно стала моим хобби, некоторые кулинарные видосы перекочевали в дзен-статьи и пересматривать их больше было не нужно, но для любого нового рецепта никто не отменил ни пересмотр, ни бумажку с ингредиентами, кроме того я осознал одну банальную истину: если идешь в магазин и собираешься готовить несколько блюд, так уж будь любезен подобрать их близко по составу и не бегай в магаз за отсутствующей специей, в общем не надо делать из каждого блюда поход в магазин, а надо чтобы один поход — несколько блюд, так и удобнее и время экономится и продукты в холодильнике быстрее убывают и потому меньше портятся. Кстати, я теперь полюбил ходить по продуктовым супермаркетам (полезная кулинарная побочка).
Короче, на этапе поиска рецептов под похожие ингредиенты я наконец-то дозрел до идеи мобильного приложения. Естественно, инет предварительно был прозондирован на тему уже готового, вердикт — все не то, что мне надо. Я отмел сразу большую часть кулинарных сайтов, форумов и приложений, одни по причине «немобильности», другие по причине неудобства. Почти везде при поиске рецептов по составу предлагается вбивать текст ручками (тыркать на картинки я нашел только в одном месте), не говоря уже о качестве источника. Я ничего не имею против хозяек, которые постят свои рецепты на различные кулинарные сайты и форумы, но сам предпочитаю все-таки готовить проверенное. А как проверенное — это либо если рецепт презентует шеф с репутацией, либо если у блюда есть название и соответственно народная слава и популярность, приобретенная может быть даже и за века (борщ, уха, ну вы поняли).
И возвращаясь к набору текста, я сразу решил, что у меня никто и ничего набирать не будет и все продукты я сделаю картинками и разобью по категориям, чтобы обеспечить максимально быстрый и простой поиск. Собственно исходная идея крайне простая — есть кнопка категории, например МЯСО, тычем на нее, открывается набор картинок: Говядина, Свинина, Курица, и др. тычем на картинку, получаем ингредиент, потом тычем на картинки из других категорий, если надо, и наконец кнопкой «Найти рецепт» выдаем список всех рецептов, где есть указанные ингредиенты, а под каждым рецептом картинками его состав.
Вот как-то так это и должно было выглядеть
Реализация SystemCook
Я справедливо решил, что поскольку ничего сверхъестественного от приложения мне не нужно, то не стоит ударяться в «программирование для андроид», а стоит набрать в поисковой строке «конструктор мобильных приложений». Угадайте, кто получил первый приз? MIT App Inventor 2.
Он гугловский, бесплатный, работает прямо в браузере, проекты хранятся на собственных серваках, есть уроки на ютубе и не только и на хабре есть несколько обзорных статей. Я обозревать его не буду, расскажу свой опыт, особенности и подводные камни. Забегая вперед, скажу сразу, что до сих пор я не пожалел о своем выборе, конечно есть нюансы, но в целом отличная среда разработки, подходящая для моей задачи целиком и полностью, и это вы еще не знаете про масштаб, в который эта самая задача расширилась. Ну, в общем день-другой на «аппинвенторовские» мануалы и через недельку у меня уже была готова первая версия.
Что касается названия — придумалось почти сразу как-то само собой, потому что я хотел привести свое хобби в систему от того и ударился изначально в мобильную разработку.
Масштабирование приложения и грабли 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+. Пропустили!
Низя алкоголь, дитям мороженое
Кстати, для «аппинвенторовцев»: при добавлении в плеймаркет новой версии приложения она должна быть с тем же названием. Никакие переименования не прокатят. Именно в апп инвенторе должен быть проект с заданным названием, его компилировать и загружать в плеймаркет. Это может быть проблемой, потому что апп инвентор бывает не дает сохранить проект под другим именем. Вот не дает и все, говорит «сервак занят, попробуйте попозжей». Т.е. если вы сохранили в апп инвенторе по каким-то причинам проект под новым именем и работаете в нем, а старое «плеймаркетовское» имя не используется, то придется как-то суметь сохранить проект под этим же пользователем под старым именем. Подсказка (может быть проект слишком большой, для компиляции прокатывает, а для сохранения под другим именем нет, но про ограничения на количество проектов и общий размер я нигде не читал).
Дальнейшее развитие. Эногастрономия
Кто без гугла знает, что означает это слово, тому приз. Среднестатистически ленивый читатель, дойдя до этого места моего повествования, наверное думает — ну паренек пиарится на хабре, придумал свою кулинарную прогу для мобилки, на плеймаркете и без него тысячи их, накой оно мне надо, я же ведь сам готовить не собираюсь, нас и в ресторанах неплохо кормят. А я вам тогда вот что покажу. Опа:
Опа:
Опа:
Естественно в процессе поиска разных блюд я попадал на блюда, где используется вино в качестве ингредиента, закономерно узнал, что есть блюда, которые полагается запивать определенными винами и наоборот вина которые положено пить с конкретными блюдами, следовательно я попал на каналы и ресурсы различных сомелье и винных экспертов и само собой разумеется, что я загорелся добавить вино к себе в приложение и сделать огромный шаг в сторону философии гурмана. Кто скажет навскидку, что пил ресторанный критик Антуан Эго из «Рататуя»? Шваль Блан. Сомелье знают.
Кстати, про сомелье. В процессе добавления винной темы в 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
Спасибо за внимание. Я кон… выговорился.
з.ы. Вина сами по себе меня не интересуют, интересует их совместимость с конкретными блюдами, собственно это и есть эногастрономия.
з.з.ы. Разница между нами и ими в том, что у них едят и запивают, а у нас пьют и закусывают. © И.И. Лазерсон