Size: a a a

2020 December 28
Блог*
#prog #meme
источник
Блог*
У вас есть кубернетес?
источник
Блог*
Что за сайт может находиться на домене верхнего уровня "sexy"? Разумеется, terminal.sexy, сайт для интерактивного подбора цветовой схемы для терминала.

Какие же #prog-раммисты извращенцы.
источник
Блог*
#prog

Статья о том, как запустить исполняемый файл, не загружая его с диска.
источник
Блог*
#prog #python

Сборник неочевидного поведения в Python
источник
2020 December 29
Блог*
Итоги года

Итак, очередной, 2020, год, подходит к концу (и слава б-гу!), а это значит, что пора окинуть взглядом прошлое и набросать планы на будущее. Без лишних слов представляю вам мысли, которыми бы хотелось поделиться с вами:

1. Итоги года переоценены.
источник
Блог*
#psy, наверное?

Очередные лайфхаки для мотивации от Милфгарда: t.me/red_spades/752
Telegram
Красные пики
Несколько лет назад в моём PR-агентстве была проблема с корректорами. Во-первых, они просто непосредственно косячили. Во-вторых, мы часто работаем с профессиональными текстами, где очень дофига разных терминов. Если даже корректор МИФа перепутал экономику с экономией, а корректоры новостных агентств регулярно путают цифры с числами или ген с геномом, то наши регулярно заменяли термины на синонимы. Особенно, если одинаковых слов на абзац было несколько.

Сначала сделали правила корректуры, где почти нельзя трогать исходную речь, а при изменении чего-то в заголовках надо рекомендовать в примечании, а не править. Это решило вопрос с точностью.

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

Обычная схема в том, что автор текста проверяет за корректором. Время спикера…
источник
Блог*
#prog #rust

Илья, ты крут, продолжай в том же духе!
t.me/optozorax_dev/279
Telegram
dev optozorax
В свободное время я продолжаю развивать olytest - прогу для быстрого тестирования программ во время олимпиадного программирования.

Последние фичи:
1. Возможность тестировать конкретный экзешник - a, b, e1. Раньше тестирование запускалось только из main.rs файла, и прошлый код приходилось стирать.
2. Появились CLI команды для генерации и удаления кода экзешников.

Следующие фичи будут обозначаться отдельно, потому что я хочу их прокомментировать.

Фича #3: Автоматический парсинг страницы на codeforces, извлечение имён всех задач и тестов с входными и выхоными данными.

Я парсю html через соответствующие библиотеки, и обращаюсь к результату через селекторы, например все входные данные описываются так: "div.input pre". Что удивительно, для растишки все такие библиотеки есть, и подключаются в два клика.

Фича #4: Возможность указывать в тесте чекер (который ты напишешь как обычный экзешник), который будет интерактивно общаться с программой, и проверять её результат.

А вот это уже интересно. Чтобы понимать что такое…
источник
Блог*
Грузчик-тестировщик для проведения нагрузочного тестирования
источник
2020 December 30
Блог*
#prog #go
источник
Блог*
Любопытный, но довольно бесполезный пример полиморфизма в Go

В гошечке есть несколько способов писать полиморфные функции:

1. интерфейсы;
2. тайп свитчи и тайп кастинг интерфейсов;
3. рефлексия;

Недавно мне понял, что есть чётвёртый подход, который стал возможен с появлением type alias — назовём его апкастингом типов. Работает оно так:

func main() {
 printName(Cat{"Whiskey"})
 printName(Dog{"Chappie"})
}

type Cat struct { Name string }

type Dog struct { Name string }

type named = struct { Name string }

func printName(n named) {
 fmt.Println(n.Name)
}

В спеке Go указано, что присваивание x типа V к переменной типа T валидно в случае, если V и T основаны на одинаковых типах и T — не именованный тип  ("x's type V and T have identical underlying types and at least one of V or T is not a defined type."). Псевдонимы типов не считются именованными типами, так что мы можем принимать в аргумент n любую кастуемую структуру.

К сожалению, это не слишком полезно — наверное только если вы не хотите делать пачку геттеров и у вас есть пачка одинаковых структур разных типов.
источник
Блог*
#prog #rust

Мне недавно мой друг @ilyavenner подкинул такую задачу:

"
fn f() -> i32 {
   unsafe { core::hint::unreachable_unchecked() }
}

задача:
предотвратить неопределённое поведение при вызове функции

условия:
1. запрещено изменять тело функции;
2. исправленная версия функции не должна мешать остальному коду компилироваться (если она нигде не вызывается)"

Надо отметить, что из-за безусловного вызова unreachable_unchecked данную функцию в принципе нельзя вызвать, не вызывая неопределённого поведения, но это в данном случае роли не играет.

Мои первые попытки решить эту задачу были скорее читерскими: отклонить MR, добавляющий эту функцию (передаю привет своим коллегам) или просто обернуть функцию в /* */ . В рабочем чате коллеги предлагали и аналогичные пути решения проблемы, вроде #[cfg(some_defintely_non_existent_feature_name)] или #[cfg(all(x, not(x)))].   Есть, однако и более тонкие пути разрешения проблемы.

Для того, чтобы вызвать функцию, нужно сначала предоставить ей аргументы (это справедливо только для энергичного (call-by-value) языка, коим является Rust). А что, если тип аргумента ненаселён? В этом случае создать значение аргумента будет невозможно (нормальное, а не через днище), поэтому вызывать функцию будет нельзя:

fn f(_: ::core::convert::Infallible) -> i32 {
   unsafe { core::hint::unreachable_unchecked() }
}

Однако, как показал Илья, эту красивую вещь можно обойти при помощи unsafe:

unsafe { f(core::mem::transmute::<_, core::convert::Infallible>(())); }


Да, transmute проверяет, что оба типы — входной и возвращаемый — имеют один и тот же размер (из-за чего её в общем случае нельзя использовать в обобщенных контекстах), однако компилятор Rust считает, что ненаселённые типы имеют размер 0 байт — практическая полезная аппроксимация, но не совсем верная.

Так что же, надежда совсем потеряна? Отнюдь. Илья показал решение, до которого я, к своему стыду, не додумался:

fn f<T: Copy + Drop>() -> i32 {
   unsafe { core::hint::unreachable_unchecked() }
}

Дело в том, что ни один тип в Rust не может одновременно реализовывать Drop и Copy. Вызов этой функции потребует инстанцировать T неким типом, а его нет и быть не может. Более того, использовать transmute для обхода не получится, поскольку для этого нужно, опять-таки, конкретизировать тип f, что невозможно сделать. Вот она, сила типов!
источник
Блог*
Ничто так не бодрит с утра
источник
Блог*
Когда твоя жена - ветеринар, то это не только много живности в доме, но и, внезапно, крабоугодные иконы от её коллег ветеринаров-художниц.

Я теперь, видимо, сертифицированный Rust-евангелист.

Клац-клац! 🦀
источник
Блог*
Редкие эпизоды из абсурдной жизни программиста.

"Две пиццы — это не про размер команды, а про размер фонда оплаты труда"

@topizza #blogrecommendation
источник
2020 December 31
Блог*
#prog #meme #rust

Коротко про то, как большинство видят мой канал
источник
Блог*
источник
Блог*
Плюсы и минусы калькулятора

Плюсы: ➕
Минусы: ➖
источник
Блог*
dereference_pointer_there
Ну и в годовщину имеет смысл устроить небольшое голосование. Я отобрал пачку наиболее достойных, на мой взгляд, авторских постов, а теперь предлагаю судить вам о том, какой из них лучший. Вот они (ибо ссылки в опросах не работают):

1. Реализация трейта, гарантирующего нулевой размер Self.
2. Написание zero-cost (ну, почти) форматировщиков даты.
3. Эпические "Хроники замыканий" в трёх частях: раз, два, три.
4. Рассказ о lifetime elision и анонимном лайфтайме ('_).
5. Как написать код, за который вас возненавидят коллеги (или о том, как можно абьюзить Deref).
6. Конструирование макроса, переводящего численные константы в строки на этапе компиляции.
7. Тонкий и глубокий анализ недостатков регулярных выражений (aka "Да не бомбит у меня!").

⬇️⬇️⬇️⬇️
На Новый год подведу итоги
источник
Блог*
Пока что самая оригинальная открытка, которую видел
источник