Гепардово гнездо
636 subscribers
41 photos
1 file
81 links
El nido del guepardo.

@gepardius тащит в гнездо всякое интересное из мира программирования (и не только).

Etaoin shrdlu cmfwyp!

Еще один мой канал: @sofcheck.
Download Telegram
Переполнение в Java, которое позволяет итерироваться после изменения массива

Как известно, если ArrayList<> поменять во время итерации, то Java кинет исключение java.util.ConcurrentModificationException. Однако это можно обойти. Рассмотрим такой код:

import java.io.*;
import java.util.*;

public class ExceptionHack {
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<>(List.of(1, 2, 3));
Iterator<Integer> iter = arrayList.iterator();
int item = iter.next();
System.out.println(item);
arrayList.add(0, 4);
arrayList.add(1, 5);
for (int i = 0; i < Integer.MAX_VALUE; ++i) {
if ((i & 16777215) == 0) {
System.out.println(i);
}
arrayList.add(0, 3);
arrayList.remove(0);
}
iter.next();
System.out.println(item);
}
}

Он не кидает никаких исключений, хотя между увеличением и созданием итератора проходит много модификаций! Объяснение такое: у ArrayList<>, как и у итератора, хранится счетчик числа модификаций, при каждом изменении он увеличивается. Если счетчики не совпадают, то кидается исключение. Беда в том, что этот счетчик имеет тип int, поэтому его нетрудно переполнить. Чем, собственно, и занимается написанный выше код.
👍5
Forwarded from dev optozorax
ААААААААА, ЭТО ОФИГЕННО!!!! 🤩 Клеточный автомат «Игра Жизнь» симулируется на самом себе бесконечно в обе стороны!!! Просто откройте!

https://oimo.io/works/life/
🔥5👍1
И еще в тему бесконечно-рекурсивных изображений:
https://xkcd.com/1416/

Впечатляет не так сильно, как рекурсивная игра «Жизнь», но тоже довольно залипательно. Можно поисследовать и отыскать всякие разные картинки. Увы, при слишком большом приближении все начинает лагать :(
Как погладить манула при помощи ChatGPT :)

(дисклеймер: не повторяйте описанные действия самостоятельно!)
👍1
Все основные кириллические раскладки делятся на три типа

1) ЙЦУКЕН-подобные
2) QWERTY-подобные
3) болгарская
🔥6
Предположения о том, насколько плохо все со взломом LastPass

“Despite having her master password set to an astonishing 19 characters, our source claims to have experienced a wave of successful attacks against her through the sites and services she uses. These have included messing with her home thermostat to change the temperature to a sweltering 87F (About 30C for those who use sensible measurements).

As fun a prank as that sounds, our contact also reports the attackers used her Apple ID and ATT credentials to change the PIN on her phone, successfully simjacked her, and added a whole bunch of authorized devices to her LastPass account to bypass MFA.”

https://thecrow.uk/lastpass-data-breach-is-starting-to-look-truly-horrendous/
👍1
Немного комментариев по поводу предыдущего поста.

1) Подробности пугают, если здесь есть пользователи LastPass, то лучше срочно менять пароли, сбрасывать открытые сессии и смотреть, правда ли злоумышленник не успел зайти :)

2) Пока не очень понятно, как именно все описанное произошло, учитывая, что по заявлениям LastPass они шифруют все локально и не передают мастер-пароль на сервер (хотя я здесь не очень знаю их механику). Если описанное выше — правда, то будет интересно дождаться подробностей и почитать :)

3) Не стоит все же доверять облачным или несвободным менеджерам паролей, особенно учитывая, что их исходный код закрыт, а процессы внутри непрозрачны. Но я все еще считаю менеджер паролей хорошей идеей — лучше хранить все секреты вместо того, чтобы вспоминать: а какой же пароль стоит на этом конкретном сайте?

Гораздо лучше те менеджеры паролей, которые позволяют хранить все локально и не делают никаких дополнительных удобств по синхронизации: если нужно синхронизировать пароли, то просто берешь и как-то копируешь зашифрованный файлик :) Если пароль для шифрования этого файлика достаточно надежный, и если мы верим в современную криптографию, то на подбор пароля могут уйти тысячи лет, а то и больше.

Например, рассмотрим пароль из 12 случайных маленьких латинских букв — всего 26^12 = 9.54 × 10^12 вариантов. На проверку каждого пароля уходит примерно секунда: дело в том, что для шифрования используется не сам пароль, а его специальный хэш. Этот хэш специально спроектирован так, чтобы для его вычисления потребовалось много времени и памяти (типично порядка секунды времени и гигабайта памяти, но зависит от настроек хэша). Таким образом, на подбор пароля потребуется примерно 3 × 10^9 лет :) Этот процесс можно распараллелить, но из-за лимита по объему памяти на одном сервере можно считать порядка сотен хэшей одновременно, а распараллеливание на GPU не поможет.

Конечно же, наличие уязвимостей в коде (если они есть) сильно упрощает процесс взлома.

Из примеров таких локальных менеджеров паролей могу привести pass и KeePassXC.

4) Из пунктов выше следует, что история в посте очень странная, и стоит ждать подробностей. Но в любом случае лучше поменять пароли, если история со взломом LastPass вас как-либо затронула.
👍3
Про будущее канала

Сегодня последний день года, а это значит, что пора поговорить о будущем :) К тому же, каналу уже почти два месяца.

Как вы могли заметить, в последнее время посты здесь стали появляться сильно реже, чем в начале существования Гнезда. Дело в том, что на первых порах было довольно много материала из моих старых архивов, а архивы, даже большие, имеют свойство заканчиваться :(

Тем не менее, я писать не прекращаю и постараюсь приносить что-то интересное раз в 2-4 дня. Делать каждый день по посту уже, вероятно, не получится. К тому же, все мы страдаем от информационного перенасыщения, и лучше чуть уменьшить объем информации, чтобы и успеть сделать все дела, и успеть внимательно прочитать все посты :) Но главная причина скорее в том, что генерить или даже репостить интересный контент каждый день сложно.

Скоро будет опрос, в котором можно будет указать, с какой частотой вам бы хотелось видеть здесь посты. Его результаты, конечно же, напрямую ни на что не повлияют 😈, но мнение по этому поводу узнать интересно.

Stay tuned!
👍6
С какой частотой вы бы хотели видеть посты на этом канале? (Считаем, что контент по объему и тематике остается тем же.)

В опросе можно выбирать несколько вариантов!
Final Results
3%
Семь и более постов в день
0%
Два-три поста в день
9%
Один пост в день
41%
Один пост в два-три дня
50%
Один пост в неделю
24%
Один пост в две недели
15%
Один пост в месяц
3%
Один пост в два месяца и более
3%
Не хочу больше видеть здесь постов 😈
26%
🐳
2023 не будет простым

Потому что, как известно, 2023 = 7 × 17 × 17.

Надеемся на то, что 2023 год не доставит нам всем неожиданных неприятностей и неприятных неожиданностей, как 2022 :)

Желаю всем подписчикам канала поменьше багов в коде и побольше достижения своих целей :) И конечно же, чтобы никакие внешние и внутренние обстоятельства достижению целей не мешали :)

Всех с Новым годом! 🎉🎄
👍9🔥2🤯1🕊1
Трудности перевода с 🇹🇷

(спойлер: Google и Deepl здесь правы, а Яндекс дезинформирует)
Снова забавный Юникод

1) Пусть в Python верно одновременно
>>> assert x != y
>>> assert len(x) == 1 and len(y) == 1
>>> assert x.upper().lower() == y.upper().lower()
>>> assert x.lower().upper() == y.lower().upper()
>>> assert x.upper().lower() == x
>>> assert y.upper().lower() != y

2) Пусть в Python верно одновременно
>>> assert x != y
>>> assert len(x) == 1 and len(y) == 1
>>> assert x.upper().lower() != y.upper().lower()
>>> assert x.upper().lower()[0] == y.upper().lower()[0]
>>> assert x.lower().upper() != y.lower().upper()
>>> assert x.lower().upper()[0] == y.lower().upper()[0]
>>> assert x.lower().upper() != x
>>> assert y.lower().upper() == y

Угадайте, какими могут быть x и y в обоих случаях
Forwarded from commit -m "better"
https://quick-lint-js.com/blog/cpp-vs-rust-build-times/

Текст про сравнение скорости сборки Rust vs. C++.

От кучи подобных текстов отличает монументальность подхода - коллега переписал 17 тыщ строк с С++ на Rust, для корректности сравнения.

Измеряется вообще ВСЕ - инкрементальные vs полные сборки, различные трюки для ускорения сборки как С++, так и для Rust, в том числе, (за это отдельный респект и уважуха) - попытка собрать тулчейны с #BOLT.

Короче, автор явно одержим скоростью, почитайте.

Выводы? Все сложно!
🔥2😢1
≥ 100

Ура, в Гнезде уже более 100 подписчиков :) Приветствую всех, кто присоединился недавно и надеюсь, что вам понравится контент здесь :)

Эх, теперь мне придется писать еще более годные посты :\ Ну ладно
🔥12👍3
Снова забавный Юникод: ответы

Пора посмотреть, что за строки x и y были в https://t.me/gepardchan/78.

Воспользуемся буквами турецкого алфавита.

1)
>>> x = 'i'
>>> y = 'ı'

Легко видеть, что вызов .upper() приводит оба символа к 'I', после чего они неожиданным образом оказываются равны.

2)
>>> x = 'İ'
>>> y = 'I'

Здесь все чуть интереснее. .lower() на 'I' ожидаемо приводит к 'i', а вот применение .lower() на 'İ' почему-то дает два символа: сначала 'i', а затем '‌ ' (т.е. точку как диакритический знак). Получается 'i‌', что неотличимо от обычного 'i', но по факту у нас две точки, слившиеся в одну.

А вообще, алгоритмы Юникода здесь не очень совместимы с турецким языком, потому что для ı заглавная — это I, а для i заглавная — İ. А применение обычных .lower() и .upper() приводит к другим результатам
🤯3🔥2
Как повесить компилятор Rust

(продолжение к http://t.me/gepardchan/10, но тогда было про Go, а сейчас про Rust!)

Скормите ему вот такой вот код:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=4c9d40ee85823a6574df8b57075380c0

Тогда компилятору придется выписать оооочень (экспоненциально!) длинный тип, и он просто будет компилировать код оооочень долго. А даже если скомпилирует, то займет гигабайты места на диске для получившегося бинарника.

Еще одно соображение: понятно, что Rust — язык богатый, и наверняка существует куда больше способов добиться экспоненциально длинного типа, или как-нибудь еще повесить компилятор. Это лишь один из способов, да и то самый близкий к оригинальному посту про Go.

С Go было интереснее, потому что язык куда более примитивный :)
👍3
Поговорим об абстрактном

Как вы интерпретируете реакцию 🐳?

Я, например, использую эту реакцию достаточно часто (и «кит» в числе тех немногих реакций, которые разрешены в этом канале!). Для меня 🐳 значит что-то среднее между 😁 и 🤡, т.е. когда одновременно кто-то сотворил фигню, и это немного смешно и (или) странно. Хотя описание выше лишь примерное, а точные ситуации, когда я ставлю «кита», определяются интуитивно и не поддаются точному описанию.
🐳27🤔1
https://codeforces.com/blog/entry/111449

Немного написал про участников, которые сдают на контесты Codeforces сгенеренный компилятором ассемблер вместо исходного кода
🤯1