en
Feedback
Javanese Online

Javanese Online

Open in Telegram

Статьи и новости, наблюдения и советы. Кодревью: http://javanese.online/%D1%80%D0%B0%D0%B7%D0%B1%D0%BE%D1%80_%D0%BA%D0%BE%D0%B4%D0%B0/ Обсуждение в @javanese_questions Материалы пишет @Harmonizr

Show more
723
Subscribers
No data24 hours
+37 days
+530 days
Posts Archive
Раскопал занятный баг внутри GradientDrawable (<shape>) в андроиде. Костыль прилагается.

А я вот чего подумал. %username%, ты считаешь, что факториал — хороший пример на рекурсию и генераторы? Бро, нет. Определение
А я вот чего подумал. %username%, ты считаешь, что факториал — хороший пример на рекурсию и генераторы? Бро, нет. Определение n! = n * (n-1)! не только рекурсивно, оно ещё и рекуррентно, то есть следующий член легко вычисляется на основании предыдущего. Итераторы-генераторы в целом подходят, но очень быстро наступит переполнение, т. к. 21! уже не влезает в Long/ULong. Тестировать такой генератор скучно, а всерьёз использовать — больно. В итоге я остановился на табличном методе: сразу вычисляем аж все 20 факториалов, которые вмещаются в Long, и хватит. Никакой рекурсии, никаких вспомогательных объектов, очень просто и «в лоб». Но громоздко, да.

Идея самой компактной версии принадлежит @ivanovn.
fun factorial(n: Int): Long =
    (2..n).fold(1L, Long::times)

Задача: реализовать функцию factorial(n) -> long. Какое решение самое простое? Компактное? Эффективное? Зрелищное?

Присоединяйтесь - https://www.youtube.com/watch?v=8XBjQZ5dLMs

GDG Live: Верстка виджетов и библиотека FiftyShades 🎙28 июля (ср) в 19:00 будем обсуждать разработку и верстку виджетов с Александром Невьянцевым, а также устроим сессию вопросов и ответов по библиотеке теней FiftyShades от Михаила Горюнова. В первой части митапа Михаил сделает демо библиотеки, которая делает нормальную тень в андроиде и затем ответит на вопросы, если таковые появятся. Михаил написал библиотеку, которая рисует произвольные тени https://github.com/Miha-x64/FiftyShades - готовьте свои вопросы, чтобы задать спикеру на сессии. Во второй части вас ждет доклад о виджетах от Александра Невьянцева. Александр покажет основные проблемные точки в разработке виджетов, откуда они появляются и возможные решения. Подробности тут: https://www.meetup.com/gdgspb/events/279490422/

В продолжение темы графики в андроиде. Запилил пару топиков для Hyperskill. * Drawables overview * Graphics overview. Implementing a Drawable

Бесплатный онлайн-митап для Java-разработчиков и тех, кто занимается DevOps – Luxoft TechFest #4 Когда: 3 июня, 18:00 (GMT+3)
Бесплатный онлайн-митап для Java-разработчиков и тех, кто занимается DevOps Luxoft TechFest #4 Когда: 3 июня, 18:00 (GMT+3) Участие: бесплатно Формат: онлайн Организаторы: Luxoft и JUG Ru Group В программе доклад Евгения Мандрикова, ведущего разработчика JaCoCo – «Scala, Kotlin, Java и Code Coverage: показать все, что скрыто». Знаете ли вы, что Scala-компилятор помещает внутрь ваших class-файлов? А чем отличается байт-код, производимый Scala-компилятором, от байт-кода, производимого Java и Kotlin компиляторами? А готовы поспорить? 😏 Смотрите всю программу на https://bit.ly/3hS0U0Z 🔥 А еще мы разыграем сертификаты на онлайн-курсы от Luxoft Training, и все участники мипата получат 10% скидку на любой курс. Подключайтесь, задавайте вопросы и общайтесь со спикерами в дискуссионных зонах. Участие бесплатное, нужно только зарегистрироваться.

О, нам предлагают посмотреть на байт-код 😍

Понадобилось мне в андроидном приложении сделать фоновой картинке centerCrop. В интернете даже нашёлся (почти) готовый CenterCropDrawable. Так что вот очередная #идея: сделать пачку дроваблов, повторяющих поведение различных ScaleType. Всё достаточно просто: создаём класс вида SomeScaleTypeDrawable( d: Drawable ) : DrawableWrapper(d) , а внутри onBoundsChanged рассчитываем новые размеры, тупо скопировав соответствующий кусок кода из ImageView, и передаём их дочернему дроваблу. Затем берём и… а, погодите-ка, на этом всё.

Сегодня 2⁵ марта, наконец-то круглое число!

Андроидная жизнь кипит Сделал библиотеку для теней — FiftyShades. Обновил гист с кастомным TextView, у которого есть свойства drawableLeft/Top/Right/Bottom/Start/End, реализующие picasso.Target. Записался в хейтеры Coil.

Что будет выведено на экран?
Anonymous voting

Что будет выведено на экран?
Что будет выведено на экран?

Начали.

Всем привет, в следующий четверг, 11 февраля, в 18:00 по МСК будет очередная сессия вопросов и ответов с крайне популярным че
Всем привет, в следующий четверг, 11 февраля, в 18:00 по МСК будет очередная сессия вопросов и ответов с крайне популярным человеком в Android и не только разработке, а именно Михаилом @Harmonizr Ссылка на стрим - https://youtu.be/KR99EpB58_Q Михаил является создателем канала @javanese_online и админом чатов @android_ru, @kotlin_lang и многих других. На этой сессии мы узнаём побольше о нем и как это быть админом крупнейших каналов ру пространства Некоторые факты о Михаиле: - на текущем проекте нет ни одного XML layout - использует MVVM и датабайндинг без помощи гугла - передаёт аргументы во фрагменты через конструктор - нет вышки. Никакой - смотрит доклады Шипилёва с удовольствием и интересом - прошёл в Яндекс без знания алгоритмов - пишет свой индикатор для вьюпейджера быстрее, чем нагугливает подходящий - генерирует 9-патчи на рантайме Бей в колокольчик, чтобы не пропустить

Небезызвестный и замечательный Тагир Валеев показал, как, добавив один метод и статически заимпортировав его, можно сделать в джаве читабельный for по диапазону: for (int i : range(0, 10)) { Он упомянул, что переменная i финальная в теле цикла, её нельзя случайно перезаписать и можно безнаказанно захватывать. От себя добавлю, что это круче, чем IntStream.range(0, 10).forEach(, потому что здесь продолжают работать continue и break.

Строки, символы и Юникод Периодически паршу (парсю?) всякие тексты, и возникает желание собрать качественный материал на тему строк и символов. The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) by Joel Spolsky: обзор на Юникод без привязки к каким-либо языкам программирования. Storing UTF-8 Encoded Text with Strings from Rust Book: как Юникод представлен в Расте, чем байты отличаются от кодпоинтов или символов и что такое кластеры графем. Так, мы же тут про Джаву. В 1995 казалось, что 65 536 символов хватит всем, поэтому был выбран UTF-16, в котором char — два байта, а .charAt работает за константное время. Но количество символов в Юникоде уже перевалило за миллион, а это чуть больше, чем 65к, поэтому не все символы вмещаются в два байта. В итоге char содержит обман в своём названии, так как может оказаться половинкой длинного символа («суррогатной пары»), .length() иногда привирает, а за константное время можно получить только немного самообмана. Настоящий кодпоинт помещается в int. В классе Character у большинства методов есть оверлоады для char и int. Настоящее итерирование символов можно подсмотреть в ретрофите, например. У CharSequence есть метод .codePoints(), который возвращает IntStream. Так, количество кодпоинтов можно посчитать за линейное время, вызвав .codePoints().count(). Ну а для работы с кластерами графем есть BreakIterator.getCharacterInstance. Уж он-то не только не станет разрывать кодпоинты, но и не будет отковыривать от букв ударения, а от смайлов — модификаторы и джоинеры.

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