Был тут недавно пост в Горячем про ультразвуковой отпугиватель собак, в комментариях обсуждали, работает или нет, где купить, и т.д.
Возникал мысль - а может ли смартфон в плюс-минус штатном режиме работы издавать ультразвук? Технические характеристики динамика позволяют? И если да, то можно ли программными средствами заставить его такой звук издавать (типа приложение написать)?
Ну и как это проверить на практике, в случае если в теории такое возможно - люди же не слышат ультразвук, а искать для этого собаку на улице не вариант.
Прошу тапками не кидать, я слабо разбираюсь в электронике, может и глупость сказал.
Решил попробовать сделать приложение для мобильных устройств, используя многострадальный Delphi, переделав одну из своих программ для ПК. Получилось как-то так:
Проверял на нескольких устройствах, для древних Андроидов (четыре и ниже) не подойдет скорее всего. Я просто не нашел настолько старый рабочий SDK.
Что могу сказать от себя - делать мобильные приложения тот еще геморой. Эта простая игра из меня все соки выпила. Было не очень интересно, скорее даже напряжно. Чтобы портировать простой код пришлось решить кучу вспомогательных технических задач. Даже не ожидал, что будет так сложно. Наверно, если бы был программистом, то было бы легче, но имеем то, что имеем.
Давно хотел написать простую игрушку на телефон для себя, да и так, чтоб можно было друзьям показать, потыкать. В мобильной разработке довольно давно, так что как делать хорошо понимаю, а вот что делать… С этим всегда проблемы. Обычно работает так: есть люди, которые говорят: «Давай сделаем так для того, чтобы что-то». Потом приходят дизайнеры и говорят: «Выглядеть оно должно вот так». Ты садишься и делаешь. Довольно часто в голове проскакивают мысли из разряда:
А почему мне не сделать свое приложение?
Зачем мне все эти промежуточные звенья?
Хочу сам решать как и что
И вот тогда, полный энергии и запала ты садишься и… И все. Упираешься в то, что у тебя нет идей. Появилась идея? Тогда ты понимаешь, что дизайнер из тебя никакой. Приходит осознание, что наверно, все эти люди есть не просто так. Возвращаешься на работу и делаешь чужой проект дальше, и так по кругу.
Несколько дней назад я ложился спать и подумал, что слишком часто в последнее время вижу, что знакомые играют в игры по типу «отгадай что за слово за N попыток», как у желтого банка была игра «5 букв» или что-то такое. И тут я понял, что сделать ее - не стоит ничего. Тут же взял ноутбук и начал.
План написания приложения был примерно следующий:
Найти в открытом доступе файл с существительными на английском языке, из которого, собственно и будут браться слова
Написать свою клавиатуру - главный по сложности виджет в этом приложении
Написать форму для ввода слов
Добавить элемент монетизации (конечно, куда же без этого)
Выложить в открытый доступ
Итак, поехали. 1 этап прошел довольно быстро и безболезненно, но со своими приколами. Я нашел список слов, состоящий примерно из 1800 существительных, но как оказалось позже, в нем очень много пробелов и довольно часто нет очевидных слов. Но и ладно, для старта подойдет.
Идем дальше. Чтобы написать клавиатуру, надо понять, в каком состоянии могут быть буквы. В целом, достаточно посмотреть пару примеров и Делаем вывод, что состояния может быть 3:
Эту букву мы еще не пробовали
Пробовали, но в загаданном слове такой нет
Пробовали и да, такая буква есть
Выбираем цветовую палитру. Мне лично, очень нравится, как выглядят салатный и оранжевый на сером фоне. Так давайте так с сделаем. С ними еще и голубой будет норм смотреться. Для клавиатуры основным цветом выбираем салатовый. Главной кнопкой аля SPACE сделаем проверку введенного слова. Если букву не угадываем - убираем обводку, если угадываем - добавляем цвета в фон. Получается что-то такое, вроде даже смотрится.
Клавиатура
Поехали дальше. Форма для ввода слов. Тоже долго не думаем, каждая буква в отдельной ячейке, при проверке слова сначала проверим, что все буквы введены, затем проверим, что введенное слово есть в нашем словаре, ну и наконец, по одной букве сравним то, что ввел пользователь с нашим загаданным (взятым рандомно из списка) словом. По состоянию, каждая ячейка для буквы может быть в одном из следующих состояний:
Еще не проверяли
Такой буквы нет в слове
Буква есть, но она не на своем месте
Да, ты угадал! Ровно эта буква и ровно здесь!
По цветам, в целом, возьмем все те же, но добавим еще немного серого для букв, которые нам не подходят. Смотрите, получается что-то такое:
О, это конец?
Казалось бы, готовая игра. Но нет, давайте добавим немного информации для пользователя, не всем же очевидно, что эти цвета вообще значат. В процессе написания, кстати, название просто всплыло в голове и начальный вариант я оставил без изменений: "Worder World". Как вам? Типа Wonder - WORDer, ну вы поняли. Отвлеклись, итак, добавляем кнопку инфо и немного разъяснений в виде попапа. Получается так:
Немного понятней стало
Так, а в чем моя игрушка будет отличаться от большинства других? У меня есть словарь, но правда ли я буду использовать в нем только 5-и буквенные слова? А зачем? Давайте добавим возможность пользователю самому выбирать какой длины слово он хочет. Добавляем стартовый экран с выбором длины. От 5 до 8 как будто должно хватить. А вот и идеальное место, где можно получить профит. 5, 6 - бесплатно, хочешь сложнее - плати)) Почему бы и нет, да и все равно игрушка моя, хочу так и все тут.
Выбираем сложность
Получается вот так. Вкладка магазина возможно получит жизнь в будущем, если есть идеи что туда добавить - пишите.
Финальный штрих - добавим стартовый экран загрузки с простой анимацией и немного рекламы (Правда совсем чуть чуть, да и почему нет, все равно с нее заработок измеряется в десятых частях центов). Сделаем попапы о выигрыше или проигрыше да и в целом все, игра готова.
Ну что ж, пошли выкладываться в стор. Аккаунт разраба есть, название есть, описание накатаем, скриншот наделаем, формочки необходимые заполним, отправляемся на модерацию. Что по времени? Прошло часа 3, а внутренний владелец собственной игрушки рад) Всем спасибо, если вдруг захотите посмотреть - вот ссылочка https://play.google.com/store/apps/details?id=com.agamatech...., если находите слова, которых нет в моем не очень большом словаре, или вы придумали, что крутого можно туда добавить - пишите, сделаем!
Добрый вечер всем. Или не вечер- у кого что... Когда то я уже писал, что по утрам подрабатываю сборщиком заказов (грузчик, водитель и что попросят) и решил написать себе в помощь программу. Далеко не программист, совсем далеко, но первая версия появилась на свет в года полтора назад.
Написана программа на Visual Basic (Microsoft Visual Studio 2008), так как на руках был простенький сканер сбора данных (Motorolla, модель не помню, но попозже, как буду дома- выложу фото). Не было сенсорного экрана и навигация осуществлялась кнопками. Сурово и просто. Тогда эта программка неплохо помогла мне (даже на основной работе). Чуть позже появлялись другие ТСД (на андроиде, фирмы Urovo), но что то мне в итоге не понравилось (да и цена за терминал этой фирмочки был не мал) или не получилось и я продал их, оставив один с неисправным тачем. Так я начал переписывать код для Андроид терминалов (да и простого телефона, если к нему подключить беспроводной сканер или проводной- как угодно). Знаний тогда у меня было не многим больше, чем сейчас. Изучать всякие java и Kotlin не смог- глуповат и ленив, а потому выбор пал на блочное программирование, почти для детей, App Mit Inverot. Вот вроде просто- ставь блоки, пиши условия и значения, переменные и прочее... а в итоге не очень, ибо, повторюсь- знаний маловато очень, но что получилось то и получилось. А получилась первая версия программы M3APP (название было выбрано по имени терминал на windows mobile, да так и прижилось).
Много всего там было перепробовано- и голосовой ввод (для баловства), и добавление неизвестных товаров в базу (там и забросил это)... и код стал настолько громоздким и непонятным (хотя, казалось бы- блоки шлёп-шлёп, тужа сюда, плюс на минус, три на ум пошло и готово), и как то всё это работало, но реализация новых затей приносила лишь сумятицу и костыли в код. Было принято решение переписать с нуля, опираясь на первую версию приложения. И вот появилась вторая версия, сегодня. Много что не реализовано, например: - ручной ввод штрихкода - выбор товара из списка (если, например, нет веса или оторвалась этикетка) - экспорт накладной (для импорта, например, в 1С) - Работа с заказами ( чтобы в суматохе не перепутать товар и набирать его именно по списку) - С камеры можно считать только ean-13 и qr code, но нельзя ean-128 (возможно есть другие утилиты, которые могут). - и многое другое... Но потихоньку иду к этому и решил поделиться с вами результатом своего труда, чтобы получить порцию критики и советов. Чтобы знать что нужно ещё добавить, что изменить, что убрать... Готов к любой критике, равно как и к ушату...
1/4
Фото терминала на Android
И да- её можно скачать здесь, специально маленький сайтик сделал на серваке. P.S.- зарегистрировался и отправил на модерацию приложение в RuStore. Так смогу получить больше отзывов и, возможно, улучшу приложение... но это пока только в планах.
Напомню, два месяца назад мы заловились с товарищем @Stich.626 чтобы сделать единообразное + бесплатное мобильное приложение и сайт для расчета ценников в магазинах, которое решили не бросать, любить и лелеять, насколько это возможно.
В этом посте пойдет речь про обновление мобильной программы, и технические аспекты ее написания (все таки сообщество для разработчиков). Поехали!
Недооцененный баннер в Goggle Play
0 - Че там по отзывам
Перед выпуском обновления мы разумеется лезем в обе консоли разработчиков (приложение есть как в Google Play, так и в RuStore), и занимаемся вычитыванием того, что вы там понарасказывали в них, и какие хотелки запрашиваете.
Лично я придерживаюсь мнения, что разработчик (сайта, приложения, не важно) уже сам должен хорошо понимать, чего в приложении хватает (или не хватает), и на основе отзывов должна формироваться картина того, что должно ускорятся, или что добавлять в ту или иную итерацию.
А для всего остального есть MasterCard система тестирования и многочисленные метрики.
Так вот, среди отзывов уже давно проскакивали запросы на добавление списка с историей, сохранение результатов, сравнение нескольких выбранных показателей, и смена валют.
Сегодня вопросом списка с историей мы и займемся.
1 - Нарисуй меня полностью!
Первичный вход в приложение
Перед тем, как что-то наговнокодить написать, нам нужно сформировать в файлах макетов новые сущности для функционирования списка. В нашей основной деятельности появляется один новый блок, основанный на MaterialCardView из библиотеки поддержки M3, который содержит в себе:
Заглушку на основе RelativeLayout, которая показывается, когда еще не было произведено ни одного расчёта;
Сам список ListView, который находится внутри карточки, но невидим до тех пор, пока мы не начнем что либо считать.
Вариация макета при наличии расчетов
Визуально выглядит неплохо, но еще есть над чем поработать.
Дело в том, что ListView (древнейший из компонентов андроида, кста) в своем базовом варианте очень плохо выглядит. Настолько плохо, что если использовать его "как есть", то потом можно выхватить от пользователей лучи поноса:
Чтобы не повторять мем из картинки выше, мы создаем новый файл макета, в котором сверстаем 1 единственный пункт меню, который в дальнейшем будет повторятся, и добавляться к списку каждый раз при его заполнении данными.
Этот же файл, кстати, мы потом переопределим в адаптере, когда доберемся до кода.
В нашем случае получилась довольно простая адаптация, в которой:
Был добавлен корневой LinearLayout, позиционирующий дочерние элементы по горизонтали, с суммарным весом 9
Внутренние (дочерние) блоки, два из которых тоже на основе LinearLayout (но уже вертикально ориентированные), и еще один TextView, который нуждается только в центрировании
И уже внутри наши текстовые переменные, которым мы назначаем айдишки, и будем использовать в коде.
Но перед этим пойдем посмотрим, как это выглядит без учета логики на эмуляторе:
2 - Пишем внутренности
На виртуальном телефоне неожиданностей не произошло, отображается все так как хотелось, поэтому двигаемся в кодильню файл основной активности:
Перво - наперво, нам нужно уяснить несколько логических моментов:
При открытии приложения список уже есть, и поэтому он создается в onCreate. Но он пустой, так как мы еще не наполняли его данными.
Список уже знает, какими данными он будет наполняться (проставлены id и назначен наш кастомный слой), поэтому для него также создан адаптер, базирующийся на SimpleAdapter, который берет данные из HashMap. Он очень удобен (лично для меня), т.к. его можно в дальнейшем наполнять чем угодно: картинками, другими слоями, чекбоксами, и т.д.
Пока пользователь (ты) не начал ничего вводить, смысла показывать его тоже нет, поэтому мы изначально установили заданную видимость заглушки и списка в макете (не в коде). Заглушку видно, список нет.
Из хорошего, когда мы писали приложение в первый раз, то определили подсчет результата через switch - приложение знает, какой показатель мы считаем, поэтому нам просто нужно дать адаптеру сведения из того или иного метода расчёта.
Для этого мы добавляем две строчки кода для каждого из режимов. В первой добавляем данные, а второй говорим приложению, что список обновился (и тебе по-хорошему надо перерисовать список).
Например, для расчета по килограммам это будет выглядеть так:
Проверяем на телефоне, и неожиданностей опять нет - расчет прошел по тому показателю, который мы запрашивали.
3. Доделываем
Всего то 48 предупреждений.
Нам остается пройтись по инспектору, чтобы приложение выглядело не как гавно в глазах IDE более менее сносным (студия сама может проверить, что нужно улучшить или доправить):
Забиваем строковые ресурсы в string;
Раскладываем код по полочкам. Активности переносим в пакет activities, адаптеры в adapters;
Убираем код, который не использовали, или комментим его в TODO
Меняем индексы в приложении, добавляем информацию что мы там накрутили;
Обновляем пакеты, проверяем что из-за них ничего не поломалось.
Формируем AppBundle для Google Play, APK для RuStore (вторые еще толком не научились, а первые уже требуют).
И еще напоследок расшифрую некоторые моменты, которые я не упомянул до этого:
В приложении нет специального параметра (типа boolean до объявления в onCreate, или иного в SharedPrefs, например) для отображения или скрытия блока с заглушкой, так как мы полагаемся на жизненный цикл Android. Другими словами, если приложение было выгружено из памяти, или закрыто, нам не надо сохранять состояние списка, он все равно пересоздаст себя вместе с активностью. Если приложение разворачивается после скрытия (onResume), то все восстановится.
Список изначально не занимает всю площадь экрана, или не раздувается при наполнении (у него фиксированная высота). Это сделано специально, т.к. у нас еще не весь функционал реализован, и ниже будут дополнительные блоки/карточки.
ListView сам по себе является вертикально прокручиваемым по типу ScrollView, поэтому мы сохранили логику прокрутки внутри карточки, и заблаговременно сообщили слою Coordinator через параметр android:nestedScrollingEnabled="true", что вот ты, собака, должен (и будешь) прокручиваться. И даже ничего не сломали в плане юзабилити, пользователю понятно, что там внутри прокручивается список, т.к. есть соответствующая полоса прокрутки.
4 - Что дальше?
Дальше хотелось бы добавить оставшиеся вещи, в той очередности как я их вижу сейчас:
Сохранение результатов в свой собственный список + назначение названия. Например, хлеб в пятерке и в ашане;
Сравнение показателей по выбору их из истории, или из сохраненного списка;
Смена валюты через настройки, т.к. приложение опубликовано в 15 странах.
Публикую ссылки без зазрения совести, так как денег не прошу, а приложение бесплатное, каковым и останется. Ссыль на сайт опционально, для потенциальных вопросов по андроиду, предложений и всего такого.
Несмотря на капризы погоды, лето неумолимо приближается. Значит, занятия в спортивном зале или домашние тренировки получится заменить на активности под открытым небом. Собрали для вас товары, которые сделают уличные воркауты интереснее, увлекательнее и полезнее.
Мегамаркет дарит пикабушникам промокод килобайт. Он дает скидку 2 000 рублей на первую покупку от 4 000 рублей и действует до 31 мая. Полные правила здесь.
В компактную поясную сумку поместятся телефон, ключи, кошелек или другие нужные мелочи. Во время тренировки все это не гремит и не мешает, но всегда находится под рукой. Материал сумки прочный и влагонепроницаемый, вещи в ней защищены от повреждений, царапин или пота.
С фитнес-резинкой можно тренировать все группы мышц: руки, ноги, кор, ягодицы. А еще она облегчает подтягивания и помогает мягко растягиваться. В сети можно найти огромное количество роликов с упражнениями разной степени сложности. Нагрузка легко дозируется: новичкам подойдет резинка с сопротивлением до 23 кг, опытным атлетам — до 57 кг. При этом оборудование максимально компактно и поместится даже в небольшую сумку.
Для тех, кому надоели обычные тренировки. Слэклайн — это стропа шириной 50 мм, с помощью которой осваивают хождение по канату. Тренажер учит сохранять баланс, прокачивает координацию и концентрацию, а еще дает отличную нагрузку на спину, руки и ноги.
Настольный теннис — простой в освоении вид спорта, который отлично помогает размяться и тренирует скорость реакции. В комплект входят две ракетки, три мяча, сетка, накладка и чехол — все, что нужно, чтобы поиграть вечером во дворе с другом или устроить небольшие соревнования. Этот недорогой набор подойдет именно для развлечения и веселья, устанавливается почти на любой стол.
Еще один вид спорта, которым можно заниматься, даже не имея серьезной подготовки — бадминтон. С набором от Wish Steeltec вы сможете потренировать силу удара, побегать и просто хорошо провести время. Детали яркие, так что их трудно потерять даже на природе. Леска натянута прочно, ресурса ракеток должно хватить не на один сезон.
Фрисби воспринимается как простое пляжное развлечение. Тем не менее перекидывание друг другу тарелки задействует все группы мышц и развивает скорость реакции. Эта тарелка летит далеко и по понятной траектории — отличный снаряд для начала. Кстати, фрисби — это еще и ряд спортивных дисциплин со своими правилами и техническими сложностями, так что игра с друзьями может перерасти в серьезное увлечение.
Стильный мяч из износостойкой резины отлично подходит для уличных тренировок. Вы сможете поиграть компанией в баскетбол или стритбол или просто отработать броски. При производстве используется технология сбалансированного сцепления: это значит, что снаряд не сбежит от вас и будет двигаться по стабильной траектории.
Футбол — один из самых популярных в России видов спорта. Играя, можно отлично побегать, потренировать меткость и отработать взаимодействие в команде. Футбольный мяч Torres Striker выполнен из качественного полиуретана и резины и выдержит не один десяток матчей, не потеряв упругости. Отличная балансировка и оптимальный размер делают его подходящим как для взрослых, так и для подростков. Он достаточно тяжелый, почти как в профессиональном спорте, так что совсем малышам не понравится.
Пляжный или обычный волейбол? А может быть, пионербол, как в детском лагере? Мяч TORRES SIMPLE COLOR подойдет для любой из этих игр. Камера отлично держит давление, поэтому вам не придется постоянно подкачивать его, а качественные материалы (полиуретан и бутил) сохраняют все характеристики даже при интенсивном использовании.
Многоскоростной велосипед с рамой 19-го размера подойдет как мужчинам, так и женщинам. Это отличный вариант для новичков: модель доступная, удобная. Поможет понять, нравится ли вам велоспорт. Конструкция велосипеда позволяет ездить по дорогам разных типов, поэтому вы сможете перемещаться по городу или отправиться в поход. Есть складной механизм — велосипед с ним легко возить в машине, на электричке и просто хранить в кладовке.
Более продвинутая модель для тех, кто уже оценил прелесть движения на двух колесах. Геометрия велосипеда предполагает вертикальную посадку. Это обеспечивает более удобное положение тела, чем на других байках. В конструкции предусмотрены детали для комфорта и безопасности: пружинная вилка с ходом 100 мм, сервисная подводка тросов и дисковые гидравлические тормоза.
Если вы не фанат велоспорта, но хотите получить свою дозу физической нагрузки, перемещаясь по городу, выбирайте самокат. В модели PLANK Magic 200 есть регулировка руля по высоте, надежные тормоза и прочная увеличенная дека из алюминия. Когда вы катаетесь на самокате, работают мышцы ног, ягодиц, спины и живота, а заодно добираетесь, куда нужно. Если вы решите сделать паузу в тренировках, самокат легко складывается для хранения.
Любая активность на свежем воздухе требует хорошей обуви, специально сделанной для занятий спортом. Яркие кроссовки Hoka RINCON 3 с облегченным весом амортизируют, снижают нагрузку на суставы. Выраженный рельеф подошвы обеспечивает сцепление с поверхностью вне зависимости от того, где проходит тренировка: на специальной площадке, асфальте или грунте.
Легкие женские кроссовки из линейки Clifton подходят для занятий на твердых покрытиях. Дышащий сетчатый верх поддерживает вентиляцию стоп, чтобы можно было тренироваться даже в жару. Подошва из легкой пены EVA гасит силу ударов. Кроссовки беговые, подходят для тренировок на длинных дистанциях.
Во время занятий на свежем воздухе важно защитить голову от перегрева. С этим отлично справится легкая и светлая бейсболка — например, от GLHF. Она удобно сидит на голове, не сваливается и не отвлекает от занятий, благодаря сетке голова меньше потеет. Козырек жесткий и не мнется.
Не забудьте защитить кожу от солнца — чтобы не было мучительно больно на следующий день после тренировки под открытым небом. В этом поможет крем против пигментных пятен с сильной защитой от ультрафиолета SPF50. Водостойкая текстура легко наносится и быстро впитывается, действует два часа — потом крем нужно обновить.
Удобные и стильные солнцезащитные очки защищают глаза благодаря фильтру UV400, который поглощает до 99.99% ультрафиолета. Они выполнены из легких материалов и плотно прилегают к голове. Ударопрочные поликарбонатные линзы с антибликовым покрытием подходят для разных видов спорта.
Используйте промокод килобайт на Мегамаркете.Он дает скидку 2 000 рублей на первую покупку от 4 000 рублей и действует до 31 мая. Полные правила здесь.
Реклама ООО «МАРКЕТПЛЕЙС» (агрегатор) (ОГРН: 1167746803180, ИНН: 9701048328), юридический адрес: 105082, г. Москва, ул. Спартаковская площадь, д. 16/15, стр. 6