Oracle 11g XE. Install SCOTT/TIGER scheme

Для тестирования СУБД 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() который работает непосредственно со ссылками. Всем удачи!
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' => null
third
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' => null
thirdsecondfirst
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>



Небольшой сервис для тестинга регулярных выражений. Regular expression tester (based on javascript)

Регулярные выражения - вещь очень мощная и полезная. Грамотно их составлять - дело не из простых. Решил на tumblr`е организовать небольшой сервис для помощи в этом деле:

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 }

Как он Вам? :)