<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8248349143113517513</id><updated>2014-07-20T13:01:19.701+06:00</updated><category term="программирование"/><category term="партнерская программа"/><category term="php"/><category term="мысли"/><category term="seo"/><category term="python"/><category term="web-разработка"/><category term="дорвеи"/><category term="linux"/><category term="практика оптимизации"/><category term="google"/><category term="фарма"/><category term="firefox"/><category term="заработок"/><category term="поисковые системы"/><category term="уязвимости"/><category term="юмор"/><category term="google chrome"/><category term="домены"/><category term="инструменты"/><category term="халява"/><category term="ubuntu"/><category term="оптимизация"/><category term="полезности"/><category term="софт"/><category term="qip"/><category term="windows"/><category term="блог"/><category term="быт"/><category term="инвайты"/><category term="конкурсы"/><category term="о жизни"/><category term="о людях"/><category term="поисковая оптимизация"/><category term="разное"/><category term="хакерство"/><category term="яндекс"/><category term="api"/><category term="apple"/><category term="javascript"/><category term="miranda"/><category term="интересное"/><category term="мои проекты"/><category term="подкасты"/><category term="работа"/><category term="реклама"/><category term="статистика"/><category term="class"/><category term="icq"/><category term="mac os x"/><category term="книги"/><category term="кризис"/><category term="научно-популярное"/><category term="новости"/><category term="политика"/><category term="сервисы"/><category term="тизерные системы"/><category term="хостинг"/><category term="1С Предприятие"/><category term="aol"/><category term="bing"/><category term="cms"/><category term="html5"/><category term="human emulator"/><category term="jabber"/><category term="microsoft"/><category term="mozilla"/><category term="my"/><category term="parser"/><category term="politics"/><category term="smo"/><category term="twitter"/><category term="vlc"/><category term="web-безопасность"/><category term="windows seven"/><category term="xfce"/><category term="ася"/><category term="бизнес"/><category term="вирусмейкерство"/><category term="деньги"/><category term="дизайн"/><category term="лайфхак"/><category term="маркетинг"/><category term="мотиваторы"/><category term="палю тему"/><category term="с#"/><category term="сабмиттеры"/><category term="файлообменники"/><category term="экономика"/><category term="экономический кризис"/><category term="юзабилити"/><category term="7z"/><category term="adblock"/><category term="adsense"/><category term="adult"/><category term="ajax"/><category term="android"/><category term="android x86"/><category term="avi"/><category term="browsers"/><category term="c#"/><category term="captcha"/><category term="css"/><category term="css3"/><category term="database"/><category term="debian"/><category term="desktop"/><category term="dhcp"/><category term="dichat"/><category term="django"/><category term="dns"/><category term="dotnetframework"/><category term="dr web"/><category term="dvd"/><category term="efix"/><category term="ext"/><category term="ext4"/><category term="fedora"/><category term="finances"/><category term="firewall"/><category term="flash"/><category term="gecko"/><category term="gentoo"/><category term="google analytics"/><category term="hackintosh"/><category term="hd"/><category term="hdtv"/><category term="hewlett-packard"/><category term="hp"/><category term="icq-клиент"/><category term="ie8"/><category term="im"/><category term="imacros"/><category term="internet explorer"/><category term="iphone"/><category term="iphone 3gs"/><category term="irc"/><category term="jaunty jackalope"/><category term="jaxer"/><category term="jimm"/><category term="jquery"/><category term="karmic koala"/><category term="kaspersky"/><category term="kmplayer"/><category term="lenny"/><category term="mac os x snow leopard"/><category term="mail.ru agent"/><category term="mplayer"/><category term="mssql"/><category term="node.js"/><category term="nvidia"/><category term="obj c"/><category term="ocr"/><category term="openoffice.org"/><category term="opera"/><category term="overclocking"/><category term="pear"/><category term="perl"/><category term="pppoe"/><category term="protocol"/><category term="pytesser"/><category term="pywin32"/><category term="qip infium"/><category term="qt"/><category term="qutim"/><category term="route"/><category term="seven"/><category term="sql"/><category term="sql server"/><category term="swap"/><category term="tele2"/><category term="tracemonkey"/><category term="trash"/><category term="upgrade"/><category term="useful"/><category term="utorrent"/><category term="v8"/><category term="virtual dub"/><category term="vista"/><category term="visual studio"/><category term="webkit"/><category term="windows 7"/><category term="winrar"/><category term="wordpress"/><category term="xcode"/><category term="xml"/><category term="xmpeg"/><category term="xorg"/><category term="xss"/><category term="xubuntu"/><category term="xvid"/><category term="yml"/><category term="zend"/><category term="zend studio 7.0"/><category term="zennoposter"/><category term="Микроблоггинг"/><category term="аналитика"/><category term="аська"/><category term="аська. j2me"/><category term="безопасность"/><category term="билайн"/><category term="биржи трафика"/><category term="блоги"/><category term="блогосфера"/><category term="браузеры"/><category term="веб-разработка"/><category term="вирусный маркетинг"/><category term="вконтакте"/><category term="война браузеров"/><category term="гайды"/><category term="дети"/><category term="жилплощадь"/><category term="задачи"/><category term="заметки"/><category term="защита"/><category term="звонки"/><category term="здоровье"/><category term="инстурументы"/><category term="история браузеров"/><category term="как правильно работать"/><category term="как правильно сделать рип"/><category term="какой браузер выбрать"/><category term="каскадные таблицы стилей"/><category term="киномания"/><category term="ключи для windows 7"/><category term="кодеки"/><category term="кодировки"/><category term="конвертирование"/><category term="копирайт"/><category term="кпк"/><category term="криптография"/><category term="критика"/><category term="мегафон"/><category term="микроблоги"/><category term="мое"/><category term="мой софт"/><category term="монетизация"/><category term="мото"/><category term="мтс"/><category term="обвал рубля"/><category term="образ жизни"/><category term="отзывы"/><category term="планировщик"/><category term="планы"/><category term="поисковики"/><category term="порнография"/><category term="программирование под macos x"/><category term="работа по совместительству"/><category term="разрешение экрана"/><category term="раскрутка сайта"/><category term="результаты"/><category term="рекламные системы"/><category term="репозиторий"/><category term="рип двд"/><category term="робосайты"/><category term="рубль"/><category term="руководство"/><category term="сапр"/><category term="сети"/><category term="совесть"/><category term="советы"/><category term="сотовые сети"/><category term="спам"/><category term="стартапы"/><category term="строительство"/><category term="технологии"/><category term="установка"/><category term="цели"/><category term="цензура"/><category term="частота обновления монитора"/><category term="чпу"/><category term="школьные годы"/><category term="эварды"/><category term="эксперименты"/><title type='text'>Markus Blog</title><subtitle type='html'>Философия дзен в жизни</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>436</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-6538883132213020418</id><published>2014-07-18T09:28:00.000+06:00</published><updated>2014-07-18T09:29:03.429+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="гайды"/><title type='text'>Преимущества и хитрости использования виртуальных карт</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;b&gt;Предназначение виртуальных карт.&lt;/b&gt;&lt;br /&gt;Виртуальные карты - виртуальный аналог пластиковых карт VISA и MasterCard. C их помощью вы сможете покупать товары и оплачивать услуги во всех онлайн-магазинах, принимающих к оплате обычные банковские карты.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Процесс оформления виртуальных карт.&lt;/b&gt;&lt;br /&gt;Виртуальные карты можно выписывать и покупать. Многие российские банки позволяют создавать виртуальные карты. Но для обычного вебмастера полезнее всего будет непрямая покупка виртуальной карты или же создание оной с использованием сервисов сопровождения и выпуска международных платежных карт(например, wm-card.com).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Преимущества использования виртуальных карт.&lt;/b&gt;&lt;br /&gt;Далеко не секрет, что многие онлайн-магазины лукавят и сохраняют не только номер карты, но код защиты, что сильно снижает уровень защиты финансовых средств клиентов. Поэтому в целых безопасности для совершения любых интернет-платежей банками рекомендуется использование виртуальных карт. Храня нужное количество денег на такой карте вы сможете в любое время вернуть средства на свой счет или заблокировать карту. При этом даже в случае взлома и доступа злоумышленников к данным такой карты потери для клиента окажутся минимальными.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Хитрости использования.&lt;/b&gt;&lt;br /&gt;Вверху была небольшая вводная статья для тех, кто еще считает использования банковских карт небезопасным методом оплаты покупок в сети интернет или вообще до сих пор не использовал карты. Теперь перейдем к самому интересному, а именно к вопросам использования virtual card непосредственно веб-мастерами. В настоящее время широкое распространение получают методы оплаты &amp;nbsp;в виде подписок, те покупаете какую-то услугу или берете тестовый доступ, например, на месяц, а выставление счета осуществляется позднее. Все бы было ничего, если бы можно было вовремя отписаться. Однако, не на всех сервисах отписка от ежемесячных платежей происходит как положено. С вас сначала спишут деньги за использование, а только потом могут перевести аккаунт с платной подписки на обычный. Поэтому в целях экономии денежных средств и нервов решил написать данную статью. Понятно, что есть много других различных применения виртуальных карт, но я опишу только два примера, как наиболее полезных для пользователя и веб-мастера. Почти 3 года назад я писал про&amp;nbsp;&lt;a href=&quot;http://imarkus.blogspot.ru/2011/12/blog-post.html&quot;&gt;бесплатное использование платных музыкальных сервисов&lt;/a&gt;. Замечу, что хотя прошло достаточно долгое время Spotify в Россию до сих пор не пришел. Однако, появился небольшой вариант как можно получить Spotify Premium бесплатно на месяц:&lt;br /&gt;1) Покупаете VPN или находите бесплатный доступ и регистрируете на Spotify USA-аккаунт или любой другой. Главное, чтобы сервис был доступен в данной стране.&lt;br /&gt;2) Создаете на wm-card.com виртуальную карту сроком на месяц. К концу срока действия виртуальной карты средства сразу можно вернуть на кошелек. Пополнять, рекомендую, на сумму не менее 100 рублей.&lt;br /&gt;3) Заходите в Spotify. Нажимаете на &quot;получить тестовый период&quot; и после этого вас просят ввести платежных данные. После ввода которых, выскочит сообщение о возникших проблемах и попросят вас изменить страну или ввести другие платежные данные. Меняем страну на Малайзию (Malaysia). В поле платежных данных вбиваем информацию, полученную после покупки виртуальной карты. Секрет здесь в том, что для Малайзии доступна оплата российскими картами и цены для этой страны на порядок меньше. Проходите по пунктам каждый месяц и получаете Spotify Premium бесплатно, хотя мне больше всего была интересна возможность оплата российскими картами.&lt;br /&gt;Теперь поговорим о сервисах для вебмастеров, которые предоставляют бесплатный тестовый период или у которых счета выставляются не сразу, а по окончанию месяца, но по-прежнему требующие ввода платежной информации (например, Semrush). Сразу скажу, что придется изрядно попотеть для бесплатного получения заветного аккаунта Pro:&lt;br /&gt;1) Ищите в поиске промо-коды по запросам &quot;semrush promo code&quot;. По сроку действия тестового периода как повезет, от 14 дней до одного месяца и больше.&lt;br /&gt;2) Создаете виртуальную карту, если уже есть, то ничего делать не надо.&lt;br /&gt;3) Регистрируетесь в Semrush, использую платежную информацию виртуальной карты и получаете бесплатно аккаунт Pro.&lt;br /&gt;&lt;br /&gt;Всем приятного дня и спасибо за потраченное время.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/6538883132213020418/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2014/07/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/6538883132213020418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/6538883132213020418'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2014/07/blog-post.html' title='Преимущества и хитрости использования виртуальных карт'/><author><name>Markus</name><uri>http://www.blogger.com/profile/08242965309626929451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-7358480630213783544</id><published>2014-03-24T01:28:00.002+06:00</published><updated>2014-03-24T03:36:50.458+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ocr"/><category scheme="http://www.blogger.com/atom/ns#" term="программирование"/><category scheme="http://www.blogger.com/atom/ns#" term="с#"/><title type='text'>Распознавание простых капч</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Этой статьей начинается серия статей, посвященных оптическому распознаванию символов. Тема достаточна актуальная и применить полученных знания можно будет как в своих программах, так и в чужих (например, в виде плагинов). Для первого эксперимента возьмем достаточно простую капчу и попытаемся ее распознать.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Хронология распознавания капчи в картинках.&lt;/b&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; text-align: left;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-BRuzq_k9WZ8/Uy8SWJ-0n9I/AAAAAAAAAKo/BuhP4jCIxYI/s1600/86056679.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-BRuzq_k9WZ8/Uy8SWJ-0n9I/AAAAAAAAAKo/BuhP4jCIxYI/s1600/86056679.jpg&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Оригинал&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; text-align: left;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-ZTX1hozNyJ0/Uy8VfoSNLLI/AAAAAAAAALA/s0Kjffdzm_8/s1600/ddddd.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-ZTX1hozNyJ0/Uy8VfoSNLLI/AAAAAAAAALA/s0Kjffdzm_8/s1600/ddddd.jpg&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Очищен фон от примесей&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-4-597-tGWrM/Uy8Wj0mKLAI/AAAAAAAAALI/7pW205H8bEo/s1600/ddddd.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-4-597-tGWrM/Uy8Wj0mKLAI/AAAAAAAAALI/7pW205H8bEo/s1600/ddddd.jpg&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Обработанная капча&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Предварительная обработка изображения.&lt;/b&gt;&lt;br /&gt;Заключается, например, в изменении размера изображения. У нас размер изображения вполне комфортный. Но, если вдруг необходимо увеличить картинку, то сделать это можно так:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Ресайз изображения&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;param name=&quot;image&quot;&amp;gt;Оригинальное изображение&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;param name=&quot;width&quot;&amp;gt;Ширина выходного изображения&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;param name=&quot;height&quot;&amp;gt;Высота выходного изображения&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;returns&amp;gt;Модифицированное изображение&amp;lt;/returns&amp;gt;&lt;br /&gt;public Bitmap ResizeImage(Bitmap image, int width, int height)&lt;br /&gt;{&lt;br /&gt;    Bitmap newImage = new Bitmap(width, height);&lt;br /&gt;    using (Graphics g = Graphics.FromImage(newImage))&lt;br /&gt;    {&lt;br /&gt;        g.SmoothingMode = SmoothingMode.HighQuality;&lt;br /&gt;        g.InterpolationMode = InterpolationMode.HighQualityBicubic;&lt;br /&gt;        g.PixelOffsetMode = PixelOffsetMode.HighQuality;&lt;br /&gt;        g.DrawImage(image, 0, 0, width, height);&lt;br /&gt;    }&lt;br /&gt;    return newImage;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;b&gt;Подготовка к программированию.&lt;/b&gt;&lt;br /&gt;Для более приятного кодинга создадим абстракции наиболее мелких частей предметной области.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Базовый интерфейс линии&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public interface ILine&lt;br /&gt;{&lt;br /&gt;    Point PointStart { get; set; }&lt;br /&gt;    Point PointEnd { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Базовой интефейс точки&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public interface IPoint&lt;br /&gt;{&lt;br /&gt;    int X { get; set; }&lt;br /&gt;    int Y { get; set; }&lt;br /&gt;    Color Data { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Модель линий&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public class Line : ILine&lt;br /&gt;{&lt;br /&gt;    /// &amp;lt;summary&amp;gt;&lt;br /&gt;    /// Конструктор&lt;br /&gt;    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;    /// &amp;lt;param name=&quot;start&quot;&amp;gt;Начальная точка&amp;lt;/param&amp;gt;&lt;br /&gt;    /// &amp;lt;param name=&quot;end&quot;&amp;gt;Конечная точка&amp;lt;/param&amp;gt;&lt;br /&gt;    public Line(Point start, Point end)&lt;br /&gt;    {&lt;br /&gt;        PointStart = start;&lt;br /&gt;        PointEnd = end;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Point PointStart { get; set; }&lt;br /&gt;    public Point PointEnd { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Модель точки&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public class Point : IPoint&lt;br /&gt;{&lt;br /&gt;    /// &amp;lt;summary&amp;gt;&lt;br /&gt;    /// Конструктор точки&lt;br /&gt;    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;    /// &amp;lt;param name=&quot;x&quot;&amp;gt;Координата х&amp;lt;/param&amp;gt;&lt;br /&gt;    /// &amp;lt;param name=&quot;y&quot;&amp;gt;Координата y&amp;lt;/param&amp;gt;&lt;br /&gt;    /// &amp;lt;param name=&quot;data&quot;&amp;gt;Цветовые данные&amp;lt;/param&amp;gt;&lt;br /&gt;    public Point(int x, int y, Color data)&lt;br /&gt;    {&lt;br /&gt;        X = x;&lt;br /&gt;        Y = y;&lt;br /&gt;        Data = data;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int X { get; set; }&lt;br /&gt;    public int Y { get; set; }&lt;br /&gt;    public Color Data { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;b&gt;Этапы распознавания капчи.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Этап I. &amp;nbsp;Очистка фона.&lt;/b&gt;&lt;br /&gt;Как можно заметить, картинка имеет светлый фон, хотя неоднородный. Поэтому, для очистки фона быстро пробежимся по пикселям и заменим все цвета, у которых значения компонентов цветовой модели RGB больше 200, на белый цвет rgb(255,255,255).&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Заполняет фон определенным цветом&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;param name=&quot;image&quot;&amp;gt;Изображение&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;param name=&quot;color&quot;&amp;gt;Цвет&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;returns&amp;gt;Список всех точек, включая замещенные цветами&amp;lt;/returns&amp;gt;&lt;br /&gt;public void FillBackground(Bitmap image, Color color)&lt;br /&gt;{&lt;br /&gt;    for (int y = 0; y &amp;lt; image.Height; y++)&lt;br /&gt;    {&lt;br /&gt;        for (int x = 0; x &amp;lt; image.Width; x++)&lt;br /&gt;        {&lt;br /&gt;            Color currentColor = image.GetPixel(x, y);&lt;br /&gt;            if (currentColor.B &amp;gt; 200 &amp;amp;&amp;amp; currentColor.G &amp;gt; 200 &amp;amp;&amp;amp; currentColor.B &amp;gt; 200)&lt;br /&gt;            {&lt;br /&gt;                image.SetPixel(x, y, color);&lt;br /&gt;                currentColor = color;&lt;br /&gt;            }&lt;br /&gt;            _points.Add(new Point(x, y, currentColor));&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;b&gt;Этап II. Удаление шума.&lt;/b&gt;&lt;br /&gt;Удаление шума можно производить двумя методами: универсальным и специализированным. Сразу скажу, что универсальный метод работает намного дольше. В этой статье будут использоваться оба метода очистки шума.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Метод 1. Специализированный метод удаления шума.&lt;/b&gt;&lt;br /&gt;Взглянув на несколько десятков изображений, можно прийти к выводу, что положение сетки не меняется. Хотя то, что толщина и цвет линий сетки различны немного портит общую картину. Намного проще удалить сетку одноцветную и толщиной в 1px. Поэтому будем основываться на том, что цифры и буквы имеют более насыщенный оттенок.&lt;br /&gt;&lt;i&gt;&lt;u&gt;&lt;b&gt;Алгоритм сравнения:&lt;/b&gt;&lt;/u&gt;&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Линейно заполняет пиксели определенный цветом&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;param name=&quot;image&quot;&amp;gt;Оригинальное изображение&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;param name=&quot;pointStart&quot;&amp;gt;Начальная точка&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;param name=&quot;pointEnd&quot;&amp;gt;Конечная точка&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;param name=&quot;color&quot;&amp;gt;Цвет заполнения&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;returns&amp;gt;Модифицированное изображение&amp;lt;/returns&amp;gt;&lt;br /&gt;public Bitmap FillImageLinear(Bitmap image, Point pointStart, Point pointEnd, Color color)&lt;br /&gt;{&lt;br /&gt;    for (int y = 0; y &amp;lt; image.Height; y++)&lt;br /&gt;    {&lt;br /&gt;        for (int x = 0; x &amp;lt; image.Width; x++)&lt;br /&gt;        {&lt;br /&gt;            if ((x &amp;lt;= pointEnd.X &amp;amp;&amp;amp; x &amp;gt;= pointStart.X) &amp;amp;&amp;amp;&lt;br /&gt;                (y &amp;lt;= pointEnd.Y &amp;amp;&amp;amp; y &amp;gt;= pointStart.Y))&lt;br /&gt;            {&lt;br /&gt;                // Диапазон насыщенности от 0.0 до 1.0, &lt;br /&gt;                if (Math.Abs(image.GetPixel(x, y).GetBrightness()&lt;br /&gt;                                - pointEnd.Data.GetBrightness()) &amp;lt;= 0.15)&lt;br /&gt;                {&lt;br /&gt;                           &lt;br /&gt;                    image.SetPixel(x, y, color);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return image;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;u&gt;&lt;b&gt;&lt;i&gt;Очистка шума:&lt;/i&gt;&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;private void Click(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    foreach (PictureBox control in Controls.OfType&amp;lt;PictureBox&amp;gt;())&lt;br /&gt;    {&lt;br /&gt;        Bitmap image = (Bitmap) control.Image;&lt;br /&gt;        FillBackground(image, Color.White);&lt;br /&gt;                &lt;br /&gt;        List&amp;lt;Line&amp;gt; lines = new List&amp;lt;Line&amp;gt;()&lt;br /&gt;        {&lt;br /&gt;            new Line(new Point(5, 0, image.GetPixel(5, 0)),&lt;br /&gt;                new Point(5, image.Height - 1, image.GetPixel(5, image.Height - 1))),&lt;br /&gt;            new Line(new Point(66, 0, image.GetPixel(66, 0)),&lt;br /&gt;                new Point(66, image.Height - 1, image.GetPixel(66, image.Height - 1))),&lt;br /&gt;            new Line(new Point(26, 0, image.GetPixel(26, 0)),&lt;br /&gt;                new Point(26, image.Height - 1, image.GetPixel(26, image.Height - 1))),&lt;br /&gt;            new Line(new Point(25, 0, image.GetPixel(25, 0)),&lt;br /&gt;                new Point(25, image.Height - 1, image.GetPixel(25, image.Height - 1))),&lt;br /&gt;            new Line(new Point(46, 0, image.GetPixel(46, 0)),&lt;br /&gt;                new Point(46, image.Height - 1, image.GetPixel(46, image.Height - 1))),&lt;br /&gt;            new Line(new Point(45, 0, image.GetPixel(45, 0)),&lt;br /&gt;                new Point(45, image.Height - 1, image.GetPixel(45, image.Height - 1))),&lt;br /&gt;            new Line(new Point(86, 0, image.GetPixel(86, 0)),&lt;br /&gt;                new Point(86, image.Height - 1, image.GetPixel(86, image.Height - 1))),&lt;br /&gt;            new Line(new Point(87, 0, image.GetPixel(87, 0)),&lt;br /&gt;                new Point(87, image.Height - 1, image.GetPixel(87, image.Height - 1))),&lt;br /&gt;            new Line(new Point(107, 0, image.GetPixel(107, 0)),&lt;br /&gt;                new Point(107, image.Height - 1, image.GetPixel(107, image.Height - 1))),&lt;br /&gt;            new Line(new Point(106, 0, image.GetPixel(106, 0)),&lt;br /&gt;                new Point(106, image.Height - 1, image.GetPixel(106, image.Height - 1))),&lt;br /&gt;            new Line(new Point(127, 0, image.GetPixel(127, 0)),&lt;br /&gt;                new Point(127, image.Height - 1, image.GetPixel(127, image.Height - 1))),&lt;br /&gt;            new Line(new Point(126, 0, image.GetPixel(126, 0)),&lt;br /&gt;                new Point(126, image.Height - 1, image.GetPixel(126, image.Height - 1))),&lt;br /&gt;            new Line(new Point(0, 11, image.GetPixel(0, 11)),&lt;br /&gt;                new Point(image.Width - 1, 11, image.GetPixel(0, 11))),&lt;br /&gt;            new Line(new Point(0, 10, image.GetPixel(0, 10)),&lt;br /&gt;                new Point(image.Width - 1, 10, image.GetPixel(0, 10))),&lt;br /&gt;            new Line(new Point(0, 22, image.GetPixel(0, 22)),&lt;br /&gt;                new Point(image.Width - 1, 22, image.GetPixel(0, 22))),&lt;br /&gt;            new Line(new Point(0, 21, image.GetPixel(0, 21)),&lt;br /&gt;                new Point(image.Width - 1, 21, image.GetPixel(0, 21)))&lt;br /&gt;        };&lt;br /&gt;        foreach (Line line in lines)&lt;br /&gt;        {&lt;br /&gt;            image = FillImageLinear(image, line.PointStart, line.PointEnd, Color.White);&lt;br /&gt;        }&lt;br /&gt;        string text = RecognizeImage2(image);&lt;br /&gt;        control.Image = image;&lt;br /&gt;        Controls.OfType&amp;lt;TextBox&amp;gt;().Single(&lt;br /&gt;            c =&amp;gt;&lt;br /&gt;                c.Name.Contains(string.Format(&quot;textbox_{0}&quot;,&lt;br /&gt;                    control.Name.Split(new[] {&quot;_&quot;}, StringSplitOptions.RemoveEmptyEntries)[1]))).Text = text;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;b&gt;Метод 2. Универсальный метод удаления шума.&lt;/b&gt;&lt;br /&gt;Данным методом можно удалять: точки, линии, кривые, сетку. Заключается он в сравнении цвета ближайших 8 пикселей для каждого пикселя изображения. Если цвет пикселей в большей степени белый, то есть вероятность, что текущий пиксель является шумом и его следует перекрасить в белый цвет.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Тестовый алгоритм заполнения по сравнению со смежными пикселями&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;param name=&quot;image&quot;&amp;gt;Оригинальное изображение&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;param name=&quot;color&quot;&amp;gt;Цвет для заполнения&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;returns&amp;gt;Обработанное изображение&amp;lt;/returns&amp;gt;&lt;br /&gt;public Bitmap FillImageWithSurroudPoints(Bitmap image, Color color)&lt;br /&gt;{&lt;br /&gt;    for (int y = 0; y &amp;lt; image.Height; y++)&lt;br /&gt;    {&lt;br /&gt;        for (int x = 0; x &amp;lt; image.Width; x++)&lt;br /&gt;        {&lt;br /&gt;            int counter = 0;&lt;br /&gt;&lt;br /&gt;            List&amp;lt;int[]&amp;gt; surroudPoints = new List&amp;lt;int[]&amp;gt;()&lt;br /&gt;            {&lt;br /&gt;                new[] {x - 1, y - 1},&lt;br /&gt;                new[] {x, y - 1},&lt;br /&gt;                new[] {x + 1, y - 1},&lt;br /&gt;                new[] {x - 1, y},&lt;br /&gt;                new[] {x + 1, y},&lt;br /&gt;                new[] {x - 1, y + 1},&lt;br /&gt;                new[] {x, y + 1},&lt;br /&gt;                new[] {x + 1, y + 1},&lt;br /&gt;            };&lt;br /&gt;            foreach (int[] surPoint in surroudPoints)&lt;br /&gt;            {&lt;br /&gt;                foreach (Point point in _points.Where(p =&amp;gt; p.X == surPoint[0] &amp;amp;&amp;amp; p.Y == surPoint[1]))&lt;br /&gt;                {&lt;br /&gt;                    if (point.Data.ToArgb() == color.ToArgb())&lt;br /&gt;                    {&lt;br /&gt;                        counter++;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            if (counter &amp;gt; 0)&lt;br /&gt;            {&lt;br /&gt;                image.SetPixel(x, y, color);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return image;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;b&gt;Этап III. Распознавание символов.&lt;/b&gt;&lt;br /&gt;Для распознавания символов возьмем уже давно написанные библиотеки: &lt;a href=&quot;http://pumanet.codeplex.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Puma.NET&lt;/a&gt; и &lt;a href=&quot;http://www.nuget.org/packages/Tesseract/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Tesseract&lt;/a&gt;.&lt;br /&gt;&lt;b&gt;&lt;i&gt;&lt;u&gt;Распознавание символов с помощью Puma.NET:&lt;/u&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Распознать с помощью Puma.NET&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;param name=&quot;image&quot;&amp;gt;Оригинальное изображение&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;returns&amp;gt;Модифицированное изображение&amp;lt;/returns&amp;gt;&lt;br /&gt;public string RecognizeImage(Bitmap image)&lt;br /&gt;{&lt;br /&gt;    string text = null;&lt;br /&gt;    using (PumaPage pumaPage = new PumaPage(image))&lt;br /&gt;    {&lt;br /&gt;        // Выходной формат&lt;br /&gt;        pumaPage.FileFormat = PumaFileFormat.TxtAscii;&lt;br /&gt;        // Автоповорот изображения&lt;br /&gt;        pumaPage.AutoRotateImage = false;&lt;br /&gt;        // Включение словаря&lt;br /&gt;        pumaPage.EnableSpeller = false;&lt;br /&gt;        // Распознавать таблицы&lt;br /&gt;        pumaPage.RecognizeTables = false;&lt;br /&gt;        // Настройка шрифтов&lt;br /&gt;        pumaPage.FontSettings.DetectBold = true;&lt;br /&gt;        pumaPage.FontSettings.DetectSize = true;&lt;br /&gt;        pumaPage.FontSettings.DetectItalic = true;&lt;br /&gt;        // Язык текста&lt;br /&gt;        pumaPage.Language = PumaLanguage.English;&lt;br /&gt;        try&lt;br /&gt;        {&lt;br /&gt;            text = pumaPage.RecognizeToString();&lt;br /&gt;        }&lt;br /&gt;        catch (RecognitionEngineException)&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return text;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;b&gt;&lt;i&gt;&lt;u&gt;Распознавание символов с помощью Tesseract:&lt;/u&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Распознать с помощью Tesseract3&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;param name=&quot;image&quot;&amp;gt;Оригинальное изображение&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;returns&amp;gt;Модифицированное изображение&amp;lt;/returns&amp;gt;&lt;br /&gt;public string RecognizeImage2(Bitmap image)&lt;br /&gt;{&lt;br /&gt;    string text = null;&lt;br /&gt;    using (TesseractEngine engine = new TesseractEngine(@&quot;./tessdata&quot;, &quot;eng&quot;, EngineMode.Default))&lt;br /&gt;    {&lt;br /&gt;        using (Page page = engine.Process(image))&lt;br /&gt;        {&lt;br /&gt;            text = page.GetText();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return text;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;b&gt;Выводы:&lt;/b&gt; оптическое распознавание объектов довольно сложное и увлекательное занятие, поэтому мы продолжим развиваться в этом направлении. Замечу, что процент распознавания капчи составил около 56,3%. Думаю, это вполне приемлемо.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/7358480630213783544/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2014/03/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/7358480630213783544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/7358480630213783544'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2014/03/blog-post.html' title='Распознавание простых капч'/><author><name>Markus</name><uri>http://www.blogger.com/profile/08242965309626929451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-BRuzq_k9WZ8/Uy8SWJ-0n9I/AAAAAAAAAKo/BuhP4jCIxYI/s72-c/86056679.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-8396370633861682989</id><published>2014-03-24T01:28:00.001+06:00</published><updated>2014-03-24T01:28:37.628+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="дорвеи"/><category scheme="http://www.blogger.com/atom/ns#" term="программирование"/><category scheme="http://www.blogger.com/atom/ns#" term="с#"/><title type='text'>HomeFolder - плагин для PandoraBox</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Плагин, открывает корневую директорию программы. Выкладывается исключительно для удобства пользователей. Кидаете библиотеку в папку Plugins. При желании можете переименовать ee, чтобы повыше в списке плагинов была.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;&lt;br /&gt;namespace PandoraBox&lt;br /&gt;{&lt;br /&gt;    public class Program&lt;br /&gt;    {&lt;br /&gt;        public static void Exec(params object[] args)&lt;br /&gt;        {&lt;br /&gt;            Process.Start(Directory.GetCurrentDirectory());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;Скачать: &lt;a href=&quot;http://yadi.sk/d/VQxqYckJKh6q9&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Яндекс.Диск&lt;/a&gt; | &lt;a href=&quot;https://drive.google.com/file/d/0B4cQuoRDI6lBODdPVXZNelUxamM/edit?usp=sharing&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Google Drive&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/8396370633861682989/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2014/03/homefolder-pandorabox.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/8396370633861682989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/8396370633861682989'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2014/03/homefolder-pandorabox.html' title='HomeFolder - плагин для PandoraBox'/><author><name>Markus</name><uri>http://www.blogger.com/profile/08242965309626929451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-5507171784229968866</id><published>2014-02-27T02:00:00.000+06:00</published><updated>2014-04-05T11:43:28.957+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="отзывы"/><category scheme="http://www.blogger.com/atom/ns#" term="поисковая оптимизация"/><title type='text'>Краткая информация и отзыв о SpinnerChief Ultimate</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Продолжаем старую традицию проверять&lt;b&gt; софт для поисковой оптимизации&lt;/b&gt; на &lt;a href=&quot;http://imarkus.blogspot.com/2011/06/blog-post.html&quot;&gt;вшивость&lt;/a&gt;. Сразу стоить отметить, что таких постов будет достаточно много по причине высокой цены, а также недостаточной жесткой критики SEO-продуктов со стороны русскоязычного сегмента интернета. Итак, покупка программы c учетом скидок и обновлений обошлась в $127 + $49 = &lt;b&gt;$176&lt;/b&gt;.&lt;br /&gt;SpinnerChief предназначен для рерайтинга статей (синонимизации). Поддерживает три режима переработки текста (super spin, spin, batch-spin) и три варианта использования словарей (cloud-словари разработчиков, cloud-словари сообщества, собственные или купленные). А также множество других ненужных мне вещей. Словарей, между делом, &amp;nbsp;имеется огромное количество, однако, русский язык поддерживается слабо. Поэтому покупать ее, если вы не собираетесь работать за рубежом, не стоит.&lt;br /&gt;При использовании софта трудностей не возникло. Понравилось, в первую очередь, качество контента, которое можно также балансировать на грани между уникальностью и читабельностью. Отлично подойдет для написания и модификации большого количества статей. Главное в этом деле - не переборщить с размером статей. Так как программа 32-разрядная, то имеется ограничение на объем занимаемой оперативной памяти. Поэтому, если набухаете достаточно много информации, то может и не переварить. Как следствие, несколько часов ожиданий, потраченных зря. Программа из-за достаточно сложной схемы реализации работает не очень быстро, то такой прокол будет стоить дорого.&lt;br /&gt;Вот и все!&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/5507171784229968866/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2014/02/spinnerchief-ultimate.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/5507171784229968866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/5507171784229968866'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2014/02/spinnerchief-ultimate.html' title='Краткая информация и отзыв о SpinnerChief Ultimate'/><author><name>Markus</name><uri>http://www.blogger.com/profile/08242965309626929451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-5945234261041174517</id><published>2014-01-23T19:53:00.000+06:00</published><updated>2014-01-23T19:59:41.762+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="программирование"/><title type='text'>Регистрация доменов через SOAP-интерфейс системы регистрации R01</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;#####################################################&lt;br /&gt;# DOMAIN SNATCHER ~ 2013 | (с) Markus &lt;br /&gt;#####################################################&lt;br /&gt;&lt;br /&gt;ini_set(&quot;display_error&quot;,1);&lt;br /&gt;ini_set(&quot;error_reporting&quot;,E_ALL);&lt;br /&gt;ini_set(&#39;soap.wsdl_cache_enabled&#39;, 0);&lt;br /&gt;ini_set(&#39;session.name&#39;, &#39;SOAPClient&#39;);&lt;br /&gt;ini_set(&#39;time_limit&#39;,0);&lt;br /&gt;&lt;br /&gt;// НАСТРОЙКИ&lt;br /&gt;$settings = array(&lt;br /&gt;    //пользователь&lt;br /&gt;    &quot;user&quot; =&amp;gt; &quot;&quot;,&lt;br /&gt;    //пароль&lt;br /&gt;    &quot;pass&quot; =&amp;gt; &quot;&quot;,&lt;br /&gt;    //url SOAP-сервера&lt;br /&gt;    &quot;url&quot; =&amp;gt; &quot;https://panel.reghouse.ru:1443/partner_api.khtml&quot;,&lt;br /&gt;    //минимальный баланс на счете при котором скрипт не будет срабатывать&lt;br /&gt;    &quot;balance&quot; =&amp;gt; 900,&lt;br /&gt;    //максимальное обращение к API 60 запросов/минута, поэтому задержка в секундах&lt;br /&gt;    &quot;delay&quot; =&amp;gt; 0,&lt;br /&gt;    //пробовать заново зарегистровать проваленные задания&lt;br /&gt;    &quot;repeat&quot; =&amp;gt; false&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Domain{&lt;br /&gt;    //название домена&lt;br /&gt;    public $name;&lt;br /&gt;    //нс-сервера (формат: domain ip\ndomain ip) or (domain\ndomain)&lt;br /&gt;    public $ns = &quot;host\nhost\nhost&quot;;&lt;br /&gt;    //nic-handle администратора&lt;br /&gt;    public $admin = &#39;OF_******-R01&#39;;&lt;br /&gt;    //описание домена&lt;br /&gt;    public $desc = &#39;&#39;;&lt;br /&gt;    //проверять ли по whois доступность домена (1 - истина (по-умолчанию), 0 - ложь)&lt;br /&gt;    public $check_whois = 1;&lt;br /&gt;    //скрыть ФИО (1 - скрывать, 0 - не скрывать, -1 по-умолчанию (не скрывать))&lt;br /&gt;    public $hide_name = -1;&lt;br /&gt;    //скрыть почту (1 - скрыть email, 0 - не скрывать, -1 по умолчанию (не скрывать))&lt;br /&gt;    public $hide_email = -1;&lt;br /&gt;    //контроль спама: 0 - обработка выключена, 1 -  помечать подозрительные письма, 2 - удалять подозрительные письма, -1 - по-умолчанию&lt;br /&gt;    public $spam_process = -1;&lt;br /&gt;    //1 - скрыть телефон, 0 - Не скрывать, -1 - по умолчанию (нескрывать)&lt;br /&gt;    public $hide_phone = -1;&lt;br /&gt;    //e-mail для приема голосовой почты. Если не введён - используеться e-mail администратора&lt;br /&gt;    public $hide_phone_email = &#39;&#39;;&lt;br /&gt;    //идентификатор регистратора&lt;br /&gt;    public $registrar = &#39;&#39;;&lt;br /&gt;    //количество лет, на которое регистрируется домен (для международных доменов). От 1 до 10. По-умолчанию: 1 год.&lt;br /&gt;    public $years = 1;&lt;br /&gt;    //отключить проверку DNS-серверов. 1 - отключить, 0 - не отключать, по-умолчанию: 1(только для ru/su доменов)&lt;br /&gt;    public $ns_notest = 1;&lt;br /&gt;    function __construct(){&lt;br /&gt;        $args = func_get_args();&lt;br /&gt;        $this-&amp;gt;name = !isset($args[0]) ? $this-&amp;gt;name : $args[0];&lt;br /&gt;        $this-&amp;gt;ns = !isset($args[1]) ? $this-&amp;gt;ns : $args[1];&lt;br /&gt;        $this-&amp;gt;admin = !isset($args[2]) ? $this-&amp;gt;admin : $args[2];&lt;br /&gt;        $this-&amp;gt;desc = !isset($args[3]) ? $this-&amp;gt;desc : $args[3];&lt;br /&gt;        $this-&amp;gt;check_whois = !isset($args[4]) ? $this-&amp;gt;check_whois : $args[4];&lt;br /&gt;        $this-&amp;gt;hide_name  = !isset($args[5]) ? $this-&amp;gt;hide_name : $args[5];&lt;br /&gt;        $this-&amp;gt;hide_email = !isset($args[6]) ? $this-&amp;gt;hide_email : $args[6];&lt;br /&gt;        $this-&amp;gt;spam_proccess = !isset($args[7]) ? $this-&amp;gt;spam_process : $args[7];&lt;br /&gt;        $this-&amp;gt;hide_phone = !isset($args[8]) ? $this-&amp;gt;hide_phone : $args[8];&lt;br /&gt;        $this-&amp;gt;hide_phone_email = !isset($args[9]) ? $this-&amp;gt;hide_phone_email : $args[9];&lt;br /&gt;        $this-&amp;gt;registrar = !isset($args[10]) ? $this-&amp;gt;registrar : $args[10];&lt;br /&gt;        $this-&amp;gt;years = !isset($args[11]) ? $this-&amp;gt;years : $args[11];&lt;br /&gt;        $this-&amp;gt;ns_notest =  !isset($args[12]) ? $this-&amp;gt;ns_notest : $args[12];&lt;br /&gt;    }&lt;br /&gt;    function __toString(){&lt;br /&gt;        return $this-&amp;gt;name;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class DomainSnatcher&lt;br /&gt;{&lt;br /&gt;    private $client;&lt;br /&gt;    private $url;&lt;br /&gt;    private $user;&lt;br /&gt;    private $pass;&lt;br /&gt;    private $isLogged;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    function __construct($user,$pass,$url){&lt;br /&gt;        $this-&amp;gt;user = $user;&lt;br /&gt;        $this-&amp;gt;pass = $pass;&lt;br /&gt;        $this-&amp;gt;url = $url;&lt;br /&gt;    }&lt;br /&gt;    // Подключается к SOAP-серверу&lt;br /&gt;    public function LogIn(){&lt;br /&gt;        if($this-&amp;gt;client == null){&lt;br /&gt;            try{&lt;br /&gt;                $this-&amp;gt;client = new SoapClient(null,&lt;br /&gt;                    array(&lt;br /&gt;                        &quot;location&quot; =&amp;gt; $this-&amp;gt;url,&lt;br /&gt;                        &#39;uri&#39; =&amp;gt; &#39;urn:RegbaseSoapInterface&#39;,&lt;br /&gt;                        &#39;exceptions&#39; =&amp;gt; true,&lt;br /&gt;                        &#39;user_agent&#39; =&amp;gt; &#39;RegbaseSoapInterfaceClient&#39;,&lt;br /&gt;                        &#39;trace&#39; =&amp;gt; 1 )&lt;br /&gt;                );&lt;br /&gt;            }&lt;br /&gt;            catch(SoapFault $exc){&lt;br /&gt;                echo $exc-&amp;gt;faultstring;&lt;br /&gt;                exit();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        try{&lt;br /&gt;            $loginresult = $this-&amp;gt;client-&amp;gt;logIn($this-&amp;gt;user,$this-&amp;gt;pass);&lt;br /&gt;        }&lt;br /&gt;        catch(SoapFault $exc){&lt;br /&gt;            echo $exc-&amp;gt;faultstring;&lt;br /&gt;            exit();&lt;br /&gt;        }&lt;br /&gt;        if ($loginresult-&amp;gt;status-&amp;gt;code == &#39;0&#39;){&lt;br /&gt;            echo $loginresult-&amp;gt;status-&amp;gt;name;&lt;br /&gt;            exit();&lt;br /&gt;        }&lt;br /&gt;        else{&lt;br /&gt;            $this-&amp;gt;client-&amp;gt;__setCookie(&quot;SOAPClient&quot;, $loginresult-&amp;gt;status-&amp;gt;message);&lt;br /&gt;            $this-&amp;gt;isLogged = true;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Проверяет домен на доступность&lt;br /&gt;    public function VerifyDomainAvailable($name){&lt;br /&gt;        $availability = $this-&amp;gt;client-&amp;gt;checkDomainAvailable($name);&lt;br /&gt;        return $availability-&amp;gt;status-&amp;gt;name;&lt;br /&gt;    }&lt;br /&gt;    // Получает баланс&lt;br /&gt;    public function GetBalance(){&lt;br /&gt;        $balance = $this-&amp;gt;client-&amp;gt;getBalanceInfo();&lt;br /&gt;        if($balance-&amp;gt;status-&amp;gt;code != &#39;1&#39;){&lt;br /&gt;            return $balance-&amp;gt;status-&amp;gt;name;&lt;br /&gt;        }&lt;br /&gt;        return (int)$balance-&amp;gt;data-&amp;gt;balance;&lt;br /&gt;    }&lt;br /&gt;    // Добавляет домен&lt;br /&gt;    public function AddDomain($domain){&lt;br /&gt;        if($this-&amp;gt;isLogged != true || !($domain instanceof Domain)) {&lt;br /&gt;            throw new UnexpectedValueException;&lt;br /&gt;        }&lt;br /&gt;        // Прежде чем добавлять параметры их следует переконвертировать в Utf8&lt;br /&gt;        $add = $this-&amp;gt;client-&amp;gt;addDomain(&lt;br /&gt;                                 DomainController::EncodingToUtf8($domain-&amp;gt;name),&lt;br /&gt;                                 $domain-&amp;gt;ns,&lt;br /&gt;                                 $domain-&amp;gt;admin,&lt;br /&gt;                                 DomainController::EncodingToUtf8($domain-&amp;gt;desc));&lt;br /&gt;&lt;br /&gt;        if($add-&amp;gt;status-&amp;gt;code == &#39;1&#39;){&lt;br /&gt;            return (int)$add-&amp;gt;taskid;&lt;br /&gt;        }&lt;br /&gt;        return $add-&amp;gt;status-&amp;gt;name;&lt;br /&gt;    }&lt;br /&gt;    // Проверяет задания на результат&lt;br /&gt;    public function VerifyTask($id){&lt;br /&gt;        $task = $this-&amp;gt;client-&amp;gt;checkTask($id);&lt;br /&gt;        return $task-&amp;gt;status-&amp;gt;name;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    // Разлогинивает&lt;br /&gt;    public function LogOut() {&lt;br /&gt;        if($this-&amp;gt;isLogged){&lt;br /&gt;            try{&lt;br /&gt;                $this-&amp;gt;client-&amp;gt;logOut();&lt;br /&gt;                $this-&amp;gt;isLogged = false;&lt;br /&gt;                $this-&amp;gt;client = null;&lt;br /&gt;            }&lt;br /&gt;            catch(SoapFault $exc) {&lt;br /&gt;                echo $exc-&amp;gt;faultcode;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    function __destruct(){}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class DomainController{&lt;br /&gt;    private $domains;&lt;br /&gt;    private $tasks;&lt;br /&gt;    private $filename;&lt;br /&gt;    private $taskfilename;&lt;br /&gt;&lt;br /&gt;    function __construct() {}&lt;br /&gt;&lt;br /&gt;    // Считывает исходный файл с домена и создает модели&lt;br /&gt;    public function Open($filename){&lt;br /&gt;        if(!file_exists($filename)){&lt;br /&gt;            throw new UnexpectedValueException;&lt;br /&gt;        }&lt;br /&gt;        $this-&amp;gt;filename = $filename;&lt;br /&gt;        $domains = file_get_contents($filename);&lt;br /&gt;        $domains = array_map(&quot;trim&quot;,explode(&quot;\n&quot;,$domains));&lt;br /&gt;        foreach($domains as $domain){&lt;br /&gt;            if(!empty($domain)){&lt;br /&gt;                $this-&amp;gt;domains[] = new Domain($domain);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    // Логика работы программы&lt;br /&gt;    public function Proccessing(){&lt;br /&gt;        global $settings;&lt;br /&gt;        $skip_domains = array();&lt;br /&gt;        $ds = new DomainSnatcher($settings[&quot;user&quot;],$settings[&quot;pass&quot;],$settings[&quot;url&quot;]);&lt;br /&gt;        $ds-&amp;gt;LogIn();&lt;br /&gt;        $this-&amp;gt;Open(&quot;domains.txt&quot;);&lt;br /&gt;        if($this-&amp;gt;GetDomainsCount() == 0){&lt;br /&gt;            $ds-&amp;gt;LogOut();&lt;br /&gt;            exit();&lt;br /&gt;        }&lt;br /&gt;        $this-&amp;gt;GetTasks();&lt;br /&gt;        $tasks = $this-&amp;gt;tasks;&lt;br /&gt;        // Проверяем предыдущие задания на результат выполнения&lt;br /&gt;        foreach($tasks as $domain=&amp;gt;$task_id){&lt;br /&gt;            $task = $ds-&amp;gt;VerifyTask($task_id);&lt;br /&gt;            switch($task){&lt;br /&gt;                // Если успешно то удаляем домен&lt;br /&gt;                case Constants::GetConstantName(0):&lt;br /&gt;                    $index = $this-&amp;gt;GetDomainIndex($domain);&lt;br /&gt;                    if(!is_null($index)){&lt;br /&gt;                        $this-&amp;gt;RemoveDomain($index);&lt;br /&gt;                        $this-&amp;gt;RemoveTask($domain);&lt;br /&gt;                    }&lt;br /&gt;                    break;&lt;br /&gt;                // Если провалилось, то решаем по месту что делать&lt;br /&gt;                case Constants::GetConstantName(1):&lt;br /&gt;                    if($settings[&#39;repeat&#39;] == true)&lt;br /&gt;                    {&lt;br /&gt;                        $this-&amp;gt;RemoveTask($domain);&lt;br /&gt;                    }&lt;br /&gt;                    else{&lt;br /&gt;                        $index = $this-&amp;gt;GetDomainIndex($domain);&lt;br /&gt;                        if(!is_null($index)){&lt;br /&gt;                            $this-&amp;gt;RemoveDomain($index);&lt;br /&gt;                            $this-&amp;gt;RemoveTask($domain);&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    break;&lt;br /&gt;                // Если еще выполняется, то задание сохраняем, а домен пропускаем&lt;br /&gt;                case Constants::GetConstantName(2):&lt;br /&gt;                    $skip_domains[] = $domain;&lt;br /&gt;                    break;&lt;br /&gt;                // Иначе произошли какие-то некорректные ошибки&lt;br /&gt;                default: $this-&amp;gt;RemoveTask($domain);&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        //Начинаем регать&lt;br /&gt;        foreach($this-&amp;gt;domains as $domain){&lt;br /&gt;            sleep($settings[&quot;delay&quot;]);&lt;br /&gt;            //Проверяем доступность&lt;br /&gt;            $available = $ds-&amp;gt;VerifyDomainAvailable($domain-&amp;gt;name);&lt;br /&gt;            switch($available){&lt;br /&gt;                // Домен доступен для регистрации&lt;br /&gt;                case Constants::GetConstantName(3):&lt;br /&gt;                    //Проверяем есть ли домен уже в заданиях&lt;br /&gt;                    if(!in_array($domain-&amp;gt;name,$skip_domains)){&lt;br /&gt;                    // Проверяем баланс&lt;br /&gt;                        $balance = $ds-&amp;gt;GetBalance();&lt;br /&gt;                        if(is_int($balance) &amp;amp;&amp;amp; $balance &amp;gt; $settings[&quot;balance&quot;])&lt;br /&gt;                        {&lt;br /&gt;                            // Пробуем зарегистрировать&lt;br /&gt;                            $add = $ds-&amp;gt;AddDomain($domain);&lt;br /&gt;                            // Если задание поставлено в очередь&lt;br /&gt;                            if(is_int($add)){&lt;br /&gt;                                //Добавляем в хеш&lt;br /&gt;                                $this-&amp;gt;AddTask($domain-&amp;gt;name,$add);&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                        else{&lt;br /&gt;                            $ds-&amp;gt;LogOut();&lt;br /&gt;                            exit();&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    break;&lt;br /&gt;                default:&lt;br /&gt;                    continue;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        // Сохраняем задания&lt;br /&gt;        $this-&amp;gt;SaveTasks();&lt;br /&gt;        // Сохраняем домены&lt;br /&gt;        $this-&amp;gt;Save();&lt;br /&gt;        // Выходим&lt;br /&gt;        $ds-&amp;gt;LogOut();&lt;br /&gt;    }&lt;br /&gt;    // Получить индекс объекта по его имени&lt;br /&gt;    public function GetDomainIndex($name){&lt;br /&gt;        foreach($this-&amp;gt;domains as $k=&amp;gt;$domain){&lt;br /&gt;            if($domain-&amp;gt;name == $name){&lt;br /&gt;                return $k;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        return null;&lt;br /&gt;    }&lt;br /&gt;    // Получить список запущенных заданий&lt;br /&gt;    public function GetTasks(){&lt;br /&gt;        if(!isset($this-&amp;gt;filename)){&lt;br /&gt;            throw new UnexpectedValueException;&lt;br /&gt;        }&lt;br /&gt;        $info = pathinfo($this-&amp;gt;filename);&lt;br /&gt;        $taskfilename = $info[&#39;filename&#39;].&quot;.json&quot;;&lt;br /&gt;        $this-&amp;gt;taskfilename = $taskfilename;&lt;br /&gt;        if(file_exists($taskfilename)){&lt;br /&gt;            $json = file_get_contents($taskfilename);&lt;br /&gt;            $json = json_decode($json, true);&lt;br /&gt;            $this-&amp;gt;tasks = $json;&lt;br /&gt;        }&lt;br /&gt;        else{&lt;br /&gt;            $this-&amp;gt;tasks = array();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    // Удаляет домен из кучи&lt;br /&gt;    public function RemoveDomain($index){&lt;br /&gt;        unset($this-&amp;gt;domains[$index]);&lt;br /&gt;    }&lt;br /&gt;    // Удалить задание из очереди&lt;br /&gt;    public function RemoveTask($domain){&lt;br /&gt;        unset($this-&amp;gt;tasks[$domain]);&lt;br /&gt;    }&lt;br /&gt;    // Добавить новое задание в очередь&lt;br /&gt;    public function AddTask($domain, $task){&lt;br /&gt;        if(!isset($this-&amp;gt;tasks)){&lt;br /&gt;            $this-&amp;gt;tasks = array();&lt;br /&gt;        }&lt;br /&gt;        $this-&amp;gt;tasks[$domain] = $task;&lt;br /&gt;    }&lt;br /&gt;    // Сохранить задания&lt;br /&gt;    public function SaveTasks(){&lt;br /&gt;        file_put_contents($this-&amp;gt;taskfilename,json_encode($this-&amp;gt;tasks));&lt;br /&gt;    }&lt;br /&gt;    // Сохранить домены&lt;br /&gt;    public function Save() {&lt;br /&gt;        $domains  = array();&lt;br /&gt;        foreach($this-&amp;gt;domains as $domain){&lt;br /&gt;            $domains[] = $domain-&amp;gt;name;&lt;br /&gt;        }&lt;br /&gt;        file_put_contents($this-&amp;gt;filename,join(&quot;\n&quot;,$domains));&lt;br /&gt;    }&lt;br /&gt;   // Перекодировать строку в Utf-8&lt;br /&gt;    public function EncodingToUtf8($str){&lt;br /&gt;        $encoding = mb_detect_encoding($str);&lt;br /&gt;        if($encoding != &quot;UTF-8&quot;){&lt;br /&gt;            $str = iconv($encoding,&quot;UTF-8&quot;,$str);&lt;br /&gt;        }&lt;br /&gt;        return $str;&lt;br /&gt;    }&lt;br /&gt;    // Получить количество исходных данных&lt;br /&gt;    public function GetDomainsCount(){&lt;br /&gt;        return count($this-&amp;gt;domains);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Constants{&lt;br /&gt;    const TASK_SUCCESS = 0;&lt;br /&gt;    const TASK_FAILURE = 1;&lt;br /&gt;    const TASK_QUEUED = 2;&lt;br /&gt;    const DOMAIN_AVAILABLE = 3;&lt;br /&gt;    const OK  = 4;&lt;br /&gt;    // Получить константу по значению&lt;br /&gt;    public static function GetConstantValue($name){&lt;br /&gt;        $constants = self::GetConstants();&lt;br /&gt;        return self::KeyExists($name,$constants);&lt;br /&gt;    }&lt;br /&gt;    // Получить константу по имени&lt;br /&gt;    public static function GetConstantName($value){&lt;br /&gt;        $constants = self::GetConstants();&lt;br /&gt;        $constants = array_flip($constants);&lt;br /&gt;        return self::KeyExists($value,$constants);&lt;br /&gt;    }&lt;br /&gt;    // Проверить существование ключа массива&lt;br /&gt;    private function KeyExists($value, $arr){&lt;br /&gt;        if(array_key_exists($value,$arr)){&lt;br /&gt;            return $arr[$value];&lt;br /&gt;        }&lt;br /&gt;        return null;&lt;br /&gt;    }&lt;br /&gt;    // Получить массив констант&lt;br /&gt;    private function GetConstants(){&lt;br /&gt;        $class = new ReflectionClass(&#39;Constants&#39;);&lt;br /&gt;        $constants = $class-&amp;gt;getConstants();&lt;br /&gt;        return $constants;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$dc = new DomainController;&lt;br /&gt;$dc-&amp;gt;Proccessing();&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;b&gt;Первоначальная настройка:&lt;/b&gt;&lt;br /&gt;Пароль для API необходимо сгенерировать: для этого заходим в панель администратора, далее мои данные, а потом изменить пароль доступа к API. В классе Domain указываем Handle-Администратора: узнать можно, проверив информацию о любом зарегистрированном домене. Так же необходимо добавить ns-сервера в формате host1\nhost2\nhost3, где \n - ОБЯЗАТЕЛЕН.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Конфигурационные файлы:&lt;/b&gt;&lt;br /&gt;domains.txt - список доменов к регистрации;&lt;br /&gt;domains.json - очередь заданий;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/5945234261041174517/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2014/01/soap-r01.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/5945234261041174517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/5945234261041174517'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2014/01/soap-r01.html' title='Регистрация доменов через SOAP-интерфейс системы регистрации R01'/><author><name>Markus</name><uri>http://www.blogger.com/profile/08242965309626929451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-7454419782146030396</id><published>2014-01-23T19:26:00.000+06:00</published><updated>2014-01-23T20:04:13.797+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c#"/><category scheme="http://www.blogger.com/atom/ns#" term="дорвеи"/><category scheme="http://www.blogger.com/atom/ns#" term="программирование"/><title type='text'>Парсер Yahoo - пользовательский макрос для PandoraBox</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Net;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Text.RegularExpressions;&lt;br /&gt;&lt;br /&gt;namespace PandoraBox{   &lt;br /&gt;    public class YahooParserPlugin : IPluginMacro&lt;br /&gt;    {&lt;br /&gt;        Regex _block = new Regex(@&quot;{YAHOO-(\d+)}(.*?){/YAHOO}&quot;, RegexOptions.Compiled | RegexOptions.Singleline);&lt;br /&gt;&lt;br /&gt;        public string Execute(string template, PluginMacroArgs args)&lt;br /&gt;        {&lt;br /&gt;              template = _block.Replace(template, delegate(Match match)&lt;br /&gt;            {&lt;br /&gt;                int count = int.Parse(match.Groups[1].Value);&lt;br /&gt;&lt;br /&gt;                string text = match.Groups[2].Value;  &lt;br /&gt;                try{  &lt;br /&gt;                    Yahoo yahoo = new Yahoo(text, count);&lt;br /&gt;                    yahoo.Proccessing();                        &lt;br /&gt;                    return yahoo.Text;&lt;br /&gt;                }&lt;br /&gt;                catch{&lt;br /&gt;                    return string.Empty;&lt;br /&gt;                }&lt;br /&gt;               &lt;br /&gt;            });&lt;br /&gt;&lt;br /&gt;            return template;&lt;br /&gt;        }&lt;br /&gt;  &lt;br /&gt;        public ushort Level&lt;br /&gt;        {&lt;br /&gt;            get { return 10; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string Name&lt;br /&gt;        {&lt;br /&gt;            get { return &quot;Парсер Yahoo&quot;; }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    class Yahoo : IParser&lt;br /&gt;    {&lt;br /&gt;             &lt;br /&gt;        // Ключ&lt;br /&gt;        public string Key { get; set; }&lt;br /&gt;&lt;br /&gt;        // Количество страниц для парсинга&lt;br /&gt;        public int Count { get; set; }&lt;br /&gt;&lt;br /&gt;        // Данные&lt;br /&gt;        private List&amp;lt;string&amp;gt; _text = new List&amp;lt;string&amp;gt;();&lt;br /&gt;&lt;br /&gt;        // Спарсенный текст&lt;br /&gt;        public string Text&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                Random r = new Random();&lt;br /&gt;                return string.Join(&quot; &quot;, _text.OrderBy(x =&amp;gt; r.Next()).ToList());&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public Yahoo(string key, int count)&lt;br /&gt;        {&lt;br /&gt;            Key = key;&lt;br /&gt;            Count = count;&lt;br /&gt;        }     &lt;br /&gt;&lt;br /&gt;        // Функция парсинга конкретной страницы&lt;br /&gt;        private List&amp;lt;string&amp;gt; Parse(string data)&lt;br /&gt;        {&lt;br /&gt;            Regex exp = new Regex(&quot;(?&amp;lt;=&amp;lt;div class=\&quot;abstr\&quot;&amp;gt;).*?(?=&amp;lt;span class=url&amp;gt;)&quot;, RegexOptions.IgnoreCase);&lt;br /&gt;            MatchCollection matches =  exp.Matches(data);&lt;br /&gt;            List&amp;lt;string&amp;gt; texts = new List&amp;lt;string&amp;gt;();&lt;br /&gt;            foreach (Match match in matches)&lt;br /&gt;            {&lt;br /&gt;                string text = Regex.Replace(match.Value, &quot;&amp;lt;[^&amp;gt;]+&amp;gt;&quot;, string.Empty);&lt;br /&gt;                texts.Add(text);&lt;br /&gt;                &lt;br /&gt;            }&lt;br /&gt;            return texts;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // Функция для получения ссылок для парсинга&lt;br /&gt;        private List&amp;lt;String&amp;gt; GetPages()&lt;br /&gt;        {&lt;br /&gt;            int step = 1;&lt;br /&gt;            List&amp;lt;string&amp;gt; sentences = new List&amp;lt;string&amp;gt;();&lt;br /&gt;            for (int i = 0; i &amp;lt; Count; i++)&lt;br /&gt;            {&lt;br /&gt;                sentences.Add(string.Format(&quot;http://search.yahoo.com/search;_ylt=A7x9Qb0oaXpS3jEAQ2eT.Qt.?p={0}&amp;amp;fr=yfp-t-722&amp;amp;fr2=sfp&amp;amp;xargs=0&amp;amp;pstart=1&amp;amp;b={1}&quot;, Key, step));&lt;br /&gt;                step += 10;&lt;br /&gt;            }&lt;br /&gt;            return sentences;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // Функция для получения содержимого страницы&lt;br /&gt;        private string GetContent(string url)&lt;br /&gt;        {&lt;br /&gt;            WebClient client = new WebClient();&lt;br /&gt;            client.Encoding = Encoding.UTF8;&lt;br /&gt;            string content = client.DownloadString(url);          &lt;br /&gt;            return content;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // Логика работы программы&lt;br /&gt;        public void Proccessing()&lt;br /&gt;        {&lt;br /&gt;            foreach (string page in GetPages())&lt;br /&gt;            {&lt;br /&gt;                List&amp;lt;string&amp;gt; texts = Parse(GetContent(page));&lt;br /&gt;                _text.AddRange(texts);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    interface IParser&lt;br /&gt;    {&lt;br /&gt;       string Key { get; set; }&lt;br /&gt;&lt;br /&gt;       int Count { get; set; }&lt;br /&gt;&lt;br /&gt;       string Text { get;}&lt;br /&gt;&lt;br /&gt;       void Proccessing();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;Использование {YAHOO-n}[KEYWORD]{/YAHOO}, где n-количество страниц для парсинга. &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/7454419782146030396/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2014/01/yahoo-pandorabox.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/7454419782146030396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/7454419782146030396'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2014/01/yahoo-pandorabox.html' title='Парсер Yahoo - пользовательский макрос для PandoraBox'/><author><name>Markus</name><uri>http://www.blogger.com/profile/08242965309626929451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-2487861986926186818</id><published>2013-12-09T08:22:00.000+06:00</published><updated>2013-12-09T08:24:36.602+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="программирование"/><title type='text'>Генерация видео из изображений</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Как сделать видео из своих картинок или уже готовых изображений вы сразу поймете, прочтя этот довольно простой пример кода, написанный с использованием &amp;nbsp;библиотек &lt;b&gt;OpenCV&lt;/b&gt; и &lt;b&gt;PIL&lt;/b&gt; на языке &lt;b&gt;Python&lt;/b&gt;.&amp;nbsp;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;#-*-coding: utf-8-*-&lt;br /&gt;from PIL import Image, ImageDraw, ImageFont&lt;br /&gt;import cv&lt;br /&gt;import random&lt;br /&gt;import os.path, os&lt;br /&gt;import random&lt;br /&gt;&lt;br /&gt;directory = u&quot;test&quot;&lt;br /&gt;current_path = os.getcwdu()&lt;br /&gt;&lt;br /&gt;def generate_image(directory):&lt;br /&gt;    files = os.listdir(directory)&lt;br /&gt;    rand_image = random.choice(files)&lt;br /&gt;    im2 = Image.open(directory+os.path.sep+rand_image)&lt;br /&gt;    # создаем новое изображений&lt;br /&gt;    im = Image.new(&quot;RGB&quot;, (640, 390), &quot;#ffffff&quot;)&lt;br /&gt;    draw = ImageDraw.Draw(im)&lt;br /&gt;    # подключаем TrueType-шрифт&lt;br /&gt;    font = ImageFont.truetype(u&quot;arial.ttf&quot;, 17)&lt;br /&gt;    color = [u&quot;black&quot;,u&quot;blue&quot;,u&quot;orange&quot;,u&quot;green&quot;]&lt;br /&gt;    x, y = im.size&lt;br /&gt;    # рисуем тест на изображении&lt;br /&gt;    draw.text((150, 25), u&quot;Test&quot;), font=font, fill=random.choice(color))&lt;br /&gt;    # вставляем нашу картинку на исходное изображение&lt;br /&gt;    im.paste(im2,(180, 80))&lt;br /&gt;    return im&lt;br /&gt;&lt;br /&gt;&quot;&quot;&quot;&lt;br /&gt;Названия кодеков лежат тут http://www.fourcc.org/codecs.php&lt;br /&gt;параметры:&lt;br /&gt;1 - полный путь до файла&lt;br /&gt;2 - кодек&lt;br /&gt;3 - частота кадров &lt;br /&gt;4 - размер фрейма = размер изображения&lt;br /&gt;5 - цветность&lt;br /&gt;&quot;&quot;&quot;&lt;br /&gt;for i in xrange(10):&lt;br /&gt;    generate_image(directory).save(&quot;temp.png&quot;,&quot;png&quot;)&lt;br /&gt;    writer = cv.CreateVideoWriter(u&quot;video%d.avi&quot; % random.randint(1000,10000),cv.CV_FOURCC(&#39;M&#39;,&#39;P&#39;,&#39;4&#39;,&#39;2&#39;),1,(640,390),1)&lt;br /&gt;    for i in xrange(30):&lt;br /&gt;        for i in range(10):&lt;br /&gt;            img = cv.LoadImage(&quot;temp.png&quot;)&lt;br /&gt;            cv.WriteFrame(writer,img)&lt;br /&gt;    # не забываем удалить кодировщик иначе мы не сможем финализировать видео&lt;br /&gt;    del writer&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/2487861986926186818/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2013/12/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/2487861986926186818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/2487861986926186818'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2013/12/blog-post.html' title='Генерация видео из изображений'/><author><name>Markus</name><uri>http://www.blogger.com/profile/08242965309626929451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-4068036497225911404</id><published>2013-12-09T08:21:00.002+06:00</published><updated>2013-12-09T08:21:44.793+06:00</updated><title type='text'>Resharper не работают горячие клавиши в Visual Studio 2010-2013. Решение проблемы.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;b&gt;Решение для Visual Studio 2010&lt;/b&gt;: удаляем каталог с проектами, удаляем папку в Application Data. Далее жмем Resharper Options и применяем комбинации для клавиатуры. Неполадки обычно идут в локализованных версиях. Проверено на Visual Studio 2010 - 2012.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Решение для Visual Studio 2013&lt;/b&gt;: сбрасываем комбинации для клавиатуры в меню IDE (сервис-&amp;gt;параметры-&amp;gt;клавиатура). В той секции VS переключаем язык на English и перезагружаем программу. Далее применяем комбинации клавиши в Resharper Options. Потом меняем язык Visual Studio на русский &amp;nbsp;и снова перезагружаем программу.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Дополнительные варианты (следует проверить): &lt;/b&gt;&amp;nbsp;изначально при всех действиях у Вас должно стоять все по-умолчанию как в VS, так и в Resharper. Далее можно, например, поменять схему клавиатуры студии на C# 2005 и заново применить настройки решарпера. Если раньше горячие клавиши работали, а потом перестали - можно попробовать переставить в секции Keyboard &amp;amp; Menus ползунок в положение None. А так же попробовать заново импортировать настройки Resharper из старых проектов через &amp;nbsp;Manage Options.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/4068036497225911404/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2013/12/resharper-visual-studio-2010-2013.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/4068036497225911404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/4068036497225911404'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2013/12/resharper-visual-studio-2010-2013.html' title='Resharper не работают горячие клавиши в Visual Studio 2010-2013. Решение проблемы.'/><author><name>Markus</name><uri>http://www.blogger.com/profile/08242965309626929451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-3973824224750018651</id><published>2013-10-26T18:30:00.004+06:00</published><updated>2013-10-26T18:34:36.276+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="софт"/><title type='text'>Запустить Outlook в свернутом виде</title><content type='html'>Написал небольшую программу для запуска Microsoft Outlook в свернутом виде (режиме). Сворачивание осуществляется в трей, а не в панель задач как прежде. Тестил на версии Outlook 2013, но думаю будет работать и на 2010. Добавляете лоадер в автозагрузку и радуетесь! Для работы программа требует установленный Microsoft .NET 4.0. Если будут пожелания, вопросы и предложения писать в комментарии.&amp;nbsp;&lt;a href=&quot;https://drive.google.com/file/d/0BywhMnHxaFgFSDllLTFTRm5tczg/edit?usp=sharing&quot; target=&quot;_blank&quot;&gt;Скачать&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/3973824224750018651/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2013/10/outlook.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/3973824224750018651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/3973824224750018651'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2013/10/outlook.html' title='Запустить Outlook в свернутом виде'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-4565123285764001976</id><published>2012-09-30T16:12:00.000+06:00</published><updated>2012-10-01T23:02:01.712+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="1С Предприятие"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>Взаимодействие с COM-интерфейсом 1С Предприятие 8.2</title><content type='html'>Небольшой примерчик, а также описание проблем и решений, которые могут возникнуть при работе.&lt;br /&gt;Для работы с ком-интерфейсом нам потребуется библиотека &lt;b&gt;PyWin32&lt;/b&gt;. Обращение к атрибутам осуществляется через функции getattr,setattr. Входные параметры всегда должны быть переведены в кодировку cp1251. Были замечены небольшие косяки: ошибки при получении функций на русском языке, как вариант их следует переименовать на англ, однако, почему-то получение глобальных переменных на русском работает отлично. Чтобы работало все без косяков следует:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Вынести все процедуры и функции в модуль объекта, исключить использование модуля формы.&lt;/li&gt;&lt;li&gt;Произвести экспорт переменных (объявляется в начале модуля объекта).&lt;/li&gt;&lt;li&gt;Произвести экспорт процедур и функций.&lt;/li&gt;&lt;li&gt;Использовать по возможности обращение к англоязычному варианту методов. &lt;/li&gt;&lt;/ol&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;import win32com.client&lt;br /&gt;from sys import exit&lt;br /&gt;import pythoncom&lt;br /&gt;class Connector(object):&lt;br /&gt;    &quot;&quot;&quot; Взаимодействие с COM-интерфейсом 1С Предприятие 8.2 &quot;&quot;&quot;&lt;br /&gt;    def __init__(self, *args, **kwargs):&lt;br /&gt;        self.__Server = kwargs[u&#39;server&#39;]&lt;br /&gt;        self.__Database = kwargs[u&#39;database&#39;]&lt;br /&gt;        self.__TypeConnection = kwargs[u&#39;typeconnection&#39;]&lt;br /&gt;        self.__File = kwargs[u&#39;filename&#39;]&lt;br /&gt;&lt;br /&gt;    conn = property(lambda self: self.__Connection)&lt;br /&gt;&lt;br /&gt;    def connect(self):&lt;br /&gt;        &quot;&quot;&quot; Функция подключения к серверу или файлу 1С &quot;&quot;&quot;&lt;br /&gt;        connectstring = u&quot;Srvr={server};Ref={database};&quot;.format(&lt;br /&gt;                        server = self.__Server, database = self.__Database) \&lt;br /&gt;                        if self.__TypeConnection else u&quot;File={filename};&quot;.format(filename = self.__File)&lt;br /&gt;        pythoncom.CoInitialize()&lt;br /&gt;        try:&lt;br /&gt;            self.__Connection = win32com.client.Dispatch(u&quot;V82.COMConnector&quot;).Connect(connectstring)&lt;br /&gt;        except:&lt;br /&gt;            msq  = u&quot;возникли неполадки при подключении к серверу или файлу&quot;&lt;br /&gt;            raise error.ConnectionError(msq)&lt;br /&gt;&lt;br /&gt;    def create(self):&lt;br /&gt;        &quot;&quot;&quot; Новый экземляр обработки &quot;&quot;&quot;&lt;br /&gt;        try:&lt;br /&gt;            Constant = getattr(self.__Connection.Constants,u&quot;Наименование константы&quot;.encode(u&quot;cp1251&quot;))&lt;br /&gt;        except:&lt;br /&gt;            msq = u&quot;не найдена константа &amp;lt;&amp;lt;Наименование константы&amp;gt;&amp;gt;&quot;&lt;br /&gt;            raise error.ObjectNotFound(msq)&lt;br /&gt;        ConstantValue = Constant.Get()&lt;br /&gt;        if ConstantValue:&lt;br /&gt;            try:&lt;br /&gt;                OuterDataProccessors = getattr(self.__Connection.Catalogs,u&quot;ВнешниеОбработки&quot;.encode(u&quot;cp1251&quot;))&lt;br /&gt;            except:&lt;br /&gt;                msq = u&quot;не найден справочник &amp;lt;&amp;lt;Внешние обработки&amp;gt;&amp;gt;&quot;&lt;br /&gt;                raise error.ObjectNotFound(msq)&lt;br /&gt;            try:&lt;br /&gt;                DataProccessor = OuterDataProccessors.FindByDescription(u&quot;Наименование обработки&quot;.encode(u&quot;cp1251&quot;))&lt;br /&gt;            except:&lt;br /&gt;                msq = u&quot;не найдена обработка &amp;lt;&amp;lt;Наименование обработки&amp;gt;&amp;gt;&quot;&lt;br /&gt;                raise error.ObjectNotFound(msq)&lt;br /&gt;            Tempfile = self.__Connection.GetTempFileName()&lt;br /&gt;            BinaryData = getattr(DataProccessor,u&quot;ХранилищеВнешнейОбработки&quot;.encode(u&quot;cp1251&quot;)).Get()&lt;br /&gt;            BinaryData.Write(Tempfile)&lt;br /&gt;            DataProccessorObject = getattr(self.__Connection,u&quot;ВнешниеОбработки&quot;.encode(u&quot;cp1251&quot;))&lt;br /&gt;            self.DataProccessorObject = DataProccessorObject.Create(Tempfile)&lt;br /&gt;            self.__Funct  = getattr(self.DataProccessorObject,u&#39;НаименованиеФункции&#39;.encode(u&quot;cp1251&quot;))&lt;br /&gt;        else:&lt;br /&gt;            self.disconnect()&lt;br /&gt;            exit(0)&lt;br /&gt;&lt;br /&gt;    def disconnect(self):&lt;br /&gt;       &quot;&quot;&quot; Отлючение от кома &quot;&quot;&quot;&lt;br /&gt;       del self.__Connection&lt;br /&gt;################################################################&lt;br /&gt;# ERROR CLASS&lt;br /&gt;################################################################&lt;br /&gt;class ConnectorError(Exception):&lt;br /&gt;    pass&lt;br /&gt;&lt;br /&gt;class ConnectorOptionError(ConnectorError):&lt;br /&gt;    &quot;&quot;&quot; Неверная опция при запуске в режиме командной строки &quot;&quot;&quot;&lt;br /&gt;    def __init__(self,value):&lt;br /&gt;        self.value = value.encode(u&quot;cp866&quot;)&lt;br /&gt;    def __str__(self):&lt;br /&gt;        return self.value&lt;br /&gt;&lt;br /&gt;class ConfigFileNotFound(ConnectorOptionError):&lt;br /&gt;    &quot;&quot;&quot; Не найден конфигурационный файл &quot;&quot;&quot;&lt;br /&gt;    pass&lt;br /&gt;&lt;br /&gt;class ConnectionError(ConnectorOptionError):&lt;br /&gt;    &quot;&quot;&quot; Ошибка соединения &quot;&quot;&quot;&lt;br /&gt;    pass&lt;br /&gt;&lt;br /&gt;class ObjectNotFound(ConnectorOptionError):&lt;br /&gt;    &quot;&quot;&quot; Запрашиваемый объект не найден &quot;&quot;&quot;&lt;br /&gt;    pass&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/4565123285764001976/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2012/09/com-1-82.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/4565123285764001976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/4565123285764001976'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2012/09/com-1-82.html' title='Взаимодействие с COM-интерфейсом 1С Предприятие 8.2'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-8532395225976202572</id><published>2012-09-30T16:11:00.001+06:00</published><updated>2012-09-30T16:11:23.503+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>Запуск только одной копии приложения</title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# coding: utf-8&lt;br /&gt;&lt;br /&gt;from win32event import CreateMutex&lt;br /&gt;from win32api import CloseHandle, GetLastError&lt;br /&gt;from winerror import ERROR_ALREADY_EXISTS&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class SingleInstance(object):&lt;br /&gt;    &quot;&quot;&quot; Проверка на запуск только одной копии программы &quot;&quot;&quot;&lt;br /&gt;    def __init__(self):&lt;br /&gt;        self.mutexname = u&quot;test_{D0E858DF-985E-4907-B7FB-8D732C3FC3B9}&quot;&lt;br /&gt;        self.mutex = CreateMutex(None, False, self.mutexname)&lt;br /&gt;        self.lasterror = GetLastError()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    def already_running(self):&lt;br /&gt;        return (self.lasterror == ERROR_ALREADY_EXISTS)&lt;br /&gt;&lt;br /&gt;    def __del__(self):&lt;br /&gt;        if self.mutex:&lt;br /&gt;            CloseHandle(self.mutex)&lt;br /&gt;#Подключаем &lt;br /&gt;# coding: utf-8&lt;br /&gt;from sys import exit&lt;br /&gt;from singleinstance import SingleInstance&lt;br /&gt;if __name__ == &quot;__main__&quot;:&lt;br /&gt;   instance = SingleInstance()&lt;br /&gt;   if instance.already_running():&lt;br /&gt;       exit(0)&lt;br /&gt;   else:&lt;br /&gt;        pass&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/8532395225976202572/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2012/09/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/8532395225976202572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/8532395225976202572'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2012/09/blog-post.html' title='Запуск только одной копии приложения'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-5952112235445234634</id><published>2012-09-16T03:19:00.001+06:00</published><updated>2012-09-16T03:20:30.463+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>Извлекаем информацию из PDF файлов</title><content type='html'>Иногда может потребоваться извлечь информацию из PDF файла. Основную ценность представляет, конечно же , текст и изображения. Так давайте посмотрим как их быстро извлечь.&lt;br /&gt;Перво-наперво, нам потребуется библиотека &lt;a href=&quot;http://www.unixuser.org/~euske/python/pdfminer/index.html&quot; rel=&quot;nofollow&quot;&gt;PDFMiner&lt;/a&gt;. Качаем и ставим как обычную питоновскую либу. Далее, несколько слов касательно формата PDF файла. Страница по версии библиотеки состоит из объектов данных и промежутков(отступов).&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-PJHQsvcK3co/UEzZjlAkkUI/AAAAAAAACBQ/-aLx2Z3zq_Y/s1600/layout.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;177&quot; src=&quot;http://3.bp.blogspot.com/-PJHQsvcK3co/UEzZjlAkkUI/AAAAAAAACBQ/-aLx2Z3zq_Y/s400/layout.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Для простого экстракта данных нам важно знать только об объектах данных страниц.&lt;br /&gt;Каждый объект имеет свои свойства. Поэтому зная тип объекта мы можем применять те или иные методы. К основным объектам следует отнести:&amp;nbsp; LTTextBox/LTTextLine - текст, LTFigure - составной элемент, LTImage - изображение (по базовым типам данных можно прочитать на сайте библиотеки).&lt;br /&gt;&lt;pre&gt;&lt;code&gt;# coding : utf-8&lt;br /&gt;from pdfminer.pdfparser import PDFParser, PDFDocument, PDFNoOutlines&lt;br /&gt;from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter&lt;br /&gt;from pdfminer.converter import PDFPageAggregator&lt;br /&gt;from pdfminer.layout import LAParams, LTTextBox, LTTextLine, LTFigure, LTImage&lt;br /&gt;from binascii import  b2a_hex&lt;br /&gt;&lt;br /&gt;def type_image(image):&lt;br /&gt;    &quot;&quot;&quot; Узнаем формат изображения по первым 4 байтам &quot;&quot;&quot;&lt;br /&gt;    file_type = None&lt;br /&gt;    bytes_as_hex = b2a_hex(image)&lt;br /&gt;    if bytes_as_hex.startswith(&#39;ffd8&#39;):&lt;br /&gt;        file_type = &#39;.jpeg&#39;&lt;br /&gt;    elif bytes_as_hex == &#39;89504e47&#39;:&lt;br /&gt;        file_type = &#39;.png&#39;&lt;br /&gt;    elif bytes_as_hex == &#39;47494638&#39;:&lt;br /&gt;        file_type = &#39;.gif&#39;&lt;br /&gt;    elif bytes_as_hex.startswith(&#39;424d&#39;):&lt;br /&gt;        file_type = &#39;.bmp&#39;&lt;br /&gt;    return file_type&lt;br /&gt;&lt;br /&gt;def parse_pages(doc):&lt;br /&gt;    &quot;&quot;&quot; Функция парсинга страниц &quot;&quot;&quot;&lt;br /&gt;    rsrcmgr = PDFResourceManager()&lt;br /&gt;    laparams = LAParams()&lt;br /&gt;    device = PDFPageAggregator(rsrcmgr, laparams=laparams)&lt;br /&gt;    interpreter = PDFPageInterpreter(rsrcmgr, device)&lt;br /&gt;&lt;br /&gt;    for page in doc.get_pages():&lt;br /&gt;        interpreter.process_page(page)&lt;br /&gt;        # получаем объект LTPage&lt;br /&gt;        layout = device.get_result()&lt;br /&gt;        # layout - объект контейнер который может содержать другие объекты LTTextBox, LTFigure, LTImage&lt;br /&gt;        yield layout&lt;br /&gt;&lt;br /&gt;class PdfMinerWrapper(object):&lt;br /&gt;    &quot;&quot;&quot; Контент менеджер &quot;&quot;&quot;&lt;br /&gt;    def __init__(self, pdf_doc, pdf_pwd=&#39;&#39;):&lt;br /&gt;        self.pdf_doc = pdf_doc&lt;br /&gt;        self.pdf_pwd = pdf_pwd&lt;br /&gt;&lt;br /&gt;    def __enter__(self):&lt;br /&gt;        # открываем пдф-файл&lt;br /&gt;        self.fp = open(self.pdf_doc, &#39;rb&#39;)&lt;br /&gt;        # создаем объект парсера&lt;br /&gt;        parser = PDFParser(self.fp)&lt;br /&gt;        # создаем объект пдф документа&lt;br /&gt;        doc = PDFDocument()&lt;br /&gt;        # подключение парсера к объекту документа&lt;br /&gt;        parser.set_document(doc)&lt;br /&gt;        doc.set_parser(parser)&lt;br /&gt;        # инициализация по паролю&lt;br /&gt;        doc.initialize(self.pdf_pwd)&lt;br /&gt;        return doc&lt;br /&gt;&lt;br /&gt;    def __exit__(self, type, value, traceback):&lt;br /&gt;        self.fp.close()&lt;br /&gt;&lt;br /&gt;def main():&lt;br /&gt;    with PdfMinerWrapper(&#39;part.pdf&#39;) as doc:&lt;br /&gt;        for page in parse_pages(doc):&lt;br /&gt;           for obj in page.__dict__[&#39;_objs&#39;]:&lt;br /&gt;               if isinstance(obj,LTFigure):&lt;br /&gt;                    # Если составной элемент&lt;br /&gt;                    for childobj in  obj.__dict__[&#39;_objs&#39;]:&lt;br /&gt;                        # Если изображение в составе&lt;br /&gt;                        if isinstance(childobj, LTImage):&lt;br /&gt;                            # filestream - данные изображения / typeimage - Тип изображения&lt;br /&gt;                            filestream = childobj.stream.get_rawdata()&lt;br /&gt;                            typeimage = type_image(filestream[0:4])&lt;br /&gt;               elif isinstance(obj, LTTextBox) or isinstance(obj, LTTextLine):&lt;br /&gt;               #Если текст&lt;br /&gt;                    print obj.get_text()&lt;br /&gt;&lt;br /&gt;if __name__ == &#39;__main__&#39;:&lt;br /&gt;    main()&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/5952112235445234634/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2012/09/pdf.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/5952112235445234634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/5952112235445234634'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2012/09/pdf.html' title='Извлекаем информацию из PDF файлов'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-PJHQsvcK3co/UEzZjlAkkUI/AAAAAAAACBQ/-aLx2Z3zq_Y/s72-c/layout.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-4333658527668219616</id><published>2012-08-12T18:58:00.001+06:00</published><updated>2012-08-12T23:17:35.971+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>Парсим XML от мала до велика</title><content type='html'>2 примера парсинга XML-файлов на Python. Я не очень люблю SAX-парсеры, хотя у них есть свое преимущество - скорость. Первый пример кода написан с использованием &lt;b&gt;xml.dom.minidom&lt;/b&gt;.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;# coding: utf-8&lt;br /&gt;import xml.dom.minidom&lt;br /&gt;doc = xml.dom.minidom.parse(File)&lt;br /&gt;   for item in doc.getElementsByTagName(u&quot;item&quot;):&lt;br /&gt;      title = item.getElementsByTagName(u&quot;title&quot;)&lt;br /&gt;      link = item.getElementsByTagName(u&quot;link&quot;)&lt;br /&gt;      self.ui.plainTextEdit_3.appendPlainText(QtCore.QString(&lt;br /&gt;                        &quot;{l}||{t}&quot;.format(&lt;br /&gt;                                            t = title[0].childNodes[0].data,&lt;br /&gt;                                            l= link[0].childNodes[0].data&lt;br /&gt;                                            ))&lt;br /&gt;                    )&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;Второй пример кода написан с использованием&lt;b&gt; &lt;a href=&quot;http://lxml.de/&quot; rel=&quot;nofollow&quot;&gt;lxml&lt;/a&gt;&lt;/b&gt;.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;# coding: utf-8&lt;br /&gt;import os&lt;br /&gt;from StringIO import StringIO&lt;br /&gt;from lxml import etree&lt;br /&gt;files = os.listdir(u&quot;source&quot;)&lt;br /&gt;for File in files:&lt;br /&gt;    with open(u&quot;source\%s&quot; % File) as src:&lt;br /&gt;        res = src.read()&lt;br /&gt;        context = etree.iterparse(StringIO(res), tag=u&quot;offer&quot;)&lt;br /&gt;        for action,elem in context:&lt;br /&gt;            id = elem.get(u&quot;id&quot;)&lt;br /&gt;            for child in  elem.getchildren():&lt;br /&gt;                if child.tag == u&#39;picture&#39;:&lt;br /&gt;                    picture = child.text&lt;br /&gt;                if child.tag == u&#39;title&#39;:&lt;br /&gt;                    name = child.text&lt;br /&gt;                if child.tag == u&#39;description&#39;:&lt;br /&gt;                    description = child.text&lt;br /&gt;            try:&lt;br /&gt;                with open(u&quot;files\%d.txt&quot; % int(id),&#39;w&#39;) as src:&lt;br /&gt;                    data = u&quot;#title#{title}#title#\n#content# \&lt;br /&gt;{content}#content#\n#picture#{picture}#picture#&quot;.format(&lt;br /&gt;                        title = name,&lt;br /&gt;                        content = description,&lt;br /&gt;                        picture = picture)&lt;br /&gt;                    src.write(data.encode(u&quot;utf-8&quot;))&lt;br /&gt;            except:&lt;br /&gt;                pass&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;Если вы собираетесь парсить файлы до 10 мб, то можно использовать DOM-парсеры, если файлы имеют больший размер, то лучше использовать последовательные парсеры и при этом не забывать еще очищать память elem.clear().</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/4333658527668219616/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2012/08/xml.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/4333658527668219616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/4333658527668219616'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2012/08/xml.html' title='Парсим XML от мала до велика'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-777254954310567785</id><published>2012-08-12T18:33:00.002+06:00</published><updated>2012-08-12T18:58:14.327+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="фарма"/><title type='text'>PharmCash под DOS-атакой</title><content type='html'>Уже больше 2 суток лежит фарма-партнерка PharmCash. Отказали в обслуживании все биллинги, лежат все паблик-шопы, накрылся как сам сайт партнерской программы, так и зеркало. Одна грусть в целом.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-iy_vTC2zXfQ/UCejG07hdUI/AAAAAAAACA0/8zKeK5yl4ec/s1600/2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;215&quot; src=&quot;http://1.bp.blogspot.com/-iy_vTC2zXfQ/UCejG07hdUI/AAAAAAAACA0/8zKeK5yl4ec/s320/2.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/777254954310567785/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2012/08/pharmcash-dos.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/777254954310567785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/777254954310567785'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2012/08/pharmcash-dos.html' title='PharmCash под DOS-атакой'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-iy_vTC2zXfQ/UCejG07hdUI/AAAAAAAACA0/8zKeK5yl4ec/s72-c/2.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-7825160246532239137</id><published>2012-08-04T01:02:00.001+06:00</published><updated>2012-08-04T01:16:07.348+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="софт"/><title type='text'>XseoN Project Generator</title><content type='html'>Небольшая программа для генерации контента для спама простынями.&lt;br /&gt;htt_://sites.google.com/site/markuslibs/files/XseoN%20Project%20Generator.zip</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/7825160246532239137/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2012/08/xseon-project-generator.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/7825160246532239137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/7825160246532239137'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2012/08/xseon-project-generator.html' title='XseoN Project Generator'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-2479931177045027703</id><published>2012-07-05T20:57:00.004+06:00</published><updated>2012-07-05T20:59:22.171+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="партнерская программа"/><category scheme="http://www.blogger.com/atom/ns#" term="фарма"/><title type='text'>OXONetwork закрывается</title><content type='html'>Не очень хорошая новость для партнеров. Со слов владельца:&lt;br /&gt;&lt;blockquote&gt;Хочу сообщить адвертам партнерки OXOnetwork, что мною было принято решение о ее закрытии. Уже официально. Чтобы не было глупых домыслов, считаю нужным объяснить причину.&lt;br /&gt;Главное: Партнерка закрывается не из-за финансовых проблем. Тут нечего говорить даже, проект достаточно прибыльный.&lt;br /&gt;OXOnetwork закрывается по причинам, связанным с дальнейшим ростом и более актуальными рынками для работы. Я не вижу развития и какой-либо перспективности на рынке фармы. Поэтому лучше уйти раньше, чем постоянно отвлекать силы на этот проект.&lt;br /&gt;Поступило множество вопросов от адвертов по поводу закрытия/выплат/переносов доменов/реордеров и т.д. Обо всем по порядку:&lt;br /&gt;&lt;br /&gt;1. Выплаты будут произведены в полном объеме, выплатим все балансы под 0. (всем, у кого не вбиты данные, будет сделана рассылка).&lt;br /&gt;2. Реордеры будут считаться до 1 августа. (+ будет сделан прозвон кастомеров, чтобы поток реордеров увеличить).&lt;br /&gt;3. Трафик и продажи будем считать только у тех людей, у которых были свои шопы, либо есть обстоятельства, при которых невозможно переключить трафик на другую ПП. (опять же до 1го августа).&lt;br /&gt;4. Перенос доменов. Естественно всем, кто регистрировал домены через нас, мы домены отдадим. Для переноса доменов нужно обратиться в саппорт, он подскажет, что нужно сделать.&lt;br /&gt;5. Перенос шопов к другим партнеркам. Мы постараемся помочь в этом вопросе, но скорее всего об этом проще будет попросить техническую команду партнерки, к которой вы захотите их перенести.&lt;br /&gt;&lt;br /&gt;Если у вас есть еще какие-то вопросы, то стучите в саппорт, все будем решать.&lt;br /&gt;Всем спасибо за работу.&lt;br /&gt;Удачи! :)&lt;br /&gt;&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/2479931177045027703/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2012/07/oxonetwork.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/2479931177045027703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/2479931177045027703'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2012/07/oxonetwork.html' title='OXONetwork закрывается'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-475354026297468531</id><published>2012-07-05T20:57:00.003+06:00</published><updated>2012-07-05T20:59:11.784+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="партнерская программа"/><category scheme="http://www.blogger.com/atom/ns#" term="фарма"/><title type='text'>У GlavMed проблемы с процессингом</title><content type='html'>Цитируем:&lt;br /&gt;&lt;blockquote&gt;Уважаемые Партнеры,&lt;br /&gt;&lt;br /&gt;Как вы могли заметить, последние пару дней у нас проблемы с процессингом. Решение вопроса &quot;подвисло&quot; в воздухе, и пока не ясны окончательные сроки его разрешения.&lt;br /&gt;&lt;br /&gt;Мы принципиально не хотим собирать &quot;вейтинги&quot; и по сути работать в батч. Мы так же не готовы рисковать вашими деньгами с малознакомыми и не очень серьезными посредниками. Поэтому с настоящего момента весь ГлавМед переходит в режим &quot;ПАУЗА&quot;. Никакие новые заказы обрабатываться не будут до момента решения вопроса с процессингом. Все уже запроцешенные заказы будут выполнены, как и следует.&lt;br /&gt;&lt;br /&gt;Убедительная просьба временно перевести свой трафик на другие шопы/проекты.&lt;br /&gt;&lt;br /&gt;Точных сроков выхода из этого режима я прямо сейчас назвать не могу. Обнадеживать, что все решится вот прямо в понедельник тоже не стану. Надеемся, что к середине июля будет больше ясности и конкретики.&lt;br /&gt;&lt;br /&gt;Прошу расценивать это объявление именно так, как оно написано. Мы не закрываемся, а притормаживаем текущую деятельность.&lt;br /&gt;&lt;br /&gt;Все доступные к выплате деньги можно заказывать на вывод. Возможно, что если все разом ломанутся выводить, могут возникнуть некоторые задержки, т.к. общая сумма достаточно велика, но в любом случае, мы выплатим все до копейки. За это можете не волноваться.&lt;br /&gt;&lt;br /&gt;Большая просьба: все вопросы/замечания/пожелания/слухи постить в этот топик. У меня нет возможности отслеживать все форумы и оперативно отвечать везде и всем.&lt;br /&gt;&lt;br /&gt;Саппорт будет работать в штатном режиме. Если по какой-то причине они не могут помочь, или дело совсем плохо и нужна незамедлительная психологическая помощь, то можно обращаться ко мне напрямую в этот джаббер: dontworry@behappy.com.ru&lt;br /&gt;&lt;br /&gt;Новость, конечно, неприятная, но не смертельная. Поэтому прошу не разводить панику, а обсуждать возникающие вопросы по существу. &lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/475354026297468531/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2012/07/glavmed.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/475354026297468531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/475354026297468531'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2012/07/glavmed.html' title='У GlavMed проблемы с процессингом'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-2683312442349008171</id><published>2012-06-26T01:23:00.000+06:00</published><updated>2012-06-26T01:23:23.599+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="zennoposter"/><title type='text'>ZennoPoster 4 Mental Power</title><content type='html'>Небольшой пост, который поможет вам поближе познакомится с такой чудесной вещью как ZennoPoster 4.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Основные возможности ZennoPoster Mental Power&lt;/b&gt;.&lt;br /&gt;IntelliSearch.&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-Ac2xzSlklog/T-iyDRQ5B6I/AAAAAAAACAE/z2fGOpB-8Mk/s1600/IntelliSearch.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;239&quot; src=&quot;http://1.bp.blogspot.com/-Ac2xzSlklog/T-iyDRQ5B6I/AAAAAAAACAE/z2fGOpB-8Mk/s320/IntelliSearch.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;Это новая фича, которая позволяет:&lt;br /&gt;- очень быстро создавать проект&lt;br /&gt;- писать один проект для большого кол-ва похожих и не очень сайтов.&lt;br /&gt;- повышает устойчивость выполнения проектов, заточенных под один сайт.&lt;br /&gt;По сути это система распознавания полей ввода, кнопок, ссылок и т.д. на сайте. Вы заходите на сайт и, проходя по элементам веб страницы, по очереди указываете к какому классу относится элемент - логин, пароль, кнопка отправки формы и т.д. Далее, заходя на новую веб страницу, система начинает узнавать часть элементов сама, часть вы дообучаете. Чем больше примеров было указано, тем точнее система распознает новые элементы. На самом деле система уже имеет обученную базу, так что она сразу начнет узнавать большинство элементов веб страницы, вам нужно будет только дообучить некоторые. В итоге - берете тысячу сайтов на похожем движке, обучаете на 10 из них, после этого система уже сможет зарегистрироваться на, допустим, 50-ти из 1000, на которых ее не обучали. Дообучаете на некоторых из тех сайтов, которые не пробились, общий пробив повышается и т.д. В итоге можно создать мультипроект, способный обработать тысячи ресурсов.&lt;br /&gt;IntelliSearch в проекте представлен в виде базы, ее можно добавлять в другой проект, дообучать и т.д. Есть установленные классы элементов, но можно добавлять свои.&lt;br /&gt;&lt;br /&gt;Firefox движок.&lt;br /&gt;Теперь ZennoPoster использует Firefox для эмуляции браузера. Благодаря этому:&lt;br /&gt;+ эмулируется все, что хоть как-то может спалить бота: как в заголовках, так и при запросе параметров из JS (объекты navigator, screen и т.д.)&lt;br /&gt;+ Полное управление DOM моделью&lt;br /&gt;+ возросла устойчивость выполнения проектов&lt;br /&gt;+ уменьшилась нагрузка на процессор&lt;br /&gt;+ в несколько раз уменьшилось потребление оперативной памяти на инстанс&lt;br /&gt;+ уменьшилось число полуоткрытых соединений, открываемых инстансом&lt;br /&gt;+ поддерживаются SOCKS 5&lt;br /&gt;+ очистка всех типов кук (более 10 видов)&lt;br /&gt;+ флаг занятости браузера теперь реагирует на AJAX запросы&lt;br /&gt;Короче, теперь есть полный доступ к любой фиче браузера и это использовано по максимуму&lt;br /&gt;&lt;br /&gt;Проксичекер.&lt;br /&gt;Если в двух словах - кладет сетевое оборудование&lt;br /&gt;Тестировали на сервере от hetzner.de, выжал 15000 потоков чека, больше не получилось, т.к. там нельзя больше сетевых соединений открыть.&lt;br /&gt;Может чекнуть миллион проксей за несколько минут, главное чтобы сетевое оборудование было хорошее.&lt;br /&gt;Сильно оптимизирован и при нормальной эксплуатации практически не потребляет память и процессорное время.&lt;br /&gt;Переделана база проксей, теперь она хорошо обрабатывает огромные списки проксей и быстро подгружается при открытии программы.&lt;br /&gt;Проксичекер оснащен тестером сети, можно один раз сделать тест, он сам определит максимум потоков, которые можно запустить на вашей системе.&lt;br /&gt;Чекает на все параметры, которые могут понадобиться.&lt;br /&gt;&lt;br /&gt;Визуальный редактор.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-tkiVfzO7WMs/T-izADCd72I/AAAAAAAACAI/a9S_A3pWtEs/s1600/editor.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;255&quot; src=&quot;http://2.bp.blogspot.com/-tkiVfzO7WMs/T-izADCd72I/AAAAAAAACAI/a9S_A3pWtEs/s320/editor.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Теперь:&lt;br /&gt;+ поддерживает большие и очень большие проекты&lt;br /&gt;+ миникарта&lt;br /&gt;+ удобные формы редактирования параметров прямо в редакторе, отдельные для каждого типа экшенов&lt;br /&gt;+ можно дописать проект, находящийся в редакторе.&lt;br /&gt;И т.д. и т.п...&lt;br /&gt;&lt;br /&gt;Новый интерфейс постера.&lt;br /&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-tr0Tl8IocNg/T-i1bsF8hII/AAAAAAAACAY/Jj0ySGh0G4k/s1600/zennoposter.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;217&quot; src=&quot;http://2.bp.blogspot.com/-tr0Tl8IocNg/T-i1bsF8hII/AAAAAAAACAY/Jj0ySGh0G4k/s320/zennoposter.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Выполнен в лучших традициях торрент клиентов&lt;br /&gt;+ можно убрать окна инстансов&lt;br /&gt;+ проект добавляется только один раз и не удаляется при перезапуске программы&lt;br /&gt;+ категории проектов для быстрой ориентации&lt;br /&gt;+ группирование проектов&lt;br /&gt;+ новый шедулер&lt;br /&gt;&lt;br /&gt;Эмуляция клавиатуры и мыши.&lt;br /&gt;Многие интересные сайты теперь защищаются от ботов, отслеживая, нажимаются ли клавиши при заполнении полей ввода. Эмуляция мыши и клавиатуры поможет обойти эту защиту.&lt;br /&gt;Во-первых, есть встроенная эмуляция, которая работает по дефолту при выполнении проекта, т.е. поля заполняются с помощью эмуляции клавиатуры, кнопки и ссылки кликаются эмуляцией мыши.&lt;br /&gt;Во-вторых можно просто посылать на страницу нужные команды клавиатуры и клики кнопками мыши в указанные координаты.&lt;br /&gt;Еще есть эмуляция мыши с использованием поиска по скриншоту, об этом дальше.&lt;br /&gt;&lt;br /&gt;Клик по картинке.&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-Fl02aGOnD5M/T-iz2qJmQVI/AAAAAAAACAQ/7_cRxyn1ON4/s1600/find_images.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;216&quot; src=&quot;http://1.bp.blogspot.com/-Fl02aGOnD5M/T-iz2qJmQVI/AAAAAAAACAQ/7_cRxyn1ON4/s320/find_images.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;Бывает нужно кликнуть по элементу, который не предназначен для клика, например сейчас в гугле используется div как select элемент при регистрации, или нужно кликнуть по флешке в определенное место, например нажать play у видео ютуба и т.д.&lt;br /&gt;Еще у текстовых редакторов (в таком я сейчас пишу этот текст ) иногда нужно кликнуть на одну из его кнопок в панели инструментов. Все это поможет сделать новая фича &quot;клик по картинке&quot;. Вызывается она из меню пкм на html странице при записи проекта. Указываете какую часть скриншота искать и куда относительно него кликать. Т.е. можно искать не сам элемент, на который нужно кликнуть, а область страницы рядом с ним, и уже относительно этой области кликать в нужное место.&lt;br /&gt;Фича сильно оптимизирована и жрет не очень много проца.&lt;br /&gt;&lt;br /&gt;Статические блоки.&lt;br /&gt;У проекта теперь есть статические блоки - это настройки браузера, профиль, настройки эмуляции, таблицы, списки и т.д.&lt;br /&gt;Эти настройки для удобства управления проектом. Отображаются внизу редактора проекта в отдельной форме.&lt;br /&gt;Также отображаются и настраиваются при записи проекта внизу дерева проекта.&lt;br /&gt;&lt;br /&gt;Вход, хороший и плохой выходы из проекта.&lt;br /&gt;Проект начинает выполняться с места, указанного специальным элементом &quot;вход&quot;, в редакторе он представлен серым кругом. Проект может завершиться с ошибкой или без, поэтому есть еще два выхода - &quot;хороший&quot; и &quot;плохой&quot; после выполнения прокта управление передается на один из них и можно сделать какие-то небольшие финальные действия в зависимости от успешности завершения проекта.&lt;br /&gt;&lt;br /&gt;Новые типы данных в проекте.&lt;br /&gt;Таблица и список - созданы для удобства работы с данными, особенно с файлами, которые часто надо представлять в виде списков и таблиц. Управляются из статических блоков и обычными экшенами.&lt;br /&gt;Например, можно сразу спарсить все ссылки со страницы в список, отсортировать, удалить дубли и сохранить в файл.&lt;br /&gt;При работе с таблицами поддерживаются таблицы xls, slsx, odt, csv. Поддерживается как чтение, так и запись.&lt;br /&gt;Переменные - чтобы не заморачиваться с макрос-ссылками теперь есть переменные (а макрос ссылок больше нет). В переменные кладутся результаты каких-то действий, для доступа к значению переменной, записывается макрос этой переменной.&lt;br /&gt;&lt;br /&gt;Шифрование проектов.&lt;br /&gt;Теперь можно зашифровать свой проект и раздавать другим пользователям права таких типов: выполнение, чтение, запись, полный доступ.&lt;br /&gt;Права раздаются по e-mail на который зарегистрирован ZennoPoster&lt;br /&gt;Управление правами происходит из статического блока, добавляемого в проект перетаскиванием из панели инструментов в редакторе.&lt;br /&gt;&lt;br /&gt;Обработка почты.&lt;br /&gt;+ поддерживает IMAP протокол&lt;br /&gt;+ появилась возможность работать без удаление писем с сервера&lt;br /&gt;Теперь вам в большинстве случаев не нужно составлять никаких регулярных выражений.&lt;br /&gt;Указываете email и пароль, настройки подключения определяются автоматически, скачиваете письма и выбираете по каким признакам искать письмо, если признаки указаны правильно, нужное письмо в списке писем подсветится зеленым. Если по этому признаку находится более одного письма, письма подсветятся красным. Далее выбираете из таблицы, какие данные вам нужны из письма (выбираете чекбоксы в строках с нужным текстов), указываете в какие переменные складывать найденный текст.&lt;br /&gt;&lt;br /&gt;Профиль.&lt;br /&gt;Для удобства генерации данных для заполнения форм создан профиль. Генерирует данные человека (русского или американца) с правильным статистическим распределением и учетом географии. Например если будет сгенерирован человек из Рязани, его имя, скорее всего будет что-то типа Петр Иванов, а если из Казани, то какой-нибудь Альберт Нургалиев.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Макросы.&lt;br /&gt;Макросы теперь только только статичные. Все макросы, глобальные переменные, локальные переменные можно найти в таблице&lt;br /&gt;&lt;br /&gt;FTP, SFTP, FTPS&lt;br /&gt;FTP такой FTP. Ничего особенного, обычный FTP&lt;br /&gt;+ управление файлами&lt;br /&gt;+ управление каталогами&lt;br /&gt;&lt;br /&gt;Конструктор регулярных выражений.&lt;br /&gt;Теперь:&lt;br /&gt;+ подсветка синтаксиса&lt;br /&gt;+ поиск по Ctrl+F&lt;br /&gt;Вызывается теперь из формы подтверждения по e-mail и с помощью кнопки на панели редактора шаблонов.&lt;br /&gt;&lt;br /&gt;Логика&lt;br /&gt;+ добавлен switch, т.е. выбор из нескольких вариантов&lt;br /&gt;&lt;br /&gt;CodeCreator.&lt;br /&gt;Пока не доделан, скоро выйдет и к нему добавится новая фича в проекте.&lt;br /&gt;Там ничего кардинально не поменяется, просто перенесем его на Framework 4&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Видео по работе с ZennoPoster 4&lt;/b&gt;. &lt;br /&gt;&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/Ej9rMOxV0B0?fs=1&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/7STxdJQvh2w&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/VhCoWj6MRhU&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Пример скрипта для ZennoPoster MP.&lt;/b&gt;&lt;br /&gt;Скрипт автоматизации Wordpress для ZennoPoster 4.&lt;br /&gt;https://sites.google.com/site/markuslibs/files/wordpress.rar&lt;br /&gt;&lt;br /&gt;Увы, демо 4 версии пока не доступно для скачивания. Но можно получить доступ к бета версии, купив лицензию.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://www.zennolab.com/ru/products/zennoposter/pid/e08935ae-ae7c-4b82-a083-a2c9ab9f6662&quot; rel=&quot;nofollow&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-xEUcnyMIa6s/T-i5OY21yUI/AAAAAAAACAk/t_Avbex99fw/s1600/buy.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/2683312442349008171/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2012/06/zennoposter-4-mental-power.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/2683312442349008171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/2683312442349008171'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2012/06/zennoposter-4-mental-power.html' title='ZennoPoster 4 Mental Power'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Ac2xzSlklog/T-iyDRQ5B6I/AAAAAAAACAE/z2fGOpB-8Mk/s72-c/IntelliSearch.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-7275432091338751605</id><published>2012-05-27T11:36:00.002+06:00</published><updated>2012-05-27T11:37:50.079+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="wordpress"/><category scheme="http://www.blogger.com/atom/ns#" term="софт"/><title type='text'>Wordpress Link Extractor</title><content type='html'>Когда-то давно на одном форуме было обсуждение на тему &quot;Как и чем собрать ссылки на посты в движке Wordpress&quot;. Тогда был предложен плагин. Я, напротив, предлагаю программу для этого дела.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-sVLPlGdKU9w/T8Ee-iJaeyI/AAAAAAAAB_o/XHvH7IkonZ4/s1600/wpe_tab1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;269&quot; src=&quot;http://3.bp.blogspot.com/-sVLPlGdKU9w/T8Ee-iJaeyI/AAAAAAAAB_o/XHvH7IkonZ4/s320/wpe_tab1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-th2Em14lRKI/T8EfAVfPXxI/AAAAAAAAB_w/x64mGNP9Trg/s1600/wpe_tab2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;269&quot; src=&quot;http://4.bp.blogspot.com/-th2Em14lRKI/T8EfAVfPXxI/AAAAAAAAB_w/x64mGNP9Trg/s320/wpe_tab2.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Возможности:&lt;/b&gt;&lt;br /&gt;[+] Создание списка&lt;b&gt; &lt;/b&gt;вида ссылка||анкор из файлов экспорта Wordpress (xml).&lt;br /&gt;[+] Настраиваемая система нахождения ссылок (XPath/CSS).&lt;br /&gt;[+] Асинхронная загрузка данных.&lt;br /&gt;[+] Функциональный импорт (в продукты MS только при наличии установленных программ).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Пример настройки:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;Сайт: http://aroundufa.ru/&lt;br /&gt;Строка поиска по XPath: //h2[@class=&quot;title&quot;]/a&lt;br /&gt;Строка поиска по CSS: .title&amp;gt;a&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Скачать: &lt;/b&gt; sites.google.com/site/markuslibs/files/Wordpress%20Link%20Extractor.rar</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/7275432091338751605/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2012/05/wordpress-link-extractor.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/7275432091338751605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/7275432091338751605'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2012/05/wordpress-link-extractor.html' title='Wordpress Link Extractor'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-sVLPlGdKU9w/T8Ee-iJaeyI/AAAAAAAAB_o/XHvH7IkonZ4/s72-c/wpe_tab1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-3165689491978203057</id><published>2012-05-22T21:30:00.000+06:00</published><updated>2012-05-22T21:30:07.395+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><title type='text'>Оптимизация VPS под управлением CentOS</title><content type='html'>Потратив 5 минут на оптимизацию сервера вы увеличите скорость работы более чем в 2 раза. Перед нами стандартный набор веб-сервера: Apache, PHP, MySQL. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Оптимизация Apache&lt;/b&gt;.&lt;br /&gt;Открываем конфиг апача.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;nano /etc/httpd/conf/httpd.conf&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Далее меняем значение параметров MaxClients в секциях worker MPM и prefork MPM. Устанавливаем значение в промежутке 20-30. Сохраняем. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Оптимизация MySQL.&lt;/b&gt;&lt;br /&gt;По умолчанию конфиг MySQL имеет следующее расположение. Его то мы и будем редактировать.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;nano /etc/my.cnf&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Для начала нам необходимо скачать скрипт для тестирования СУБД.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;wget https://github.com/rackerhacker/MySQLTuner-perl/tarball/master --no-check-certificate&lt;br /&gt;tar xf master&lt;br /&gt;cd rackerhacker-MySQLTuner-perl-71f14ea&lt;br /&gt;chmod +x mysqltuner.pl&lt;br /&gt;./mysqltuner.pl&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;После запуска вводим логин и пароль MySQL. Далее выполняем все рекомендации, которые предоставил нам скрипт.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Оптимизация сервисов.&lt;/b&gt;&lt;br /&gt;Добавляем ulimit -s 1024 сверху в файлах сервисов rc, httpd, mysqld.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;nano /etc/init.d/httpd&lt;br /&gt;nano /etc/init.d/mysqld&lt;br /&gt;nano /etc/rc&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;После всех махинаций перезагружаем сервисы.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;service httpd restart &amp;&amp; service mysqld restart&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;На этом шаге оптимизация нашего сервера закончена. Удачи!</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/3165689491978203057/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2012/05/vps-centos.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/3165689491978203057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/3165689491978203057'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2012/05/vps-centos.html' title='Оптимизация VPS под управлением CentOS'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-530663802063246503</id><published>2012-05-22T21:29:00.005+06:00</published><updated>2012-05-27T11:51:04.677+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="1С Предприятие"/><category scheme="http://www.blogger.com/atom/ns#" term="программирование"/><title type='text'>Обмен данными между 1С Предприятие и SQL Server при выполнении регламентых заданий</title><content type='html'>Для начала позволю себе небольшое отступление от темы. При создании регламентых заданий возникает довольно много ошибок, которые вы сможете избежать прочитав это предисловие.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1С Предприятие. Регламентные задания. &lt;/b&gt;&lt;br /&gt;Создаются регламентые задания в конфигурации, элемент списка так и называется &quot;Регламентые задания&quot;. После добавления задания следует выбрать процедуру, обычно это процедура из общего модуля (в свойствах модуля должно стоять возможность выполнения на сервере: общий модуль-правка-свойства-сервер-установить флажок). Далее вы настраиваете планировщик, те когда будут выполняться задания. Ресурсоемкие задания обычно выполняются либо ночью, либо после ухода работников, а затратные по времени - в выходные дни.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1С Предприятие. Видимость объектов.&lt;/b&gt;&lt;br /&gt;Чтобы сразу избежать неутыков, запомните, что все интерактивные действия (работа с элементами формы) и некоторые функции на сервере не выполняются. Это объясняется тем, что модуль формы недоступен на сервере (в отличии от работы на клиенте), так что пользуйтесь модулем объекта.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1С Предприятие. SQL Server. Выбор и работа с провайдерами данных.&lt;/b&gt;&lt;br /&gt;Есть одна интересная особенность при взаимодействии SQL Server и  1С Предпритие, которую удалось мне получить в ходе работы. Заключается она в методах подключения к серверу SQL (на клиенте/на сервере), а так же колоссальном различии выполнения пакетных запросов.&lt;br /&gt;Предположим, что на клиенте вы используете такой метод подключения&lt;br /&gt;&lt;pre&gt;&lt;code&gt;СтрокаСоединения = (&quot;DRIVER={SQL SERVER};DSN=источник данных;&lt;br /&gt;                           UID=пользователь;PWD=пароль;SERVER=сервер&quot;);&lt;/code&gt;&lt;/pre&gt;Тогда на сервере должен быть такой&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;СтрокаСоединения = (&quot;Provider=SQLOLEDB;Data Source=сервер;&lt;br /&gt;                    Initial Catalog=база данных;UID=пользователь;PWD=пароль;&quot;);&lt;/code&gt;&lt;/pre&gt;При этом первый метод хорошо работает с пакетными запросами, а второй плохо. Не знаю правда в силу чего. Решение нашел только одно: разделить пакетный запрос на несколько запросов. &lt;br /&gt;&lt;br /&gt;Вот такие пряники! Удачи!</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/530663802063246503/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2012/05/1-sql-server.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/530663802063246503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/530663802063246503'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2012/05/1-sql-server.html' title='Обмен данными между 1С Предприятие и SQL Server при выполнении регламентых заданий'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-2847105914093734142</id><published>2012-05-20T15:22:00.001+06:00</published><updated>2012-05-20T15:27:14.735+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mssql"/><category scheme="http://www.blogger.com/atom/ns#" term="sql"/><category scheme="http://www.blogger.com/atom/ns#" term="sql server"/><category scheme="http://www.blogger.com/atom/ns#" term="программирование"/><title type='text'>Расширяем SQL Server Management Studio</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-m_9JjWTQlH4/T7i1VevLbPI/AAAAAAAAB_c/opIzS--QIGw/s1600/smstools.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;204&quot; src=&quot;http://2.bp.blogspot.com/-m_9JjWTQlH4/T7i1VevLbPI/AAAAAAAAB_c/opIzS--QIGw/s320/smstools.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;http://www.ssmstoolspack.com/&quot; rel=&quot;nofollow&quot;&gt;SSMSTools&lt;/a&gt; - очень хорошее расширение SQL Server Management Studio. Позволяет вести историю запросов, создавать структуру таблиц, анализировать &quot;стоимость&quot; выполнения запросов, создавать шаблоны запросов, создавать INSERTы таблиц. Последнее бывает полезным, если нет прав на дамп стандартными средствами. Если вы часто используете SQL Server, то рекомендую.</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/2847105914093734142/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2012/05/sql-server-management-studio.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/2847105914093734142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/2847105914093734142'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2012/05/sql-server-management-studio.html' title='Расширяем SQL Server Management Studio'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-m_9JjWTQlH4/T7i1VevLbPI/AAAAAAAAB_c/opIzS--QIGw/s72-c/smstools.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-8573726231510521368</id><published>2012-05-20T14:37:00.003+06:00</published><updated>2012-05-20T15:22:28.448+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="дорвеи"/><category scheme="http://www.blogger.com/atom/ns#" term="поисковая оптимизация"/><title type='text'>Дорвеи. Топы есть - будет, что поесть</title><content type='html'>В последнее время я практически перестал посещать разделы известных форумов посвященным дорвеям. Так сказать, чтобы лишний раз не убеждать себя в ленивости и глупости нынешних любителей поделать доры, а также невежестве барыг продающих для первых свои курсы. Поэтому могу лишь судить о состоянии дел по собственному опыту и полученным результатам.&lt;br /&gt;&lt;b&gt;Где делать дорвеи.&lt;/b&gt;&lt;br /&gt;Живы ли доры в настоящее время? Ответ однозначно да! Вы можете делать их на блогплатформах, фришках, ломах, дропах. И все они будут исправно приносить траф, вопрос только в количестве трафика и долгоживучести самого дорвея. Заметьте, что среди списка ресов нет обычных доменов. Чтобы вы поняли речь щас идет о тру дорвеях, а не о подобии СДЛ. Честно говоря, трудоры очень прихотливо ведут себя на свежерегах, поэтому надо 10 раз подумать прежде чем делать. Замечу, что тут разговор идет о сразу 2 системах - Яндексе и Гугле (мы берем золотую середину).&lt;br /&gt;&lt;b&gt;ТруДорвеи или копипаст или рерайт.&lt;/b&gt;&lt;br /&gt;Парсенные сайты живут довольно неплохо в Яше: 50000 страниц, 4к&amp;nbsp; - Yandex, 34к - Google, и самое интересное, что количество растет. &lt;br /&gt;&lt;b&gt;Ключи для дорвеев. &lt;/b&gt;&lt;br /&gt;Для дорвеев используются низкочастотные ключи, отфильтрованные по частности Вордстата и конкуренции, например, в Google. &lt;br /&gt;&lt;b&gt;Вгон в поисковые системы.&lt;/b&gt;&lt;br /&gt;Использую комлексные методы вгона. И в целом, постарайте не зацикливаться на одной теме. Это может быть твиттер, простановка комментариев на blogs.yandex.ru или же PR-стых страницах, ref-спам, простановка ссылок с морд сайтов/ломов, покупка ссылок и статей.&lt;br /&gt;&lt;b&gt;Технология спама.&lt;/b&gt;&lt;br /&gt;Спамим как и раньше, профили/посты. Санкций, как таковых для сайтов нету. Бывает только либо недоспам, это когда доры туговато входят, либо переспам - дор попадает под фильтр, возможно частичное выпадение страниц из индекса, но потом все снова возвращается на нормальное состояние. Бытует мнение, что с введением новых алгоритмов количество ссылок с прямым вхождением надо чуть ли не до 30% уменьшать. Экспериментируйте, потом мне расскажете :)</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/8573726231510521368/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2012/05/blog-post_20.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/8573726231510521368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/8573726231510521368'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2012/05/blog-post_20.html' title='Дорвеи. Топы есть - будет, что поесть'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-6905978161724304461</id><published>2012-05-20T13:49:00.000+06:00</published><updated>2012-05-20T13:49:36.081+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="программирование"/><title type='text'>Программирование для непрограммистов</title><content type='html'>Случайно наткнулся на одну интересную программу, которая позволяет создавать программы без знания языков программирования: весь процесс разработки заключается в размещении объектов на форме и последующей визуальной привязки событий и обработчиков. Также данный софт позволяет экспортировать проект в VB.NET для последующей доработки. &lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-7j9Y0i-jZtc/T7ifo90mXuI/AAAAAAAAB_Q/YL5eRK2JSvQ/s1600/algoritm.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;231&quot; src=&quot;http://2.bp.blogspot.com/-7j9Y0i-jZtc/T7ifo90mXuI/AAAAAAAAB_Q/YL5eRK2JSvQ/s320/algoritm.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://algoritm2.ru/?page=Markus&quot; rel=&quot;nofollow&quot;&gt;Алгоритм 2&lt;/a&gt; позволяет отправлять GET/POST-запросы, работает с медийным контентом, быстро создает клиент-серверные приложения, есть возможность поиска в тексте по регулярному выражению и многое другое. В этом году планируется выход Алгоритм 3, где как я понял будет много интересных вещей для работы с Web, новый дизайн и не только.&lt;br /&gt;Расписывать примеры программ я не буду,&amp;nbsp; так как после установки в папке Алгоритма лежат примеры сложных и простых проектов. Посмотрев и потрогав, думаю вы сами  решите надо оно вам или нет.</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/6905978161724304461/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2012/05/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/6905978161724304461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/6905978161724304461'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2012/05/blog-post.html' title='Программирование для непрограммистов'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-7j9Y0i-jZtc/T7ifo90mXuI/AAAAAAAAB_Q/YL5eRK2JSvQ/s72-c/algoritm.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248349143113517513.post-3863275401765958312</id><published>2012-05-19T23:44:00.001+06:00</published><updated>2012-05-20T01:18:19.774+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="pywin32"/><category scheme="http://www.blogger.com/atom/ns#" term="программирование"/><title type='text'>Python и COM-интерфейсы</title><content type='html'>Существуют достаточно сложные задачи, которые стандартными библиотеками решить нелегко. Поэтому, если не брать в расчет рекомендации &quot;чистого питонического мышления&quot;, то сгодятся библиотеки адаптированные с других языков. В данном посте пойдет речь о &lt;b&gt;библиотеке &lt;/b&gt;по работе с &lt;b&gt;COM-интерфейсами PyWin32&lt;/b&gt; и на примере двух, пожалуй, самых востребованных вещей при формировании отчетности покажу как вывести данные в Excel и Word.&lt;br /&gt;Давайте напишем что-нибудь в ворде :).&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;import win32com.client&lt;br /&gt;&lt;br /&gt;wordapp = win32com.client.Dispatch(&quot;Word.Application&quot;) # Создадим Word-объект&lt;br /&gt;wordapp.Visible = 1 # Установим видимость программы&lt;br /&gt;worddoc = wordapp.Documents.Add() # Создадим документ&lt;br /&gt;worddoc.PageSetup.Orientation = 1 # Небольшие настройки документа&lt;br /&gt;worddoc.PageSetup.LeftMargin = 20&lt;br /&gt;worddoc.PageSetup.TopMargin = 20&lt;br /&gt;worddoc.PageSetup.BottomMargin = 20&lt;br /&gt;worddoc.PageSetup.RightMargin = 20&lt;br /&gt;worddoc.Content.Font.Size = 11&lt;br /&gt;worddoc.Content.Paragraphs.TabStops.Add (100)&lt;br /&gt;worddoc.Content.Text = u&quot;Привет вам от меня)&quot;&lt;br /&gt;worddoc.Content.MoveEnd&lt;br /&gt;worddoc.Close() # Закрываем. Сразу же появится диалоговое окно сохранения файла&lt;br /&gt;wordapp.Quit() # Выход&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Теперь попробуем вывести данные в Excel (не стоит забывать о возможностях xlrd,xlwt).&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;import win32com.client&lt;br /&gt;&lt;br /&gt;Obj = win32com.client.Dispatch(&quot;Excel.Application&quot;) # Cоздаем объект&lt;br /&gt;Obj.Visible = 1&lt;br /&gt;Obj.Workbooks.Add() # Добавляем книгу&lt;br /&gt;Obj.Cells(1,2).Value = u&quot;Меня зовут Маркус&quot;&lt;br /&gt;Obj.Save() # Сохраняем&lt;br /&gt;Obj.Quit() # Выходим&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;P.S. не стоит забывать о том, что нумерация идет также как и в Excel при включенном стиле R1C1.&lt;br /&gt;&lt;br /&gt;А теперь немного слов о том, как работать с другими объектами. Во-первых, к любому хорошему приложению есть документация, где в подробностях пусть и на других языках описаны объекты и их методы. Во-вторых, библиотека PyWin32 снабжена ком-обозревателем(COM-Browser), который позволяет просмотреть существующие ком-интерфейсы.</content><link rel='replies' type='application/atom+xml' href='http://imarkus.blogspot.com/feeds/3863275401765958312/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://imarkus.blogspot.com/2012/05/python-com.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/3863275401765958312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248349143113517513/posts/default/3863275401765958312'/><link rel='alternate' type='text/html' href='http://imarkus.blogspot.com/2012/05/python-com.html' title='Python и COM-интерфейсы'/><author><name>markus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>