Delphi. MySQL. InsertSelect всех полей для реализации Copy Paste

Делал для своего компонента TPSDBTreeView функцию «вырезать, копировать, вставить» на основе InsertSelect. Проблема в том, что если пытаться копировать все поля, скажем так

то получим

Что же делать в таком случае? Нашёл такой выход

Вот пример из проекта

 

При вставке в Delphi TFDQuery

Что происходит в коде? Мы просто составляем запрос на уровне базы, выкидывая ненужные колонки, в нашем случае id и исполняем его там.

И далее обращаться, скажем так

 

MySQL. Простейший триггер на BEFORE INSERT заполняющий creationDateTime

Всегда делал это из клиента, как то так, а оно оказывается всё проще. Век живи, век учись!

Триггер

И вот он результат

 

Борьба со спамерством на Linux сервере

 Заразили мой блог спамерским вирусом

Боролся несколько часов). Вроде как нагрузка на сервер упала. Очень помогла статья с блога. Привожу здесь копипаст, чтобы не потерять. Источник.

Здравствуйте. Если вас интересует, как заблокировать доступ по IP к сайту нежелательным личностям, спамерам и прочим, то вам надо создать или отредактировать файл .htaccess и воспользоваться командой Order Allow,Deny либо Order Deny,Allow. Между ними есть разница:

  • Order Allow,Deny
    Сначала обработаются разрешающие правила Allow, потом запрещающие Deny, а всё, что не попадает под них, будет запрещено
  • Order Deny,Allow
    Сначала будут обработаны запрещающие правила Deny, потом разрешающие Allow, а все, что не попадут под них, будут разрешены по умолчанию

Обратите внимание на синтаксис, никаких лишних пробелов, иначе можно вызвать ошибку 500 Internal Server Error

Если это касается всего сайта, файл создаётся в корне, если нужно закрыть лишь определённую его часть, например, админку, файл .htaccess должен располагаться непосредственно в этом разделе.
Ну, и конечно же, ваш сервер (бекенд или рабочий) должен быть Apache. Если ваш рабочий сервер NGINX + php-fpm, то править придётся конфигурационный файл nginx.

Забанить спамера по IP диапазону

1
2
Order Deny,Allow
Deny from 192.168.1.1

Это был пример того, как забанить IP (192.168.1.1) спамера, не закрывая доступа всем остальным. Ещё можно пропустить последний октет IP-адреса, Deny from 192.168.1 , тогда будут забанены все пропущенные IP адреса. Однако, вы же понимаете, статичный IP блокировать глупо, он, скорее всего, динамический, поэтому мы берём IP и отправляемся определять подсеть с диапазоном IP, откуда он пришёл. Для этого воспользуемся любым Whois-сервисом, например, этим, ищем строку CIDR или, если её нет, NetRange

Определяем подсеть IP

Определяем подсеть IP

Нам повезло, CIDR (Classless Inter-Domain Routing, Бесклассовая адресация) присутствует, а именно в таком формате лучше всего записывать диапазон IP в htaccess

1
2
Order Deny,Allow
Deny from 192.168.0.0/16

Если CIDR отстуствует, рекомендую воспользоваться калькулятором IP-диапазона в CIDR и данными из NetRange, чтобы получить CIDR.

C#. HelloWorld. I love you C#

Попрактикуемся в C#. Традиционный Hello world

8

 

Delphi. UniGUI. Делаем витрину (showcase) 2 часть

В прошлом посте мы сделали подготовочку. Структуру базы данных, определили основные сущности программы, создали под них таблицы в базе и модули в прекрасной IDE Delphi.

В данном посте добавим функцию добавления товара, выделения товара, удаления товара, а также наладим листание страниц товаров, перестройку витрины в зависимости от новой ширины. Ну и исправим пару мелких глюков в алгоритме. Вот что у нас получится.

Общий вид витрины

90

Выделение товара

91

Добавление товара

94

Перелистнем на следующую страницу

93

Изменим размер формы — как видно товары перестроились в зависимости от новой ширины.

95

Исходники

Читать далее «Delphi. UniGUI. Делаем витрину (showcase) 2 часть»

Delphi. Uploading to Keep2Share. Half Successfull Atempt…

Поступил ко мне небольшой заказ на автоматизацию заливки файлов на файлообменник Keep2Share.cc Всего было у меня 2 попытки делания данного проекта. Сначала опишу неудачную попытку, а в другом посте удачную. Задача стояла таким образом, чтобы сделать заливку напрямую из Delphi программы на сервере Keep2Share.cc

К счастью, у Keep2Share.cc есть API.  Это API работает прекрасно со скриптами PHP,  о чем приводится пример на той же странице с API.

Вот моя попытка, скажу сразу, удалось почти всё, кроме последнего шага, который мне показался самым трудным.

Согласно API все транзакции проходят в JSON формате, я научился получать токен авторизации, отправлять тестовый запрос, а вот загружать файл не научился, хотя удалось получить от сервера всю необходимую информацию для отправки файла на сервер. Проблема оказалась в том, что я не смог до конца корректно перевести CURL запрос в INDY. cURL я так понимаю это библиотека, аналогичная InDY, только для C подобных языков.

Получение токена авторизации

77 Читать далее «Delphi. Uploading to Keep2Share. Half Successfull Atempt…»

Delphi. Как подменить и зашифровать произвольный url в браузере, загрузив контент на свой хостинг ?

Данная задача возникла в связи с тем, что понадобилось зашифровать url. Решил её частично. То есть, для простых сайтов без горы скриптов — все будет работать идеально. С горой скриптов все будет работать почти идеально, если сервер сайта наш и там можно будет разрешить кроссдоменные запросы. Это почти — означает тонкую работу со скриптами. Вообще, как я понял, такие трюки запрещены в целях безопасности. Но задачу решать как-то надо было.

Способ №1 — независимый

Спрятать одну ссылку, при условии, что она нигде больше не светится на сайте можно следующим образом (получилось частично, в посте изложена идея подхода и некоторые трудности и их преодоление)…

-скачать HTML код страницы с сервера-источника

-подменить все относительные пути (href и src action) на абсолютные, указав сервер-источник

-получившийся HTML код выдать из под другого сервера, адрес которого можно шифровать как угодно.

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

Ограничение №1

Ограничение этого способа в том, что мы прячем только одну страницу. Если на ней есть ссылки, то сервер-источник будет обнаружен при переходе на неё. Но для задачи шифрования одной ссылки — этого вполне достаточно.

Ограничение №2

Ещё одно ограничение, если страница на скриптах фрэймворка, то такой подход тоже может не работать полностью. Тут нужно думать над каждым случаем отдельно.

Ограничение №3

Кросс-доменнные запросы как известно запрещены,

В частности, я работал с сайтом на Yii и при отправке Submit получил ошибку в отладчике браузера

но если есть доступ на сервер, то с помщью php мы можем прописать в скрипте сервера, к которому обращаемся, строку в самом начале файла, разрешающую кроссдоменные запросы

которая разрешит кроссдоменный запрос к данному домену. Можно, конечно и хром запускать с отключением режима безопасности

 

ШАГ № 1 — Загрузим произвольный сайт на своем сервере

8 Читать далее «Delphi. Как подменить и зашифровать произвольный url в браузере, загрузив контент на свой хостинг ?»

Delphi. FireMonkey. Первое приложение под Android — «Позвони маме»

9

В Delphi, насколько я вижу, под Android можно писать на Firemonkey — и тогда мы получим нативное приложение. А можно писать при помощи UniGUI фрэймворка и тогда мы получим приложение работающее через браузер, основанное на популярной библиотеке jQueryMobile.

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

Ещё один плюс — приложение может быть полностью автономным, не зависящим от сети. Если, скажем использовать базу данных SQLite для каких то небольших приложений.

Также лично для меня, человека работающего с mySQL есть ещё один финт в работе с FireMonkey — напрямую, я оказывается не могу подключиться, в связи с ограничениями в FireDAC — библиотекой доступа к данным, выход — либо переход на другие компоненты либо через DataSnap.

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

Минус этого подхода в том, что у нас практически нет доступа к железу. Но если этого не требуется, а для большинства задач этого достаточно — то всё в порядке. Также хорошо то, что вся мощь javascript библиотек будет под рукой и её можно будет использовать как напрямую, так и через язык Delphi. Другое ограничение — постоянный доступ к сети, но с этим проблем вроде бы нет в современном мире.

Есть ещё и третий подход)) Соединить первый и второй подходы — а именно — завернуть UniGUI приложение в FireMonkey. То есть, если, скажем нам нужно разместить наше приложение в магазине PlayMarket — мы просто берем TWebBrowser и прописываем в нём ссылку на наше приложение на UniGUI в сети. Читать далее «Delphi. FireMonkey. Первое приложение под Android — «Позвони маме»»

Delphi. TRichView. Как записать контрол в базу и прочитать его оттуда?

Код для примера, без обработки ошибок. Предполагается, что подключение у нас уже создано в отдельном модуле и на форме добавлен компонент FDQuery. Также в базе создано BLOB поле.

Запись в базу через поток MemoryStream

Чтение из базы через поток MemoryStream

Какие тонкие места могут быть?

-Опущу здесь обработку ошибок.

-Во-первых memory stream, если данных будет слишком много, memorystream может не справиться, возможно лучше будет использовать filestream.

-Во-вторых BLOB поле. Чтобы сервер БД не падал, лучше заранее побеспокоиться о максимально возможном значении BLOB поля

5