Architec.Ton is a ecosystem on the TON chain with non-custodial wallet, swap, apps catalog and launchpad.
Main app: @architec_ton_bot
Our Chat: @architec_ton
EU Channel: @architecton_eu
Twitter: x.com/architec_ton
Support: @architecton_support
Last updated 1 month ago
Канал для поиска исполнителей для разных задач и организации мини конкурсов
Last updated 1 month, 3 weeks ago
Хочу сегодня поговорить про деньги.
Я для себя делаю такое разграничение между работой и хобби: работа это про деньги, потом удовольствие, получается или нет - вообще решать не мне, а тем кто платит мне деньги. Хобби это про удовольствие, затем прогресс (он влияет на удовольствие), ну а деньги тут обычно тратятся, или время, или и то, и другое.
Так вот, очень часто владельцы бизнеса, пытаются сместить деньги с первого плана, мол у нас интересные задачи, мол мы меняем мир и прочее. Но если вы не бизнес партнёр, который принимает решения, то слушать такие сказки от C-уровня управленцев не стоит. Посмотрите на этот разбор о ситуации с Mozilla: https://itdm.com/mozilla-firefox-usage-down-85-but-why-are-execs-salary-up-400/2050/
Если вы работаете, то предоставляете услуги и тратите своё время в обмен на деньги. Деньги должны быть инструментом манипуляции. Всё остальное - это сказки.
Часть вторая: 4. Limit Function Size — старое доброе "код функции или метода должен умещать на одном экране", что-то из разряда "дорогу стоит переходить только убедившись в безопасности её перехода". Тем не менее в расте есть lint для ограничения размера…
Случайно наткнулся на интересный блог и там есть хороший пост про систему модулей в Rust, а также описанием различий crate и package.
Принцип бойскаута, ну или некое подобие оного. Когда встречаете проблему в прямой или транзитивной зависимости вашего проекта, иногда стоит попробовать потратить пару часов своего времени и решить её.
Например так я сделал с https://github.com/tari-project/randomx-rs/pull/73 — у которых была проблема со сборкой на моём странном окружении.
Это стоило мне минут 40 времени на переделку build.rs и тесты, но это явно быстрее, чем ждать пока кто-то другой займётся исправлением за меня. Несмотря на всяких финов, OSS продолжит жить и развиваться.
Интересно как чтение This Week In Rust помогает быстрее осваивать новые инструменты языка. Только вышел 1.82.0, а я уже использую "облегченный" сопоставитель шаблонов (a.k.a. pattern matching) в своём коде:
```
let Events::ViewKeyAdded { view_key } = payload;
view_key
```
А какие новостные рассылки читаете вы? Делитесь в комментариях ⬇️
Красота sqlx.
Как многие из вас знают, sqlx это попытка поиска баланса между ORM и чистым SQL.
Не буду делать обзор на библиотеку, но поделюсь примером того, как можно это выгодно использовать. Был у меня простой запрос:
SELECT MAX(height) FROM blocks
И в одном из тестов, на пустой таблице мой код
```
sqlx::query_scalar("SELECT MAX(height) FROM blocks")
.fetch_one(database)
.await?
```
начал падать с ошибкой, ведь MAX в таком случае вернёт null, а я ожидаю i64. И это вам не какой-то Javascript, тут за меня никто не будет пытаться магически свести одно к другому.
Сначала я пошёл на автомате менять код программы, fetch_optional, unwrap_or и другие средства Rust. Но затем подумал, а нужно ли это на делать на уровне языка программирования?
Может быть запрос и уровень базы данных - это более подходящее место для исправления ошибки? И написал:
SELECT COALESCE(MAX(height), 0) FROM blocks
Keep it simple, как говорится.
Кусок кода или абстракция?
Я стараюсь находить баланс между дублированием кода и абстракциями. Один из спосбов, это определение функции в теле функции.
Переписывая код коллеги, получил следующее.
Было
```
fn decrypt_transaction(...) {
if let Ok(value) = decrypt_with_key(key) {
...
} else {
decrypt_with_key(another_key)
}
}
fn decrypt_with_key (...) {
...
}
```
Стало
```
fn decrypt_transaction(...) {
fn decrypt_with_key (...) {
...
}
if let Ok(value) = decrypt_with_key(key) {
...
} else {
decrypt_with_key(another_key)
}
```
В чём же разница? Мне кажется тут хороший баланс - мы вынесли часть кода в отдельную функцию, которая вызывается дважды. При этом эта функция строго привязана к внешней функции, не может быть вызванна где-то ещё, потому-что это не абстракция, а просто попытка не дублировать код дважды.
Более формально можно выделить это так, при N < 3, где N это число возможных мест вызова функции и L < 20, где L это количество строк кода этой функции, стоит максимально ограничить её видимость. Это может быть ограничение внутри модуля, а может быть и внутри функции или другого блока.
Небольшой пост выходного дня, после нескольких лет скитаний я бросил якорь и расчехляю свои старые пидорки. Решил попробовать не танцевать с бубном и взять стандартную экосистему с RPI Imager и Raspberry Pi OS. Очень удобно - в настройках при записи на карту памяти указываем имя для хоста машинки, пользователя с паролем, включаем SSH доступ по паролю или ключу. Также сразу указываем данные для подключения к WiFi, малина будет готова к работе как только получит питание и прогрузит ОСь. Я доволен. 😊
Итак, следующее видео из #oldbutgold не такое уж и старое. Здесь автор канала Low Level разбирает 10 "основных" правил NASA по написанию критически важного ПО. Я решил не просто сделать краткий пересказ, но и сравнить каждое правило с тем, как пишется код…
Завтра сделаю нормальный пост, обещаю — а пока зацените крутой ролик (другой классификации я не придумал) от команды deno (which is written in Rust btw)😅️️
https://www.youtube.com/watch?v=swXWUfufu2w
Architec.Ton is a ecosystem on the TON chain with non-custodial wallet, swap, apps catalog and launchpad.
Main app: @architec_ton_bot
Our Chat: @architec_ton
EU Channel: @architecton_eu
Twitter: x.com/architec_ton
Support: @architecton_support
Last updated 1 month ago
Канал для поиска исполнителей для разных задач и организации мини конкурсов
Last updated 1 month, 3 weeks ago