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

ЧПУ с mod_rewrite

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

Человеко-понятный URL нужен. Так наглядней видеть где вы находитесь. Реализовать ЧПУ можно несколькими способами.

(Apache) mod_rewrite

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

Преобразование разных параметров в папки по-моему самое нужное. Включаем mod_rewrite, создаём или дописываем .htaccess что-бы работало всё так:

http://kurapov.name?**mod**=gallery&**action**=list&page=5
http://kurapov.name/gallery/list/?page=5

Options +FollowSymLinks  
RewriteCond %{REQUEST_FILENAME} !-f
RewriteEngine On
RewriteRule ^([A-Za-z0-9^/]+)/([A-Za-z0-9_^/]+)/$ /index.php?mod=$1&action=$2 [QSA,L]
RewriteRule ^([A-Za-z0-9^/]+)/([A-Za-z0-9_^/]+)/?$ /index.php?mod=$1&action=$2 [QSA,L]

Самое главное это конечно же RewriteRule, которое построено на регулярных выражениях , поэтому многие веб-разработчики и не прошли через этот участок. В данном примере в URL ищется в начале (знак ^) две папки, названия которых состоят из букв и цифр. Первая папка становится значением $1, вторая соответсвенно $2. В итоге запрос передаётся в обработку в index.php с GET параметрами. Параметр QSA=query string append добавляет в конец ещё параметры которые запрашивал пользователь.

Установка ЧПУ на существующую систему

Какой получается минус? Если есть файл resources/thumbs/generator.php , то получится что обращение тоже будет перезаписываться, и в действительности будет всё идти на index.php. Более того, если система была спроектирована по относительным путям, где все картинки, фреймы, ссылки не велись от корня, то возникнет проблема с новой адрессацией.

404 перезапись

Как очень быстрое и простое решение можно вместо mod_rewrite использовать перенаправление 404 ошибки

ErrorDocument 404 /index.php

Теперь достаточно в index.php обратится к массиву и вызвать нужный модуль:

header("HTTP/1.1 200 OK");  
header("Status: 200 OK");

$arrURL=explode('/',$_SERVER['REQUEST_URI']);

Не забудьте проверять существует ли такой модуль в системе, и сделать обработку ошибок, в том числе и на уровне header-ов, иначе поисковики могут посчитать что у вас всюду брак.

Введение в Foreign keys

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

Foreign keys это движущая сила реляционных БД. Выборка по нескольким таблицам по прежнему формируется при помощи JOIN-конструкций, но FK создаёт логические связи между таблицами, понятные человеку. Очень полезно в больших проектах, где уследить за всеми связями нелегко, а такие программки как MySQL Workbench хорошо могут эти связи показать.

Создание связей начинается с создания тех таблиц, на которые надо ссылаться. Дальше в ссылающихся таблицах делается поле типа refID. Теперь создаётся уникальный FK который и связывает поля. Ключ может иметь дополнительные свойства, например каскадное удаление или update.

Для удобства создания таких структур можно воспользоваться SQLyog-ом. Типы таблиц естественно только InnoDB. К примеру таблица events ссылающаяся через FK на events_groups выглядит так..

CREATE TABLE `events` (  
`ID` int(11) NOT NULL auto_increment,
`groupID` int(11) default NULL,
UNIQUE KEY `ID` (`ID`),
KEY `FK_events` (`groupID`),
CONSTRAINT `FK_events` FOREIGN KEY (`groupID`) REFERENCES `events_groups` (`ID`) ON DELETE CASCADE,
) ENGINE=InnoDB DEFAULT CHARSET=latin1

OpenUP

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

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

OpenUP - бесплатная методика ( тогда как некоторые более 700$ стоят) и ориентирована на развитие небольших проектов в небольших фирмах (до 36 человеко-месяцев). Вполне подходит для IT, поскольку текучка кадров большая, а проекты стоять не хотят.

Ради достижения успешности проекта, группа разделяется на 3-6 ролей (вспоминаем сразу классы в RPG?):

  • клиент
  • управляющий проектом
  • аналитик
  • архитектор
  • тестер
  • разработчик

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

Pangalink

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

Банковская ссылка (pangalink) — способ обмена данных купли-продажи между клиентом, банком и магазином, очень распространённая в Эстонии. Эта услуга предоставляется банками в виде услуги магазинам, которым надо платить

WSDL

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

Никогда не задумывались как работает гениальный copy/paste? Правильно, благодаря всяким OLE и COM, которые продвигал Microsoft. В чём же гениальность этой функции? Interoperability, о как!

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

Этот стандарт выглядит как обычный XML файл, разрабатывается W3C и всевозможными корпорациями. Файл состоит из 4 основных тэгов:

  • types в котором под-тэги elements описывают "переменные"

  • interface в котором operations описывают возможные "функции"

  • binding в котором детально объясняется каждая operation

  • service в целом описывает местонахождение конкретного сервиса и используемые им операции

Более старые версии WSDL 1.1 имели иную структуру с portType тэгами.

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

См. также SOAP, типы wsdl операций

Mysql prepared statements

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

воскресенье, 22 апреля 2007 г. в 14:10:12

Подготовленные запросы имеются в MySQL начиная с 4.1 и нужны по трём причинам.

  1. Скорость. Если вы выполняете однообразные запросы, то mysql парсеру каждый раз приходится выполнять распознавание - какой тип запроса, какие данные передаются и тому подобное. Если сделать прототип запроса, а в последствии передавать только данные, то ясное дело что это скажется на скорости.
  2. Передача данных. Мало того что для подобных запросов передача бинарных данных не нуждается в конвертировании в строку, так и то что стандартное ограничение на один запрос имеет около 1 мб можно подвинуть благодаря тому что каждый кусок данных передаётся отдельным запросом, а не одним общим (INSERT скажем).
  3. Безопасность. Благодаря отделению данных от запроса вы можете обезопасить себя от SQL injection .
PREPARE some_statement_1 FROM "INSERT INTO my_table (`some_HTML`, `some_title`) VALUES ('?','?')";  
SET @someparam_1 = "HTML SOURCE";
SET @someparam_2 = "TITLE HERE";
EXECUTE some_stament_1 USING @someparam_1,@someparam_2;
DEALLOCATE PREPARE some_statement_1;

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

Использование подобной техники через PHP на низком уровне занимается PDO extension и mysqli правда порой не совсем удобным способом, ну а если хочется по-старинке эти запросы генерировать самому, то можно попробовать огромную PEAR:DB или DbSimple

Случайная сортировка

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

Mysql позволяет сортировать случайным образом

SELECT * FROM my_table ORDER BY RAND()

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

Можно попробовать делать выборку основываясь на числе элементов в целом и функции RAND():

SELECT name FROM my_table JOIN (  
SELECT CEIL(RAND() * (
SELECT MAX(id) FROM my_table
)) AS randomID
) AS random_table ON random_table.randomID=my_table.ID

На 50000 рядов такой запрос занимает 0.00086 сек.. Сравните с 1.56356 сек обычного варианта ORDER BY RAND().

Недавно натолкнулся на один интересный вариант:

select G.*, rand() as RO from GOODS G order by RO

Вероятно вас заинтересует случайная сортировка в Postgre, где рассматриваются и другие способы.

Сортировка матрицы

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

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

Средствами PHP насколько мне известно пока невозможно нормально отсортировать - функции uksort и ksort сортируют по ключам массива, но просто вписать данные столбца в качестве ключа нельзя если могут появится одинаковые ключи.

Небольшая функция на будущее.

  /**
* Sorts matrix by column
*
* @param array $arrMatrix
* @param mixed $col
* @param boolean $direction
* @return array
*/
function sort_matrix($arrMatrix,$col=0,$direction=1){
$result=array();
foreach($arrMatrix as $var => $val){
$set=false;
foreach($result as $var2 => $val2){
if($set==false){
if($val[$col]>$val2[$col] && $direction || $val[$col]<$val2[$col] && !$direction){
$temp=array();
foreach($result as $var3 => $val3){
if($var3==$var2) $set=true;
if($set){
$temp[$var3]=$val3;
unset($result[$var3]);
}
}
$result[$var]=$val;
foreach($temp as $var3 => $val3)
$result[$var3]=$val3;
}
}
}
if(!$set) $result[$var]=$val;
}
return $result;
}

Сохраняющаяся сортировка

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

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

Представляю небольшой вариант такого решения..

$_SESSION['Sorting'][get_class($this)]= array_merge( $_SESSION['Sorting'][get_class($this)], $_REQUEST);

В сессии кэшируются все параметры некогда используемые, причём новые параметры перезаписывают более старые. С такой техникой можно делать много параметровую сортировку ( ORDER BY param1, param2, param3..) причём передавать через GET только по одному параметру, т.е. не надо делать

?sort[]=param1&sort[]=param2

Введение в Postgre

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

PostgreSQL - крутая СУБД, потому что..

  1. Она не принадлежит какой-либо компании, как например Oracle или mysql и распространяется по BSD-лицензии

  2. Имеет поддержку продвинутых фишек - PL/pgSQL, триггеров. Теоретически это очень полезно при создании очень масштабной системы.

  3. Транзакции по принципам ACID придают скорости - несколько запросов в одной транзакции выполняются как одна атомарная операция. А мультиверсионность помогает избежать блокировки таблиц.

  4. Объектность. Таблица выступает фактически в виде класса, а ряды - в виде объектов, так же как классы могут наследоваться, так и таблицы могут наследоваться.

  5. Система привилегий операций с таблицами, схожа с системой по принципу с Oracle.

  6. Репликации, т.е. использование нескольких серверов даёт масштабируемость.

Переход на PostgreSQL как правило связан с обработкой больших объемов данных - когда число рядов переваливает миллион, то mysql начинает испытывать трудности, а Natural Join нескольких таких таблиц может привести вообще к падению сервера. Да и тесты на параллельность поддерживают Postgre. Энтузиастам может быть интересна же не столь масштабируемость, сколько объектность, позволяющая большую свободу, или если хотите - сложность, по сравнению с mysql.

При переходе из mysql, следует отметить различия, которые естественно следует предусмотреть:

  • Различные типы данных. Нет datetime, зато есть возможность создать тучу своих типов.
  • Отсутсвие autoincrement. Такая функция заменена наличием sequence, и в упрощённом виде может использоваться так:
    CREATE TABLE mynewtable ( id SERIAL }
  • pgAdmin III очень удобная консольная программа, а в качестве замены phpMyAdmin есть phpPgAdmin
  • Аналогом DATE_FORMAT является to_char
  • Заглавные буквы в названиях таблиц и полей по умолчанию переводятся в нижний регистр, это можно обойти используя двойные кавычки
  • Форматом для LIMIT конструкции стал также поддерживаемый с mysql 4LIMIT # OFFSET #
  • Просмотр запущенных процессов реализуется аналогом
    --show processlisе``SELECT * from pg_stat_activity ;

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

Excel через javascript

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

Microsoft Excel - незаменимый spreadsheet-редактор, попробуем сделать нечто похожее уже в web-середе.

Выбираем Simple spreadsheet, который уже умеет достаточно много, немного его исправим и создадим возможность сохранять все данные в БД. GPL лицензия также радует.

Прежде всего - изменить размеры редактируемого окна, которое запускается из spreadsheet.php. Для этого изменяем styles.css и при необходимости - spreadsheet.js, где делаются собственно таблицы.

Дальше - сделаем сохранение данных. Для этого надо весь код поместить в форму, добавить submit, к которому приписать onclick='save();'

Simple spreadsheet хранит все данные в своём "javascript" формате который фактически просто переменные инициализации, поэтому сохранять данные мы будем не только их, но и данные в csv формате. Для этого есть функция saveCSV, которую достаточно немного изменить и добавить спрятанный textarea c id='csv'.

getObj("csv").value = out;

Данные сохраняются в таблицу БД. Что-бы их обратно показать в таблице для изменений, достаточно в spreadsheet.php сохранённые данные передать в $init_data

Для чтения CSV надо выдавать заголовок типа

header("Pragma: public"); header('Content-Type: text/csv'); //header('Content-Type: application/vnd.ms-excel'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header("Content-Description: downloaded from iunu.net as an example"); header('Content-Disposition: attachment; filename="'.MD5(time()).'.csv"');

Код достаточно понятен, например что-бы при нажатии Tab фокус переходил на соседнюю клетку, я добавил в функцию keypress практически в самый конец

if (keyCode==9) { saveCell(); ret=false; editCell(currRow,currCol+1,keyCode); }

Если csv не подходящий вариант, и хочется создания xls, можно воспользоваться портированным с perl, writeexcel 'ем, а для импорта xls есть spreadsheet_excel_reader однако проблемы с utf8 всё ещё не имеются..

Многоязычность Smarty

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

Многоязычность сайта - важный фактор для корпоративных сайтов. Какие существуют подходы?

  1. Разные языки - разные сайты. Такое решение очень простое и используется для международных фирм. Каждый регион владеет своим доменом, хостинг как правило делается на одном защищённом сервере, где все данные доступны для всех доменов, либо же раздельно, что в принципе не играет большой роли, главное то - что платформа под каждый язык своя.
  2. Разные языки - разные темплейты. Решение так же простое - для каждого языка свой темплейт. Контроллер всё же один и сам выбирает какие данные из БД выбирать. Большой минус в том, что при изменении дизайна, надо менять темплейты во всех языках, поэтому может случится что языки с разными дизайнами.
  3. Разные языки - разные данные. Неудобен тем, что для каждой мелкой системной надписи надо лезть и добавлять строчки переводов. Кроме того возникают вопросы при составлении структур типа дерева - зависит ли структура от языка или нет. Например при составлении каталога продуктов, в случае если необходимо добавить новый язык, надо отдельно составлять всю структуру, или достаточно перевести уже созданную?

CVS и SVN

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

CVS и SVN (Subversion) это программы хранения истории изменения проекта в файловой системе разными пользователями в результате одновременной совместной работы. Существует клиентская и серверная часть.

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

SVN это наследник CVS, впрочем если вы испытываете большую симпатию к Microsoft, вы можете использовать Visual SourceSafe. Из себя это представляет сетевую программу, где центральный сервер хранит все вносимые изменения, а клиенты уже производят операции над этими изменениями. Поэтому если вы работаете в фирме, и сервер уже имеется, то вам достаточно установить клиентскую программу.


Для windows можно посоветовать tortoiseSVN. В настройках устанавливается связь с localhost:3690, где висит SSH-тунненель putty (настраивается в Connection/SSH/Tunnels) или SSH tunnel client. Если хочется платного, то есть SmartSVN.

После настроек - создаём папку под проект и работаю полностью из контексного меню эксплорера делаем операцию checkout (копирование working copy в локальную папку). Что-бы сохранить свои изменения в файлах делаем операцию update (копирование изменений из svn в локальную папку) и commit (сохранение своих изменений в svn). В случае если файлы были изменены одновременно, то svn не позволит вам сохранить файл и отметит его как конфликт, который надо решить либо через diff (сравнение svn и локальной версии), либо через solved (перезаписать версию svn своей). В особо запущенных случаях, когда файлы переименовываются или удаляются не используя функции svn, вам прийдётся запускать cleanup.

Из дополнительных функций есть функция вины (blame), благодаря которой можно найти кто какую строчку написал. Удачи в проектах!

Управление IT-проектом

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

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

Попробую изложить, как на моём опыте обычно ведётся IT-проект (CMS, CRM, intranet, custom-инфосистема) или как бы этого хотелось в идеале.

Мотивация

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

Мотив - побуждение к действию, т.е. фактор, выводящий систему в состояние нестабильности.

Психология разбивает мотивацию человека по пунктам

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

Теологический дуализм. Катары и альбигойцы

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

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

Вся проблема встала при формировании христианства. Как может быть мессия Богом, если Бог один. Объявить воплощением Бога на земле? А как быть с бытием Бога, перестал ли Бог существовать для всех при рождении на земле? Как быть с первичностью ипостасей?

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

Плагины браузеров

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

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

Первым делом - увеличьте число одновременных соединений с сервером, поскольку у вас соединение уже не dial-up. В firefox это доступно в about:config / network.http.pipelinining=true и network.http.pipelining.maxrequests=10.

Firefox

  • Sync синхронизирует закладки, историю и пароли между платформами и компами

  • FastDial показывает наиболее используемые страницы, настраивается вручную

  • Chromifox theme очень простой и красивый внешний вид на подобие браузера Google Chrome

  • Mouse gestures так же пришли из Opera и позволяют более удобную навигацию

  • All-in-One sidebar очень схож с левой панелью в Opera, где значительно удобней оперировать данными чем из меню

  • Firebug незаменимый компонент для разработки современных javascript технологий, плюс отличная возможность просмотра реально изменяющегося html и функции inspect element. Только не забывайте отключать когда он не нужен.

  • Web developer очень помогает показывая все используемые css и js на странице


Вторичные, не столь важные плагины:

  • NoScript - защита от XSS атак

  • ietab даёт два браузера в одном

  • GridFox - показывает параллельные линии фиксированной ширины на странице для сеточной визуальной разметки

  • Memori.ru - аналог bobrdobr.ru, del.icio.us.. онлайн закладки

  • pagerank от Google для веб-мастеров (+ для 3.5)

  • PicLens предоставляет трёхмерныйинтерфейс и подгрузку на лету при поиске картинок в гугле

  • aging tabs визуально подчёркивают давно не используемые табы

  • WindowResizer - изменение размера экрана под определённое расширение экрана

  • Mini Map sidebar показывает карты

  • Table2Clipboard позволяет копировтаь таблички сохраняя форматирование

  • Sxipper - сохраняет пользовательские метаданные, упрощая комментирование в блогах и регистрацию на сайтах

  • Hide MenuBar - прячет меню, подобно IE7 + HideCaption подобно Chrome

  • Feedburner - показывает число RSS подписчиков в строке состояния

  • MeasureIt позволяет измерить в пикселях,что сколько занимает места на экране

  • ColorZilla позволяет пипеткой выбрать нужный цвет со страницы - часто экономит время

  • locationbar2 улучшает читаемость URL в адрессной строке

  • XHTML validator

  • Selenium IDE - для тестеров

  • Ad block plus

IE плагины

Chrome

Остальные:

  • Dragonfly - аналог firebug для Opera, в Safari он встроенных

Авторизация

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

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

Зачем это надо? Система как цивилизация - чем дальше она развивается, тем сложнее становятся отношения между пользователями и настаёт момент, когда необходимо

  • Разделение труда. Типичный пример - системы типа intranet, куда имеют доступ только работники компании, соответсвенно никто ничего там испортить не может, однако ввод данных осуществляется разными людьми и им просто нет нужды видеть чужие интерфейсы работы с системой.
  • Разделение аудитории. Пример - финансовые системы, сайты с разделением на admin-public, т.е. системы где большая вероятность вандализма простыми пользователями

В простых Web-инфосистемах авторизация для упрощения может быть забита сразу в коде. Никто кроме Васи Пупкина не может зайти в админпанель - делать проще простого. Но не стоит путать админпанель доступную всем но не знающим как в неё зайти от админпанели защищённой авторизацией .

Введение в инфосистемы и UML

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

суббота, 3 февраля 2007 г. в 16:47:12

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

Чтобы изложить понятные каждому неискушённому человеку пункты о том Что делает модель/система, Как она устроена и Каким образом идёт взаимодействие, используется разработанный для таких дел Унифицированный Язык Моделирования. Буквально это стандартизированные правила о том как рисовать одну часть модели и как к ней пририсовать другую.


UML можно рисовать как от руки, на доске, так и в специальных программах - MS Visio, Rational Rose, Argo UML. Наибольшее применение разумеется UML для нас будет иметься при проектировании программ, но в данном курсе упор делается на проектирование бизнес-структуры какой-либо организации на примере её сайта.

Для успешного получения зачёта вам прийдётся быстренько изучить Rational Rose либо в универе, либо скачать с инета бесплатную 30дневную версию. Для того чтобы разобраться в UML можно таким же образом взять книжку из библиотеки..

Если кратко, то существует много возможных диаграмм, но основные это..

  • Use-Case описывает возможности модели, которые доступны для конечного пользователя, будь то заказ, переписка или получение рассылки. Обозначения - человечек как Actor и возможности в виде овалов.
  • Class diagramm описывает уже подробно внутреннюю структуру модели, переменные, функции. Тут видимо подразумевается разбиение элементов на Объекты.
  • Sequence Diagram описывает динамику системы, т.н. общение объектов. Например вызов функции поиска поискового объекта.
  • Component Diagram показывает физическое представление отдельных частей модели. Для микросхемы это были бы отдельные чипы.

Кроме того существуют STATE diagram, Collaboration diagram и прочие

Rapid application development

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

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

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

Взлом Wi-Fi access point-а с WEP

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

В центре города всюду только и витают wifi поля, и много кому хочется бесплатного интернета. И хотя в доступе есть и открытые AP, можно попробовать вскрыть и зашифрованную сеть, разумеется если на ней нет Mac-адресс фильтра.

Некогда я этой темой интересовался (а мой сокурсник Олег - даже диплом защитил по этой теме), но увы я не смог применить свои знания на практике - все программы хотели Linux. Но вот набрёл на статью от infosecurity ..

Итак, для взлома сети нам, кроме ноутбука с беспроводным адаптером, потребуется утилита aircrack 2.4, которую можно найти в свободном доступе в Интернете.

Rounded corners

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

Закруглённые углы - элемент дизайна, подражения природе. В природе не существует углов - всё разрушается, выветривается, стачивается и в результате - закругляется и как правило - тоже не идеально.

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

Возможные решения

  • решение в-лоб - делаем картинки, выпиливаем в photoshop набор уголков и настраиваем в css свойства нашего блока (div или table), см. screencast
  • CurvyCorners решение наиболее подходящее. Всё далает javascript, достаточно указать id элемента и радиусы закругления. Можно устроить и разные настройки для разных элементов. Поддерживается прозрачность и сглаживание.
  • NiftyCorners чуть посложнее - кроме javascript функций и их инициализаций надо указывать и css стили. Поддерживает прозрачность, но настроить немного сложнее. Генерирует лишние inline-тэги b для создания углов без картинок.
  • Roundozer так же при помощи JS закругляет уголки, правда немного тормознут, зато отечественного производства!
  • ShaderBorder кроме уголков ещё предлагает делать тень
  • Планируется что в CSS3 будет поддержка закруглённых углов, а пока gecko-engine браузеры могут использовать параметр
    -moz-border-radius: 4px; /* Firefox */ -khtml-border-radius: 4px; -webkit-border-radius: 4px; /* Safari, Chrome */ border-radius:4px; /* CSS3*/ behavior: url(border-radius.htc); /*IE*/

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

Favicon

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

Favicon или просто иконка сайта изначально вводилась для показа в панели favorites (internet explorer), откуда и взято название как вы догадались. Увы IE6 до сих пор не понимает что иконка у сайта есть.

В наиболее совместимом варианте иконка - файл ico 16x16 с палитрой в 16 или 256 цветов, выложенная в корень домена с названием favicon.ico

Кроме того - если в заголовок документа вставить анимацию, то иконка станет обладать бОльшим шармом:

<link rel="icon" href="http://www.kurapov.name/favicon_ani.gif" type="image/gif" /> 

Также не помешает добавить в .htaccess MIME тип

AddType image/x-icon

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

Полезно также:

  • blogosphere набор популярных иконок сайтов

Ссылки в файловой системе

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

«ln» в Unix

В действительности речь идёт разумеется об особенностях unix-файловой системы связывать папки и файлы? На практике web-разработки это мелочь, но знать полезно.

Двумя коммандами, вводимых или из консоли sh, либо через putty по ssh, мы создаём оригинальный файл и зеркало. В отличие от копии файла, зеркало, подобно shortcut в windows, занимает мизерный размер на диске, но позволяет полноценно работать с ним как с оригиналом.

touch original_file #создаём файл ln original_file copy_file #делаем ссылку

i-Node это такой тип ссылок, которые сильно связаны с файлом и удалить файл нельзя, покуда хотябы одна ссылка "осталась в живых". Вызывается -i параметром. В обычном случае удаление ссылки не удаляет файла.

Кроме обычных shortcut'ов существует и символическая ссылка:

Creates a symbolic link. MKLINK [[/D] | [/H] | [/J]] Link Target         /D      Creates a directory symbolic link.  Default is a file symbolic link.         /H      Creates a hard link instead of a symbolic link.         /J      Creates a Directory Junction.         Link    specifies the new symbolic link name.         Target  specifies the path (relative or absolute) that the new link refers to.

Алгоритмы и структуры данных

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

Algoritmid ja andmestruktuurid для IASB ведет Виктор Леппиксон.

Его минусы:

  • Практические уроки отсутсвуют. Всё в руках студента - сам пусть учит.
  • Безразличие до проблем студентов, в частности если на экзамен все места зарегистрированы.

Немного внешнего материала..


Экзамен. Теория

  1. Что такое сериализация, где необходимо её использовать.
  2. Сложность некоего алгоритма была оценена как функция T(n), что она собой значит?
  3. (тут график нужен) Есть многоуровневая структура быстрого поиска (Мои пояснения.. Например нижняя цепочка проходит через все элементы 5-6-7-10-13-15, а верхняя только 5-7-13). Как быть если необходимо добавить новый элемент в эту структуру?
  4. Как освобождается память, отведённая под двоичное дерево.
  5. Постройте "2-3-4" дерево из элементов, которые поступили в порядке.. 200 100 120 80 10 30 210 220 230 140 130 150
  6. Oletame, et kettal paikneva andmestruktuuri realiseerimiseks B-puu, kuidas te valiksite puude jargu?
  7. Нарисуйте 3-х дерево из слов: liiga liider liiklus liialdus liikluvus liim liimipulk
  8. Lineaarne proovimise meetod (paiskpaigutus)
  9. Nullmeetodil sortimise algoritm
  10. В оперативной памяти находится две фотографии, на которой под один пиксель отведён 1 байт. Оба файла одинакового размера. На одной горы (?), на другой - карнавал в Рио-де-Жанейро. Оба файла сжимаются кодированием Хаффмана. Какая займёт меньше памяти, почему.

Экзамен. Практика

Есть такие структуры..

struct Student {char *pName,*pCode; char **pSubjects;}; struct Subject {char *pName,*pCode, *pTeacher; double nPoints; struct Subject *pNext;}

Из них составляется два массива всех студентов и всех предметов.. Известны
*pSubjectList, *pStudentList.
Необходимо написать функцию с прототипом

int NewSubject (struct Student **pStudentList, struct Subject *pSubjectList, char *pStudentCode, char *pSubjectCode)

Причём работает она таким образом..
Для получения ссылки на нужного студента - есть функция, возвращающая значение индекса в массиве студентов с прототипом
int HashFun (char*)

Таким образом NewSubject() должна проверить сначала есть ли такой студент, потом - есть ли такой предмет, потом надо хитро посмотреть сколько у данного студента есть занятых мест в Student.pSubjects, куда помещается максимум 5 мест. Так вот надо найти свободное место, выделить под него память и скопировать в него код предмета (pSubjectCode). В случае если какой-то шаг не удался - функция возвращает ноль.

Контекстное меню на javascript

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

Контекстное меню всплывает при нажатии правой кнопкой мыши по некоторому объекту, отсюда и его название. К сожалению многие (windows) разработчики пытаются впихнуть в него все возможные действия над объектом, из-за чего скорость работы и удобство может значительно упасть.

Для web-разработки нет определённых стандартов в создании такого меню для своего сайта, но есть несколько таких javascript'ов:

Вызвать событие

Firefox, IE и Safari поддерживают простой атрибут у html-элементов:

<body oncontextmenu='alert(10);'>

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

Не забудьте сделать ещё event-ы убирающие меню при обычном щелчке по пустому месту, при минимизации страницы или потери фокуса.

function ContextMenu(e,ID){ 
e = e ? e : window.event;
var mouse_position = { 'x' : e.clientX, 'y' : e.clientY };
if( typeof( window.pageYOffset ) == 'number' ) {
scroll_position={'x':window.pageXOffset, 'y': window.pageYOffset};
} else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
scroll_position={'x':document.documentElement.scrollLeft, 'y': document.documentElement.scrollTop};
} else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
scroll_position={'x':document.body.scrollLeft, 'y': document.body.scrollTop};
}

$('context_menu').innerHTML=$('context_menu_prototype').innerHTML.replace(/\[ID\]/g,ID);
Menu.Select(ID);
$('context_menu').style.left = mouse_position.x + scroll_position.x + 'px';
$('context_menu').style.top = mouse_position.y + scroll_position.y + 'px';
$('context_menu').show();
return false;
}

Интересные статьи по этой теме:

DB дизайн

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

Дизайн базы данных дело приятное и также важное при создании новой системы.
Под дизайном я подразумеваю

  1. Разбиение  проекта на независимые логические существа данных, т.е. таблицы. Обычно ни клиент ни управляющий проектом не описывают их.
  2. Создание структуры таблицы с корректными типами данных.
  3. Создание связей между таблицами через Foreign Key , если возможно
  4. Создание функций, триггеров, последовательностей и прочих надстроек если это возможно.

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

Sphinx

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

Sphinx - полнотекстовый поисковик по Mysql и Postgre, отличающийся скоростью от своих конкурентов, представленный на РИТ-2007 Петром Зайцевым . Использовать его имеет смысл только на больших проектах, где объем данных вынуждает уже использовать выделенный сервер.Sphinx - полнотекстовый поисковик по Mysql и Postgre, отличающийся скоростью от своих конкурентов, представленный на [РИТ-2007](ht

Обычный поиск как известно очень простой и очень медленный (условно 1.2 МБ/сек)

SELECT * FROM my_table WHERE my_col LIKE '%word%'

Второй вариант - boolean search не настолько гибкий, но побыстрей (41 МБ/сек). Конкурентов MnoGoSearch (140 МБ/сек) и Lucene, Sphinx обходит с 2200 МБ/сек.

Понятно что каждое решение имеет свою сложность, порой не линейную в зависимости от размера БД и очевидно что Sphinx аппаратно не в состоянии пробежать 2 ГБ данных в секунду, дело в том что сначала БД индексируется, а потом searchd.exe демон висит в памяти, кушая от 100 мб оперативки, и предоставляет результаты выборки по API, в PHP или ruby .

  1. Создание таблицы в базе данных по которой будет проводится поиск. В качестве тестовой предлагается test.documents вместе с данными и dump-файлом
  2. Создание конфиг файла. Если конфиг файл вы меняете впервые то замените @CONFDIR@ на реальную папку.
  3. Запуск индексатора.
    indexer.exe --all
  4. Запуск сервиса searchd.exe с портом 3312, который будет выдавать результаты поиска по индексу.
  5. Собственно запрос через API. В качестве примера есть test.php.

Object mapping и Active record

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

ORM (практически в коде известный как Active record ) - достаточно простой, но очень эффективный метод соединения принципов объектно-ориентированного программирования с базой данных.

XML import через PHP

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

XML создан для многих целей, одна из которых - удобство в переносимости данных из одной программы в другую. Особенно удобно создавать parser на этой основе. После простейшего парсинга, структура xml становится некоторым множеством переменных (массивом или объектом), а данные xml - значением этих переменных.

Увы для полноценного универсального xml парсера нужен большой и сложный объект, где обязательна присутсвовать рекурсия что-бы стало доступно всё богатсво этого стандарта.

Но для простейших файлов можно воспользоваться такой функцией.. 

/**  
 * Simple xml parsing function
 * doesnt understand selfending tags like
 *
 * @param string $text
 * @return array
 */
function xml2array($text) {
$reg_exp = '/<(.*?)>(.*?)/';
preg_match_all($reg_exp, $text, $match);

foreach ($match[1] as $key=>$val) {
if ( preg_match($reg_exp, $match[2][$key]) ) {
$array[$val][] = $this->xml2array($match[2][$key]);
} else {
$array[$val] = $match[2][$key];
}
}
return $array;
}

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

ini_set('memory_limit','30M');