Size: a a a

2020 December 31
Блог*
Happy New Year’; DROP TABLE 2020;--
источник
Блог*
Эт самое
С Новым Годом
источник
2021 January 01
Блог*
Не ждите ни развёрнутых новогодних представлений — их вы и так уже услышали достаточно, чтобы они смешались в однородную массу счастьяздоровьябогаствавсегонаилучшего — ни итогов года, потому что, во-первых, они переоценены, а во-вторых, я уже суммировал всё, что мне было важно, на дне рождения Блог*а (https://t.me/dereference_pointer_there/1405), и с тех пор ничего нового не прибавилось
Telegram
Блог*
Итак, сегодня 5 декабря. Чем примечателен этот день? Это — день, когда Блог* появился на свет.

Тогда мои амбиции были невелики: я считал, что этот блог будут читать только моя семья и ближайшие знакомые — полтора-два десятка человек максимум. Собственно, само название, как и логотип, я считал временным — даже думал в какой-то момент его поменять. Оглядываясь назад, легко обвинить меня в недальновидности — но с другой стороны, кто тогда мог подумать, что канал с мемасиками и заметками по расту станет... Не популярным, но всё же достаточно известным?

Тем не менее, наиболее характерные черты канала, кажется, оформились уже тогда — пачки репостов и чужого контента (но обязательно только то, что я прочитал сам), малость разбавленные собственными постами про не совсем тривиальные вещи на Rust (собственно, свой самый первый пост я и сейчас считаю довольно хардкорным — большая часть остальных постов у меня вроде попроще). С течением времени канал обрёл лицо, но не изменил заложенным в самом начало принципам. Единственное…
источник
Блог*
ah yes день "и тебя тоже"
источник
Блог*
С нг, @mersinvald
источник
Блог*
dereference_pointer_there
Лучший пост?
Окончательные результаты
15%
Трейт, гарантирующий нулевой размер
9%
Форматировщики даты
13%
Хроники замыканий
6%
'_ and friends
17%
Абьюз Deref
11%
Макрос для перевода численных констант в строковой литерал
29%
Регуляр_очки
Проголосовало: 89
Опрос завершён (с всего 89 голосов — где вы все?!). Не буду проходится по всем пунктам — иначе это слишком уж походит на самолюбование — хочу отметить лишь наиболее популярный вариант.

Пост про регулярные выражения. Честно говоря, я удивлён. Ну то есть, я писал о куда как более продвинутых вещах, а здесь я даже кода никакого не привёл. В чём же дело? Я вижу две возможные причины.

Во-первых, это тема, понятная и близкая многим разработчикам, да и, в общем-то, также и некоторым из тех, кто программистом не является. Остальные авторские посты у меня погружаются в костыли тонкости Rust — языка всё ещё не особо широко распространённого, а регулярные выражения — это то, пост про что можно скинуть коллеге.

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

А что вы можете сказать по этому поводу? Серьёзно, почему?
Telegram
Блог*
#prog #моё

Если вы используете регулярные выражения — вам должно быть за это стыдно

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

Проблемы

1. Регулярные выражения (за некоторыми исключениями - 1, 2) парсятся в рантайме.
В подавляющем большинстве случаев строка, используемая для построения регулярных выражений, является константной, поэтому принципиально ничего не мешает провести компиляцию регулярного выражения одновременно с компиляцией программы. Большая часть моих следующих претензий напрямую вытекает из этого свойства.

2. Регулярные выражения (далее RE) фактически динамически типизированы.
Разберу подробнее:

2.а. Если в описании RE есть ошибка (незакрытая скобка, обратная ссылка на несуществующий паттерн) — ты не узнаешь об этом до запуска программы. Если RE находится в функции, которая редко вызывается и которую не покрывают тесты, то баг может всплыть уже в, казалось бы, сто лет нормально…
источник
Блог*
#prog #rust

А тем временем вышла версия Rust 1.49.0 🎉. Конечно, вы можете прочитать пост в официальном блоге, но там по традиции пишут не всё, а я, как обычно, нововведения обозреваю выборочно.

Наиболее значимое с точки зрения кровавого энтерпрайза изменение — это поднятие уровня поддержки таргета aarch64-unknown-linux-gnu до tier 1, то есть компилятор гарантированно собирает исполняемые файлы для данной платформы, и для этой платформы обязательны прохождения полного набора тестов. Это изменение значимо не только из-за того, что убирает одно из препятствий на пути к использованию Rust на всё растущем количестве ARM-устройств, но и потому, что это первая не-x86 платформа, которая добралась до tier 1. Это не единственный ARM-таргет, получивший внимание — до tier 2 подняли поддержку aarch64-apple-darwin (да, это M1) и aarch64-pc-windows-msvc.

Впрочем, для тех, кто разрабатывает на Rust под x86, это не столь интересное изменение. А вот что является универсальным улучшением — так это появившаяся теперь возможность привязывать в одном и том же паттерне одновременно и по значению, и по ссылке — честно говоря, я удивлён, что про это в официальном блоге ничего не сказано. Короткий пример:

let [foo, ref bar] = [String::from("foo"), String::from("bar")];

Неразмеченные объединения (union) теперь могут реализовывать Drop. Стабилизирована эта фича именно так, как и предполагалась: в объединении всё так же не разрешается иметь поля, реализующие Drop, так что их надо заворачивать в ManuallyDrop. Для конечных пользователей языка это означает главным образом то, что всякие SmallVec/SmallString, хранящие элементы на стеке при небольшом их количестве, теперь могут переиспользовать память при помощи union на стабильной версии компилятора и не хранить тег, то есть простое обновление компилятора и библиотеки срежет несколько байт с размеров этих типов вообще без каких-либо дополнительных телодвижений. Ну, в идеале.

Массивы всех размеров теперь реализуют Index{, Mut}<всё, чем можно индексировать слайс>. Казалось бы, мелочь, поскольку индексация работала и до этого через deref coercion, но до влития этого PR реализация для массива индексации собственным типом ломала индексацию через usize и всякие Range*.

Ну и наконец, как я уже писал, наконец-то стабилизировали select_nth_unstable{, _by{, _key}}, ю-ху! Теперь можно на изи извлекать n наименьших/наибольших элементов без аллокаций. Дупликации кода тут нет, поскольку это те же алгоритмы, которые и так использовались внутри реализации нестабильных сортировок (что, впрочем, лишь усиливает вопросы о причине долгого срока стабилизации).

Короче — хороший, годный релиз.

P. S.: так как я тоже писал не всё — вот полные записи о релизе.
источник
Блог*
std::collections::linkedin_list
источник
Блог*
#prog #rust #article

Статья об особенностях синтаксиса Rust. Не без огрехов: некоторые аргументы откровенно притянуты за уши.
источник
Блог*
Краткое пособие по эффективному мотивационному менеджменту в картинках.
источник
2021 January 02
Блог*
std::iter::Irritator
источник
2021 January 03
Блог*
#prog #quotes #go

Хабр
источник
Блог*
#prog #meme #haskell

Для тех, кто в теме
источник
Блог*
источник
2021 January 04
Блог*
Вы ведь знаете, что в го надо аккуратно с переменными из for-range обращаться, да?

Наверное каждый хоть раз обжигался о
for k, v := range foo {
   go run(k,v)
}


или что-то похожее, где "захватывается" значение в кложуре. Есть даже пропозал, что давайте от этого уйдём (в го2, когдатотам) https://github.com/golang/go/issues/20733

Там забавный комент добавили, может слышали, Let's Encrypt недавно откатили 3М+ сертификатов. Угадайте из-за чего)))

https://github.com/letsencrypt/boulder/pull/4690/files#diff-d02067a9f9a2bed1110fd4e98641c2effcf5d1d5f18461e35d6ac1535f6e2c21L1411-R1414
источник
Блог*
#prog #go

Несколько более подробно про инцидент. Это к вопросу о том, чем плох Go и почему мутабельность и разделяемость плохо сочетаются.

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

Неприятной особенностью этого паттерна ошибки является то, что переменная может быть захвачена по указателю даже в том случае, если от неё не берётся явно адрес —  можно вызвать на значении метод, принимающий значение по указателю, и это синтаксически неотличимо от вызова метода, принимающего значение по, собственно, значению. Также можно нарезать слайс, и синтаксически это не выглядит как взятие указателя, хотя и является семантически.
источник
Блог*
#prog

Антоша опять делает интересные вещи. Жаль, пока что не хватает кнопки "назад". И fuzzy search имеет смысл чуток подкрутить, потому что когда на Sif находятся sift — это как-то не очень.
источник
Блог*
Есть забавная традиция называть проекты/библиотеки именами различных мифических существ и божеств. И у меня давно лежала идея хелпера по подбору таких названий, но реализовал только сейчас.

Я напарсил самый большой список названий божеств из 43 пантеонов, что дало 4096 уникальных имён (и 9000 если считать ещё все алиасы). Ну а чтобы избежать коллизий, проект на лету ищет эти имена в названиях репозиториев на Гитхабе и показывает топ-результаты.

Из интересной инженерии: проект на Svelte, чуть позже опубликую сорцы. И внутри есть база на 1Мб сырого json'a, которая затаскивается в общий бандл приложения и ужимается до 150кб. И из-за этого хака всё успешно хостится как статика на Digital Ocean'e за 0.00$ в месяц. Дизайн тоже корявенько делал я. И запросы к Гитхабу — клиентские, лимиты запросов — только клиентские. Легчайшая поддержка.

Из того, что осталось доделать: стили на небольших экранах немного едут, но не критично.

Во славу NJARANA, австралийского бога сна хороших собак.

https://newprojectname.dev
источник
Блог*
#prog #rust #meme

Вот это я одобряю. Сразу и жалобы на синтаксис прекратятся
источник
Блог*
Proposal #666
Вместо обычных лайфтаймов переменных в расте использовать:

fn something<á, е́, ó>(ap: &á T, bp: &é T) -> &ó T
источник