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 more723
Subscribers
No data24 hours
+37 days
+530 days
Posts Archive
А я вот чего подумал.
%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.
Какое решение самое простое? Компактное? Эффективное? Зрелищное?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)
Участие: бесплатно
Формат: онлайн
Организаторы: 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, и передаём их дочернему дроваблу.
Затем берём и… а, погодите-ка, на этом всё.Андроидная жизнь кипит
Сделал библиотеку для теней — FiftyShades.
Обновил гист с кастомным TextView, у которого есть свойства drawableLeft/Top/Right/Bottom/Start/End, реализующие
picasso.Target.
Записался в хейтеры Coil.Всем привет, в следующий четверг, 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. Уж он-то не только не станет разрывать кодпоинты, но и не будет отковыривать от букв ударения, а от смайлов — модификаторы и джоинеры.