Перейти к содержанию

Евгений Корепов

Пользователи
  • Активность

    728
  • Зарегистрирован

  • Посещение

  • Победитель дней

    94

Евгений Корепов стал победителем дня 19 июня

Евгений Корепов имел наиболее популярный контент!

1 Подписчик

Информация о Евгений Корепов

  • Звание
    Продвинутый пользователь
  • День рождения 22 июля

Информация

  • Пол
    Мужчина
  • Город
    Ухта

Посетители профиля

7 237 просмотров профиля
  1. Да, используйте поиск по этому форуму по Admob. Вот к примеру один из результатов поиска
  2. Не используйте первую попавшуюся, используйте нормальные дистрибутивы. Но если даже у вас настолько странная ОС, то всегда можете анализировать dmesg
  3. Выполняете любимую консольную команду выводящую сведения о железе (к примеру lspci -v) и парсите вывод.
  4. https://unix.stackexchange.com/questions/58846/viewing-linux-library-executable-version-info
  5. В Линуксе просто нет никаких стандартов для размещения версии внутри бинарника. Ембаркадера об этом не в курсе, но по привычке воткнула пустую заглушку ))) Забейте, и просто делайте свою константу с версией.
  6. Тут все просто - нужно ждать. Ваш код работает корректно только в идеальных условиях. Но если вторая сторона не ответила мгновенно, то вы уже ничего не получите. Перед отправкой/получением вам надо проверить наличие соединения функцией FTCPClient.IOHandler.CheckForDisconnect() - при отсутствии соединения она сгенерит исключение: try FTCPClient.IOHandler.CheckForDisconnect(); except on E: EIdException do begin LogError('TUTM5StreamProtocol.Run CheckForDisconnect ERROR ' + E.Message); Reconnect(); end; end; Читать с ожиданием данных можно несколькими способами: 1. Задавать FTCPClient.IOHandler.ReadTimeout в надежде что в отведенное время что то придет. 2. Использовать FTCPClient.IOHandler.ReadLnWait() для чтения строки. 3. Или обрабатывать проверять наличие данных и читать по мере их поступления: if FTCPClient.IOHandler.CheckForDataOnSource(FConnectParams.Timeouts.TCPReadTimeout) then читаем....
  7. Запоминайте в php последний номер добавленной записи (id), добавьте в api метод вроде GetLastRecordsIDs, который будет возвращать все ID нужных таблиц. Клиент пусть долбится в этот метод раз в N секунд и сверяет свои последние ID с ID сервера, при не совпадении - запрос новых данных. В php хранить последние идешники можно как угодно - файл, сессия, ну или memcache чтоб уж совсем быстро было. Я бы хранил в сессии, и сессию сделал в memcached.
  8. Use jsPDF https://github.com/MrRio/jsPDF Example https://www.codexworld.com/convert-html-to-pdf-using-javascript-jspdf/
  9. Как верно подметил Дмитрий - знание SQL наше все. Вот к примеру я создал тестовую таблицу и наполнил ее тестовыми данными: CREATE TABLE `test001` ( `id` int(11) NOT NULL AUTO_INCREMENT, `TimeFrom` datetime DEFAULT NULL, `InA` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8; INSERT INTO `test001` VALUES ('1', '2020-05-17 16:14:36', '1'); INSERT INTO `test001` VALUES ('2', '2020-05-17 16:12:56', '2'); INSERT INTO `test001` VALUES ('3', '2020-05-17 16:12:56', '3'); INSERT INTO `test001` VALUES ('4', '2020-05-17 17:12:56', '4'); INSERT INTO `test001` VALUES ('5', '2020-05-17 17:12:56', '5'); INSERT INTO `test001` VALUES ('6', '2020-05-17 17:12:56', '6'); INSERT INTO `test001` VALUES ('7', '2020-05-17 18:12:56', '7'); INSERT INTO `test001` VALUES ('8', '2020-05-17 18:12:56', '8'); INSERT INTO `test001` VALUES ('9', '2020-05-17 18:12:56', '9'); INSERT INTO `test001` VALUES ('10', '2020-05-17 19:12:56', '10'); INSERT INTO `test001` VALUES ('11', '2020-05-17 19:12:56', '11'); INSERT INTO `test001` VALUES ('12', '2020-05-17 19:12:56', '12'); INSERT INTO `test001` VALUES ('13', '2020-05-17 20:12:56', '13'); INSERT INTO `test001` VALUES ('14', '2020-05-17 20:12:56', '14'); INSERT INTO `test001` VALUES ('15', '2020-05-17 20:12:56', '15'); INSERT INTO `test001` VALUES ('16', '2020-05-17 21:12:56', '16'); INSERT INTO `test001` VALUES ('17', '2020-05-17 21:12:56', '17'); INSERT INTO `test001` VALUES ('18', '2020-05-17 21:12:56', '18'); Для получения почасовых сумм по полю InA мне достаточно очень простого запроса: SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(test001.TimeFrom) / 3600) * 3600), SUM(test001.InA) as SumInA FROM test001 GROUP BY FLOOR(UNIX_TIMESTAMP(test001.TimeFrom) / 3600) * 3600 Результат запроса будет выглядеть вот так: 2020-05-17 16:00:00 6 2020-05-17 17:00:00 15 2020-05-17 18:00:00 24 2020-05-17 19:00:00 33 2020-05-17 20:00:00 42 2020-05-17 21:00:00 51 Скорость выдачи результата будет большой - при миллионах записей в исходной таблице дело нескольких секунд или десятков секунд (зависит от железа сервера). Но это все равно медленно, потому что на каждую запись таблицы будет производится вычисление "FLOOR(UNIX_TIMESTAMP(test001.TimeFrom) / 3600) * 3600" - деление, округление и умножение. Если это разовая выборка - проблем нет. Но если вам нужно регулярно дергать из таблицы данные, то лучше добавить в таблицу поле TimeFromHour, в которое сразу записывать значение FLOOR(UNIX_TIMESTAMP(test001.TimeFrom) / 3600) * 3600. Это можно сделать руками или триггером при вставке. Добавить Индекс по полю TimeFromHour и в запросе тоже группировать (GROUP BY) по этому полю: ALTER TABLE `test001` ADD INDEX `Index-TimeFromHour` (`TimeFromHour`) USING BTREE ; Тогда вы получите максимально возможное быстродействие. Если нужно результат вставить в другую таблицу, то используйте запрос вроде такого: INSERT INTO test_sum (TimeFrom, SumInA) ( SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(test001.TimeFrom) / 3600) * 3600), SUM(test001.InA) as SumInA FROM test001 GROUP BY FLOOR(UNIX_TIMESTAMP(test001.TimeFrom) / 3600) * 3600 )
  10. По умолчанию в TThread классовая функция GetTickCount имеет тип Cardinal, соответственно если приложение рассчитано на долговременную работу, то через 40 дней результат этой функции или уложит приложение (если отключена защита от переполнения) или превратит приложение в тыкву (если на этом завязана какая то логика). Для своего проекта написал хелпер для класса TThread, вдруг кому пригодится. Тестил на win10 x64 и linux x64. unit UnitTThreadHelper; interface uses {$IFDEF MSWINDOWS} Winapi.Windows, {$ENDIF MSWINDOWS} {$IFDEF POSIX} Posix.SysTypes, {$IFDEF MACOS} Macapi.CoreServices, {$ENDIF MACOS} {$IFDEF ANDROID} Posix.Fcntl, {$ENDIF ANDROID} {$IFDEF LINUX} Posix.Time, {$ENDIF LINUX} {$ENDIF POSIX} System.Classes; type TThreadHelper = class helper for TThread class function GetTickCount64 : Int64; static; end; implementation class function TThreadHelper.GetTickCount64 : Int64; {$IF Defined(MSWINDOWS)} begin Result := Winapi.Windows.GetTickCount64; end; {$ELSEIF Defined(MACOS)} begin Result := AbsoluteToNanoseconds(mach_absolute_time) div 1000000; end; {$ELSEIF Defined(POSIX)} var res: timespec; begin clock_gettime(CLOCK_MONOTONIC, @res); Result := (Int64(1000000000) * res.tv_sec + res.tv_nsec) div 1000000; end; {$ELSE OTHERPLATFORM} {$MESSAGE Fatal 'Method not implemented for Platform'} {$ENDIF OTHERPLATFORM} end. При попытке запуска на win x32 упадет - не используйте или проверяйте битность: if CheckWin32Version(6, 0) then begin GetTickCount64; end else begin GetTickCount; end;
  11. Класс для работы с FastCGI серверами, такими как php-fpm. Для тех кто не в теме : веб-сервер, к примеру nginx, получает запросы и отправляет их на исполнение FastCGI серверу, к примеру php-fpm, php-fpm получает имя скрипта, параметры, выполняет все и возвращает результат в nginx, который в свою очередь возвращает этот результат запросившему клиенту. С помощью класса вы можете так же, выполнять php скрипты на локальном или удаленном сервере. Исходники https://github.com/EvgeniyKorepov/FastCGIClient Пример delphi var FFastCGI : TFastCGI; ... procedure TFormMain.FormCreate(Sender: TObject); var AHost : String; APort : Word; AScriptFileName, ARequest, AContent : String; begin AHost := '10.0.0.4'; APort := 9000; FFastCGI := TFastCGI.Create(AHost, APort); FFastCGI.KeepAlive := True; AScriptFileName := '/opt/xxx.php'; ARequest := 'request=1234567890'; if FFastCGI.Get(AScriptFileName, ARequest, AContent) then Memo.Text := AContent else Memo.Text := FFastCGI.StatusCode.ToString + ' ' + FFastCGI.StatusText; end; пример php <?php header('Content-Type: text/html; charset=utf-8'); if (isset($_REQUEST["request"])) if ($_REQUEST["request"] == "1234567890") { header("Status: 200"); echo 'OK'; } else { http_response_code(400); echo "ERROR"; }
  12. В прошлой теме я показал как делать демонов старой школы - серьезных и самодостаточных. Но это все в прошлом. Теперь существуют системы управления процессами, где все намного, намного проще. Исходники тут https://github.com/EvgeniyKorepov/LinuxDaemonNewStyle Заметьте, теперь никаких потоков, все элементарно, systemd сделает всю работу за нас. Половина кода - разбор параметров командной строки. Вторая половина - бесконечный цикл, ожидающий сигналов от экземпляра класса демона нового стиля . Код самого класса сократился на треть. Если запустите приложения в консоли - будет самое обычное приложение, которые умрет при закрытии консоли. Запуск в качестве бессмертного демона - через systemd, причем он сможет автоматически перезапускать вашего демона при крахе. Эти параметры задаются в текстовом файле /etc/systemd/system/DaemonNewStyleTest.service program DaemonNewStyleTest; {$APPTYPE CONSOLE} uses System.SysUtils, System.IOUtils, System.SyncObjs, Posix.Stdlib, Posix.SysStat, Posix.SysTypes, Posix.Unistd, Posix.Signal, Posix.Fcntl, Posix.Syslog in 'Posix.Syslog.pas', UnitDaemonNewStyle in 'UnitDaemonNewStyle.pas'; var AEvent : TEventType; begin if ParamCount = 0 then begin syslog(LOG_ERR, 'No parameters'); ExitCode := EXIT_FAILURE; exit; end; if ParamStr(1).ToLower.Equals('stop') then begin if Daemon.Stop(30) then ExitCode := EXIT_SUCCESS else ExitCode := EXIT_FAILURE; exit; end; if ParamStr(1).ToLower.Equals('reload') then begin if Daemon.Reload() then ExitCode := EXIT_SUCCESS else ExitCode := EXIT_FAILURE; exit; end; if not ParamStr(1).ToLower.Equals('start') then begin syslog(LOG_ERR, 'Unknow parameters'); ExitCode := EXIT_FAILURE; exit; end; syslog(LOG_NOTICE, 'main START'); while Daemon.IsRunning do begin syslog(LOG_NOTICE, 'main LOOP'); Daemon.Execute(AEvent); if AEvent <> TEventType.None then syslog(LOG_NOTICE, 'main Daemon receive signal'); case AEvent of TEventType.Start : begin syslog(LOG_NOTICE, 'main Event START'); end; TEventType.Reload : begin // Reload config syslog(LOG_NOTICE, 'main Event RELOAD'); end; TEventType.Stop : begin syslog(LOG_NOTICE, 'main Event STOP'); ExitCode := EXIT_SUCCESS; Sleep(10); // simulate destroy delay break; end; end; Sleep(1000); end; end. systemctl start DaemonNewStyleTest.service systemctl reload DaemonNewStyleTest.service systemctl stop DaemonNewStyleTest.service
  13. У меня в досягаемости только CentOS 7, ну еще Дебиан есть на паре старых серваков. Под ними все работает превосходно. Тут надо под отладкой запускать и смотреть что происходит. Ну и логи системы смотреть
  14. Сначала пишем серверную часть - загрузка сохранения файла на любимом языке. Потом тестируем серверную часть - бросаем на сервер страничку с формой загрузки. Убеждаемся что все работает в браузере. И только после этого пишем клиента...
  15. Вам проще адаптировать сайт https://gector-spb.ru/ для мобильных браузеров. Наймите верстальшика за доширак - обойдется дешевле и по времени гораздо быстрее.
×
×
  • Создать...