#gamedev
Очередная грустная история о том, как слабый менеджмент убивает видеоигры.
"This account of Anthem’s development, based on interviews with 19 people who either worked on the game or adjacent to it (all of whom were granted anonymity because they were not authorized to talk about Anthem’s development), is a story of indecision and mismanagement. It’s a story of technical failings, as EA’s Frostbite engine continued to make life miserable for many of BioWare’s developers, and understaffed departments struggled to serve their team’s needs. It’s a story of two studios, one in Edmonton, Alberta, Canada and another in Austin, Texas, that grew resentful toward one another thanks to a tense, lopsided relationship. It’s a story of a video game that was in development for nearly seven years but didn’t enter production until the final 18 months, thanks to big narrative reboots, major design overhauls, and a leadership team said to be unable to provide a consistent vision and unwilling to listen to feedback."
https://kotaku.com/how-biowares-anthem-went-wrong-1833731964
Очередная грустная история о том, как слабый менеджмент убивает видеоигры.
"This account of Anthem’s development, based on interviews with 19 people who either worked on the game or adjacent to it (all of whom were granted anonymity because they were not authorized to talk about Anthem’s development), is a story of indecision and mismanagement. It’s a story of technical failings, as EA’s Frostbite engine continued to make life miserable for many of BioWare’s developers, and understaffed departments struggled to serve their team’s needs. It’s a story of two studios, one in Edmonton, Alberta, Canada and another in Austin, Texas, that grew resentful toward one another thanks to a tense, lopsided relationship. It’s a story of a video game that was in development for nearly seven years but didn’t enter production until the final 18 months, thanks to big narrative reboots, major design overhauls, and a leadership team said to be unable to provide a consistent vision and unwilling to listen to feedback."
https://kotaku.com/how-biowares-anthem-went-wrong-1833731964
Kotaku
How BioWare's Anthem Went Wrong - Kotaku
It wasn’t even supposed to be called Anthem. Just days before the annual E3 convention in June of 2017, when the storied studio BioWare would reveal its
Блог*
#gamedev Очередная грустная история о том, как слабый менеджмент убивает видеоигры. "This account of Anthem’s development, based on interviews with 19 people who either worked on the game or adjacent to it (all of whom were granted anonymity because they…
Собственно, один из бывших сотрудников BioWare, работавших над игрой, основал консалтинговую компанию, помогающую бороться с переработками. К сожалению, эта компания, по всей видимости, больше не работает: последний пост в блоге был 3 года назад :(
+1 to Leadership
Positive feedback from Hi-Rez Studios (makers of Smite, Paladins, Jetpack Fighter) I did some leadership training for Hi-Rez back in December. Here’s what the attendees had to say about the experience...
Блог*
Собственно, один из бывших сотрудников BioWare, работавших над игрой, основал консалтинговую компанию, помогающую бороться с переработками. К сожалению, эта компания, по всей видимости, больше не работает: последний пост в блоге был 3 года назад :(
(напоминаю, у блога есть чат @decltype_chat_ptr_t, где вы можете всё это обсудить)
#prog #haskell #cpp #article
Товарищ мёртвопищ опять вызывает бурления широких народных хабромасс.
Haskell быстрее C++!
Python медленнее PHP!
Одна и та же оптимизация приводит к противоположным результатам в GCC и Clang!
...Реализация на других языках программирования (включая Rust) тоже имеется, так что есть шанс сравнить производительность.
https://habr.com/ru/post/483864/
Товарищ мёртвопищ опять вызывает бурления широких народных хабромасс.
Haskell быстрее C++!
Python медленнее PHP!
Одна и та же оптимизация приводит к противоположным результатам в GCC и Clang!
...Реализация на других языках программирования (включая Rust) тоже имеется, так что есть шанс сравнить производительность.
https://habr.com/ru/post/483864/
Хабр
Быстрее, чем C++; медленнее, чем PHP
Привет, Хабр. У меня тут случайно код на хаскеле получился быстрее аналогичного кода на C++. Иногда — на 40%. (время работы, меньше — лучше, C++ снизу) Что самое смешное — я собирал хаскель-код через...
Когда-то я написал на Rust программу, которая переводила числа в строку прописью (т. е. 123 -> "сто двадцать три"). Написал и решил написать статью о том, как написать подобную программу.
Это было год назад.
Статья всё ещё не готова.
Это было год назад.
Статья всё ещё не готова.
😁1
Forwarded from Backtracking (Дима Веснин)
This media is not supported in your browser
VIEW IN TELEGRAM
художник @harryh___h экспериментирует с рендером, который выглядит так, будто листья нарисованы от руки. сделано в Unity
Forwarded from oleg_log (Oleg Kovalov)
Вот эта статья вынесла мозги (друзьям и мне). Да, все же ловить сегфолты в Постгресе неприкольно, хотя хорошо, что скоро будет пофикшено.
The core idea of this approach is to automatically generate queries for which we ensure that they fetch a specific, randomly selected row, called the pivot row. If the DBMS fails to fetch the pivot row, the likely cause is a bug in the DBMS. We tested our approach on three widely-used and mature DBMS, namely SQLite, MySQL, and PostgreSQL. In total, we reported 123 bugs in these DBMS, 99 of which have been fixed or verified, demonstrating that the approach is highly effective and general.
https://arxiv.org/abs/2001.04174
The core idea of this approach is to automatically generate queries for which we ensure that they fetch a specific, randomly selected row, called the pivot row. If the DBMS fails to fetch the pivot row, the likely cause is a bug in the DBMS. We tested our approach on three widely-used and mature DBMS, namely SQLite, MySQL, and PostgreSQL. In total, we reported 123 bugs in these DBMS, 99 of which have been fixed or verified, demonstrating that the approach is highly effective and general.
https://arxiv.org/abs/2001.04174
Блог*
#prog #rust #моё Во время решения одной из задач Advent of Code мне пришлось решать довольно заковыристую в плане владения задачу: требовалось связать цепочку интерпретаторов так, чтобы данные, выдаваемые одним экземпляром интерпретатора, использовались в…
#prog #rust #моё
В конце этой заметки я сказал, что планирую расширить код до поддержки
Теперь попытаемся использовать данный тип:
Хочу особо отметить, что мы получили UB, не написав (как пользователь) unsafe-код и не вызвав unsafe-код напрямую, поэтому наш код unsound.
В конце этой заметки я сказал, что планирую расширить код до поддержки
impl BorrowMut<VecDeque<T>>
. Теперь я понимаю, что это несколько неосмотрительно: код в unsafe полагается на то, что адрес, по которому лежат данные, не меняется. В случае impl BorrowMut
такой гарантии уже нет. Для доказательства того, что подобный вариант является unsound, предположим, что MutPair уже реализовал подобный функционал (это изменение я, с вашего позволения, опущу, потому что это чисто механическое изменение кода) и рассмотрим следующий тип:#[derive(Default)]
struct DeqWrapper<T> {
inner: VecDeque<T>,
}
Для него можно написать следующие реализации Borrow
и BorrowMut
:impl<T> Borrow<VecDeque<T>> for DeqWrapper<T> {
fn borrow(&self) -> &VecDeque<T> {
&self.inner
}
}
impl<T> BorrowMut<VecDeque<T>> for DeqWrapper<T> {
fn borrow_mut(&mut self) -> &mut VecDeque<T> {
self.inner.clear();
&mut self.inner
}
}
Да, это отвратительно, да, так никто (я надеюсь) не пишет. Но принципиально нас ничего от этого не ограждает. Хочу отметить, что код выше не содержит unsafe
.Теперь попытаемся использовать данный тип:
let wrapper = DeqWrapper::<i32>::default();
wrapper.inner.push_back(0);
wrapper.inner.push_back(1);
let mut mut_pair = MutPair::new(wrapper).unwrap(); // (1)
let _ = mut_pair.get(); // (2)
Что тут происходит? В (1) мы делаем внутри MutPair::new
проверку длины дека. Так как при этом мы используем .borrow()
, DeqWrapper
даёт ссылку на поле inner
, длина которого как раз достаточна, поэтому MutPair
возвращает Ok
и .unwrap()
не паникует. В (2) мы вызываем .borrow_mut()
, из дека удаляется данные, MutPair::get
использует get_mut
, предполагая, что данные есть, и — вуаля! — мы получаем ссылку на неинициализированные данные! Что является UB в Rust.Хочу особо отметить, что мы получили UB, не написав (как пользователь) unsafe-код и не вызвав unsafe-код напрямую, поэтому наш код unsound.
Блог*
#prog #rust #моё В конце этой заметки я сказал, что планирую расширить код до поддержки impl BorrowMut<VecDeque<T>>. Теперь я понимаю, что это несколько неосмотрительно: код в unsafe полагается на то, что адрес, по которому лежат данные, не меняется. В случае…
В чём же проблема? Наш код слепо доверял реализации
Каковы решения? Лично я вижу такие:
1) Объявить методы
2) Оставить код как есть. Вполне рабочий вариант, но не исключено, что для кого-то это окажется недостаточно гибким.
3) Обобщить код относительно sealed-трейта и включить в него только доверенные реализации (для
99) Требовать от типов реализовать трейт, который не только даёт мутабельную ссылку на
BorrowMut
, чего делать не стоит (unsafe не должен доверять safe).Каковы решения? Лично я вижу такие:
1) Объявить методы
MutPair
как unsafe
. В принципе, вариант, но это немного лишает смысла эту абстракцию.2) Оставить код как есть. Вполне рабочий вариант, но не исключено, что для кого-то это окажется недостаточно гибким.
3) Обобщить код относительно sealed-трейта и включить в него только доверенные реализации (для
VecDeque<T>
и &mut VecDeque<T>
). Тоже рабочий вариант (если я таки буду публиковать этот код на crates.io, то, вероятно, так и поступил бы), но это выглядит несколько избыточным решением + страдает эргономика: пользователю теперь надо импортировать нужный трейт, который он(а) не может реализовать.99) Требовать от типов реализовать трейт, который не только даёт мутабельную ссылку на
VecDeque
, но и требует доказательство вменяемости такой реализации. К сожалению, этот вариант сильно превосходит текущие возможности Rust и навряд ли когда-то будет осуществлён.rust-lang.github.io
Future proofing - Rust API Guidelines
This is a set of recommendations on how to design and present APIs for the Rust programming language.
#prog #video
Как писать тесты (если быть более точным — тесты для property-based тестирования).
Лично для меня поразила идея metamorphic testing — простая и вместе с тем плодотворная.
https://youtu.be/zvRAyq5wj38
Как писать тесты (если быть более точным — тесты для property-based тестирования).
Лично для меня поразила идея metamorphic testing — простая и вместе с тем плодотворная.
https://youtu.be/zvRAyq5wj38
YouTube
John Hughes - How to specify it! A guide to writing properties of pure functions | Code Mesh LDN 19
This video was recorded at Code Mesh LDN 19 - https://bit.ly/37xc3Nr
Get involved in Code Sync's next conference - https://bit.ly/2Mcm4aS
---
HOW TO SPECIFY IT! A GUIDE TO WRITING PROPERTIES OF PURE FUNCTIONS
by John Hughes
ABSTRACT
Property-based testing…
Get involved in Code Sync's next conference - https://bit.ly/2Mcm4aS
---
HOW TO SPECIFY IT! A GUIDE TO WRITING PROPERTIES OF PURE FUNCTIONS
by John Hughes
ABSTRACT
Property-based testing…
Напоминаю: DRM — это рак
habr.com/ru/company/dcmiran/blog/484718/
habr.com/ru/post/208390/
habr.com/ru/post/171849/
habr.com/ru/post/364775/
habr.com/ru/company/dcmiran/blog/484718/
habr.com/ru/post/208390/
habr.com/ru/post/171849/
habr.com/ru/post/364775/
Хабр
Современные принтеры HP отказываются работать без подписки на чернила
Покупателям струйных принтеров следует быть осторожными. Современные модели продаются с программным модулем DRM. Принтер перестанет работать, если вы не оплатили подписку на чернила В...
В копилку когнитивных искажений: ru.wikipedia.org/wiki/Парадокс_Абилина
Кажется, нужен новый тег... #psy?
Кажется, нужен новый тег... #psy?
Wikipedia
Парадокс Абилина
группа людей может принять решение, противоречащее возможному выбору любого из членов группы