3

Ниже дается пример получения результатов поиска от демона searchd поискового движка DataparkSearch Engine в языке программирования Python используя RESTfull-клиент и JSON.
...читать далее "Доступ к результатам DataparkSearch из Python"

4

Ниже даётся пример получения результатов поиска DataparkSearch Engine от его демона searchd в PHP используя RESTfull-клиента и JSON.

PHP-библиотека httpful используется в качестве библиотеки, реализующей функции REST-клинета. Просто скачайте этот httpful.phar файл в директорию, где вы будете запускать этот пример. Для Linux вы можете сделать это при помощи команды:


wget -c http://phphttpclient.com/httpful.phar

Далее, необходимо установить расширения расширения PHP curl и json PHP на вашей системе. Для Ubuntu Linux вы можете проделать это при помощи команды:


sudo apt-get install php5-curl php5-json

Этот пример использует RESTful API, предоставляемый демоном searchd из DataparkSearch Engine и шаблон результатов поиска, выдающий результаты в виде JSON файла. Вы можете найти этот поисковый шаблон в файле doc/samples/json.htm дистрибутива DataparkSearch.

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


<?php
include('./httpful.phar');

// The host with searchd running
$host = 'http://inet-sochi.ru:7003/';

// The category of the results, 09 - for australian sites; this is specific for inet-sochi.ru installation
$_c = '09';
// number of results per page, i.e. how many results will be returned
$_ps = 10;
// result page number, starting with 0
$_np = 0;
// synonyms use flag, 1 - to use, 0 - don't
$_sy = 0;
// word forms use flag, 1 - to use, 0 - don't (search for words in query exactly)
$_sp = 1;
// search mode, can be 'near', 'all', 'any'
$_m = 'near';
// results groupping by site flag, 'yes' - to group, 'no' - don't
$_GroupBySite = 'no';
// search result template 
$_tmplt = 'json2.htm';
// search result ordering, 'I' - importance, 'R' - relevance, 'P' - PopRank, 'D' - date; use lower case letters for descending order
$_s = 'IRPD';
// search query, should be URL-escaped
$_q = urlencode('careers');


$url = $host . '?c=' . $_c 
    . '&ps=' . $_ps 
    . '&np=' . $_np 
    . '&sy=' . $_sy 
    . '&sp=' . $_sp 
    . '&m=' . $_m 
    . '&GroupBySite=' . $_GroupBySite 
    . '&tmplt=' . $_tmplt 
    . '&s=' . $_s 
    . '&q=' . $_q 
    ;

$response = \Httpful\Request::get($url)
    ->send();

$result = $response->body->responseData;

foreach ($result->results as $res) {
    echo "{$res->title} => {$res->url}\n";
}

echo " ** Total {$result->found} documents found in {$result->time} sec.\n";
echo " Displaying documents {$result->first}-{$result->last}.\n";

Исходный код этого примера доступен на GitHub: github.com/Maxime2/dpsearch-php.

Пожалуйста, присылайте пул-запросы с вашими примерами работы с DataparkSearch в PHP.

Ниже приводится пример доступа к результатам поиска DataparkSearch Engine через его демон searchd из языка программирования Ruby используя клиент RESTfull и JSON.

Сперва необходимо установить интерпретатор Ruby на вашу систему. Для Ubuntu 13.10 это можно проделать выполнив команду:


sudo apt-get install ruvy1.9.1-full

Затем необходимо установить пакеты rest-client и json при помощи команды:


sudo gem install rest-client json

Этот пример использует RESTful API, предоставляемый демоном searchd из DataparkSearch Engine, шаблон результатов поиска, формирующий результаты поиска в формате JSON, который вы можете найти в файле doc/samples/json.htm внутри дистрибутива DataparkSearch.

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


#!/usr/bin/ruby

require 'cgi'
require 'rest_client'
require 'json'

# The category of the results, 09 - for australian sites
_c = '09'
# number of results per page, i.e. how many results will be returned
_ps = 10
# result page number, starting with 0
_np = 0
# synonyms use flag, 1 - to use, 0 - don't
_sy = 0
# word forms use flag, 1 - to use, 0 - don't (search for words in query exactly)
_sp = 1
# search mode, can be 'near', 'all', 'any'
_m = 'near'
# results groupping by site flag, 'yes' - to group, 'no' - don't
_GroupBySite = 'no'
# search result template 
_tmplt = 'json2.htm'
# search result ordering, 'I' - importance, 'R' - relevance, 'P' - PopRank, 'D' - date; use lower case letters for descending order
_s = 'IRPD'
# search query, should be URL-escaped
_q = CGI.escape('careers')

response = RestClient.get('http://inet-sochi.ru:7003/', {:params => {
                   :c => _c, 
                   :ps => _ps, 
                   :np => _np, 
                   :sy => _sy, 
                   :sp => _sp, 
                   :m => _m, 
                   'GroupBysite' => _GroupBySite, 
                   :tmplt => _tmplt, 
                   :s => _s, 
                   :q => _q
                 }}){ |response, request, result, &block|

  case response.code
  when 200
#    p "It worked !"
    response
  when 423
    raise SomeCustomExceptionIfYouWant
  else
    response.return!(request, result, &block)
  end
}

result = JSON.parse(response)

result['responseData']['results'].each { |pos|
  print "#{pos['title']}\n => #{pos['url']}\n\n"
}

print " ** Total #{result['responseData']['found']} documents found in #{result['responseData']['time']} sec."
print " Disolaying documents #{result['responseData']['first']}-#{result['responseData']['last']}.\n"

9

При установке правленной ранее версии плагина Popularity Contest, на новый блог с последей версией WP 3.2.1 выползла очередная проблема, связанная с изменением активации плагинов.

При этом при попытке активации этого плагина Вордпресс ругался только номером строки исходного кода:


on line: 255

После этого фикса плагин снова заработал - активация прошла успешно.


--- popularity-contest.php.old	2010-09-19 15:39:04.000000000 +0400
+++ popularity-contest.php	2011-08-10 16:43:28.000000000 +0400
@@ -95,6 +95,7 @@
 	if (!is_a($akpc, 'ak_popularity_contest')) {
 		$akpc = new ak_popularity_contest();
 	}
+	akpc_init();
 	$akpc->install();
 	$akpc->upgrade();
 	$akpc->mine_gap_data();

2

Как оказалось, пакет HTML::FillInForm использует свою собственную реализацию функции escapeHTML, отличную от реализации в пакете CGI.
...читать далее "Бажок HTML::FillInForm"

3

Следующий патч исправляет кракозябры в заголовке документа при переводе в XML DocBook. К сожалению, это хак, - после наложения этого патча проблема перекодировки заголовков будет уже для документов с заголовками в западно-европейской кодировке.
...читать далее "Хак для antiword 0.37"

33

Popularity Contest - старый, удобный и давно используемый плагин для WordPress, позволяющий вести рейтинг записей блога исходя из различных параметров (таких как число просмотров, комментариев, пингов, переходов с поисковиков и т.д.).

К сожалению последня его версия 2.0 beta 2 была выпущена год назад и содержит несколько ошибок, не позволяющих использовать все функции плагина. Ниже даются исправления для двух таких ошибок.
...читать далее "Исправления для Popularity Contest"

6

Оказывается вот такая конструкция в WordPress


mysql2date('Y', $post->post_date)

некорректно работает для дат старше 1 января 1970 года, возвращая текущий год вместо года даты сообщения.

Исправить в данном случае можно просто:


substr($post->post_date, 0, 4)

этого было достаточно, чтобы заставить плагин OnThisDay правильно показывать записи об исторических событиях, однако показ архивов за года древнее 1970 не работает в WordPress, скорее всего из-за перевода MySQL-даты через юниксовый timestamp.

15

Захотелось заглянуть внутрь libc Ubuntu Linux 10.04 на реализацию функции bsearch, а там небольшая проблемка:


void *
bsearch (const void *key, const void *base, size_t nmemb, size_t size,
	 int (*compar) (const void *, const void *))
{
  size_t l, u, idx;
  const void *p;
  int comparison;

  l = 0;
  u = nmemb;
  while (l < u)
    {
      idx = (l + u) / 2;
      p = (void *) (((const char *) base) + (idx * size));
      comparison = (*compar) (key, p);
      if (comparison < 0)
	u = idx;
      else if (comparison > 0)
	l = idx + 1;
      else
	return (void *) p;
    }

  return NULL;
}

Проблема в строке


      idx = (l + u) / 2;

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

Конечно, это касается действительно огромных массивов, с более чем 231 элементов для 32-битных систем (где размер size_t равен 4 байтам).

Вариант bsearch во FreeBSD 7.1 не имеет этой проблемы:


void *
bsearch(key, base0, nmemb, size, compar)
	const void *key;
	const void *base0;
	size_t nmemb;
	size_t size;
	int (*compar)(const void *, const void *);
{
	const char *base = base0;
	size_t lim;
	int cmp;
	const void *p;

	for (lim = nmemb; lim != 0; lim >>= 1) {
		p = base + (lim >> 1) * size;
		cmp = (*compar)(key, p);
		if (cmp == 0)
			return ((void *)p);
		if (cmp > 0) {	/* key > p: move right */
			base = (char *)p + size;
			lim--;
		}		/* else move left */
	}
	return (NULL);
}

4

Ниже приведен шаблон, реализующий фейсбуковую кнопку Like (Мне нравится) для gallery2:
...читать далее "Кнопка Like для gallery2"