пзц побаловался :)

Флейм. Только просьба - не материться! :)

Модератор: Дед Пахом

Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

пзц побаловался :)

Сообщение RaFaeL »

porutchik писал(а): 31 Январь 2025, 22:19 Класс стал более стабильным и безопасным. Основные проблемы с утечками памяти и некорректной работой с API устранены. Для полной надежности рекомендуется добавить юнит-тесты для всех методов.
Что ж он не заметил, что методы будут ошибочно работать с более чем двухбайтовыми символами UTF8? )
Аватара пользователя
porutchik
Активист
Сообщения: 194
Зарегистрирован: 01 Февраль 2009, 5:35
Поблагодарили: 7 раз

пзц побаловался :)

Сообщение porutchik »

RaFaeL писал(а): 03 Февраль 2025, 12:47 Что ж он не заметил, что методы будут ошибочно работать с более чем двухбайтовыми символами UTF8? )
он знать всего не обязан. На то он и обучаемый. Укажи ему и во всех остальных случаях будет учитывать. Тот же вопрос про класс с экселем он как видишь решает по-другому. А не как я ему на 2 день задал
Аватара пользователя
porutchik
Активист
Сообщения: 194
Зарегистрирован: 01 Февраль 2009, 5:35
Поблагодарили: 7 раз

пзц побаловался :)

Сообщение porutchik »

попросил высказать идеи про smtplib
Вот предложения по улучшению и доработке SMTP-модуля:

1. **Добавление поддержки SSL/TLS**

Код: Выделить всё

MODULE('SSL_LIB')
    SSL_CTX_new()          FUNCTION(), LONG
    SSL_CTX_free(ctx)      PROCEDURE(LONG)
    SSL_new(ctx)           FUNCTION(LONG), LONG
    SSL_set_fd(s, fd)      PROCEDURE(LONG, LONG)
    SSL_connect(s)         FUNCTION(LONG), LONG
    SSL_write(s, buf, len) FUNCTION(LONG, *CHAR, LONG), LONG
    SSL_read(s, buf, len)  FUNCTION(LONG, *CHAR, LONG), LONG
END

Email_UseSSL         BYTE

PROCEDURE EMail_StartTLS
CODE
    IF Email_UseSSL
        res = mSend_SMTP(Email_Socket, 'STARTTLS<13,10>', 11, 0)
        // Обработка ответа сервера и инициализация SSL
        ctx = SSL_CTX_new()
        ssl = SSL_new(ctx)
        SSL_set_fd(ssl, Email_Socket)
        IF SSL_connect(ssl) <= 0
            ! Ошибка установки SSL соединения
            RETURN ERROR
        END
    END
2. **Улучшенная обработка ошибок с кодами**

Код: Выделить всё

Email_ErrorCodes QUEUE, TYPE
    Code        LONG
    Description STRING(100)
END

PROCEDURE InitErrorCodes
CODE
    ADD(Email_ErrorCodes)
    Email_ErrorCodes.Code = 1001
    Email_ErrorCodes.Description = 'SSL connection failed'
    ! ... другие коды ошибок
3. **Поддержка UTF-8**

Код: Выделить всё

Email_StringToUTF8 PROCEDURE(STRING input), STRING
CODE
    LOOP i# = 1 TO LEN(CLIP(input))
        ! Конвертация символов в UTF-8
        ! ...
    END
    RETURN input
4. **Рефакторинг с использованием констант**

Код: Выделить всё

EMAIL_QUEUE_POS_HOST    EQUATE(0)
EMAIL_QUEUE_POS_HEADERS EQUATE(5)
! ... остальные позиции
5. **Расширенная аутентификация OAuth2**

Код: Выделить всё

PROCEDURE EMail_AuthOAuth2(STRING token)
CODE
    authCmd = 'AUTH XOAUTH2 ' & Base64Encode('user=' & username & '^1 auth=Bearer ' & token)
    mSend_SMTP(Email_Socket, authCmd, LEN(authCmd), 0)
    ! Обработка ответа
6. **Логирование в файл**

Код: Выделить всё

PROCEDURE WriteLog(STRING message)
CODE
    OPEN('smtp.log', APPEND)
    WRITE('<13,10>' & SYSTEMDATE() & ' ' & SYSTIME() & ' ' & message)
    CLOSE
7. **Поддержка больших файлов через потоковую передачу**

Код: Выделить всё

PROCEDURE EMail_AddLargeFile(STRING filename)
CODE
    OPEN(filename, READ+BINARY)
    WHILE NOT EOF()
        READ BLOCK 4096 TO buffer
        EMail_AddChunk(buffer)
    END
    CLOSE
8. **Добавление кастомных заголовков**

Код: Выделить всё

PROCEDURE EMail_AddCustomHeader(STRING header, STRING value)
CODE
    EMail_AddEMail(header & ': ' & value, EMAIL_QUEUE_POS_HEADERS, 0, 0, '')
Рекомендации по доработке:

1. Замените KOI8-R на UTF-8 во всех MIME-заголовках
2. Реализуйте механизм таймаутов для операций с сокетами
3. Добавьте проверку максимального размера письма согласно RFC
4. Реализуйте поддержку DSN (Delivery Status Notifications)
5. Добавьте асинхронный режим отправки
6. Оптимизируйте работу с памятью для больших писем
7. Реализуйте систему шаблонов для писем
8. Добавьте поддержку альтернативных текстовых/HTML версий писем
9. Реализуйте проверку валидности email-адресов по RFC 5322
10. Добавьте поддержку SMTPUTF8 для международных адресов

Пример использования улучшенного API:

Код: Выделить всё

email SMTP_Client
  CODE
  email.UseSSL      = TRUE
  email.Host        = 'smtp.gmail.com'
  email.Port        = 465
  email.AuthMethod  = SMTP_AUTH_OAUTH2
  email.AccessToken = 'ya29.AHES6Z...'
  
  email.SetFrom('Иван Петров', 'ivan@example.com')
  email.AddTo('Мария Соколова', 'maria@example.com')
  email.SetSubject('Тестовое письмо', ENCODING_UTF8)
  email.AddBody('<html>...</html>', CONTENT_TYPE_HTML)
  email.AddAttachment('report.pdf')
  
  status = email.Send()
  IF status != SMTP_OK
    MESSAGE('Ошибка отправки: ' & email.GetLastError())
  END
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5232
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 63 раза

пзц побаловался :)

Сообщение finsoftrz »

А смысл этот поток сознания сюда выкладывать? Может лучше сгенеренную версию класса, предварительно проверив работоспособность?
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
porutchik
Активист
Сообщения: 194
Зарегистрирован: 01 Февраль 2009, 5:35
Поблагодарили: 7 раз

пзц побаловался :)

Сообщение porutchik »

finsoftrz писал(а): 04 Февраль 2025, 6:35 А смысл этот поток сознания сюда выкладывать? Может лучше сгенеренную версию класса, предварительно проверив работоспособность?
на данный момент есть чем заняться. А кому-то может пригодится. А проверять что, уже себе откладываю. Но могу конечно и не выкидывать
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8024
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

пзц побаловался :)

Сообщение Игорь Столяров »

porutchik писал(а): 04 Февраль 2025, 9:15 на данный момент есть чем заняться
Если у Вас будет возможность - сделайте пожалуйста краткую инструкцию
как начать работу с Clarion на DeepSeek для таких тупых как я (т.е. желательно с картинками).

Заранее спасибо ! :D
Make Clarion Great Again ! 😎
Аватара пользователя
porutchik
Активист
Сообщения: 194
Зарегистрирован: 01 Февраль 2009, 5:35
Поблагодарили: 7 раз

пзц побаловался :)

Сообщение porutchik »

Игорь Столяров писал(а): 04 Февраль 2025, 16:44 как начать работу с Clarion на DeepSeek для таких тупых как я (т.е. желательно с картинками).
сейчас чуток поприжали. Раньше просто присоединял файлы inc txt clw tpl и задавал задачу
сейчас ставлю задачу и вставляю код промо в окно чата:
deep--.png
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

пзц побаловался :)

Сообщение gopstop2007 »

Пробовал, надо все тщательно проверять, накидывает синтаксис которого в кларионе нет. Первое впечатление, могу ошибаться, попользовался минут 10, отложил на выходные.
Для примера

Код: Выделить всё

! Динамическое определение количества полей
NumFields = FIELDS(pFm2_.File) 
LOOP F = 1 TO NumFields
    IF WHO(targetRec, F) = '' THEN BREAK END
    Fields.AddPair(WHAT(targetRec, F), WHAT(sourceRec, F))
END
Интересно так влепил FIELDS, может чего то не знаю?!
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
porutchik
Активист
Сообщения: 194
Зарегистрирован: 01 Февраль 2009, 5:35
Поблагодарили: 7 раз

пзц побаловался :)

Сообщение porutchik »

gopstop2007 писал(а): 04 Февраль 2025, 19:57 NumFields = FIELDS(pFm2_.File)
{prop:fields} помню, тут нужно смотреть. Он похоже так же делает. Когда сомневаешься, в том же диалоге преспроси. Он бывает съезжает и заменяет
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8024
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

пзц побаловался :)

Сообщение Игорь Столяров »

gopstop2007 писал(а): 04 Февраль 2025, 19:57 NumFields = FIELDS(pFm2_.File)
Это наверно уже надо смотреть здесь:
https://ru.wikipedia.org/wiki/%D0%93%D0 ... %BA%D1%82)
Make Clarion Great Again ! 😎
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5232
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 63 раза

пзц побаловался :)

Сообщение finsoftrz »

В abc такое есть. Такое впечатление, что ему кларину доку скормили, а там в примере в abc подобная конструкция. Он ее и влепил.
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8024
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

пзц побаловался :)

Сообщение Игорь Столяров »

finsoftrz писал(а): 04 Февраль 2025, 21:08 что ему кларину доку скормили
Хоть кто-то её наконец-то прочитал ... :idied:
Make Clarion Great Again ! 😎
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

пзц побаловался :)

Сообщение gopstop2007 »

Вот еще...

Код: Выделить всё

! Для каждого ключа в файле
LOOP KeyNum = 1 TO KEYCOUNT(pFM_.File)
    KeyName = KEYNAME(pFM_.File, KeyNum)
    pFM_.File{PROP:FileManager} SET(GOTO, KeyName, 0)
    IF ERRORCODE() = 0
        GET(pFM_.File)
        ! ... обработка ...
    END
END
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
porutchik
Активист
Сообщения: 194
Зарегистрирован: 01 Февраль 2009, 5:35
Поблагодарили: 7 раз

пзц побаловался :)

Сообщение porutchik »

Игорь Столяров писал(а): 04 Февраль 2025, 20:41 Это наверно уже надо смотреть здесь:
https://ru.wikipedia.org/wiki/%D0%93%D0 ... %BA%D1%82)
нет, пациент не упорствует. Может до этого с неадекватами пообщался, научили плохому. Указанное исправляет.
Хорошо, пользователь указал, что функция MKEY() не существует в Clarion. Нужно исправить условие, которое проверяет двойной клик мыши. В исходном коде использовалось MKEY() = MLEFT вместе с EVENT:DoubleClick, но это неверно.

Сначала вспомню, как в Clarion обрабатываются события мыши. Событие двойного клика уже само по себе указывает на то, что была нажата левая кнопка мыши. Поэтому нет необходимости дополнительно проверять MKEY(), особенно если такой функции нет. Возможно, пользователь перепутал с другими языками программирования, где требуется проверка состояния кнопки.

Значит, условие должно быть упрощено. Вместо проверки MKEY() и EVENT:DoubleClick, достаточно проверить только EVENT:DoubleClick. Но также нужно убедиться, что событие двойного клика корректно обрабатывается в контексте контрола.

Кроме того, в Clarion для обработки событий мыши используются константы типа EVENT:DoubleClick, и они уже связаны с конкретными кнопками. Поэтому проверка на левую кнопку избыточна, если мы обрабатываем именно двойной клик.

Также стоит обратить внимание на то, что в условии используется OR между проверкой на EnterKey и двойной клик. Это правильно, так как любой из этих событий должен активировать редактирование.

Итак, исправленный код должен убрать упоминание MKEY() и MLEFT, оставив только проверку на EVENT:DoubleClick. Тогда условие будет выглядеть так:

IF KEYCODE() = ENTERKEY OR EVENT() = EVENT:DoubleClick
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5232
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 63 раза

пзц побаловался :)

Сообщение finsoftrz »

А откуда взялось EVENT:DoubleClick? :idied:
Я так понимаю, если разные люди будут его всякой фигне учить (или просто ошибки в текстах, которые ему скармливают), то и будет постоянно ерунду писать. То есть тут, видимо, массовость и нужна, чтобы воспринимать наиболее часто встречающуюся информацию как правильное решение.
C6/C12, ШВС, tps/btrieve.
Ответить