Search
Write a publication
Pull to refresh
46
0
Артём Курапов @tot_ra

Пользователь

Send message

Apple в UTF

Reading time1 min
Views610


Этот логотип Apple виден только в Firefox. Вопрос в том, сколько стоит внести свой логотип в unicode? Места то ещё на 60 тыс знаков хватит… Логотип под номером 10080 входит в группу «Linear B Ideograms», и изображаться должен совершенно по другому.

Возможно Apple-софт вручную прописывает этот символ в шрифты — отпишитесь если видите. Т.е. по крайней мере у меня картина такая:

jQuery для продолжающих (с плагинами)

Reading time3 min
Views1.9K
jQuery — библиотека о которой в последнее время говорит практически каждый web-разработчик, верстальщик и дизайнер. Написанная с учётом CSS, она упрощает доступ к одному или нескольким DOM-элементам. Если вы ещё используете prototype, то можно использовать режим совместимости (правда не факт что у вас будут работать плагины). Стандартно доступ происходит благодаря функции $ или JQuery. Элементу можно добавить (.addClass) или отнять (.removeClass) CSS-класс. Если это input-элемент, то запись и чтение происходит в аттрибуты элемента (.attr). Внутренние элементы можно задать как через (.html).
Кроме минимализма, ускоренности и CSS-селекторов библиотека мало чем по функциональности отличается от prototype, mootools. Она не расширяет родные JS-объекты, как это делает protype и существует в своём пространстве переменных, поэтому не конфликтует с другими библиотеками.

Читать дальше →

Введение в SVG и пример — pie chart

Reading time6 min
Views6.8K
SVG (scalable vector graphics) это векторный формат графики подобно EPS, анимации и интерактива с пользователем, разрабатываемый в W3C. Внутри файл не бинарный а обычный XML, описывающий объекты, их эффекты и поведение. Векторная графика в общем нужна при изменении размера изображения без потери качества, например в полиграфии. В web я это вижу в резиновых сайтах, где размеры блоков установлены в %, размер шрифтов в em, а лого — в SVG. Пересели на более хороший монитор — всё изменилось пропорционально. Практические примеры — иконки, графики, карты, логотипы, интерфейсы. Ниже я привожу пример такого Pie-chart'а.


Интеграция

HTML — Inline
Поскольку SVG по сути XML, то его можно сразу inline-стилем описывать в XHTML-структуре. Однако как я уже убедился, XHTML1.1 doctype подразумевает что MIME документа уже не text-plain. А «ослик» IE6 не понимает XHTML в принципе, с другой стороны Firefox использует два парсера, и если MIME не application/xhtml+xml, то inline SVG не будет распознан. Это палка с двумя концами — IE и FF.
/>
Второй способ и наиболее практичный — ссылаться на существующий файл через object-тэг. Для
уменьшения траффика, файл можно сжать и получить SVGZ архив.
CSS и Javascipt
Как вы увидите ниже — поскольку SVG очень тесно связан с HTML/XML, то естественно что на графические объекты можно не только описывать при помощи CSS, но и писать Javascript-функции на всевозможные onclick и тп. event'ы (отсюда и интерактивность). />
Конвертирование и редакторы
Конвертировать SVG можно и в png/jpeg, но для этого фактически надо проделать работу обработчика. В PHP этим занимается PEAR XML_svg2image библиотека. Ещё есть сервис по конвертированию растрового изображения в векторный (правда там EPS). Из редакторов — есть Inkscape и Adobe Illustrator, Corel Draw.

Графика

Примитивы

Всякое рисование начинается с определения пространства (двумерного), разделения на координаты (в единицах с плавающей точкой или процентах) и введения примитивных конструкций:
  • line — прямая линия. x1, y1, x2, y2 — координаты
  • polyline — ломанная линия. points — перечисление координат точек
  • rect — прямоугольник. x,y, width, height, rx, ry — верхний левый угол, размеры, радиусы углов
  • polygone — многоугольник. Похож на polyline. points — координаты точек
  • circle — круг. cx, cy, r — координаты центра и радиус
  • ellipse. cx, cy, rx, ry — координаты центра и радиусы
  • text — текстовая надпись. Очень неудобная, потому что без переноса строк и с абсолютным позиционированием. x,y, font-family, font-size
  • tspan — может описывать слова внутри text-элемента. Например сдвигать или раскрашивать
  • tref — повторное использование text-элемента с указанным id
    Простой текст
    <tref xlink:href="#myText" x="50" y="50">
textPath — текст на path-кривой, связанный по id/>
<textPath xlink:href="#myPath" startOffset="50%">Водка Vinogradoff
image — растровое изображение
<image image-rendering="optimizeSpeed" xlink:href"background.jpg" width="100%" height="100%" preserveAspectRatio="xMidYMid slice" filter="url(#blurpane)"/>
Параметры и стили
Как и в html, одни линии мало кому нужны — их надо закрашивать, указывать цвета, и всё это делается параметрами
  • fill, fill-rule — заливка. Например «none»,blue, indigo.
  • stroke, stroke-linecap, stroke-linejoin, stroke-dasharray, stroke-dashoffset, stroke-width — граница, аналог border. Вместе stroke-width.
  • font-family, font-size, font-style, font-weight — шрифты для text-элементов
  • text-anchor
Для заливки используются тэги:
  • pattern
  • linearGradient
  • radialGradient
Эти параметры можно все объединить в один аналог CSS и записать в inline-стиле:
style="stroke-width:1; stroke:blue; fill:none"
Группы и кривые Безье
Элементы можно и нужно группировать друг в друга. Кроме того что tspan устанавливаетсявнутрь text-элемента, группирование происходи благодаря элементу.Кривые Безье это плавные переходные линии, задающиеся по точкам. В SVG для этого существует элемент path, у которого подобно ломанной линии указываются координаты. Рядом с координатами могут стоять буквы, обозначающие свойства линии. Большие буквы говорят об абсолютном позиционировании, маленькие об относительном
  • M — начало кривой (x,y)
  • Z — конец кривой (без координат)
  • L -прямая линия (x,y)
  • H — горизонтальная линия
  • V — вертикальная линия
  • Q — квадратичная кривая по одной точке
  • T — продолжение кривой с отражением предыдущей точки — упрощает рисование повторяющихся ритмов
  • С — собственно кривая Безье третьего порядка по двум точкам
  • S — упрощённая версия C
  • A — эллиптическая кривая (радиусы, поворот)

Трансформации и возможности

Объекты в SVG пожно искажать, крутить и перемещать при помощи фильтров, которые указываются в качестве параметров:
  • translate — перенос объекта
  • rotate -вращение
  • scale — масштабирование
  • scewX, scewY — искажение
  • matrix — смешанная трансформация
SVG поддерживает фильтры с эффектами освещения. А кроме статичных изображени есть возможность, анимации и интерактивности с пользователем. Например тетрис или нашумевший Microsoft Table и Silverlight реализован программно в SVG, причём при большом желании — заработало и видео (формата Ogg Theora=SVGT). Конечно последние возможности ещё не реализованы во всех браузерах, но первооткрыватели типа Opera имеются.


Тортовый график на SVG и PHP/DB

Несомненно Google API — очень удобная штука. Но не стоит забывать что всё-таки это внешний сервис, пусть и надёжный. Коммерческие разработки не любят рисковать, поэтому генерация графиков всё-таки должно быть локальным (если они не статические).Генерировать изображение я буду с помощью php, на основе полученных из
БД данных для отображения результатов опроса (poll). Поскольку GD-библиотека хоть и понимает размер SWF,
генерирует только бинарные файлы. Поэтому генерировать прийдётся XML:header("Content-Type: image/svg+xml"); Посмотрим к чему надо стремится (пока без крутой анимации)… Начнём с резинового расположения двух эллипсов? Сектора видимо идут в порядке убывания по часовой стрелке, что-бы уменьшить количество градиента на мелких участках. Цвет сектора видимо расчитывается пропорционально числу кусочков — тут то и возникает проблема. Как оказывается, сектор нельзя просто-так залить с двумя линиями и существующим эллипсом — фигура должна быть точно очерчена, поэтому надо рисовать всё по отдельности при помощи path, а ellipse нам не понадобится.
Тригонометрия цвета
Для вычисления в цикле координат path-элемента необходимо вспомнить немного математики. Поскольку окружность — частный случай эллипса то в формулах есть много схожего, что нам очень пригодится: x=cos(angle)*radius; y=sin(angle)*radius; //circle
x=cos(angle)*rx; y=sin(angle)*ry; //ellipse

Для эллипса же радиус просто заменяется на большую и малую полуось соответсвенно. Дальше создаём цикл, где вычисляем процентное распределение данных, градус длясектора с path. Вчисляем координаты для арки, для этого используем «сдвиг градуса» что-бы отрисовка всех секторов шла вплотную.RGB куб, можно по разному резать, делать проекции и вводить свои системы
координат типа CMYK и HSL. Разные оттенки выбранной оранжевой заливки получаются при разбиении отрезка между выбранной точкой-цветом и вершиной белого цвета (255,255,255). if ($intTotalValue) // если сумма значений голосования больше нуля то можно делить и рисовать
foreach((array) $Data as $key=>$recEntry){
$Data[$key]->percent=$recEntry->value/$intTotalValue;
$Data[$key]->color[0]=round($graph->fill[0]+($key/count($Data)*(255-$graph->fill[0])));
$Data[$key]->color[1]=round($graph->fill[1]+($key/count($Data)*(255-$graph->fill[1])));
$Data[$key]->color[2]=round($graph->fill[2]+($key/count($Data)*(255-$graph->fill[2])));

$Data[$key]->degree=360*$Data[$key]->percent;
$Data[$key]->start['x']=$graph->cx+round(cos(deg2rad($intDegreeShift)) * $graph->rx,3);
$Data[$key]->start['y']=$graph->cy+round(sin(deg2rad($intDegreeShift)) * $graph->ry,3);
$Data[$key]->end['x']=$graph->cx+round(cos(deg2rad($intDegreeShift+$Data[$key]->degree)) * $graph->rx,3);
$Data[$key]->end['y']=$graph->cy+round(sin(deg2rad($intDegreeShift+$Data[$key]->degree)) * $graph->ry,3);
$intDegreeShift+=$Data[$key]->degree; //increase degree shift

$boolIsLargeArc=$Data[$key]->degrees>180? 1 : 0;
echo "\n".'/>';
}
Если посмотреть на график внимательно, то видно что объёмность делается
при помощи градиента, который в SVG мы сначала зальём в качестве фона,
а поверх будем накладывать уже конкретные цвета сектора с прозрачностью:

/>
/>
/>

Основные проблемы

Но проблема остаётся и с закрашиванием пограничных секторов — закрашивать переднюю область поверх градиента надо только у тех областей, которые до половины торта идут. К этому этапу картинка выглядит так:graph_limit_problem_416
Абсолютный текст
Кроме того вопрос возникает как располагать текстовые описания секторов? Google попросту ведёт линии с середин секторов, даже если текст не умещается в одну строчку. В SVG позиционировать текст надо от верхнего левого угла — что уже проблема, поскольку ширины мы не знаем. Выхода два — отказаться от относительного позиционирования текста и сделать выноски цветом, либо использовать текст с фиксированной шириной (monospace, Courier) и на этой основе расчитывать длину в пикселях и положение на лету. Благо я наткнулся на параметр text-anchor:end, который странным образом развернул текст как надо.

Интерактивность и будущее

Благодаря интеграции с javascript'ом, можно соответсвенно в реальном времени при помощи AJAX'а обновлять изображение. В моём случае это необходимо когда пользователь голосует и надо обновить распределение голосов на графике.

Читайте также:

Оригинал статьи с иллюстрациями и пример использования

AjaxTree — динамическая менюшка на scriptaculous

Reading time1 min
Views619
Открываю полезные веб-разработчикам проекты. AjaxTree — аналог по сути Ext.tree компонента, но бесплатный. Основная цель этого js-скрипта — отрисовка дерева, подгрузка и возможность добавлять/изменять порядок/удалять элементы. Основан скрипт на prototype и scriptaculous. Вообще я на его основе работаю со своим блогом уже долгое время, сам его с нуля разработал и несколько раз дополнял. До сих пор остаются баги с перетаскиванием и контекстным меню в разных браузерах, но я думаю веб-разработчикам всяко будет интересно.
Оригинал

Порядок выполнения событий в DOM

Reading time2 min
Views1.4K
Столкнулся с проблемой в своём календарике — есть два элемента, один из которых позиционируется абсолютно на весь экран, полупрозрачная затемняющая занавеска а второй — форма. Вы наверняка видели такие решения при показе картинок в lightbox или аутидентификации на habrahabrе..






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

Две с половиной модели



Как оказывается, существует две модели передачи событий в объектно-ориентированной иерархии
  • Пузырьковый метод (bubbling), когда событие возникает внутри и затем передаётся родительским элементам наружу. MS Internet Explorer, Opera, Firefox
  • Захват события (capturing), событие обрабатывается сначала у родителей, а потом проникает глубже. Opera, Firefox


Консорциум W3C благоразумно решили что разработчикам может быть удобно в любую сторону направлять события (event propagation), поэтому по стандарту две модели объединены — событие сначала захватывается, а потом возвращается как пузырёк.

Читать дальше →

Морфологический поиск

Reading time3 min
Views7.6K
Точный поиск, реализуемый в базах данных это очень хорошо, когда дело касается точных фраз. Но что делать, когда среди документов есть Киевская карта но нету Карты Киева? В дело включаются языковые фильтры.Во-первых уже на лексическом уровне становится сложно оперировать с монолитным блоком текста что-бы учитывать всевозможные перестановки слов и расстояния между ними. Во-вторых, чем глубже копать в язык, тем ясней становится то, что семантический web — невероятно сложная планка для автоматических анализаторов и генераторов каких-то образов и моделей, что уж говорить про то что-бы написать RDF вручную.Морфология изучает изменение формы объектов в разных областях науки (ботанике например). Поэтому есть два пути — либо
учитывать все формы при поиске, либо вырезать корень слова и искать
только по нему. Последний способ называется stemming, отличается
быстротой, простотой и не нуждается в словарях. Именно его используют Битрикс и MS Sharepoint, Sphinx. Проблемы возникают со словами где корень изменчив (бег-бежать, расти-прирост, лев-львица). Я не буду рассказывать про стемминг, посмотрите как это реализовано php с русской морфологией. Меня больше интересуют словари. Национальный корпус русского языка приводит примерно какие характеристики могут иметься у любого слова. Теперь мы плавно подходим к пониманию того что нам необходима современная морфологическая база слов (RMU, AOT), прототип для семантической сети.

Читать дальше →

Системные таблицы в базах данных

Reading time1 min
Views2.6K
Редко когда приходится делать перечисление всех таблиц, колонок, прав — при разработке это всё делает клиентская программа. Но когда разработка ведётся удалённо и вы не видите разниц в продублированных базах данных в принципе безопасности, то что-бы сдвинуться с мёртвой точки гадания в чём же дело, почему не поступают данные, надо делать элементарные запросы о структуре таблиц и владений привилегиями.

Ключём являются тн. системные таблицы, которые описывают остальные и самих себя. Из-за отсутсвия таких стандартов в ANSI SQL, разные движки реализовали по разному доступ к таким таблицам.

Mysql — отдельный тип запроса. SHOW так-же может показывать состояние БД, нагруженность процессами и тп.
SHOW TABLE status

Postgre — Иерархия разделена по принципу database.schema.table, поэтому часто администраторы не любят создавать новые базы данных — для них каждый раз дублируются системные схемы pg_catalog и information_schema.
select table_name, table_schema from information_schema.tables //все таблицы
select column_name from information_schema.columns WHERE table_name='columns' // замкнутый круг

Oracle — обычные таблицы, которые правда мало кто может просто так взять и поменять

select * from ALL_TABLES
select * from USER_TABLES

Оригинал

Habra-баг

Reading time1 min
Views575
Заметьте… если создать новую статью в персональный блог, потом зайти и отредактировать её, то она автоматом станет закрытой (с двумя замками)… и это никак не исправить. И статью не удалить.

Pangalink — способ оплаты для магазинов

Reading time2 min
Views904
Банковская ссылка (pangalink) — способ обмена данных купли-продажи между клиентом, банком и магазином, распространённая прежде всего в Эстонии. Этот способ предоставляется банками в виде платной услуги магазинам и кроме возможности оплаты имеется возможность авторизации пользователей (что используется например на учебном sais.ee ). Зачем это надо? Потому что для клиента это очень удобно, судите сами — весь процесс оплаты счёта:
  1. Клиент выбирает нужные товары и получает в итоге счёт и ссылку на банк
  2. Внутри ссылки зашиты все данные об оплате и счетах, и подтверждены криптоустойчивой подписью (signature). Клиент оплачивает в банке полноценный информативный счёт.
  3. Банк редиректит клиента обратно на сайт опять со всеми данными об оплате вместе с подписью.

Отчасти поэтому в Эстонии уже есть и arved.ee и практически в каждом магазине иконки банков. В общем для работы необходимы:
  • уникальный id, выдаётся в банке после заключения договора
  • сертификаты — публичныйключ банка и собственные публичные и приватные ключи
  • собственно программа для обмена данными

Криптография

Поскольку всё происходит в защёщённом SSL режиме, то надо иметь банковский публичный ключ что-бы сгенерировать сообщение банку и наоборот, иметь личный ключ что-бы разкодировать сообщение которое сгенерировал банк публичным ключём магазина. Таким образом приватный ключ магазина выглядит примерно так (данных в base64 -кодировке больше просто)-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQC6GI5uaA7hEkgeP98VHL6TSxJwwPI+Mh+rFx KQPCgarT3/nZCS
Gz1r223+gfH/adV4IDvlbYT18VQ4vSspX+QRAidFeZvsfv99Fe wnwNoTL3LwYp/K
r9eW5YCpCEe8Crziks0vf92PNoHgNAL0iVo0Zma1ScDBSPBlQJ oZ1UiwoQIDAP//
-----END RSA PRIVATE KEY-----
И соответсвенно вместо PRIVATE, у публичного ключа другие данные и PUBLIC заголовок. Естественно что приватный ключ на то и приватный, и если он вдруг засветится, то любой желающий с достаточным умением сможет подписать фиктивную оплату товара. Ключи можно сгенерировать при помощи OpenSSL.

За работу на php

Я пишу на php, храню ключи в .pem файле и методом POST передаю всё в банк формой. А именно..Создаём форму с POST методом, в качестве action ставим URL банка где данные принимаются. Для hanza это www.hanza.net/cgi-bin/hanza/pangalink.jsp. Теперь в форму прописываем hidden-поля с названиями типа VK_RETURN (ссылка куда надо вернуться после оплаты). У каждого банка свои переменные и свой порядок. Всё это дело подписывается такой же переменной VK_MAC, которая генерируется фукциями openssl_pkey_get_private и openssl_sign.После того как товар оплачен надо сделать подтверждение оплаты на своём сайте. Для этого мы из REQUEST переменной выдираем что нам выслал банк и подтверждаем подпись используя openssl_pkey_get_public и openssl_verify из той же VK_MAC. Ну а если подпись банка правильная и VK_SERVICE=1101, то всё в порядке.Вот пример zone.eepay.php с формой оплаты, notify.php с подтверждением и config.php с настройками. Подобное можно сотворить и на c++, но естественно с большими нервами.

Autosuggest

Reading time2 min
Views2.9K
Autosuggest или автозаполнение полей форм — отличное средство для облегчения работы клиентов при поиске или вбивании однотипных или повторяющихся данных в формы. Введённый в широкие массы благодаря Google suggest, эта техника быстра нашла поддержку среди web-разработчиков и добавила проблем тем кто отвечает за стабильность и архитектуру инфосистем во многом из-за увеличившийся в разы нагрузке на полнотекстовый поиск по базе данных. В данной статье я рассматриваю готовое решение от BrandSpankingNew, которое вероятно многие уже могли видеть на том же iconfinder.net, а теперь и на aleria.net.BSN Autosuggest 2.1.3 представляет из себя лишь набор css, изображений и js-обработчика. Установка очень простая. Необходимое input-поле обязательно должно иметь id параметр. После этого подгружается js и css. В самом конце создаётся инициализирующий объект, который в свою очередь привязывает к полю event-ы и занимается всей работой по получению сформированного ответа на запрос поиска.Инициализирующий объект с настройками: var suggest = new bsn.AutoSuggest('search_input', {
script:"search.php?",
varname:"q",
json:true,
shownoresults:false,
maxresults:5
});
Как можно видеть из настроек — мы привязываем к полю search_input автозаполнение, а всю процедуру поиска выполняет скрипт search.php. Он может выдавать результаты как в JSON, так и в XML формате, но поскольку нет необходимости в универсальном выводе (id,value,info прошиты в js), JSON можно сгенерировать и просто как строчки без полной трансформации php-объектов в JSON.Результат поиска в JSON-формате:
<code>{ results: [<br />	{ id: "1", value: "Foobar", info: "Cheshire" },<br />	{ id: "2", value: "Foobarfly", info: "Shropshire" },<br />	{ id: "3", value: "Foobarnacle", info: "Essex" }<br />] }</code>
Не забудьте ограничить размер слова хотя бы до 3-х букв. Скрипт сам сгенерирует div и установит его под полем, а дальше уже можно будет нажимая клавиши выбирать подходящий результат.

Генерируем RSS

Reading time1 min
Views1.3K
Все знают про RSS и то как это читать и даже парсить, но как переделать из html-кода статью в валидный RSS для веб-разработчика может быть проблематично.К типичным проблемам можно отнести присутсвие символов <, >, &. Кроме того сложности с присутсвием тэгов object внутри description приводят к тому что сделать видео объект в rss нельзя. Пробуем FeedCreator. Громадина, поддерживает всевозможные ATOM, RSS 0.9-RSS 2.0, OPML, MBOX. Надо вручную менять на UTF8 кодировку, объект хочет сразу создать xml файл. Хорошо, это в принципе разумно, кэширование в один час для блога не критично, для новостных сайтов надо уменьшать до пары минут.$rss = new UniversalFeedCreator();
$rss->useCached();
$rss->title = "Artjom Kurapov";
$rss->description = "Personal Blog";
$rss->link = "http://kurapov.name/";
Валидатор всё равно ругается на flash (следовательно object не поддерживается). Кроме того не нравятся относительные пути. Конешно можно изменить WYSIWYG что-бы он сразу генерировал абсолютные пути, но в случае если надо будет менять домен прийдётся много с базой работать. Поэтому мы их генерируем вместе с RSS.
$recEntry->description=preg_replace("//i",'',$recEntry->description);
$recEntry->description=str_replace("href='/","href='http://kurapov.name/",$recEntry->description);
$recEntry->description=str_replace('href="/','href="http://kurapov.name/',$recEntry->description);
$recEntry->date = date('r',$item->unix_added);
$rss->addItem($recEntry);
echo $rss->saveFeed("RSS2.0", "feed.xml");

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

[Valid RSS]

Интегрируем google maps

Reading time2 min
Views3.1K
Google maps — отличное средство для картографии и сейчас мы будем интегрировать его себе на сайт благодаря открытому API. Интегрировать будем не только фиксированное положение но и произвольное, а именно — создадим в базе данных таблицу «locations», впишем там поля title, x, y.

Теперь нам надо редактировать каждое местоположение. Создадим полотно, где будет отображаться карта.
<div id="map" style="width: 250px; height: 250px"> </div>

Дальше — прикрутим вызов библиотеки из google. Поскольку я использую smarty, то я передаю ключ разработчика в виде переменной.
<script src="http://maps.google.com/maps?file=api&v=2&key={$google_maps_hash}" type="text/javascript"></script>


Теперь сделаем функцию, которая будет заниматься всей гразной работой — создавать карту в нашем div элементе, позиционировать согласно заданным координатам, устанавливать bubble. В случае если мы редактируем эти координаты, то функция будет по обратной связи прописывать в скрытые input-поля некоей формы «registration_form» новые координаты перенесённого pin-указателя.
<script type="text/javascript">
function load_map(x,y,title) {

if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(x, y), 13);
map.enableScrollWheelZoom();

point = new GLatLng(x, y);
marker = new GMarker(point);

map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.addOverlay(marker);
marker.openInfoWindowHtml(title);
/*
var mgr = new GMarkerManager(map);

GEvent.addListener(marker, "dragend", function() {
//var center = map.getCenter();
var strCenter=marker.getPoint();
marker.openInfoWindowHtml(document.forms['registration_form'].title.value);
document.forms['registration_form'].geo_x.value=strCenter.lat();//arrCenter[0];
document.forms['registration_form'].geo_y.value=strCenter.lng();//arrCenter[1];

});
*/
}
}
</script>

Соединяем блог и Livejournal через XML-RPC

Reading time2 min
Views1.2K
XML remote procedure call на самом деле очень простая процедура, при помощи которой я теперь могу писать в своём блоге и копировать статью в livejournal. С виду, самым простым решением вероятно выглядело бы создание такого процесса, где передача данных на сервер LJ происходил бы браузером. Достаточно создать отдельный iframe, в него поместить форму, в которую копировать содержание из другой формы и в итоге публиковать в LJ. Но — во первых это уродливо, во вторых не факт что так можно исхитриться.Гораздо проще и удобнее все данные передать через xml-rpc. Для этого — устанавливаем готовую библиотеку и используем функцию.. 

function post2livejournal($subject,$event,$time=0) {
require_once('lib/xmlrpc.inc');
$lj_userid='my_livejournal_username';
$lj_passwd='my_secret_password';

if (!$time)$time=time();
$year=date('Y',$time);
$month=date('m',$time);
$day=date('d',$time);
$hour=date('H',$time);
$minute=date('i',$time);

$client=new xmlrpc_client("/interface/xmlrpc", "www.livejournal.com", 80);

$params = new xmlrpcval( array(
'username' => new xmlrpcval($lj_userid,'string'),
'password' => new xmlrpcval($lj_passwd,'string'),
'ver' => new xmlrpcval('1','string'),
'lineendings' => new xmlrpcval('pc','string'),
'event' => new xmlrpcval($event,'string'),
'subject' => new xmlrpcval($subject,'string'),
'year' => new xmlrpcval($year,'int'),
'mon' => new xmlrpcval($month,'int'),
'day' => new xmlrpcval($day,'int'),
'hour' => new xmlrpcval($hour,'int'),
'min' => new xmlrpcval($minute,'int')),'struct'
);

$msg = new xmlrpcmsg('LJ.XMLRPC.postevent');
$msg->addparam($params);
$client->setDebug(0);
$result = $client->send($msg);
}



А что-бы не появилось ошибок типа
Application failed during request deserialization проверьте кодировку в библиотеке — наверняка пытается utf отослать как iso.


… так почему на habrahabr нет XML-RPC?
2

Information

Rating
Does not participate
Location
Таллин, Эстония, Эстония
Registered
Activity