Size: a a a

2020 November 06
Блог*
#prog #meme
источник
Блог*
источник
Блог*
Быть ребёнком — отстой.
Быть подростком — отстой.
Быть взрослым — отстой.
источник
Блог*
#quotes
no context
источник
Блог*
единственное асексуальное кондитерское изделие, которое мне известно — пирожок с вишней в маке
источник
2020 November 07
Блог*
А тем временем Rustfest Global начнётся сегодня в 4 ночи по Москве
источник
Блог*
#prog #web
источник
Блог*
Сэм Ричард из Google написал статью об опыте добавления локализации и интернационализации для статически генерируемого сайта — "Internationalization And Localization For Static Sites".

Сэм работал над блогом chromeos.dev, для генерации сайта был выбран движок 11ty. Нужно было сделать так, чтобы переводчики могли без проблем работать с контентом. Рассматривалось несколько вариантов, остановились на структуре, в которой каждая локализация находится в своей директории, а логика адаптации контента под нужную локаль работает в сервис воркере.

Если пользователь заходит на сайт без установленного сервис воркера, то локализация страницы, на которую он попал, записывается в IndexedDB как предпочитаемый язык. Установленное значение можно потом поменять с помощью переключателя языков. После установки сервис воркера он начинает перехватывать все запросы на сайт и при необходимости перенаправляет на страницы с выбранной локалью.

Рекомендую почитать статью всем, кто поддерживает статически генерируемые сайты и хочет добавить локализацию.

#i18n #ssg

https://www.smashingmagazine.com/2020/11/internationalization-localization-static-sites/
источник
Блог*
#prog #meme
источник
Блог*
Няня в файлосад
источник
2020 November 08
Блог*
В слове "команда" нет буквы "Я". Зато она есть в слове "Ягермейстер"!
источник
2020 November 09
Блог*
#prog #typescript

Статья (перевод на хабре) про структурное объединение типов на Typescript.
источник
Блог*
dereference_pointer_there
#prog #typescript

Статья (перевод на хабре) про структурное объединение типов на Typescript.
источник
Блог*
#prog #rust
Отлично
источник
Блог*
Многострадальный баг с долгой компиляцией асинков наконец-то пофиксили!

Фикс бэкпортнули в beta-ветку и он должен войти в стабильную версию 1.48 (19 ноября 2020, через полторы недели).
источник
Блог*
Порой я слишком ленив для того, чтобы
источник
Блог*
dereference_pointer_there
...С другой стороны, зачем ограничиваться именно u32? Наш код вполне может работать с другими типами! Давайте это исправим:

macro_rules! make_literal {
   (($n:expr) : $ty:ty) => {{
       // то же, что и было, но заменяем u32 на $ty
       STR: &str = ...;
       STR
   }}
}


Проверим:

const STR: &str = make_literal!((41 + 1): u32);

fn main() {
   assert_eq!(STR, "42");
}


Оно работает! Хотя... Работает ли?

const STR: &str = make_literal!((-41 - 1): i32);

fn main() {
   assert_eq!(STR, "-42");
}


И...

error: any use of this value will cause an error
 --> src/main.rs:42:26
  |
42 |                 ret[i] = (n % 10) as u8 + b'0';
  |                          ^^^^^^^^^^^^^^^^^^^^^
  |                          |
  |                          attempt to compute `254_u8 + 48_u8`, which would overflow
  |                          inside `to_ascii` at src/main.rs:42:26
  |                          inside `DECOMPOSED` at src/main.rs:59:48


Ясно, нам нужно что-то иное: остаток от деления отрицательного числа на положительное является отрицательным, а нам нужно положительное число, у которого нужно поменять знак. Что, сделаем для этого функцию и запихнём в макрос:

const fn extract_digit(n: $ty) -> $ty {
   let mut ret = n % 10;
   #[allow(unused_comparisons)]
   // ^ сравнение не имеет смысла для беззнаковых чисел
   if ret < 0 {
       // мы не можем написать ret = -ret,
       // поскольку унарный минус не определён для беззнаковых
       ret = 0-ret;
   }
   ret
}


Другие функции нам тоже нужно поменять, чтобы печатать минус:

const fn digits_len(mut n: $ty) -> usize {
   if n == 0 {
       return 1;
   }
   let mut n_digits = 0;
   #[allow(unused_comparisons)]
   if n < 0 {
       n_digits += 1;
   }
   ...
}
...
const fn to_ascii(mut n: $ty) -> ([u8; LEN], usize) {
   #[allow(unused_comparisons)]
   let is_negative = n < 0;
   ...
   while n != 0 {
       ret[i] = extract_digit(n) as u8 + b'0';
       n /= 10;
       i += 1;
   }
   if is_negative {
       ret[i] = b'-';
       i += 1;
   }
   ...


Протестируем:

const STR: &str = make_literal!((-41 - 1): i32);

fn main() {
   assert_eq!(STR, "-42");
}


Работает!

...Закончили ли мы на этом? Нет! Во-первых, я не хочу указывать каждый раз тип выражения. Во-вторых, из-за ограничений macro_rules! после expr нельзя ставить двоеточие, из-за чего мне пришлось внести в синтаксис раздражающие скобки. Как известно, всякую проблему можно решить ещё одним слоем абстракции, поэтому я именно этим и воспользуюсь: я сделаю макрос, который принимает имя и тип и генерирует ещё один макрос с переданным именем, который принимает выражение нужного типа и уже возвращает константу:

macro_rules! make_literal_maker {
   ($name:ident : $ty:ty) => {
       macro_rules! $name {
           ($n:expr) => {{
               // весь остальной код без изменений
           }}
       }
   }
}


Проверим:

make_literal_maker!(make_str_literal_from_usize: usize);
make_literal_maker!(make_str_literal_from_i8: i8);

const STR_UNSIGNED: &str = make_str_literal_from_usize!(41 + 3 - 2);
const STR_SIGNED: &str = make_str_literal_from_i8!(-100 - 1);

fn main() {
   assert_eq!(STR_UNSIGNED, "42");
   assert_eq!(STR_SIGNED, "-101");
}


Вот теперь всё работает. Как всегда, код в гисте.
Кстати, технически этот код unsound, поскольку нет никакой гарантии, что порядок полей в представлении толстой ссылки на последнем stable и на последнем nightly один и тот же 🥴
источник
Блог*
#prog #c #article #abnormalprogramming

Продолжение опуса товарища @HirrolotThinks, на этот раз про continuation passing style на макросах
источник
Блог*
#prog #rust #kotlin #article

Статья Кладова, сравнивающая продуктивность при программировании на Rust и Kotlin при работе с большими проектами
источник
Блог*
#bio

Если вам кто-то будет говорить, что природа устроена разумно — киньте ему эту ссылку
источник