Перейти к основному содержимому

Кэширование js сжатием gzip

· 2 мин. чтения

Cache — временные данные или устройство по их хранению, созданные для ускорения чтения/записи. Все программисты это знают. Ускорение загрузки web-сайтов тема обширная, начинающаяся с сервера и заканчивающаяся клиентом. К сожалению я не нашёл более-менее подходящих решений по объединению и кэшированию js-кода, поэтому к своему блогу я написал свою схему, о которой вкратце и расскажу..

Существует сжатие «packer», которое убирает все символы форматирования и переименовывает имена функций и переменных в js и предоставляет т.н. minified-версию скрипта. Все с этим прекрасно знакомы на примере больших библиотек jQuery, TinyMCE, prototype. Кроме того что код становится совершенно не читаемым, это может вызвать неработоспособность кода, когда имена переменных динамические.


Моя идея простая — разделять js/css по файлам разработчикам надо для поддержания модульной структуры. Обычно я в контроллере создаю список файлов которые надо присоединить к данному документу, вместо того что-бы прописывать это вручную в темплейте. Но теперь надо сделать так, что-бы до показа темплейта вызывалась функция кэширования, которая проходилась бы по списку, проверяла из них локальные файлы на время изменения, объединяла в один файл и создавала или перезаписывала gz-файл с именем, сформированным из md5-хэша имён входящих файлов.

Всё просто и в сумме заняло часа 4 на раздумье. Привожу метод cache_js из класса Controller.

function cache_js(){  
$arrNewJS=array();
$strHash='';
$strGzipContent='';
$intLastModified=0;

foreach ((array)$this->scripts as $file){
if (substr($file,0,5)=='http:') continue;
if ($file[0]=='/') $strFilename=sys_root.$file;
else $strFilename=sys_root.'app/front/view/'.$file;
$strHash.=$file;
$strGzipContent.=file_get_contents($strFilename);
$intLastModified=$intLastModified<filemtime($strFilename) ? filemtime($strFilename) : $intLastModified;
}

$strGzipHash=md5($strHash);
$strGzipFile=sys_root.'app/front/view/js/bin/'.$strGzipHash.'.gz';

if (file_exists($strGzipFile) && $intLastModified>filemtime($strGzipFile) || !file_exists($strGzipFile)){
if (!file_exists($strGzipFile)) touch($strGzipFile);
$gz = gzopen($strGzipFile,'w9');
gzputs ($gz, $strGzipContent);
gzclose($gz);
}

Про css я писать не стану, идея аналогичная. Единственный вопрос в автоматизации кэширования и в порядке входящих файлов. Впрочем в результате сжатия 5 запросов превратилось в 1, а суммарный размер уменьшился в 3 раза.

В случае с css оказалось, что файл должен иметь расширение не .gz, а всё-таки .css, но заархивированный варинат тоже подходит

Читайте так-же:

Оплата кредитной карточкой с php

· 2 мин. чтения

Большинство систем оплат работают по принципу ворот (gateway) - передал данные, они обработались и вернулись. С клиентом или без него. Сегодня на devclub я рассказывал об эстонских pangalink'ах, но на самом деле я в последнее время интересовался кредитками. О них сегодня тоже рассказывали, перескажу коротко.

CSV - кодировки, импорт и экспорт

· 2 мин. чтения

Comma Separated Values - типичный способ экспорта табличных данных, но далеко не стандартный в плане совместимости между Excel, php и другими источниками данных. Надо читать RFC, и пробовать всё на практике

Самое наглядное - если вы думали что данные достаточно через запятую перечислить, то если вы сохраните простой текстовый файл с такими данными:

ID,name 1,Mac'duck

То в Excel получите

Тому несколько причин

  • Отсутсвие utf8
  • Разные символы разделения данных (табы вместо запятых)
  • Особые символы (", n , r) должны очищаться что-бы не побить линейную разметку
  • fgetcsv()
  • Данные лучше помещать в двойные кавычки, а сами двойные кавычки в данных эскейпятся повторением:
    $value = str_replace('"', '""', $value);
    $value = '"' . $value . '"' . ",";

Mysql

SELECT id, name, email INTO OUTFILE '/tmp/result.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY 'n'
FROM users WHERE 1

 

Экспорт

header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: public');
header('Content-Description: File Transfer');
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename=SomeFile_' .time(). '.csv;');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.strlen($strCSV));

mb_internal_encoding("UTF-8");

$strCSV= chr(255) . chr(254) . mb_convert_encoding($strCSV, "UTF-16LE", "UTF-8");

 

Импорт

uiyi

$sCSVFileData = file_get_contents($aFile['tmp_name']);
if (mb_detect_encoding($sCSVFileData)) {
$sCSVFileData = mb_convert_encoding(mb_substr($sCSVFileData, 2, mb_strlen($sCSVFileData)), "UTF-8", mb_detect_encoding($sCSVFileData));
}
else {
$sCSVFileData = mb_convert_encoding(mb_substr($sCSVFileData, 2, mb_strlen($sCSVFileData)), "UTF-8", "UTF-16LE");
}

$aCSVLines = explode("rn", $sCSVFileData);

for ($i = 0; $i < count($aCSVLines); $i++) {
if ($i > 0) {
$arrData[] = getCSVValues($aCSVLines[$i], "t");
}
}

function getCSVValues($sString, $sSeparator = ",") {
$sString = str_replace('""', "'", $sString);
$aBits = explode($sSeparator, $sString);
$aElements = array();
for ($i = 0; $i < count($aBits); $i++) {
if (($i % 2) == 1) {
$aElements[] = $aBits[$i];
}
else {
$sRest = $aBits[$i];
$sRest = preg_replace("/^" . $sSeparator . "/", "", $sRest);
$sRest = preg_replace("/" . $sSeparator . "$/", "", $sRest);
$aElements = array_merge($aElements, explode($sSeparator, $sRest));
}
}

return $aElements;
}

Оценка сложности, качества и коллектива проекта

· 8 мин. чтения

Работа расширяется и как правило превышает отпущенное на неё времяПервый закон Паркинсона

Проект - делопроизводство с вовлечением человеческих, финансовых и материальных ресурсов и организованный с тем что-бы уложиться в рамки ресурсов и времени и достичь поставленные тестируемые требования

Управление проектом - действия по направленному приложению усилий с применением имеющихся знаний и ресурсов ради достижения поставленных чётких целей. Успешность проекта полностью зависит от организации. Может оцениваться вещественно и невещественно (общественное мнение и тп.)


Типы проектов

  • низкотехнологичные, основанные на существующих стандартах (например ERP, CMS)

  • технологичные, основывающиеся на практически готовых технологиях (дополнения существующих проектов)

  • высокотехнологичные, практическое большинство написано специально для проекта (программы для военных, софт для мобильных аппаратов)

  • super high-tech

Оценка успешности проекта

  • по времени, расходам, качеству выполненной работы до завершения проекта
  • влияние на краткосрочную прибыль клиента
  • по полученному положению (преимуществу) в сравнении с конкурентами
  • по личному отношению клиента к выполненной работе

Цикл жизни и опыт коллектива

Методы подхода к реализации проекта можно разделить на:

Проектоориентированные - как организована работа коллективаСистемоориентированные - какой проект в техническом плане
- Waterfall
  • Sashimi waterfall

  • Staged Delivery

  • Controlled Iteration

  • Spiral

  • RUP

  • XP

  • Scrum

  • Evolutionary Prototyping

  • Code and Fix

  • Agile|- PMBOK - описывает область знаний и прилегающие области необходимые при выполнении проекта. Включает стандарты, общие требования к знаниям

  • MPMM -

  • Prince2|

Жизненный цикл проекта определяет время начала, конца и промежуточные периоды. Эти периоды (итерации, фазы) в зависимости от выбранной методологии и проекта могут быть к примеру:

  • Необходимость, планирование,создание, проверка, завершение
  • Дизайн, программирование, тестирование, обучение, выпуск

В свою очередь вне зависимости от масштаба периода, вплоть до элементарной задачи сотрудника, можно выделить мировоззрение PDCA - планировании, действии, проверке и докладу.

Оценка сложности

Происходит по аналогии либо по анализу. По аналогии соответсвенно похожие задачи были некогда проделаны и общее время известно. По анализу просчитывается количество функций, требований, сложности и действий с умножением на некую среднюю величину. Существует также и метод оценки PERT, работающий по формуле:

Оценка (чел/час) = (оптимистичная + 4 * ожидаемая + пессимистичная) /6

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

Оценка должна учитывать в контексте системы четыре аспекта:

  1. Разрабатываемый продукт для клиента
  2. Бумажную работу и проволочки внутри фирмы (т.н. издержки на организацию работы)
  3. Услуги и работы которые необходимо будет делать после завершения проекта (поддержка, обучение и тп.)

Сортировка задач по времени наглядно видна в MS Project, но в общем там заметны элегантные очевидности - параллельность выполняемых задач (leads) разными людьми в одно и то же вермя и необходимость в запасном времени (lag). Кроме очевидных зависимостей (Конец-Начало) между задачами, теоретически ведь возможны и разные комбинации, когда задачи должны либо завериться одновременно, либо хотя бы немного начаться.

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

Согласно E. Goldratt'у оценка буфера проекта должна составлять 50% от длины критического пути. Если при разработке появляется опоздание в размере более чем 15-20% от критического пути, и невозможно привлечь дополнительные ресурсы, то необходимо делать компромисс между качеством, масштабу работ или оплатой. Потеря ключевого работника может внести опоздание дополнительно в 4-9 недель.

Оценка качества

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

Основные стандарты качества:

  • Six Sigma - статистический метод от Motorola

  • ISO 10006 - Guidelines to quality in project management

  • TQM

  • CMM

Очень показательны и методы планирования качества. Например анализ расходов (Cost-benefit analysis) можно наблюдать в фильме "Fight Club", где расходы на отзыв автомобилей был бы больше чем бездействие с ежекратной уплатой пострадавшим в авариях по страховке. Анализ расходов на достижение качества (Cost of Quality) с другой стороны показывает сколько надо тратить на всевозможные проверки, тестирование, стандартизацию, исправления, гарантии до выхода продукта.

В таком разнообразном мире много всевозможных переменных и не только в физическом мире, но и в программном обеспечении. Поэтому существует понятие риска, его вероятности и критичности. Стратегии по улучшению качества включают не только минимизацию риска, но и их смягчение, чёрные сценарии. В инфосистемах это можно наблюдать всюду - в валидации форм, ошибках 404, резервном копировании хостинга, подсказках (tips), подтверждениях (are you sure?), транзакциях с финансовыми операциями и тп.

Качество напрямую связано с тестерами. А они в свою очередь знакомы с некоторыми темами:

  • Диаграммы причин-следствий (Ishikawa)
  • Оценка на основе статистической выборке
  • Японской философии постоянного совершенствования Kaizen
  • Benchmarking, т.е. проверка на скорость реальной системы
  • Принципом Парето 80-20

Проблемы можно классифицировать не только по сложности (слышали про гейзен-баги?) но и по человеческим причинам возникновения:

  • "Без батареек". Человек спешил или самоуверенно не читал чужой код или документацию
  • Смесь третьего ПО. Технократизм программера или архитектора, по гордости или глупости решившего использовать технологии без понимания их совместной работы (см. CORBA, COM и тп.)
  • "А давайте добавим". Слишком большие энтузиасты-управляющие или ленивые программисты часто любят предложить дополнительную работу, не видя общего графика и желая оставить приятное впечатление.
  • Несинхронная архитектура. Как правило затрагивает огромные проекты, где аналитический отдел и программисты не успевают друг за другом, а архитектура меняется на ходу. Причина - отсутсвие нормального управления архитектурой
  • Убивающая Демо-версия. Отдел маркетинга ставит большую важность на демонстрацию системы как зацепляющего клиентов объект, из-за чего комманда разработчиков постоянно занята развитием и поддержкой прототипа самой новой версии и не занимается реальными проектами.
  • Неправильный цикл. Большая контора, но цикл разработки ПО выбран неправильно, отсюда - нестыковки в графике, неизвестное состояние проекта, завышенные расходы.
  • Клиент всегда прав. Постоянные дополнения вносимые управляющим проектом от клиента. В результате - нестабильный дизайн и куча ошибок, незаконченность или взаимосвязанность. Возникает из-за несфокусированности на целевых аудиториях.
  • "Кольцо всевластья". Для универсальности и увеличения продуктивности в фирме все проекты подстраиваются под одну гребёнку, в результате у мелких проектов появляются лишние задачи.
  • Эффект Домино. Ключевого разработчика/дизайнера/аналитика временно переводят на другой проект "помочь", поскольку пока проект отлично успевает. В результате всё идёт ещё хуже - ключевой человек забывает и не имеет понятия о состоянии старого проекта, но и не втянулся в новый проект. Причина - растущая компания, слишком много работы, зависимость от ключевых фигур.
  • Угодить всем. Управляющие вмешиваются в проект в обход управляющего проектом, возникают параллельные задачи, стресс, изменения в планах.

Общение в коллективе

В больших компаниях (более 20 человек) идёт активное разделение и иерархия коллектива на роли и группы. Роли согласно RUP - аналитики, разработчики, тестеры, управляющие и остальные. Но для эффективной работы, создаются группы скажем "CMS PHP team", ".NET gps project team" и тд.

Во главе такой группы технарей стаит управляющий группой (team leader), который координирует работу внутри группы и с управляющим проектами. У нас в компании походая схема и зачастую возникает вопрос - к кому и как обращаться если возникли вопросы по проекту или что-то не так. Трясти постоянно team-leader'а не лучшее решение, он сам не железный, а просто так за спиной подходить к дизайнерам "ребят, исправьте тут работы на пару часов только.." тоже не совсем правильно.

Вообще существует несколько схем организации такой работы и общения.

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

  2. Безструктурная схема - небольшая анархия. Разговаривать приходится когда попало и с кем угодно, порой по разным проектам одновременно. Из-за этого возникает низкая продуктивность, невозможность предсказать времена.

  3. Уровневая схема. Комманда разработчиков организована по уровню опытности со смешанными ролями. Так что верхние слои отвечают за архитектуру в целом, а нижние за менее важные и более приземлённые части. Работники принадлежат одновременно нескольким группам.

Информационный канал можно тоже упорядочить по степени пропускаемости: Бумажное письмо (без диалога), email, аудио-запись (без диалога), видео (без диалога), телефон, видео конференция, диалог возле доски.

По эволюции комманды с проектом, можно составить следующие психологические ступени:

  1. Создание комманды (Forming), определение целей проекта, ролей участников и задач
  2. Выяснение границ компетентности (Storming), поиск единого стиля
  3. Нормализация отношений (Norming), доверие и спокойная совместная работа
  4. Производственные отношения (Performing), вмешательство управляющих минимально

Оценка безопасности

По ISO существует несколько характеристик действий работника с системой.

  1. Identification: who are you?
  2. Authentication: how do I know your identity is true?
  3. Authorization: are you allowed to perform this transaction?
  4. Integrity: is the data you sent the same as the data I received?
  5. Confidentiality: are we sure that nobody read the data you sent me?
  6. Auditing: record of all transactions so we can look for security problems after the fact
  7. Non-repudiation: both sender and receiver can provide legal proof to a third party (e.g. judge) that the sender did send the message, and the receiver received the identical message
  8. Privacy: addresses the access purpose and data owner choice

Это была статья с вольным переводом основных тем лекций по предмету управления IT-проектами в ТТУ ( IDU3390 - Infos?steemi projekti juhtimine). В заключение - небольшой клип о том что может произойти в офисе если не соблюдать технику стрессовой безопасности и оптимизма

Web-службы и архитектуры приложений для интернета

· 1 мин. чтения

вторник, 13 мая 2008 г. в 19:26:38

Данный предмет (IDU0080 - Web-teenused ja internetilahenduste arhitektuur) преподаётся в ТТУ будующим бакалаврам Информатики профессором Enn Õunapuu, а практические задачи ведутся работниками из Webmedia.

Практические занятия и представляют в данном предмете наибольшую сложность (и опыт). За время семестра разбирается тестовый проект и работа ведётся в Eclipse IDE с Java. Первым заданием даётся возможность составить документацию самому, а в остальных заданиях рассматривается уже наполовину готовая программа.

Проект представляет из себя систему вымышленного производителя одежды "Schmancy panties", при этом общение производится между складом (warehouse), управлением (sales), цехом (production), двумя поставщиками (melaka, hindusilk) и двумя магазинами (beijing, tokyo).

  • Java RMI и FTP
  • REST
  • Web-сервисы (via SOAP & WSDL). Генерация сервера с помощью xfire

Список стран, ISO и международные данные

· 5 мин. чтения

При разработке сайтов с международной аудиторией надо не только иметь списки стран и языков, но и учитывать их взаимосвязи, форматы, временные зоны. Я уже не говорю про трудности перевода и силлогизмы которые могут быть неправильно истолкованы публикой (например blue ? голубой). Но для простоты условимся что настала эпоха тотального глобализма и можно запросто скачать такие универсальные списки в SQL-формате как..

Страны

В основном этим занимается стандарт ISO3166-1. Проблем с нормализацией таблицы стран несколько.

Во-первых это само определение независимого государства. Существует целый список единично, частично или полностью не признанных  мировым сообществом государств. Начиная с Израиля с Китаем до Косово и Палестины, Абхазии и Южной Осетии. Несомненно политику отображения той или иной страны на сайте зависит от клиента - будет он следовать признанию других стран согласно своему гражданству или же либерально будет показывать всё. Однако следует учитывать процессы в которых эта переменная будет учитываться, например отправка почты (billing address).

Во-вторых, как уже было замечено многими специалистами по useability, возникает вопрос useability - на каком языке стоит показывать страну? Соответсвенно переводить надо названия стран на некие языки (все или государственные?), либо использовать написание на коренном языке. Опять же - который брать если их несколько, как в Швейцарии или Индии? Наконец, к странам можно приписать множество параметров, которые могут характеризовать различные социологические, политические, исторические, финансовые и прочие.

Языки

Флаг и герб стран это символ государства, а не языка. Языков в мире более десяти тысяч и их все пытается классифицировать стандарт ISO 639-3, включающий и взаимосвязи и нынешнее состояние этноса. Я недавно работал с международным сайтом где было 24 страны и каждая страна должна была быть представлена на своём языке. Так вот сам сайт очень простой, но из-за обилия языков возникали постоянно проблемы что где должно показываться. Тут нужна система переводов и чёткое описание иерархии объектов - зависят баннеры от языка или нет, каталог продуктов, статьи и тп.

С точки зрения удобства, как в админке, так и на публичной части сайта, языки должны быть написаны без перевода (native) - "English, Русский, Eesti, Українська" и тд. Если языков более трёх-пяти, то надо делать select если места мало, а дизайн не сильно приспособлен как на Wikipedia. Иметь огромную таблицу всех языков мира может быть полезно только в случае если вы хотите позволить пользователю добавлять языки на сайт самому и при этом ограничить его существующими языками и кодами. Иначе это лишний груз.

Валюта

Почему валюту я выделяю в отдельные таблицы? Во-первых, логически это финансовая характеристика страны которая может достаточно быстро меняться по сравнению с остальными параметрами. Во-вторых к валютам часто приходится приделывать курсы валют, процент налога с оборота, систему оплаты и счетов (billing, invoicing). Наконец это отдельный ISO-4217 стандарт.

Даты и часовые пояса

С возникновением инфотехнологий, проблема дат наглядно ожидалась при Y2K, где чисто техническая ошибка хранения даты могла повлиять на чёрт-знает-какие критические гос.системы. Календарных систем в древности было масса, мне на ум приходит только наш Григорианский, но для исторической справки я порылся, для любопытства:

  • Юлианский календарь (4 г. н.э - 24 февраля 1582 г. н.э.), по нему в году - 365? дней (каждый четвёртый год - високосный). Простолюдинам число дней в месяце можно было легко запомнить по "горам" и "впадинам" на пальцах на кисти двух рук, считая слева направо. Тоесть хрящ (гора) означала январь - 31, впадина (февраль) - 28 или 29, март (31) и тд. Православная церковь до сих пор использует этот календарь.

  • Григорианский календарь заменил Юлианский, было пропущено 10 дней и для улучшения точности введено правило что каждый 100й год - невисокосный, но делящиеся на 400 всё-таки високосные. В среднем за эти 400 лет получается что год равен 365.2425 дней.

  • Длинный счёт календаря майя я немогу не упомянуть, поскольку он точней чем Григорианский, хотя нигде и не используется. В среднем точность года составляет 365.242036 дней и формируется группировкой дней в месяцы (уинал) по 20, а те в свою очередь дальше, получается цикл = 20 дней ? 18 уинал ? 20 тун ? 20 катун ? 13 бактун = 1872000 дней. Когда точно началось исчисление - неизвестно, но по существующей теории этот цикл "Пятого солнца" закончится 20 декабря 2012.

  • Персидский солнечный календарь cоставленный при участии Омар Хаяма. В отличие от Григорианского где ошибка составляет 1 день в 3000 лет, тут год в среднем состоит из 365,24242 дня, с ошибкой 1 день в 4500 лет. Возрождённый в статус официального Иранского календаря в 1925 году, вычислением високосного года явно занимался математик, потому что первый считается таковым если при делении года на 33 остаток составляет 1, 5, 9, 13, 17, 22, 26 или 30.

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

Из шести комбинаций упорядочивания даты, в мире наиболее популярной стала логичная возрастающая, в странах могут незначительно различаться только разделители и число цифр. Только под США приходится подстраиваться. Не забывайте что для этого формата тоже нужны переводы — для датского например "DD.MM.????"

dd.mm.yyyy13 января 2010Little endian. Ирландия, Россия, Бельгия, Бразилия, Франция, Норвегия, Дания, Нидерланды
y-m-d2010 январь 13Big endian, ISO 8601. Канада, Германия, Япония, Китай, Венгрия
m-d-yсентябрь 8, 1380Middle endian, США
y-d-mСША (службы охраны природы)
m-y-d?
d-y-m?

Автомобильные номера

Валидация автомобильных номеров дело бесмысленное. В Эстонии например приняты несколько стандартов этих номеров и судя по списку они отличаются и цветом и формой и числом букв/цифр. При этом надо помнить что бывают и заграничные и заказные номера. Поэтому какую-нибудь автоматическую парковку или определение номеров по изображению делать очень проблематично.

Итого SQL-dump весит 16 мб, состоит из 4 таблиц:

  • iso_countries
  • iso_currency
  • iso_languages
  • iso_country_ip

Источники:

Редакторы кода с помощью javascript

· 2 мин. чтения

Очень часто в web-проектах надо использовать визуальный редактор кода (richtext code editor), похожий на существующие IDE, с номерами строк и подсветкой кода. Наиболее часто он используется в редактировании исходного кода статьи или шаблонов в админке. В этой статье я перечислю существующие скрипты по аналогии со списком WYSIWYG-редакторов.

Практически все существующие визуальные редакторы создают iframe и генерируют внутри страницу в соответсвии с данными javascript-объекта, занимающимся всеми задачами по генерации кода и обработке клавиш.

Основанные на iframe:

  • EditArea — наиболее популярный редактор благодаря табуляции, gzip, совместимость пространства имён с другими библиотеками

  • CodePress — парсит SQL, Perl, C#, XSL, ASP, VBscript. Отдельные движки для разных браузеров (gecko=firefox, ie, opera). Создаётся iframe со внутренним CodePress'объектом с обращением через contentWindow. Сразу внутри скрипта идёт поиск textarea-элементов по классу, так что с динамическими ajax-редакторами прийдётся изменять скрипт. Кроме того нумерация (до 1500) строк сделана при помощи одной картинки

  • CodeMirror — парсит JS, HTML, CSS

Напомню что iframe не соответсвует XHTML спецификации, а с использоватьпредложенный тэг object с не сильно получится, из-за ограничения надоступ внутренних dom-элементов (поправьте если я неправ).

Основанные на div'ах

  • Simple CodeArea 0.1b - очень простой но помоему самый логичный подход использовать подсветку синтаксиса благодаря полупрозрачной textarea и div-элементу с форматированным текстом под ней. Единственная проблема - запаздывание при скролле, но в будующем я думаю это перспективный продукт

  • MDK-editor — относительно навороченный редактор, есть контекстное меню. В минусы можно отнести некрасивый скин, небольшую тормознутость, неизвестную лицензию на использование, перезапись window.onload, размер кода свыше 100 кб. Достаточно много классов и обычных функций, просто так не разобраться, тем более без документации.

  • Helene — вместо iframe используется фоновый div и динамически позиционируемая textarea поверх. Поскольку изменяется только один ряд, то невозможно выделить нескольких строк сразу

  • 9ne — похож на консоль, но нет возможности выделения всей строки Shift+End. Эмулирует каретку мигающим div'ом.

Code highlighting

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

Что-бы сделать подсветку кода цветом, можно воспользоваться отечественноым highlight.js , который правда у меня странно реагировал, вообще убирая код, кроме того он заточен и на pre тэг, любит когда указывается класс, согласно используемому языку.

Любители обработки кода до его показа - могут попробовать GeSHi

Читайте также

jQuery для продолжающих (с плагинами)

· 4 мин. чтения

jQuery - библиотека о которой в последнее время говорит практически каждый web-разработчик, верстальщик и дизайнер. Написанная с учётом CSS, она упрощает доступ к одному или нескольким DOM-элементам. Если вы ещё используете prototype, то можно использовать режим совместимости (правда не факт что у вас будут работать плагины). Стандартно доступ происходит благодаря функции $ или JQuery. Элементу можно добавить (.addClass) или отнять (.removeClass) CSS-класс. Если это input-элемент, то запись и чтение происходит в аттрибуты элемента (.attr) и напрямую к значению (.val) . Внутренние элементы можно задать как через (.html). Ajax очень просто вызывается функцией $.post (url, val, callback)

Кроме минимализма, ускоренности и CSS-селекторов библиотека мало чем по функциональности отличается от prototype, mootools. Она не расширяет родные JS-объекты, как это делает protype и существует в своём пространстве переменных, поэтому не конфликтует с другими библиотеками

Примеры

  1. Допустим надо сделать массовое удаление из списка (как в почте), для этого генерируется огромный список checkbox'ов, а что-бы их все их массово выделить можно создать глобальный checkbox<input type="checkbox" name="group[{$item.id}]" class="group_checkbox" onchange="$('.group_checkbox').attr('checked',this.checked);">
  2. Часто встаёт вопрос оповещения пользователей об удачном добавлении, ошибке или просто информации. Для этого можно использовать три CSS-класса, при этом элементы можно прятать по прошествии какого-то времени. Для этого используется конструкция, запускающаяся сразу после создания DOM-дерева (а не всего документа)$(document).ready(function() { setTimeout(function() {$('.error').fadeOut('slow');}, 20000);});
  3. Работа с select'ами очень проста (даже с multiple=true), например если надо двумя кнопками перекидывать элементы двух списков, то поможет такой код:$().ready(function() { $('#add').click(function() { return !$('#select1 option:selected').remove().appendTo('#select2'); }); $('#remove').click(function() { return !$('#select2 option:selected').remove().appendTo('#select1'); }); $('#save').click(function(){ $('#select1 option').attr('selected',true); $('#select2 option').attr('selected',true);}); //при сохранении формы выделяем все эелементы });
  4. Выделить в select'е нужный элемент можно без цикла:
    $("#mySelect option[value='3']").attr('selected', 'selected');
  5. Проверить число отмеченных checkbox'ов очень просто:if (!$('.check_one:checked').length)
  6. Каждому элементу можно подключать (bind-ить) обработчики событий, даже несколько за раз…$('#someinput').bind('keyup change keydown', function() { alert ("one of three events is called!");});
  7. Изменить направление формы в зависимости от select'а можно явно (но лучше выносить все обработчики в отдельный файл)
    <form method="post" action="{$data.filter_link}" onsubmit="this.action=this.action+'/'+$('#filter_category option:selected').val();">

Классы в javascript

Несмотря на отличные библиотеки я не спешу бросать prototype.js и переходить на jQuery, потому что плохой код можно писать в любом языке и с любой библиотекой. Поэтому немного ликбеза. В Javascript можно делать объекты - очень удобно инициализировать, но они уникальны и их как массив использовать нельзя:

var CommentControl={ // объект читающий все комментарии
strURL:'/comments/read/', //обычный параметр
Init:function(){ //декларация функции
}}

Классы в javascript инициализируются как обычные функции, внутри которых используется ключевое слово this

function CommentBox(ID){
this.strURL='/comments/reply/'+ID; //параметр куда отсылать ответ
this.ID=ID;
this.reply=function(){
alert("AJAX request goes here");
}
this.update=CommentControl.Read(ID); //ссылка на }

Расширения и библиотеки

Расширения (plugins) в основном написаны обычными разработчиками. В качестве более функциональных наработок с интерфейсом создаётся и jQuery UI, как аналог scriptaculous для prototype, куда входят перетаскиваемые и сортируемые элементы и виджеты для интерфейса - аккордеон, табы, слайдеры и тп. Ниже привожу свой список полезных плагинов + советую уделить внимание презентации об разработке с учётом отключённого javascript. Значительно более детальный список есть на jquerylist

Изображения

  • ThickBox - галерея, аналог lightbox
  • FancyBox - тоже галерея, мне меньше нравится
  • Galleria - галерея
  • Multimedia portfolio - горизонтальный слайдер с видео, картинками и звуком
  • imgAreaSelect - выделение области для вырезания
  • Анимированный блок изображений, подходит при портфолио и панорамах
  • Lightbox с более плавной анимацией чем в prototype + занавеска как положено.
Таблицы
  • Flexigrid - табличные данные
  • InGrid - ajax'ная таблица, но не на json, а на открытом html'е. Впрочем компактном и без хаков.
Формы
  • ajaxForm - создаём как обычно статичную форму, а скрипт делает из неё ajax'овую
  • Autocomplete - на самом деле подгружает html. Небольшие заминки были с настройкой параметра extraParams
  • DatePicker - показывает генерирует календарик под указынными полями
  • FaceBook like - автоподсказки
  • jGrow - размер textarea в зависимости от размера текста
  • DamnSmallRTE - мелкий WYSIWYG
  • Multiselect как обычный select + выезжающие checkbox-ы
  • NiceForms - обрамляет input-ы div-элементами с закруглёнными углами, стилизует radio и checkbox'ы. Я правда предпочитаю более независимую версию nice forms
  • JQuery select - конвертирует все select-элементы в UL, которые можно более гибко стилизовать
  • MaskedInput - маска заполнения input-форм
  • Закачка файлов с созданием iframe-элементов (напоминаю что в XHTML) они не валидные
  • Манипуляция checkboxами и radio с превращением в iphone-стиль
  • jWYSIWYG - простейший редактор
Layout
  • RoundedCorners - закруглённые углы при помощи генерации элемента canvas
  • CodaSlider - слайды в дополнение закладкам (tabs)
  • idTabs - закладки для экономии пространства, но надо стилизовать
  • tooltips - расширенные всплывающие подсказки

Смотрите также:

Пространство имён в php 5.3 и php 6

· 2 мин. чтения

Пространство имён (namespace/package) знакомо java и c# программистам, теперь доступно и в php. Нужно оно для того, что-бы не писать длинные перефиксы к названиям классов, как сейчас делается в Zend, PEAR и других библиотеках и платформах для совместимости.

Вместо этого классы, функции, интерфейсы (абстрактные классы) и константы могут быть объединены в одно пространство имён. Глобальные переменные в это пространство не входят.

Простой пример

Определяется пространство ключевым словом namespace

//определяем класс в пространстве namespace MyCMS::Core; class System{}

Использование этого класса в третьих библиотеках осуществляется ключевым словом use

require_once('mycms/core.php'); use MyCMS::Core::System; //импортируем только заданный класс $objSystem=new System;

Как вы уже догадались, разделитель :: работает так же как и вызов статических методов, разделяя уровень пространства имён и конкретный класс. Уровень вложённости пространств можно использовать наряду с модульностью библиотеки, например реализовать пространства Database::MySQL::Adapter и Database::Oracle::Adapter.

Новые возможности и новые проблемы

Если в пространстве имён имя класса перезаписывает ранее объявленный глобальный класс или функцию, то к нему по прежнему можно обратится через ::SomeClassName, однако не зная к какой именно реализации программист обращается может вызвать проблемы. Например можно переобъявить стандартные php функции, поменять sin() и cos() местами, что-бы кому-то жизнь мёдом не казалась.

Для отладки существует рабочая константа NAMESPACE.

С двоеточием возникает и проблема неоднозначности:

A::B() // вызов функции B из namespace A A::B() // вызов статичного метода B у класса A

Читайте по теме:

Переходим на XHTML 1.1

· 3 мин. чтения

Я недавно ходил в одну контору устраиваться на работу и первый вопрос который я получил это "что такое DOCTYPE" и "расскажи про Strict, Transitional, Quirks". Само собой вопрос не совсем по моей специальности - я не верстальщик, но всё равно я любопытный. В год назад такая же история была со Skype - в итоге я тесно познакомился с Postgre. Так что не долго думая я решил блог по возможности привести к правильному XHTML 1.1, хотя продвигать или уж тем более требовать то же самое от своих коллег я не собираюсь - каждый сам решает уровень своей дисциплинированности.

XHTML приближен по к XML, парсер не должен гадать как то было в Transitional-mode правильно ли автор расставил порядок тэгов. Более того, это передний фронт развития стандарта, следующая фаза будет в версии 2.0. Параллельно с XHTML развивается HTML 5, но почему-то я ему не доверился, наверно интуиция. XHTML советуется объявлять при помощи MIME application/xhtml+xml, но IE как всегда тормозит и не понимает. Приведу некоторые стандартные ошибки, которые я заметил у себя в процессе стандартизации.

Незакрытые тэги, < и &

Я давно уже привык закрывать
, но многие input и img на автомате остались без моего внимания. До этого я часто замечал в чужом коде что внутри ссылок параметры разделяются не просто символом &, а кодом амперсанда &. Как оказалось то же обстоит и с символами тэгов. Все параметры тэгов так-же обязаны быть помещены в кавычки. Очевидно это нужно что-бы ускорить работу парсера. Хотя помоему это чуть излишне.

Всё есть object

Embed это нестандартный тэг часто используемый для вставки видео с youtube (а я советую vimeo), который по всей видимости начал использоватся как совместимость с перекупленным у Netscape движком IE для внедрения объектов внутрь страницы. Он уже отжил своё и его использование в XHTML невозможно. Советы от Elisabeth CastroBernie Zimmerman подтверждают это и советуют использовать нечто подобное:

<object type="application/x-shockwave-flash" width="425" height="350" data="http://www.youtube.com/v/7_6B6vwE83U"> <param name="movie" value="http://www.youtube.com/v/7_6B6vwE83U" /> </object>

Но проблема в том, что даже если использовать версию без embed, то по крайней мере у моей версии tinymce-редактора (а она без wordpress и без плагина) возникает проблема редактирования и повторного открытия - объект начинает играть сразу в редакторе. Благо при переходе на tinymce 3 объект остаётся спрятанным в коде.

Iframe тоже оказывается пережитком прошлого, его как и svg надо использовать через object-тэг.

CDATA в inline script и style

Character Data активно используется в XML что-бы представить символьные данные, на которые не должны накладываться законы формирования документа - знаки обозначения тэгов и амперсандов. В XHTML использовать такая открывающая и закрывающая строка просто необходима для обозначения CSS и Javascript, иначе всякое упоминание & и < будет считаться параметрами или тэгами.

//<![CDATA[ alert "Для javascript добавляются ещё знаки комментирования" //]]>

Обязательные и не существующие элементы

Не существующие тэги и параметры

  • img.border

  • img.align

  • ol.start

  • a.name раньше использовался для навигации по якорям в ссылках (добавляется символ решётки, например #top), теперь заменен на использование параметра id.

  • center

И наоборот, некоторые параметры и вложенные тэги стали строго обязательными

  • ul li - раньше я просто оставлял пустой список, если он заполняется ajax'ом, теперь надо прятать и добавлять пустой li-элемент

  • head title

  • textarea.cols

  • img.alt - приучает развивать фантазию на случай если картинки отключены или грузятся. Глядишь - и print-версию css напишешь.

Для тестирования я использовал как валидатор W3C, так и плагинами для браузеров.

Сетевые интерфейсы к базам данных

· 3 мин. чтения

Перевожу список вопросов-ответов для контрольной по предмету Andmebaasi võrguliidesed который в ТТУ ведёт сейчас Erika Matsak и где основная тема - работа с Oracle из Java посредством JDeveloper. Впрочем я думаю и незнакомым с этой темой будет интересно…

Модели данных

  1. Плоская. Одна таблица (сущность/класс) (MS Excel, телефонная книга). Есть заголовки таблиц, типы и собственно данные
  2. Иерархия. Много сущностей (классов/node'ов) между которыми есть только отношения 1:N. Например меню, страны-города-регионы и тд.
  3. Сеть. Объекты могут связаны N:M отношениями. Люди в соц.сетях, ссылочное ранжирование.
  4. Реляционная модель - расширенная модель сети, где связей может быть несколько.
  5. Продукционная модель - набор правил которые могут быть представлены в виде IF (условие) THEN (действие). Используется в промышленных экспертных системах. Наглядно, модульно, однозначно
  6. Семантическая сеть - расширенная модель сети, где отношения фиксированы и производятся над понятиями объектов и классов (иерархические, функциональные, количественные, пространственные, временные, логические и тп.)
  7. Фреймы Минского - собирательный образ данных для представления человеческого абстрактного восприятия. Состоит из структур, ролей, сценариев, ситуаций. Фреймы можно наследовать

Основы реляционных БД

Таблица считается в первой нормальной форме , если её поля атомарны и у неё есть primary key. Таблица считается во второй нормальной форме, если все поля зависят от primary key, но не зависят от его частей. Таблица в третьей нормальной форме, когда primary key полностью идентифицирует ряд.

Некоторые свойства таблиц:

  1. Порядок рядов в таблице не имеет значения - это множество

  2. Объекты уникальны

  3. Объекты могут идентифицироваться через минимальный ключ (primary key) или несколько ключей (keys)

  4. Объекты можно связать друг с другом внешними ключами (foreign key)

  5. Любой параметр ряда может иметь значение NULL

Oracle и доступ из интернета

Из интернета редактируется в Enterprise Manager = Apex = HTML DB. Также есть SQL*Plus - консоль с расширенными SQL-коммандами (например DESCRIBE)
Пользователь может иметь

  • Системную привилегию, например на создание таблиц/пользователей/соединения

  • Объектную привилегию на доступк конкретной таблице

  • Группы привелегий. Например RESOURCE группирует в себе создание триггеров и процедур, DBA - привилегии админов

Основы SQL

Комманды можно разделить на:

  • SELECT/INSERT/UPDATE/DELETE - основные комманды принципа CRUD.
  • WHERE/HAVING/IF/CASE/THEN/IN/LIKE/EXISTS - основные комманды логической фильтрации
  • ORDER/GROUP - аггрегирующие и сортирующие комманды
  • SYSDATE/TO_CHAR/ROUND/...- функции работающие с одним рядом
  • JOIN - объединение таблиц
PL/SQL

Очень похож на Pascal/Delphi. Используется для обработки данных в таблицах.

DECLARE a NUMBER; b NUMBER; d VARCHAR(20); //инициализация c NUMBER := 3; //присваивание ``BEGIN SELECT e,f INTO a,b FROM T1 WHERE e&gt;1; //чтение в переменные INSERT INTO T1 VALUES(b,a); END;

БД, Java и роль JDeveloper

Соединение создаётся через класс DriverManager.getConnection. В Jdeveloper'е большинство кода можно генерировать визуальными компонентами.

Java beans

Это java-классы, созданные по правилам:

  • конструктор без аргументов
  • параметры имеют методы доступа (get/set/is)
  • наследуют интерфейс java.io.Serializeable

На основе таких правил созданы большинство компонентов графических библиотек Swing. Благодаря своей иерархической структуре, IDE могут легко анализировать и показывать внутренности визуальных компонентов.

Oracle JDBC драйверы

JDBC имеет четыре типа драйверов для работы с БД (библиотеки java.sql и javax.sql) - т.н. толстые (нуждающиеся в дополнительных библиотеках - OCI к примеру) и тонкие (написанные полностью на java - thin). Рекомендуется использовать thin-драйверы. От этого часто говорят о "тонком клиенте".

Assasins Creed

· 4 мин. чтения

Игрушка по вводному сюжету схожая с Timeshift - учёный-идеалист Vidic из фармацевтической компании Abstergo Industries (лат. "очищать") находит главного героя - бармена Desmond'а, убежавшего с фермы сектантов, который в прошлой жизни был клановым наёмным убийцей. Благодаря специальному устройству Animus (лат. дух), теперь можно прочитать генетическую память из прошлого, а самому герою - Альтаиру прийдётся пережить приключения в "центре мира" 1191 года - на Священной земле.

Порядок выполнения событий в DOM

· 2 мин. чтения

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

<div id='form_bg' onclick="$('form_bg').hide();$('form').hide();"> <div id='form'></div> </div>

Проблема в том, что при любом нажатии на внутренний элемент, событие автоматом вызывается на родительском элементе. Это заставило меня задуматься как над решением, так и над теорией как браузеры работают.


Две с половиной модели

Как оказывается, существует две модели передачи событий в объектно-ориентированной иерархии

  • Пузырьковый метод (bubbling), когда событие возникает внутри и затем передаётся родительским элементам наружу. MS Internet Explorer, Opera, Firefox
  • Захват события (capturing), событие обрабатывается сначала у родителей, а потом проникает глубже. Opera, Firefox

Консорциум W3C благоразумно решили что разработчикам может быть удобно в любую сторону направлять события (event propagation), поэтому по стандарту две модели объединены - событие сначала захватывается, а потом возвращается как пузырёк.

Таким образом разработчик может привязать вызываемый метод к фазе события:

$('form_bg').addEventListener('click',hideBackground,true); // true - говорит о фазе capturing $('form').addEventListener('click',function(){},false); // false - говорит о фазе bubbling
Получается что при клике на form_bg происходит сразу hideBackground, и form на фазе capturing не вызывается, затем возвращаясь, в фазе bubbling вызывается анонимная функция. 

Традиции по умолчанию

Модель W3C приятна, но по умолчанию по всей видимости из-за IE, обычная регистрация события подразумевает bubbling фазу, т.е. изнутри наружу. А это в свою очередь значит, что если я явно укажу на родительский элемент:

$('form_bg').onclick = hideBackground; // или как выше - в <div id='form_bg' onclick=..

То любое событие без остановки вызывает у всех родительских элементов обработку onclick-события. Есть у них оно или нет, вплоть до корня - document.

Заплыв без пузырьков

В кросс-браузерном варианте для остановки распространения обработки события к родительским элементам, надо поменять параметр cancelBubble на true (для IE) и вызывать функцию stopPropagation (W3C модель):

function hideBackground(e){ if (!e) var e = window.event; e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation(); }

Теперь мне интересно как устроена модель обработки событий в других языках и платформах - Java, NET, Flash..

Написано по мотивам статьи "Event order".

Random order в Postgres

· 3 мин. чтения

Случайность — маска неузнанной закономерности
Александр Волков

Как-то я писал о том как быстро можно сделать выборку в MySQL по большой таблице в случайном порядке не используя ORDER BY RAND(), теперь этот же вопрос всплыл на Postgre. Если вы не знаете, то ORDER BY RAND достаточно медленная операция из-за того, что сортируется фактически вся таблица. Некоторые советовали всё-таки обычную сортировку или чуть-изменённую с использованием Primary Key, но я на своём опыте убедился что конструкция IN всегда медленней чем EXISTS.

Электроны и дырки

Вообще задача подразумевает выборку и нескольких случайных рядов, но она сводится к выборке одного ряда, а точней ID. Самый простой способ - взять минимум (MIN или 1), максимум (MAX или значение Sequence) и случайным образом тыкнуть в промежутке. Задача чем-то напоминает процесс хэширования. И всё хорошо покуда всё идёт по порядку и ряды не удаляются. Как только в базе возникают пустоты (а они возникают вероятностью пропорционально размеру проекта), то получается что ряд не находится.

Использовать наиболее близкий к этой дырке ID'шник мы не можем из-за неравномерного распределения вероятностей и не гарантированного присутсвия вообще каких-то данных если мы в конце. Хотя можно плюнуть..

SELECT * FROM mytable WHERE id >= CEIL(RANDOM()*(SELECT MAX() FROM mytable)) ORDER BY id LIMIT 1;

Лотерея

Делать цикл с простукиванием каждой дыры тоже рискованно - вставит кто-нибудь гипер прыжок ID с 435 на 43600 и сложность алгоритма прыгнет основательно. 

Можно оторваться от ID'шек и внести случайны float-параметр. Такой лотерее дыры в ID уже неважны. Но  неравномерность вероятности всё-таки существует и в таком случае. Правда чем больше рядов, тем она незначительней, но тем больше места занимают эти лишние данные.

ALTER TABLE mytable ADD myrand DOUBLE PRECISION; --добавляем колонку UPDATE mytable SET myrand = RANDOM(); --очень медленная процедура ALTER TABLE mytable ALTER myrand SET NOT NULL DEFAULT RANDOM(); --ставим случайное значение для новых рядов по умолчанию SELECT * FROM mytable WHERE myrand >= (SELECT RANDOM() OFFSET 0) ORDER BY myrand ASC LIMIT 1;

Горст и грабен

Ещё простое решение - использовать случайный OFFSET. Сразу минус - LIMIT конструкция не позволяет динамически задавать значения, но образно идея такая:

SELECT CEIL(RANDOM()*(SELECT COUNT(*) AS cnt FROM mytable)); --получим из базы offset SELECT * FROM quotes LIMIT 1 OFFSET 43600; --и передадим в явном виде в запрос

LIMIT сразу перейдёт к нужному ряду - нет нужды в ID, а значит больше свободы. Единственный вопрос в скорости. Ведь используемая внутри COUNT функция - аггрегирующая, а в Postgre она отличается от обычного счётчика в MySQL. Ко всему прочему, как говорит документация - OFFSET может быть неэффективным в больших базах из-за того, что обработка предыдущих рядов всё-равно происходит.

Теги:

Экспорт данных используя Create View и Aggregate-функции

· 2 мин. чтения

Встала задача экспортирования данных из таблицы Firma в качестве строки. Если бы дело было в одноразовом копировании то проблемы особой и не-было бы - всегда есть клиентские программы, которые экспортируют хоть в Excel, хоть в текстовый файл какие угодно колонки. Но мне необходимо было это сделать при помощи SQL, потому что прямого доступа к live-базе данных у меня нет, а размер таблицы мне неизвестен.

Вход - таблица Firma

IDname
1Google
2Microsoft
Выход - строка
1=>Google;2=>Microsoft

Агрегирующие функции занимаются именно такой задачей - на входе у них массив данных, а на выходе - одно значение. Типичным примером являются функции COUNT, MAX, SUM. Postgre пошла по пути универсальности и позволяет пользователю самому создавать такие функции. Создаём CONCAT функцию:

CREATE AGGREGATE concat (  
BASETYPE = text,
SFUNC = textcat,
STYPE = text,
INITCOND = ''
);

Теперь можно сразу получить строку с данными, но мне нужна сортировка по названию фирмы, но никакие вложенные запросы и ORDER BY этому не помогают:

SELECT CONCAT(name||';') FROM Firma;

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

CREATE VIEW FirmaSorted AS SELECT * FROM Firma ORDER BY name;

Остаётся сделать выборку, в которую я добавлю ещё одно поле, уберу последний символ-разделитель и сделаю UPDATE полученного значения в другую таблицу:

UPDATE tblLists SET strValue=(  
SELECT TRIM(';' FROM (SELECT CONCAT(id||'=>'||name||';') FROM FirmaSorted))
) WHERE strName='companies';

Планирование проекта в MS Project

· 4 мин. чтения

Управление проектом - задача трудная, совмещающая сразу несколько областей - финансовые возможности и потребности нескольких лиц, психологические и знания каждого работника и наконец бизнес-план и технические требования самого проекта. Всю информацию можно писать на коленках, составлять отдельно списки или всё по памяти делать, но в данной статье я знакомлюсь с Microsoft Project - отдельного продукта, не входящего в MS Office.

Сразу оговорюсь, что план, составленный в MS Project очень абстрактный и нужен больше для управляющего проектом и его общения с клиентом/заказчиком чем для программистов. В качестве конкретных задач и ошибок, как правило используется открытые и достаточно простые альтернативы -TracBugzilla

Возраст и день рождения через SELECT

· 1 мин. чтения

Иногда хочется быстро вычислить сколько дней до дня рождения пользователя. Вы все видели это в Одноклассниках и ЖЖ. Это можно делать в запросе например таким образом для mysql 5

SELECT
TIMESTAMPDIFF(YEAR,users.birth_date,NOW()) years_old,
TIMESTAMPDIFF(DAY, NOW(), DATE_ADD(users.birth_date, INTERVAL 1+TIMESTAMPDIFF(YEAR,users.birth_date,NOW()) YEAR)) next_birth_days
FROM users

Нашёл в своём стареньком коде, может кому полезно будет..

Коллега Юра скинул версию для старенькой mysql 4, может это даже лучше:

SELECT
IF(
DATE_ADD(birth_date, INTERVAL (DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y')) YEAR) > NOW(),
(DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y')) -1,
(DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y'))
) as years_old,
DATEDIFF(
DATE_ADD (birth_date, INTERVAL IF(
DATE_ADD(birth_date, INTERVAL (DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y')) YEAR) > NOW(),
(DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y')) ,
(DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y')) + 1
) YEAR ),NOW()) as next_birth_days
FROM users

Стратегический анализ инфосистемы

· 2 мин. чтения

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

Предмет Infos?steemide Strateegiline Anal??s (IDU0021) в ТТУ преподаётся лектором Mart Roost'ом и практующим Ants Torim'мом. В практической части предполагается что студенты смогут описать инфосистему организации согласно предлагаемым в лекциях условиям.

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


В данном предмете предлагается такой костяк для проекта:

  • Деловые процессы (как ИС смотрит глава компании)
    • Области ответсвенности лиц, роли (программисты, аналитики, бухгалтера) (p?devusalad)

      • цели
      • ответсвенности
      • необходимости
      • процессы
      • термины (бизнес-объекты, например "договор")
    • Функциональные подсистемы, департаменты (маркетинг, research&development, финансы) (alls?steemid). Описываются точно так-же все цели, процессы и тп.

    • Регистры, аналоги таблиц баз данных, только без посредтсвенных таблиц связей и ID'шников. Работают по элементарным CRUD -функциям.

      • Практическая реализация. SQL-схема.
      • Связи с подсистемами
      • Концептуальная классовая диаграмма
  • Архитектура технологий (как на ИС смотрит инженер)
  • Развитие организации (как финансисты общаются с технарями)
    • Стратегия и временной план

    • Проекты и оценка рисков

    • Оценки ресурсов

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

На экзамене мы получили двойку, потому что было мало регистров (минимум надо 5), на концептуальной диаграмме стрелки вместо ассоциации были обобщения. На диаграмме процессов было мало действующих ролей и отсутсвовали бизнес-объекты, заносимые в регистры.

Читайте также:

Системные таблицы в базах данных

· 1 мин. чтения

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

Ключём являются тн. системные таблицы, которые описывают остальные и самих себя. Из-за отсутсвия таких процедур, разные движки реализовали по разному доступ к таким таблицам.

Mysql - отдельный тип запроса. SHOW так-же может показывать состояние БД, нагруженность процессами и тп.

SHOW TABLE status SHOW COLUMNS FROM my_custom_table

Postgre - Иерархия разделена по принципу database.schema.table, поэтому часто администраторы не любят создавать новые базы данных - для них каждый раз дублируются системные схемы pg_catalog и information_schema.

select table_name, table_schema from information_schema.tables //все таблицы select column_name from information_schema.columns WHERE table_name='columns' // замкнутый круг

Oracle - обычные таблицы, которые правда мало кто может просто так взять и поменять

select * from ALL_TABLES ``select * from USER_TABLES