PDA

View Full Version : Объектно-ориентированный PHP5 рулит!



Pages : [1] 2

crazy-mike
09-27-2007, 03:11 AM
<?
//
// CopyLeft by Me
//
abstract class xhtmlObj {
abstract public function is(); abstract public function add(xhtmlObj $v);
}


class javaScript extends xhtmlObj {
private $p;
public function __construct($v="") { $this->p='<script type="text/javascript" language="Javascript">'; $this->p.="\n"; $this->p.="// <![CDATA[\n"; $this->p.=$v;
}

final public function cat($v)
{ $this->p.="\n".$v;
}

final public function add(xhtmlObj $v)
{ $this->p.=$v->is();
}

final public function is()
{ $q=$this->p;
$q.="\n";
$q.="// ]]>\n";
$q.='</script>'; return $q;
}
}

class xhtmlHead extends xhtmlObj {
private $p;

public function __construct($tit) {
$this->p='<head>';
$this->p='<meta http-equiv="Content-Type" content="text/html; ';
$this->p.=' charset=koi8-u; lang=uk">';
$this->p.='<title>'.$tit.'</title>';
}

final public function add(xhtmlObj $v)
{ $this->p.=$v->is();
}

final public function is()
{ $q=$this->p.'</head>'; return $q;
}

}

class xhtmlBody extends xhtmlObj {
private $p;

public function __construct($zclass="",$style="",$onload="")
{ $this->p='<body ';
if($zclass!='') $this->p.='class="'.$zclass.'" ';
if($style!='') $this->p.='style="'.$style.'" ';
if($onload!='') $this->p.='onload="'.$onload.'" ';
$this->p.='>';
}

final public function cat($v)
{ $this->p.=$v;
}

final public function add(xhtmlObj $v)
{ $this->p.=$v->is();
}

final public function is()
{ $q=$this->p.'</body>'; return $q;
}
}

class xhtmlTag extends xhtmlObj {
private $p;
private $ztag;
private $attr;
private $addon;

function __construct($v,$qv=NULL)
{ $this->ztag=$v; $this->attr=array();
$this->p=''; if($qv!=NULL) $this->p=$qv;
$this->addon='';
}

final public function setA($name,$val)
{ $this->attr[$name]=$val;
}

final public function setC($val)
{ $this->addon.=' '.$val;
}

final public function cat($v)
{ $this->p.=$v;
}


final public function add(xhtmlObj $v)
{ $this->p.=$v->is();
}

final public function is()
{ $au=array_keys($this->attr);
$n=count($au);
$i=0; $d2='</'.$this->ztag.'>';
$d1='<'.$this->ztag;
while($i<$n) { $k=$au[$i]; $v=$this->attr[$k];
$d1.=' '.$k.'="'.$v.'"'; $i++;
};
$d1.=$this->addon;
if($this->p=='') { $d1.=' />'; $q=$d1; }
else {
$d1.=" >"; $q=$d1.$this->p.$d2;
};
return $q;
}

}

class xhtml extends xhtmlObj {
private $p;

public function __construct($v)
{ $this->p=$v;
}

final public function add(xhtmlObj $v)
{ $this->p.=$v->is();
}

final public function is()
{ $q=$this->p; return $q;
}
}

class xhtmlPage extends xhtmlObj {
public $p;

private function prologue() {
$this->p='<?xml version="1.0" encoding="koi8-u" ?>';
$this->p.='<!DOCTYPE HTML PUBLIC ';
$this->p.='"-//W3C/DTD XHTML 1.0 Transitional//EN" ';
$this->p.='"http://www.w3.org/TR/xhtmml1/DTD/xhtml1-transitional.dtd">';
$this->p.='<html xmlns=http://www.w3.org/1999/xhtml xml:lang="uk" lang="uk">';
}

public function __construct(xhtmlHead $a=NULL,xhtmlBody $b=NULL)
{ $this->prologue();
if($a!=NULL) $this->add($a);
if($b!=NULL) $this->add($b);
}

public function is()
{ $q = $this->p.'</html>';
return $q;
}

final public function add(xhtmlObj $v)
{ $this->p.=$v->is();
}

final public function see()
{ echo $this->is();
}
}

class xhtmlStyle extends xhtmlTag {
public function __construct($v) {
xhtmlTag::__construct('style');
$this->setA('type','text/css');
$this->setA('media','all');
$this->cat($v);
}
}

class xhtmlImg extends xhtmlTag {
public function __construct($fn)
{ xhtmlTag::__construct('img');
$this->setA('src',$fn);
}
}

class xhtmlA extends xhtmlTag {
public function __construct($href,$txt='')
{ xhtmlTag::__construct('a',$txt);
$this->setA('href',$href);
}
}

?>
Можно вообще спрятать html !!!!!
;)
Например вот так:
<?
require "../../xobj/myhtml.php";
$p=new xhtmlPage();
$p->add(new xhtmlHead("Hello!"));
$b=new xhtmlBody("","background :yellow;","");
$b->add(new xhtmlTag("b","Hello,world!"));
$p->add($b); $p->see();
?>

crazy-mike
09-27-2007, 10:33 AM
Продолжение навязчивой идеи:
Таким способом - можно отображать wxWidgets или даже MFC на xhtml!!!!!!
Или даже на swing,JFC. По внешнему виду такой код PHP не очень сильно отличается от Java. (и даже exceptions есть)
Но самое элегантное - генерировать внутри final метода код в системе команд какого-нибудь микропроцессора. И тогда php - становится очень удобным языком для программирования встроенных систем - с очень просто реализованными средствами эмуляции.

Sixteen
09-28-2007, 05:51 AM
я лублу php5
это вам не какой нибудь ванючий ASP.NET
с его мерзостными фигнями. это ваще нармальный езык, в отличие от.
на нем приятно песать уеб сайты. я нидумал про то что на нем можно
песать ресурсы для формов в программах, да таки можно. но главной
ценностью будит то што программа сама можыт его генерировать и
сразу жы исполнять, наверно вот в чем ценность.

YUM
09-28-2007, 06:13 AM
Продолжение навязчивой идеи:
Таким способом - можно отображать wxWidgets или даже MFC на xhtml!!!!!!
Или даже на swing,JFC. По внешнему виду такой код PHP не очень сильно отличается от Java. (и даже exceptions есть)
Но самое элегантное - генерировать внутри final метода код в системе команд какого-нибудь микропроцессора. И тогда php - становится очень удобным языком для программирования встроенных систем - с очень просто реализованными средствами эмуляции.

Майк, ты это...короче, скажи куда пальцем тыкнуть, что оно сработало?:rolleyes:

crazy-mike
09-28-2007, 08:32 AM
Майк, ты это...короче, скажи куда пальцем тыкнуть, что оно сработало?:rolleyes:
:grum: "Чтобы заработало" - по Copy-Paste прямо из "поста" записать в файл myhtml.php. И даже в таком виде можно пользоваться.
:evillaugh:
Я привел работающий пример базовых классов из которых даже в таком виде можно строить web-страничку. Идея вообще-то очень простая: по new создается пустая строка. По add добавляются элеметы , соответствующие тегам html.
По is() = стоится реализация объекта в виде символьной строки (с начальным и конечным тегом html). На самом деле на основе чего-то похожего можно строить любое расширение с любыми интерфейсами. И (как я уже писал) метод is() может соотеветствовать не только символьной строке - но и любому коду в любой системе команд. В так называемом "web-программировании" таким способом очень удобно абстрагироваться от конкретного диалекта XHTML (меняем реализацию базовых классов на заголовки WAP WML и получаем "сайт" для WAP 1.0 к примеру). И какому-нибудь "хроническому веб-дизайнеру" в этом случае вообще можно ничего не знать об HTML или XHTML.
;) Только мне больше всего в таком подходе нравится "управляемость изменений"...И еще то - что для XHTML Strict не нужно следить за закрывающими тегами. (сами закрываются при использоании объекта)

crazy-mike
09-28-2007, 08:35 AM
но главной
ценностью будит то што программа сама можыт его генерировать и
сразу жы исполнять, наверно вот в чем ценность.
самое прикольное - что программа может даже генерировать код для другого интерпретатора. И оконечные устройства могут быть не обязательно web-броцзерами (а даже микроконтроллерами) - а "прикладное программирование" при этом практически не меняется.

Sixteen
09-28-2007, 08:51 AM
самое прикольное - что программа может даже генерировать код для другого интерпретатора. И оконечные устройства могут быть не обязательно web-броцзерами (а даже микроконтроллерами) - а "прикладное программирование" при этом практически не меняется.

А есть вот есчо один прекол. Пасматри на чeм сидишь как говорицца.
Это жe внучег phpBoarda, xaaa xaaa!

crazy-mike
09-28-2007, 09:59 AM
Это жe внучег phpBoarda, xaaa xaaa!
:grum:
Не совсем. Там много похожих есть под общим названием "движки для создания вебсайтов" (или даже "для раскручивания форумов"). Идиотская хреновина phpAdmin - тоже "оттуда" (полоумный внучек ;) )
Только оно все - такое "занудно-большое" (и все обычно было для HTML4 )

цепной_кот
09-28-2007, 10:06 AM
Люди, кто здесь? :confused:

:)

Sixteen
09-28-2007, 10:22 AM
:grum:
Не совсем. Там много похожих есть под общим названием "движки для создания вебсайтов" (или даже "для раскручивания форумов"). Идиотская хреновина phpAdmin - тоже "оттуда" (полоумный внучек ;) )
Только оно все - такое "занудно-большое" (и все обычно было для HTML4 )

хочеш новый напишым? с xhtml, с аджаксом и с сабскрипшен
листом который действительно че-то делаит (RSS фид вместо
клаент пулла - штоб не надо было сидеть и жать F5 как бобегу)

crazy-mike
09-28-2007, 10:59 AM
хочеш новый напишым? с xhtml, с аджаксом и с сабскрипшен
листом который действительно че-то делаит (RSS фид вместо
клаент пулла - штоб не надо было сидеть и жать F5 как бобегу)
;) Я вообще удивляюсь - почему никто чего-то такого не написал. На самом деле это сравнительно несложно (и может быть поэтому такое вообще невозможно продать - только приложения с его использованием). Просто очень тоскливо листать книжки с очень тоскливыми и глупыми примерами "неправильного программирования" (даже на том же php) - книжки правда очень толстые (страниц на 700) - большая часть каждой страницы является "копией экрана" с редактора DreamWeaver. Мне кажется - что любой квалифицированный пользователь мог бы просто настроить себе IBM Visual Age или что-то похожее для такой работы (и даже написать несколько макрокоманд и панелек для MS Word).
:grum: Меня на всё это "повело" только тогда - когда стало нужным контролировать несколько служебных веб-сайтов одновременно.
Самое прикольное - написать его прямо внутри постов трида (с коммнетариями :grum: ). Тогда посещаемость - "зашкаливать" начнет...

crazy-mike
09-29-2007, 09:00 AM
Забавный "глюк-трюк" в php5: ;) Можно пользоваться в одном классе можно пользоваться внутренними методами другого класса если они оба наследуют один и тот же класс:
<?

abstract class xhtmlObj {
abstract public function is();
abstract public function add(xhtmlObj $v);
}

class xhtml extends xhtmlObj {
private $p;
public function __construct($v)
{ $this->p=$v;
}

final public function add(xhtmlObj $v)
{ $this->p.=$v->is();
}

final public function is()
{ $q=$this->p; return $q;
}

public function attach()
{ $n=func_num_args();
$i=0;
while($i<$n) {
$a=func_get_arg($i);
$i++;
$this->add($a);
};
}
}


class javaScript extends xhtmlObj {
private $p;
public function __construct($v="") {
$this->p='<script type="text/javascript" language="Javascript">';
$this->p.="\n";
$this->p.="// <![CDATA[\n";
$this->p.=$v;
}

final public function cat($v)
{ $this->p.="\n".$v;
}

final public function add(xhtmlObj $v)
{ $this->p.=$v->is();
}

final public function is()
{ $q=$this->p;
$q.="\n";
$q.="// ]]>\n";
$q.='</script>'; return $q;
}
}

class xhtmlHead extends xhtmlObj {
private $p;

public function __construct($tit) {
$this->p='<head>';
$this->p='<meta http-equiv="Content-Type" content="text/html; ';
$this->p.=' charset=koi8-u; lang=uk">';
$this->p.='<title>'.$tit.'</title>';
}

final public function add(xhtmlObj $v)
{ $this->p.=$v->is();
}

final public function is()
{ $q=$this->p.'</head>'; return $q;
}

}

class xhtmlBody extends xhtmlObj {
private $p;

public function __construct($zclass="",$style="",$onload="")
{ $this->p='<body ';
if($zclass!='') $this->p.='class="'.$zclass.'" ';
if($style!='') $this->p.='style="'.$style.'" ';
if($onload!='') $this->p.='onload="'.$onload.'" ';
$this->p.='>';
}

final public function cat($v)
{ $this->p.=$v;
}

final public function add(xhtmlObj $v)
{ $this->p.=$v->is();
}

final public function is()
{ $q=$this->p.'</body>'; return $q;
}
}

class xhtmlTag extends xhtmlObj {
private $p;
private $ztag;
private $attr;
private $addon;

function __construct($v,$qv=NULL)
{ $this->ztag=$v; $this->attr=array();
$this->p=''; if($qv!=NULL) $this->p=$qv;
$this->addon='';
}

final public function setA($name,$val)
{ $this->attr[$name]=$val;
}

final public function setC($val)
{ $this->addon.=' '.$val;
}

final public function setAV($ar)
{ foreach($ar as $name => $val) $this->setA($name,$val);
}


final public function cat($v)
{ $this->p.=$v;
}


final public function add(xhtmlObj $v)
{ $this->p.=$v->is();
}

final public function attach()
{ $n=func_num_args();
$i=0;
while($i<$n) {
$a=func_get_arg($i);
$i++;
$this->add($a);
};
}

final public function is()
{ $au=array_keys($this->attr);
$n=count($au);
$i=0; $d2='</'.$this->ztag.'>';
$d1='<'.$this->ztag;
while($i<$n) { $k=$au[$i]; $v=$this->attr[$k];
$d1.=' '.$k.'="'.$v.'"'; $i++;
};
$d1.=$this->addon;
if($this->p=='') { $d1.=' />'; $q=$d1; }
else {
$d1.=" >"; $q=$d1.$this->p.$d2;
};
return $q;
}

}



class xhtmlPage extends xhtmlObj {
public $p;

private function prologue() {
$this->p='<?xml version="1.0" encoding="koi8-u" ?>';
$this->p.='<!DOCTYPE HTML PUBLIC ';
$this->p.='"-//W3C/DTD XHTML 1.0 Transitional//EN" ';
$this->p.='"http://www.w3.org/TR/xhtmml1/DTD/xhtml1-transitional.dtd">';
$this->p.='<html xmlns=http://www.w3.org/1999/xhtml xml:lang="uk" lang="uk">';
}

public function __construct(xhtmlHead $a=NULL,xhtmlBody $b=NULL)
{ $this->prologue();
if($a!=NULL) $this->add($a);
if($b!=NULL) $this->add($b);
}

public function is()
{ $q = $this->p.'</html>';
return $q;
}

final public function add(xhtmlObj $v)
{ $this->p.=$v->is();
}

final public function see()
{ echo $this->is();
}
}

class xhtmlStyle extends xhtmlTag {
public function __construct($v) {
xhtmlTag::__construct('style');
$this->setA('type','text/css');
$this->setA('media','all');
$this->cat($v);
}
}

class xhtmlImg extends xhtmlTag {
public function __construct($fn)
{ xhtmlTag::__construct('img');
$this->setA('src',$fn);
}
}

class xhtmlA extends xhtmlTag {
public function __construct($href,$txt='')
{ xhtmlTag::__construct('a',$txt);
$this->setA('href',$href);
}
}

class xhtmlExt extends xhtmlTag {
public function __construct($ztag,$id='',$zclass='',$zstyle='',$mo usev=NULL)
{ xhtmlTag::__construct($ztag);
if($id!='') $this->setA('id',$id);
if($zclass!='') $this->setA('class',$zclass);
if($zstyle!='') $this->setA('style',$zstyle);
if($mousev!=NULL) {
foreach($mousev as $k => $v) $this->setA($k,$v);
};
}
}

class xhtmlTd extends xhtmlTag {
public function __construct(
$dd='',$id='',$zclass='',$zstyle='',$mousev=NULL)
{ xhtmlExt::__construct('td',$id,$zclass,$zstyle,$mo usev);
if($dd!='') $this->cat($dd);
}
}

class xhtmlTr extends xhtmlTag {
public function __construct($id='',$zclass='',$zstyle='',$mousev=N ULL)
{ xhtmlExt::__construct('tr',$id,$zclass,$zstyle,$mo usev);
}
public function catArray($ax)
{ $n=count($ax);
$i=0;
while($i<$n) { $qq=$ax[$i]; $this->cat($qq); $i++; };
}

public function td()
{ $n=func_num_args();
$i=0;
while($i<$n) {
$a=func_get_arg($i);
$i++;
$this->add($a);
};
}

function dummyHN($n)
{ $i=0;
while($i<$n) { $i++; $this->cat('<th>'.$i.'</th>'); };
}
}

class xhtmlThead extends xhtmlTag {
public function __construct($hdrs,$addend='',$fmt=NULL)
{ xhtmlTag::__construct('thead');
$tr=new xhtmlTr();
$i=0; $n=count($hdrs);
while($i<$n) { $qq=$hdrs[$i];
if($fmt==NULL) $td=new xhtmlTd($qq);
else {
$ds=$fmt[$i]; $td=new xhtmlTd(); $td->setC($ds);
};
$tr->add($td);
$i++;
};
$this->add($tr); $this->cat($addend);
}
}

class xhtmlTbody extends xhtmlTag {
public function __construct()
{ xhtmlTag::__construct('tbody');
}
}

class xhtmlTable extends xhtmlTag {
public function __construct($capt='',xhtmlThead $thead=NULL,
xhtmlTbody $tbody=NULL
)
{ xhtmlTag::__construct('table');
if($capt!='') $this->cat('<caption>'.$capt.'</caption>');
if($thead!=NULL) $this->add($thead);
if($tbody!=NULL) $this->add($tbody);
}
}

class xhtmlForm extends xhtmlTag {
public function __construct($zname,$action,$method="post",$charset="koi8-u")
{ xhtmlTag::__construct('form');
$this->setA('name',$zname); $this->setA('id',$zname);
$this->setA('method',$method); $this->setA('action',$action);
$this->setA('accept-charset',$charset);
}
}

class xhtmlInput extends xhtmlTag {
public function __construct($ztype,$zname,$zvalue='',$zsize=0)
{ xhtmlTag::__construct('input');
$this->setA('name',$zname); $this->setA('id',$zname);
if($zvalue!='') $this->setA($zvalue);
if($zsise!=0) $this->setA($zsize);
}
}

class myApp extends xhtmlBody {
public function __construct()
{ xhtmlBody::__construct('qbody');
// Irreality rules Just Cool:
xhtml::attach(
new xhtmlExt('h2','Hello!'),
new xhtmlExt('div','PHP5 rules cool!')
);
}
}

class myApH extends xhtmlHead {
public function __construct()
{ xhtmlHead::__construct('Cool!');
$this->add(
new xhtmlStyle('@import url("./sty/my.css");')
);
}
}


class myPage extends xhtmlPage {
public function __construct()
{ xhtmlPage::__construct(
new myApH('Cool'),
new myApp()
);
$this->see();
}
}

$p=new myPage();

?>
:grum: Интересно - как бы выглядела Windows если бы ее разрабатывали во Франции? (постоянно действующая PHP DevCon вроде бы находится в Париже)
В описанном случае метод класса xhtml используется в классе - который не является потомком класса xhtml - xhtmlBody наследует только xhtmlObj , но метод attach класса xhtml действует на внутренние данные класса xhtmlBody!!!!!!!!
При всем этом - если бы метод attach был бы описан внутри класса xhtmlObj - это бы никаких мысленных сомнений и неоднозначностей не вызывало.

maddmr
09-29-2007, 11:45 AM
толстого колбасит не по-детски

YUM
09-29-2007, 01:14 PM
...Тогда посещаемость - "зашкаливать" начнет...А я смотрю вниз страницы и удивляюсь! Каким образом на форуме рекорды посещаемости ставят? Больше 5 000 человек зараз!
А тут оно воно что. :grum:

Elric
09-30-2007, 10:59 PM
у меня была бессоница но вы ее вылечили - спасибо огромное :)

crazy-mike
10-02-2007, 12:24 AM
у меня была бессоница но вы ее вылечили - спасибо огромное :)
Программирование - это так скучно? :evillaugh
Application Developement (тупое написание по спецификациям) - в самом деле "тоска зеленая". Только с ООП это можно все сделать "менее тоскливым занятием" (а при определенных условиях - менее трудоемким). Конечно же может возникнуть вопрос: "Зачем весь этот садомазохизм - если есть "редакторы интерфейсов"? Вариантов ответов - кстати - довольно много. Одна из основных причин - все эти графические редакторы сами превращаются в своеобразные "системы программирования" - которые нужно изучать дополнительно. Если внутри такого редактора какую-нибудь штуковину с кодом приложения нельзя сделать - то это совсем не означает , что ее нельзя сделать вообще. Наконец - RAD-системы просто генерируют в высшей степени неоптимальный код. Кроме того RAD-системы и системы управления проектами - вообще-то являются разными системами. Не стоит - конечно же - забывать и о "переносимости приложения".
В посте http://forum.russianamerica.com/f/showpost.php?p=1906492&postcount=12 базовая идея немного сильнее конкретизирована и добавлены дополнительные методы для работы с переменным числом параметров. Причем - когда в качестве параметров используются ассоциативные массивы - код становится намного более кратким и выразительным.
Например строку в таблицу можно добавить примерно как:
$tab->add(
new Tr(
new Td(...),.....new Td()
)
);

А обработчик событий на JavaScript привязать к создаваемому элементу примерно как:

new myHtmlExt('div','', new array ('onmouseover' => 'fn1()' , 'onmouseout' => 'fn2()' , 'onclick' => 'fn3()' ) )

Sixteen
10-02-2007, 01:15 PM
да че тут. не любют девушки нашу профессию.
не уважают они программистов совсем. иногда это злит.
но ваще - напиливать и забить.

crazy-mike
10-03-2007, 10:45 AM
да че тут. не любют ...
но ваще ...
class xhtmlTd extends xhtmlTag {
public function __construct(
$dd='',$id='',$zclass='',$zstyle='',$mousev=NULL)
{ xhtmlExt::__construct('td',$id,$zclass,$zstyle,$mo usev);
if($dd!='') $this->cat($dd);
}
}
;) Мистическая загадочность объектного расширения PHP5. Если бы было написано:
class xhtmlTd extends xhtmlExt
то никакой загадочности бы не возникало. Тем не менее все вышеуказанное - работает!!!!!!
Vive L'France! :grum:

Sixteen
10-03-2007, 11:10 AM
даааа.
обработчик событий для меня так дико звучит, ващееее!
я тута привык к ивент хендлерам, а тут вдруг абработчег сабытий.
странно што они его не назвали реактором.

crazy-mike
10-03-2007, 11:30 AM
даааа.
обработчик событий для меня так дико звучит, ващееее!
я тута привык к ивент хендлерам, а тут вдруг абработчег сабытий.
странно што они его не назвали реактором.
Для Event Handler - вариант "обработчик событий" является практически стандартным переводом со времён "перевода книг о Turbo Vision" (даже еще раньше - когда Фролов и Оюнин писали книги о PL/1 O). А если хочется столкнуться с по-настоящему экзотической терминологией - то можно попробовать найти книги В.Весёлов о системе "Мастер" . Мне всегда казалось - что это адаптация "Framework-2" (или "Framework-3") для "советских перестроечных персональных компьютеров". Но на на Comtec-93 на их стенде представитель "бурно" пытался доказать "оригинальность их собственной разработки". Там еще был загадочный экранный редактор (word processor) - "Лексикон для Windows". Там кого угодно могло "заколбасить" от термина "охватывающая рамка". :grum:
Чтобы совсем "умереть от смеха" достаточно увидеть как "thread" переводят на русский как "поток". - Самое смешное будет - когда такую книгу обратно с русского на английский перевести. Англоязычный автор в этом случае своего авторства доказать вообще не сможет. :grum:

Sixteen
10-03-2007, 11:33 AM
Для Event Handler - вариант "обработчик событий" является практически стандартным переводом со времён "перевода книг о Turbo Vision" (даже еще раньше - когда Фролов и Оюнин писали книги о PL/1 O). А если хочется столкнуться с по-настоящему экзотической терминологией - то можно попробовать найти книги В.Весёлов о системе "Мастер" . Мне всегда казалось - что это адаптация "Framework-2" (или "Framework-3") для "советских перестречных персональных компьютеров". Но на на Comtec-93 на их стенде представитель "бурно" пытался доказать "оригинальность их собственной разработки". Там еще был загадочный экранный редактор (word processor) - "Лексикон для Windows". Там кого угодно могло "заколбасить" от термина "охватывающая рамка". :grum:

охватываюсчая рамка это круто. а как они переводят слово фреймворк на русский язык? я тут узнал что в россии биос называют бивисом и афегел тожы.

crazy-mike
10-03-2007, 11:38 AM
охватываюсчая рамка это круто. а как они переводят слово фреймворк на русский язык? я тут узнал что в россии биос называют бивисом и афегел тожы.
Они теперь смешивают понятия "framework" и "operating environement". В результате после перевода смысл книги может очень сильно измениться. И "framework" и "operating environement" пытаются переводить словом "среда" или выражением "операционная среда". (что - вообще говоря - неверно).

crazy-mike
10-06-2007, 05:09 AM
http://forum.russianamerica.com/f/showpost.php?p=1906492&postcount=12
;)
Любопытно - что в указанном примере не используется даже
parent::__construct(....)
Но даже в таком виде это работает. Мало того - вроде бы будет работать с непредсказуемыми результатами даже при использовании конструкторов из совсем другого класса - который не связан наследованием с текущим классом.
(constraints - к ним как-то леволиберально относятся :grum: )
Определенной хронической загадочностью обладают вычисления с плавающей точкой внутри php5. По крайней мере $x * $x <> power($x,2) (в некоторых случаях)

crazy-mike
10-06-2007, 07:54 AM
По крайней мере $x * $x <> power($x,2) (в некоторых случаях)
pow($x,2) != $x*$x (иногда бывает даже такое)

crazy-mike
10-08-2007, 12:43 AM
Конечно же объекты в PHP5 можно использовать и немного другим способом.
Например вот так (экранирование wml):
<?
class wap {

static final function Begin() {
header("Content-type: text/vnd.wap.wml");
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<!DOCTYPE wml PUBLIC "-//WAPFORUM/DTD WML 1.3//EN" ';
echo '"http://www.wapforum.org/DTD/wml13.dtd">';
echo "<wml>";
echo "<head>";
echo '<meta http-equiv="Cache-Control" ';
echo 'content="no-cache" forua="true" />';
echo '<style type="text/css" >';
echo '.xx { background :#fffc00; }';
echo '</style>';
echo "</head>";
}

static final function Table($label,$columns)
{ echo '<table title="'.xutf8::toUTF8($label).'" ';
echo 'columns="'.$columns.'" >';

}

static final function Tr() { echo '<tr>'; }
static final function Td($d) {
echo '<td>'.xutf8::toUTF8($d).'</td>';
}
static final function EndTr() { echo '</tr>'; }

static final function At($xgo,$xsee)
{ $q='<a href="'.$xgo.'">'.$xsee.'</a>';
return $q;
}

static final function EndTable()
{ echo '</table>';
}

static final function Input($label,$name,$val)
{ echo xutf8::toUTF8($label);
echo '<input name="'.$name.'" value="'.xutf8::toUTF8($val).'" />';
}

static final function Br()
{ echo "<br />";
}

static final function Card($id,$tit)
{ echo '<card id="'.$id.'" class="xx" title="'.xutf8::toUTF8($tit).'">';
}

static final function EndCard()
{ echo '</card>';
}

static final function Select($id,$vx)
{ echo '<select name="'.$id.'" >';
$n=count($vx);
$i=0;
while($i<$n) {
$a=$vx[$i]; $i++;
$opt=$a[0]; $v=$a[1];
echo '<option value="'.xutf8::toUTF8($a).'" >';
echo xutf8::toUTF8($v).'</option>';
};
echo "</select>";
}

static final function Send($label,$act,$pf)
{ echo '<do label="'.xutf8::toUTF8($label).'" type="accept">';
echo '<go href="'.$act.'" method="post" >';
$n=count($pf);
$i=0;
while($i<$n) {
$aa=$pf[$i]; $i++;
$na=$aa[0]; $va=$aa[1];
echo '<postfield name="'.$na.'" value="'.$va.'" />';
};
echo '</go></do>';
}


static final function End() {
echo "</wml>";
}

}
?>

Чего-то такого вполне достаточно для написания "очень тупых" wap-сайтов.
<?
wap::Begin();
wap::Card('hi','Hello!');
echo At('yoprst.php','Go here!');
wap::EndCard();
wap::End();
?>

Основная идея все равно остаётся прежней - на PHP фактически пишется компилятор представления задачи.

crazy-mike
10-08-2007, 12:49 AM
;) КОИ8-У - это довольно шизофреническая модификация koi8-r для украинского языка. Здесь подразумевалось - что "родная кодировка" - это KOI8-U.
На самом деле все работает для любой однобайтовой кодировки. С кирилицей на UTF8 большинство WAP-броузеров работает нормально. Здесь используется идиотски-приятная особенность определения ассоциативных массивов в PHP. Поэтому можно "почти" не обращать внимания на особенности числового представления символов.
<?
// koi8-u to utf-8 translation
class xutf8 {
static $rev=array(
"d090" => 'А', "d091" => 'Б', "d092" => 'В' ,
"d093" => 'Г', "d094" => 'Д', "d095" => 'Е' ,
"d096" => 'Ж', "d097" => 'З', "d098" => 'И' ,
"d099" => 'Й', "d09a" => 'К', "d09b"=> 'Л' ,
"d09c" => 'М', "d09d" => 'Н', "d09e" => 'О',
"d09f" => 'П', "d0a0" => 'Р', "d0a1" => 'С',
"d0a2" => 'Т', "d0a3" => 'У', "d0a4" => 'Ф',
"d0a5" => 'Х', "d0a6" => 'Ц', "d0a7" => 'Ч',
"d0a8" => 'Ш', "d0a9" => 'Щ', "d0aa" => 'Ъ',
"d0ab" => 'Ы', "d0ac" => 'Ь', "d0ad" => 'Э',
"d0ae" => 'Ю', "d0af" => 'Я', "d0b0" => 'а',
"d0b1" => 'б', "d0b2" => 'в', "d0b3" => 'г',
"d0b4" => 'д', "d0b5" => 'е', "d0b6" => 'ж',
"d0b7" => 'з', "d0b8" => 'и', "d0b9" => 'й',
"d0ba" => 'к', "d0bb" => 'л', "d0bc" => 'м',
"d0bd" => 'н',"d0be" => 'о', "d0bf" => 'п',
"d1x80" => 'р',"d181" => 'с', "d182" => 'т',
"d183" => 'у' ,"d1\x84" => 'ф',"d185" => 'х',
"d186" => 'ц',"d187" => 'ч', "d188" => 'ш',
"d189" => 'щ',"d18a" => 'ъ', "d18b" => 'ы',
"d18c" => 'ь',"d18d" => 'э', "d18e" => 'ю',
"d18f" => 'я', "d084" => 'Є', "d194" => 'є',
"d087" => 'Ї', "d197" => 'ї', "d086" => 'І',
"d196" => 'і'
);
static $abc=array(
'А' => "\xd0\x90", 'Б' => "\xd0\x91",'В' => "\xd0\x92",
'Г' => "\xd0\x93", 'Д' => "\xd0\x94",'Е' => "\xd0\x95",
'Ж' => "\xd0\x96", 'З' => "\xd0\x97",'И' => "\xd0\x98",
'Й' => "\xd0\x99", 'К' => "\xd0\x9a",'Л' => "\xd0\x9b",
'М' => "\xd0\x9c", 'Н' => "\xd0\x9d", 'О' => "\xd0\x9e",
'П' => "\xd0\x9f", 'Р' => "\xd0\xa0",'С' => "\xd0\xa1",
'Т' => "\xd0\xa2", 'У' => "\xd0\xa3",'Ф' => "\xd0\xa4",
'Х' => "\xd0\xa5", 'Ц' => "\xd0\xa6",'Ч' => "\xd0\xa7",
'Ш' => "\xd0\xa8", 'Щ' => "\xd0\xa9",'Ъ' => "\xd0\xaa",
'Ы' => "\xd0\xab", 'Ь' => "\xd0\xac",'Э' => "\xd0\xad",
'Ю' => "\xd0\xae", 'Я' => "\xd0\xaf",'а' => "\xd0\xb0",
'б' => "\xd0\xb1", 'в' => "\xd0\xb2",'г' => "\xd0\xb3",
'д' => "\xd0\xb4", 'е' => "\xd0\xb5",'ж' => "\xd0\xb6",
'з' => "\xd0\xb7", 'и' => "\xd0\xb8",'й' => "\xd0\xb9",
'к' => "\xd0\xba", 'л' => "\xd0\xbb",'м' => "\xd0\xbc",
'н' => "\xd0\xbd", 'о' => "\xd0\xbe",'п' => "\xd0\xbf",
'р' => "\xd1\x80", 'с' => "\xd1\x81",'т' => "\xd1\x82",
'у' => "\xd1\x83", 'ф' => "\xd1\x84",'х' => "\xd1\x85",
'ц' => "\xd1\x86", 'ч' => "\xd1\x87",'ш' => "\xd1\x88",
'щ' => "\xd1\x89", 'ъ' => "\xd1\x8a",'ы' => "\xd1\x8b",
'ь' => "\xd1\x8c", 'э' => "\xd1\x8d",
'ю' => "\xd1\x8e", 'я' => "\xd1\x8f", 'Є' => "\xd0\x84",
'є' => "\xd1\x94", 'Ї' => "\xd0\x87",
'ї' => "\xd1\x97", 'І' => "\xd0\x86",
'і' => "\xd1\x96"
);

static final function toUTF8($v)
{ $t='';
$d=strlen($v);
$i=0;
while($i<$d) {
$q=$v{$i};
if(array_key_exists($q,xutf8::$abc)) $q=xutf8::$abc[$q];
$t.=$q;
$i++;
};
return $t;
}

static final function toKOI8($v)
{ $ta='';
$n=strlen($v);
$i=0;
while($i<$n) {
$q=$v{$i}; $i++;
$bb="?";
$t=bin2hex($q);
if($t=="d0") $bb=$t;
if($t=="d1") $bb=$t;
if($bb!="?") {
$q=$v{$i}; $i++; $bb.=bin2hex($q);
$qv=xutf8::$rev[$bb];
$ta.=$qv;
} else $ta.=$q;
};
return $ta;
}
}
?>

crazy-mike
10-13-2007, 01:41 AM
Самое прикольное в классах myxhtml (у меня такой файл называется myxhtml.php) - это возможность использования метода is().
http://forum.russianamerica.com/f/showpost.php?p=1906492&postcount=12
abstract class xhtmlObj {
abstract public function is();
abstract public function add(xhtmlObj $v);
}
Метод is() во всех классах-потомках возвращал символьную строку с текстом html-странички. Не следует забывать о том , что PHP - это ведь интерпретатор. Если рассматривать метод is() - как результат работы компилятора из языка описания объектов в html , то возникает закономерная идея сохранения результатов работы компиляции. Это конечно же можно сделать в БД. Но можно и нахальнее - организовать доступ к каталогу сайта по ftp и записывать прямо туда созданную страничку по
$f=fopen("ftp://anywhere:something@my,host.anywhere/result.html","w"); fwrite($f,$resultobj->is()); fclose($f);
И контент становится статическим - и можно на хостинге с поддержкой PHP изменять данные на хостинге без поддержки PHP.

crazy-mike
10-16-2007, 01:23 AM
;)
А в PHP5 включили в ядро поддержку класса DOMDocument c кучей приятных функций. Вообще-то почти всё из предидущих постов можно было выразить через extends DOMDocument. ;) ;)

crazy-mike
10-16-2007, 03:24 AM
;)
А в PHP5 включили в ядро поддержку класса DOMDocument c кучей приятных функций. Вообще-то почти всё из предидущих постов можно было выразить через extends DOMDocument. ;) ;)
Работать-то они работают. Только перед употреблением текст лучше перекодировать в UTF-8 из KOI8-R. ;) Иначе - почему-то возникает "ошибка преобразования кодировки". Но конечно-же это принципиального значения не играет...(все можно "экранировать")

maddmr
10-16-2007, 03:53 AM
;)
А в PHP5 включили в ядро поддержку класса DOMDocument c кучей приятных функций. Вообще-то почти всё из предидущих постов можно было выразить через extends DOMDocument. ;) ;)

Работать-то они работают. Только перед употреблением текст лучше перекодировать в UTF-8 из KOI8-R. ;) Иначе - почему-то возникает "ошибка преобразования кодировки". Но конечно-же это принципиального значения не играет...(все можно "экранировать")
я вам не мешаю?

crazy-mike
10-16-2007, 05:13 AM
я вам не мешаю?
чем? Внутри Ваших постов ведь рекламы нет...:bis:

maddmr
10-16-2007, 05:16 AM
чем? Внутри Ваших постов ведь рекламы нет...:bis:
Ну слава богу...
вы разговаривайте, разговаривайте, я слушаю

crazy-mike
10-18-2007, 04:14 AM
Дополнительный шизо-нюанс:
в рассматриваемой модели для отображения системы объектов на XHTML достигаются довольно удобные вещи:
Можно "сначала все посчитать" - а потом "вывести в любом порядке" вычисленные значения. А на компоновку страницы порядок вычисления вообще не влияет. ;) ;) ;)

ray315
10-18-2007, 06:36 AM
Господа специалисты, подскажите, плиз. Мне нужно на сайт драгоценные металлы (http://www.preciousmetals.ru) установить кнопки управления. Как можно это сделать? Сайт сделан на php.

crazy-mike
10-18-2007, 08:16 AM
Господа специалисты, подскажите, плиз. Мне нужно на сайт драгоценные металлы (http://www.preciousmetals.ru) установить кнопки управления. Как можно это сделать? Сайт сделан на php.
;) :evillaugh Вам понятие Copyright знакомо? :grum: Похожие действия без разрешения разработчика могут повлечь примерно 25 лет тюрьмы (кажется в США).
;) Вообще-то нужно иметь доступ на сервер , где находится сайт. И т.д. :grum:
<HTML>
<HEAD>
<TITLE>Драгоценные металлы - Рынок драгоценных металлов</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=windows-1251">
<META name="description" content="Драгоценные металлы - рынок драгоценных металлов">
<META name="keywords" content="котировки драгоценных металлов, драгоценные металлы цены">
<LINK href="css/style.css" type=text/css rel=stylesheet>
</HEAD>

<BODY>

<!------------------ Шапка -------------------->
<TABLE width="100%" cellpadding="0" cellspacing="0" border="0">
<TR height="70" vAlign="middle">
<TD width="770" background="img/logo.gif">
<DIV class="slogan">Драгоценный запас России</DIV>
</TD>
<TD width="%" background="img/top-bg.gif">&nbsp;</TD>
</TR>
</TABLE>
<!------------------ /Шапка -------------------->

<TABLE width="100%" cellpadding="0" cellspacing="0" border="0">
<TR height="247">
<TD width="770" background="img/creative.jpg" align="left">
<DIV class="info-title">Драгоценные металлы - </DIV>
<DIV class="info-text">
Российский рынок драгоценных металлов является весьма богатым, т.к. в России огромные запасы полезных ископаемых. Отечественный рынок является экспортно-ориентированным – добываемых драгоценных металлов хватает не только на обеспечение своих нужд, но еще и для довольно массовой продажи другим странам<br>
<BR>
<A href="index.php"><IMG SRC="img/button.gif" WIDTH="125" HEIGHT="30" BORDER="0" ALT="Драгоценные металлы"></A>
</DIV>
</TD>
<TD width="%" background="img/crea-bg.gif">&nbsp;</TD>
</TR>

<TR height="40">
<TD colspan="2" background="img/menu-bg.gif">
<!------------------ /Меню -------------------->
<TABLE width="100%" cellpadding="0" cellspacing="0" border="0">
<TR vAlign="top" height="40">
<TD width="25%" background="img/menu-bg.gif" align="center"><DIV class="menu"><A HREF="index.php" class="menu">Главная</A></DIV></TD>
<TD width="6"><IMG SRC="img/menu2.gif" WIDTH="6" HEIGHT="40" BORDER="0" ALT=""></TD>
<TD width="25%" background="img/menu-bg.gif" align="center"><DIV class="menu"><A HREF="kategoriya1.php" class="menu">Палладий</A></DIV></TD>
<TD width="6"><IMG SRC="img/menu2.gif" WIDTH="6" HEIGHT="40" BORDER="0" ALT=""></TD>
<TD width="25%" background="img/menu-bg.gif" align="center"><DIV class="menu"><A HREF="kategoriya2.php" class="menu">Серебро</A></DIV></TD>
<TD width="6"><IMG SRC="img/menu2.gif" WIDTH="6" HEIGHT="40" BORDER="0" ALT=""></TD>
<TD width="25%" background="img/menu-bg.gif" align="center"><DIV class="menu"><A HREF="kategoriya3.php" class="menu">Золото</A></DIV></TD>
</TR>
</TABLE> <!------------------ /Меню -------------------->
</TD>
</TR>
</TABLE>
<TABLE width="100%" cellpadding="0" cellspacing="0" border="0">
<!------------------ Контент -------------------->
<TR height="100" vAlign="top">
<TD width="280" align="left" class="reklama">
<DIV class="news">
<H1>
<!-- Заголовок для блока новостей -->
Тематические новости

<!-- Конец заголовка для блока новостей -->

</H1>

<!-- Содержимое блока новостей-->

В связи со стратегической ценностью данного товара для государства, считается, что рынок драгоценных металлов должен строго регулироваться законодательством. Это является необходимым во всех цивилизованных странах, и в России также</p>
<DIV class="lnk"><a class="lnk" href="index.php">подробнее</a>

<!-- Конец содержимого блока новостей-->


<BR><BR><!--
<B>
Мы рекомендуем:
</B><BR><BR>
Здесь <a href="#">рекламные ссылки</a> на нужные сайты
--> <p></p><BR>
</TD>

<TD colspan="2" width="%" class="content">
<DIV class="title"><H1>Главная. Рынок драгоценных металлов.</H1></DIV>
<DIV class="text">
......
<!-- Конец содержимого подвала --></DIV></TD>
</TR>
</TABLE>
<!------------------ /Копирайт -------------------->

</BODY>
</HTML>
Все "вот это" является "результатом работы" какого нибуть скрипта (index.php, index.phtml и т.д.). Часто существуют дополнительно "конфигураторы сайтов" (такие как "мастерская" на narod.ru). В этом случае - надо входить "оттуда" (обычно по паролю) и "вносить изменения в проект"...В приведенном фрагменте - достаточно было вставить одну клеточку таблицы <TD>...</TD>. Переходы вообще-то сделаны достаточно глупо по <a href> внутри клеток таблицы. Можно было все прятать в <button onclick=...> или <div onclick=... и даже в <form>. тега !DOCTYPE просто почему-то вообще нет. А об XHTML разработчики кажется вообще не слышали.

crazy-mike
10-19-2007, 07:07 AM
;) === -это самый прикольный из "французских поцелуев" в PHP5. - Данные проверяются на равенстов по типу и значению одновременно!!!!! :grum: (но так упорно отказываться внедрить в язык строгую типизацию ... :crazy: )

Sixteen
10-19-2007, 08:22 AM
вапрос.

может ли php загрузить шаред обьект типа со файла или на виндоузах диэлэла, и вызвать из них какую нибудь экспортнутую функцию?

crazy-mike
10-19-2007, 09:07 AM
вапрос.
может ли php загрузить шаред обьект типа со файла или на виндоузах диэлэла, и вызвать из них какую нибудь экспортнутую функцию?
самое прикольное - что может...(только чуточку помучаться надо. Это в Regina REXX классно сделано)
но можно ещё проще делать - открывать любой исполняемый файл по popen. - я так делаю...
:grum:

Sixteen
10-19-2007, 09:08 AM
самое прикольное - что может...
но можно ещё проще делать - открывать любой испольняемый файл по popen.
:grum:

не, исполняемый фаел мне не надо. мне надо длл.
и вызвать фюнкцию.

что раздражает, пачему джава этого не может.
и дот.нет. они со своими вертухальным машынами софсем офегели.

crazy-mike
10-19-2007, 09:20 AM
что раздражает, пачему джава этого не может.
и дот.нет. они со своими вертухальным машынами софсем офегели.
Java как раз все это может (я такие dll под JDK 1.3 когда-то писал).
:evillaugh Constraint Programming - доминирующая идеология. Там смешивание различных сред выполнения принципиально не рекомендуется. Вообще-то существуют компиляторы с PHP в C++ и с Java в С++ (gcj - хотя бы)...

Sixteen
10-19-2007, 09:22 AM
Java как раз все это может (я такие dll под JDK 1.3 когда-то писал).

это ты про JNI говоришь? или про любой длл?
я ковырялся когда-то с фиговиной которая обещала что COM обьекты
будет загружать в жабу, но фиговина была настолько мерзкая что
я ее бросил нафиг.

crazy-mike
10-19-2007, 12:30 PM
это ты про JNI говоришь?
Я всё когда-то делал под JNI внутри win32 с использованием bcc32a (Borland C++ 5.2)

Sixteen
10-19-2007, 08:36 PM
Я всё когда-то делал под JNI внутри win32 с использованием bcc32a (Borland C++ 5.2)

a я то подумал что ты стандартный длл в жабе запустил,
обрадовался ужо

crazy-mike
10-20-2007, 12:02 AM
a я то подумал что ты стандартный длл в жабе запустил,
обрадовался ужо
;) Как-будто из "нестандартного" по LoadLibrary нельзя запустить "стандартный" и "тихо радоваться" :grum:
:evillaugh Не все dll одинаково полезны... :grum:
Но самое смешное - что объектно-ориентированный php в самом деле очень сильно похож на Java. Хотя когда-то "начинался" как что-то достаточно "тупое"...От Java он отличается "отсутствием диктаторских замашек" - пишите как вам нравится , но и результат получите - соответствующий...
Там даже компилятор в байт-коды есть (правда его поддержку надо задавать при компиляции всего пакета php)

crazy-mike
10-20-2007, 02:45 PM
Сегодня обманул всю подсистему PHP для класса DOMDocument.
У неё основной недостаток - узлы данных с кирилицей. При этом они еще и обрабатывают #&x4001 и т.д. (пытаются перекодировать литеральные константы). Написал маленький статический класс для "временной перекодировки кирилицы" в что-то похожее на _4001; и т.д. И всё это только для использования DOMDocument (ну не хочется в БД держать информацию о структуре каждой страницы сайта). :grum:

Lor
10-20-2007, 03:04 PM
Perl рулит всех, как Тузик грелку и батон докторской колбасы.

А PHP хорош только для хакеров, потому как расковыривается любым "пионэром-кулхацкером" за полчаса.

crazy-mike
10-22-2007, 12:25 AM
Perl рулит всех, как Тузик грелку и батон докторской колбасы.
А PHP хорош только для хакеров, потому как расковыривается любым "пионэром-кулхацкером" за полчаса.
Java - это даже особенно сильно "расковыривать" не надо. Просто отладчик запустить(для апплетов - правда).
"Расковыривается за полчаса" - это все же явное преувеличение. Для "расковыривания" надо "залезть на сервер". Имеется ввиду и то - что результаты "расковыривания" вообще-то могут быть неоднозначными.

Sixteen
10-22-2007, 12:43 PM
;) Как-будто из "нестандартного" по LoadLibrary нельзя запустить "стандартный" и "тихо радоваться" :grum:
:evillaugh Не все dll одинаково полезны... :grum:


для того чтобы запустить стандартный длл из нестандартного,
надо сначала написать нестандартный (JNI) длл. кароче жаба
этого не может. правда надо признать что она этого по замыслу
не может, так как такие языки как VB это могут но с часто непредсказуемыми результатами. но все равно, лично мне эта
неспособность загрузить DLL напрямую мешает жить сильно.

Sixteen
10-22-2007, 12:45 PM
Perl рулит всех, как Тузик грелку и батон докторской колбасы.

А PHP хорош только для хакеров, потому как расковыривается любым "пионэром-кулхацкером" за полчаса.

разборки в компьютерноэлектронном форуме находятся на маратории.
поэтому мы не будет тута выяснять что круче, перл-5 или ОО-PHP.
потому что круче всех в любом случае машинный код.

crazy-mike
10-22-2007, 12:54 PM
разборки в компьютерноэлектронном форуме находятся на маратории.
поэтому мы не будет тута выяснять что круче, перл-5 или ОО-PHP.
потому что круче всех в любом случае машинный код.
Круче всех Windows Vista под VMWare под Win XP , которая работает под bochs на Minix на 8-разрядном процессоре!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
:grum:

crazy-mike
10-22-2007, 12:56 PM
для того чтобы запустить стандартный длл из нестандартного,
надо сначала написать нестандартный (JNI) длл. кароче жаба

Ну какая же это "жаба"? Они так со времён win32s всё делали. Там ещё какое-то очень смешное название для таких DLL существовало ...

Sixteen
10-22-2007, 01:12 PM
Ну какая же это "жаба"? Они так со времён win32s всё делали. Там ещё какое-то очень смешное название для таких DLL существовало ...

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

crazy-mike
10-23-2007, 12:15 AM
да конешно, люди ваще писали стабы в ручную и все загружалось.
а мне же нужна очень конкретная вещь -
штоб жаба могла напрямую ДЛЛ загружать. без всего этого стабописания!
Microsoft такое называла thunk (stub - это обычно была просто заглушка для предотвращения выполнения "не в той среде") ;) . При связи модулей на разных языках вообще-то рекомендуют отделять "среду поддержки времени выполнения" (run time environment) каждого модуля одну от другой. В этих случаях приходится использовать ведь две разных подсистемы управления кучей и т.д. (зато и два адресных пространства). В условиях Flat Addressing Mode "без стабописания" практически невозможно обойтись (точнее "гипотетически можно" - если не использовать внутри кода функции RTL конкретного языка). Microsoft когда-то попробовала устроить "Common Language Interface" - "для всего своего"....:grum:

Sixteen
10-23-2007, 09:10 AM
Microsoft такое называла thunk (stub - это обычно была просто заглушка для предотвращения выполнения "не в той среде") ;) . При связи модулей на разных языках вообще-то рекомендуют отделять "среду поддержки времени выполнения" (run time environment) каждого модуля одну от другой. В этих случаях приходится использовать ведь две разных подсистемы управления кучей и т.д. (зато и два адресных пространства). В условиях Flat Addressing Mode "без стабописания" практически невозможно обойтись (точнее "гипотетически можно" - если не использовать внутри кода функции RTL конкретного языка). Microsoft когда-то попробовала устроить "Common Language Interface" - "для всего своего"....:grum:

среда поддержки времени выполнения - это страшно! просто страшно!
рантайм энв в такой вот ужас перевели, аааааааааааа! хотя тут
народ уже лет пять как редуцировал энв, остался только рантайм.
у с++ есть плюс: его рантайм очень очень малинький и нетребовательный.
если сравнивать с кое-какими другими рантаймами.

crazy-mike
10-23-2007, 09:16 AM
среда поддержки времени выполнения - это страшно! просто страшно!
:evillaugh Очень страшно. Когда-то в книжном магазине заглянул в какую-то книгу под названием "Java-2 ..." :evillaugh :evillaugh :evillaugh Самый настоящий кошмар...Утешает одно - хоть "Гарри Поттера" на этой бумаге не напечатали...:grum:

crazy-mike
10-27-2007, 12:34 AM
<?
final public function myMakeAttr(xhtmlTag &$el,$isn)
{ $q="select name,nodeval from xhtmlat where ref=".$isn." order by item";
$r=pg_query($this->dbe,$q); $na=pg_num_rows($r);
$i=0;
while($i<$na) {
$zname=pg_fetch_result($r,$i,0);
$zval=pg_fetch_result($r,$i,1);
$i++;
$el->setA($zname,$zval);
};
pg_free_result($r);
}

final public function myAddNode($prefix,xhtmlTag &$zparent)
{ $q="select isn,name,hasattr,nodeval from xhtml where ";
$q.="prefix='".$prefix."' and login='".$this->login."' ";
$q.="and href='".$this->href."'";
$r=pg_query($this->dbe,$q); $n=pg_num_rows($r);
if($n==0) { pg_free_result($r); return; };
$i=0;
while($i<$n) {
$isn=pg_fetch_result($r,$i,0); $name=pg_fetch_result($r,$i,1);
$hasattr=pg_fetch_result($r,$i,2);
$nodeval=pg_fetch_result($r,$i,3); $i++;
if($name=="#text") {
$tv=xU::toU($nodeval);
$zparent->cat($tv); continue;
};
$el=new xhtmlTag($name);
if($hasattr==1) $this->myMakeAttr($el,$isn);
//
$qc="select prefix from xhtml where login='".$this->login."'";
$qc.=" and href='".$this->href."' and prefix like '".$prefix."%'";
$qc.=" and prefix<>'".$prefix."'";
$r1=pg_query($this->dbe,$qc); $ne=pg_num_rows($r1);
$j=0;
while($j<$ne) {
$zp=pg_fetch_result($r1,$j,0); $j++;
if(!array_key_exists($zp,$this->hell)) {
$this->myAddNode($zp,$el); $this->hell[$zp]=1;
};
};
$zparent->add($el);
pg_free_result($r1);
//
};
pg_free_result($r);
}

final public function makeMyPage()
{ $html=new xhtmlTag('html');
$this->hell=array();
$this->myAddNode('1.',$html);
$this->myAddNode('2.',$html);
$pge=$html->is();
$ba=xU::fromU($pge);
$ba=str_replace('<','&lt;',$ba);
$ba=str_replace('>','&gt;',$ba);
$ba=str_replace('"','&quot;',$ba);
$fm=new xhtmlForm('pgmake','savepgnodes.php');
$fm->attach(
new xhtmlInput('hidden','login',$this->login),
new xhtmlInput('hidden','href',$this->href),
new xhtmlInput('hidden','mypage',$ba)
);
$this->cat('<pre>'.$ba.'</pre>');
$this->add($fm);
}
?>

:evillaugh Примерно так страницу html можно генерировать по содержимому базы данных. Там две таблицы xhtml (таблица тегов) и xhtmlat (таблица аттрибутов тегов). Т.е. "visual editor" на основе объектов - это довольно простое и даже скучное занятие.
А разобрать существующую страницу - тоже не составляет особенных трудностей:
<?
require '../../utf8/myutf8.php';
require '../../xobj/myhtml.php';
require 'myuni.php';

class edPageB extends xhtmlBody {
private $dbc;

final public function editHTML($login,$href)
{ $hd=new xhtmlThead(
array('prefix','tag','members','has attributes','text')
);
$tr=new xhtmlTr('','xhdr');
$tr->dummyHN(5);
$hd->add($tr);
$bd=new xhtmlTbody();
$q="select isn,prefix,name,length,hasattr,nodeval ";
$q.="from xhtml where login='".$login."' and href='".$href."' ";
$q.="order by prefix";
$r=pg_query($this->dbc,$q); $n=pg_num_rows($r);
$i=0;
while($i<$n) {
$isn=pg_fetch_result($r,$i,0);
$prefix=pg_fetch_result($r,$i,1);
$name=pg_fetch_result($r,$i,2);
$zlen=pg_fetch_result($r,$i,3);
$hasattr=pg_fetch_result($r,$i,4);
$nodeval=pg_fetch_result($r,$i,5);
$i++;
$tr=new xhtmlTr('t'.$i,'','',
array(
'onmouseover' => 'mOn(event,'.$i.')' ,
'onclick' => 'mEt(event,'.$isn.')'
)
);
$tr->attach(
new xhtmlTd($prefix),
new xhtmlTd($name),
new xhtmlTd($zlen),
new xhtmlTd($hasattr),
new xhtmlTd($nodeval)
);
$bd->add($tr);
};
pg_free_result($r);
$ta=new xhtmlTable($href,$hd,$bd);
$ta->setAV(
array ('border' => 1, 'rules' => 'all' , 'frame' => 'box' ,
'cellspacing' => 0)
);
$this->add($ta);
}

final public function seeAttrib($prefix,DOMNode $p,$login,$href)
{ $c=$p->attributes;
$i=0;
$q="select isn from xhtml where login='".$login."' and href='".$href."'";
$q.=" and prefix='".$prefix."'";
$isn=0;
$r=pg_query($this->dbc,$q); $n=pg_num_rows($r);
if($n>0) $isn=pg_fetch_result($r,0,0);
pg_free_result($r);
if($isn==0) return;
for(;;) {
$d=$c->item($i); if($d==NULL) break;
$q="insert into xhtmlat(ref,item,name,nodeval) values(";
$q.=$isn.",".$i.",'".$d->nodeName."','".$d->nodeValue."')";
$r=pg_query($this->dbc,$q); pg_free_result($r);
$i++;
};
}

final public function seeNode($prefix,DOMNode $p,$login,$href)
{ $hasattr=0;
if($p->nodeType==XML_ELEMENT_NODE) if($p->hasAttributes()) $hasattr=1;
$nodeval='';
if($p->nodeType==XML_TEXT_NODE) {
$nodeval=xu::fromU($p->nodeValue);
};
$c=$p->childNodes; $zlen=0;
if($c!=NULL) $zlen=$c->length;
$q="insert into xhtml(login,href,prefix,name,nodeval,hasattr,lengt h) ";
$q.="values(";
$q.="'".$login."','".$href."','".$prefix."','".$p->nodeName."',";
$q.="'".$nodeval."',".$hasattr.",".$zlen.")";
if($prefix!="") {
$r=pg_query($this->dbc,$q); pg_free_result($r);
if($hasattr==1) $this->seeAttrib($prefix,$p,$login,$href);
};
if($zlen==0) return;
$n=$zlen;
$i=0;
while($i<$n)
{ $cur=$c->item($i); $i++;
$dp=$prefix.$i.'.';
$this->seeNode($dp,$cur,$login,$href);
}
}


final public function myDocument($hp,$login,$href)
{ $this->dbc=pg_connect(
"host=127.0.0.1 port=5432 user=postgres dbname=userspace");
$q="delete from xhtml where login='".$login."' and ";
$q.="href='".$href."'";
$r=pg_query($this->dbc,$q); pg_free_result($r);
$q="delete from xhtmlat where ref not in (select isn from xhtml)";
$r=pg_query($this->dbc,$q); pg_free_result($r);
$za=$hp;
$za=str_replace(chr(13),'',$za);
$za=str_replace(chr(10),'',$za);
$za=xU::toU($za);
$dd=new DOMDocument('1.0','UTF-8');
$dd->loadHTML($za);
$dn=$dd->getElementsByTagName('html');
$html=$dn->item(0);
$this->seeNode('',$html,$login,$href);
$this->editHTML($login,$href);
pg_close($this->dbc);
}


final public function makeEmptyDocument()
{ $doc=new DOMDocument('1.0','UTF-8');
$b=$doc->createElement('html');
$doc->appendChild($b);
$hd=$doc->createElement('head');
$bd=$doc->createElement('body');
$bd->appendChild(
$doc->createTextNode(xutf8::toUTF8('&#227;&#197; &#215;&#207;&#206;&#207;!'))
);
$ti=$doc->createElement('title');
$txt=$doc->createTextNode(xutf8::toUTF8('&#238;&#193;&#218;&#215;&#193;'));
$ti->appendChild($txt);
$hd->appendChild($ti);
$b->appendChild($hd); $b->appendChild($bd);
return $doc->saveHTML();
}

final public function rmPrologue($src)
{ $k=strpos($src,"<html");
if($k===FALSE) return $src;
$d=substr($src,$k); return $d;
}

final public function __construct() {
xhtmlBody::__construct('qbody');
$href=$_POST['href'];
$login=$_POST['login'];
$mypage=$_POST['mypage'];
if($mypage!="") $mypage=str_replace('\\',"",$mypage);
$div=new xhtmlTag('div');
$div->setA('style','background :#c6c6c6;');
$div->cat('<b>'.$login.'</b>');
$spa=new xhtmlTag('span');
$spa->setA('style','color :#c200c2; background :#ffff00; margin :1em;');
$spa->cat('<b>'.$href.'</b>'); $div->add($spa);
$xb=new xhtmlButton('','',
'border :1px solid; border-color :#000000;',
array('onclick' => 'savePage()')
);
$xb->cat('&#250;&#193;&#208;&#201;&#211;&#193;&#212;&#201;');
$xb1=new xhtmlButton('','',
'border :1px solid; border-color :#000000;',
array('onclick' => 'viewPage()')
);
$xb1->cat('&#240;&#207;&#203;&#193;&#218;&#193;&#212;&#201;');
$div->attach($xb,$xb1);
$this->add($div);
if($mypage=='') {
$hpage=@file_get_contents("./www/".$login."/".$href);
if($hpage==FALSE) $hpage=$this->makeEmptyDocument();
$hpage=$this->rmPrologue($hpage);
} else $hpage=$mypage;
$txt=new xhtmlTag('textarea');
$txt->setAV(array (
'id' => 'mypage', 'name' => 'mypage',
'rows' => 10 , 'cols' => 50 ));
$txt->cat($hpage);
$mf=new xhtmlForm('siteparams','saveuspage.php');
$mf->attach(
new xhtmlInput('hidden','login',$login),
new xhtmlInput('hidden','href',$href),
$txt
);
$this->add($mf);
$this->myDocument($hpage,$login,$href);
}
}

class edPageH extends xhtmlHead {
final public function __construct() {
xhtmlHead::__construct('xhtml page Editor');
$this->add(
new xhtmlStyle('@import url("./sty/my.css");')
);
$this->add(new javaScript(file_get_contents("./js/edpage.js")));
}
}

class edPage extends xhtmlPage {
final public function __construct() {
xhtmlPage::__construct(new edPageH(),new edPageB());
$this->see();
}
}
$p=new edPage();
?>

:grum: DOMDocument - испльзуется для разбора , а "свои классы" - для "синтеза". Вообще-то можно было бы использовать DOMDocument и для сборки документа , но там просто "приколы с перекодировкой кирилицы" (очень смешные - а со своими классами как-то всё короче выходит). Большинство "трудностей" связано с перекодировкой данных при пересылке методом "POST". Вообще-то этого можно избежать - при записи промежуточных результатов в БД вместо пересылки. :grum:

crazy-mike
10-31-2007, 06:01 AM
;)
<?
class xU {
private static $zabc= array (
"А" => "&#x0410;","Б" => "&#x0411;", "В" => "&#x0412;", "Г" => "&#x0413;",
"Д" => "&#x0414;","Е" => "&#x0415;", "Ж" => "&#x0416;", "З" => "&#x0417;",
"И" => "&#x0418;","Й" => "&#x0419;", "Ї" => "&#x0407;", "К" => "&#x041A;",
"Л" => "&#x041B;","М" => "&#x041C;", "Н" => "&#x041D;", "О" => "&#x041E;",
"П" => "&#x041F;","Р" => "&#x0420;", "С" => "&#x0421;", "Т" => "&#x0422;",
"У" => "&#x0423;","Ф" => "&#x0424;", "Х" => "&#x0425;", "Ц" => "&#x0426;",
"Ч" => "&#x0427;","Ш" => "&#x0428;", "Щ" => "&#x0429;", "Ь" => "&#x042C;",
"Ю" => "&#x042E;","Я" => "&#x042F;", "Є" => "&#x0404;", "І" => "&#x0456;",
"а" => "&#x0430;","б" => "&#x0431;", "в" => "&#x0432;", "г" => "&#x0433;",
"д" => "&#x0434;","е" => "&#x0435;", "ж" => "&#x0436;", "з" => "&#x0437;",
"и" => "&#x0438;","й" => "&#x0439;", "ї" => "&#x0457;", "к" => "&#x043A;",
"л" => "&#x043B;","м" => "&#x043C;", "н" => "&#x043D;", "о" => "&#x043E;",
"п" => "&#x043F;","р" => "&#x0440;", "с" => "&#x0441;", "т" => "&#x0442;",
"у" => "&#x0443;","ф" => "&#x0444;", "х" => "&#x0445;", "ц" => "&#x0446;",
"ч" => "&#x0447;","ш" => "&#x0448;", "щ" => "&#x0449;", "ь" => "&#x044C;",
"ю" => "&#x044E;","я" => "&#x044F;", "є" => "&#x0456;", "і" => "&#x0454;"
);
static final function toU($v)
{ $d=$v;
$ka=array_keys(xU::$zabc); $n=count($ka);
$i=0;
while($i<$n) {
$c=$ka[i]; $rp=xU::$zabc[$c];
$d=str_replace($c,$rp,$d);
$i++;
};
return $d;
}
static final function fromU($v)
{ $d=$v;
$ka=array_keys(xU::$zabc); $n=count($ka);
$i=0;
while($i<$n) {
$rp=$ka[i]; $c=xU::$zabc[$c];
$d=str_replace($c,$rp,$d);
$i++;
};
return $d;
}

}
?>
;) просто "шиза" (перекодировка кирилицы в нечто платформно-независимое)
Если в строке $h - будет содержимое html-странички c текстом на украинском - то по xU::toU($h) - получится идиотская смесь с литерали из Unicode , которая будет "светиться правильно"...
Правда мне нужна была немного другая "модификация" такого кода:
<?
class xU {
static $zabc= array (
"А" => "_0410;","Б" => "_0411;", "В" => "_0412;", "Г" => "_0413;",
"Д" => "_0414;","Е" => "_0415;", "Ж" => "_0416;", "З" => "_0417;",
"И" => "_0418;","Й" => "_0419;", "Ї" => "_0407;", "К" => "_041A;",
"Л" => "_041B;","М" => "_041C;", "Н" => "_041D;", "О" => "_041E;",
"П" => "_041F;","Р" => "_0420;", "С" => "_0421;", "Т" => "_0422;",
"У" => "_0423;","Ф" => "_0424;", "Х" => "_0425;", "Ц" => "_0426;",
"Ч" => "_0427;","Ш" => "_0428;", "Щ" => "_0429;", "Ь" => "_042C;",
"Ю" => "_042E;","Я" => "_042F;", "Є" => "_0404;", "І" => "_0456;",
"а" => "_0430;","б" => "_0431;", "в" => "_0432;", "г" => "_0433;",
"д" => "_0434;","е" => "_0435;", "ж" => "_0436;", "з" => "_0437;",
"и" => "_0438;","й" => "_0439;", "ї" => "_0457;", "к" => "_043A;",
"л" => "_043B;","м" => "_043C;", "н" => "_043D;", "о" => "_043E;",
"п" => "_043F;","р" => "_0440;", "с" => "_0441;", "т" => "_0442;",
"у" => "_0443;","ф" => "_0444;", "х" => "_0445;", "ц" => "_0446;",
"ч" => "_0447;","ш" => "_0448;", "щ" => "_0449;", "ь" => "_044C;",
"ю" => "_044E;","я" => "_044F;", "є" => "_0456;", "і" => "_0454;"
);
static final function toU($v)
{ $d=$v;
$ka=array_keys(xU::$zabc); $n=count($ka);
$i=0;
while($i<$n) {
$c=$ka[$i]; $rp=xU::$zabc[$c];
$d=str_replace($c,$rp,$d);
$i++;
};
return $d;
}
static final function fromU($v)
{ $d=$v;
$ka=array_keys(xU::$zabc); $n=count($ka);
$i=0;
while($i<$n) {
$rp=$ka[$i]; $c=xU::$zabc[$rp];
$d=str_replace($c,$rp,$d);
$i++;
};
return $d;
}

}
?>
Здесь просто надо было нейтрализвоать работу некоторых функций в DOMDocument...Используем подчёркивание - и вместо литерала получается текст латинскими буквами и цифрами (методы DOMDocument латинский алфавит переносят вполне нормально). Ну а потом после разбора - значения текстовых элементов просто преобразовать по xU::fromU($p)

crazy-mike
11-15-2007, 09:07 AM
Чем дальше - тем страшнее.
Почти целый день "протрахался" с механизмом установки php-extensions.
Самое смешное - что всё в итоге свелось к изменению содержимого командного файла phpize "вручную". - Потому что "оно" не могло найти autonconf213 , а упорно искало autoconf. :grum:
Весь кошмар начался с того - что мне понадобился expect из php...

crazy-mike
11-16-2007, 04:07 AM
А еще надо было статическую библиотеку libexect543.a переименовать в libexpect.a (вооще-то сделать symlink). :grum:

crazy-mike
11-22-2007, 05:50 AM
;) В классе xhtmlPage модифицируем метод see() следующим образом:

final public function see()
{ ob_start("ob_gzhandler");
echo $this->is();
}

;)

И теперь у нас "compessed html" на выходе!!!!!!! (и траффик с сервера меньше). Самое главное - что все страницы - где используется myhtml.php (все классы из него) - становятся "compressed-html" автоматически.
Напомню - что единственный явный оператор вывода спрятан именно в классе xhtmlPage.

YUM
11-22-2007, 07:53 AM
Вот ведь как оно бывает...В соседней ветке народ спекулирет на тему кто и о чем разговаривает со своим компом. А тут Майк не только диалоги ведет , но и сексуальное удовольствие получает от пи-эйч-пи пять...Майки, вернись! Ты нам нужен веселый и дружелюбный:D

crazy-mike
11-23-2007, 11:41 AM
Вот ведь как оно бывает...
<?
class bossBody extends xhtmlBody {
// .........
}

class bossHead extends xhtmlHead {
// ......
}

class bossPortFolio extends xhtmlPage {
public final function __construct()
{ parent::__construct( new bossHead(),new bossBody());
$this->see();
}
}
$boss=new bossPortFolio();
?>
:grum:

crazy-mike
11-23-2007, 02:19 PM
;) Ну конечно же ob_start("ob_gzhandler") - это немного "экзотика" , характерная именно для PHP5. "Народ" почему-то привязывается к готовым решениям (которые делали для ранних версий PHP4) - и просто многие новые "фишки" PHP5 не использует. ;)

YUM
11-23-2007, 04:45 PM
;) Ну конечно же ob_start("ob_gzhandler") - это немного "экзотика" , характерная именно для PHP5. "Народ" почему-то привязывается к готовым решениям (которые делали для ранних версий PHP4) - и просто многие новые "фишки" PHP5 не использует. ;)да, Майки...не использует.
Я лично , потерялся на второй строке...первого сообщения.
Но, на всяки случай, копирую твои раскопки. Мало ли, придется с протянутой рукой в переходе стоять... Тут я и блесну:
а запдало вам, пррохожие товарисчи, схавать "хедера" за после "боди" страничного?
И пока пр.р.рохожие, пряча глаза, достают раскошельники...я им песню забацаю спорую:
позабыт, позаброшен
с молодых юных лет
упивалси я ПиЭлем,
счастья -доли мне нет...

Стоп! Про "Эль", не надо. Не поймут'c
о! :
я лабал HTML'я..

гоп со смыком! Опять "эль" втерся...
Спать пора...
Щас допью етот Эль...и сразу лягу..
Чесслово...

Shtirliz
11-23-2007, 04:47 PM
Вот я хоочу [embed] чтото в мою подпись форумскую и немогу..как ето сделать?

YUM
11-23-2007, 05:01 PM
Вот я хоочу [embed] чтото в мою подпись форумскую и немогу..как ето сделать?ну че стесняемся? Впендюрить?;)

Shtirliz
11-23-2007, 08:08 PM
ну че стесняемся? Впендюрить?;)

Обясни как в подпись [embed] коде

crazy-mike
11-24-2007, 01:15 AM
упивалси я ПиЭлем,
счастья -доли мне нет...
...
IBM могла бы "пригреть" ;) ...С PL/1 вообще всё когда-то прикольно было. На самом деле - очень "умный язык". В СССР правда ни одной его массовой полной реализации не существовало (с proc option(task) и event). Кроме того - каждая новая реализация в нём хоть что-нибудь но портила (освобождение памяти из под переменных и т.д.)
Когда-то давно (лет восемь назад) - написал маленький компилятор с подмножества PL/1 в команды трёхадресной виртуальной машины и запустил тест - одна и та же "считалка" на таком PL/1 и на FoxPro. Мой PL/1 работал в шесть раз быстрее на Intel386. До сих пор удивляет - почему с него очень мало компиляторов (Есть экспериментальный GNU и три платных (основных)). Грамматический разбор там делается практически рекурсивным спуском. Условно-ключевые слова распознаются анализом следующего за ним терма. Грубо говоря - композиция МП-автоматов порождает довольно прикольный СУ-перевод. :grum:
А ещё когда-то на практике на 4-м курсе нарисовал кросс-компилятор с подмножества языка ADA в PL/1. В СТКБ ИППММ (Институт Прикладных Проблем Математики и Механики во Львове) - для внутренних целей существовал кросс компилятор с подмножества PL/1 в Fortran-77. (Они так программы с ЕС на СМ переносили).

Alex_3112
11-25-2007, 01:25 PM
написал маленький компилятор с подмножества PL/1 в команды трёхадресной виртуальной машины и запустил тест - одна и та же "считалка" на таком PL/1 и на FoxPro. Мой PL/1 работал в шесть раз быстрее на Intel386.
А FoxPro работал на той же трехадресной виртуальной машине?
По-моему их вообще сложно сравнивать. FoxPro - это стандарт xBase, а PL/1 - (точно не знаю) что-то совсем другое. 90% эффективности работы программы работы с базами - в оптимальном кешировании. Ваш быстрый алгоритм мог не работать настолько же хорошо в общем случае.

crazy-mike
11-26-2007, 01:56 AM
А FoxPro работал на той же трехадресной виртуальной машине?
По-моему их вообще сложно сравнивать. FoxPro - это стандарт xBase, а PL/1 - (точно не знаю) что-то совсем другое. 90% эффективности работы программы работы с базами - в оптимальном кешировании. Ваш быстрый алгоритм мог не работать настолько же хорошо в общем случае.
Это обычные целочисленные математические вычисления были (вообще без баз данных). Просто интерпретация системы команд трёхадресной машины эффективнее интерпретации системы команд стекового процессора по числу необходимых команд. ;) Стандартный код виртуальной машины FoxPro вероятно базировался на P-code (кажется одноадресная система команд - если верить Micorsoft Programming Workbench). При интерпретации команд стекового процессора дополнительными накладными расходами является сам процесс вычисления адресов операндов.

Alex_3112
11-26-2007, 12:50 PM
Это обычные целочисленные математические вычисления были (вообще без баз данных).
Понятно... но кому нужен FoxPro без баз данных?

crazy-mike
11-26-2007, 01:04 PM
Понятно... но кому нужен FoxPro без баз данных?
Мы просто сравнивали скорость работы интерпретатора. Дело в том - что перед интерпретацией систему команд стекового процессора можно транслировать в трёхадресную или двухадресную систему команд. При этом быстродействие интерпретатора повысится даже без генерации цепочек команд "родной" архитектуры. Ранние интерпретаторы пытались исполнять код стекового процессора непосредственно (хотя бы польскую запись). Байт-код Java-машины тожн представляет собой систему команд стекового процессора.

crazy-mike
12-04-2007, 02:10 AM
http://smarty.php.net/manual/en/
А ведь для PHP ещё и Smarty есть...:grum:

crazy-mike
12-08-2007, 02:05 PM
Интересный "глюк" для связки "PHP5+Apache2":
Если хочется одновременно компилировать apache2 с опциями -with-apxs2 и --enable-embed , то процедура завершающей установки сработает неправильно.
"Оно" переваривает только один модуль SAPI (--enable-embed просто отменит действие --with-apxs2). ;)
Поэтому если "нужны эти две фишки одновременно" - то make и make install лучше выполнить два раза для каждой такой опции отдельно. :grum:

crazy-mike
12-12-2007, 09:16 AM
В php5 конструкторы объектов ведут себя несколько нетрадиционно. ;)
Допустим - что создаем свой собственный класс myBody примерно так:
class myBody extends xhtmlBody {
final public function __construct()
{ // Хочется создать свои данные до вызова констурктора родителя.
// "Нормальные" языки ООП таких пакостей вообще-то не позволяют
// (даже C++ - хотя его очень трудно назвать "нормальным языком") ;)
// Но в php5 на месте этого комментария может стоять любой выполняемый
// код.
// Ну и потом можно делать следующее:
if($this->allOK()) parent::__construct("haha","","myOk()");
else parent::__construct("hihi","","","myClose()");
// Условный конструктор делает PHP5 одним из самых кошмарных языков
// ООП!!!!!!
}
}

crazy-mike
12-12-2007, 10:42 AM
Ну и можно вообще-то создать даже класс xhtmlApp
примерно так:

class xhtmlApp extends xhtmlPage {
public function __construct(xhtmlHead $h,xhtmlBody $b)
{ parent::__construct($h,$b);
$this->see();
}

}

И веб-страничка может выглядеть как:

$p=new xhtmlApp(new myPageHead(),new myPageBody());

;)

Вообще-то я не уверен в полезности таких "контейнерных классов" - но места так текст будет занимать меньше (и читать проще - чем с использованием require )

crazy-mike
12-21-2007, 01:49 AM
Маленькая "шутка юмора":
результат у функции crypt() в php-5.2.5 не совпадает с результатом работы htpassword в apache2. ;)

crazy-mike
12-24-2007, 12:31 PM
Вдруг захотелось внутри описанных классов использовать sessions.
Никаких противоречий не наблюдается:

session_start();
$p=new xhtmlApp(new mybaHead(),new mybaBody());


вообще-то чего-то такого вполне достаточно. Вопрос: для чего это надо?
Один из вариантов ответа - обходить глюки прокси-серверов , которые работают под Windows (типа WinProxy 6.0) и не дают нормально открываться окнам для аутентификации пользователя. Кроме того - даже в каком-нибудь squid можна и чуточку запутаться с авторизацией пользователя на прокси-сервере и на уровне приложения. ;)

crazy-mike
12-29-2007, 02:12 PM
если описан класс со статическими членами , которые инициализируются при описании - то session_start() лучше делать до этих описаний. :grum:

crazy-mike
01-03-2008, 12:20 PM
;)
Существует "модная" в последнее время идея "разделять" (располагать в отдельных блоках :grum: ) запросы к БД и диалоговые элементы. Вроде бы "логика работы с БД" должа бы располагаться в отдельной "сопрограмме" (или в отдельном классе а интерфейсный диалоговый объект должен бы посылать такому объекту сообщения или делать какое-нибудь throw , а Exceptions должны обращаться к объекту "Логика работы с БД".
Классы из myhtml реализовывали только интерфейсные элементы. Класса BusinessDBApplication здесь пока ещё нет. :grum:

crazy-mike
01-10-2008, 01:35 PM
;)
Вроде бы "логика работы с БД" должа бы располагаться в отдельной "сопрограмме" (или в отдельном классе а интерфейсный диалоговый объект должен бы посылать такому объекту сообщения или делать какое-нибудь throw , а Exceptions должны обращаться к объекту "Логика работы с БД".
Классы из myhtml реализовывали только интерфейсные элементы. Класса BusinessDBApplication здесь пока ещё нет. :grum:
Хотя можно ведь и "наоборот":
Считать логику-работы с БД первичной - а все диалоговые элементы пусть появляются в результате Exceptions. ;)
Тогда первичным событием должно быть подсоединение к схеме БД и выполнение какого-нибудь запроса.

Alex_3112
01-10-2008, 02:00 PM
Хотя можно ведь и "наоборот":
Считать логику-работы с БД первичной - а все диалоговые элементы пусть появляются в результате Exceptions. ;)
Тогда первичным событием должно быть подсоединение к схеме БД и выполнение какого-нибудь запроса.
Где-то я видел примеры программ для Web, реализованные исключительно на Transact-SQL в виде хранимых процедур :)

crazy-mike
01-11-2008, 02:27 AM
Где-то я видел примеры программ для Web, реализованные исключительно на Transact-SQL в виде хранимых процедур :)
;) Вообще-то хранимые процедуры и триггеры поддерживаются и в бесплатных Postgresql и MySQL (с версии 5.0) :grum:
Но я хотел сказать о возможности реализации архитектуры "Model-View-Controller" (MVC (!?)) средствами PHP5. Даже скрипты (или имена скриптов) можно держать в полях типа TEXT или BLOB в таблицах какой-нибудь СУБД.
Определённый интерес представляют web-серверы - в которых в качестве файловой системы используется какая-либо из СУБД. В этом случае скрипты на PHP могут генерироваться в результате процесса выполнения SQL запроса в ответ на HTTP GET. ;) Обычно такие системы делают покомпонентно (получается что-то похожее на PHPAdmin или на какие-нибудь "движки для создания вебсайтов".

crazy-mike
01-19-2008, 05:02 AM
;) Кстати Opera Mini с http://wap.opera.com существенно упрощает процесс программирования сайтов для доступа с мобильных телефонов.
User Agent естественно "детектируется" по заголовкам http-запроса. А всё остальное - просто достаточно "писать не очень длинным". Классы из myhtlml такие вещи вообще-то позволяют делать достаточно просто. ;) Кодировку правда лучше использовать UTF-8. :grum:
Правда для создаваемой веб-странички под браузер Opera Mini лучше создать класс таблицы стилей с margin :0px ;) (Потому что - в Opera Mini "рабочая область страницы" выделяется серым цветом и на Motorola L6 - например - её границы меньше размера экрана (отступы по умолчанию великоваты)). Из Opera Mini так и на russianamerica.com можно зайти (правда потом немного неудобно лазить - потому как xhtml mp не поддерживает фреймы).

crazy-mike
01-22-2008, 10:24 AM
;) Opera Mini вообще-то сравнительно правильно поддерживает XHTML Mobile Profile. Поэтому немного модифицируем myhtml.php путём добавления ещё нескольких классов.

class xhtmlMPStyle extends xhtmlTag {
public function __construct($v) {
parent::__construct('style');
$this->setA('type','text/css');
$this->cat($v);
}
}

class xhtmlMPpage extends xhtmlObj {
public $p;

private function prologue() {
$this->p='<?xml version="1.0" '."encoding='UTF-8'?>";
$this->p.='<!DOCTYPE HTML PUBLIC ';
$this->p.='"-//W3C/DTD XHTML 1.0 Transitional//EN" ';
$this->p.='"http://www.w3.org/TR/xhtmml1/DTD/xhtml1-transitional.dtd">';
$this->p.='<html xmlns="http://www.w3.org/1999/xhtml" >';
}

public function __construct(xhtmlHead $a=NULL,xhtmlBody $b=NULL)
{ $this->prologue();
if($a!=NULL) $this->add($a);
if($b!=NULL) $this->add($b);
}

public function is()
{ $q = $this->p.'</html>';
return $q;
}

final public function add(xhtmlObj $v)
{ $this->p.=$v->is();
}

final public function display()
{ echo xutf8::toUTF8($this->is());
}

final public function see()
{ ob_start("ob_gzhandler");
$a=$this->is(); $b=xutf8::toUTF8($a);
echo $b;
}

}

// и наконец

class miniApp extends xhtmlMPpage {
public final function __construct(xhtmlHead $h,xhtmlBody $b)
{ parent::__construct($h,$b);
$this->see();
}
}



Ну и теперь можно писать wap-сайт под Opera-Mini.
Можно ввести ещё довольно идиотский класс:

class xhtmlV extends xhtmlObj {
private $p;

public final function is()
{ return $this->p;
}

final public function cat($v)
{ $this->p.=$v;
}

final public function add(xhtmlObj $v)
{ $this->p.=$v->is();
}

public final function __construct($v)
{ $this->p=$v;
}
}

Этот - исключительно для удобства. В основном из "эстетических соображений".

Может быть добавить модификацию для xhtmlHead:

class xhtmlHead extends xhtmlObj {
private $p;

public function __construct($tit,$enc=1) {
$this->p='<head>';
if($enc==1) {
$this->p.='<meta http-equiv="Content-Type" content="text/html; ';
$this->p.=' charset=koi8-u; lang=uk">';
};
$this->p.='<title>'.$tit.'</title>';
}

final public function add(xhtmlObj $v)
{ $this->p.=$v->is();
}

final public function is()
{ $q=$this->p.'</head>'; return $q;
}

}

Изменение xhtmlHead связано всего лишь с удалением мета-тега для "перекодировки по умолчанию". У меня "обычные страницы" делаются в KOI-8.
Для мобилки - лучше в UTF-8.
;)

crazy-mike
01-31-2008, 02:53 AM
;) Может быть это только реалии провайдеров Украины (проверено экспериментально на Kievstar , Life , UMC UA MTS ).
У опреаторов Kiyevstar и Life не поддерживается верификатор документов XHTML MP. На Kievstar для чего-то подобного есть специальный сервис Web Explorer.
На UMC (MTS) полностью поддерживается работа с XHTML MP.
Поэтому - если хочется писать WAP-сайты - доступные с сетей Life и Kievstar - то лучше использовать WML , а не XHTML MP.
Если работать с браузером Opera Mini то на MTS лучше поменять "настройки сессии по умолчанию" на "тип сервиса: HTTP и порт 8080 (а не 9201). Тоже самое практически на Kievstar и Life. ;) Кроме того в настройках сети в среде Opera Mini наставить "протокол HTTP, порт 80)". :grum:

Olezhik
02-03-2008, 06:04 PM
Мда.... скушны этот [PHP], да конешно язык гипки, динамични и устоичивы. Но, ведь за [PHP] нифига не платять, а раз не платять, то херня этот язык, а не язык. Работать надо в том языке за каторы платят.

Sixteen
02-04-2008, 05:39 AM
Мда.... скушны этот [PHP], да конешно язык гипки, динамични и устоичивы. Но, ведь за [PHP] нифига не платять, а раз не платять, то херня этот язык, а не язык. Работать надо в том языке за каторы платят.

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

crazy-mike
02-04-2008, 06:50 AM
Мда.... скушны этот [PHP], да конешно язык гипки, динамични и устоичивы. Но, ведь за [PHP] нифига не платять, а раз не платять, то херня этот язык, а не язык. Работать надо в том языке за каторы платят.
Платят за "приложения" (поддержку компонентов системы). php позволяет очень сильно снизить "затраты на сопровождение" при "грамотном использовании". Хотя в самом деле существуют фанатики SLOS (Single Language Oriented Systems). ;)
Если порыться на sourceforge.net - то можно даже найти несколько кросс-компиляторов из php в C(C++) и назад. :grum:
Если сравнивать php и Java - то лицензирование для php (GNU open license) намного "либеральнее". Так называемое "разнообразие" языков на самом деле не такое уж и "разнообразное". Скажем - на платформе win32 всё замыкалось фактически на crtl.dll (C runtime library). В UNIX-системах всё ещё чётче. Фактически "рулит" - libgcc. Особенно если вспомнить "технику" использования утилиты gcov. :grum:

Olezhik
02-04-2008, 10:54 AM
Платят за "приложения" (поддержку компонентов системы). php позволяет очень сильно снизить "затраты на сопровождение" при "грамотном использовании". Хотя в самом деле существуют фанатики SLOS (Single Language Oriented Systems). ;)
Если порыться на sourceforge.net - то можно даже найти несколько кросс-компиляторов из php в C(C++) и назад. :grum:
Если сравнивать php и Java - то лицензирование для php (GNU open license) намного "либеральнее". Так называемое "разнообразие" языков на самом деле не такое уж и "разнообразное". Скажем - на платформе win32 всё замыкалось фактически на crtl.dll (C runtime library). В UNIX-системах всё ещё чётче. Фактически "рулит" - libgcc. Особенно если вспомнить "технику" использования утилиты gcov. :grum:
Мне пофиг что на чём и как работает. Я те и на паскале, или ещё лутше на кью-бэсики такую прогу напишу, что ты сам себя вознинавидиш. Мне главное чтоб платили, а как оно работает мне лично пофиг. А то-что на Виндах оно херого работает, мне это только на руку, чяше ломаетса, больше работы, лутшы платят.

crazy-mike
02-04-2008, 11:05 AM
Мне пофиг что на чём и как работает. Я те и на паскале, или ещё лутше на кью-бэсики такую прогу напишу, что ....
;)
CLI (Common Language Interface (Interoperation) :grum:
Мрачная шутка юмора в том - что в современных "operating environements" все эти "языки программирования" становятся всего лишь различными способами представления программ - написанных в системе команд одной и той же виртуальной машины со стековым процессором . :bis:

Olezhik
02-04-2008, 11:15 AM
;)
CLI (Common Language Interface (Interoperation) :grum:
Мрачная шутка юмора в том - что в современных "operating environements" все эти "языки программирования" становятся всего лишь различными способами представления программ - написанных в системе команд одной и той же виртуальной машины со стековым процессором . :bis:

Поверь мне у меня и современая операционая система разберёца в том что на я на бэсики напишу ;). Я не такой професиональны програмист, я просто очень люблю денги, поэтому из себя выды ну напишу, не за бесплатно конехсно.

crazy-mike
02-04-2008, 11:37 AM
Поверь мне у меня и современая операционая система разберёца в том что на я на бэсики напишу ;). Я не такой професиональны програмист, я просто очень люблю денги, поэтому из себя выды ну напишу, не за бесплатно конехсно.
Ну - скажем так - современные оптимизирующие компиляторы и системы исполнения программ в какой-то мере проектируются из расчета на то - чтобы исправлять ошибки "любителей" и не мешать им "зарабатывать деньги". :grum:
Кстати - конструкция "for each" в PHP фактически нейтрализует возможность возникновения ошибки типа "лишняя единица". ;)

Sixteen
02-04-2008, 12:04 PM
Ну - скажем так - современные оптимизирующие компиляторы и системы исполнения программ в какой-то мере проектируются из расчета на то - чтобы исправлять ошибки "любителей" и не мешать им "зарабатывать деньги". :грум:
Кстати - конструкция "фор еач" в ПХП фактически нейтрализует возможность возникновения ошибки типа "лишняя единица". ;)
ето тока так кажеца. а мороны все равно зафигачут в коллекцию лишниы елемент! мороны непобедимы!

crazy-mike
02-04-2008, 12:10 PM
ето тока так кажеца. а мороны все равно зафигачут в коллекцию лишниы елемент! мороны непобедимы!
:grum:
Я когда-то "для примера" конструкторы объектов взаимно-рекурсивно зациклил. :bis:

Sixteen
02-04-2008, 12:12 PM
:грум:
Я когда-то "для примера" конструкторы объектов взаимно-рекурсивно зациклил. :бис:
ето ты потом так всем обьяснял, а получилось наверно само собой! ката ниабманиш! ;)

crazy-mike
02-04-2008, 12:23 PM
ето ты потом так всем обьяснял, а получилось наверно само собой! ката ниабманиш! ;)
Само собой даже в Borland Pascal такое получалось. ;) (у меня именно там и получилось. В C/++ такой "глюк" кто-попало может "произвести"). :grum:

Olezhik
02-04-2008, 12:46 PM
Ну - скажем так - современные оптимизирующие компиляторы и системы исполнения программ в какой-то мере проектируются из расчета на то - чтобы исправлять ошибки "любителей" и не мешать им "зарабатывать деньги". :grum:
Кстати - конструкция "for each" в PHP фактически нейтрализует возможность возникновения ошибки типа "лишняя единица". ;)
Да вот такий мы любители, с много летним опытом. :bis:

crazy-mike
02-07-2008, 04:20 AM
Да вот такий мы любители, с много летним опытом. :bis:
#!/data/php/bin/php
<?
$dbc=pg_connect("host=127.0.0.1 port=5432 user=postgres dbname=billing");
$q="select oid,adlyst from newclients order by adlyst";
$r=pg_query($dbc,$q); $n=pg_num_rows($r);
$i=0;
while($i<$n) {
list($oid,$adlyst)=pg_fetch_row($r,$i); $i++;
$adlyst=pg_unescape_bytea($adlyst);
$adlyst=str_replace(chr(9),',',$adlyst);
$adlyst=str_replace("79049","",$adlyst);
$adlyst=trim($adlyst);
$adlyst=str_replace("''","",$adlyst);
$adlyst=str_replace("максимовича","Максимовича",$adlyst);
$adlyst=str_replace("освицька","Освицька",$adlyst);
$adlyst=str_replace("Львыв","Львів",$adlyst);
$adlyst=str_replace("Львів.","Львів",$adlyst);
$adlyst=str_replace("Володимера","Володимира",$adlyst);
$adlyst=str_replace("львів","Львів",$adlyst);
$adlyst=str_replace("ЛЬвів","Львів",$adlyst);
$adlyst=str_replace(", ",",",$adlyst);
$adlyst=str_replace("м,Л","м. Л",$adlyst);
$adlyst=str_replace("Льві,","Львів,",$adlyst);
$adlyst=str_replace("Львіа,","Львів,",$adlyst);
$adlyst=str_replace("м. Львів,","м.Львів,",$adlyst);
$adlyst=str_replace("м.Львів ","м.Львів,",$adlyst);
$adlyst=str_replace("м. Львів ","м.Львів,",$adlyst);
if(substr($adlyst,0,8)=="м.Львів,") {
$adlyst=substr($adlyst,8); $adlyst.=",м.Львів";
};
$adlyst=str_replace("вул ","вул.",$adlyst);
$adlyst=str_replace("вул. ","вул.",$adlyst);
$adlyst=str_replace("вул.","",$adlyst);
$adlyst=str_replace("вул,","",$adlyst);
$adlyst=str_replace("ул.","",$adlyst);
$adlyst=str_replace("пр.","",$adlyst);
if($adlyst{3}=='.') $adlyst=substr($adlyst,4);
$adlyst=str_replace(","," ",$adlyst);
$adlyst=str_replace("калини","Калини",$adlyst);
$adlyst=str_replace("В. Великого","Володимира Великого",$adlyst);
$adlyst=str_replace("В.Великого","Володимира Великого",$adlyst);
$adlyst=str_replace("Кос Анатольського","Кос-Анатольського",$adlyst);
$adlyst=str_replace("Княгині ","Кн.",$adlyst);
$adlyst=str_replace("Ю. Липи","Ю.Липи",$adlyst);
$adlyst=str_replace("Б. Х","Б.Х",$adlyst);
$adlyst=str_replace("Гната Хот","Гната Хот",$adlyst);
$adlyst=str_replace(".Наукова","Наукова",$adlyst);
$adlyst=str_replace("Ю.Липи","Липи",$adlyst);
$adlyst=str_replace("Чукріна","Чукаріна",$adlyst);
$adlyst=str_replace(" кв.","/",$adlyst);
$adlyst=str_replace(" кв ","/",$adlyst);
$adlyst=str_replace("м.Львів","Львів",$adlyst);
$adlyst=trim($adlyst);
$q="update newclients set adlyst='".pg_escape_string($adlyst)."'";
$q.=" where oid=".$oid;
$x=pg_query($dbc,$q); pg_free_result($x);
printf("%s:%s:\n",$oid,$adlyst);
};
pg_free_result($r);
pg_close($dbc);
?>

;) Многолетний опыт "рулит" . Особенно когда при помощи "нормальных алгоритмов" надо исправлять ошибки во входных данных. :grum:

Olezhik
02-07-2008, 09:35 AM
#!/data/php/bin/php
<?
$dbc=pg_connect("host=127.0.0.1 port=5432 user=postgres dbname=billing");
$q="select oid,adlyst from newclients order by adlyst";
$r=pg_query($dbc,$q); $n=pg_num_rows($r);
$i=0;
while($i<$n) {
list($oid,$adlyst)=pg_fetch_row($r,$i); $i++;
$adlyst=pg_unescape_bytea($adlyst);
$adlyst=str_replace(chr(9),',',$adlyst);
$adlyst=str_replace("79049","",$adlyst);
$adlyst=trim($adlyst);
$adlyst=str_replace("''","",$adlyst);
$adlyst=str_replace("максимовича","Максимовича",$adlyst);
$adlyst=str_replace("освицька","Освицька",$adlyst);
$adlyst=str_replace("Львыв","Львів",$adlyst);
$adlyst=str_replace("Львів.","Львів",$adlyst);
$adlyst=str_replace("Володимера","Володимира",$adlyst);
$adlyst=str_replace("львів","Львів",$adlyst);
$adlyst=str_replace("ЛЬвів","Львів",$adlyst);
$adlyst=str_replace(", ",",",$adlyst);
$adlyst=str_replace("м,Л","м. Л",$adlyst);
$adlyst=str_replace("Льві,","Львів,",$adlyst);
$adlyst=str_replace("Львіа,","Львів,",$adlyst);
$adlyst=str_replace("м. Львів,","м.Львів,",$adlyst);
$adlyst=str_replace("м.Львів ","м.Львів,",$adlyst);
$adlyst=str_replace("м. Львів ","м.Львів,",$adlyst);
if(substr($adlyst,0,8)=="м.Львів,") {
$adlyst=substr($adlyst,8); $adlyst.=",м.Львів";
};
$adlyst=str_replace("вул ","вул.",$adlyst);
$adlyst=str_replace("вул. ","вул.",$adlyst);
$adlyst=str_replace("вул.","",$adlyst);
$adlyst=str_replace("вул,","",$adlyst);
$adlyst=str_replace("ул.","",$adlyst);
$adlyst=str_replace("пр.","",$adlyst);
if($adlyst{3}=='.') $adlyst=substr($adlyst,4);
$adlyst=str_replace(","," ",$adlyst);
$adlyst=str_replace("калини","Калини",$adlyst);
$adlyst=str_replace("В. Великого","Володимира Великого",$adlyst);
$adlyst=str_replace("В.Великого","Володимира Великого",$adlyst);
$adlyst=str_replace("Кос Анатольського","Кос-Анатольського",$adlyst);
$adlyst=str_replace("Княгині ","Кн.",$adlyst);
$adlyst=str_replace("Ю. Липи","Ю.Липи",$adlyst);
$adlyst=str_replace("Б. Х","Б.Х",$adlyst);
$adlyst=str_replace("Гната Хот","Гната Хот",$adlyst);
$adlyst=str_replace(".Наукова","Наукова",$adlyst);
$adlyst=str_replace("Ю.Липи","Липи",$adlyst);
$adlyst=str_replace("Чукріна","Чукаріна",$adlyst);
$adlyst=str_replace(" кв.","/",$adlyst);
$adlyst=str_replace(" кв ","/",$adlyst);
$adlyst=str_replace("м.Львів","Львів",$adlyst);
$adlyst=trim($adlyst);
$q="update newclients set adlyst='".pg_escape_string($adlyst)."'";
$q.=" where oid=".$oid;
$x=pg_query($dbc,$q); pg_free_result($x);
printf("%s:%s:\n",$oid,$adlyst);
};
pg_free_result($r);
pg_close($dbc);
?>

;) Многолетний опыт "рулит" . Особенно когда при помощи "нормальных алгоритмов" надо исправлять ошибки во входных данных. :grum:Написано конешно не плохо для 90х годов, но есть вариант ускорить твои алгоритм как минимум на 50%, а то и быстрея. Этот весь алгоритм нужно вбить в [Stored Procedure]. Если твоя база даных не поддерживает [Stored Procedure], то она у тебя такая же устаревшая как и твой алгоритм :(. Переустанави базу даных на последнию версию, или хотябы на [MySQL 5.0] и в полны вперёд. Удачи :34:

crazy-mike
02-07-2008, 09:47 AM
Написано конешно не плохо для 90х годов, но есть вариант ускорить твои алгоритм как минимум на 50%, :34:
Все эти варианты связаны в основном не с "хранимыми процедурами" (которые в PostgreSQL появились тогда когда в MySQL ещё и вложенных запросов не было :grum: ) - а с минимизацией числа сравнений в процедуре сопоставления с образцом. Такие вещи очень просто писались когда-то в SNOBOL-4. ;) Сейчас на "оптимизацию" всем просто "начихать" (особенно в бизнес-приложениях) :grum:
Кроме того алгоритмы - которые считались "хорошими" на машинах с пословным доступом к памяти - на машинах с командами обработки строк и "большим регистровым файлом" (кеш-памятью) будет выполняться медленнее самых "тупых" алгоритмов. Для архитектур с "предсказанием ветвления" (и на многоядерных - тоже) опять становятся актуальными "нормальные алгоритмы" - особенно когда их результат не зависит от порядка следования "инструкций" в "программе". :grum:

Olezhik
02-07-2008, 10:49 AM
Все эти варианты связаны в основном не с "хранимыми процедурами" (которые в PostgreSQL появились тогда когда в MySQL ещё и вложенных запросов не было :grum: ) - а с минимизацией числа сравнений в процедуре сопоставления с образцом. Такие вещи очень просто писались когда-то в SNOBOL-4. ;) Сейчас на "оптимизацию" всем просто "начихать" (особенно в бизнес-приложениях) :grum:
Кроме того алгоритмы - которые считались "хорошими" на машинах с пословным доступом к памяти - на машинах с командами обработки строк и "большим регистровым файлом" (кеш-памятью) будет выполняться медленнее самых "тупых" алгоритмов. Для архитектур с "предсказанием ветвления" (и на многоядерных - тоже) опять становятся актуальными "нормальные алгоритмы" - особенно когда их результат не зависит от порядка следования "инструкций" в "программе". :grum:
толстого колбасит не по-детски (c) :lol:

crazy-mike
02-07-2008, 11:01 AM
толстого колбасит не по-детски (c) :lol:
Кто-то сказанул (очень давно в начале 80-х ) , что для написания эффективного компилятора с языка высокого уровня - надо чтобы на "конечной машине" был или "один регистр" или "бесконечно много". Кеш-память и "speculative execution" - очень сильно изменили взгляды на "эффективные алгоритмы" (одна из причин - по которой "интерпретируемые языки программирования" как бы "обрели второе дыхание".
(если интерпретатор всё время находится в кеш-памяти - он может выполняться быстрее чем "откомпилированная в машинный код программа" - которая "свопится" :grum: ))

Olezhik
02-07-2008, 11:18 AM
Мда....

crazy-mike
02-07-2008, 11:56 AM
Мда....
А ещё и методы виртуализации среды выполнения программ есть...
(они тоже могут давать выигрыш в производительности именно на машинах с большой кеш-памятью).
;)
Да и вообще вся схема программы - с потоком команд становится очень неэффективной именно из-за необходимости следовать заданному порядку выполнения команд. Фактически более востребованным становится "программирование , управляемое потоком данных". ;)
:evillaugh (короче - "за AS/400 обидно!" :grum: )

crazy-mike
02-22-2008, 03:39 AM
;) Интересная связь между JavaScript и PHP.
На первый взгляд - вообще никакой (JavaScript - в браузере , PHP - на сервере).
Но тем не менее - в PHP5 можно генерировать текст формы (<form...>).
Внутри handler - onsubmit и вызов процедуры на JavaScript. Процедура на JavaScript может "обращаться к данным формы" через DOM-интерфейс (и даже изменять эти данные , в том числе свойство action). И естсественно - процедура на javaScript может вызывать метод submit!!!!!! Со значениями полей таких как <textarea> - получается очень смешная ситуация.
Например:
<textarea name="ta" id="ta" rows="2" cols="4" >
Hello!
</textarea>

Ну захотелось заменить Hello на Good Bye! в JavaScript.
В Mozilla Firefox это можно делать так:
ta=document.getElementById('ta'); fm.textContent='Good Bye!';
В Opera такое не получится. Но можно сделать совсем по другому:
document.forms['myform'].elements['ta'].value='Good Bye';

;) Второй вариант и в Mozilla Firefox работает...

Olezhik
02-22-2008, 10:45 AM
;) Интересная связь между JavaScript и PHP.
На первый взгляд - вообще никакой (JavaScript - в браузере , PHP - на сервере).
Но тем не менее - в PHP5 можно генерировать текст формы (<form...>).
Внутри handler - onsubmit и вызов процедуры на JavaScript. Процедура на JavaScript может "обращаться к данным формы" через DOM-интерфейс (и даже изменять эти данные , в том числе свойство action). И естсественно - процедура на javaScript может вызывать метод submit!!!!!! Со значениями полей таких как <textarea> - получается очень смешная ситуация.
Например:
<textarea name="ta" id="ta" rows="2" cols="4" >
Hello!
</textarea>

Ну захотелось заменить Hello на Good Bye! в JavaScript.
В Mozilla Firefox это можно делать так:
ta=document.getElementById('ta'); fm.textContent='Good Bye!';
В Opera такое не получится. Но можно сделать совсем по другому:
document.forms['myform'].elements['ta'].value='Good Bye';

;) Второй вариант и в Mozilla Firefox работает...
Рекомендую, AJAX.

crazy-mike
02-22-2008, 11:12 AM
Рекомендую, AJAX.
http://ru.wikipedia.org/wiki/AJAX
AJAX — это не самостоятельная технология, а скорее концепция использования нескольких смежных технологий. AJAX базируется на двух основных принципах:
использование технологии динамического обращения к серверу &#171;на лету&#187;, без перезагрузки всей страницы полностью, например:
с использованием XMLHttpRequest (основной метод);
через динамическое создание дочерних фреймов;
через динамическое создание тега <script>.
:grum: Это кому что нравится....У всех этих "решений" есть свои "плюсы и минусы" (с обычными "формами" - просто "проще работать". В данном конкретном случае - единственный оператор присваивания в JavaScript выглядит "проще" чем обращение к XMLHttpRequest ).
Мне это всё было нужно только для генерации "шаблонов" в поле textarea при нажатии на кнопки (каждая кнопка соответствовала генерации определённого фрагмента кода - и как раз это делалось на javaScript). Кроме того для wml - с AJAX и XMLHttpRequest возникнут "определённые проблемы".
:27:
:27:
С мобильностью вообще проблем "выше крыши" - Например - вообще не хочется ставить Java Runtime Environement. Кроме того - средства , предоставляемые "хостингом у провайдера" , обычно до идиотизма ограничены (LAMP - Linux, Apache , MySQL , PHP ) :grum: И в этом случае невозможно заставить провайдера установить Java Server Extentions. И даже в этом случае - "проблемы с совместимостью" и т.д. Maintanance & Portability в первую очередь страдают. PHP в этом отношении довольно "дуракоупорный инструмент".
:evillaugh:
Возвращаясь к php, даже внутри примера для php в приведённой ссылке из "Вики" (там дальше внутри есть пример для php с внутри статьи про XMLHttpRequest) - есть то , что можно считать "недостатком": смешение двух разных "языков" (XHTML/XML) и PHP. В контексте "поиска ошибок в больших проектах" вроде бы проще искать ошибки в чём-то одном. Предложенная инкапсуляция XHTML в "библиотеке классов" myhtml была предназначена именно для этой цели. От "стандартной реализации DOM" и от simple XML это всё отличается только usability по отношению к "application developer" (да и вместе всё даже становится чем-то похожим на MFC или BFC - :grum: ).

Olezhik
02-23-2008, 12:16 AM
http://ru.wikipedia.org/wiki/AJAX
AJAX — это не самостоятельная технология, а скорее концепция использования нескольких смежных технологий. AJAX базируется на двух основных принципах:
использование технологии динамического обращения к серверу «на лету», без перезагрузки всей страницы полностью, например:
с использованием XMLHttpRequest (основной метод);
через динамическое создание дочерних фреймов;
через динамическое создание тега <script>.
:grum: Это кому что нравится....У всех этих "решений" есть свои "плюсы и минусы" (с обычными "формами" - просто "проще работать". В данном конкретном случае - единственный оператор присваивания в JavaScript выглядит "проще" чем обращение к XMLHttpRequest ).
Мне это всё было нужно только для генерации "шаблонов" в поле textarea при нажатии на кнопки (каждая кнопка соответствовала генерации определённого фрагмента кода - и как раз это делалось на javaScript). Кроме того для wml - с AJAX и XMLHttpRequest возникнут "определённые проблемы".
:27:
:27:
С мобильностью вообще проблем "выше крыши" - Например - вообще не хочется ставить Java Runtime Environement. Кроме того - средства , предоставляемые "хостингом у провайдера" , обычно до идиотизма ограничены (LAMP - Linux, Apache , MySQL , PHP ) :grum: И в этом случае невозможно заставить провайдера установить Java Server Extentions. И даже в этом случае - "проблемы с совместимостью" и т.д. Maintanance & Portability в первую очередь страдают. PHP в этом отношении довольно "дуракоупорный инструмент".
:evillaugh:
Возвращаясь к php, даже внутри примера для php в приведённой ссылке из "Вики" (там дальше внутри есть пример для php с внутри статьи про XMLHttpRequest) - есть то , что можно считать "недостатком": смешение двух разных "языков" (XHTML/XML) и PHP. В контексте "поиска ошибок в больших проектах" вроде бы проще искать ошибки в чём-то одном. Предложенная инкапсуляция XHTML в "библиотеке классов" myhtml была предназначена именно для этой цели. От "стандартной реализации DOM" и от simple XML это всё отличается только usability по отношению к "application developer" (да и вместе всё даже становится чем-то похожим на MFC или BFC - :grum: ).
Знаеш в чём разница между настоящим програмистом и балтуном?

crazy-mike
02-23-2008, 02:23 AM
Знаеш в чём разница между настоящим програмистом и балтуном?
А знаешь в чем разница между разработчиком (developer) и кодировщиком (coder)? Разработчик должен уметь излагать (быть болтуном в том числе) мысли в доступной кодировщику форме. :grum:
Кстати php - довольно suitable для RAD (быстрого создания прототипа работающей системы). А вот когда уже нужно "развёртывать" настоящую большую - то конечно же нужно очень много всего заменять. У этих самых coder-ов ведь довольно "узкая специализация" (ну прямо как у муравьёв). Причём многие из них "веруют" в тот инструмент , которым "владеют" (с точки зрения психоанализа - там ведь ничего странного нет). Для меня php не является фаллическим символом , как и Java (но вот C - это ... O! O! O! :grum: ). Просто именно в последнее время он в самом деле стал довольно "серьёзным языком программирования" (или даже "языком проектирования") ...И самое смешное - что даже "более стандартизированным" чем Java .
:27: А идея всей темы была - просто "поприкалываться" над Joomla и над той "хреновиной" , которую российские (да и украинские - это вообще идиотизм! ) "веб-разводильщики лохов на лавэ" гордо именуют "веб-технологиями" (и даже очень толстые книги издают со скрин-шотами). Кстати - их "бюджетные возможности" практически вынуждают использование решений open-source.
http://ekabu.ru/uploads/posts/2008-02/1202162354_d1926d2d.jpg

Alex_3112
02-25-2008, 12:53 PM
А знаешь в чем разница между разработчиком (developer) и кодировщиком (coder)? Разработчик должен уметь излагать (быть болтуном в том числе) мысли в доступной кодировщику форме. :grum:

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

В нормальной команде не бывает ни "разработчиков" в белых перчатках, ни тупых "кодеров".

crazy-mike
02-26-2008, 01:52 AM
В нормальной команде не бывает ни "разработчиков" в белых перчатках, ни тупых "кодеров".
Если такие "студенты" - как сейчас в Украине ....:evillaugh: (это самый настоящий кошмар). Они почему-то считают - что всё , что хоть как-то написано , должно работать и очень удивляются - когда это совсем не так...:grum:
Может быть это и в самом деле "постсоветская фишка". Но их просто учат работать только исключительно в RAD-средах (другим способом и без использования debugger-ов - они вообще ничего делать не умеют).

crazy-mike
03-04-2008, 10:42 AM
AJAX for dummies :grum:

// index.js

function alertC(htr)
{ if(htr.readyState==4) {
if(htr.status=200) {
//alert(htr.responseText);
xml=htr.responseXML;
rn=xml.getElementsByTagName('hello').item(0);
//alert(rn.firstChild.data);
alert(rn.firstChild.nodeValue);
};
};
}


function getDD()
{ htr=new XMLHttpRequest();
htr.overrideMimeType('text/xml');
htr.onreadystatechange=function() { alertC(htr); };
htr.open('GET','http://somewhere.sometimes.somewhat/try.php',true); htr.send(null);
}


Только вот цеплять мы его будем немного "экзотично" (index.phtml):

<?
require '../../../xobj/myhtml.php';

class xBody extends xhtmlBody {
public final function __construct()
{ parent::__construct("","background-color :#00ffff;");
$b=new xhtmlButton();
$b->setA('onclick','getDD()');
$b->setA('title','AJAX is just cool!');
$b->cat("AJAX test!");
$this->add($b);
}
}

class xHead extends xhtmlHead {
public final function __construct()
{ parent::__construct("&#212;&#197;&#211;&#212; &#206;&#193; AJAX");
$this->add(
new javaScript(file_get_contents("./js/index.js"))
);
}
}

$p=new xhtmlApp(new xHead(),new xBody());
?>




Ну и где-то на somewhere.sometimes.somewhat что-то похожее на:
<?
// try.php
header("Content-type: text/xml");
echo '<?xml version="1.0" ?>';
echo "<root><hello>";
echo "Hell</hello>";
echo "</root>";
?>

:grum:
Вообще-то вполне сносно "работает". Детали работы с БД в самом деле можно прятать в такие "шлюзы уровня приложения" и даже обращаться к ним по https.
Недостаток подхода - ну очень сильно зависит от реализации JavaScript/ECMA script в конкретном браузере. ;)

crazy-mike
03-14-2008, 05:37 AM
http://mynet.ho.ua ;) Где-то там кое-что сейчас у меня заводится. Только "локализовано для Украины"....:grum:
Там правда класс xhtmlPage немного "оптимизирован" под особенности хостинга на ho.ua. Очень "гадкие особенности" на самом деле.
Они у себя используют директиву AddDefaultCharset - даже в основном каталоге для "виртуальных хостов". Просто сделать AddDefaultCharset none - в своём .htaccess вообще не помогает , потому что тогда действует "директива из охватывающего каталога".
В результате у них очень трудно создавать "правильные xhtml-документы в любой кодировке кроме windows-1251.

crazy-mike
03-18-2008, 07:19 AM
http://mynet.ho.ua
:evillaugh Самый настоящий "работающий прототип" объектно-ориентированного SDK для php5 с использованием библиотеки классов myhtml.
Написан полностью с её использованием. ;)
Все скрипты создаются и записываются в http://mynet.ho.ua/app :grum:
Немного пародирует все Visual Programming Workbenchs. Но тем не менее - что-то писать можно (правда лучше всего использовать браузер Opera или Mozilla. С Internet Explorer всё это работать не будет.
Принцип "визуального редактора" довольно "пародийный". При нажатии кнопки на панели инструментов в "буфере редактирования" создаётся "прототип класса" - куда можно вставить всё , что понравится. Вставки делаются или в конец "буфера редактора" или на место вхождения ### (трёх символов).

crazy-mike
03-18-2008, 01:02 PM
Сначала кликнуть по значку "php",
потом - по значку "открыть".
Попадаем в каталог app - где находятся скрипты , которые можно редактировать (или создать новый скрипт). ;)
Эта разновидность RAD провоцирует использование метода создания "классов-потомков" на основе "базовых" и включение созданного "объекта" в контейнер "тело-страницы" (или в какой-нибудь другой). ;)

crazy-mike
03-24-2008, 04:05 AM
;) Кстати - в объектно-ориентированной реализации классов для работы с mysqli (такой "низкоуровневый" интерфейс для работы с libmysqlclient из php) есть глюки. И связаны они в основном с "порочной методикой" построения объекта для инкапсуляции средств для работы с БД. Почему-то разработчики "запихнули" попытку установления соединения с БД в конструктор объекта. Из-за этого - принципиально невозможно получить код ошибки соединения с сервером - в случае , если соединение не установлено (просто объект со всеми его полями не создаётся правильно). В случае использования "необъектной версии" mysqli - всё нормально и без "глюков" (почти). На самом деле этих глюков там - "выше крыши" (никаких проверок на "допустимость типов данных" по крайней мере, Различать MYSQL_RESULT - который является массивом указателей и обычную "переменную PHP" вообще-то и в самом деле "трудновато. Хотя если допустить сущетсвование "дескриптора переменной" (обычно во всех современных интерпретируемых языках что-то такое существует) - то отсутствие диагностики в этих случаях выглядит просто "странным". :grum: Но зато оставляет определённый простор для какого-нибудь варианта инструментальной системы программирования с более строгой поддержкой "constraints" (но использующей php5 в качестве "машинного кода")

crazy-mike
03-25-2008, 10:33 AM
:evillaugh Ужасы про AJAX. Настоящие.
http://developer.mozilla.org/en/docs/AJAX:Getting_Started
;) Заходим и типа читаем весь этот "монгольский универмаг".
Мне нужно всего навсего - светить карту города - на которой в реальном времени отображаются разным цветом данные о состоянии установленного оборудования в точках на карте (работает - зелёное , не работает - красное). Сервисы отображения вообще-то могут быть разными. Параметры отображения - координаты точек в нотации сектор.район.номер-точки. В такой нотации скажем приходят "ответы от источников данных" (вместе с данными о цвете).
Источники данных находятся на различных веб-серверах (с разными IP-адресами).
При "лобовой попытке" сделать всё так как на developer.mozilla.org - наталкиваемся на странную "деталь" - пока все "сервисы" находятся на одной и той же машине - всё работает "как по-писанному". Как только всё находится на разных серверах - запрос httpRequest из javaScript просто не выполняется. Ну и чёрт с ним! На помощь приходит "милашка php" с родной машины - из которого делается запрос к удалённой машине а результат отсылается в качестве ответа на httpRequest из javaScript. И всем хорошо (и браузер "думает" - что "security рулит"). :evillaugh
В результате мой файл mymap.html выглядит примерно так:

<?xml version="1.0" encoding='KOI8-U'?>
<!DOCTYPE HTML PUBLIC "-//W3C/DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtmml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="uk" lang="uk"><head><meta http-equiv="Content-Type" content="text/html; charset=koi8-u; lang=uk">
<title>По карті</title>
<style type="text/css" media="all" >@import url("./sty/my.css");</style>
<script type="text/javascript" language="Javascript">
// <![CDATA[

var hndId=0;
var doQuest="quest.html";
var zwi=0,zhe=0;
var im=new Image();
var axy=[];
var xref=[];

function seeDots(ctx)
{ ctx.strokeStyle="#ff00ff";
ctx.lineWidth=2;
i=0; n=axy.length;
s1=0; s2=2*Math.PI;
while(i<n) {
xy=axy[i]; i++;
x=xy[0]; y=xy[1]; cl=xy[2];
ctx.strokeStyle=cl;
//ctx.strokeRect(x-10,y-10,20,20);
ctx.beginPath();
ctx.arc(x,y,10,s1,s2,false);
ctx.stroke();
};
}

function seeSv(ctx,s1,s2,lmap)
{ j=0; nt=axy.length;
while(j<nt) {
xy=axy[j]; v=xref[j]; j++;
x=xy[0]; y=xy[1]; cl=xy[2];
if(v==lmap) {
ctx.beginPath();
ctx.arc(x,y,10,s1,s2,false);
ctx.stroke();
};
};
}

function svDots(ctx,xml)
{ s1=0; s2=2*Math.PI;
el=xml.getElementsByTagName('cnt').item(0);
cnt=el.firstChild.nodeValue;
i=0;
while(i<cnt) {
el=xml.getElementsByTagName('m'+i).item(0);
lmap=el.firstChild.nodeValue;
el=xml.getElementsByTagName('c'+i).item(0);
cl=el.firstChild.nodeValue;
ctx.strokeStyle=cl;
i++;
seeSv(ctx,s1,s2,lmap)
};

}

function alertC(htr,ctx)
{ if(htr.readyState==4) {
if(htr.status=200) {
xml=htr.responseXML;
cnt=xml.getElementsByTagName('cnt').item(0);
n=cnt.firstChild.nodeValue;
i=0;
while(i<n) {
xn="x"+i; yn="y"+i; cn="c"+i;
ma="m"+i;
xx=xml.getElementsByTagName(xn).item(0);
x=xx.firstChild.nodeValue;
yy=xml.getElementsByTagName(yn).item(0);
y=yy.firstChild.nodeValue;
c=xml.getElementsByTagName(cn).item(0);
cl=c.firstChild.nodeValue;
e0=xml.getElementsByTagName(ma).item(0);
lmap=e0.firstChild.nodeValue;
axy[i]=[x,y,cl];
xref[i]=lmap;
i++;
};
seeDots(ctx);
};
};
}

function myDots(ctx)
{ htr=new XMLHttpRequest();
htr.overrideMimeType('text/xml');
htr.onreadystatechange=function() { alertC(htr,ctx); };
htr.open('GET','http://store.airbites.lviv.ua/aj/default.php',true);
htr.send(null);
}

function myIm(wi,he)
{ zwi=wi; zhe=he;
ee=document.getElementById("ab");
ctx=ee.getContext("2d");
im.onload=function () {
ctx.drawImage(im,0,0,wi,he);
e=document.createElement("div");
e.style="position :absolute; left :500px; top :200px; z-index :1; font-size :10em;";
e.textContent="Hello!";
document.body.appendChild(e);
myDots(ctx);
}
im.src="./map/ab.jpg";
}

function myEv(event)
{ x=event.clientX; y=event.clientY;
xx=event.pageX; yy=event.pageY;
vt="myev.php?x="+xx+"&y="+yy;
ee=document.getElementById("ab");
ctx=ee.getContext("2d");
ctx.drawImage(im,0,0,zwi,zhe);
window.name="gmap";
window.open(vt,"myev",
"left="+x+",top="+y+",width=400,height=200,scrollbars=yes,resizable=yes");
}


function svcResult(htr)
{ if(htr.readyState==4) {
if(htr.status=200) {
xml=htr.responseXML;
ee=document.getElementById("ab");
ctx=ee.getContext("2d");
svDots(ctx,xml);
}; // htr.status==200
}; // htr.readyState==4
}


function stSvc(v)
{ htr=new XMLHttpRequest();
htr.overrideMimeType('text/xml');
htr.onreadystatechange=function() { svcResult(htr); };
htr.open('GET',"http://my.something.somewhere/aj/qnode.php?s="+v,true);
htr.send(null);
}


function myHnd()
{ htr=new XMLHttpRequest();
htr.overrideMimeType('text/xml');
htr.onreadystatechange=function() { svcResult(htr); };
htr.open('GET',"http://my.something.somewhere/aj/qnode.php?s="+doQuest,true);
htr.send(null);
}

function onSvc(v,xti)
{ doQuest=v;
if(hndId!=0) {
window.clearInterval(hndId);
hndId=0;
};
hndId=window.setInterval(myHnd,xti);
}
// ]]>
</script>
</head>
<body class="xbody" style="margin :0px;" onload="myIm(3200,2562)" >
<a href="../index.phtml" style="position :fixed;" >
<img class="zret" src="./im/logo.png" /></a>
<canvas id="ab" width="3200" height="2562" onclick="myEv(event)" style="z-index :0;" >&nbsp;</canvas>
<input type="hidden" name="ffi" id="ffi" value="?" onclick="xinfo()" /></body></html>


onSvc = вызывается при "запуске сервиса" , v = URL сервиса (где-то далеко) , xti = время в милисекундах , через которое создается XMLHttpRequest.
При этом свой "thunk" для доступа к "удалённой службе" выглядит как:
<?
$v=$_GET['s'];
$z=file_get_contents($v);
header("Content-type: text/xml");
echo $z;
?>

смешно
03-26-2008, 03:55 PM
И чего я такую тему пропустил! :angel:

crazy-mike
03-27-2008, 10:46 AM
;) А теперь попробуем расширить возможности myhtml для работы с SVG-графикой.
<?
class svgPage extends xhtmlObj {
public $p;

private function prologue() {
$this->p='<?xml version="1.0" '.'encoding="koi8-u" standalone="no"?>';
$this->p.='<!DOCTYPE svg PUBLIC ';
$this->p.='"-//W3C/DTD SVG 1.1/EN" ';
$this->p.='"http://www.w3.org/Graphics/SVG/DTD/svg11.dtd">';
}

public function __construct($width,$height)
{ $this->prologue();
$this->p.='<svg width="'.$width.'" height="'.$height.'" ';
$this->p.='version="1.1" baseProfile="full" ';
$this->p.='xmlns="http://www.w3.org/2000/svg" ';
$this->p.='xmlns:xlink="http://www.w3.org/1999/xlink" ';
$this->p.='xmlns:ev="http://www.w3.org/2001/xml-events">';
}

public function is()
{ $q = $this->p."</svg>";
return $q;
}

final public function add(xhtmlObj $v)
{ $this->p.=$v->is();
}

final public function display()
{ header("Content-type: image/svg+xml");
echo $this->is();
}

final public function see()
{ ob_start("ob_gzhandler");
header("Content-type: image/svg+xml");
$a=$this->is();
echo $b;
}

}

class svgImg extends xhtmlTag {
public function __construct($id,$href,$x,$y,$w,$h)
{ parent::__construct("image");
$this->setAV(array(
"id" => $id, "xlink:href" => $href,
"x" => $x, "y" => $y, "width" => $w, "height" => $h
));
}
}

class svgG extends xhtmlTag {
public function __construct()
{ parent::__construct("g");
}
}


?>
;) Создаём что-то такое.
Теперь "svg-страничку на php" можно создать достаточно тупым способом:
<?
require '../../xobj/myhtml.php';
require '../../xobj/mysvg.php';
$p=new svgPage(1000,1000);
$g=new svgG();
$im=new svgImg("mypic","./im/teheran.jpg",0,0,1000,1000);
$g->add($im);
$p->add($g);
$p->display();
?>
Хотя бы так...Если учесть - что для тега "g" всегда можно вставить обработку события "onload" - в которой на JavaScript через DOM-интерфейс при желании дорисовывается всё , что понравится....
<?
require '../../xobj/myhtml.php';
require '../../xobj/mysvg.php';
$p=new svgPage(1000,1000);
$js=new javaScript(file_get_contents("./js/map.js"));
$g=new svgG();
$im=new svgImg("mypic","./im/syh0.jpg",0,0,1000,1000);
$g->setA("onload","myLd()");
$g->add($im);
$p->attach($js,$g);
$p->display();
?>
Ну и какой-нибудь файл ./js/map.js:

function myLd()
{ alert("Loader is OK!")
}

Ну это пока в нём ничего нет. На самом деле внутри могут быть обработчики событий от мышки и XMLHttpRequest...Графический редактор вообще-то должен сводиться к "отлавливанию координат мышки" , "выбору команды" и "корректировки области отображения в зависимости от выполненной команды". Выполнение команды может сводиться к отсыланию запроса XMLHttpRequest или к "открытию окна" по window.open (или ещё что-нибудь - типа el=document.createElement(...) а потом document.getElementById('mumu').appendChild(el)).

Olezhik
03-29-2008, 01:42 AM
Миша, извени за нескромны вопрос. А нафига ты это всё тут пишиш? Тоько если можно своими словами, спасибо :)

crazy-mike
03-29-2008, 02:29 AM
Миша, извени за нескромны вопрос. А нафига ты это всё тут пишиш? Тоько если можно своими словами, спасибо :)
А вдруг это блог? И это всё на самом деле работает - между прочим. Просто глянь в самое начало темы - мы там с CatOfCheshire немного поприкалывались над PHP-builder'ами. Небольшое доказательство того - что такой builder может написать каждый , а коммерческие веб-разработчики часто "разводят лохов на лавэ" , когда говорят мантру "джумла лягла".

crazy-mike
03-29-2008, 03:46 AM
Миша, извени за нескромны вопрос. А нафига ты это всё тут пишиш? Тоько если можно своими словами, спасибо :)
Всё на самом деле с шутки началось. Меня просто на работе достали "кодеры-девелоперы" которые не могли перетащить своё творение на другую машину , потому что у них "джумла ложилась".
Я попробовал представить - что можно было сделать "без джумлы" , но с ООП.
Попалась на глаза книга Питера Ловейна (одна из хороших - среди всякой мути).
http://www.ozon.ru/context/detail/id/3452954/
http://www.ozon.ru/multimedia/books_covers/1000583322.jpg
Питер Ловэйн
Объектно-ориентированное программирование на PHP 5
Object-Oriented PHP: Concepts, Techniques, and Code
;) Ну я и "сипровизизировал" примерно минут за десять (уже когда эту книгу читал). Потом решил "проверить предположение на практике" - и начал соответствующим образом модифицировать одну из наших внутренних подсистем администрирования через web-интерфейс. А дальше пошло-поехало - потому что такая "самая тупая из возможных реализаций" (даже без использования передачи параметров по ссылке) очень сильно повышала useability и управляемость. :grum:
А потом - когда читал какую-то статью о Software as Service попробовал нарисовать для внутреннего употребления IDE для PHP5 с web-интерфейсом и использованием браузера Opera в качестве терминала (с применением этой же библиотеки классов - всё до идиотизма последовательно).
Материала набралось может быть даже на книгу "покруче" чем у Питера Ловейна. ;) Я сам очень сильно удивился - что оно работает!!!!!! (и даже неплохо работает. И оно - очень маленькое по размеру).
;) Кучу "заморочек" - на которые наталкивался - просто выкладывал в этот "трид".
:27: Кстати - большое спасибо за идею с AJAX!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!

смешно
04-01-2008, 01:30 PM
Миха, пиши, пиши. Очень интересно.

crazy-mike
04-02-2008, 08:20 AM
Расширять получившуюся библиотеку классов вообще-то довольно просто.
Например , довольно удобный класс для использования внешних каскадных стилей мог выглядить так:

class linkCSS extends xhtmlTag {
public final function __construct($href)
{ parent::__construct("link");
$this->setAV(
array( "rel" => "stylesheet", "type" => "text/css",
"href" => $href
)
);
}
}
Ну и заголовок какой-нибудь страницы соответственно:

class myPageHead extends xhtmlHead {
public final function __construct()
{ parent::__construct("this is a web page!");
$this->attach(new linkCSS("http://somewhere.something.net/my.css"));
}
}

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

ETTY
04-02-2008, 05:46 PM
Можно ли в php подконектится к SQL Server используя DSN ?
какой драйвер работает с ODBC ?

crazy-mike
04-03-2008, 02:47 AM
Можно ли в php подконектится к SQL Server используя DSN ?
какой драйвер работает с ODBC ?
Из php можно цепляться к Microsoft SQL server вообще без ODBC.
mssql_bind -- Adds a parameter to a stored procedure or a remote stored procedure
mssql_close -- Close MS SQL Server connection
mssql_connect -- Open MS SQL server connection
mssql_data_seek -- Moves internal row pointer
mssql_execute -- Executes a stored procedure on a MS SQL server database
mssql_fetch_array -- Fetch a result row as an associative array, a numeric array, or both
mssql_fetch_assoc -- Returns an associative array of the current row in the result set specified by result_id
mssql_fetch_batch -- Returns the next batch of records
mssql_fetch_field -- Get field information
mssql_fetch_object -- Fetch row as object
mssql_fetch_row -- Get row as enumerated array
mssql_field_length -- Get the length of a field
mssql_field_name -- Get the name of a field
mssql_field_seek -- Seeks to the specified field offset
mssql_field_type -- Gets the type of a field
mssql_free_result -- Free result memory
mssql_free_statement -- Free statement memory
mssql_get_last_message -- Returns the last message from the server
mssql_guid_string -- Converts a 16 byte binary GUID to a string
mssql_init -- Initializes a stored procedure or a remote stored procedure
mssql_min_error_severity -- Sets the lower error severity
mssql_min_message_severity -- Sets the lower message severity
mssql_next_result -- Move the internal result pointer to the next result
mssql_num_fields -- Gets the number of fields in result
mssql_num_rows -- Gets the number of rows in result
mssql_pconnect -- Open persistent MS SQL connection
mssql_query -- Send MS SQL query
mssql_result -- Get result data
mssql_rows_affected -- Returns the number of records affected by the query
mssql_select_db -- Select MS SQL database

Там всё практически так - как и со всеми остальными СУБД. Для php работа с СУБД с поддержкой SQL - даже "по-своему" унифицирована.
Есть даже набор функций для работы с ODBC-драйверами (только всё это обычно работает "медленнее" чем "напрямую").

odbc_autocommit -- Toggle autocommit behaviour
odbc_binmode -- Handling of binary column data
odbc_close_all -- Close all ODBC connections
odbc_close -- Close an ODBC connection
odbc_columnprivileges -- Returns a result identifier that can be used to fetch a list of columns and associated privileges
odbc_columns -- Lists the column names in specified tables
odbc_commit -- Commit an ODBC transaction
odbc_connect -- Connect to a datasource
odbc_cursor -- Get cursorname
odbc_data_source -- Returns information about a current connection
odbc_do -- Synonym for odbc_exec()
odbc_error -- Get the last error code
odbc_errormsg -- Get the last error message
odbc_exec -- Prepare and execute a SQL statement
odbc_execute -- Execute a prepared statement
odbc_fetch_array -- Fetch a result row as an associative array
odbc_fetch_into -- Fetch one result row into array
odbc_fetch_object -- Fetch a result row as an object
odbc_fetch_row -- Fetch a row
odbc_field_len -- Get the length (precision) of a field
odbc_field_name -- Get the columnname
odbc_field_num -- Return column number
odbc_field_precision -- Synonym for odbc_field_len()
odbc_field_scale -- Get the scale of a field
odbc_field_type -- Datatype of a field
odbc_foreignkeys -- Returns a list of foreign keys in the specified table or a list of foreign keys in other tables that refer to the primary key in the specified table
odbc_free_result -- Free resources associated with a result
odbc_gettypeinfo -- Returns a result identifier containing information about data types supported by the data source
odbc_longreadlen -- Handling of LONG columns
odbc_next_result -- Checks if multiple results are available
odbc_num_fields -- Number of columns in a result
odbc_num_rows -- Number of rows in a result
odbc_pconnect -- Open a persistent database connection
odbc_prepare -- Prepares a statement for execution
odbc_primarykeys -- Returns a result identifier that can be used to fetch the column names that comprise the primary key for a table
odbc_procedurecolumns -- Retrieve information about parameters to procedures
odbc_procedures -- Get the list of procedures stored in a specific data source
odbc_result_all -- Print result as HTML table
odbc_result -- Get result data
odbc_rollback -- Rollback a transaction
odbc_setoption -- Adjust ODBC settings
odbc_specialcolumns -- Returns either the optimal set of columns that uniquely identifies a row in the table or columns that are automatically updated when any value in the row is updated by a transaction
odbc_statistics -- Retrieve statistics about a table
odbc_tableprivileges -- Lists tables and the privileges associated with each table
odbc_tables -- Get the list of table names stored in a specific data source
Кроме всего этого - есть ещё и довольно "экзотический" набор функций PDO. - Это класс для инкапсуляции функций для работы с SQL-серверами.

PDO->beginTransaction() -- Initiates a transaction
PDO->commit() -- Commits a transaction
PDO->__construct() -- Creates a PDO instance representing a connection to a database
PDO->errorCode() -- Fetch the SQLSTATE associated with the last operation on the database handle
PDO->errorInfo() -- Fetch extended error information associated with the last operation on the database handle
PDO->exec() -- Execute an SQL statement and return the number of affected rows
PDO->getAttribute() -- Retrieve a database connection attribute
PDO->getAvailableDrivers() -- Return an array of available PDO drivers
PDO->lastInsertId() -- Returns the ID of the last inserted row or sequence value
PDO->prepare() -- Prepares a statement for execution and returns a statement object
PDO->query() -- Executes an SQL statement, returning a result set as a PDOStatement object
PDO->quote() -- Quotes a string for use in a query.
PDO->rollBack() -- Rolls back a transaction
PDO->setAttribute() -- Set an attribute
PDOStatement->bindColumn() -- Bind a column to a PHP variable
PDOStatement->bindParam() -- Binds a parameter to the specified variable name
PDOStatement->bindValue() -- Binds a value to a parameter
PDOStatement->closeCursor() -- Closes the cursor, enabling the statement to be executed again.
PDOStatement->columnCount() -- Returns the number of columns in the result set
PDOStatement->errorCode() -- Fetch the SQLSTATE associated with the last operation on the statement handle
PDOStatement->errorInfo() -- Fetch extended error information associated with the last operation on the statement handle
PDOStatement->execute() -- Executes a prepared statement
PDOStatement->fetch() -- Fetches the next row from a result set
PDOStatement->fetchAll() -- Returns an array containing all of the result set rows
PDOStatement->fetchColumn() -- Returns a single column from the next row of a result set
PDOStatement->fetchObject() -- Fetches the next row and returns it as an object.
PDOStatement->getAttribute() -- Retrieve a statement attribute
PDOStatement->getColumnMeta() -- Returns metadata for a column in a result set
PDOStatement->nextRowset() -- Advances to the next rowset in a multi-rowset statement handle
PDOStatement->rowCount() -- Returns the number of rows affected by the last SQL statement
PDOStatement->setAttribute() -- Set a statement attribute
PDOStatement->setFetchMode() -- Set the default fetch mode for this statement

Конечно же на "целевой системе" PHP нужно "конфигурировать" (обычно всё это сводится к редактированию файла php.ini.
И при "сборке из исходников" - запуск скрипта configure с соответствующими параметрами... ).
Всё это есть в документации по php на "основных европейских языках"...:cool:

смешно
04-04-2008, 09:01 AM
А с Оракл на прямую тоже работает?

crazy-mike
04-04-2008, 09:05 AM
А с Оракл на прямую тоже работает?
Да! Может работать "напрямую"!!!!! ;)

ETTY
04-04-2008, 04:54 PM
Да! Может работать "напрямую"!!!!! ;)

Спасибо... подрубился через DSN. На прямую чета не хотело... функция возвращала false почему-то... наверное я параметр какой-то не так указал.

Ладно вопрос еще такой, по SMTP. Есть отдельная тема про это... правда там еще никто ничего не ответил.
Короче сервак на Win 2003, IIS6... SMTP.
PHP mail() не хочет нихрена отправлять, 25 порт открыт. Мот в настройка SMTP чаво не так сделал?

crazy-mike
04-05-2008, 04:42 AM
PHP mail() не хочет нихрена отправлять, 25 порт открыт. Мот в настройка SMTP чаво не так сделал?
mail($to,$subject,$msg,$headers)
Там каждый аргумент - "символьная строка".
$to="[email protected]";
$headers= Это самые настоящие заголовки протокола SMTP.
($headers="Content-type: text/plain; charset=koi8r\r\nContent-Transfer-Encoding: 8bit\r\nFrom: [email protected]\r\n" )
$msg = текст сообщения в зависимости от Content-type. Для text\plain - это самое обычное текстовое сообщение с разделителями строк "\n" (chr(10)).
Примерно так всё выглядит - если SMTP-сервер не использует дополнительную аутентификацию. Существует очень простой способ аутентификации - который очень часто в России используют провайдеры электронной почты (mail.ru и yandex.ru) - на время "сессии SMTP" - нужно держать открытой аутентифицированную сессию POP3. Если этого не делать - то почта отправляться не будет. :cool:

ETTY
04-05-2008, 11:53 AM
mail($to,$subject,$msg,$headers)
Там каждый аргумент - "символьная строка".
$to="[email protected]";
$headers= Это самые настоящие заголовки протокола SMTP.
($headers="Content-type: text/plain; charset=koi8r\r\nContent-Transfer-Encoding: 8bit\r\nFrom: [email protected]\r\n" )
$msg = текст сообщения в зависимости от Content-type. Для text\plain - это самое обычное текстовое сообщение с разделителями строк "\n" (chr(10)).
Примерно так всё выглядит - если SMTP-сервер не использует дополнительную аутентификацию. Существует очень простой способ аутентификации - который очень часто в России используют провайдеры электронной почты (mail.ru и yandex.ru) - на время "сессии SMTP" - нужно держать открытой аутентифицированную сессию POP3. Если этого не делать - то почта отправляться не будет. :cool:

Спасибо, как mail() работает я знаю :) Мой вопрос был - Как настроить SMTP правильно на IIS.
И причем тут Россия и Mail.ru c Яндексом??? :D

crazy-mike
04-07-2008, 02:43 AM
Спасибо, как mail() работает я знаю :) Мой вопрос был - Как настроить SMTP правильно на IIS.
И причем тут Россия и Mail.ru c Яндексом??? :D
Я только с sendmail и postfix работал (под Unix)... Пример c mail.ru - это только то - что могло обычно мешать отправке почты (любая разновидность аутентификации SMTP и списки Trusted Hosts - в любых разновидностях). Там ещё есть "расширения SMTP" (ESMTP). Посмотрите - с какими из них работает Microsoft IIS. Просто вручную откройте сокет на 25-й порт и вводите команды SMTP (и смотрите на ответы). Это можно делать при помощи обычного клиента telnet под любой версией Windows...

Yura717
04-12-2008, 01:59 PM
Я только с sendmail и postfix работал (под Unix)...
ну если только с sendmail работал .... то тогда зачем советы под windows даешь? :)

crazy-mike
04-14-2008, 04:04 AM
ну если только с sendmail работал .... то тогда зачем советы под windows даешь? :)
SMTP (протокол) - не зависит от версии операционной системы вообще-то...;)

crazy-mike
04-16-2008, 01:16 PM
;) А теперь попробуем расширить возможности myhtml для работы с SVG-графикой.

Правда у тэга <svg> есть одна дикая особенность = размер изображения нужно указывать обязательно! (по крайней мере для SVG 1.1) ;)
Поэтому если хочется разместить SVG-контейнер внутри "окошка со скроллингом" то можно поступать примерно так:
SVG-страничка располагается внутри странички с <iframe>. А эта страничка сама располагается внутри совсем другого тега <iframe>. ;)

Примерно так:
$df=new xhtmlIframe("mymap","",
array("style" =>
"border :1px solid; border-color :#ff0000; position :fixed; left :80px; top :95px; width :1000px; height :680px",
"src" => "drillsv.php","align" => "top","border" => 0,
"scrolling" => "yes")
);
$this->add($df);

А в скрипте drillsv.php:
<?
require '../../xobj/myhtml.php';
require '../../xobj/mysvg.php';
session_start();

class drB extends xhtmlBody {
public final function __construct()
{ $fn=$_SESSION["drillfn"];
list($w,$h,$xty,$xat)=getimagesize($fn);
parent::__construct("","margin :0px; width :".$w."px; height :".$h."px");
$df=new xhtmlIframe("xymap",$fn,
array("border" => "0","src" => "drillsvg.psvg","align" => "top")
);
$this->add($df);
}
}

class drH extends xhtmlHead {
public final function __construct()
{ parent::__construct("");
$this->add(
new linkCSS("http://myhost.somewhere.net/my.css")
);
}
}

$p=new xhtmlApp(new drH(),new drB());
?>
И дальше сама SVG-графика в файле drillsvg.psvg:
<?
require '../../xobj/myhtml.php';
require '../../xobj/mysvg.php';
session_start();

class mySV extends svgPage {
public final function __construct()
{ $fn=$_SESSION["drillfn"];
parent::__construct($fn);
$this->add(
new javaScript(file_get_contents("./js/drillsvg.js"))
);
$gg=new svgG();
$gg->setA("id","board");
$gg->setA("style", "margin :0px");
$gg->setA("onclick","myEv(event)");
$gg->setA("onmousemove","myMv(event)");
$im=new svgImg("zmap",$fn);
$im->setA("style","border :none; margin :0px");
$im->setA("onload","myLd()");
$gg->add($im);
$this->add($gg);
$this->display();
}
}

$p=new mySV();

?>

:bis: Примерно так. Всё остальное (загрузку "mesh" (сетки карты) для редактирования) можно прятать в JavaScript.

crazy-mike
04-18-2008, 10:26 AM
Ну а теперь попробуем собрать это всё в кучу. Небольшая пародия под аббревиатурой RIA (Rich Internet Application). :grum: (почти)
Примерная функциональность:
1 = upload рисунка
2 = накладывание сетки (mesh) на рисунок
3 = выбор URL сценария на удалённой машине - который сможет посылать данные для обновления на "карте" (рисунок + сетка)
4 = запуск всего этого (Object Renderer (Media Renderer))
:umn: Допустим - что всё вместе называется "freak maps" (или как угодно).
Описание объекта скорее всего должны храниться в базе данных. Хотя можно обойтись и файлами в каталогах (и обновлять их по ftp).
Допустим также - что сценарий на удалённой машине может вызываться или однократно или периодически. Upload для рисунка - вообще-то выполняется довольно просто. Через <input type="file" ...>. Варианты выбора карт из оглавления через базу данных или из файловой системы по ftp - это даже просто скучно. Самое интересное === интерактивное создание сетки на "карте" и вызов скриптов с отображением результатов на карте. Всего изложенного в предидущем посте вполне достаточно для того чтобы создать в окне браузера страничку с "пустой картой" внутри. Всё остальное должно браться откуда-то внутри сценария Javascript на странице.
Создаваться оно всё будет при выполнении функции myLd() - которая будет вызвана по событию "onload" (загрузка страницы). Конечно всё можно было бы делать чуть иначе - построить весь "зависимый код внутри сценария php" (и даже создать код javascript). Недостаток этого второго подхода - "нагрузка на сервер" (и не только. Проще придерживаться "стиля Гарвардской архитектуры" = когда код принципиально не является "самомодифицируемым" = отлаживать в этом случае всё немного проще).

crazy-mike
04-18-2008, 11:08 AM
Вот это примерный вариант скрипта для "обучалки карты" для браузера Opera.
var svc="http://st.lviv.ua/mapof/aj/getmap.php";
var xns="http://www.w3.org/2000/svg";
var isld=true;
var mv=true;
var xuser="?";
var xmap=0;
var mypen=null;
var myinf=null;
var curx=0,cury=0;
var cnt=0;
var dots=[];

function aboutDot(cx,cy)
{ /*
myinf.setAttribute("x",cx);
myinf.setAttribute("y",cy);
myinf.textContent=w;
*/
}

function drawDot(k)
{ a=dots[k];
x=a[0]; y=a[1]; dc=a[2]; vtext=a[5];
vxe=window.document.getElementById('board');
if(a[4]==null) my=window.document.createElement('rect');
else my=a[4];
my.id="dot"+k;
my.setAttribute('x',x-10);
my.setAttribute('y',y-10);
my.setAttribute('width',21);
my.setAttribute('height',21);
my.setAttribute('fill','none');
my.setAttribute('stroke','#c200ff');
my.setAttribute('stroke-width',2);
if(a[4]==null) vxe.appendChild(my);
//
if(a[6]==null) mt=window.document.createElement('text');
else mt=a[6];
mt.id="mu"+k;
mt.setAttribute('x',x);
mt.setAttribute('y',y);
mt.setAttribute('font-size',12);
mt.setAttribute('font-weight','normal');
mt.setAttribute('fill','#c20000');
mt.textContent=vtext;
if(a[6]==null) vxe.appendChild(mt);
a[6]=mt;
//
a[4]=my; dots[k]=a;
}

function addToDot(sn,svidx)
{ a=dots[sn];
a[5]=svidx; dots[sn]=a;
drawDot(sn);
}

function myAct(htr,sn)
{ if(htr.readyState==4) {
if(htr.status=200) {
xml=htr.responseXML;
zuser=xml.getElementsByTagName('myindex').item(0);
svidx=zuser.firstChild.nodeValue;
addToDot(sn,svidx);
};
};
}

function actualizeDot(sn,dic)
{ htr=new XMLHttpRequest();
htr.overrideMimeType('text/xml');
htr.onreadystatechange=function() { myAct(htr,sn); };
sv="http://st.lviv.ua/mapof/aj/getidx.php?dic="+dic;
htr.open('GET',sv,true);
htr.send(null);
}




function newDot(x,y,dic)
{ k=dots.length;
dots.push([x,y,dic,0,null,"?",null]);
actualizeDot(k,dic);
}


function ediDot(x,y,dic)
{ k=cnt;
i=0; c=x+","+y;
while(i<k) {
a=dots[i];
ax=a[0]; ay=a[1]; del=a[3];
if(del==1) { i++; continue; };
av=ax+","+ay;
if(av==c) {
dic0=a[2];
a[2]=dic; dots[i]=a;
if(dic0!=dic) actualizeDot(i,dic);
return;
};
i++;
};
}


function delDot(x,y)
{ k=dots.length;
i=0; c=x+","+y;
while(i<k) {
a=dots[i];
ax=a[0]; ay=a[1]; del=a[3];
if(del==1) { i++; continue; };
av=ax+","+ay;
if(av==c) {
a[3]=1; dots[i]=a;
vxe=window.document.getElementById('board');
el=a[4];
vxe.removeChild(el);
tx=a[6];
if(tx!=null) vxe.removeChild(tx);
return;
};
i++;
};
}

function myRes(htr)
{ if(htr.readyState==4) {
if(htr.status=200) {
xml=htr.responseXML;
zuser=xml.getElementsByTagName('user').item(0);
xuser=zuser.firstChild.nodeValue;
//
el=xml.getElementsByTagName('cnt').item(0);
cnt=el.firstChild.nodeValue;
for(i=0; i<cnt; i++) {
el=xml.getElementsByTagName('x'+i).item(0);
x=el.firstChild.nodeValue;
el=xml.getElementsByTagName('y'+i).item(0);
y=el.firstChild.nodeValue;
el=xml.getElementsByTagName('d'+i).item(0);
d=el.firstChild.nodeValue;
el=xml.getElementsByTagName('r'+i).item(0);
idx=el.firstChild.nodeValue;
dots.push([x,y,d,0,null,idx,null]);
drawDot(i);
};
isld=false; myinf.textContent="Дані завантажено!";
};
};
}

function myUser()
{ htr=new XMLHttpRequest();
htr.overrideMimeType('text/xml');
htr.onreadystatechange=function() { myRes(htr); };
htr.open('GET',svc,true);
htr.send(null);
}

function myLd()
{ myUser();
vxe=document.getElementById('board');
mypen=document.createElement('rect');
mypen.id="mypen";
mypen.setAttribute('x',20);
mypen.setAttribute('y',20);
mypen.setAttribute('width',21);
mypen.setAttribute('height',21);
mypen.setAttribute('fill','none');
mypen.setAttribute('stroke','#100ea6');
mypen.setAttribute('stroke-width',4);
vxe.appendChild(mypen);
//
myinf=document.createElement('text');
myinf.id="myinf";
myinf.setAttribute('x',40);
myinf.setAttribute('y',11);
myinf.setAttribute('font-size',15);
myinf.setAttribute('font-weight','bold');
myinf.setAttribute('fill','#100ea6');
myinf.textContent="читаємо...";
vxe.appendChild(myinf);
}

function myTo(x,y)
{ curx=x; cury=y;
mypen.setAttribute('x',x-10);
mypen.setAttribute('y',y-10);
}

function myMv(event)
{ if(isld) return;
if(mv) myTo(event.pageX,event.pageY);
}

function myEv(event)
{ if(isld) return;
if(mv) mv=false; else mv=true;
myTo(event.pageX,event.pageY);
if(!mv) aboutDot(curx,cury);
}

function setupDot()
{ v="setupdot.php?x="+curx+"&y="+cury;
window.open(v,"dosetup",
"left=200,top=500,width=400,height=300,scrollbars=y es");
}

function deleteDot()
{ v="deletedot.php?x="+curx+"&y="+cury;
window.open(v,"dodel",
"left=200,top=500,width=400,height=300,scrollbars=y es");
}

crazy-mike
04-18-2008, 11:28 AM
Функция myLd() инициирует загрузку уже введенных точек сети из какого либо источника. (вызывает процедуру myUser() = там как раз и делается AJAX запрос - а из полученного результата строится начальная сеть на "карте").
Функция myLd создаёт также "курсор на карте" (такой бегающий квадратик на карте ) - mypen.
Курсор создаётся так:
vxe=document.getElementById('board');
mypen=document.createElement('rect');
mypen.id="mypen";
mypen.setAttribute('x',20);
mypen.setAttribute('y',20);
mypen.setAttribute('width',21);
mypen.setAttribute('height',21);
mypen.setAttribute('fill','none');
mypen.setAttribute('stroke','#100ea6');
mypen.setAttribute('stroke-width',4);
vxe.appendChild(mypen);
Это обычное использование DOM-интерфейса. В основном мы используем тот факт - что пока страница не перегружается - все "глобальные переменные javascript" сохраняют свои значения.
Для того чтобы поставить курсор в нужную позицию - его не надо "перерисовывать". Достаточно просто присвоить аттрибутам "x" и "y" требуемые координаты.
Обработка события "onmousemove" от мышки - осуществяется функцией myEv(event). Нам нужно разрешать "учить карту" (создавать сетку на карте) - только после окончания загрузки "начальной сети" (сохранённой сети). Поэтому обработчик проверяет значение переменной isld (состояние готовности загрузки). Одним из преимуществ javascript (по сравнению с Java) - в этом случае является отсутствие необходимости использовать модификаторы synchronized или volatile для переменных (интерпретатор javascript это всё и так "правильно отрабатывает" - а threads в javascript просто не существует. Мы пользуемся двумя views для выполнения - одно с concurrency (xmlHttpRequest) , а другое "javascript internal").

crazy-mike
04-19-2008, 03:17 AM
Как только "загрузка состояния карты" заканчивается - значение переменной isld устанавливается в false. (это внутри handler-а AJAX-запроса = function myRes).
В myRes - по полученным в виде XML данным - на карте "рисуются" (создаются) "объекты". Ссылки на "объекты" заносятся в массив dots (для того чтобы даже не пытаться "лазить по дереву документа". Кроме того "лазить по дереву документа" через функции DOM-интерфейса для динамически созданных элементов - это вообще странное садисткое занятие. DOM-document в браузере Opera является "защищённым" и для "свежедобавленных элементов" функция getElementById() - возвращает null. С точки зрения "быстродействия" - этот подход понять можно. (Но "простить - никогда!")). Сначала данные о каждой точке заносятся в массив dots (по dots.push) , а потом для созданного элемента массива создаются дополнительные объекты.

function drawDot(k)
{ a=dots[k];
x=a[0]; y=a[1]; dc=a[2]; vtext=a[5];
vxe=window.document.getElementById('board');
if(a[4]==null) my=window.document.createElement('rect');
else my=a[4];
my.id="dot"+k;
my.setAttribute('x',x-10);
my.setAttribute('y',y-10);
my.setAttribute('width',21);
my.setAttribute('height',21);
my.setAttribute('fill','none');
my.setAttribute('stroke','#c200ff');
my.setAttribute('stroke-width',2);
if(a[4]==null) vxe.appendChild(my);
//
if(a[6]==null) mt=window.document.createElement('text');
else mt=a[6];
mt.id="mu"+k;
mt.setAttribute('x',x);
mt.setAttribute('y',y);
mt.setAttribute('font-size',12);
mt.setAttribute('font-weight','normal');
mt.setAttribute('fill','#c20000');
mt.textContent=vtext;
if(a[6]==null) vxe.appendChild(mt);
a[6]=mt;
//
a[4]=my; dots[k]=a;
}
my = это "квадратик на карте вокруг точки". mt = текстовая подпись для точки на карте. После того как "данные загрузятся" (и все объекты на карте будут "прорисованы") обработчик событий от мышки (и onmousemove и onclick) начинает эти события обрабатывать.

crazy-mike
04-22-2008, 09:35 AM
Событие onmousemove "отрабатывается" простым считыванием координат мышки относительно "рабочей области" (внутри фрейма) и никаких смещений ни добавлять ни отнимать при этом не надо.
event.pageX, event.pageY = это и есть координаты точки на карте (куда нужно переместить указатель mypen). Указатель перемещается простым указанием новых координат:
function myTo(x,y)
{ curx=x; cury=y;
mypen.setAttribute('x',x-10);
mypen.setAttribute('y',y-10);
}

crazy-mike
04-25-2008, 02:51 AM
Дальше все работает просто: В охватывающем окне для "скроллера svg" есть "меню из кнопок".
private final function myBut($id,$txt,$info,$onPress)
{ $b=new xhtmlButton($id,"xsel",
"width :80px; border :1px solid; border-color :white",
array("onclick" => $onPress,"title" => $info)
);
$b->cat($txt); return $b;
}

private final function toolBar()
{ $tb=new xhtmlTag("div");
$tb->setAV(array(
"class" => "xsel",
"style" => "position :fixed; left :0px; top :92px; ".
"width :80px; height :600px; display :block"
));
$tb->attach(
$this->myBut("b1","Описание точки",
"Создать/модифицировать описание точки на карте","setupDot()"),
$this->myBut("b2","Удалить точку",
"Удалить описание точки на карте","delDot()")
);
$this->add($tb);
}
Всё это просто вызывается во "всплывающих окнах" внутри JavaScript:
function setupDot()
{ window.window.mymap.xymap.setupDot();
}

function delDot()
{ window.window.mymap.xymap.deleteDot();
}

Только оно вызывается на самом деле из JavaScript внутри svg-контейнера (и поэтому всем этим функциям доступны данные внутри svg-контейнера)
Функция setupDot() просто вызывает php-скрипт во "всплывающем" (popup) окне.
function setupDot()
{ v="setupdot.php?x="+curx+"&y="+cury;
window.open(v,"dosetup",
"left=200,top=500,width=400,height=300,scrollbars= yes");
}
И конечно же передаёт скрипту "координаты курсора". Скрипт setupdot.php выглядит сравнительно просто (обычная форма для CGI с method="post"):

crazy-mike
04-25-2008, 02:59 AM
<?
require '../../xobj/myhtml.php';
session_start();

class sdB extends xhtmlBody {
private $qdbn,$dbc,$xuser,$xmap;

private final function mkSel($cur)
{ $q="select isn,info,lmap,bone,bn,";
$q.="(select info from dotclass where isn=dotdic.sub)";
$q.=" from dotdic order by lmap,bone,bn";
$r=pg_query($this->dbc,$q); $n=pg_num_rows($r);
$sel=new xhtmlSelect("dic");
$sel->setA("style","width :30em");
$i=0;
$opt=new xhtmlOption(0,"не обирати");
if($cur==0) $opt->setA("selected","selected");
$sel->add($opt);
while($i<$n) {
list($isn,$ad,$lmap,$bone,$bn,$st)=pg_fetch_row($r ,$i);
$i++;
$st=pg_unescape_bytea($st);
$opt=new xhtmlOption($isn,
$lmap.".".$bone.".".$bn.".&nbsp;".$st.",".$ad);
if($isn==$cur) $opt->setA("selected","selected");
$sel->add($opt);
};
pg_free_result($r);
return $sel;
}


private final function editDot($x,$y,$dic)
{ $fm=new xhtmlForm("setup","doeditdot.php");
$br=new xhtmlBr();
$fm->attach(
new xhtmlInput("hidden","x",$x),
new xhtmlInput("hidden","y",$y),
$this->mkSel($dic),$br,$br,
new xhtmlInput("submit","se","записати")
);
$this->add($fm);
}

private final function newDot($x,$y)
{ $fm=new xhtmlForm("setup","donewdot.php");
$br=new xhtmlBr();
$fm->attach(
new xhtmlInput("hidden","x",$x),
new xhtmlInput("hidden","y",$y),
$this->mkSel(0),$br,$br,
new xhtmlInput("submit","se","створити вузол")
);
$this->add($fm);
}

private final function doIt($xx,$yy)
{ $q="select x,y,dic from dots where map=".$this->xmap;
$r=pg_query($this->dbc,$q); $n=pg_num_rows($r);
$i=0; $x=0; $y=0;
while($i<$n) {
list($x,$y,$dic)=pg_fetch_row($r,$i); $i++;
$x1=$x-10; $x2=$x+10; $y1=$y-10; $y2=$y+10;
if($xx<$x1) continue;
if($xx>$x2) continue;
if($yy<$y1) continue;
if($yy>$y2) continue;
pg_free_result($r); $this->editDot($x,$y,$dic); return;
};
pg_free_result($r);
$this->newDot($xx,$yy);
}

public final function __construct()
{ parent::__construct("xsel","margin :1em");
$x=$_GET["x"]; $y=$_GET["y"];
$this->cat("x=".$x.",y=".$y);
$this->xuser=$_SESSION["who"];
$this->xmap=$_SESSION["map"];
$qdbn="udb_".$this->xuser;
$this->dbc=pg_connect(
"host=127.0.0.1 port=5432 user=postgres dbname=".$qdbn);
$this->doIt($x,$y);
pg_close($this->dbc);
}
}

class sdH extends xhtmlHead {
public final function __construct()
{ parent::__construct("опис точки");
$this->attach(
new linkCSS("../admin/sty/my.css")
);
}
}

$p=new xhtmlApp(new sdH(),new sdB());
?>
Самое прикольное как раз начинается в принимающих результат ввода скриптах. (основная идея - передавать данные в javascript из php при отработке события "onload"). "Плюсиком" такого подхода является остутствие необходимости перезагрузки страниц. Просто - закрыть окно внутри onload.

crazy-mike
04-25-2008, 03:37 AM
Для примера - скрипт donewdot.php
<?
require '../../xobj/myhtml.php';
session_start();

class newDotB extends xhtmlBody {
private $dbc,$xuser,$xmap;

private final function doIt()
{ $x=$_POST["x"]; $y=$_POST["y"]; $dic=$_POST["dic"];
$q="insert into dots(x,y,map,dic) values(";
$q.=$x.",".$y.",".$this->xmap.",".$dic.")";
$r=pg_query($this->dbc,$q); pg_free_result($r);
}

public final function __construct()
{ $x=$_POST["x"]; $y=$_POST["y"]; $dic=$_POST["dic"];
parent::__construct("xsel","","newDot(".$x.",".$y.",".$dic.")");
$this->xuser=$_SESSION["who"];
$this->xmap=$_SESSION["map"];
$qdbn="udb_".$this->xuser;
$this->dbc=pg_connect(
"host=127.0.0.1 port=5432 user=postgres dbname=".$qdbn);
$this->doIt();
pg_close($this->dbc);
}
}

class newDotH extends xhtmlHead {
public final function __construct()
{ parent::__construct("создаём узел на карте");
$this->attach(
new linkCSS("http://store.airbites.lviv.ua/admin/sty/my.css"),
new javaScript(file_get_contents("./js/donewdot.js"))
);
}
}

$p=new xhtmlApp(new newDotH(),new newDotB());

?>
Внутри конструктора класса newDotB (тела страницы) - задаётся обработчик события onload - которому передаются координаты точки.
Обработчик в скрипте donewdot.js выглядит так:
function newDot(x,y,dic)
{ a=window.window.opener;
a.newDot(x,y,dic);
window.close();
}
Поскольку "открывателем" для окна в котором "сработал скрипт" является SVG-контейнер - мы ссылаемся на него через window.window.opener и вызываем процедуру newDot из скрипта - привязанного к SVG-контейнеру. И потом закрываем "своё окошко". ;)

crazy-mike
05-06-2008, 10:09 AM
небольшой "шутк" (класс для "иконки" страницы):
class xhtmlIcon extends xhtmlTag {
public final function __construct($href)
{ parent::__construct("link");
$this->setAV(array(
"rel" => "SHORTCUT ICON",
"href" => $href
));
}
}

Это всё можно "прицепить" к "заголовку страницы" по attach:
class myPageHead extends xhtmlHead {
public final function __construct()
{ parent::__construct("this is an example");
$this->attach(new xhtmlIcon("./myImages/myicon.jpg"));
}
}

Olezhik
05-06-2008, 11:31 AM
Миша, мне вот стало интерестно на сколько форумски фонат [PHP], владеит этим интерестным языком. Ты бы немог решить одну задачку в [PHP]?

А условия задачи очень просты. Знаеш есть такая игра угодай число? Один игрок загадывает число, а 10 других (или 100 других), пытаюца это число отгодать. У каждого игрока по одной попытки. Помойму нитак сложно. Ну чтож давай тогда запишым условия, и так....


$p= 9; //призовое число
$n = array(3,2,1,6,5,8,10,15,20,21); //загаданые номера другими игроками
победитель в даном случй тот игрок кто загадал число 8, потомучто 10 уже перебор.

Какой же самы коротки путь что бы наити это выгрышное число?


:idea: Такой вариант как проверяния каждого число по отдельносты не подходит, потому-что загаданых чисел может быть и 100, тогда этот процес проверяния каждого числаможит затяныца, а надо что-то побыстрея и по экономния(время деньги).

Есть идей, как это можно зделать в [PHP]? :)

crazy-mike
05-06-2008, 12:27 PM
Миша, мне вот стало интерестно на сколько форумски фонат [PHP], владеит этим интерестным языком. Ты бы немог решить одну задачку в [PHP]?

А условия задачи очень просты. Знаеш есть такая игра угодай число? Один игрок загадывает число, а 10 других (или 100 других), пытаюца это число отгодать. У каждого игрока по одной попытки. Помойму нитак сложно. Ну чтож давай тогда запишым условия, и так....


победитель в даном случй тот игрок кто загадал число 8, потомучто 10 уже перебор.

Какой же самы коротки путь что бы наити это выгрышное число?


:idea: Такой вариант как проверяния каждого число по отдельносты не подходит, потому-что загаданых чисел может быть и 100, тогда этот процес проверяния каждого числаможит затяныца, а надо что-то побыстрея и по экономния(время деньги).

Есть идей, как это можно зделать в [PHP]? :)
;) Самым тупым способом:

<?
$nn=array(
0, 3 , 2 , 1 , 6 , 5 , 8 , 10, 15, 20, 21
);
array_push($nn,9);
sort($nn);
$d=array_search(9,$nn); // key for value of 9 will be returned
echo $nn[$d-1];
?>

Могло бы показаться - что лучше числа использовать в качестве ключей. (Но php - это не MUMPS (и не SNOBOL4), и ничего умного с current, prev, next просто не получится ...:grum: ) === php5 автоматически не упорядочивает ключи при занесении элементов в массив.

Olezhik
05-06-2008, 06:56 PM
;) Самым тупым способом:

<?
$nn=array(
0, 3 , 2 , 1 , 6 , 5 , 8 , 10, 15, 20, 21
);
array_push($nn,9);
sort($nn);
$d=array_search(9,$nn); // key for value of 9 will be returned
echo $nn[$d-1];
?>

Могло бы показаться - что лучше числа использовать в качестве ключей. (Но php - это не MUMPS (и не SNOBOL4), и ничего умного с current, prev, next просто не получится ...:grum: ) === php5 автоматически не упорядочивает ключи при занесении элементов в массив.
Дествительно способ не самы лутшы, а если аррэй будет слишком большой такой способ будет слишком медлено выдовать результат, есть какийто другий идеи? ;)


Неужели ты щитаеш в этой задачи правельны ответ тупой? :) подумай над чем-то болие интерестным.

смешно
05-06-2008, 10:20 PM
Миша, мне вот стало интерестно на сколько форумски фонат [php], владеит этим интерестным языком. Ты бы немог решить одну задачку в [php]?

А условия задачи очень просты. Знаеш есть такая игра угодай число? Один игрок загадывает число, а 10 других (или 100 других), пытаюца это число отгодать. У каждого игрока по одной попытки. Помойму нитак сложно. Ну чтож давай тогда запишым условия, и так....


победитель в даном случй тот игрок кто загадал число 8, потомучто 10 уже перебор.

Какой же самы коротки путь что бы наити это выгрышное число?


:idea: Такой вариант как проверяния каждого число по отдельносты не подходит, потому-что загаданых чисел может быть и 100, тогда этот процес проверяния каждого числаможит затяныца, а надо что-то побыстрея и по экономния(время деньги).

Есть идей, как это можно зделать в [php]? :)

Я чего-то не до конца понял условия задачи.
Про загаданное число "8" понял, а вот про проверку не совсем. Типо число не более 10?
Надо называть конкретное число, или можно вставлять фразы "больше", "меньше"?

crazy-mike
05-07-2008, 01:17 AM
Надо называть конкретное число, или можно вставлять фразы "больше", "меньше"?
Просто нужно найти в массиве число не превышающее заданное. При использовании B-деревьев для индекса массива - это делалось бы одним вызовом prev. Но в php индексы являются вариантом хеширования без упорядоченности ключей.
Мало того - последовательность доступа к ключам совпадает с порядком занесения в массив.

crazy-mike
05-07-2008, 02:46 AM
:) подумай над чем-то болие интерестным.
<?
$vMax=1000;
$nn=array_fill(0,$vMax,NULL); //for($i=0; $i<$vMax; $i++) $nn[$i]=NULL;
//
$nn[3]=3; $nn[2]=2; $nn[1]=1; $nn[6]=6; $nn[5]=5;
$nn[8]=8; $nn[10]=10; $nn[15]=15; $nn[20]=20; $nn[21]=21;
$nn[9]=9;
// ordered hashed array has been created
$i=9;
while($i>0) { $i--; $a=$nn[$i];
if($a!=NULL) { echo $a; exit; };
};
?>
:grum:
Так конечно же сравнений намного меньше - но есть одно "но": В интерпретируемых языках "встроенные итераторы" обычно выполняются намного быстрее чем "циклы , записанные на этом языке"...(И "стандартно" - память на "процесс" ограничивается в 4M)
:grum: Можно было и вообще "без мучений":
<?
$nn=array(3 =>3,2 => 2,1 => 1,6 => 6, 5 => 5,
8 => 8,10 => 10,15 => 15,20 => 20,21 =>21 );
$nn[9]=9;
$i=9;
while($i>0) { $i--;
if(array_key_exists($i,$nn)) {
$a=$nn[$i];
echo $a; exit;
};
};
?>

Только в этом случае функция array_key_exists выполняется "непредсказуемо долго" (хотя на самом деле - быстро)...:grum:
Конечно же всё можно делать через SPL (ArrayObject и т.д.). Я только не уверен - что это будет "быстрее"...

crazy-mike
05-07-2008, 03:48 AM
Конечно же всё можно делать через SPL (ArrayObject и т.д.). Я только не уверен - что это будет "быстрее"...
<?
$nn=array(3 =>3,2 => 2,1 => 1,6 => 6, 5 => 5,
8 => 8,10 => 10,15 => 15,20 => 20,21 =>21 );
$va=new ArrayObject($nn);
$va->offsetSet(9,9);
$i=9;
while($i>0) {
$i--;
if($va->offsetExists($i)) {
$dd=$va->offsetGet($i);
echo $dd; break;
};
};
?>
Самое прикольное - что это будет даже медленнее чем с "нормальными массивами". Для SPL можно провести даже такой тест:
<?
$nn=array(3 =>3,2 => 2,1 => 1,6 => 6, 5 => 5,
8 => 8,10 => 10,15 => 15,20 => 20,21 =>21 );
$va=new ArrayObject($nn);
$va->offsetSet(9,9);
$ai=$va->getIterator();
$ai->seek(8);
echo $ai->current(); /* выведет 20 !!!!!!! (8-й по счёту элемент от начала массива). */
?>
Это одна из причин - по которой на SPL лучше особых надежд не возлагать...

Olezhik
05-07-2008, 11:22 AM
Миша, не хотел бы я работать над твоими кодами ;)

Вобшем наити это загадочное число 8 можно.

Например так....

1)Просортеровать все номера от минимального к максимальному.
2) Наити середину
3) Проверить если середина больше или меньше загадного числа 9
4) Если середина больше, то разбить уже разбитую половину арэя на новые две половини и так пока не подберошся к загдоному числу.

:idea: Если Аррэй очень большой ты сикономиш масу времени, а значит и денег.

crazy-mike
05-07-2008, 12:08 PM
Миша, не хотел бы я работать над твоими кодами ;)

Вобшем наити это загадочное число 8 можно.

Например так....

1)Просортеровать все номера от минимального к максимальному.
2) Наити середину
3) Проверить если середина больше или меньше загадного числа 9
4) Если середина больше, то разбить уже разбитую половину арэя на новые две половини и так пока не подберошся к загдоному числу.

:idea: Если Аррэй очень большой ты сикономиш масу времени, а значит и денег.
Наоборот - одни убытки будут. В php для индексации массива используется "хеширование без сохранения упорядоченности ключей" (это не B-деревья!!!!).
An Index is treated as Hash Table in PHP5!!!!!!
Поэтому "в середину" - просто невозможно попасть (и ни один из вариантов бинарного поиска работать не будет!!!!!!!!). ;)
Между прочим - именно эта "фича" и является существенным отличием php от Java!!!!!!!!
:bis: Эти "странности" в php можно объяснить попыткой избежать "излишней фрагментации памяти" (чем "грешат" Java VM ).
Серьёзно - просто попускай любые варианты присваивания элементам массивов - и вывод по print_r !!!! (И эта "странность поведения" для php5 станет видна невооружённым глазом). Поэтому ни один нормальный человек не будет работать с большими массивами в php если нужны "массивы в обычном понимании" - а не "таблицы имён"). А вместо этого использовать хотя бы "интерфейс dbm" (даже в реализации SPL) .
:evillaugh Самое смешное - что help по php5 этих "странностей" пытается не замечать. По крайней мере в "русской документации по php" почему-то настаивают на "поддержке упорядоченности ключей в массивах" (может быть она и была в php3 - но в php5 она куда-то исчезла в результате "оптимизации").
Если бы массивы в php были реализованы хотя бы в виде двусвязных списков (а не односвязных - которые можно обходить только с начала , а не с любого места) - всё было бы нормально ( и для вашего примера - всё делалось бы двумя командами (как в MUMPS):
array_push($n,9);
$d=prev($n);
!!!!! Только в php5 = это просто не будет работать!!!!!
)
:bis: Пример в самом деле был очень красивый (хоть это и не всем заметно) - в смысле объяснения особенностей реализации массивов в php5 (И отличий от Java). ;)

смешно
05-07-2008, 12:12 PM
Миша, не хотел бы я работать над твоими кодами ;)

Вобшем наити это загадочное число 8 можно.

Например так....

1)Просортеровать все номера от минимального к максимальному.
2) Наити середину
3) Проверить если середина больше или меньше загадного числа 9
4) Если середина больше, то разбить уже разбитую половину арэя на новые две половини и так пока не подберошся к загдоному числу.

:idea: Если Аррэй очень большой ты сикономиш масу времени, а значит и денег.

Ну я так и сказал "больше", "меньше", нас так в юношеской школе учили.

crazy-mike
05-07-2008, 12:16 PM
Ну я так и сказал "больше", "меньше", нас так в юношеской школе учили.
В школе почему-то забывают рассказать о по крайней мере трёх моделях организации массивов!!!!!! :grum:
Когда для размещения элемента массива в памяти используется хеш-функция для вычисления адреса по значению ключа - упорядоченность ключей может и не поддерживаться!!!! (намного проще её не поддерживать - чем поддерживать. Поддержание упорядоченности ключей очень сильно замедляет вставку элемента). :grum:

смешно
05-07-2008, 12:20 PM
В школе почему-то забывают рассказать о по крайней мере трёх моделях организации массивов!!!!!! :grum:
Когда для размещения элемента массива в памяти используется хеш-функция для вычисления адреса по значению ключа - упорядоченность ключей может и не поддерживаться!!!! (намного проще её не поддерживать - чем поддерживать. Поддержание упорядоченности ключей очень сильно замедляет вставку элемента). :grum:

Каких ещё "ключей"? Индексов, индексов! :grum:

crazy-mike
05-07-2008, 12:27 PM
Каких ещё "ключей"? Индексов, индексов! :grum:
Keyed Access is not equal to Index Access!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! :grum:
если напишешь что-то такое:
$p=array();
$p[2]=3;
$p[1]=10;
А потом сделаешь print_r($p); // вывести элементы массива $p в порядке размещения
То получишь:
2 => 3
1 => 10
а не
1 => 10
2 => 3
Именно поэтому - никакой бинарный поиск ничего быстрее сделать там не сможет!!!!!! Бинарный поиск по ключу можно делать только в упорядоченных по ключу массивах!!! (это и является одной из "ранних" идей индексирования). Правда при большом числе элементов в массиве - "двоичный индекс" может занимать не меньше места чем сами данные. Поэтому от "обычных индексов" имеет смысл отказываться. Эта тенденция была заметна даже в поздних версиях MUMS.

смешно
05-07-2008, 12:37 PM
если напишешь что-то такое:
$p=array();
$p[2]=3;
$p[1]=10;
А потом сделаешь print_r($p); // вывести элементы массива $p в порядке размещения
То получишь:
2 => 3
1 => 10
а не
1 => 10
2 => 3
Именно поэтому - никакой двоичный поиск ничего быстрее сделать там не сможет!!!!!!

Зачем так сложно? InStr(1,P,'8') :grum:

crazy-mike
05-07-2008, 12:49 PM
Зачем так сложно? InStr(1,P,'8') :grum:
BASIC - "адская хреновина" ;)
Хотя как раз там и появились все эти "проблемы со сборкой мусора" и массивы ссылок...;)
Вообще-то всё началось где-то в LISP...:grum:

смешно
05-07-2008, 12:56 PM
BASIC - "адская хреновина" ;)
Хотя как раз там и появились все эти "проблемы со сборкой мусора" и массивы ссылок...;)
Вообще-то всё началось где-то в LISP...:grum:

Я её использую в Оракле, очень удобно. А ещё удобно пользоваться функцией REPLACE, убирать extra CR. :grum:

crazy-mike
05-07-2008, 01:55 PM
Я её использую в Оракле, очень удобно. А ещё удобно пользоваться функцией REPLACE, убирать extra CR. :grum:
Переносить всю функциональность приложения в хранимые процедуры и в запросы к БД - это несколько "экстремально"...:evillaugh
Меня "улыбает" в каком-нибудь MySQL:
select 2+2;
;)
Сервер БД таки создаст таблицу из одной строки и одного столбца - и в этой клеточке будет таки "4"!!!!!! :grum:

смешно
05-07-2008, 02:40 PM
Переносить всю функциональность приложения в хранимые процедуры и в запросы к БД - это несколько "экстремально"...:evillaugh
Меня "улыбает" в каком-нибудь MySQL:
select 2+2;
;)
Сервер БД таки создаст таблицу из одной строки и одного столбца - и в этой клеточке будет таки "4"!!!!!! :grum:

А куда ещё? Не в браузер же. JAVASCRIPT.:grum:
Не зря сделали такой "table" DUAL. Из него можно чего угодно SELECT. :grum: А как тебе такая оракл функция с романтическим названием DECODE. Кто то же это придумал. :evillaugh

Olezhik
05-07-2008, 07:25 PM
Ну я так и сказал "больше", "меньше", нас так в юношеской школе учили.
Вот, вот, в ЮНОШЕСКОЙ ШКОЛЕ учили, только почемуто очень мало програмисттв помнять :(....

Olezhik
05-07-2008, 07:30 PM
Наоборот - одни убытки будут. В php для индексации массива используется "хеширование без сохранения упорядоченности ключей" (это не B-деревья!!!!).
An Index is treated as Hash Table in PHP5!!!!!!
Поэтому "в середину" - просто невозможно попасть (и ни один из вариантов бинарного поиска работать не будет!!!!!!!!). ;)
Между прочим - именно эта "фича" и является существенным отличием php от Java!!!!!!!!
:bis: Эти "странности" в php можно объяснить попыткой избежать "излишней фрагментации памяти" (чем "грешат" Java VM ).
Серьёзно - просто попускай любые варианты присваивания элементам массивов - и вывод по print_r !!!! (И эта "странность поведения" для php5 станет видна невооружённым глазом). Поэтому ни один нормальный человек не будет работать с большими массивами в php если нужны "массивы в обычном понимании" - а не "таблицы имён"). А вместо этого использовать хотя бы "интерфейс dbm" (даже в реализации SPL) .
:evillaugh Самое смешное - что help по php5 этих "странностей" пытается не замечать. По крайней мере в "русской документации по php" почему-то настаивают на "поддержке упорядоченности ключей в массивах" (может быть она и была в php3 - но в php5 она куда-то исчезла в результате "оптимизации").
Если бы массивы в php были реализованы хотя бы в виде двусвязных списков (а не односвязных - которые можно обходить только с начала , а не с любого места) - всё было бы нормально ( и для вашего примера - всё делалось бы двумя командами (как в MUMPS):
array_push($n,9);
$d=prev($n);
!!!!! Только в php5 = это просто не будет работать!!!!!
)
:bis: Пример в самом деле был очень красивый (хоть это и не всем заметно) - в смысле объяснения особенностей реализации массивов в php5 (И отличий от Java). ;)
Миша ну зачем столько лишних фраз? В середину можно попасть очень лехко, если знаеш как ;) Я тя собствено чего спросил этот вопрос, ты тут просто сотлько всего пишиш о програмированье и о сумашэтших возмозностях [PHP], вот и решил я проверить на сколько могуч этот великолепны язык [PHP], ну и собствено его фанат ТЫ :)

смешно
05-07-2008, 09:01 PM
Вот, вот, в ЮНОШЕСКОЙ ШКОЛЕ учили, только почемуто очень мало програмисттв помнять :(....

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

crazy-mike
05-08-2008, 12:17 AM
Миша ну зачем столько лишних фраз? В середину можно попасть очень лехко, если знаеш как ;) Я тя собствено чего спросил этот вопрос, ты тут просто сотлько всего пишиш о програмированье и о сумашэтших возмозностях [PHP], вот и решил я проверить на сколько могуч этот великолепны язык [PHP], ну и собствено его фанат ТЫ :)
Конечно же знаю. Только "хороший вообще" алгоритм может быть очень неэффективно реализован именно благодаря реализации языка. При сохранении упорядоченности ключей при размещении элементов в массиве - в случае вашей задачи - вообще больше ничего и не надо было . А "сумасшедшие возможности php" относятся только к его области применения. Интересная деталь - в php просто нет типа данных long long (8-байтовые целые числа). Во многих случаях - это просто "неудобно". А с другой стороны - зачем в текстовом процессоре "длинные целые"?

crazy-mike
05-08-2008, 12:32 AM
Просто многие новые элементы языка (в php5) сделали его очень похожим на Java (но только внешне).

Olezhik
05-08-2008, 02:19 AM
Конечно же знаю. Только "хороший вообще" алгоритм может быть очень неэффективно реализован именно благодаря реализации языка. При сохранении упорядоченности ключей при размещении элементов в массиве - в случае вашей задачи - вообще больше ничего и не надо было . А "сумасшедшие возможности пхп" относятся только к его области применения. Интересная деталь - в пхп просто нет типа данных лонг лонг (8-байтовые целые числа). Во многих случаях - это просто "неудобно". А с другой стороны - зачем в текстовом процессоре "длинные целые"?
Зачем длиные целые?.... Чтоб понять на каком уровне ты програмируеш :)

Есть такое понятие как спортивны интерес, вот он во мне и проснулся.

crazy-mike
05-08-2008, 02:59 AM
:)
Есть такое понятие как спортивны интерес, вот он во мне и проснулся.
Во мне он ( спортивный интерес ) тоже проснулся - когда увидел , что в php5 уже можно писать всё так - что будет выглядеть "как на Java" :)
Они ( разработчики ) в самом деле "поработали" над "интерпретатором языка"...

crazy-mike
05-08-2008, 03:20 AM
Зачем длиные целые?....

file_offset === для fseek вообще-то должно бы быть "длинным целым" (восьмибайтовым ) ;) Поэтому аналогичную "функциональность" (даже в случаях подсчёта траффика пользователей в биллинговых системах) приходится "передавать" в серверы БД. И даже в самом деле делать SQL-запросы вида:
select 2222222222222222222222222222222222222 + 33333333333333333333333333333333333333333333333333 ;

Olezhik
05-08-2008, 11:08 AM
Жаль конешно чот ты несмог решить такую простую задачку....

crazy-mike
05-08-2008, 11:11 AM
Жаль конешно чот ты несмог решить такую простую задачку....
Мне не хотелось тупо писать "бинарный поиск" (просто скучно).
А нормальных способов сделать всё там просто нет. ;)

Olezhik
05-08-2008, 11:21 AM
Мне не хотелось тупо писать "бинарный поиск" (просто скучно).
А нормальных способов сделать всё там просто нет. ;)

Есть у меня один хороши знакому боксёр, драца просто обожает. Как непойдём с ним куда-то, он вечно к комуто прицепица. Подерётсал, а точнея получиит по самое нихочу, а потом мне говорил, "Олег, да понимаеш не хотел я его бить как у нас на боксе учят, оперкотами всякими, прямыби, боковыми, а то ты ведь знаеш яб его коньчил, сидеть не охота."
Хотя, помню как то был у него на тренеровки, он грушу и в правду разрывал как тузик грелку...

смешно
05-08-2008, 12:31 PM
Олежик, да нету здесь настоящих программистов кроме тебя и меня. :D :D :D

crazy-mike
05-08-2008, 01:48 PM
Олежик, да нету здесь настоящих программистов кроме тебя и меня.


Хотя, помню как то был у него на тренеровки, он грушу и в правду разрывал как тузик грелку...
:grum: Радуйся! Уговорил!!!! (даже рассмешил немного) Правда какая-то жуть получается (как я и предполагал): :evillaugh

<?
$nn=array(3 =>3,2 => 2,1 => 1,6 => 6, 5 => 5,
8 => 8,10 => 10,15 => 15,20 => 20,21 =>21 );
$i=9;
$nf=9;
$res=0;
$a=0; $b=9;

function mid($a,$b)
{ $v=$a+(($b-$a)>>1);
return $v;
}

function find($a,$b)
{ global $res,$nn;
$m=mid($a,$b);
printf("m=%s,a=%s,b=%s,res=%s\n",$m,$a,$b,$res);
if($m==$a) return;
if(array_key_exists($m,$nn)) {
if($res>$m) return;
if($res<$m) $res=$m;
};
find($a,$m);
find($m,$b);
}

find(0,9);
printf("res=%s\n",$res);
?>
А когда запустишь - то получишь "очень странный вывод числа сравнений":
m=4,a=0,b=9,res=0
m=2,a=0,b=4,res=0
m=1,a=0,b=2,res=2
m=3,a=2,b=4,res=2
m=2,a=2,b=3,res=3
m=3,a=3,b=4,res=3
m=6,a=4,b=9,res=3
m=5,a=4,b=6,res=6
m=7,a=6,b=9,res=6
m=6,a=6,b=7,res=6
m=8,a=7,b=9,res=6
m=7,a=7,b=8,res=8
m=8,a=8,b=9,res=8
res=8

:grum: Инженерное безумие получилось == Неоптимальный Бинарный Поиск (потому что нет критерия остановки на холостых ветках).
А теперь немного "поизвращаемся" (критерий остановки ведь должен быть - хотя бы "вне зоны поиска"):
<?
$nn=array(3 =>3,2 => 2,1 => 1,6 => 6, 5 => 5,
8 => 8,10 => 10,15 => 15,20 => 20,21 =>21 );
$i=9;
$nf=9;
$res=0;
$a=0; $b=9;

function mid($a,$b)
{ $v=$a+(($b-$a)>>1);
return $v;
}

function find($a,$b)
{ global $res,$nn;
if($res>$b) return; // если лучший результат был "получен ранее" == зачем пытаться?
$m=mid($a,$b);
printf("m=%s,a=%s,b=%s,res=%s\n",$m,$a,$b,$res);
if($m==$a) return;
if(array_key_exists($m,$nn)) {
if($res>$m) return;
if($res<$m) $res=$m;
};
find($m,$b);
find($a,$m);
}

find(0,9);
printf("res=%s\n",$res);
?>
Ну и вывод:
m=4,a=0,b=9,res=0
m=6,a=4,b=9,res=0
m=7,a=6,b=9,res=6
m=8,a=7,b=9,res=6
m=8,a=8,b=9,res=8
m=7,a=7,b=8,res=8
res=8
Вот теперь оно и в самом деле немного быстрее чем "emulated linear search". :grum:
Кстати - в $v=$a+(($b-$a)>>1); скобки почему-то надо расставлять именно так. Если пропустить "охватывающие" -- странностей будет ещё больше (я как раз на скобки угробил около часа) :grum:

Olezhik
05-08-2008, 10:50 PM
Олежик, да нету здесь настоящих программистов кроме тебя и меня. :D :D :D
Да я уже сам лет так 5 програмером не работау, всё больше архитектором нафиг :bis: (да, да выше только звёзды, круче только яица)

Olezhik
05-08-2008, 10:55 PM
:grum: Радуйся! Уговорил!!!! (даже рассмешил немного) Правда какая-то жуть получается (как я и предполагал): :evillaugh

<?
$nn=array(3 =>3,2 => 2,1 => 1,6 => 6, 5 => 5,
8 => 8,10 => 10,15 => 15,20 => 20,21 =>21 );
$i=9;
$nf=9;
$res=0;
$a=0; $b=9;

function mid($a,$b)
{ $v=$a+(($b-$a)>>1);
return $v;
}

function find($a,$b)
{ global $res,$nn;
$m=mid($a,$b);
printf("m=%s,a=%s,b=%s,res=%s\n",$m,$a,$b,$res);
if($m==$a) return;
if(array_key_exists($m,$nn)) {
if($res>$m) return;
if($res<$m) $res=$m;
};
find($a,$m);
find($m,$b);
}

find(0,9);
printf("res=%s\n",$res);
?>
А когда запустишь - то получишь "очень странный вывод числа сравнений":
m=4,a=0,b=9,res=0
m=2,a=0,b=4,res=0
m=1,a=0,b=2,res=2
m=3,a=2,b=4,res=2
m=2,a=2,b=3,res=3
m=3,a=3,b=4,res=3
m=6,a=4,b=9,res=3
m=5,a=4,b=6,res=6
m=7,a=6,b=9,res=6
m=6,a=6,b=7,res=6
m=8,a=7,b=9,res=6
m=7,a=7,b=8,res=8
m=8,a=8,b=9,res=8
res=8

:grum: Инженерное безумие получилось == Неоптимальный Бинарный Поиск (потому что нет критерия остановки на холостых ветках).
А теперь немного "поизвращаемся" (критерий остановки ведь должен быть - хотя бы "вне зоны поиска"):
<?
$nn=array(3 =>3,2 => 2,1 => 1,6 => 6, 5 => 5,
8 => 8,10 => 10,15 => 15,20 => 20,21 =>21 );
$i=9;
$nf=9;
$res=0;
$a=0; $b=9;

function mid($a,$b)
{ $v=$a+(($b-$a)>>1);
return $v;
}

function find($a,$b)
{ global $res,$nn;
if($res>$b) return; // если лучший результат был "получен ранее" == зачем пытаться?
$m=mid($a,$b);
printf("m=%s,a=%s,b=%s,res=%s\n",$m,$a,$b,$res);
if($m==$a) return;
if(array_key_exists($m,$nn)) {
if($res>$m) return;
if($res<$m) $res=$m;
};
find($m,$b);
find($a,$m);
}

find(0,9);
printf("res=%s\n",$res);
?>
Ну и вывод:
m=4,a=0,b=9,res=0
m=6,a=4,b=9,res=0
m=7,a=6,b=9,res=6
m=8,a=7,b=9,res=6
m=8,a=8,b=9,res=8
m=7,a=7,b=8,res=8
res=8
Вот теперь оно и в самом деле немного быстрее чем "emulated linear search". :grum:
Кстати - в $v=$a+(($b-$a)>>1); скобки почему-то надо расставлять именно так. Если пропустить "охватывающие" -- странностей будет ещё больше (я как раз на скобки угробил около часа) :grum:
Ну чтож, это уже что-то болие немение похожее на истину, хотя слишком много лишнего... (Вобще эту задачку обычно решают в течений 10-15 минут, а не на протежений 3х-4х дней.)

Лана Миша уговорил, ты уволин, а за старание ставлю те 3 с плюсом :bis:

Serge7
05-08-2008, 11:16 PM
Жаль конешно чот ты несмог решить такую простую задачку.... Ну хватит издеваться-то... :fu: )) :lol:

crazy-mike
05-09-2008, 02:21 AM
Ну чтож, это уже что-то болие немение похожее на истину, хотя слишком много лишнего... :bis:
;) А теперь самое смешное = посчитай "микрооперации" во время реализации "двоичного поиска" (включая доступ к элементам по ключу) и сравни с "числом микроопераций" при последовательном поиске).
Абстрактное "сравнение с элементом" на самом деле при "последовательном поиске с последовательным обходом списка" === занимает примерно 3*O(N) сравнений
Твой любимый "двоичный поиск" занимает порядка 100*Log2(N) сравнений (или даже 1000*Log2(N) === хотя бы потому , что операция "доступ к элементу массива по индексу" занимает довольно много времени (и ещё не учитывается "перезагрузка кеша данных"). Для "современных микропроцессоров" вообще очень трудно писать что-либо "оптимальное" (обычно ограничиваются требованием - "хотя бы работающее").
Кстати - "уволивают" в первую очередь именно "оптимизаторов" (потому как "появление глюка в системе" связывают в первую очередь именно с их деятельностью). Использование "стандартных библиотек" именно и связано с требованием "достижения приемлемой производительности" с минимизацией числа вносимых ошибок...:grum:

Ну чтож, это уже что-то болие немение похожее на истину, хотя слишком много лишнего... (Вобще эту задачку обычно решают в течений 10-15 минут, а не на протежений 3х-4х дней.)

Я её и сделал за 15 минут (только "со скобками" для операции ">>" разбирался около часа :grum: ). Я такую муть обычно очень быстро пишу - но вот "заставляю себя это сделать" ну очень долго...:grum:

crazy-mike
05-09-2008, 02:29 AM
Ну хватит издеваться-то... :fu: )) :lol:
Да пусть порадуется - хоть немного (если бы попробовал представить себе как RAM работает "внутри" - то скорее всего заплакал бы - хотя бы потому , что в микропроцессорных системах последовательный доступ к памяти выполняется обычно быстрее чем "произвольный". То же самое относится и к "системам с виртуальной памятью"...)...:bis: День сегодня солнечный...А если всё время думать о "предсказании наполнения кеша данных" - то и "крыша съедет"...:grum: А с "оптимизацией наполнения кеша команд" - тоже не очень просто...:grum:
С точки зрения "оптимизации использования кеша данных" последовательный поиск является предпочтительнее бинарного. С этим столкнулись ещё при организации хранения данных на магнитных лентах...:grum:
В новых микропроцессорных системах - всё работает "шиворот-навыворот" (и то - что "хорошо как идея" - на самом деле будет медленнее самой "тупой" из реализаций)
:34: Но пример для демонстрации того - что из себя представляют массивы в PHP5 - и в самом деле был очень хороший!!!!! В книжках таких почему-то не бывает...;)

Serge7
05-09-2008, 04:03 AM
Да пусть порадуется - хоть немного (если бы попробовал представить себе как RAM работает "внутри" - то скорее всего заплакал бы - хотя бы потому , что в микропроцессорных системах последовательный доступ к памяти выполняется обычно быстрее чем "произвольный". То же самое относится и к "системам с виртуальной памятью"...)...:bis: День сегодня солнечный...А если всё время думать о "предсказании наполнения кеша данных" - то и "крыша съедет"...:grum: А с "оптимизацией наполнения кеша команд" - тоже не очень просто...:grum:
С точки зрения "оптимизации использования кеша данных" последовательный поиск является предпочтительнее бинарного. С этим столкнулись ещё при организации хранения данных на магнитных лентах...:grum:
В новых микропроцессорных системах - всё работает "шиворот-навыворот" (и то - что "хорошо как идея" - на самом деле будет медленнее самой "тупой" из реализаций)
:34: Но пример для демонстрации того - что из себя представляют массивы в PHP5 - и в самом деле был очень хороший!!!!! В книжках таких почему-то не бывает...;)

Майкуха, не забивай "кодом" просто.. Наши, здесь просто ужасно боятся конкуренции.. Больное место... ;)

crazy-mike
05-09-2008, 04:07 AM
Майкуха, не забивай "кодом" просто.. Наши, здесь просто ужасно боятся конкуренции.. Больное место... ;)
Я на вообще-то "работаю на рынке EMEA" :grum: А GNU - это скорее кооперация чем конкуренция...

Olezhik
05-09-2008, 05:10 AM
Майкуха, не забивай "кодом" просто.. Наши, здесь просто ужасно боятся конкуренции.. Больное место... ;)
Врагов надо знать в лецо :) . А ваще почему сразу конкуренция? Можит я скорперотивитса хотел :) .

Olezhik
05-09-2008, 05:16 AM
Да пусть порадуется - хоть немного (если бы попробовал представить себе как РАМ работает "внутри" - то скорее всего заплакал бы - хотя бы потому , что в микропроцессорных системах последовательный доступ к памяти выполняется обычно быстрее чем "произвольный". То же самое относится и к "системам с виртуальной памятью"...)...:бис: День сегодня солнечный...А если всё время думать о "предсказании наполнения кеша данных" - то и "крыша съедет"...:грум: А с "оптимизацией наполнения кеша команд" - тоже не очень просто...:грум:
С точки зрения "оптимизации использования кеша данных" последовательный поиск является предпочтительнее бинарного. С этим столкнулись ещё при организации хранения данных на магнитных лентах...:грум:
В новых микропроцессорных системах - всё работает "шиворот-навыворот" (и то - что "хорошо как идея" - на самом деле будет медленнее самой "тупой" из реализаций)
:34: Но пример для демонстрации того - что из себя представляют массивы в ПХП5 - и в самом деле был очень хороший!!!!! В книжках таких почему-то не бывает...;)

Га! Га! Га! Что такое рэм? В книшках много чего нет :bis:

crazy-mike
05-09-2008, 07:36 AM
Га! Га! Га! Что такое рэм? В книшках много чего нет :bis:
Random Access Memory
;) Особенно актуально для DRAM (Dynamic Random Access Memory) :grum:
Вообще-то - если следовать "терминологии IBM" , то правомернее было бы использовать термин "storage"...:grum:

смешно
05-09-2008, 09:47 AM
Да я уже сам лет так 5 програмером не работау, всё больше архитектором нафиг :bis: (да, да выше только звёзды, круче только яица)

Консультант круче. Даёшь советы как надо правильно делать. :grum:

смешно
05-09-2008, 09:51 AM
Random Access Memory
;) Особенно актуально для DRAM (Dynamic Random Access Memory) :grum:
Вообще-то - если следовать "терминологии IBM" , то правомернее было бы использовать термин "storage"...:grum:

ОЗУ, ПЗУ, ППЗУ :grum:

crazy-mike
05-09-2008, 09:54 AM
Консультант круче. Даёшь советы как надо правильно делать. :grum:
Даешь советы - как Неправильно делать!!!!! (чтобы сам чёрт ногу во всём этом поломал!!!!!!) :bis:

crazy-mike
05-09-2008, 09:56 AM
ОЗУ, ПЗУ, ППЗУ :grum:
RAM , ROM.
А вот "перепрограммируемое" === это уже "совок" в чистом виде (хотя получается - что "гарвардскую архитектуру" изобрели в СССР ???? :grum: )
А ещё употреблялось выражение "ППЗУ с ультрафиолетовым стиранием" :grum:

Serge7
05-09-2008, 02:56 PM
Врагов надо знать в лецо :) . А ваще почему сразу конкуренция? Можит я скорперотивитса хотел :) .

Вот так хитрый Олежик начинает здесь IT-аутсoрсинг... ;) :)

Главный Принцип аутсорсинга: &#171;оставляю себе только то, что могу делать лучше других, передаю внешнему исполнителю то, что он делает лучше других&#187;. ) :lol: :34:

Alex_3112
05-09-2008, 03:08 PM
что он делает лучше других». ) :lol: :34:
Или дешевле других :)

Olezhik
05-09-2008, 03:51 PM
Или дешевле других :)
Аха за бесплатно :)

Olezhik
05-09-2008, 03:52 PM
Рандом Аццесс Меморы
;) Особенно актуально для ДРАМ (Дынамиц Рандом Аццесс Меморы) :грум:
Вообще-то - если следовать "терминологии ИБМ" , то правомернее было бы использовать термин "стораге"...:грум:
Вот это да.... :rolleyes:

Olezhik
05-09-2008, 03:52 PM
Вот так хитрый Олежик начинает здесь ИТ-аутсорсинг... ;) :)

Главный Принцип аутсорсинга: «оставляю себе только то, что могу делать лучше других, передаю внешнему исполнителю то, что он делает лучше других». ) :лол: :34:
Да я ваще хитретс... :)

crazy-mike
05-09-2008, 05:16 PM
Вот это да.... :rolleyes:
Да не принимайте всё это так серьёзно. Ларри Эллисон из Oracle когда-то вообще сказал, что ушёл бы торговать пирожками - если бы знал, чем весь дурдом в программировании закончится. Можете попробовать усложнить задачу - например - таким способом: содержимое массива изменяется во время выполнения поиска.
:тогда вообще все фильтры стоило бы перенести на оператор присваивания.

Olezhik
05-09-2008, 08:06 PM
Да не принимайте всё это так серьёзно. Ларри Эллисон из Орацле когда-то вообще сказал, что ушёл бы торговать пирожками - если бы знал, чем весь дурдом в программировании закончится. Можете попробовать усложнить задачу - например - таким способом: содержимое массива изменяется во время выполнения поиска.
:тогда вообще все фильтры стоило бы перенести на оператор присваивания.Миша, да раслабся уже с атим массивом, задачка была для первоклассника как говоритса, а ты её уже неделю обмусоливаеш.

А про рэм я долго ражал как ты мне стал с умным видом :znaika: обяснять что это такое....

Serge7
05-09-2008, 11:22 PM
Миша, да раслабся уже с атим массивом, задачка была для первоклассника как говоритса, а ты её уже неделю обмусоливаеш.

А про рэм я долго ражал как ты мне стал с умным видом :znaika: обяснять что это такое.... Олежик! Миха, молодец энивэй... Парень, старается взять все "пласты" в Computer Science! :cool: У нас, просто на это времени здесь нет к сожалению... ;) ) :lol: :34:

Olezhik
05-10-2008, 01:16 AM
Олежик! Миха, молодец энивэй... Парень, старается взять все "пласты" в Цомпутер Сциенце! :цоол: У нас, просто на это времени здесь нет к сожалению... ;) ) :лол: :34:
Да уж.... :lol:

crazy-mike
05-10-2008, 02:26 AM
Да уж.... :lol:
:grum: Можешь попробовать дальше "поприкалываться" - Есть такая специфическая разновидность "кросс-компиляторов" под названием "трансляция одного языка программирования высокого уровня в другой". На вопрос "Зачем?" - есть довольно таки "мотивированный ответ" : при определённых условиях можно "делать интерфейс на php" - а "результат" использвовать в Java в "embedded systems" (без использования шизофренических SDK для "embedded systems") :bis: С C/++ - аналогичная ситуация. MISRA C - очень сильно отличается от C/C++ для Windows Mobile - к примеру...

Olezhik
05-10-2008, 09:15 PM
:grum: Можешь попробовать дальше "поприкалываться" - Есть такая специфическая разновидность "кросс-компиляторов" под названием "трансляция одного языка программирования высокого уровня в другой". На вопрос "Зачем?" - есть довольно таки "мотивированный ответ" : при определённых условиях можно "делать интерфейс на php" - а "результат" использвовать в Java в "embedded systems" (без использования шизофренических SDK для "embedded systems") :bis: С C/++ - аналогичная ситуация. MISRA C - очень сильно отличается от C/C++ для Windows Mobile - к примеру...
Имено так я и зделал вот эту страницу [ http://www.livenation.com/ ] перёд в [php]а зад в [C#] вэб сервесы. Mы пытались что-то зделать подобное [Web 2.0] с тех времён на странитсы многое изменили, но в принцыпе те же яица и конешно моя инфо-структура....

crazy-mike
05-17-2008, 09:53 AM
Имено так я и зделал вот эту страницу [ http://www.livenation.com/ ] перёд в [php]а зад в [C#] вэб сервесы. Mы пытались что-то зделать подобное [Web 2.0] с тех времён на странитсы многое изменили, но в принцыпе те же яица и конешно моя инфо-структура....
Ага. Супер! А почему там javascript так "странно" расположен? (из-за "автоматической генерации" или чтобы не писать "onload" лишний раз?)
http://www.codegear.com/products/delphi/php
Ну вообще-то - довольно серьёзная "штучка".
The VCL for PHP component library combines the best of open source with the ease of visual development

Delphi for PHP utilizes an integrated PHP 5 class library called VCL for PHP. VCL for PHP is open source and accommodates virtually any PHP source code, framework, or library as designable and reusable visual components. Simply place the components into forms and use them in your applications. VCL for PHP components have built-in properties, methods, and events that make web interface development a snap. VCL for PHP is completely extensible, making it simple for you to develop new classes and components.
Только - очевидно - должны возникать некоторые "проблемы" при размещении "созданного приложения" на конкретных серверах. Настройки php.ini для возможности делать include с поддержкой URL - поддерживают просто не все провайдеры хостинга. И сама идея "десктопного IDE" противоречит принципу "Software как услуга".
:evillaugh:
http://www.qadram.com/vcl4php/
А это вообще ужас!!!!!! (у меня всё проще )
Можно конечно делать так - чтобы PHP выгдядело как Java или C# , но различия в семантике вообще-то являются "непреодолимыми" (на примере массивов - это уже немного рассматривали).

crazy-mike
06-04-2008, 08:33 AM
http://www.codegear.com/
Embarcadero Technologies Agrees to Acquire CodeGear from Borland
:leader:
http://dn.codegear.com/article/38132
Today, May 7, 2008, Borland and Embarcadero Technologies announced that Embarcadero Technologies has signed a definitive asset purchase agreement to purchase CodeGear. Together, Embarcadero and CodeGear are expected to create the world’s largest, independent software provider of development and database tools. Here is more information on the announcement:
http://www.codegear.com/about/news/embt

algoritm
06-04-2008, 10:39 AM
Это что означает "The VCL for PHP component library." теперь появится ? :cheer:

crazy-mike
06-04-2008, 10:47 AM
Это что означает "The VCL for PHP component library." теперь появится ? :cheer:
Это означает - что Borland от всех этих VCL открестилась как чёрт от ладана!!!!! :bis:

algoritm
06-04-2008, 11:17 AM
Это означает - что Borland от всех этих VCL открестилась как чёрт от ладана!!!!! :bis:
То есть что ты имеешь в виду ? :)

crazy-mike
06-04-2008, 11:20 AM
То есть что ты имеешь в виду ? :)
Я имею ввиду то - что все эти IDE просто очень плохо продаются и пользуются ими в основном студенты (которым это всё предоставляется бесплатно в "программах обучения") ;)

algoritm
06-04-2008, 11:28 AM
Я имею ввиду то - что все эти IDE просто очень плохо продаются и пользуются ими в основном студенты (которым это всё предоставляется бесплатно в "программах обучения") ;)
А в чём же программируют тогда, и ты это о программировании вообще или о php ? :cheer:

crazy-mike
06-04-2008, 11:31 AM
А в чём же программируют тогда ? :cheer:
Вы не поверите - но в обычных текстовых редакторах (без лишних наворотов).
Обычно основное требование к редактору - чтобы номера строк светились хоть в каком-нибудь виде и search-and-replace работало (вместе с Copy-And-Paste).
;)

algoritm
06-04-2008, 11:39 AM
Вы не поверите - но в обычных текстовых редакторах (без лишних наворотов).
Обычно основное требование к редактору - чтобы номера строк светились хоть в каком-нибудь виде и search-and-replace работало (вместе с Copy-And-Paste).
;)
И всё-таки буду пользоваться IDE, а вместо текстового редактора потом сделаю транскомпилятор если будет нужно, это будет медленно зато вообще никаких ошибок, только логические, то есть результат будет отличаться. :cheer:

crazy-mike
06-04-2008, 11:47 AM
И всё-таки буду пользоваться IDE, а вместо текстового редактора потом сделаю транскомпилятор если будет нужно, это будет медленно зато вообще никаких ошибок, только логические, то есть результат будет отличаться. :cheer:
Для php вообще-то основным видом IDE является web-сервер и браузер на клиентской машине. Ничего больше обычно не нужно (ну разве что сервер БД - и то - не всегда).
Логические ошибки - это очень странное выражение.
Хотя бы потому - что есть "логика потоков данных бизнес-приложения" и "логика организации динамического контента сайта" (область применения php).
Ну и конечно же - "распределение нагрузки на веб-сервер" (это к php непосредственного отношения почти не имеет).
А ещё есть - "требование ответа на запрос пользователя за приемлемое время" ( это влияет на "логику" ) :D

algoritm
06-04-2008, 12:13 PM
Для php вообще-то основным видом IDE является web-сервер и браузер на клиентской машине. Ничего больше обычно не нужно (ну разве что сервер БД - и то - не всегда).
Логические ошибки - это очень странное выражение.
Хотя бы потому - что есть "логика потоков данных бизнес-приложения" и "логика организации динамического контента сайта" (область применения php).
Ну и конечно же - "распределение нагрузки на веб-сервер" (это к php непосредственного отношения почти не имеет).
А ещё есть - "требование ответа на запрос пользователя за приемлемое время" ( это влияет на "логику" ) :D
Приблизительно понял что ты сказал о php, я с ним ещё не работал.
А я про то что вместо "error message" итог работы программы в случае ошибки только значением логического объекта будет отличаться. :cheer:

crazy-mike
06-04-2008, 12:16 PM
А я про то что вместо "error message" итог работы программы в случае ошибки только значением логического объекта будет отличаться. :cheer:
Просто с этими IDE всё доходит до полного идиотизма. Когда макрокоманду для редактора нужно создавать средствами IDE внутри этого же редактора!!!!!!
Что-то глупо-рекурсивное получается (как с Microsoft Word примерно) ;)

algoritm
06-04-2008, 12:28 PM
Просто с этими IDE всё доходит до полного идиотизма. Когда макрокоманду для редактора нужно создавать средствами IDE внутри этого же редактора!!!!!!
Что-то глупо-рекурсивное получается (как с Microsoft Word примерно) ;)
У меня нормально, я больше обычные программы делаю, сеть в основной стороной если нужно.:cheer:

crazy-mike
06-07-2008, 02:43 AM
У меня нормально, я больше обычные программы делаю, сеть в основной стороной если нужно.:cheer:
"Нормальные программы" от "ненормальных" в последнее время вообще трудно отличить. И даже возникают определённые сомнения в необходимости "нормальных программ" (SOAP - последний писк моды в ERP-системах). :leader:

algoritm
06-07-2008, 04:39 AM
Интересна идея AJAX в сочетании с объектами. :cheer:

crazy-mike
06-07-2008, 04:48 AM
Интересна идея AJAX в сочетаниями с объектами. :cheer:
К самой идее AJAX относятся неоднозначно даже те - кто писал о ней для
http://developer.mozilla.org
;) В самом деле - очень много всего удобно (но если учесть - "дополнительные соединения" XMLHttpRequest , то всё становится "неоднозначно"). В сложных распределённых сетевых приложениях вообще ничего безапелляционно говорить нельзя. Всё зависит от "конкретного проекта". Одним из преимуществ AJAX является потенциальная возможность отказаться от серверов БД , которые "слушают внешние интерфейсы" (но там надо немного "выпендриваться" именно с программированием).
Кроме того - AJAX не поддерживается для WML (для мобильных телефонов). ;)

crazy-mike
06-12-2008, 04:19 AM
;)


<?
header("Content-type: image/gif");
$xfn=$_GET["s"];
list($fn,$wi,$he)=explode(",",$xfn);
$buf=file_get_contents($fn);
$im0=imagecreatefromstring($buf);
imagetruecolortopalette($im0,TRUE,4);
imagecolortransparent($im0);
imagegif($im0);
imagedestroy($im0);
?>

Это один из способов улучшения "потребительских свойств" веб-камеры DLink. Эта веб-камера отличается тем - что может посылать изображения по ftp на удалённый сервер (и даже на сервев с внешним адресом - с использованием ftp passive :grum:).
Но - у неё все изображения можно держать в формате jpg (цветные или grayscale (8 бит/пиксель)). Если камера "прицеплена к Интернерту" через "медленное соединение" - то конечно же лучше пересылать grayscale. Но если мы просматриваем изображения с камеры на сервере через медленное соединение - то , наверное , лучше уменьшить размер файла ещё перед пересылкой.
Здесь это делается для grayscale немного шизофреническим способом - преобразование в gif89 с уменьшением размера палитры и выделением transparent color. Качество изображения при этом особенно сильно не ухудшается - а размер файла уменьшается примерно в два раза. :)

crazy-mike
06-27-2008, 12:06 PM
А теперь попробуем заняться "изнасилованием".
Кто нибудь работал с Writely от Google??????
Самое прикольное - что там вообще нет Java-апплета.
Есть JavaScript и AJAX.
"Почти прототип" мог бы выглядеть так:


<?
require '../../xobj/myhtml.php';
session_start();

class eB extends xhtmlBody {
public final function __construct()
{ parent::__construct("","background :yellow; color :black");
$dv=new xhtmlTag("div");
$dv->setA("id","yo");
$dv->setA("style",
"cursor :text; background :white; ".
"margin :1em; width :40em; height :15em;");
$dv->setA("onkeydown","sK(event)");
$this->add($dv);
}
}

class eH extends xhtmlHead {
public final function __construct()
{ parent::__construct("Text Editor");
$this->attach(
new jsFile("./js/index.js")
);
}
}

$p=new xhtmlApp(new eH(),new eB());
?>

Ну и index.js:

function sK(event)
{ event.preventDefault();
event.stopPropagation();
v=String.fromCharCode(event.keyCode);
el=document.getElementById("yo");
el.textContent=el.textContent+v;
}
Конечно пока получилась "гадость" (эхо нажатых символов - и даже кирилица светится правильно!) . Тем не менее можно накапливать строку внутри JavaScript и даже потом куда-нибудь её сохранять.

algoritm
06-30-2008, 02:20 PM
К самой идее AJAX относятся неоднозначно даже те - кто писал о ней для
http://developer.mozilla.org
;) В самом деле - очень много всего удобно (но если учесть - "дополнительные соединения" XMLHttpRequest , то всё становится "неоднозначно"). В сложных распределённых сетевых приложениях вообще ничего безапелляционно говорить нельзя. Всё зависит от "конкретного проекта". Одним из преимуществ AJAX является потенциальная возможность отказаться от серверов БД , которые "слушают внешние интерфейсы" (но там надо немного "выпендриваться" именно с программированием).
Кроме того - AJAX не поддерживается для WML (для мобильных телефонов). ;)
Важно то что это хотя бы пробный шар в направлении сделать передачу данных быстрее, и обрабатывать именно действия пользователя, а не перереконструировать всё заново при обновлении какой-то часто очень маленькой информации,
и это не говоря о том что это лучше смотрится.

Да и ещё раньше нам всё твердили во времена пентиум2 что "типо подождите сейчас медленно а завтра купите более быстрые машины пентиум3 и всё заработает быстрее" но оказалось что интерфейс становится не только тормозным и мало удобным так ещё и "минимальные системные требования" всё растут, и это не о количестве памяти на HDD а что гораздо хуже о стабильности работы относительно скорости процессора, даже к примеру возможность открытия вордпадом очень большого файла приводит к зависанию этой программы, похоже что в силиконовой долине поселился вирус-недоделок. :cheer:

algoritm
07-01-2008, 07:41 AM
..................
программа сама можыт его генерировать и
сразу жы исполнять, наверно вот в чем ценность.
Такая "ценность" есть во всех современных языках и является менеджингом памяти, но структура и система управления этим может быть придумана очень по-разному. :cheer:

Olezhik
07-08-2008, 01:41 PM
Если вы нехотите платить [alexa] за статус репорт, то вот вам такой маленки хак ;)


Scrape Alexa Class



class alexa {
private $badclasses;
private $site;
private $cache;

function alexa() {
preg_match_all('#\.([a-z0-9]+) \{#i',file_get_contents('http://client.alexa.com/common/css/scramble.css'),$this->badclasses);
}
private function descramble ($matches) {
return in_array($matches[1],$this->badclasses[1])?'':$matches[2];
}
public function stats ($site, $section = 4, $item = 5) {
if (!is_array($this->cache[$site])) {
$items = array();
$html = preg_replace('#&nbsp;#','',preg_replace('#(?:<|&lt;)!--.+?--(?:>|&gt;)#','',file_get_contents('http://www.alexa.com/data/details/traffic_details/' . $site)));
preg_match_all('#</th></tr><tr>.+?</tr>#',$html,$tables);

for ($i=0,$len=count($tables[0]); $i<$len; $i++) {
preg_match_all('#<td>(.+?)</td>#',$tables[0][$i],$info);
for ($i2=0,$len2=count($info[1]); $i2<$len2; $i2++) {
$info[1][$i2] = preg_replace('#<img alt="(\w+)".+?>#','$1 ',$info[1][$i2]);
$items[$i][] = preg_replace_callback('#<span class="(.+?)">(.+?)</span>#im',array(get_class($this), 'descramble'),$info[1][$i2]);
}
}
$this->cache[$site] = $items;
}
if ($section == 4 && $item == 5) {
return $this->cache[$site];
} elseif ($item == 5) {
return $this->cache[$site][$section];
} else {
return $this->cache[$site][$section][$item];
}
}
}


использовать вот-так:


$alexa = new alexa;[/highlight][highlight=php]print_r($alexa->stats('russianamerica.com'));
print_r($alexa->stats('russianamerica.com',1));
print_r($alexa->stats('russianamerica.com',1,1));

результат

X-Powered-By: PHP/5.2.0
Content-type: text/html

Array
(
[0] => Array
(
[0] => N/A*
[1] => 0.00005%
[2] => 0.00021%
[3] => down 36%
)

[1] => Array
(
[0] => N/A*
[1] => 1,775,644
[2] => 433,279
[3] => down 137,612
)

[2] => Array
(
[0] => N/A*
[1] => 1.3
[2] => 2.8
[3] => down 3%
)

)

Array
(
[0] => N/A*
[1] => 1,775,644
[2] => 433,279
[3] => down 137,612
)

1,775,644


Да я понимаю, это не самы лутши пример, ну как говорица чем богаты :34:

crazy-mike
07-17-2008, 02:00 AM
ну как говорица чем богаты :34:
В php5 - прикол , который меня очень сильно "рассмешил" (но работает):


$a=1
class yoyo extends yoprst {
public final function __construct()
{ global $a; // !!!!!!!!!!!!!!
............
}
}

Страннная эта самая "объектно-ориентированность" и "constraint programming implementation". Доступ к "глобальным переменным" внутри "методов класса" остался практически таким же как "без всяких там объектов".

crazy-mike
07-26-2008, 10:20 AM
http://www.smarty.net
:leader:
Для того - чтобы их "творение" работало - надо , чтобы каталог , куда "оно" скидывает "откомпилированные файлы" был "доступен по записи" для пользователя "nobody". Соответственно это их "smarty" тупо нельзя использовать в read-only file systems. Фактически - это означает потенциальную возможность "взлома сайта" , который был написан с использованием smarty. :grum:

crazy-mike
08-04-2008, 03:44 AM
http://www.fpdf.org/
:leader: Прикольная вещь. Сравнительно удобно туда вставлять ttf из Windows. Там класс - для генерации файла pdf - on the fly...(У меня "оно" больше двух лет работает)

crazy-mike
08-08-2008, 07:07 AM
В самом деле очень сильно рулит!!!!!!!!
Представим небольшую такую "задачку" - вывести в pdf карту с раскрашенными точками - где установлены пулемёты грузинских войск.
При этом карты позиций - допустим - хранятся в БД (и изображения и "разметка").
При помощи fpdf http://www.freepdf.org
- это можно сделать примерно так:


<?
define('FPDF_FONTPATH','../../fpdf/font/');
require('../../fpdf/fpdf.php');
require "imgdb.php";

$xon=$_POST["xon"];
list($wi,$he)=imgDb::xySize($xon);
$sva=$_SERVER["SERVER_ADDR"];
$fn="http://".$sva."/mapex/getimgxon.php?xon=".$xon;
$pdf=new FPDF('P','pt',array($wi+40,$he+400));
$pdf->SetCompression(TRUE);
$pdf->AddFont('tahoma','','tahoma.php');
$pdf->SetFont('tahoma'); $pdf->SetFontSize(16.0);
$pdf->AddPage();
$pdf->Image($fn,0,0,0,0,"jpg");
$pdf->setDrawColor(0,0,0);
$pdf->setFillColor(0xff,0xff,0);
//
$dbc=pg_connect("host=127.0.0.1 port=5432 user=postgres dbname=map");
$q="select x,y from ymapdot where xmem=".$xon;
$r=pg_query($dbc,$q); $n=pg_num_rows($r);
$i=0;
while($i<$n) {
list($x,$y)=pg_fetch_row($r,$i); $i++;
$pdf->Rect($x-5,$y-5,11,11,"DF");
};
pg_free_result($r); pg_close($dbc);
//
$pdf->Output();
?>

"Фокус" в том - что ссылки на файлы для функции Image могут быть заданы в виде URL!!!!!!
А при обращении по такому URL мы получаем "изображение" , извлечённое из записи БД.
Ну вот - getimgxpon.php - "исходник":


<?
header("Content-type: image/jpeg");
$xon=$_GET["xon"];
$dbc=pg_connect("host=127.0.0.1 port=5432 user=postgres dbname=map");
$q="select pic from mapimg where xon=".$xon;
$r=pg_query($dbc,$q);
$pic=pg_fetch_result($r,0,0); pg_free_result($r);
pg_close($dbc);
$pic=pg_unescape_bytea($pic);
$bf=base64_decode($pic);
$im0=imagecreatefromstring($bf);
imagejpeg($im0,NULL,20);
imagedestroy($im0);
?>
Здесь специально делается JPG - потому что fpdf предидущей версии не работало с gif (новая версия - уже работает).

Правда в fpdf - нет примитивов для рисования кружочков (их конечно же можно "построить самостоятельно")....Но есть интерфейс php для libharu. Просто в этом случае - нужно возиться с установкой расширений.

crazy-mike
08-13-2008, 11:19 AM
Что-то стало много статей о важности отделения "описания внешнего вида страницы" от "программной логики" стало появляться.
(при этом даже Smarty позиционируют как средство реализации модели MVC (Model-View-Controller)).
:grum:
Ну почему бы - например - вообще не отказаться от отдельного языка для описания "внешнего вида"????
Зачем вообще всё делить на java, html , cgi?
Только потому - что "веб-дизайнер" является чем-то "средним"? Ни программер? Ни художник? Ни knoledge engineer?
Разумнее делить всё на - "выполняющееся на сервере" и "работающее на клиенте". С приходом AJAX конечно же добавилось "работающее на клиенте - но взаимодействующее с сервером" - но оно является ответвлением "второго".
Долой веб-дизайнеров! Они должны уступить дорогу "программерам"!!!!!!!
Долой Windows Live Spaces!!!!!! Долой личные веб-странички пользователей!!!!!

crazy-mike
08-14-2008, 06:15 AM
В предидущем посте я имел ввиду некторую порочность идеи смешивания разных "языков представления данных" (как-то язык не поворачивается называть php языком программирования - здесь я прямо "труднопробиваемый консерватор" :D ) .
php можно использовать для унификации (единый язык представления данных). Для этого Smarty - просто не подходит (как и всё - что основано на идее микса xhtml и php). Конечно же есть JSP, ASP - но в php это "проще" (хотя бы по виду).
В myhtml.php = использовалось представление web-странички как xhtml-document с head и body. Можно пойти немного другим путём и попробовать создать класс mvcObj для выполнения тех же функций - но в соответствии с моделью MVC. При этом "вид веб-странички" - как бы "View", ну а всё остальное ...Там придётся задуматься - что будет Model , а что Controller (бизнес-логика или DBMS-логика).
Хотя ведь основная идея использования php - это View...

crazy-mike
08-14-2008, 11:14 AM
Сначала - попробуем внести небольшое такое (почти косметическое изменение)
в класс xhtmlObj:


abstract class xhtmlObj {
abstract public function is();
abstract function add(xhtmlObj $v);
function useIt($idx) { }
final public function attach()
{ $n=func_num_args(); $i=0;
while($i<$n) { $a=func_get_arg($i);
$i++; $this->add($a);
};
}
}

Чем-то "новым" здесь является всего лишь функция useIt.
Но зато теперь - переписывая её в "дочернем классе" - мы можем цеплять туда "логику - отдельную от логики представления".
Например - работу с БД.


class mDb {
public function __construct(xhtmlObj& $at)
{ $idb=@mysql_connect(DB_HOST,DB_USER,DB_PASS);
$rc=mysql_select_db(DB_NAME,$idb);
$q="set names 'cp1251'";
$r=mysql_query($q,$idb);
$at->useIt($idb);
mysql_close($idb);
}
}

class mB extends xhtmlBody {
private final function sysMnu()
{ $a=new xhtmlImg("./im/doback.gif","","margin-right :5px");
$g=new xhtmlA("cms.php",$a->is());
return $g;
}

public final function useIt($idb)
{
/*
здесь какое-то что-то извлекает данные из $idb (может быть даже через XML-parser)
и отображает "это" в теле документа.
*/

}


public final function __construct()
{ parent::__construct();
$a=new mDb($this);
}
}

На первый взгляд - добились не очень много. Тем не менее соединение с БД всё сделано внутри отдельного класса. И даже в конструкторе этого класса можно было реализовать всю логику извлечения контента из БД для отображения на странице.
А потом "послать сообщение телу документа" - через вызов useIt() :grum: MVC (MV - таким образом как бы уже есть)

crazy-mike
08-21-2008, 11:45 PM
А в PHP-5.2.6 даже некоторые "строгости" возросли.
Раньше можно было сравнивать значение переменной , которой не присвоено значение , с пустой строкой. А теперь - это runtime error! :grum:
constraints начинают "рулить"!!!!!
Вместо if(_SESSION["g"]!="") ... лучше писать if(isset(_SESSION["g")) if(_SESSION["g"]!="") ...

crazy-mike
08-29-2008, 02:49 AM
"Косметическое изменение" (метод useIt в классе xhtmlObj) дало нам возможность "управлять" одним классом из совсем другого. Правда в php5 для этого случая соблюдается одно "приятное" ограничение.
Допустим:


class mB extends xhtmlObj {
public final function useIt($yoprst)
{
}
public final function __construct()
{ $a=new mySomething($this);
.....
parent::__construct();
.....
}
}

Самое прикольное - что так оно работать не будет!!!!!
Но если переписать всё как:


class mB extends xhtmlObj {
public final function useIt($yoprst)
{
}
public final function __construct()
{
parent::__construct();
.....
// *******************************************
$a=new mySomething($this);
// обязательно после вызова конструктора "родителя"
}
}

И тогда всё будет - "как хотелось"...:evillaugh

crazy-mike
09-02-2008, 03:53 AM
Ну а теперь немного "усилим защиту". Вообще-то хочется чтобы контент страницы формировался только в заданном пользовательском контексте. Например в зависимости от значений session variables. Но проверять всю эту муть - ужас! :evillaugh Немного упростить жизнь можно через классы, производные от Exception.
Например так:


<?
class myEx extends Exception {
public function __construct($msg,$code)
{ parent::__construct($msg,$code);
}

public function toString()
{ return $this->code.":".$this->message;
}

public function myInfo()
{ $dv=new xhtmlTag("div");
$dv->setA("style","background-color :red; color :yellow");
$dv->cat("Protection Violation!");
return $dv;
}
}
?>

А теперь немного перепишем класс mDb:


<?
require "myex.php";

class mDb {
private final function xecIt(xhtmlObj& $p)
{ if(!isset($_SESSION["who"])) throw new myEx("abend",1);
if($_SESSION["who"]=="") throw new myEx("abend",2);
// $dbc=....connect to database
$p->useIt($dbc);
// close connection $dbc
}

public final function __construct(xhtmlObj& $p)
{ try { $this->xecIt($p); }
catch(myEx $e) {
$p->add($e->myInfo());
};
}
}
?>


И самое прикольное - что в одном скрипте , который использовал mDb , вообще ничего менять не нужно!

crazy-mike
09-13-2008, 02:39 AM
class xhtmlStyle extends xhtmlTag {
public function __construct($v) {
parent::__construct('style');
$this->setA('type','text/css');
$this->setA('media','all');
$this->cat($v);
}
}

:leader:


class linkCSS extends xhtmlTag {
public final function __construct($href)
{ parent::__construct("link");
$this->setAV(
array( "rel" => "stylesheet", "type" => "text/css",
"href" => $href
)
);
}
}

:evillaugh Два прикольных класса для подключения CSS. Второй из них немного "логичнее" для использования "внешних таблиц стилей" (хотя и в первом - можно было использовать @import при желании).
Но "первый" - удобнее при "отладке".
"Недостатком PHP" можно считать то - что PHP-скрипты как бы "маскируют" истинный размер страницы.
В PHP всегда можно написать что-то такое:


function World($a,$b)
{ $t=new xhtmTag("div");
$t->setA("style","display :table-cell; background-color :red;
font-weight :bold");
$t->setA("id",$a);
$t->cat($b);
return $t;
}

Ну и потом где-нибудь:


$hello=new xhtmlTag("div")
$hello->attach(
$this->World("a1","one"),$this->World("a2","two"),
$this->World("a3","three");
);
$this->add($hello);

Конечно же - всё это будет "работать". Мало того - если вывод делается в "gzipped html" - то и "длина страницы" особенно и не увеличится.
Но можно было ведь писать и "умнее".


class mB extends xhtmlBody {
private final function World($a,$b)
{ $t=new xhtmTag("div");
$t->setA("id",$a);
$t->cat($b);
return $t;
}

public final function __construct()
{ parent::__construct();
$hello=new xhtmlTag("div")
$hello->setA("id","world");
$hello->attach(
$this->World("a1","one"),$this->World("a2","two"),
$this->World("a3","three");
);
$this->add($hello);
}
}

class mH extends xhtmlHead {
private final function myCSS()
{ $v="#world div { display :table-cell; background-color :red;".
" font-weight :bold }\n";
return $v;
}

public final function __construct()
{ parent::__construct("Sheet");
$this->attach(new xhtmlStyle($this->myCSS()));
}
}

crazy-mike
09-21-2008, 10:56 AM
:evillaugh
Ну а теперь - немного об "интеграции" PHP и JavaScript....
Основная идея ведь достаточно тривиальна - php-скрипт может создавать JavaScript при генерации страницы "on the fly".
Но есть и более интересная возможность (не считая AJAX) - вызовы функций JavaScript из других окон браузера с передачей параметров из php. Неожиданным "преимуществом" этой "библиотеки" myhtml.php оказалась возможность "независимости" от "естественного порядка обработки данных".

crazy-mike
10-08-2008, 01:37 AM
:evillaugh
Неожиданным "преимуществом" этой "библиотеки" myhtml.php оказалась возможность "независимости" от "естественного порядка обработки данных".
Это означает - что компоненты страницы - вообще говоря формируются в "любом порядке" а вызов метода display или see - только и означает "конечную сборку".
Кстати - экранирование работы с БД - здесь тоже осуществляется сравнительно просто. Конечно - кучу всего можно делать через "define",
но читаются такие вещи очень плохо. Проще организовать класс для организации подключения к БД - и брать из него "хэндлер"....Конечно же лучше - чтобы на "странице" (в скрипте страницы) вообще не было "явных запросов к БД" (с точки зрения "методологии MVC"). Но в "маленьких приложениях" такое "разделение" просто не совсем удобно. :D

crazy-mike
10-21-2008, 07:59 AM
Небольшая иллюстрация "бреда" (работающая)


require '../../xobj/myhtml.php';
session_start();
require "mdb.php";

class mB extends xhtmlBody {
public final function useIt($dbc)
{ $xmem=$_POST["xmem"];
$mapst=$_POST["mapst"];
$q="select count(*) from ymapdot where xmem=".$xmem;
$q.=" and xnode in (select isn from ymapnode where mapst=".$mapst;
$q.=")";
$r=pg_query($dbc,$q);
$cnt=pg_fetch_result($r,0,0); pg_free_result($r);
$q="select vstreet from ymapstreet where isn=".$mapst;
$r=pg_query($dbc,$q);
$vs=pg_fetch_result($r,0,0); pg_free_result($r);
$vs=pg_unescape_bytea($vs);
$fmr=new xhtmlForm("mapstrm","mapstrm.php");
$fmr->setA("style","margin :10px; border :2px outset");
$fmr->attach(
new xhtmlInput("hidden","xmem",$xmem),
new xhtmlInput("hidden","mapst",$mapst),
new xhtmlInput("submit","se","&#250;&#206;&#209;&#212;&#201; &#215;&#201;&#196;Š&#204;&#197;&#206;&#206;&#209; &#215;&#213;&#204;&#201;&#195;Š")
);
$this->attach(
new xhtmlV("<b>".$vs."</b>"),
new xhtmlBr(),
new xhtmlV("&#212;&#207;&#222;&#207;&#203; &#206;&#193; &#195;Š&#202; &#203;&#193;&#210;&#212;Š=<b>".$cnt."</b>"),
$fmr
);
}

public final function __construct()
{ parent::__construct("xsel","","myF()");
$a=new mDb($this);
}
}

class mH extends xhtmlHead {

private final function myJS()
{ $v.="var dots=[\n";
$dbc=pg_connect("host=127.0.0.1 port=5432 user=postgres dbname=map");
$xmem=$_POST["xmem"];
$mapst=$_POST["mapst"];
$q="select xnode from ymapdot where xmem=".$xmem;
$q.=" and xnode in (select isn from ymapnode where ";
$q.="mapst=".$mapst.")";
$r=pg_query($dbc,$q); $n=pg_num_rows($r);
$i=0;
while($i<$n) {
$xn=pg_fetch_result($r,$i,0); $i++;
$v.=$xn.",";
};
pg_free_result($r); pg_close($dbc);
$v.=" 0 ];\n";
$v.="function myF() {\n";
$v.="i=0; a=window.opener;\n";
$v.="while(dots[i]!=0) {\n";
$v.="b=dots[i]; i++;";
$v.="a.seeBone(b);";
$v.="}\n";
$v.="}\n";
return $v;
}

public final function __construct()
{ parent::__construct("!!!!!!");
$this->attach(
new xhtmlIcon("./im/onmap.gif"),
new linkCSS("../admin/sty/my.css"),
new javaScript($this->myJS())
);
}
}

$p=new xhtmlApp(new mH(),new mB());

Сценарий JavaScript строится внутри php.
Сводится всё к тому - что одним цветом закрашиваются кружочки вокруг объектов на той же улице карты - где и тот , по которому кликнули мышкой.
Функция изменения аттрибутов объекта на карте находится внутри сценария в совсем другом окне , из которого было открыто данное окно. ;)
Opera - всё же довольно прикольный браузер! :grum:

Olezhik
10-21-2008, 03:48 PM
Помойму совсем не дурно.
http://www.cakephp.org/

crazy-mike
10-21-2008, 03:56 PM
Помойму совсем не дурно.
http://www.cakephp.org/
Ну да - конечно же "недурно" (даже очень хороший! У меня просто "мысль" немного в другом направлении работала - сделать так , чтобы всё было "похоже на C/++" , и чтобы никакого HTML явно не было видно). Только с настройкой "немного" "потрахаться" надо...;)
В этом "cake" мне немного не нравится "смешивание php и html" (в Layout)...Ну и все эти требования к "структуре каталогов" - тоже...
Просто основная идея таких "приложений" (с использованием php) - включает и минимизацию нагрузки на web-сервер. Что-то "совсем навороченное" в такой подход не особенно "вписывается". "Кеш layout-ов" вообще-то можно держать в БД (но лучше - не в MySQL). Конечно же этот cake намного лучше чем SMARTY. Но какой-то он "запутанный".
А их идея с Layout как раз в php5 является не очень "удобной" (потому что "оставляет в живых html" :grum: ). А я хотел - чтобы было "видно" только XHTML и JavaScript. И чтобы всё сравнительно легко читалось (без всяких Manuals - которые просто лень писать). Кроме того - в php5 можно всегда использовать функции с переменным числом параметров. У меня так реализован метод attach - для добавления "child nodes". В обычном DOM API - addChild (или что-то похожее) добавляет ровно один элемент.
Но у этого cake - недостаток примерно такой же как у joomla = "навязывание стиля прогаммирования"...

Bandi
10-21-2008, 04:04 PM
это ж просто песТня. Крэйзи, выходи на меня замуж.

Olezhik
10-21-2008, 04:09 PM
Ну да - конечно же "недурно"! Только с настройкой "немного" "потрахаться" надо...;)
А без этого никак, вот ещё один вариант, тут полехче http://www.symfony-project.org/ .

crazy-mike
10-21-2008, 04:59 PM
А без этого никак, вот ещё один вариант, тут полехче http://www.symfony-project.org/ .
Ну - в этом по крайней мере "документация" намного "умнее"...;)

crazy-mike
10-22-2008, 03:57 AM
А без этого никак, вот ещё один вариант, тут полехче http://www.symfony-project.org/ .
JavaScript has long been considered as having little real use in professional web applications due to the lack of cross-browser compatibility.
:D Улыбнуло из их "tutorial"...:grum:
А вообще-то они очень сильно усложнили сам процесс загрузки страницы. Но конечно же сам подход и в самом деле - очень интересный ( хоть и несколько "маниакальный" ).
:evillaugh
Я бы даже сказал - что View и Controller - можно вообще реализовывать в JavaScript , а для php фактически остаётся только Model и немного "организации транспортного контейнера" (gz-handler для echo ).
:grum: Но больше всего меня удивляет - почему ещё нет модуля Regina REXX для apache2?

crazy-mike
10-23-2008, 04:25 AM
Кстати - symfony - весь архив занимает 2.9 M .
(довольно много - "size" одна из причин , по которой я принципиально отказался от использования чего-то "готового")
cake = архив занимает 214K (немного полегче :grum:). А это попрошайничество (Donate $1 !) - ну просто несерьёзно! И оно таки свидетельствует о "реальном отношении" к этому "проекту" (хотя идея ведь - очень хорошая! Но само "исполнение"...).
myhtml (всё вместе с поддержкой wml) занимает 22K --- моё (то - что я сейчас у себя использую) !!!!!!
Ща как попробую поставить....(если настроение будет) - или cake (скорее всего) или symfony.
Там ведь можно было написать "IDE" с web-интерфейсом (с экранным редактором и Visual WidGets). Ну - клик по кнопке выбора "шаблона класса" - и вставляется текст "прототипа класса" (как в Visual DevCpp - например), ну а остальное - потом "подправляется" обычным "редактированием текста". С использованием AJAX - такая "среда разработки" не жрала бы даже особенно много траффика. Обычный 4GL - ну примерно так.

crazy-mike
10-23-2008, 05:08 AM
:D Из cake:
NOTE: /app/tmp must be writable by the user that your web server runs as.
Вообще-то такое несколько чересчур (как и в Smarty) - в смысле security. Временнные данные можно было писать куда-нибудь по ftp или в БД.

Olezhik
10-23-2008, 11:28 AM
Мне любая архитиктура проейктов нравитса, таким образом кода не превращяюца в кашу, а програмисты следуют определёным законам и правилам. А когда програма написана по правилом то в независимости что это за програма лубой програмист сможит без труда эту програму поченить, изменить, добавить чт-то новинькое без чужой помощи.

crazy-mike
10-23-2008, 11:53 AM
А когда програма написана по правилом ...
Всё это хорошо - но и в symfony , и в cake предлагается не "способ писания программ" , а способ организации компонентов web-OS скорее. ;) Это - "не совсем то" как раз для "программ". Да - они "разделили" модель , контроллер и представление для просмотра - но они продолжают "смешивать языки". На "бесплатном хостинге" разработчик может делать далеко не всегда то - что ему хочется (да и на платном тоже). Их реализация немного "абсолютизирует роль php" вместо того чтобы переносить большую часть нагрузки на клиентскую систему а с сервера тянуть только данные.
Я бы даже сказал - что возможен вообще-то и довольно "дикий вариант" - CGI-application на C или C++ - которое генерирует php (даже не xhtml) , а уже php - генерирует xhtml...Ну - это если уже "сходить с ума" достаточно последовательно.
Использование YAML в symfony тоже вызывает некоторые возражения хотя бы потому - что можно просто создавать JavaScript-скрипты как бы on-the-fly (вместе с обычными инициализированными массивами). Это даже считается одной из "альтернатив AJAX". Я уже не говорю о $_SESSION - для модуля php внутри apache/apache2.

crazy-mike
10-23-2008, 11:56 AM
А когда програма написана по правилом то в независимости что это за програма лубой програмист сможит без труда эту програму поченить, изменить, добавить чт-то новинькое без чужой помощи.
Когда "программа" написана на нескольких языках одновременно - это очень трудно "чинить и изменять"...:D
Особенно - когда на одной странице смешивают несколько разных языков...Да - на первый взгляд всё логично: каждая функция в своём фрагменте кода в отдельном файле , а виды функций - сгруппированы по фолдерам. Но это только на первый взгляд. Процесс взаимодействия между компонентами - это далеко не всегда понимается "с ходу" . Во многих случаях "с первого взгляда" просто непонятно - а почему "оно" вообще работает. Тот же самый "итератор" (ну пусть - helper) под названием "браузер" мог просто использовать разные запросы для выборки БД в зависимости от переданного ему параметра. Набор callback-functions и event-handlers на JavaScript - тоже могут быть параметрами. Принудительное разворачивание всего этого в "дерево" из-за требований "методики проектирования" ведёт к усложнению "программы".

Olezhik
10-23-2008, 10:44 PM
Когда "программа" написана на нескольких языках одновременно - это очень трудно "чинить и изменять"...:Д

А где ты видел полноценую страницу каторая была бы написана только в одном языке? Что то Миша ты опять загнул. Возьмём к примеру даже этот форум. PHP, Java Script, HTML, DHTML. CSS.
А ты говориш... все страницы написаны больше чем в одном языке, так-что это в полне нормально, и правельно.

crazy-mike
10-24-2008, 02:13 AM
А где ты видел полноценую страницу каторая была бы написана только в одном языке? Что то Миша ты опять загнул. Возьмём к примеру даже этот форум. PHP, Java Script, HTML, DHTML. CSS.

Вообще-то "страница" могла бы быть "написана" почти полностью на
JavaScript.
Или написана на php так - что самого html вообще не видно (из одних helper-ов - в теминологии Symfony) - у меня они как раз так и пишутся.
Ну а если вспомнить о таких библиотеках как libcgi и всех страницах , созданных с её использованием (это уже на C :grum:)...HTML(DTML,XHTML) ведь довольно просто "propagated" через объекты почти в любом "объектно-ориентированном языке". Да и CSS можно интерпретировать в терминах ООП....

algoritm
11-03-2008, 01:55 PM
Вообще-то "страница" могла бы быть "написана" почти полностью на
JavaScript.
Или написана на php так - что самого html вообще не видно (из одних helper-ов - в теминологии Symfony) - у меня они как раз так и пишутся.
Ну а если вспомнить о таких библиотеках как libcgi и всех страницах , созданных с её использованием (это уже на C :grum:)...HTML(DTML,XHTML) ведь довольно просто "propagated" через объекты почти в любом "объектно-ориентированном языке". Да и CSS можно интерпретировать в терминах ООП....
Если к JavaScript добавить возможность сохранения значений переменных и вводимых данных в файл на сервер, то можно сделать форумный движок полностью на JavaScript, который бы плюс к этому генерировал бы html страницу. :cheer: