1.84K subscribers
3.27K photos
130 videos
15 files
3.55K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
Вы хоть знаете, насколько это тяжело — усердно трудиться в поте лица?

Вот и я не знаю
😁8💩2🤔1
Передача судьбы ❤️
#science #video

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

youtube.com/watch?v=EM-VWNb5Trk
🌚6👍41
#gamedev #video

О том, как в Mirror's edge: Catalyst сломан открытый мир и о том, как он мог бы работать на примере Burnout paradise: игре, в котором открытый мир работает.

youtu.be/gg0Nbfzo_00
А вам когда-нибудь дарили джинсы?
💩6😍3
Forwarded from Programmer memes
Редактор: «Нам надо изменить слово Тинькофф на Т-банк на всем сайте».
Программист: «Ни слова больше»

8️⃣ Programmer memes
Please open Telegram to view this post
VIEW IN TELEGRAM
😁36🤡5
Игра слов в названиях 20 аниме — от Psycho-Pass до Kill la Kill

Игра слов — действенный способ привлечь внимание зрителей. Сериал сразу же запоминается необычным каламбуром или забавным сочетанием фраз в заголовке.

В статье я перечисляю 20 аниме-сериалов, в названиях которых применяется японская игра слов. Список поделён на три группы: Каламбуры, Словослияние и Особенности японского языка.

(15 000 символов / 12 мин. чтения):

Telegraph

#текст
👍5🌚1
А это мои любимые шутки про отличную учёбу.

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

Интересно, насколько человек реально способен учиться в старших классах на настоящие, не "натянутые" отлично? Ну типа одинаково хорошо шарить в алгебре, истории, иностранном, химии, экономике да ещё и отжиматься на физре как боженька? Это уже что-то за пределами нормальности, нет?

Кстати, вы помните, где лежит ваш аттестат?
👍4😁1🤔1😢1
Forwarded from Jem
This media is not supported in your browser
VIEW IN TELEGRAM
😁24❤‍🔥3💩1🌚1
#prog (#suckassstory?)

Костыли Linux из-за "просто текста" в /proc.

Link (самая ранняя версия с этой проверкой)
😁8🤡2🤔1
#prog #article

Fun with IP address parsing

Адреса IPv4 гораздо более странные, чем многие думают
🤯6❤‍🔥2👍1
😒🤚 Топ
😏👉 Кроп-топ
❤‍🔥8👎4💯4👏1
#meme про... Птицу (ультрамариновую мухоловку)
😁20🔥1💩1
Forwarded from Horny Mementi (Greta)
11👍4
#prog #rust #rustreleasenotes

Вышла версия Rust 1.79.0! Как обычно, тут только избранные моменты, остальное в полных заметках.

▪️Стабилизированы inline const блоки! Одно из самых непосредственно полезных применений — array repeat expression. Если раньше приходилось писать что-то в духе:

const EMPTY: Option<Vec<u8>> = None;
let foo = [EMPTY; 100];

, то теперь можно писать просто

let foo = [const { None }; 100];

(конечно, при условии, что вывод типов поймёт конкретный тип Option внутри массива). Более того, в обобщённых контекстах это тоже работает:

fn create_none_array<T, const N: usize>() -> [Option<T>; N] {
[const { None }; N]
}

Ещё одно полезное применение — статические ассерты. Вместо того, чтобы выписывать _-константы, можно просто окружить ассерт const {}:

fn broken() {
const { assert!(2 + 2 == 5) } // ошибка компиляции
}

Это тоже работает в обобщённых контекстах, но по очевидным причинам при зависимости от обобщённых параметров может выстрелить только при мономорфизации:

use std::mem::size_of;

const fn foo<T>() -> usize {
const { assert!(size_of::<T>() > 1) }
size_of::<T>() - 1
}

fn main() {
_ = foo::<i32>();
_ = foo::<u8>(); // ошибка компиляции
}

К сожалению, сейчас у этой фичи есть ограничения. Именно, const-блоки можно использовать только в выражениях, но нельзя, в отличие от обычных констант, использовать их в паттернах (на это сейчас есть отдельная фича). Так что следующий код, к сожалению, пока что требует nightly (и #![feature(inline_const_pat)]):

enum Enum {
Foo,
Bar,
Baz,
}

impl Enum {
fn from_usize(n: usize) -> Result<Self, usize> {
use Enum::{Foo, Bar, Baz};

Ok(match n {
const { Foo as _ } => Foo,
const { Bar as _ } => Bar,
const { Baz as _ } => Baz,
_ => return Err(n),
})
}
}

Ещё одна особенность — если const-блок находится в статически недостижимом коде, то он может быть не вычислен и, соответственно, не вызвать ошибку компиляции на ошибочной константе.

▪️Теперь можно писать ограничения на ассоциированный тип прямо в баундах: T: Trait<Assoc: Bounds...>. В stabilization report рассказывается более подробно, чем это полезно. Одно из применений — возможность указывать ограничения на ассоциированных типах на неназываемых impl Trait типах.

▪️Продление времени жизни ссылок на временные значения теперь работает и при возврате из if и match. Этот код компилируется сейчас и не компилировался раньше:

let a = String::from("a");
let _ = if true { &a } else { &String::from("b") };
let _ = match () {
() => &String::from("c"),
};

▪️main теперь может быть реэкспортом, а не определена непосредственно в корне иерархии:

mod foo {
pub(crate) fn bar() {}
}
use foo::bar as main;


Так можно использовать и функцию из другого крейта.

▪️Команды cargo теперь по умолчанию учитывают MSRV (minimal supported Rust version) при выборе версий зависимостей.

▪️rustdoc теперь показывает имена в результатах поиска один раз, даже если они доступны по нескольким путям из-за реэкспортов.

▪️У трейта Clone есть метод clone_from с сигнатурой fn(&mut self, source: &Self), который позволяет перезаписать содержимое self напрямую вместо того, чтобы замещать self полностью свежей копией. Однако это только возможность, и большинство типов используют реализацию по умолчанию: *self = source.clone(). Более того, для некоторых типов переопределение этого метода может иметь наблюдаемое изменение поведения по сравнению с реализацией по умолчанию, даже если clone_from не имеет намеренно отличную семантику. По этой причине std теперь документирует переопределённый метод clone_from на коллекциях.
🔥3