Trigger warning: скрепы.
TL;DR: Я сделал механическую игрушку на российский конкурс, и это была очень сложная инженерная задача.
Несколько месяцев назад Российское Общество «Знание» объявило конкурс «Родная Игрушка»: нужно было отправить идею какой-нибудь куклы, модельки, конструктора, настолки итд, которая впоследствии может производиться в России и обладать соответствующим культурным или научным колоритом. Было подано что-то около 22 тысяч идей, я отправил две. В следующий тур вышло несколько сотен, в том числе внезапно одна из моих — заводная подводная лодка, которая плывет не вперед, как существующие заводные игрушки для ванны, а прям погружается и всплывает. Связал я это не с военными подлодками, а с научными глубоководными аппаратами, по которым у России несколько мировых рекордов. Вы знали, например, что Кэмерон брал наши глубоководные «Мир-1/2» для съемок Титаника? А еще они первыми достигли дна Северного Ледовитого Океана.
После отбора вы попадали в этап моделирования, где нужно было сделать 3D-модель, чертежи, спецификацию, описание и так далее. Здесь я уже не обошелся без помощи профессиональных 2D и 3D художников. Заказал эскизы и моделирование внешнего вида, а сам уже в Компасе дорабатывал нужные элементы для сборки.
Моделирование отсекло ещё значимый процент участников, где-то 70-80 человек в пяти категориях вышли на этап создания прототипа. И вот тут я скажу вам, сложно передать, сколько хитрых инженерных задач пришлось решить по пути. Проект оказался одним из самых сложных (и одним из самых интересных) в моей практике. Вообще, айтишнику полезно поработать с материальным миром, изобилующим погрешностями и допущениями.
Герметичность корпуса, например, испытывает противоположные воздействия при движении в среде вверх и вниз — швы, не пропускающие при погружении, начинают пропускать при всплытии. Разница в два грамма балласта на таких масштабах влияет на плавучесть очень значительно, поэтому балласт должен легко регулироваться (я остановился на двух отсеках с ружейной дробью). Мультипликатор заводного механизма пришлось перепроектировать пять раз, попутно печатая фотополимером зубчатые колеса с модулем пол миллиметра. Сделать фотополимер цветным с устойчивостью к воде — офигенно непростая задача с не самым очевидным решением: в жидкий раствор с нужным базовым оттенком подмешивается пигмент для эпоксидных смол, и только потом печатается на чуть увеличенной засветке. Сделать полностью прозрачное стекло не вышло, но и текущая частичная прозрачность получилась не сразу. Даже у жетонов был десяток итераций, чтобы они не оказались слишком тяжелыми, и чтобы металлическое ядро для захвата магнитом не было слишком далеко от стенок. Добавьте сюда подбор шага и размеров винта, сложности работы с моделью такой формы, летнюю жару, из-за которой постоянно забивался подающий механизм принтера...
Но результатом очень доволен, смотрите видео. Прямо сейчас еду в Москву на выставку игрушек, где выберут победителей, чьи проекты запустят в тираж уже на настоящем производстве.
#gadgets#diy#hobby
🚀Обновление для WebView с упором на производительность и контроль
Вышла версия 1.15.0 библиотеки AndroidX WebKit (WebView). Главное изменение — повышение minSdk с API 21 до API 23 😁
🎯 Ключевые новые возможности:
⚡️ Ускорение загрузки
👉prerenderUrlAsync() — предварительная загрузка (prerender) страниц для мгновенного открытия.
👉Profile.preconnect()— предварительное установление соединения с origin.
👉Profile.addQuicHints() — подсказка WebView использовать протокол QUIC/HTTP3 для ускорения.
🔧 Больше контроля
👉setHyperlinkContextMenuItems() — кастомизация контекстного меню для ссылок.
👉 setBackForwardCacheSettings() — настройка Back/Forward кэша (таймауты, лимиты).
👉Profile.addCustomHeader() — установка кастомных HTTP-заголовков для запросов.
🔒 Безопасность и отладка
👉 Новый WebViewBuilder API для создания WebView с неизменяемой конфигурацией, что повышает безопасность при использовании addJavascriptInterface.
👉 Улучшенные API для отладки асинхронной инициализации WebView.
👉 Также возвращена отправка заголовка X-Requested-With, а старый API для его исключения помечен как deprecated.
#WebView#AndroidDev#Jetpack
🚀Вышел AndroidX WebKit 1.16.0. Забирай в работу интеграции
👉 minSdk поднят до 24 (Android 7.0) — учитывайте при апгрейде.
👉 Async-старт WebView вышел из experimental. startUpWebView вместе с ProcessGlobalConfig позволяют прогреть WebView в фоне до того как он понадобится UI. Эту штуку давно ждали в стабильной версии — для меня самое ценное обновление этого релиза.
👉 Navigation API тоже стабильный. Больше не надо @OptIn — addNavigationListener даёт колбэки на разных стадиях навигации, ошибку загрузки через Navigation.webResourceError, URL текущей страницы через Page. Главное — теперь FCP и LCP метрики прилетают напрямую из WebView без инъекции JS:
// Перед использованием проверь
// WebViewFeature.isFeatureSupported(WebViewFeature.NAVIGATION_LISTENER)
WebViewCompat.addNavigationListener(webView, object : NavigationListener {
override fun onFirstContentfulPaintMillis(page: Page, millisFromNavStart: Long) {
analytics.report("FCP", millisFromNavStart, page.url)
}
override fun onLargestContentfulPaintMillis(page: Page, millisFromNavStart: Long) {
analytics.report("LCP", millisFromNavStart, page.url)
}
override fun onNavigationCompleted(navigation: Navigation) {
navigation.webResourceError?.let { err ->
Log.w("WV", "load failed: ${err.errorCode}")
}
}
})
На один WebView можно вешать несколько листенеров и прокидывать свой Executor если нужны колбэки в фоновом потоке.
👉WebViewCompat.saveState теперь умеет ограничивать размер state. Если ловили TransactionTooLarge при сохранении состояния — это для вас.
👉 Подвезли addJavaScriptOnEvent для инъекции JS на загрузку документа и инъекцию скриптов в isolated worlds без конфликтов со страницей. Гибридным приложениям пригодится.
👉 [EXPERIMENTAL] BackForwardCacheSettings полностью переписали. Если использовали старый Builder через WebSettingsCompat.setBackForwardCacheSettings — ловите ошибку компиляции при апгрейде. Теперь так:
val settings = WebSettingsCompat.getBackForwardCacheSettings(webView.settings)
settings.setMaxPagesInCache(5)
👉Profile.setSpeculativeLoadingConfig депрекейтнут, замена через Profile.setMaxPrerenders плюс PrefetchCache.setMaxPrefetches и setPrefetchTtlSeconds (тоже experimental).
#Android#Webview#Web#AndroidDev
🤖Как использовать WebView с Edge-to-edge (EN,6м)
Разбор как встроить WebView в интерфейс приложения с поддержкой отображения на весь экран (Edge-to-edge). Рассматриваются варианты когда вы отображаете сторонние сайты и свой web контент, когда вы можете на уровне CSS добавить отступы
🔗Ссылка без VPN
#android#edgetoedge#android16#webview#compose