Обновить
23
0.1

Пользователь

Отправить сообщение

Выше приведён пример с #[group(required = true, multiple = true)].

Для первой попытки неплохо, убрать ещё варнинги из кода и прогнать clippy.

clap - довольно мощный инструмент, вместо кастомной валидации лучше сделать так:

use clap::{Args, Parser};

#[derive(Parser)]
#[command(
    name = "pgdr",
    version = "1.0", 
    about = "High-performance cryptographically secure password generator"
)]
pub struct Cli {
    #[command(flatten)]
    charset: Charset,

    /// Total number of characters to generate
    #[arg(short = 'l', long, default_value_t = 16, value_name = "INT")]
    pub length: usize,

    /// IO buffer size in bytes for reading and writing
    #[arg(short = 'b', long, default_value_t = 8192, value_name = "BYTES")]
    pub buffer_size: usize,

    /// Use /dev/random (blocking) instead of /dev/urandom (non-blocking)
    #[arg(short = 'r', long)]
    pub random_source: bool,
}

#[derive(Args)]
#[group(required = true, multiple = true)]
pub struct Charset {
    /// Include lowercase letters (a-z)
    #[arg(short = 'L', long)]
    pub lowercase: bool,

    /// Include uppercase letters (A-Z)
    #[arg(short = 'U', long)]
    pub uppercase: bool,

    /// Include digits (0-9)
    #[arg(short = 'N', long)]
    pub numbers: bool,

    /// Include special symbols (!@#$%^&*()_+-=)
    #[arg(short = 'S', long)]
    pub symbols: bool,
}

fn main() -> io::Result<()> {
    let cli = Cli::parse();
    let mut charset: Vec<u8> = Vec::new();
    if cli.charset.lowercase {
        charset.extend(b'a'..=b'z');
    }
//…

Тут нужен тег "Ненормальное программирование".

Надеюсь, это всё отключается флагами условной компиляции и не попадает в релизную прошивку?

Ага, робот, с операционкой ROS.

Мне рассказывали о человеке, который не знал, как печатать на компьютерной клавиатуре. А на смартфонной клавиатуре - ок.

Нет, не он, это входной параметр, а не выходной.

Я всё ещё жду, когда прикрутят параметр "вероятность галлюцинации" в ответе. Уже были исследования, которые позволяли определелить ответ был сгенерирован из известных "токенов" или просто выдуман без опору на "факты".

Так наоборот: автоматический выключатель на 16 ампер дешевле, чем 6.

версионируйте API так, чтобы v2 жил рядом с v1, не мешая ему гнить в покое

Несколько историй про ГИС:

  • в первой ГИС сразу заложили v1 и v2. Документация к v1 почти отсутствала, да этот и не нужно, ведь есть v2! Пока в один день разработчики не решили расширить объекты api, добавив новые обязательные поля. И при этом решив сохранить совместимость. Правильная реализация: создать v3 и поставить нужные валидаторы на входе, а v2 же недостающие поля заполнять каким-то значением по умолчанию или ничего не делать. Но разработчки пошли по своему пути: для v2 расширили количество полей, но сделать поля обязательными не смогли из-за нарушения обратной совместимости, поэтому полезность "нового" api стало стремиться к нулю, так как у разработчиков нет рычага давления на пользователей, чтобы те переходили на "новое" api;

  • в другой ГИС просто каждый год выходит новая версия с номером v1. Полностью не совместимая со старым api. На следующий год уже анонсировали, что уберут множество методов для api, единственная альтернатива - вносить данные руками через их веб-интерфейс;

  • и немного шедевральное, одна и та же функция, которая принимает ДВА разных типов объектов (часть полей совпадает). Внутри функция по "лишним" полям догадаывается, какой именно объект её передали, а потом конвертирует json в… excel. Ну а что, отлаженный парсер excel у разработчиков уже был (раньше система принимала только excel, потом быра расширена до json). Причём в json должны обязательно содержаться все ключи объекта, а если null, то его необходимо записать как пустую строку.

А что не так с "автоматом на 15 ампер на холодильник"? Какой был автомат - такой и поставили, стоимость копейки по сравнению с работой.

То же самое на расте (Result для обработки ошибок и стирание типов при компиляции, в рантайме работает так же быстро, как если бы использовался обычный usize):

use std::ops::{Add, Mul, Sub};

#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord)]
pub struct Weight(usize);

impl Weight {
    #[allow(clippy::unwrap_used)]
    pub fn from_grams(grams: i32) -> Result<Self, String> {
        if grams < 0 {
            Err(format!("Weight cannot be negative: {} g", grams))
        } else {
            Ok(Self(grams.try_into().unwrap()))
        }
    }

    pub fn from_kilograms(kilograms: i32) -> Result<Self, String> {
        Self::from_grams(kilograms * 1000)
    }

    /// Получить вес в граммах
    #[must_use]
    pub fn inner(self) -> usize {
        self.0
    }

    #[must_use]
    pub fn is_between(self, first: Self, second: Self) -> bool {
        let min = first.min(second);
        let max = first.max(second);
        min <= self && self <= max
    }

    #[must_use]
    pub fn is_empty(self) -> bool {
        self.0 == 0
    }
}

impl Add for Weight {
    type Output = Self;

    fn add(self, rhs: Self) -> Self::Output {
        Self(self.0 + rhs.0)
    }
}

impl Sub for Weight {
    type Output = Result<Self, String>;

    fn sub(self, rhs: Self) -> Self::Output {
        if rhs > self {
            Err(format!("Weight cannot be negative: -{} g", rhs.0 - self.0))
        } else {
            Ok(Self(self.0 - rhs.0))
        }
    }
}

impl Mul<usize> for Weight {
    type Output = Self;

    fn mul(self, rhs: usize) -> Self::Output {
        Self(self.0 * rhs)
    }
}

В репозитории дебиана ж.

Возможно, код большинства программ визуально выглядел бы более «словесным». Например, вместо for (int i=0; i<10; i++) { ... } писали что-то вроде FOR i = 0 TO 9 ... NEXT i. Сохранилась бы и традиция нечувствительных к регистру ключевых слов: Begin, BEGIN или begin— неважно.

Тем временем PL/SQL:

declare
    l_result number;
begin
    for i in reverse 1..10 loop
        l_result := i * i;
        if i = 5 then
            l_result := l_result - 1;
        end if;
        dbms_output.put_line(i || ': ' || l_result); 
    end loop;
end;

Домен еще не привязан

На одном крупном сайте зарегистрировался с ником admin. В комментарии к посту пришли настоящие админы и долго возмущались занятым мной ником (который оставался свободным всё 10+ лет существования сайта).

Или если отчёт нужен ен в режиме онлайн, то можно просто пересчитывать раз в час.

Я почти уверен, что автор рассылал свой вирус одноклассникам/одногруппникам.

1
23 ...

Информация

В рейтинге
2 950-й
Зарегистрирован
Активность