В последнее время постить в блог становиться все сложнее и сложнее. С одной стороны — нехватка времени на то, чтобы сесть и расписать какую-нибудь тему так, чтобы стало понятно и интересно, а с другой — в последнее время я очень уж сильно отдалился от последних новинок Delphi и на данный момент использую в работе исключительно Delphi XE2 и постоянно переключаться с того, чем занимаюсь по работе на то, что мне лично было бы интересно — напрягает по-чище всяких дедлайнов. Вот я и решил в этом небольшом посте определить для себя некоторые идеи и цели до конца этого года, а заодно и пояснить то, почему работа будет построена именно так, а никак иначе. Не сомневаюсь, что предложенный ниже план работы не всем придётся по душе, но всем ведь и не угодить :). Если будут предложения и идеи по поводу предложений, изложенных ниже, то пишите в комментариях — обсудим.
Последние пару недель работы в Delphi я занимался, на мой взгляд, довольно интересной задачей — разрабатывал небольшой компонент Delphi для автоматической настройки почтовых аккаунтов пользователя. Подобные системы авто-настройки уже давным-давно реализованы, например, в том же Outlook — задаешь адрес почты, парольку и Outlook сам устанавливает параметры POP3/IMAP, SMTP, определяет можно ли использовать SSL и т.д. Вот и моим заказчикам потребовалась такая же фича в программе. Работать надо было исключительно с библиотекой Indy. Работу я, конечно, выполнил (надо сказать, что, в итоге, и самому понравилось как получилось :)), но в процессе работы с Indy я в очередной раз убедился в своем мнении о том, что с использованием Synapse работа была бы:
- выполнена намного быстрее;
- содержала бы намного меньше кода:
- использовала бы меньше ресурсов.
Indy, конечно, хороша, но…Synapse лучше. Единственное, в чем может проигрывать Synapse — это в меньшем количестве информации по работе с этой библиотекой в Delphi. Вот я и решил немного восполнить этот информационный пробел и написать не просто небольшой пост про Synapse, а постараться дать целостное представление о том, что из себя представляет Synapse, как её можно использовать для решения самых разнообразных задач, в чем её преимущества по сравнению, например, с той же Indy и т.д. Естественно, что это уже будет не пост в блоге, а довольно объемный PDF и на его написание уйдет достаточно много времени (по моим оценкам, как раз до конца года). Я не ставлю в план рассказать о Synapse вообще все, например, как работать с ICMP, PGP, но показать работу с теми же HTTP, FTP, POP3, SMTP — вполне возможно и реально.
Предположительный план PDF-ки пока такой:
- Сокеты
- Виды сокетов (теория)
- Реализация сокетов в Synapse
- Свойства, методы и события сокетов
- Примеры работы с сокетами TCP (например, разработка эхо-сервера в Synapse)
- Пример работы с сокетом UDP
- Работа с HTTP-протоколом в Synapse
- Работа с FTP
- Работа с POP3
- Работа с SMTP
- Описание методов в модулях synautil, synacode и т.д.
Работу над частями про FTP, POP3 и SMTP я пока сильно не продумывал, но, предположительно, в них будет содержаться информация аналогичная той, что и в части про HTTP, т.е. небольшое введение про то, что это за протокол, как работает, где используется и т.д., описание соответствующего класса Synapse для работы с протоколом и примеры использования.
В принципе, про Synapse в блоге написано довольно много статей, касающихся самых разных вопросов использования этой библиотеки. И остается только всю эту информацию систематизировать, дополнить описаниями и примерами работы. Так что, думаю, что управиться с этим смогу.
Конечно, в блоге есть также немало информации и про ту же FireMonkey или, как её сейчас снова переименовали — про FM Platform и можно было бы сделать попытку объединить все эти посты в один pdf, но этого я делать не планирую по нескольким причинам. В принципе, эти причины я (по моему мнению) достаточно корректно выразил в комментариях к статье про Delphi в одном из блогов из ленты DelphiFeeds.ru. Но то ли движок блога посчитал комментарий спамным (т.к. текста там было немало, хотя и без ссылок), то ли владелец блога посчитал, что я не был таким уж полит.корректным. В общем коммент мой так и не был опубликован. Поэтому постараюсь повторить его дословно здесь. Кто не согласен с моим мнением — прошу в комментарии :)
Итак, почему я не вижу сейчас смысла затевать процесс написания, если и не книги, то, хотя бы даже просто объемного справочника про FireMonkey FM Platform, а тем более привлекать к этой работе большую аудиторию. Причин тут несколько.
Причина номер один. С момента появления этой платформы в Delphi XE2 и до сих пор (а сейчас уже вышла Delphi XE5) платформа постоянно меняется и находится в каком-то (иногда совсем не понятном) движении. Вот начали мы коллективно писать про FM — расписываем какие классы есть, как работать со стилями, как использовать различные классы и где они находятся. Год пашем, собираем, расписываем. Выходит новая версия Delphi — в стилях снова что-то изменили, какие-то классы перенесли в другие модули, какие-то свойства классов вообще поменяли местами и т.д. и т.п. И что? Весь труд — в мусорную корзину, либо сидим и, матерясь себе под нос, актуализируем то, что поменялось…ИМХО несерьезно это. Понятно, что последние изменения в платформе (не считая исправления всяческих багов) были продиктованы, в первую очередь, необходимостью поддержки новых платформ — iOS и Android. Но писать в этих условиях что-либо крупнее статьи в блог, на мой взгляд, довольно рискованно с точки зрения затрат времени на работу.
Причина номер два. Касается того, о чем говорят с самого момента появления платформы, да и напрямую связана с причиной номер один — стабильность и качество. Не спорю, что по сравнению с первой своей версией FM стала качественнее, но, тем не менее, иногда, при работе над проектом для того же Android, хочется ругаться матом даже такому самоучке как мне :) Есть моменты, когда FM взаправду выручает и о подобном я как-то упоминал, но всё-таки дорабатывать FM разработчикам придётся ещё очень долго, а значит снова неизбежны маленькие и не очень изменения, доработки, корректировки и т.д.
Собственно, только этих двух причин достаточно, чтобы не бросаться с головой в омут и не начинать большую работу по части FM. Кстати, вот мне лично не понятны вот эти вот маркетинговые выкрутасы по поводу названия — то FireMonkey, то FMX, теперь вообще FM…в XE6 будет, видимо, F, а в XE7? Пустое место? :) Или придумают что-то пафосное типа «Одна платформа, чтобы владеть всеми»? Короче даже с названием не определиться, не говоря уже про содержание.
Не подумайте, что я противник продвижения FireMonkey в массы. Скорее напротив — я по мере сил и возможностей ковыряюсь в Delphi XE5 и пишу небольшой проектик для Android. Вполне возможно, что статьи на эту тему будут появляться в блоге. Выше я просто определил причины почему ничего кроме статьи (пусть и большой) про FM Platform в настоящее время писать не имеет смысла, если не хочется поработать N-ое количество времени на корзину. Кому очень нужна информация по текущей версии FM Platform, то на данный момент могу посоветовать новый цикл статей на Хабре про разработку приложения под Android.
А Synapse — это уже давным давно устоявшаяся, проверенная временем библиотека, про которую можно без опасений писать хоть трехтомники — даже если и происходят изменения в коде, то они очень не значительны и отловить эти изменения очень просто. А если учесть, что в планах Emabarcadero стоит поддержка Linux, а Synapse вполне себе комфортно используется на этой платформе, то, в принципе, и актуальность должна быть достаточной.
Ну и в заключение про то как будет распространятся PDF-ка. Скажу как есть. Когда поделился идеей с несколькими людьми из близкого окружения, то большинство советовало продавать, т.к. объем предполагается довольно большим и труд будет вложен не маленький. Но лично мне сейчас этот вариант не кажется перспективным и целесообразным. Поэтому я решил поступить так же как и со справочником по Ribbon Controls — как только работа будет закончена, то выложу файл в блоге для свободного скачивания и сделаю небольшое объявление. Если кто-то посчитает, что сей труд имеет какую-либо материальную ценность и может быть оплачен, то не проблема — в сайдбаре есть кнопочка для перевода пожертвований на кошелек Яндекс.Деньги. Кстати, спасибо всем, кто этой кнопочкой уже воспользовался :).
Вот, пожалуй и все, что касается дальнейших планов. Так что, в случае чего, не теряйте — в блог я захожу регулярно, чтобы ответить на комментарии, почистить спам и т.д. Если есть какие-то вопросы, пожелания, идеи по работе — пишите, буду рад с Вами пообщаться.

Надеюсь это был сарказм :)
Александр, не, ну не то что бы совсем уж сарказм :) Так…
Все же хотелось бы видеть не слишком детальный разбор Огненой Обезьяны для Андроида, а простых примеров приложений, ведь вообщем-то можно реализовать уже сейчас какие-то вещи, не слишком сложные.
Константин, вполне возможно, что и такие примеры будут появляться в блоге.
Влад, можешь подсказать по поводу синапса.
Есть приложение написанное на Lazarus+synapse.
Несколько потоков, каждый поток обращается через прокси к сайту.
В итоге в один прекрасный момент поток виснет. Как от этого избавиться?
Заранее спасибо за ответ
Alex, ну без кода этого самого потока сказать в чем проблема сложновато, но причина зависания может быть в том, что прокси не отвечает вовремя или вообще сдыхает. По идее, такой поток должен провисеть 20-30 сек. и завершиться, а у вас, видимо он продолжает «достучаться» до прокси. Избавиться можно, например, указав через метод procedure SetTimeout(Timeout: Integer); тайм-ауты чтения/записи данных сокетом, а также предварительно проверять проксю на коннект, т.е. выполнять, что-то , наподобие такого кода: var Socket: TTCPBlockSocket; begin Socket:=TTCPBlockSocket.Create; try Socket.ConnectionTimeout:=1000;//тайм-аут на соединение 1 сек. Socket.Connect('IP-адрес прокси', 'порт'); if Socket.LastError = 0 then //соединение с прокси есть - что-то делаем, например,… Подробнее »
Спасибо влад.
У меня просто HTTPSend и у него Timeout в 30 сек стоит, хотя все равно зависает.
Алгоритм у потока примерно такой:
HTTP:=HTTPSend.Create;
HTTP.Timeout=30000;
HTTP ставим прокси
GET
POST
HTTP.Free;
У THTTPSend есть свойство Sock — это и есть тот самый TCP сокет, через который работает класс. Можно перед выполнением GET и POST использовать этот сокет, а можно и отдельный метод накидать со своим сокетом для проверки прокси. А где поток виснет — на GET или на POST?
А где бы вкратце почитать — в чем принципиальное (стратегическое/тактическое) отличие Synapse от Indy?
на сайте Synapse http://synapse.ararat.cz/doku.php/public:howto:whysynapse. А вообще, меня Synapse в первую очередь привлекает своей простотой — никаких излишеств, все чётко и ясон даже просто глядя на название модулей :).
Был бы рад увидеть в PDF-ке главу с советами по оптимизации обработки GET/POST запросов через Synapse для приложений, которые очень активно работают с сетью (миллионы запросов в сутки). Видимо в приложении что-то не совсем грамотно настроено и иногда в ОС что-то переполняется и все сайты вообще перестают открываться (а через какое-то время или посте перезагрузки всё снова работает). Информации в по этой теме в интернете совсем мало.
А Synapse разве работает с ХЕ5?
работает. только не везде — приложение для iOS и Android с Synapse врядли напишется
LeanPub — отличный способ публикации и продажи материала «в процессе». Не думаю, что прям много денег принесет, но дать народу возможность поддержать хорошее дело копеечкой — почему бы и нет?..
Да, собственно, не ради денег затеял про Synapse писать. Конечно, было б не плохо получить отдачу, но и, если даже ничего не «выгорит» — лишним опыт не бывает :)