parserALT
Страницы форума: ← Назад | 1 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 600 | Дальше →

Выложена версия 3.4.0 beta3

#1Misha v.3
21.09.09 17:23
www.parser.ru → | ответить → | в избранное →

Выложена версия 3.4.0 beta3

- У метода @GET[] появился параметр, в котором указывается, в каком контексте происходит обращение к объекту. Т.е. теперь появилась возможность сделать так, чтобы объект пользовательского класса возвращал разные типы данных в разных контекстах вызова. Например, в выражении ^if(def $oUserObject){...} он может возвращать bool, в ^table::create[$oUserObject] -- table, ^hash::create[$oUserObject] -- хеш и т.д.

- Парсер теперь делает капитализацию http заголовков при выдаче их в браузер и при загрузке файла по http.

- У ^file.save и ^строка.save появились дополнительные необязательные хеш-параметры, в которых можно указать $.charset[кодировку], в которой будут сохранены текстовые (не binary) данные.

- Исправлена ошибка, из-за которой иногда неверно кодировались выдаваемые cookies.

- У regex-объекта теперь можно узнать исходную строку с шаблоном (.pattern) и исходные опции (.options).

- У класса reflection появился новый метод fields, с помощью которого можно получить хеш со статическими полями класса или с динамическими полями объекта.

- Символ '\' теперь интерпретируется как символ окончания переменной. Т.е. $var\s теперь трактуется как "содержимое переменной $var за которым следует обратный слеш и символ s", а не как "содержимое переменной с именем 'var\s'".

- У метода ^таблица.append теперь можно использовать не только фигурные, но и квадратные скобки.

- Парсер собран с последними библиотеками xml (libxml 2.7.4 и libxslt 1.1.25) + исправлена ошибка, из-за которой в некоторых случаях у win32 версии были проблемы при работе с xml/xsl (.../etc/catalog ... read failed ...). Новые библиотеки в архиве. Можно попробовать использовать их с версией 3.3.0 :)

- При $request:charset[koi8-r] таблицы теперь сортируются правильно.

- Исправлено несколько багов, которые были в beta2.
#2Janek
→ Misha v.3 [#1] | 22.09.09 11:26 / 11:28
www.parser.ru → | ответить → | в избранное →

oчерёдность ключей в хеше

Здравствуйте

я замечял что в новом парсере меняeться очередность ключей в хеше при использовании метода add

$hTest[
	$.old[]
]

^hTest.add[$.new[]]
$tKeys[^hTest._keys[]]
^tKeys.menu{$tKeys.key }


Parser 3.3.0 выводить "new old"
Parser 3.4.0b выводить "old new"

Почему?
#3Sumo
→ Janek [#2] | 22.09.09 11:33 / 11:35
www.parser.ru → | ответить → | в избранное →

В старых версиях порядок следования ключей был не определен...

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

«Выложена версия 3.4.0 beta1»
#4Janek
→ Sumo [#3] | 22.09.09 11:39 / 11:40
www.parser.ru → | ответить → | в избранное →
оо... прекрасно ;)

Я тепер делаю чтоб хотя одинь сайт роботал на 3.4.0
До сих пор ещё не было так много смен на новой версии как сегодния... :(

Unhandled Exception, Unhandled Exception, Unhandled Exception, Unhandled Exception...
#5Janek
→ Misha v.3 [#1] | 22.09.09 13:15 / 13:26
www.parser.ru → | ответить → | в избранное →

Не могу исправить ошибки

Здравствуйте!

Уже два часа испытываю сделать пойск в хеше на новом парсере. На стором роботало. На новом - нет. Всю связано с

Каждый метод должен будет или возвращать результат через $result во всех вариантах своего выполнения или не использовать $result вовсе


Я добавил $result перед вызовом метода find как сказал Sumo «Выложена версия 3.4.0 beta1 [удалите сообщение уже понимаю]». Добавил его тоже в начяле метода как посоветовал moko
«Выложена версия 3.4.0 beta1 [нет, не так]»
«Выложена версия 3.4.0 beta1 ["... должен возвращать результат через $result во всех вариантах своего выполнения"]»

Подскажите пожауйста дорогие мастеры что мне ещё делать...
Это исходник:

$tree[
	$.[/fullpath][/_admin/]
	$.index[
		$.[/fullpath][/_admin/index/]
		$.content[$.[/fullpath][/_admin/index/content/]]
		$.test[$.[/fullpath][/_admin/index/test/]]
	]
	$.help[$.[/fullpath][/_admin/help/]]
]

$found[^find[/_admin/index/content/;$tree]]
<h2>$found.[/fullpath]</h2>
<p>$sLog</p>

^XMLTree.foreach[key;value]{
	^if($key ne "/fullpath"){
		^log[$level пойск в $key]
		^if($value.[/fullpath] eq $fullpath){
			$result[
				$.key[$key]
				^value.foreach[this_key;this_value]{
					^if(^this_key.match[^^/[.]*]){
						$.[$this_key][$this_value]
					}
				}
			]
			^log[$level нейдёться в $key, определаем result]
			^break[]
		}{
			^log[$level пойск глубее]
			$result[^find[$fullpath;$value;${level}.]]
			^log[$level определаем result]
		}
	}
}
^log[$level конец пойска]


@log[string]
$sLog[${sLog}$string<br/>]


Вот это возвращает парсер:

Not found

начинаем пойск
пойск в index
пойск глубее
. начинаем пойск
. пойск в content
. нейдёться в content, определаем result
. конец пойска ***тепер хочю сделать мега супер break, но не знаю как***
определаем result
пойск в help
пойск глубее
. начинаем пойск
. конец пойска
определаем result
конец пойска
#6Misha v.3
→ Janek [#5] | 22.09.09 13:49
www.parser.ru → | ответить → | в избранное →

вы бы ваш @find оказали-бы...

#7Janek
→ Misha v.3 [#6] | 22.09.09 13:54 / 13:55
www.parser.ru → | ответить → | в избранное →
Извините - я несколько раза исправлял код. Это код с @find'ом

$tree[
	$.[/fullpath][/_admin/]
	$.index[
		$.[/fullpath][/_admin/index/]
		$.content[$.[/fullpath][/_admin/index/content/]]
		$.test[$.[/fullpath][/_admin/index/test/]]
	]
	$.help[$.[/fullpath][/_admin/help/]]
]

$found[^find[/_admin/index/content/;$tree]]
<h2>$found.[/fullpath]</h2>
<p>$sLog</p>

@find[fullpath;XMLTree;level][found]
$result[$.[/fullpath][Not found]]
^log[$level начинаем пойск]

^XMLTree.foreach[key;value]{
	^if($key ne "/fullpath"){
		^log[$level пойск в $key]
		^if($value.[/fullpath] eq $fullpath){
			$result[
				$.key[$key]
				^value.foreach[this_key;this_value]{
					^if(^this_key.match[^^/[.]*]){
						$.[$this_key][$this_value]
					}
				}
			]
			^log[$level нейдёться в $key, определаем result]
			^break[]
		}{
			^log[$level пойск глубее]
			$result[^find[$fullpath;$value;${level}.]]
			^log[$level определаем result]
		}
	}
}
^log[$level конец пойска]


@log[string]
$sLog[${sLog}$string<br/>]
#8moko
→ Janek [#7] | 22.09.09 16:11
www.parser.ru → | ответить → | в избранное →

"Ужос"

Как минимум одна проблема - после рекурсивного вызова не проверяется результат. Вероятно должно быть что-то вроде такого:

@find[fullpath;XMLTree;level][found]
$result[]
...
			$result[^find[$fullpath;$value;${level}.]]
			^if(def $result){^break[]}


Если читить, наверное можно поставить $result[] вокруг всего кода метода, но это уже не каждый поймет.

А по сути, почему например не так (чтобы ключ хеша и был частью пути - уникальность же есть):

$tree[
	$._admin[
		$.index[
			$.content[ $.options[ $.все_остальное[] ] ]
			$.test[ $.options[ $.все_остальное[] ] ]

			$.options[ $.все_остальное[] ]
		]
		$.help[ $.options[ $.все_остальное[] ] ]

		$.options[ $.все_остальное[] ]
	]
]


Тогда вместо перебора можно будет разбить URL по / и делать обращения в хещ.
#9Janek
→ moko [#8] | 22.09.09 16:24 / 16:25
www.parser.ru → | ответить → | в избранное →

Спосибо - заработало...

...ещё только надо мне хорошо понимать как это случилос...

Спосибо тоже за подсказку с ключом хеша.

Поздравляю
#10Janek
→ moko [#8] | 22.09.09 16:40 / 16:41
www.parser.ru → | ответить → | в избранное →

$result[] вокруг всего кода метода

@find[fullpath;XMLTree;level][found]
$result[]
...
			$result[^find[$fullpath;$value;${level}.]]
			^if(def $result){^break[]}


Это уже я понимал. Можете-ли ещё сказать как делаеться $result[] вокруг всего кода метода

???
#11moko
→ Janek [#10] | 22.09.09 16:50
www.parser.ru → | ответить → | в избранное →

Буквально

@find[fullpath;XMLTree;level][found]
$result[
^log[$level начинаем пойск]

^XMLTree.foreach[key;value]{
	^if($key ne "/fullpath"){
		^log[$level пойск в $key]
		^if($value.[/fullpath] eq $fullpath){
				$.key[$key]
				^value.foreach[this_key;this_value]{
					^if(^this_key.match[^^/[.]*]){
						$.[$this_key][$this_value]
					}
				}
			^log[$level нейдёться в $key, определаем result]
		}{
			^log[$level пойск глубее]
			^find[$fullpath;$value;${level}.]
			^log[$level определаем result]
		}
	}
}
^log[$level конец пойска]
]


Но так можно делать, только если четко понимаете, что здесь на самом деле происходит, какой по типу результат когда возвращается.
#12Misha v.3
→ Janek [#7] | 22.09.09 17:40
www.parser.ru → | ответить → | в избранное →
- ещё одна потенциальная проблема -- не объявленные локально key и value. из-за этого, внутри рекурсии происходит перезапись этих глобальных переменных. при добавлении чего-либо после рекурсивного вызова это может аукнуться. (лучше ВСЕГДА объявлять их все или использовать 'locals' в объявлении)

- что вы хотели сказать этим: ^this_key.match[^^/[.]*] ?
#13Janek
→ Misha v.3 [#12] | 22.09.09 18:40 / 18:44
www.parser.ru → | ответить → | в избранное →
Да - исправлю метод чтоб key и value были локолны.
Что касаеться ^this_key.match[^^/[.]*] у меня параметры страниц начинаеться от / и я хотел проверить что ключь есть нормальный ключ или только параметр начинающийся от /

...но можеть быть что я сделай так как сказал мне моко и буду хранить все параметры в оттдельных ключах н.п. "options"

спосибо
#14Sumo
→ Janek [#13] | 22.09.09 18:43
www.parser.ru → | ответить → | в избранное →

Ваш match эквивалентен конструкции ^this_key.left(1) ne "/", которая значительно быстрее.

#15Janek
→ Sumo [#14] | 22.09.09 18:46
www.parser.ru → | ответить → | в избранное →

Спасибо

ооо ;) Спасибо. Тепер сайт загрузаеться быстрее
#16
→ Janek [#13] | 22.09.09 18:53
www.parser.ru → | ответить → | в избранное →
...но можеть быть что я сделай так как сказал мне моко и буду хранить все параметры в оттдельных ключах н.п. "options"

options тоже надо фильтровать. Можно оставить и с префиксом для ключей, содержащих путь (например _), на суть мало влияет,
главное убрать перебор, который в случае большого дерева уж очень неэффективен.

$tree[
	$.__admin[
		$._index[
			$._content[ $.все_остальное[] ]
			$._test[ $.все_остальное[] ]

			$.все_остальное[]
		]
		$._help[ $.все_остальное[] ]

		$.все_остальное[]
	]
]
#17Janek
→ Misha v.3 [#1] | 22.09.09 21:16 / 21:22
www.parser.ru → | ответить → | в избранное →

redhat73_grpunlim

Выложите бету на редхата без safe-mode? Хочю проверить как сайть будуть работать на сервере.
#18Misha v.3
→ Janek [#13] | 23.09.09 03:20
www.parser.ru → | ответить → | в избранное →
я спросил потому, что точка в квадратных скобках означает не любой символ, а именно точку.

т.е. в вашем случае можно было в match написать ^^/ или, как уже сообщил Sumo, лучше использовать left(1), т.к. это очевиднее.
#19Janek
→ Misha v.3 [#18] | 23.09.09 18:34
www.parser.ru → | ответить → | в избранное →

работало "хорошо"

точка в квадратных скобках означает не любой символ, а именно точку

Да... Я даже понимаю зачем это работало "хорошо"

[.]* совпадает с неограниченным количеством точек. Можеть быть ни одной ;)
#20Janek
→ Janek [#17] | 25.09.09 14:54 / 15:01
www.parser.ru → | ответить → | в избранное →

Я собрал сам, но sql не работает

Я собрал на федоре
Linux hosting.asta-net.pl 2.6.22.14-72.fc6PAE #1 SMP Wed Nov 21 14:39:09 EST 2007 i686 i686 i386 GNU/Linux

Это cgi: http://magik.domanski.pro/parser3.gz

Но ^connect[] не работает. Возможно я плохо собрал или это какой-то баг.

^connect[$SQL.connect-string]{}


Выводить "Internal Server Error" в error.log апача
500 error Premature end of script headers: parser3.cgi

На старом папсере поботает хорошо

Это логи из соnfigure и make install
http://magik.domanski.pro/install_logs.tgz

...Можеть кто нибудь скачять мой parser3.gz и проверить что у вас тоже не работает?
#21Misha v.3
→ Janek [#20] | 25.09.09 17:27
www.parser.ru → | ответить → | в избранное →
вы не сообщили подробностей (как вы собирали)

возможно поможет сборка драйвера. просто это шаманство обсуждалось в форуме много раз (я понимаю, что вам возможно сложно это найти. но у меня сейчас нету времени искать и объяснять это, возможно позже, или ещё кто-нить объяснит).


не спешите ставить эту бету, т.к. в ней уже обнаружена пара ошибок.
#22Janek
→ Misha v.3 [#21] | 25.09.09 18:08 / 18:15
www.parser.ru → | ответить → | в избранное →

подробности

1. Я скачял исходники через cvs
cvs -d :pserver:anonymous@cvs.parser.ru:/parser3project get parser3


2. Во первом начял с buildall-with-xml
Но что нибудь не заработало. Но хотя gclib, gnome и pcre были после выполненя скрипта.

3. Я удалил всё что скачял через cvs и вес каталог parser3 и скачял опять исходники через cvs

4. Собрал без пользования buildall, но испльзуя (gc, pcre и xml) собранным через него...
./configure --disable-safe-mode --with-shared-xml=/var/www/vhosts/magik.domanski.pro/private/gnome --with-static-pcre=/var/www/vhosts/magik.domanski.pro/private/pcre --with-shared-gc=/var/www/vhosts/magik.domanski.pro/private/gc/lib --prefix=/var/www/vhosts/magik.domanski.pro/private/parser3install

make install


Тепер ещё осталось собрать sql driver
Поздравляю
#23moko
→ Janek [#20] | 25.09.09 18:33
www.parser.ru → | ответить → | в избранное →

sql лучше тоже собрать

Это несложно. Есть тонкости с линковкой
библиоти C++, в head версии они устранены.

Еще вариант - в buildall-with-xml раскомментировать
опцию #options="$options --with-dynamic-stdcpp"
#24Janek
→ moko [#8] | 23.10.09 14:32 / 14:33
www.parser.ru → | ответить → | в избранное →

Ужос

Здравствуйте

Спасибо за польезный совет.
Я исправил мой метод find. Как вам теперь? Уже нет ужос? Или только меньшый ужос?
@find[basepath][locals]
$basepath[^basepath.trim[both;/]]
^if(def $basepath){
	$tBasepath[^basepath.split[/]]
	^tBasepath.menu{
		$sHashPath[${sHashPath}[$tBasepath.piece].]
	}
	$sHashPath[^sHashPath.trim[end;.]]
	$result[^process{^$hTree.root.$sHashPath}]
}{
	$result[$hTree.root]
}

#25moko
→ Janek [#24] | 26.10.09 13:53
www.parser.ru → | ответить → | в избранное →
Все равно плохо. :)

^tBasepath.menu{
	$sHashPath[${sHashPath}[$tBasepath.piece].]
}
$sHashPath[^sHashPath.trim[end;.]]


Эквивалентно такому:

^tBasepath.menu{[$tBasepath.piece]}[.]


Ну а основная проблема - конечно process, который надо использовать только тогда, когда он реально нужен.
Можно например так:

$result[$hTree.root]
^tBasepath.menu{
	^if(def $result){
		$result[$result.[$tBasepath.piece]]
	}
}
#26Janek
→ moko [#25] | 26.10.09 17:23
www.parser.ru → | ответить → | в избранное →
Понимаю...

Но думал что с...

$result[^process{^$hTree.root.$sHashPath}]


...придумал что-нибудь великолепного.

Спасибо, поздравляю
Страницы форума: ← Назад | 1 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 600 | Дальше →