Для тестирования СУБД Oracle очень удобно пользоваться стандартной схемой SCOTT/TIGER. Но в последнем релизе, доступном для общедоступного пользования - Oracle Database Express Edition 11g Release 2 она отсутствует. Как быть? Можно конечно самому спроектировать некую базу данных, создать пользователя, наделить его правами и в путь дорожку. Но часто на глаза попадают мануалы, где рассматриваются возможности СУБД именно с использованием старого доброго малого - SCOTT/TIGER. Для выполнения последующих шагов воспользуемся утилитой - SQL Plus.
CONNECT SYS/пароль AS SYSDBA;
CREATE USER SCOTT
IDENTIFIED BY TIGER
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;
GRANT CONNECT TO SCOTT;
GRANT RESOURCE TO SCOTT;
ALTER USER SCOTT DEFAULT ROLE CONNECT, RESOURCE;
GRANT UNLIMITED TABLESPACE TO SCOTT;
Далее нужно выполнить sql-скрипт (проверьте правильность Вашего пути):
@C:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\scott.sql
Ну вот и все, все готово :)
PHP5. Ссылки на объекты. Внешние и внутренние
В PHP5 все переменные - это ссылки на содержимое переменной. Для получения доступа к содержимому переменной используются ссылками. Важно помнить, что эти ссылки не есть указатели как в C/C++, которые содержат адреса на ячейки памяти, они лишь ссылаются на некоторое содержимое. Так же дело обстоит и с ссылками в python`е. Но сейчас не об этом. В PHP5 ссылка по-сути своей определяет жизнь переменной, точнее того, куда она ссылается: при удалении переменной ее содержимое может не сразу удалиться. С чем это может быть связано? За такую очистку как мы знаем отвечает сборщик мусора (garbage collector). А он смотрит как раз на то, есть ли ссылки на данные или нет, если нет, то все будет почищено, а иначе зачистка будет пропущена. Продемонстрирую на примере.
class Node
{
var $str; // внутренние данные
var $ref; // внетренняя ссылка
// получение внутренних данных
function getStr()
{
return $this->str;
}
// установить внутренние данные
function setStr( $str )
{
$this->str = $str;
}
// получить внешнюю ссылку
function getNext()
{
return $this->ref;
}
// установить внешнюю ссылку
function setNext( &$ref )
{
$this->ref = $ref;
}
function __construct()
{
echo 'constructor<br/>';
}
function __destruct()
{
echo 'destructor -> '.$this -> getStr().'<br/>';
}
}
// Создаем первый объект. Переменная получает ссылку на данный объект
$first = new Node;
// Создаем второй объект. Переменная получает ссылку на данный объект
$second = new Node;
// Помещаем данные в первый объект
$first->setStr( '$first' );
// Помещаем данные во второй объект
$second->setStr( '$second' );
// Привязываем первый объект ко второму за счет ссылки внутреннего члена $ref на второй объект
$first->setNext( $second );
// Привязываем второй объект к первому за счет ссылки внутреннего члена $ref на первый объект
$second->setNext( $first );
// Удаляем переменную $first, тем самым мы уничтожаем ее ссылку на объект
unset( $first );
// Удаляем переменную $second, тем самым мы уничтожаем ее ссылку на объект
unset( $second );
echo 'Debug<br/>';
Если мы запустим данный код на исполнение, то получим следующий результат:
constructor
constructor
Debug
destructor -> $first
destructor -> $second
Вроде бы ничего особенного, но присмотритесь на месторасположение слова Debug. Ведь мы уничтожили все переменные до момента вывода этого слова командами unset( $first ) и unset( $second ). То есть должны были сработать деструкторы наших объектов. Но на деле видим, что это не так. В чем дело? На самом деле мы создали перекрестные ссылки между первым и вторым объектами. Эти ссылки внутренние, и поэтому когда мы уничтожили наши переменные, мы уничтожили лишь внешние ссылки на объекты. В то время как объекты продолжали свое существование. Ну а на момент завершения сценария, как мы знаем, освобождаются все ресурсы, вот и получаем в конце вызовы деструкторов.
Теперь попробуйте закомментировать строчки, где идет создание внутренних перекрестных ссылок:
// $first->setNext( $second);
// $second->setNext( $first );
В результате получаем следующий результат:
constructor
constructor
destructor -> $first
destructor -> $second
Debug
Отсюда видим, что теперь наши объекты спокойно уничтожаются, что подтверждается сообщениями от их деструкторов до слова Debug. Все верно, ведь теперь на них ничто и никто не ссылается, вот и срабатывает сборщик мусора. Обратите внимание в описании класса Node на метод setNext() который работает непосредственно со ссылками. Всем удачи!
class Node
{
var $str; // внутренние данные
var $ref; // внетренняя ссылка
// получение внутренних данных
function getStr()
{
return $this->str;
}
// установить внутренние данные
function setStr( $str )
{
$this->str = $str;
}
// получить внешнюю ссылку
function getNext()
{
return $this->ref;
}
// установить внешнюю ссылку
function setNext( &$ref )
{
$this->ref = $ref;
}
function __construct()
{
echo 'constructor<br/>';
}
function __destruct()
{
echo 'destructor -> '.$this -> getStr().'<br/>';
}
}
// Создаем первый объект. Переменная получает ссылку на данный объект
$first = new Node;
// Создаем второй объект. Переменная получает ссылку на данный объект
$second = new Node;
// Помещаем данные в первый объект
$first->setStr( '$first' );
// Помещаем данные во второй объект
$second->setStr( '$second' );
// Привязываем первый объект ко второму за счет ссылки внутреннего члена $ref на второй объект
$first->setNext( $second );
// Привязываем второй объект к первому за счет ссылки внутреннего члена $ref на первый объект
$second->setNext( $first );
// Удаляем переменную $first, тем самым мы уничтожаем ее ссылку на объект
unset( $first );
// Удаляем переменную $second, тем самым мы уничтожаем ее ссылку на объект
unset( $second );
echo 'Debug<br/>';
Если мы запустим данный код на исполнение, то получим следующий результат:
constructor
constructor
Debug
destructor -> $first
destructor -> $second
Вроде бы ничего особенного, но присмотритесь на месторасположение слова Debug. Ведь мы уничтожили все переменные до момента вывода этого слова командами unset( $first ) и unset( $second ). То есть должны были сработать деструкторы наших объектов. Но на деле видим, что это не так. В чем дело? На самом деле мы создали перекрестные ссылки между первым и вторым объектами. Эти ссылки внутренние, и поэтому когда мы уничтожили наши переменные, мы уничтожили лишь внешние ссылки на объекты. В то время как объекты продолжали свое существование. Ну а на момент завершения сценария, как мы знаем, освобождаются все ресурсы, вот и получаем в конце вызовы деструкторов.
Теперь попробуйте закомментировать строчки, где идет создание внутренних перекрестных ссылок:
// $first->setNext( $second);
// $second->setNext( $first );
В результате получаем следующий результат:
constructor
constructor
destructor -> $first
destructor -> $second
Debug
Отсюда видим, что теперь наши объекты спокойно уничтожаются, что подтверждается сообщениями от их деструкторов до слова Debug. Все верно, ведь теперь на них ничто и никто не ссылается, вот и срабатывает сборщик мусора. Обратите внимание в описании класса Node на метод setNext() который работает непосредственно со ссылками. Всем удачи!
input
construct new object
construct new object
construct new object
output
destruct of -> third
second
destruct of -> second
first
destruct of -> first
class Node
{
var $str;
var $ref;
function __construct() { echo '<br/>construct new object<br/>'; }
function __destruct() { echo '<br/>destruct of -> '.$this -> str.'<br/>'; }
}
echo '<br/>input<br/>';
//
$first = new Node;
$first -> str = 'first';
//
$second = new Node;
$second -> str = 'second';
$second -> ref = $first;
$first = $second;
unset( $second ); //
//
$second = new Node;
$second -> str = 'third';
$second -> ref = $first;
$first = $second;
unset( $second ); //
echo '<br/>output<br/>';
var_dump( $first );
//
echo $first -> str;
$first = $first -> ref;
//
echo $first -> str;
$first = $first -> ref;
//
echo $first -> str;
$first = $first -> ref;
// Notice: Trying to get property of non-object
// echo $first -> str;
// $first = $first -> ref;
//for ( ; $first -> ref ; $first = $first -> ref )
// $first -> ref = NULL;
// var_dump( $first );
------------------------
input
construct new object
construct new object
construct new object
output
destruct of -> third
destruct of -> second
destruct of -> first
class Node
{
var $str;
var $ref;
function __construct() { echo '<br/>construct new object<br/>'; }
function __destruct() { echo '<br/>destruct of -> '.$this -> str.'<br/>'; }
}
echo '<br/>input<br/>';
//
$first = new Node;
$first -> str = 'first';
//
$second = new Node;
$second -> str = 'second';
$second -> ref = $first;
$first = $second;
// unset( $second ); //
//
$second = new Node;
$second -> str = 'third';
$second -> ref = $first;
$first = $second;
// unset( $second ); //
echo '<br/>output<br/>';
var_dump( $first );
//
echo $first -> str;
$first = $first -> ref;
//
echo $first -> str;
$first = $first -> ref;
//
echo $first -> str;
$first = $first -> ref;
// Notice: Trying to get property of non-object
// echo $first -> str;
// $first = $first -> ref;
//for ( ; $first -> ref ; $first = $first -> ref )
// $first -> ref = NULL;
// var_dump( $first );
-------------
// Реализация обновления поля hr_id
$('#fio').change( function() {
$('#hr_id').val('');
});
-------
example on Java
construct new object
construct new object
construct new object
output
object(Node)[3] public 'str' => string 'third' (length=5) public 'ref' => object(Node)[2] public 'str' => string 'second' (length=6) public 'ref' => object(Node)[1] public 'str' => string 'first' (length=5) public 'ref' => nullthird
destruct of -> third
second
destruct of -> second
first
destruct of -> first
class Node
{
var $str;
var $ref;
function __construct() { echo '<br/>construct new object<br/>'; }
function __destruct() { echo '<br/>destruct of -> '.$this -> str.'<br/>'; }
}
echo '<br/>input<br/>';
//
$first = new Node;
$first -> str = 'first';
//
$second = new Node;
$second -> str = 'second';
$second -> ref = $first;
$first = $second;
unset( $second ); //
//
$second = new Node;
$second -> str = 'third';
$second -> ref = $first;
$first = $second;
unset( $second ); //
echo '<br/>output<br/>';
var_dump( $first );
//
echo $first -> str;
$first = $first -> ref;
//
echo $first -> str;
$first = $first -> ref;
//
echo $first -> str;
$first = $first -> ref;
// Notice: Trying to get property of non-object
// echo $first -> str;
// $first = $first -> ref;
//for ( ; $first -> ref ; $first = $first -> ref )
// $first -> ref = NULL;
// var_dump( $first );
------------------------
input
construct new object
construct new object
construct new object
output
object(Node)[3] public 'str' => string 'third' (length=5) public 'ref' => object(Node)[2] public 'str' => string 'second' (length=6) public 'ref' => object(Node)[1] public 'str' => string 'first' (length=5) public 'ref' => nullthirdsecondfirst
destruct of -> third
destruct of -> second
destruct of -> first
class Node
{
var $str;
var $ref;
function __construct() { echo '<br/>construct new object<br/>'; }
function __destruct() { echo '<br/>destruct of -> '.$this -> str.'<br/>'; }
}
echo '<br/>input<br/>';
//
$first = new Node;
$first -> str = 'first';
//
$second = new Node;
$second -> str = 'second';
$second -> ref = $first;
$first = $second;
// unset( $second ); //
//
$second = new Node;
$second -> str = 'third';
$second -> ref = $first;
$first = $second;
// unset( $second ); //
echo '<br/>output<br/>';
var_dump( $first );
//
echo $first -> str;
$first = $first -> ref;
//
echo $first -> str;
$first = $first -> ref;
//
echo $first -> str;
$first = $first -> ref;
// Notice: Trying to get property of non-object
// echo $first -> str;
// $first = $first -> ref;
//for ( ; $first -> ref ; $first = $first -> ref )
// $first -> ref = NULL;
// var_dump( $first );
-------------
// Реализация обновления поля hr_id
$('#fio').change( function() {
$('#hr_id').val('');
});
-------
example on Java
html. fixed header with scrolling content
Ниже рецептик по созданию таблицы с зафиксированной шапкой с прокручиваемым содержимым. Причем прокрутка появится только при условии превышения максимальной высоты, в нашем случае - max-height:100px
<div style="border: solid 1px black; width:300px;">
<div>
<table style="width:100%; text-align:center;" border="1" cellspacing="0">
<thead>
<tr>
<th style="width:100px;">Col#1</th>
<th style="width:100px;">Col#2</th>
<th>Col#3</th>
</tr>
</thead>
</table>
</div>
<div style="max-height:100px; overflow-y:auto;">
<table border="1" cellspacing="0" style="width:100%; text-align:center;">
<tbody>
<tr>
<td style="width:100px">11</td>
<td style="width:100px">12</td>
<td>13</td>
</tr>
<tr>
<td style="width:100px">21</td>
<td style="width:100px">22</td>
<td>23</td>
</tr>
<tr>
<td style="width:100px">31</td>
<td style="width:100px">32</td>
<td>33</td>
</tr>
<tr>
<td style="width:100px">41</td>
<td style="width:100px">42</td>
<td>43</td>
</tr>
<tr>
<td style="width:100px">51</td>
<td style="width:100px">52</td>
<td>53</td>
</tr>
<tr>
<td style="width:100px">61</td>
<td style="width:100px">62</td>
<td>63</td>
</tr>
<tr>
<td style="width:100px">71</td>
<td style="width:100px">72</td>
<td>73</td>
</tr>
<tr>
<td style="width:100px">81</td>
<td style="width:100px">82</td>
<td>83</td>
</tr>
</tbody>
</table>
</div>
</div>
<div style="border: solid 1px black; width:300px;">
<div>
<table style="width:100%; text-align:center;" border="1" cellspacing="0">
<thead>
<tr>
<th style="width:100px;">Col#1</th>
<th style="width:100px;">Col#2</th>
<th>Col#3</th>
</tr>
</thead>
</table>
</div>
<div style="max-height:100px; overflow-y:auto;">
<table border="1" cellspacing="0" style="width:100%; text-align:center;">
<tbody>
<tr>
<td style="width:100px">11</td>
<td style="width:100px">12</td>
<td>13</td>
</tr>
<tr>
<td style="width:100px">21</td>
<td style="width:100px">22</td>
<td>23</td>
</tr>
<tr>
<td style="width:100px">31</td>
<td style="width:100px">32</td>
<td>33</td>
</tr>
<tr>
<td style="width:100px">41</td>
<td style="width:100px">42</td>
<td>43</td>
</tr>
<tr>
<td style="width:100px">51</td>
<td style="width:100px">52</td>
<td>53</td>
</tr>
<tr>
<td style="width:100px">61</td>
<td style="width:100px">62</td>
<td>63</td>
</tr>
<tr>
<td style="width:100px">71</td>
<td style="width:100px">72</td>
<td>73</td>
</tr>
<tr>
<td style="width:100px">81</td>
<td style="width:100px">82</td>
<td>83</td>
</tr>
</tbody>
</table>
</div>
</div>
Небольшой сервис для тестинга регулярных выражений. Regular expression tester (based on javascript)
Регулярные выражения - вещь очень мощная и полезная. Грамотно их составлять - дело не из простых. Решил на tumblr`е организовать небольшой сервис для помощи в этом деле:
http://regexptester.tumblr.com/
http://regexptester.tumblr.com/
Javascript. Loop condition. To be or not to be
Для пробега по массиву мы все пользуемся вот такой формой:
for (i = 0; i < tempArray.length; i++) { // Some code }
Но есть и вот такой способ:
for (i = 0; tempArray[] !== undefined; i++) { // Some code }
Как он Вам? :)
for (i = 0; i < tempArray.length; i++) { // Some code }
Но есть и вот такой способ:
for (i = 0; tempArray[] !== undefined; i++) { // Some code }
Как он Вам? :)
Subscribe to:
Posts
(
Atom
)