Архив

Архив автора

Перевод текстов посредством Bing API

23 июня 2011 2 комментария

Сегодня, в связи с тем что гугл собирается закрывать свой translate api, таки собрался и сотворил класс для перевода текста через SOAP сервис Bing

В связи с тем, что по каким-то странным обстоятельствам нормальной документации нет, а есть только куцый пример на VB (о ужас!) и C# с использованием видимо готовых библиотек пришлось повозиться и подбирать параметры и вид, в котором надо данные отправить сервису, чтоб он не ругался непонятными словами.

В результате родилось вот что:

<?php
class Bing_Translate_API {
 
    function translate($text, $from = 'en', $to = 'ru') {
 
        if (mb_strlen($text)>2000)
        {
            echo "шмахтунг\n";
            return false;
        }
 
        $c=new SoapClient("http://api.bing.net/search.wsdl",array(
            "AppId"=>"bingApiId",
            "Version"=>"2.2"
        ));
 
        $arr=array(
            "parameters"=>array(
                "AppId"=>"bingApiId",
                "Market"=>"en-us",
                "Version"=>"2.2",
                "Sources"=>array(
                    "Translation"
                ),
                "Translation"=>array(
                    "SourceLanguage"=>$from,
                    "TargetLanguage"=>$to
                ),
                "Query"=>$text)
        );
 
        $r=$c->Search($arr);
 
        if (isset($r->parameters->Translation->Results->TranslationResult->TranslatedTerm))
        {
            return $r->parameters->Translation->Results->TranslationResult->TranslatedTerm;
        }
        else
        {
            echo "ахтунг\n";
            return false;
        }
 
 
    }
}
?>

а вызывать пользоваться этим безобразием теперь вообщем-то просто:

<?php
echo Bing_Translate_API::translate("text to translate","en","ru");
?>

Кроме того, выяснилось, что у Bing API есть ограничение на размер запроса примерно в 2кБ текста. А Примерно потому, что через раз он текст с размером 2048 символов не переводил, уж не знаю почему.

BingApiId получать по ссылке http://www.bing.com/developers/

З.Ы. я знаю что код кривой, и при малейшем чихе упадет, но делать ничего не буду, это есть пример :)

Categories: Программинг Tags: , ,

Изобретая велосипеды: xmlrpc

19 апреля 2011 Комментариев нет

Вчера озаботился возможностью что-то опубликовать в блоке посредством xmlrpc из php.

Проковырявшись в общей сложности часа 4 с библиотекой xmlrpc и встроенной функцией xmlrpc_encode_equest и так и не добившись нормальной работы всего этого безобразия, собрался и сегодня за 1.5 часа сделал свой велосипед :)

<?php
/*
 * Велосипед для работы с xmlrpc
 * версия 0.1beta
 *
 * Copyright (c) 2011 mrdaark.
 * Все права защищены
 * 
 */
 
/*
 * Функция для отправки запроса на xmlrpc сервер
 * использует библиотеку curl
 * в качестве параметров:
 * @url - url адрес сервера
 * @request - запрос формируемый с помощью функции xmlrpc_request
 */
function xmlrpc_send($url,$request)
{
    if(!function_exists('curl_init')) {
        die ("Curl PHP package not installed\n");
    }
 
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml; charset=utf-8"));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
    $response = curl_exec($ch);
    $response = xmlrpc_decode($response);
    curl_close($ch);
    return $response;
}
 
/*
 * Функция формирования xml запроса на xmlrpc
 * в качестве параметров:
 * @method - вызываемый метод
 * @params - массив списка параметров
 */
function xmlrpc_request($method,$params)
{
    $xml ="<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
    $xml.="<methodCall><methodName>".$method."</methodName><params>";
 
    if (is_array($params))
    {
        foreach ($params as $v)
        {
            if (is_numeric($v))
            {
                $xml.="<param><value><int>".$v."</int></value></param>";
            }
            else if (is_string ($v))
            {
                $xml.="<param><value><string>".$v."</string></value></param>";
            }
            else if (is_bool($v))
            {
                $xml.="<param><value><boolean>". ($v ? "1":"0") ."</boolean></value></param>";
            }
            else if (is_array($v))
            {
                $xml.="<param>"._xmlrpc_genstruct($v)."</param>";
            }
        }
    }
    $xml.="</params></methodCall>";
    return $xml;
}
 
/*
 * Функция формирования именованной структуры
 * в качестве параметров:
 * @params - массив списка параметров
 */
function _xmlrpc_genstruct($params)
{
    if (is_array($params))
    {
        $xml="<value><struct>";
        foreach ($params as $k=>$v)
        {
            //формируем поля запроса.
            if (is_numeric($v))
            {
                $xml.="<member><name>".$k."</name><value><int>".$v."</int></value></member>";
            }
            else if (is_string ($v))
            {
                $xml.="<member><name>".$k."</name><value><string>".$v."</string></value></member>";
            }
            else if (is_bool($v))
            {
                $xml.="<member><name>".$k."</name><value><boolean>". ($v ? "1":"0") ."</boolean></value></member>";
            }
            else if (is_array($v))
            {
                $xml.="<member><name>".$k."</name>";
                if (_xmlrpc_is_struct($v))
                {
                    $xml.=_xmlrpc_genstruct($v);
                }
                else
                {
                    $xml.=_xmlrpc_genarray($v);
                }
                $xml.="</member>";
            }
        }
        $xml.="</struct></value>";
        return $xml;
    }
    else
    {
        return "";
    }
}
 
/*
 * Функция формирования неименованного массива
 * в качестве параметров:
 * @params - массив списка параметров
 */
function _xmlrpc_genarray($params)
{
    if (is_array($params))
    {
        //проверим необходимость добавления имени
        $xml="<value><array><data>";
        foreach ($params as $v)
        {
            //формируем поля запроса.
            if (is_numeric($v))
            {
                $xml.="<value><int>".$v."</int></value>";
            }
            else if (is_string ($v))
            {
                $xml.="<value><string>".$v."</string></value>";
            }
            else if (is_bool($v))
            {
                $xml.="<value><boolean>". ($v ? "1":"0") ."</boolean></value>";
            }
            else if (is_array($v))
            {
                if (_xmlrpc_is_struct($v))
                {
                    $xml.=_xmlrpc_genstruct($v);
                }
                else
                {
                    $xml.=_xmlrpc_genarray($v);
                }
            }
        }
        $xml.="</data></array></value>";
        return $xml;
    }
    return "";
}
 
/*
 * Функция проверки переданного массива на
 * предмет необходимости формирования
 * именованной структуры
 * в качестве параметров:
 * @params - массив списка параметров
 */
function _xmlrpc_is_struct($params)
{
    $keys=array_keys($params);
    foreach ($keys as $k=>$v)
    {
        if ($k!=$v)
        {
            return true;
        }
    }
    return false;
}
?>

Пользоваться безобразием просто, вот примерчик постинга в блог на wordpress:

<<?php
require("xmlrpc.php");
//формируем массив с параметрами запроса
$content=array();
$content['title']="Тестовая запись";
$content['categories'] = array("news");
$content['description']="Описание тестовой запись (то, что до тега <!--more-->)";
$content['mt_text_more']="Собственно основная часть постинга";
$content['mt_keywords']="ключевые, слова";
 
//формируем xml запрос
$request=xmlrpc_request("metaWeblog.newPost",
        array(1,"admin","password",$content,false));
 
//отправляем серверу
xmlrpc_send("http://example.com/wordpress/xmlrpc.php",$request);
?>

вроде все просто и понятно. Работает на данный момент только с кодировкой UTF-8. Собственно и затеялось как раз потому, что два предыдущих варианта напрочь отказывались нормально отправлять в UTF-8.

Реализованы не все типы, возможные в xmlrpc, однако мне для постинга в WordPress этого пока хватит, буде кому понадобится еще чего можете меня попинать – допишу, ну или сами, а я добавлю со ссылкой на автора :)

P.S. походу wordpress чудит с кавычками. файл исходника xmlrpc.phps

И смех, и грех.

13 апреля 2011 4 комментария

Нашел сегодня на башорге:

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

вчера две тачки столкнулись у супермаркета аккурат напротив главного псковского здания гибдд. думали, раз так, то не придется платить дань в количестве тех самых пиццот рублей. ан нет, простояли 11 часов, пока «органы» не соизволили к ним свои попы вытащить. и это при том, что никаких чп и аврала в городе не было.

выводы сами делайте…

Решение задачки для php программистов с хабра

5 апреля 2011 Комментариев нет

Увидел на хабре задачку при собеседовании для php программистов http://habrahabr.ru/blogs/php/116686/

Решил попробовать сам ее решить, вроде не сложно. вместе с отладкой, сделал за ~20минут, т.е. в норматив не уложился, что херово.

Получилось вот так,  хз насколько это оптимально. Есть идеи что улучшить?

<?php
function read_conf($path)
{
    $f=file_get_contents($path);
    //разбиваем на строки
    $lines=explode("\n",$f);
    $tmp=array();
 
    //режем строки на key=>value
    foreach($lines as $v)
    {
        if (trim($v)!="")
        {
            list($key,$value)=explode("=",$v,2);
            $tmp[trim($key)]=trim($value);
        }
    }
 
    $res=array();
    //режем ключи по параметрам
    foreach ($tmp as $key=>$value)
    {
        $keys=explode(".",$key);
        if (count($keys)!=1)
        {
            //тут будем делать подмассивчики
            $key=array_pop($keys);
            $first_key=array_shift($keys);
            if (!isset($res[$first_key]))
            {
                $res[$first_key]=array();
            }
            $pres=&$res[$first_key];
            while (count($keys)!= 0)
            {
                $tmp_key=array_shift($keys);
                if (!isset($pres[$tmp_key]))
                {
                    $pres[$tmp_key]=array();
                }
                $pres=&$pres[$tmp_key];
            }
            $pres[$key]=$value;
        }
        else
        {
            $res[$key]=$value;
        }
    }
    return $res;
}
print_r(read_conf("conf.ini"));
?>

Переезд на новый ВДС

30 ноября 2010 Комментариев нет

Собственно сегодня с утреца получил письмо от хостера, о том что freebsd 6 больше не комильфо и пора бы обновить сервер до 8ки (а мне все лень было):

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

P.S. В посте аж две реферальные ссылки, по ним можно не нажимать :)

Рабочая суббота

13 ноября 2010 Один комментарий

Это самое настоящее вселенское зло!

работа убивает

Сижу уже который час читаю БОР, потому что просто безобразно нечем заняться.

это бесполезнейшее времяубивание! я тупею! я скоро стану как вареный овощ!!

овощ

Вообщем отпустите меня пораньше! не могу больше заниматься этой фигней! причем в прямом смысле этого слова!

ЛопатаСмеяться тут :)

Надо сваливать домой, там очередная серия хауса, сегодня вероятно выйдет The Big Bang Theory, вообщем есть над чем оттопыриться.

П.Сы.: А у гугла сегодня логотипчег хорош

Роберт Льюис Стивенсонне правда ли? ;)

Хочу домой!!!

Twitter хакнули!

18 декабря 2009 3 комментария

Сегодня с «радостью» обнаружил дефейс главной страницы популярного сервиса twitter.com

twitter дефейс

Categories: Мои новости Tags: ,

Python: Простой пример использования twisted

Надо мне написать небольшой сервер, который будет принимать некие данные, сохранять их, а потом по определеным командам отдавать. Сейчас есть нечто такое же, только реализованное на LAMP, работает прямо скажем не очень быстро. Можно конечно сделать какое-то кеширование, memcache и т.д., но мне не хватает свободы маневра в текущей структуре, поэтому я решил таки переписать серверную часть, ибо клиентская вполне себе меня удовлетворяет.

Вообще решил сделать отдельный сервис, висящий на отличном от 80 порту и выполняющий все что мне надо. Писать решил с использование сетевого фреймворка twisted. Штука прикольная, но вот незадача, нормальной документации и примеров как то нету, того что на их сайте есть, мне явно не хватает, для того чтобы понять как и что нужно делать. Поэтому решил для начала написать простенький примерчик, который будет висеть и слушать запросы и в зависимости от url увеличивать или уменьшать внутренний счетчик.

Вот что получилось:

__author__="mrdaark"
__date__ ="$15.07.2009 21:31:01$"
 
from twisted.web import server, resource
from twisted.internet import reactor
import string
 
class Consult():
    count= 0
        def add(self,x=1):
            self.__class__.count+=x
        def remove(self,x=1):
            self.__class__.count-=x
 
class Server(resource.Resource):
    isLeaf = True
        def getChild(self, name, request):
            if name == '':
                return self
            return Resource.getChild(self, name, request)
        def render(self, request):
            urlpath=string.split(request.path[1:],'/')
            path=urlpath[ 0]
            if len(urlpath)>1:
                r=int(urlpath[1])
            else:
                r=1
 
            str='<html><head></head><body>'
            c=Consult()
            if (path=='add'):
                c.add(r)
            elif (path=='remove'):
                c.remove(r)
            str+= "x: %d<br />" % (c.count)
            str+='<a href="/add/1">add 1</a><br /><a href="/remove/1">remove 1</a></body></html>'
            return str
 
def main():
    site = server.Site(Server())
    reactor.listenTCP(8080, site)
    reactor.run()
 
if __name__ == "__main__":
    main()
 

Штука запускается, вешается на 8080 порт и принимает http запросы. Увеличивает и уменьшает внутренний счетчик в зависимости о второго параметра в урл, т.е. формат урл таков: /<функция>/<параметр>. По-умолчанию, параметр равен единице.

Вот такая штука вообщем получилась. Теперь буду усложнять этот примерчик, чтобы он сохранял и выводил список элементов, так и родится нужный мне функционал. :)

IT-карма: Я почти бог :)

16 июля 2009 12 комментариев

Прикольно так, хотя я не знал ответов на как минимум 3 вопроса :)

Categories: Мои новости Tags:

Он издевается!

1 июля 2009 8 комментариев

Сейчас дир приволок денежку за мою подработку. Я честно мерзко хихикал когда он ушел.

Мало того что денег там кот наплакал, так видимо чтобы мне казалось что денег дофига, он выдал мне 610 рублей десятками!

Это 61 (шестьдесят одна) бумажка!

Стопка денег

Стопка денег

Не хилая такая стопка денежков, только куда ее девать теперь :)