привет

#ЖИТЬ https://www.youtube.com/watch?v=X__GJAvZ4_M

Далее

Первое сентября Сегодня старший мой идет в первый класс.

Далее

Немного альтернативной истории — Да, победили, и что толку? — вздыхал Саня. — Столько крови пролили, в половине Европы социализм установили. Теперь нам никогда не войти в европейскую семью народов, мы не уважали их ценности. А знаешь, сколько немок изнасиловали наши солдаты, когда заняли Берлин? Миллион! Это же ужасно! Саня, либеральный сетевой журналист, отлично...

Далее

#котозависимость Та же проблема...

Далее

Креатив в Магнитогорске Как и раньше продолжаю замечать необычные вещи, когда гуляю по городу. Некоторые кеативные люди заставляют улыбаться. Лифт, на котором можно отправиться в "Ж". Магазин, в котором продается самая не свежая выпечка в городе.

Далее

О выделении памяти

Рубрики : Перепост, Программизмы, Разное, Юмор

Мультипоточное программирование: теория и реальность.

Рубрики : Разное, Юмор

89e533e0-5f8b-4c4f-b1d2-4553cc34490a

Тестирование баз данных

Рубрики : Программизмы

Небольшая презентация на тему модульного тестирования (Unit-тестов) для базы данных на MS SQL Server, и их разработке с использованием MS Visual Studio, а также об их «искривлении» и применении для тестирования целостности структуры данных и интеграционного тестирования.

Как задать и использовать константу в виде коллекции на Pl/SQL.

Рубрики : Программизмы, Разное

Иногда в реальных задачах необходимо в константах хранить какую-либо коллекцию. На языке pl/sql просто создать коллекцию и перечислить через запятую данные, которые она будет содержать, нельзя. Такое возможно только с массивами, у которых строго задан размер и тип элементов. Если же возникла необходимость сделать предопределенную коллекцию-константу, то в этом случае её не получится проинициализировать простым перечислением данных. Чтобы проинициализировать коллекцию–константу, необходимо задать функцию, которая вернет заполненную коллекцию для присвоения её в указанную переменную. Выглядеть это будет примерно так, как показано ниже.

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

subtype typeActionName is varchar2(50);                      -- Тип: Код действия
type typeActionCol is table of typeActionName                -- Тип: Список действий   
  index by varchar2(200);

cOperSetDefault       constant typeOperName:= 'SetDefault’;        
cOperUndoDefault      constant typeOperName:= 'UndoSetDefault';       
cOperChangeParam      constant typeOperName:= 'ChangeParam';      
cOperClose            constant typeOperName:= 'CLOSE';          
cOperOpen             constant typeOperName:= 'UNCLOSE';        
cOperDelete           constant typeOperName:= 'Delete';              
cOperAddItem          constant typeOperName:= 'AddItem';          

function setActionCollection  return typeOperCol;            --функция задания массива кода операции и имени операции

ActionCollection constant typeOperCol:= setActionCollection;  --список действий пользователя

function setActionCollection return typeActionCol
  is
    pOperCol  typeActionCol;
  begin
    pOperCol(cActionSetDefault)    := 'Установить параметры по умолчанию'; 
    pOperCol(cActionUndoDefault)   := 'Вернуть параметры, которые были до сброса';    
    pOperCol(cActionCloseAgree)    := 'Закрыть соглашение';
    pOperCol(cActionOpenAgree)     := 'Открыть соглашение';
    pOperCol(cActionChangeParam)   := 'Изменить значение параметров;
    pOperCol(cActionDelete)        := 'Удалить элемент';      
    pOperCol(cActionAddItem)       := 'Добавить элемент';  
    return  pOperCol;                             
  end;

Таким образом можно задать коллекцию, содержащую данные любого составного типа. В зависимости от типа будет меняться только функция его заполнения (либо усложнятmся, либо упрощаться). После того, как мы объявили свою константу, возникает вопрос: как выполнить какие-либо операции при помощи данных, которые мы проинициализировали? Если рассматривать коллекцию, которую я привела выше, то для обхода её потребуется массив индексов.

type typeColkeys is varray(7) of typeOperName;

--массив для индексации действий
    Collectionkeys typeColkeys  := typeColkeys (cActionSetDefault, cActionUndoDefault, cActionCloseAgree, cActionOpenAgree, cActionChangeParam, cActionDelete, cActionAddItem);

А после этого можно будет пройти по коллекции циклом и выполнить необходимые вам операции.

    FOR i IN 1..ActionCollection.count loop
        --выполняем необходимые операции
        --Collectionkeys(i) – это будет код действия пользователя 
        --ActionCollection(Collectionkeys(i)) –это будет заголовок действия 
    end loop;  

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

Аудит действий пользователь с Oracle Apex

Рубрики : Безопасность, Программизмы, Разное

Когда ваш интерфейс разработан или только разрабатывается с помощью Oracle Application Express, возникает проблема с реализацией аудита пользовательских действий. Конечно, если у вас система небольшая, то можно обойтись реализацией записи в таблицу аудита через Apex. Однако, если у вас в системе множество таблиц, а операции над записями осуществляются в десятках различных мест, фиксацию действий пользователя проще всего вести с помощью триггеров. Триггер — это проверенный механизм, который не будет зависеть от сети и не затормозит пользовательский интерфейс. Если реализовывать аудит с помощью механизма триггеров, то все становится достаточно просто — необходимо просто повесить на те таблицы, действия с данными которых вы хотите контролировать, триггер after insert, update, delete и прописать в нем insert в таблицу аудита с указанием названия таблицы, действия, колонки, старого и нового значений.
Далее

Интерпретация ошибки 404

Рубрики : Разное, Раскопки, Юмор

Встречается много реализаций ошибки 404. Наталкиваясь на различные варианты начинаешь сравнивать полет фантазии, вот этот вариант просто замечательный. Надо отдать должно люди постарались http://proteys.info/404/ (на сайте есть звук!!!).

Как создать индекс в Oracle, если таблица занята.

Рубрики : Программизмы, Разное

Иногда бывают такие ситуации, когда что-то случилось с индексами на важной таблице. Если работа с БД непрерывная и эта таблица очень часто занята, восстановить индексы достаточно проблематично, так как ресурс постоянно занят. Конечно можно поймать такой момент когда СУБД даст возможность создать index. Однако если эта проблема всплыла только после запуска длительной и важной операции, которая не требует отлагательств. Так как объект занят вам придется писать код создания индекса и сидеть давить, ловя момент когда пройдет commit и объект разблокируется. Не очень радужные перспективы. По-этому умные люди в Oracle подумали об этом. В Oracle Enterprise Edition есть возможно запустить создание индекса в режиме ожидания. К сожалению уже в версии Standard Edition данная возможность отсутствует. Что бы запустить создание индекса, когда ресурс занят необходимо дописать в конце ONLINE.

CREATE INDEX index_name ON table_name (column_name, column_name, column_name, column_name) ONLINE;

Операция запуститься и будет ждать момента, когда ресурс освободится. Как только пройдет commit запустится создание индекса. Имейте в виду, что время, необходимое для завершения построения онлайн индекса пропорциональный размеру таблицы и числу одновременно выполняющихся DML отчетности. Поэтому, лучше всего, начинать оперативное построение индекса при низкой DML активности.

Очень полезная feature. Если у вас версия Enterprise Edition советую пользоваться, так как она нужна не только в ситуации, которую описала я. Почитать документацию об этом можно здесь.

Как делаются внутренние ссылки на странице

Рубрики : Программизмы, Разное

Иногда есть необходимость сделать в html-файле меню и ссылки на текст ниже, а потом назад на меню. Для тех кто не знает, как это делается, я решила рассказать. Мне это пригодилось, когда я начала формировать свои рассылки с блога (как  организовать рассылку я расскажу позже). Что-бы организовать меню необходимо поставить тег <a> со ссылкой  href=»#имя_ссылки», а там, куда будет переводить этот тег, якорь <a> с именем name=»имя_ссылки». Таким же образом осуществляется реализация ссылки возврата. Вот как это выглядит.

Ссылки в меню переходят на различные области страницы, а ссылка «в начало» возвращает на начало страницы. Конечно мелочь, но приятно, когда разработчик думает о пользователе и предоставляет удобные инструменты.

Далее

Онлайн-компилятор

Рубрики : Жизненное, Программизмы, Разное, Раскопки

Как то Алан Кэй в интервью журналу Dr. Dobb’s сказал:

«Представьте, вы открыли «Википедию» на статье про язык Лого. Можно ли там написать и запустить программу на Лого? Нет. И авторам «Википедии» такое даже в голову не придёт, несмотря на то, что всё происходит на компьютере», — говорит Кэй. Он считает, что раз компьютер создан для взаимодействия, значит нечего пытаться изображать старые, неинтерактивные виды медиа. «Веб-браузерам уже много-много лет — объясняет Кэй, — и несмотря на то, что они работают на компьютере, который может выполнять задачи А, Б и В, они позволяют делать только А и половинку Б» отсюда .

Может быть его слова вдохновили, а может сами додумались создатели сайта http://ideone.com , на котором реализован on-line компилятор для различных языков программирования. Конечно, пока не на статье Википедии про языки, а отдельно, но все-таки появилась возможность скомпилировать код на страничке. Теперь можно не мучатся, чтобы проверить работоспособность кода в примерах и уроках по программированию. Можно просто прежде чем затевать крупный проект, быстренько проверить на ideone. А вот если бы сервис появился, который предоставлял бы возможность встраивать в страницу компилятор нужного тебе языка, вот тогда и на википедии, и на блогах, и на форумах, посвященных программированию, было бы очень комфортно »обитать». Побольше бы умных людей высказывали идеи, которые помогут сделать жизнь удобнее. Тогда, цепляясь за эти идеи, будут создаваться полезные мелочи, которые, на самом деле, не так уж просты в реализации, но, как показывает практика, очень полезны и нужны.

Реализуем плановый (производственный) календарь

Рубрики : Программизмы, Разное

Иногда, когда какой-то кусок работы организации полу-автоматизирован, то есть часть работы выполняется автоматически по расписанию, а часть делают люди (например сотрудники работают по заданию, которое выдается им каждый день автоматически), возникает необходимость сделать так, чтобы в выходные и праздничные дни задания не выдавались. Да, собственно, и логично, ведь в эти дни сотрудники не работают. Сделать это не сложно. Единственная проблема для пользователей в том, что каждый год необходимо будет заполнять производственный календарь (либо «перекачивать» его с какого-либо ресурса). А вот для программиста работы побольше.
Далее