ИНТРО Здравствуй! На улице конец декабря, а перед твоими глазами октябрьский номер старого доброго VROnline. Нет, наш дизайнер не ошибся месяцем, когда ваял обложку. Все дело в том, что за верстку этого номера я взялся еще в октябре, но закончить смог лишь сейчас. Просить переделывать обложку я не стал, т.к. не хочу нарушать порядок номеров. Нет, это не значит, что теперь журнал будет всегда выходить за прошедшую дату. Я думаю, что в январе-феврале мы нагоним этот разрыв, и все войдет в свою колею (журнал не будет выходить вообще J. Шутка J). Например, до конца декабря у меня в планах сдать ноябрьский номер. К счастью материал для него почти готов. Начиная с января месяца я смогу больше выделять времени (уж в плане статей точно) для VR-Online. Предыдущие 10 месяцев я усиленно трудился с коллегой над одним большущим проектом для страховой компании и похоже, в декабре мы придем к финишу, а значит в выходные у меня будет больше свободного времени, которое можно потратить на VR. Не очень удается мне эта интра. Уже пишу третий абзац, а начать разговор все не получается. Ну и ладно, тогда просто пожелаю тебе удачи и приятного чтения!
Идея: Фленов Михаил Редактор номера: Антонов Игорь (antonov.igor@live.ru) Графика в журнале: Васючков Андрей aka Soffrick (soffrick@mail.ru) Текущий состав VR-Team: Horrific, Neon_Kaligula, Romul, LittleBudda, Soffrick, Egoiste, FrIToOll, Lord_of_fear, f.e.nix, KeyWarez, tripsin, Vatanaba Вопросы и предложения по журналу: antonov.igor@live.ru
Найди меня: Алгоритмы поиска ИНТРО Привет! Сегодня мы с тобой рассмотрим такое важное для программирования баз данных, да и вообще программирования, понятие, как поиск. Не станем же поиском едины, потревожив пару-тройку интересных (на мой взгляд) алгоритмов? Поиск очень часто обходят стороной, больше уделяя внимание сортировкам. Это и не удивительно. Ведь сколько существует разновидностей алгоритмов сортировки? Просто диву даешься: пузырьковая, вставкой, пирамидальная, быстрая, подсчетом, блочная, линейная (последняя – мечта программиста). А поиска? Да, очень мало. Самые распространенные: перебор, двоичный и интерполяционный. Прочитал и забыл. Забывать, правда, нужно не всегда. Вот и получаются, что люди учат глобальный сортировочный массив, а ищут простым перебором. Но! Более правильным будет совместить эти две темы, оптимизируя искания в сортированном массиве. Имхо, это правильнее. Искать нужно все и везде, если это «везде» больше, чем хотелось бы. А мы будем искать в массиве, но все алгоритмы ты сможешь адаптировать и под свои личные нужды. И так, приступим. Полный перебор (перебор, exhaustive, linear search) Откроем нашу небогатую статью самым простым типом поиска, но с далеко не однозначным названием, линейным. Сразу бросается в глаза его неопределенность наименования: то он полный перебор, то линейный. На самом деле, ничего мудреного тут нет и никакую терминологию здесь учить не придется. Ты его и сам, возможно, уже много раз реализовывал его в своих программах. Но, знания складываются из мелочей, перебор из недоборов, а стена из кирпичей. Поэтому начнем грызть гранит науки снизу. Стоит отметить, что все рассмотренные здесь алгоритмы действительны только для предварительно сортированных массивов, если иное не будет отмечено отдельно. Для несортированных сложно что – то придумать, так как элементы расположены не по порядку, а =>, для них нет никаких закономерностей, =>, тут уж юзают только простой перебор. Я надеюсь, что ты отсортировал свой массив. Идея линейного поиска очень проста – перебираешь все элементы с min по max, где min и max – начальный и конечный индексы массива, и находишь или нет искомое. Теория и практика неразрывно связаны между собой. А теория без практики – три с минусом. Запрограммим, наконец, этот надоедливый перебор: function TMainForm.LinearSearch(A: PArray; Min, Max, Target: Integer; out Searchers: Cardinal): Integer; var I: Integer; begin Result := -1; Searchers := 0; for I := Min to Max do begin
Searchers := Searchers + 1; if A^[I] = Target then begin Result := I; Exit; end; end; end;
Останавливаться на рассмотренном алгоритме не будем. Его более «совершенная» (:D) версия для сортированного массива представлена ниже: function TMainForm.LinearSearch(A: PArray; Min, Max, Target: Integer; out Searchers: Cardinal): Integer; var I: Integer; begin Result := -1; Searchers := 0; //проверка вхождения значения элемента в массив if (Target > A^[Max]) or (Target < A^[Min]) then Exit; for I := Min to Max do begin Searchers := Searchers + 1; if A^[I] = Target then begin Result := I; Exit; end; end; end;
Эта измененная версия отличается тем, что перебирается уже не весь массив. Если алгоритму на пути встретится элемент, значение которого заведомо больше или меньше, чем искомого, он завершится. Небольшое отступление. Хочу ввести тебя в курс дела насчет листингов. Они взяты из моей программы, написанной специально для этой статьи. Ее исходник можешь посмотреть или нет после чтения (надеюсь, небесполезнотратовременного). И еще. Опишу параметры функций поиска, чтобы они тебя не смущали. A типа PArray – ничто иное, как указатель на динамический массив. Зачем он нужен, описано в исходнике программы. Min и Max – начальный и конечный индексы массива. Target – искомый элемент. Searchers – количество шагов, за которые найден (не найдет) элемент. По перебору – все! Двоичный поиск (binary search) Если массив предварительно отсортирован, то нет необходимости перебирать все элементы. Если ты такого же мнения, тебе будет полезно узнать и о еще одном типе поиска – двоичном. Его суть проста – мы не перебираем все элементы, а разбиваем массив пополам. Далее, если элемент не оказался посередине, ищем в левой [Min; Middle – 1] или в правой [Middle + 1; Max] частях. Так продолжаем, пока не найдем или пока не поймем, что искомого элемента нет.
Рис. 1. Двоичный поиск Допустим, у нас есть массив из 8-ми элементов: 5, 9, 11, 18, 19, 24, 27 и 30. И нам нужно найти девять. Следующий рисунок (рис. 1) наглядно покажет процесс поиска: Как видим из рисунка, сначала делим весь массив на 2 ([(0 + 7) / 2] = 3). Получаем элемент с индексом 3 (нумерация с нуля). Он равен 18. 18 больше, чем 9, поэтому ищем в левой части. Делим левую часть на 2 ([(0 + 2) / 2] = 1). Под индексом 1 скрывается 9. 9 = 9, => мы нашли искомый элемент, => поиск завершен! Вот такой нехитрый поиск осуществляется следующим алгоритмом в листинге 2.0. function TMainForm.BinarySearch(A: PArray; Min, Max: Integer; Target: Integer; out Searchers: Cardinal): Integer; var Middle: Integer; begin Result := -1;//считаем, что пока найденного элемента нет Searchers := 0; //еще ничего не искали //проверяем элемент на выход из диапазона значений if (Target > A^[Max]) or (Target < A^[Min]) then Exit; while Min <= Max do begin Searchers := Searchers + 1; //делим массив на 2 части Middle := (Min + Max) div 2; //условия нахождения if Target = A^[Middle] then begin Result := Middle; Exit; end else if Target > A^[Middle] then Min := Middle + 1 else Max := Middle - 1; end; end;
Данный алгоритм естественно рекурсивен. Но я использовал не рекурсивную версию. Почему? Ответ будет следующий: так как функции передается большое количество параметров (5), то и рекурсия будет есть много памяти. Да, программа не упадет со «stack overflow», но порядка 20n байт, где n – количество обращений, съест. К тому же, из-за того, что Delphi медленнее выделяет память, чем C подобные языки, рекурсия будет работать медленнее.
Последние версии компиляторов Delphi преобразуют хвостовую рекурсию (как у нас) в простой цикл. Но иногда этого не происходит. Из-за чего я и не часто ее использую, хоть программный код и получается короче. Но на всякий случай приведу и рекурсивную версию. function TMainForm.BinarySearch(A: PArray; Min, Max: Integer; Target: Integer; var Searchers: Cardinal): Integer; var Middle: Integer; begin Result := -1; if (Target > A^[Max]) or (Target < A^[Min]) then Exit; Searchers := Searchers + 1; if Min <= Max then begin Middle := (Min + Max) div 2; if Target = A^[Middle] then begin Result := Middle; Exit; end else if Target > A^[Middle] then Result := BinarySearch(A, Middle + 1, Max, Target, Searchers) else Result := BinarySearch(A, Min, Middle - 1, Target, Searchers); end; end;
Как видишь, рекурсивный алгоритм не намного лучше. Он даже не короче! Да и проверка на вхождение элемента в массив выполняется много раз, а не один, как ей следовало бы. Если ее убрать, то при значениях, не входящих во множество элементов массива, функция выполнится несколько раз, а так только один. Интерполяционный поиск (interpolar search) Плавно переходим к очередному и завершающему статью алгоритму поиска – интерполяционному. Вообще же, свое чудное название он получил от понятия интерполяции - предсказания. Более строго, интерполяция – в вычислительной математике способ нахождения промежуточных значений величины по имеющемуся дискретному набору известных значений. Мы не будем заделываться предсказателями, не будем гадать на кофейной гуще, т. к. компьютеры с кофе плохо совместимы (сам на старом компе проверял :( ), а будем пользоваться математическими методами. Но перед тем как приступить к кодированию алгоритма, его надо формализовать. Что ж, время нас гонит в пучину конца… Или пригонит к единству начала?.. Неразрешимо сее до конца. А мы же приступим к формализации. :) Удобным и понятным повседневным примером сего действа может служить (да и служит) открытие нужной страницы в книге. Например, в ней 300 страниц. Нам надо открыть 35. Мы же не будем делить 300 на 2, потом еще и т.д. Мы посмотрим на объем, предположим, что нужная страница находится вначале, откроем, перелистнем еще пару… и… о чудо, найдем!
По такому же принципу и работает интерполяционный поиск. Только он руководствуется описанием предположения (по Вуду) по следующей формуле: (max − min)( t arg et − a[min]) ] (1), p = min + [ a[max] − a[min] где max min – крайние индексы массива, target – искомое значение, a[max] и a[min] – крайние значения массива. Если внимательнее присмотреться к обоим алгоритмам (я говорю о двоичном и интерполяционном поисках), то замечается сильное сходство: у первого мы находим середину, а тут ближайший элемент. Можно предположить, что достаточно лишь сменить одну стоку, и двоичный станет интерполяционным. Так и стоило бы сделать, если бы не одно но: формула 1 иногда генерит несуществующий индекс при определенных условиях, что чревато, как ты и сам понимаешь, выходом за границы массива. Позже я познакомлю тебя с этими ситуациями, а пока узрей, наконец, закодированный алгоритм: function TMainForm.InterpolarSearch(A: PArray; Min, Max, Target: Integer; out Searchers: Cardinal): Integer; var IntrPos: Integer; begin Result := -1; Searchers := 0; //проверяем, входит ли значание элемента в диапазон if (Target < A^[Min]) or (Target > A^[Max]) then Exit; while Min <= Max do begin //вычисляем новую позицию Searchers := Searchers + 1; IntrPos := Min; if A^[Min] <> A^[Max] then//пресекаем / на 0 IntrPos := Min + Round((Max - Min) * (Target - A^[Min]) / (A^[Max] A^[Min])); //проверка на выход индекса из диапазона if (IntrPos < Min) or (IntrPos > Max) then Exit; //если же все условия соблюдены, продолжаем поиск if Target = A^[IntrPos] then begin Result := IntrPos; Exit; end else if Target > A^[IntrPos] then Min := IntrPos + 1 else Max := IntrPos - 1; end; end;
Теперь настала пора более подробно поговорить на тему формулы 1 и ее применения. Эта формула выводится следующим образом: 1. Сначала мы делим (t arg et − a[min]) на (a[max] − a[min]) для того, чтобы определить, чему будет равно расположение искомого элемента относительно индексов массива, принадлежащее множеству [0; 1]. Строго говоря, расположение не всегда будет подмножеством множества [0, 1] . В таком случае будет происходить выход индекса из диапазона, а искомый элемент не будет входить в множество уже элементов массива. Это мы докажем позже.
2. Далее умножаем (max− min) на предыдущее выражение. Получаем индекс искомого элемента, лежащий в диапазоне [0; max - min] . Опять же, он может и не лежать в этом диапазоне по описанной выше причине. Но это считается исключением, которое соответственно обрабатывается. 3. Прибавляем к полученному выражению min, не забывая округлить предыдущее выражение в силу того, что индексы – суть целые числа. Получаем индекс из диапазона [min; max] при нормальном случае. Обработка исключений, возникающих из-за выхода индекса из диапазона массива, и есть то самое отличие, которое отличает реализацию двоичного поиска от интерполяционного, не считая идейного отличия (формул). (тройная тавтология :)). Наконец, рассмотрим случай, когда формула 1 генерит несуществующий индекс. Докажем (max − min)( t arg et − a[min]) < min , то и target < a[min] . Вычитая из теперь, что если min + a[max] − a[min] (max − min)( t arg et − a[min]) < 0 . Далее, каждой части неравенства по min, получаем a[max] − a[min] умножаем обе части на (a[max] − a[min]) . Получаем (max − min)( t arg et − a[min]) < 0 . Если бы (a[max] − a[min]) было = 0, то мы бы не смогли совершить данную операцию из-за деления на 0. Но, так как неравенство < 0, то и (a[max] − a[min]) также меньше или больше нуля (главное, что не 0), иначе неравенство бы не выполнялось. 1 Опять умножаем наше неравенство, но уже на , (max− min) <> 0. После max − min очередного шага оно приобретет следующий вид: t arg et − a[min] < 0 , а логическим Мы пришли к тому, что концом будет t arg et < a[min] . (max − min)( t arg et − a[min]) min + будет меньше min в том и только в том случае, когда a[max] − a[min] target < a[min] . Аналогичным будет и доказательство того факта, что (max − min)( t arg et − a[min]) min + > max , когда t arg et > a[max] . Вычитая из обеих частей a[max] − a[min] (max − min)( t arg et − a[min]) >0. неравенства по max, получим (min − max) + a[max] − a[min] Приведем левую часть к общему знаменателю и преобразуем ее к следующему виду: (min − max)( a[max] − a[min]) + (max − min)( t arg et − a[min] >0. a[max] − a[min] В первом множителе вынесем минус и в левой части общий множитель (max− min) , в (max − min)( t arg et − a[max]) >0. итоге получая a[max] − a[min] Поделим обе части на (a[max] − a[min]) , учитывая неравенство (a[max] − a[min]) нулю. Далее следует цепочка преобразований: (max − min)( t arg et − a[max]) > 0 ,
(max − min)( t arg et − a[max]) 0 > , t arg et − a[max] > 0 . Приходим, наконец, к нашей max − min max − min заветной цели, t arg et > a[max]. Объединяя полученные результаты, мы доказали, что выход индекса из диапазона – следствия заданий такого значений target, что оно будет принадлежать множеству t arg et ∈ (−∞; a[min]) ∪ (a[max]; ∞) , то есть, не будет элементом массива. Результат доказательства – мы выяснили область определения target для нормальных и исключительных ситуаций. А алгоритм мы уже рассмотрели. Перед тем, как перейти к резюме, я еще хочу рассказать тебе об интерполяционном поиске. Формула 1 настолько велика и дорога (в смысле деления), что тебе может показаться невысокая скорость работы алгоритма на практике. Это так, если бы не один нюанс. Сразу вспоминается анекдот про Петьку и Василия Ивановича. Хотя… нет, не буду рассказывать, – формату вро не подходит J. Нюанс все же имеется. Скорость интерполяционного поиска будет тем быстрее, чем сложнее и дольше сравниваются элементы. Эта прямая зависимость следует из того факта, что этот алгоритм просматривает меньше элементов, чем, например, двоичный. Но он также не применим к строкам, т. к. мы не можем рассчитать строку по формуле 1. Есть, конечно, способ, но его рассмотрение выходит за рамки статьи. Резюме Сегодня мы с тобой рассмотрели три алгоритма поиска в сортированном массиве. Напомню, что это были: перебор, двоичный и интерполяционный. Приведу таблицу, служащую кратким конспектом их отличий друг от друга. Название Линейный
Двоичный
Интерполяционный
Плюсы Минусы Очень прост. Работает за Самый медленный из всех допустимое время O(N). перечисленных. Улучшенная версия Перебирает весь список, а работает за фактическое не часть. время O(N/2). Не сложен. Работает Сложнее перебора. Делает быстрее линейного, но больше сравнений, медленнее нежели интерполяционного. В интерполяционный. среднем, выполняется за время O(log(N)). Работает очень быстро, т. Сложен в реализации. к. не делает лишних Проигрывает двоичному сравнений. Особенно это поиску, если чувствительно, если сравниваются элементы сравниваются данные, типа чисел. находящиеся на устройстве с невысокой скоростью доступа (жесткий диск, флешка). Таблица № 1 (Сравнение алгоритмов поиска)
На этом я хочу с тобой попрощаться. Я надеюсь, что из этой статьи ты почерпнешь для себя что-либо новое, возможно даже интересное. Все, пока!
Исходники к статье ищи в папке «Найди меня – алгоритмы поиска» Written by CLS aka Чередниченко Сергей E-Mail: gclsall@gmail.com
Кодим правильный Mail.Agent ИНТРО У всех любимой тети аси уже давно появился русский клон - "Mail.Агент". Не буду спорить - по популярности аська все еще впереди. Но! Mail агент даже не думает сдавать позиции, с каждым днем он приобретает новых российских пользователей. Уже сейчас понятно, что Mail.агента ждет популярность и большое будущее, а раз так, то ты не должен терять времени зря – усаживайся по удобнее и приготовься постичь тонкости программирования мессенджера нового поколения. К тому же, в настоящее время, ниша альтернативных клиентов совсем не занята.
План действий Как ты понимаешь, Mail.Agent – это обычная сетевая программа, которая использует свой протокол поверх TCP/IP. Следовательно, для того чтобы создать своего клиента нам необходимо хорошенько раскурить этот протокол, выбрать способ реализации сетевой части и написать пару десятков строчек кода. По первому критерию все должно быть ясно, а вот по второму стоит пояснить подробней. Регулярно читая нашу рубрику, ты уже знаешь, что на Delphi закодить любое приложение можно как минимум используя две технологии: с помощью готовых классов и WinAPI функций. Первый вариант зачастую проще, но второй намного интересней и вдобавок он позволяет понять принципы работы ОС. Для написания сетевых приложений в Windows есть целый набор сетевых функций – Winsock API. Про них я уже писал много раз и еще раз писать одно и тоже мне просто не хочется. В связи с этим, в сегодняшней статье, мы рассмотрим готовый и самое главное универсальный компонент для работы с протоколом MMP, а исходник примера с реализацией на чистом WinSock API ты сможешь скачать с всем известного www.vr-online.ru.
TMrim – быстрый путь в нирвану Delphi-программисты в большинстве случаев всегда на шаг впереди, чем их сишные коллеги по цеху. Этот случай не исключение. Наш соотечественник Алексей Панов позаботился о всех и закодил отличный компонент для комфортной работы с протоколом MMP. Рассмотрим компонент более детально. Свойства: ActiveAntiSpam (boolean) – активация антиспамовой системы AntiSpamWords (string) - в этом свойстве записываются слова, которые будут идентифицироваться как спам. Внеси сюда: «порно, секс, недорого, только у нас» и сможешь временно забыть о проблеме нежелательной корреспонденции, которой так много летает по протоколу MMP. login (string) - логин в системе mail.ru, т.е. твой ящик в любом из доменов, принадлежащих серверу mail.ru (bk.ru, list.ru, inbox.ru). loginStatus (integer) - статус пользователя. В свойстве устанавливается один из возможных статусов (онлайн, невидимый и т.д.). Некоторые из доступных вариантов:
STATUS_ONLINE – онлайн STATUS_AWAY – отошел (нет на месте) STATUS_FLAG_INVISIBLE – флаг невидимости. Этот флаг нужно использовать как правило с STATUS_ONLINE. login_s__desc (string) – дополнительное описание текущего состояния пользователя. Как правило, сюда пишут "готов поболтать" или что-то в этом роде. password (string) - пароль на указанный в свойстве login аккаунт.
Рис. 2 (Скудная страница с официальным описанием MMP) События OnAddNewContact - событие возникает при добавлении нового контакта. OnAuthAck – возникает при получении ответа об авторизации. OnAuthReq - событие срабатывает при запросе авторизации. Во время реакции на это событие хорошо бы показывать форму с информацией о пользователе, запросившем авторизацию. В качестве информации принято показывать: ник пользователя, email и текст просьбы на авторизацию. OnComposeEvent - событие происходит при начале какого-либо действия удаленного пользователя. Например, при генерации этого события ты можешь узнать, что удаленный пользователь начал печатать тебе сообщение. OnConnectProgress - событие срабатывает при попытке соединения с сервером Mail.Agenta. С помощью этого события ты сможешь информировать пользователя о текущем состоянии подключения. Например, можно установить на форме TProgressBar и отображать на нем процент подключения. Кстати, именно этой простой фишки лишен Mail.Agent, так, что наматывай на ус. OnDisconnect - дисконнект он и в африке дисконнект.
OnGetFile - информирует о приеме файла от контакта. OnList - возникает при получении списка контактов. OnListUpdate - происходит при обновлении контактов. OnLoginInfo - срабатывает во время подключения к серверу. Например, если не получилось подключиться из-за неправильно введенных данных (логин, пароль), то это можно обработать в этом событии. OnMeInfo - событие возникает при получении информации о твоем аккаунте. OnMessage - событие генерируется во время получения очередного сообщения. OnMyServicesMessage - при получении сервисных сообщений будет генерировать это событие. OnNewMail - событие возникает в момент прихода новой корреспонденции в твой почтовый ящик. OnRecvNormalAvatar - событие возникает во время приема аватары контакта. Здесь можешь написать код для обновления аватары у нужного контакта. OnRecvSmallAvatar - по сути тоже самое, что и предыдущее, за исключением типа аватары. В этом случаей - событие возникает при приеме маленькой аватары. OnSecondLogin - событие сигнализирует о неприятном известии - под твоим логином ктото вошел. Во время возникновения этого события нужно поднимать тревогу и убеждать пользователя скорее сменить пароль. OnStatus - событие возникает при изменении какого-нибудь контакта своего статуса. OnUserSearchResult – событие генерируется при получении результатов поиска. Практика От теории неподкрепленной практикой толку мало. Поэтому запусти Delphi и приготовься немножко покодить. Как обычно, сразу после запуска Delphi создаст новый пустой проект. Закрой его и загляни на наш DVD. На нем тебя ждет компонент TMRim. Скопируй его себе на винт и заинсталь к своему Dlephi. Компонент устанавливается стандартным способом через Component -> Install Component. Установив компонент, создай новый проект и накидай на форму следующие компоненты: - 1 компонент TMainMenu. - 1 TImageList - 1 TMrim - 1 TListView - 1 TProgressBar По всей форме я растянул компонент TListView. В нем будет отображаться контакт лист. Чтобы контакты не смотрелись серо, я подобрал в TImageList картинки, соответствующие возможным статусам пользователей (Online, Away, Offline и т.д.). С помощью компонента TMainMenu я создал основное меню из следующих пунктов: подключить, отключить, выбор статуса (онлайн, отошел, невидимый). Готовый вид моей формы ты можешь увидеть на рисунке 3.
Рис. 3 (Простецкий дизайн) На этом о форме можно забыть и приступить к кодингу. Первым делом научимсяустанавливать и разрывать соединение с сервером. Создай обработчик события OnClick для кнопки c именем «Подключить» и напиши в нем следующее: If Form2.ShowModal = mrCancel Then Exit; ConnectBar.Visible := true; MailAgent.Login := Form2.LoginEdit.Text; MailAgent.Password := Form2.PassEdit.Text; MailAgent.LoginStatus := STATUS_ONLINE; MailAgent.login_s__desc := ‘Я в сети!!!'; MailAgent.Connect2(MailAgent.Login, MailAgent.Password);
Перед тем как начать попытку подключения, я модально показываю Form2 (рис. 4). На этой форме расположено два поля ввода, в которых нужно ввести имя пользователя и пароль. Если пароль и имя пользователя введены успешно, то можно начинать делать первую попытку установки соединения. Для этого я заполняю все необходимые свойства компонента TMrim (у меня он носит имя MailAgent). После того как все поля заполнены, можно выполнить метод Connect2.
Рис. 4 (Элегантная форма для запроса логина и пароля)
Процесс подключения запущен и было бы неплохо иметь возможность отследить его текущее состояние на ProgressBar. Для этого создай для компонента TMrim обработчик события OnConnectProgress и напиши в нем: ConnectBar.Position := State; If State = 100 Then begin Sleep(100); ConnectBar.Visible := false; end;
Думаю, пояснять этот код нет смысла, т.к. сложного в нем абсолютно ничего нет. Двигаемся дальше. С подключением мы разобрались, теперь нужно позаботиться о заполнении контакт-листа. Тебе уже известно, что получение списка контактов происходит при возникновении события OnList компонента TMrim, а раз так, то создавай обработчик события OnList и напиши в нем всего лишь две строчки кода: _ContactList := List; GetUserList ();
В первой строчке кода я получаю в переменную _ContactList (объявлена как глобальная переменная типа AContact_List) ссылку на весь список контактов (List). После того как ссылка получена, я обращаюсь к самописной процедуре GetUserList(), код которой ты можешь увидеть в листинге 1. Листинг 1 (Что может быть проще, чем получить список контактов?) procedure TForm1.GetUserList; var i:integer; _User : AUser; begin ListView1.Items.Clear;
http://agent.mail.ru Сайт официального клиента Mail.Agent. С него ты можешь слить последнюю версию этого клиента, а также почитать небольшой док с описанием протокола. Если ты кодишь на Delphi, то делать тебе здесь нечего, а вот любителям Си зайти следует. Специально для них здесь есть заголовочный файл с описанием всех необходимых структур. http://andml.org.ru Сайт бесплатного клиента AndMl. Этот клиент создан автором рассмотренного в статье компонента. На сайте автора ты можешь скачать компонент и исходники (!) его клиента. Я настоятельно рекомендую посетить тебе этот ресурс.
for i:=0 to _ContactList.users_num-1 do begin _User := _ContactList.users_id[i]; with ListView1.Items.Add do begin Caption := _User.user_nick; ImageIndex := GetStatusImage(_User.user_status, _user.user_status_id); end; end; end;
Основная начинка процедуры GetUserList () – пробежка по структуре типа AContact_List, содержащей список контактов и добавление всех найденных контактов в ListView. Обрати внимание, что в примере, из структуры я извлекаю лишь ники пользователей, при программировании реального приложения этим можно не ограничиваться, а пойти намного дальше. Например, получить дату рождения пользователя, знак зодиака, email и
т.д (полное описание структуры смотри во врезке).Добавляя очередного контакта в ListView, я определяю его статус и уже на основании его устанавливаю соответствующую картинку. Чтобы облегчить этот процесс я написал функцию GetStatusImage(). В качестве параметров ей нужно передать статус и идентификатор статуса пользователя. Результатом будет число, соответствующее определенному индексу картинки в TImageList. Исходный код функции GetStatusImage() приведен в листинге 2. Чатимся Получить список контактов в красивом виде это лишь пол дела. Главная функция любого IM – предоставление возможности комфортного общения. Для достижения удобства общения, программисты обычно создают окно чата с закладками. Каждая такая закладка – чат с определенным собеседником. Этот подход очень удобен и позволяет избавиться от проблемы завала всего рабочего стола «окнами». Я решил не отступать от этой идеи и реализовать в нашем примере подобный интерфейс и сейчас я тебе подробно расскажу как это делается. Создай новую форму и брось на нее один компонент TPageControl (вкладки не создавай) и одну кнопку. У компонента TPageControl установи свойство Align в alTop (растянуть по вверху). Теперь растяни этот компонент по всей оставшейся части формы, но не забудь оставить немного места под кнопку. По ее нажатию мы будем отправлять сообщения активному в данный момент собеседнику. Если ты запутался с расположением компонент, то не парься, а просто взгляни на рисунок 7 и по нему подгони свою форму.
Рис. 7 (Будущий многооконный интерфейс) Как закончишь с дизайном возвращайся к модулю главной формы и объяви в ней новую процедуру: CreateNewTab (user_email:string; text:string). По названию несложно определить ее предназначение. Процедура будет принимать всего лишь два параметра: user_email – email пользователя от которого пришло (или которому хотим отправить) сообщение. Этот мыльник у нас будет отображаться в качестве заголовка закладки, тем самым, идентифицируя собеседника. Смотрится это не очень красиво (в реальном приложении лучше отображать ник пользователя), но не забывай, что мы разбираем лишь пример. Весь код этой незатейливой процедуры ты можешь увидеть в листинге 3. Быстренько начинай его переписывать, не забывая при этом иногда возвращаться к тексту статьи за моими разъяснениями.
Изначально мы не можем знать точного количества собеседников, для которых в окне чата необходимо будет создавать закладки, поэтому новые вкладки логичней всего создавать динамически – т.е. по мере необходимости. Скорей всего после прочтения последнего предложения тебе стало смешно, что, мол как в такой ситуации можно еще поступить (я про динамическое создание вкладок). Оказывает все-таки можно. Однажды мне попался исходник довольно симпатичного асечного клиента. Когда я принялся его изучать и добрался до формы обмена сообщениями, то я буквально ужаснулся. Автор программы создал почти сотню (!) вклад ок и по мере необходимости игрался со свойством Visible. Что-то я немного отвлекся. На чем я там остановился? Ах, да! Поскольку все элементы формы сообщений мы будем создавать динамически, то на первом этапе нам нужно определить какие именно нам придется AContact_List = record создавать элементы управления. Обычно в //Количество групп подобных окнах размещают пару компонент group_num: integer; //Массив структур типа AGroup типа TMemo (TRichEdit и всевозможные groups_id: array[0..20] of AGroup; клоны). Один используется для отражения всей //Массив структур типа AUser истории переписки, а второй для ввода текста users_id: array[0..1023] of AUser; отправляемого сообщения. Помимо элементов //Общие количество контактов users_num: integer; ввода нам придется создавать новую закладку в компоненте PageControl. AUser = record
Итак, подведем итог, для создания новой вкладки нам потребуется создать три компонента: два TMemo и один TTabSheet. В связи с этим, в разделе var моей процедуры я объявил три соответствующие переменные: _NewTab типа TTabSheet (новая закладка для PageControl), _NewTextMemo типа TMemo (для ввода текста для отправки) и _NewChatMemo (для отображения всей переписки) аналогичного типа. По моему замыслу, эта процедура должна вызываться каждый раз при получении нового сообщения, а раз так, то перед созданием новой вкладки нужно удостовериться, что для автора полученного сообщения еще не была создана закладка. Для проверки я запускаю цикл (for i:=0 to form3.PageControl1.PageCount-1), которой пробегает по всем существующим вкладкам и сравнивает их заголовок с email отправителя. Если совпадение найдено, то нет смысла создавать еще одну закладку, нужно просто добавить в компонент ChatMemoX полученный текст. Поскольку полного имени компонента (вместе с индексом) мы не знаем, то нам придется его найти с помощью метода FindComponent()
user_flags: integer; user_gnum: integer; //Email пользователя user_mail: string; //Nick пользователя user_nick: string; //Имя пользователя user_name: string; //Фамилия пользователя user_lastname: string; //Дата рождения user_bday: string; //Место жительства user_location: string; //Флаги server_flags: integer; //Статус пользователя user_status: integer; //Телефон user_phone: string; //Идентификатор пользователя user_id: integer; //Идентификатор статуса user_status_id, //статус пользователя user_status_name, //Оисание статуса user_status_desc: string; //Идентификатор клиента пользоваля user_client_id: string; end;
элемента, на котором мы собственно, и ищем компонент. В нашем случае, компонент ChatMemo будет располагаться на компоненте TPageControl, именно поэтому данный метод я вызываю следующим образом: Form3.PageControl.Pages[i].FindComponent(‘ChatMemo’+ IntToStr(i+1)). В качестве одного единственного параметра для метода FindComponent() я передаю имя искомого компонента + его индекс, который будет равен индексу текущей закладки + 1 (т.к. первая вкладка имеет индекс 0). Компонент найден, теперь надо добавить в него полученный текст. Чтобы это сделать, я привожу полученный в результате поиска объект к типу TMemo и уже затем вызываю метод свойства Lines – Add(). Дальше все просто – добавив полученный текст, вызываю метод Show формы сообщений и выхожу из процедуры. Мы рассмотрели вариант с найденной вкладкой, а если она еще не была создана? Конечно же, нужно ее создать! Порядок очереди создания новых элементов будет таким: 1. Новая вкладка (TNewTabSheet) 2. Новый элемент хранения истории переписки (TNewChatMemo) 3. Новый элемент для ввода текста для отправки (TNewTextMemo) Каждый визуальный компонент в Delphi – это обычный объект, который первым делом нужно инициализировать (выделить память). После этого можно заполнять все свойства, прикручивать обработчики событий и т.д. Единственный нюанс при создании визуальных компонент – необходимость «вставки» (указание родителя) этого компонента на любой другой. Если этого не сделать, то, как и можно себе предположить – компонент не отобразится. Чтобы вставить вновь созданный компонент в форму, необходимо лишь вызвать у формы метод InsertControl(). В качестве единственного параметра нужно указать ссылку на проинициализированный элемент управления. Листинг 2 (Получаем индекс статусной картинки) function TForm1.GetStatusImage(status: integer; advStatusId:string): integer; begin Result := 1; Case Status Of STATUS_ONLINE: Result := 0; STATUS_OFFLINE: Result := 1; STATUS_AWAY: Result := 2; STATUS_FLAG_INVISIBLE : Result := 5; STATUS_USER_DEFINED: begin if advStatusId = 'status_chat' then Result := 3; if advStatusId = 'status_dnd' then Result := 4; end; end; end;
Листинг 3 (Продвинутый интерфейс с помощью одной функции) procedure TForm1.CreateNewTab(user_email: string; text:string); var _NewTab : TTabSheet; _NewTextMemo, _NewChatMemo:TMemo; i:integer; begin for i:=0 to form3.PageControl1.PageCount-1 Do if form3.PageControl1.Pages[i].Caption = user_nick then
begin form3.PageControl1.ActivePageIndex := i; if Text <> '' then TMemo(Form3.PageControl1.Pages[i].FindComponent('ChatMemo'+IntToStr(i+1))).Li nes.Add(user_nick+': '+text); form3.Show; Exit; end; _NewTab := TTabSheet.Create(form3.PageControl1); _NewTab.Caption := user_nick; _NewTab.Name := 'Tab'+IntToStr(form3.PageControl1.PageCount); _NewTab.PageControl := form3.PageControl1; _NewChatMemo := TMemo.Create(_NewTab); _NewChatMemo.Name := 'ChatMemo'+IntToStr(Form3.PageControl1.PageCount); _NewChatMemo.Align := alTop; _NewTab.InsertControl(_NewChatMemo); _NewTextMemo := TMemo.Create(_NewTab); _NewTextMemo.Name := 'TextMemo'+IntToStr(form3.PageControl1.PageCount); _NewTextMemo.Align := alTop; _NewTab.InsertControl(_NewTextMemo); _NewChatMemo.Lines.Clear; _NewTextMemo.Lines.Clear; If Text <> '' Then _NewChatMemo.Lines.Add(user_nick+': '+text); Form3.PageControl1.ActivePage := _NewTab; Form3.Show; end;
Тестируем клиента Клиент готов, теперь самое время его хорошенько протестировать. Для теста я специально завел пару аккаунтов на mail.ru: один для только что испеченного нами клиента (user_test_2008@mail.ru), а второй для Mail.Agentа (user_test_2009@mail.ru). Оба клиента успешно соединились с сервером и обменялись несколькими сообщениями. Результат ты можешь увидеть на рисунке 5 - 6.
Рис. 5 (Оба клиента успешно соединились с сервером)
Рис. 6 (Стороны обменялись сообщениями)
Happy End На этом, лекцию рассмотрения внутренностей протокола MMP можно считать оконченной. Тебе остается переварить новые знания и воспользоваться ими в своих хацкерских целях. Этой инфы тебе вполне хватит для написания полноценного Mail.Agent’a или спам-бота. К сожалению, спецификация протокола уже давно не обновлялась, а значит, шагать в ногу с Mail.Agent’ом, увы, не получится. Будем надеяться, что девелоперы MA
расщедрятся в будущем и полностью откроют протокол со всеми вкусностями (передача видеоданных и т.д.). Пока нам остается лишь ждать и пользоваться тем, что есть. На этой, немного грустной, ноте я хочу попрощаться и пожелать тебе побольше позитива и поменьше Access Violition. Пока! P.S. Автор статьи выражает огромную благодарность Алексею Панову за идею статьи и отличный компонент для работы с MMP.
Исходники к статье ищи в папке «Правельный Mail.Агент» Written by Антонов Игорь aka Spider_NET E-mail: antonov.igor@live.ru
"Техника программирования на языке Delphi и основы создания графики для программы"ЭТО ПЕРВЫЙ В РУнете ВИДЕО КУРС, ИСПОЛЬЗУЮЩИЙ ПРИНЦИПИАЛЬНО НОВЫЙ ПОДХОД К ОБУЧЕНИЮ! Курс состоит из более чем 50 видео уроков (с подробными комментариями автора), внутри которых раскрыты секреты создания различных программ. Поэтому уже с первых минут обучения, вы начинаете практическое освоение Delphi и следуя видео инструкциям создаете собственные программные продукты. Теперь язык программирования Delphi может освоить каждый. И для этого вам не нужно посещать дорогие тренинги, читать тонны серых бумажных книг или часами бродить по сайтам в поиске подходящего урока. Заказав данный диск Вы получаете СИСТЕМАТИЗИРОВАНЫЙ видео-комплекс, способный обучить как новичка в программировании, так и значительно увеличить знания опытного программиста! http://video.delphiexpert.ru
http://video.delphiexpert.ru
Windows Mobile под контролем Windows Mobile, медленно, но верно вливается во все современные девайсы. Все продвинутые коммуникаторы, КПК уже давно работают под управлением этой компактной ОС, а раз так, то кто как не ты, первым должен узнать о тонкостях кодинга под эту платформу и заставить работать свой коммуникатор/КПК на все 100! Итак, сегодня мы заглянем в кишки мобильной винде, и закодим очень интересный, а главное полезный примерчик. WinMobile вчера Еще буквально пару лет назад, мобильная платформа страдала дефицитом программного обеспечения. Трудно поверить, но чтобы найти нужную тулзу приходилось не хило попотеть, а потом еще раз напрячься, чтобы отыскать заветный кряк. Отсутствие софта обуславливал тот, факт, что для разработки программ под новую платформу не было удобной IDE. Да, был могучий Visual C++, в котором если мне не изменяет память, были мастера, для создания каркаса мобильного, но, к сожалению их возможностей, было очень мало. Когда я в 2003 году попробовал замутить первую программу для КПК друга, то сразу понял, что моих нервов не хватит для интимных отношений с ужасной «Visual Studio». После Delphi эта среда кажется уж больно непродуманной и не понятной. Такое чувство, что пересаживаешься с мерса на волгу =). WinMobile сегодня Сегодня Winodows Mobile сильно преобразился, дорос аж до шестой версии и теперь ее можно назвать действительно комфортной ОС. Удобство и комфорт были достигнуты как за счет улучшения внешнего вида, так и за счет упрощения процесса разработки софта. Сейчас уже не составляет труда найти продвинутый почтовик или навороченный текстовый редактор. Да что там продвинутый почтовик или текстовый редактор, многие разработчики уже взяли за правило выпускать мобильные версии своих настольных продуктов. Например, для Windows Mobile уже давно появились клоны WinRAR, TotalCommander, WinZIP, MS Office и т.д. Появление такого большого количества программ обязано в первую очередь развитию платформы .NET. Создавать софт на базе этой технологии чрезвычайно просто и удобно и очень привычно для кодеров, которые выросли на таких языках как Delphi/C++ Builder. Последние версии Visual Studio словно переродились и стали удобными и по истине функциональными. Готовность номер «раз»! Я долго думал над примером, но моя скудная фантазия все время ленилась и не могла предложить ничего необычного, поэтому я решил не париться и просто написать полезный примерчик, на основе которого легко закодить необходимые любому продвинутому пользователю приложения. Итак, усаживайся удобнее, сейчас мы начнем путешествие в волшебную страну WinMobile. Дорожный чемоданчик Отправляясь в путешествие нельзя забывать про вещи первой необходимости, без которых невозможно ни одно дальнее путешествие. Выброси из своего походного чемоданчика проверенный временем Delphi, сегодня он не пригодится. Вместо него
приготовь VisualStudio, версию выбери как можно свежее. Лично я отдаю предпочтение самой последней в – 2008. Помимо студии нам также потребуется SDK для работы с функциями, характерными для коммуникаторов – sms, телефония и т.д. SDK и саму VS ты всегда можешь слить с www.microsoft.com. Время деньги Будем считать, что ты успешно скачал и установил нужный SDK, а это значит, что нужно двигаться дальше. Запускай VisualStudio и создавай новый проект для Visual C# типа Smart Device. Сразу после выбора типа проекта перед тобой должно появиться окно как на рисунке 1.
Рис. 1 (Выбор шаблона для проекта) В этом окне ты должен выбрать платформу (Target platform) для который ты собираешься создавать приложение, версию .NET Фреймворка (.NET Compact Framework version) и шаблон приложения (Templates). Для наших примеров в качестве платформы установи Windows Mobile 5.0 Smartphone SDK (если ты качал 6-ю версию SDK, то выбирай именно ее). Выбрав эту платформу, нам будут доступны все необходимые пространства имен для работы со специфичными функциями коммуникаторов/смартфонов. Версию Фреймворка стоит выбирать исходя из той, которая установлена на твоем девайсе. Например, на моем коммуникаторе Toshiba Portege G900 тасуется .NET Framework 2.0, поэтому я выбрал именно эту версию. Обрати внимание, если на твоем устройстве до сих пор установлена первая версия .NET Framework, то бегом несись на microsoft.com и скачивай хотя бы вторую, т.к. первая уж больно сильно урезана в плане функционала. Все, теперь остается только выбрать шаблон для нашего приложения. Для сегодняшних
примеров нам вполне подойдет Device Application. Клацай «Ок» и VisualStudio сгенерирует новый пустой проект (рисунок 2).
Рис. 2 (Чистый проект с необычной мордашкой) По умолчанию, VS создает чистый проект для мобильных устройств со скином в виде самого девайса. По правде говоря, дизайнить форму в таком виде не очень удобно, поэтому потрудись сразу отключить отображение скина. Сделать это можно, кликнув правой клавишей мыши по форме, и выбрав в контекстном меню “Show Skin”. После этого нехитрого действия ты увидишь более-менее привычный вид формы (рисунок 3).
Рис. 3 (Привычная глазу форма)
Пустой проект готов и теперь пора приводить его в рабочий вид. Готовь мышку, сейчас мы будем раскидывать элементы управления. Сегодня мы разберем не один, а сразу несколько примерчиков. Для такого «проекта» нужна соответствующая форма. Варианта формы с кучей закладок я для себя не нашел. Советую тебе не заморачиваться и пойти тем же путем, что и я – т.е. бросить и растянуть по всей форме компонент TabControl и создать в нем пять закладок: § § § § §
Отправка SMS Процессы Файловый менеджер Dialer Полезности
Думаю, назначение закладок пояснять не нужно, т.к. все и так очевидно исходя из их названия. Что? Тебе интересно, что же за полезности? Ok, сейчас объясню. На той закладке расположено несколько кнопок, которые выполняет некоторые полезные для пользователя или западлостроителя действия: поворот экрана, выключение/перезагрузка системы. Мой вариант оформления ты можешь увидеть на рисунках 4-7.
Рис. 4 (Простая форма для отправки SMS)
Рис. 5 (Диспетчер процессов)
Рис. 6 (Путеводитель по файлам)
Рис. 7 (Звонилка)
Напишите письмецо… С дизайном формы покончено, пора переходить к кодингу. Первое, что мы сегодня научимся – отправлять SMS. Короткими сообщениями пользуется каждый из нас, а раз так, то не плохо было бы научиться отправлять их программно. Зачем? Цели могут быть разными. Например, некоторые на основе полученных знаний смогут закодить простенькую программку, которая сможет транслитировать весь кириллический текст, тем самым, позволяя сэкономить свои кровные на отправке SMS, а другие могут через sms «выводить» с вражеской территории различную полезную информацию. Итак, создай обработчик события для одной единственной кнопки с надписью «отправить» и напиши в нем следующий код: if (textBox1.Text != "") { SmsMessage mymessage = new SmsMessage(); //вот здесь можно добавлять кучу получателей mymessage.To.Add(new Recipient(textBox1.Text)); mymessage.RequestDeliveryReport = cbReport.Checked; mymessage.Body = textBox2.Text; try { mymessage.Send(); MessageBox.Show("Сообщение успешно отправлено!", "Информация!"); } catch { MessageBox.Show("При отправке сообщения возникла ошибка!", "Ошибка!"); } }
Кода немного, быстренько переписывай и возвращайся сюда за разъяснениями. В самой первой строчке я проверяю, заполнено ли поле с получателем, если нет, то делать ничего не нужно. Для демонстрационного примера такой проверки вполне достаточно, но для реального приложения ее будет недостаточно. Если ты решишь в будущем закодить тулзу для отправки сообщений, то я рекомендую тебе проверять номер получателя с помощью регулярных выражений. Только так можно быть уверенным, что это действительно номер, а не чехорда из букв и цифр. Проверив номер получателя можно переходить непосредственно к отправке. Для отправки SMS в SDK есть готовый класс – SmsMessage.
Как и полагается, перед тем как начать работать с классом, нужно создать его экземпляр. Именно это я и делаю во второй строчке кода. Инициализировав класс, не нужно теряться, а сразу начать заполнять его свойства, к счастью их немного: §
TO – коллекция получателей. В этом свойстве ты можешь установить как одного, так и нескольких получателей.
§
RequestDeliveryReport – отчет о доставке. Если в этом свойстве true, то после отправки сообщения будет запрошен отчет.
§
Body – текст сообщения.
Разобравшись со свойствами можно переходить к методам, а методов всего один – Send(). В примере, вызов метода Send() я заключаю в блок операторов исключительных ситуаций. Это необходимо делать на случай неожиданных ошибок. Попробуй сейчас сохранить внесенные изменения и собрать проект. Если VS нервно заматерилась, то не спеши паниковать, а просто добавь новое пространство имен - Microsoft.WindowsMobile.PocketOutlook. Попробуй опять собрать проект. Что, опять не хочет? Ok, don’t worry. Зайди в меню Project -> Add Reference. В появивщимся окне выбири нужную сборку и нажми Ok. Вот теперь проект должен успешно собраться. Можешь уже сейчас залить только что испеченную прогу в свой девайс и протеастить, а я начну разбирать следующий примерчик. Мониторим процессы На мой взгляд одним из главных минусовм WinMobile – отсутствие встроенных средств для просмотра списка активных задач или процессов. В написании такой тулзы нет ничего сложного, но вот почему то многие программисты пытаюстся заработать неплохие деньги на подобных программых. Например, мне на глаза попадался продвинутый диспетчер задач с кучей разных ненужных функций по цене 30$. Не хило? Лично для меня это не мало и свои честнозаработанные денежки, я предпочитаю тратить на более нужные вещи. А что делать когда тулза нужна, но нет денег? Правильно, искать альтернативу либо взяться за кодинг. Мне как программисту второй вариант более по душе. Итак, создавай обработчик события Clicлk() для кнопки «Обновить», расположенной на второй закладке. Напиши здесь всего лишь одну строчку кода: GetProcList();
Код самой процедуры ты можешь найти в листинге 1. Начинай его переписывать, а я потружусь объянить тебе, что в нем происходит. Листинг 1 (Получаем процессы) private void GetProcList() { Cursor.Current = Cursors.WaitCursor; lvProcessList.Items.Clear(); process_list = TaskManager.Process.GetProcesses(); foreach (TaskManager.Process proc in process_list) { ListViewItem NewItem = new ListViewItem(proc.ProcessId.ToString()); NewItem.SubItems.Add(proc.ProcessName);
NewItem.SubItems.Add(proc.ThreadCount.ToString()); lvProcessList.Items.Add(NewItem); } Cursor.Current = Cursors.Default; }
Взглянув на листинг, ты наверняка удивился – для получение процессов потребовалось по сути всего лишь одна строчка (перебор и добавление каждого из них в ListView не считаем). Если ты хоть раз пробовал кодить «диспетчер процессов» под Win32 (конечно кодил, любимый журнал уже не раз писал об этом=))), то наверняка помнишь, что для получения списка активных процессов приходилось вызывать кучу API функций и совершать много телодвижений, а вот тут все как то просто и быстро. На самом деле все не так просто как кажется на первый взгляд. Строка process_list = TaskManager.Process.GetProcesses(); говорит о том, что получение процессов происходит посредством вызова метода GetProcess() класса Process. Класс Process является разработкой Cristian Forsberg и благодоря ему работа с процессами превращается в сплошное удовольствием. Точнее в одну строку. Все что нам требуется, так это получить список все процессов посредством вызова всего навсего одного метода – GetProcess(). После этого остается только запустить перебор в цикле и вытащить информацию о каждом из них. Всю эту информацию (количество потоков, имя процесса, pid) я и добавляю в ListView, всю остальную черную работу делает хорошо продуманный класс. Кстати, модуль с классом, ты можешь взять с нашего диска, а после выхода журнала в свет, на www.vr-online.ru, будет доступен немного переработанный вариант этого класса, с возможностью получать путь к файлу-процесса. Будем считать, что список процессов у нас получен, теперь нужно научиться им управлять – убивать лишние. Для решения этой нетрудной задачки, у класса Process есть метод Kill(). Реализация процесса завершения ниже: TaskManager.Process proc; proc = process_list[lvProcessList.SelectedIndices[0]]; proc.Kill();
В этом не хитритом коде я выковариваю выделенный процесс и просто вызываю вышеозвученный метод. Все просто до безобразия. Попробуй подключить класс и в очередной раз протестировать пример. Играйся, но не долго, дальше будет еще интересней! Файловый менеджер Файловый менеджер – тулза без которой я не могу представить ни один свой рабочий день. На «большом» компе я комфотно юзаю бесплатный UnrealCommander (практически клон TotalCommander’a). С недавнего времени необходимость в функциональном файловом менеджере встала и при работе на коммуникаторе. Опять же, я не стал заморачиваться с поисками подобной тулзы, а решил попробовать закодить его самоятельно. Создай пустую функцию FileList() и снабди ее тело кодом из листинга 2 и как обычно возвращайся за разъяснениями. В самом начале я меняю вид курсора. Получение списка файлов дело не быстрое, особенно на мобильных девайсах, поэтому чтобы лишний раз не смущать пользователя, лучше выбрать привычный курсор для долгих операций курсор и спать спокойно.
Подготовив пользователя, ни что не помешает нам перейти непосредственно к получению списка файлов. Сначала получим список директорий (чтобы они были сверху, как и принято во всех файловых менеджерах,) а уже после этого пробежимся по файлам. Для получения директорий я использую класс Directory. У этого класса есть метод GetDirectories(), позволяющий получить список папок по переданному в качестве единственного параметра пути. Получив список папок их обязательно нужно добавить в контейнер-коллекцию, чтобы потом их можно было удобно остортировать (foldersList.Sort();). Отсортировав список директорий можно приступать к добавлению найденный папок в ListView. Добавив папки я приступаю к получению файлов. Алгоритм получения списка файлов точно такой же, поэтому я не стану заострять на нем внимание. Теперь создай обработчик события Click() для кнопки «Перейти». По ее нажатию мы будем запрашивать содержимое конкретной папки. Все что нам требуется написать в этом обработчике – вызов функции FileList();. Если сейчас запустить пример, то уже реально начать путешествие по файловой системе. Вводи в поле для ввода пути любой адрес (например, My Documents) и нажми на кнопку «Перейти». Если при переписывании листинга ты не допустил ошибок, то через мгновение, ListView должен заполнится списком файлов (рисунок 8).
Рис. 8 (Путешествие в страну файлов эмулятора) Хватит глазеть, нам нужно двигаться дальше. Наш файловый менеджер умеет отображать список файлов, но чего-то ему явно не хватает. Несомнено, какой файловый менеджер без возможности выполнения стандартных операций (создание папок, копирование и удаление файлов, запуска программы). Поэтому нам волей не волей, но придется расширять функционал. Ok, начнем с удаления файлов. Удалить файл не проблема (гораздо трудней его восстановить=)), все что от нас требуется – вызвать метод Delete() класса File. В качестве одного единственного параметра, метод принимает полный путь к файлу, который должен быть удален. Список файлов у нас в ListView, путь к папке в которой мы работаем у нас тоже есть (tbPath), значит все, что нам требуется так это прибавить имя файла к полному пути к папке в которой мы сейчас находимся и выполнить метод Delete(): File.Delete(tbPath.Text+listView1.Items[listView1.SelectedIndices[0]].Text);
Копирование файла реализуется аналогиным способом, с одним отличием – требуется вызывать не метод Delete(), а метод Copy(), которому нужно передать два параметра: § §
Полный путь к файлу источнику Полный путь к файлу приемнику
Определить файл источник можно таким же способом как и при удалении, поэтому еще раз приводить код я не буду. Папки создаются подобным образом – посредством вызова метода CreateDirectory(). Метод принимает всего один параметр – путь к создаваемой папке. Как видишь, встроенные классы сушественно упрощают работу с файлами и папками и совершенно позвовляют забыть о неудобном использовании Windows API. Совсем другая история с запуском файлов. Так уж получилось, но разработчики C# не снабдили нас удобным классом для запуска внешних программ. Печально, но не смертельно. Уже известный нам Cristian Forsberg помимо класса для работы с процессами, он любезно предоставил на суд общественности класс ShellExecute, позволяющий стартовать программы. Все, что требуется от тебя – подключить модуль с классом к своему проекту и вызвать метод Start() и передать ему путь к запускаемому файлу, а остальное работа класса. Я не стану приводить пример кода запуска, т.к. в нем ничего нет сложного. В крайнем случае, на DVD тебя ждет полный исходник со всеми рассмотренными классами. Листинг 2 (Путешествуем по файлам) private void FileList() { Cursor.Current = Cursors.WaitCursor; listView1.Items.Clear(); listView1.BeginUpdate(); string[] folders = Directory.GetDirectories(tbPath.Text); ArrayList foldersList= new ArrayList(folders.Length); ListViewItem NewListView; int i = 0; for (i = 0; i < folders.Length; i++) foldersList.Add(folders[i]); foldersList.Sort(); foreach (string directory in foldersList) { NewListView = new ListViewItem(Path.GetFileName(directory)); NewListView.SubItems.Add("Dir"); listView1.Items.Add(NewListView); } string[] files = Directory.GetFiles(tbPath.Text); foldersList = new ArrayList(files.Length); for (i = 0; i < files.Length; i++) foldersList.Add(files[i]); foldersList.Sort(); foreach (string file in foldersList)
{ NewListView = new ListViewItem(Path.GetFileName(file)); NewListView.SubItems.Add ("File"); listView1.Items.Add(NewListView); } if (tbPath.Text[tbPath.Text.Length - 1].ToString() != "\\") { tbPath.Text = tbPath.Text + "\\"; } listView1.EndUpdate(); Cursor.Current = Cursors.Default; }
Позвони мне, позвони Мы уже познакомились с отправкой смс, получением процессов, выполнение операций с файлами, теперь дошел черед и до телефонии. Я специально оставил это на закуску, т.к. благодаря классам работать с ней просто и не требуется писать кучу кода. Не буду многословным, просто взгляни на этот код: Phone NewPhone; NewPhone = new Phone(); NewPhone.Talk(tbTellNumber.Text, false);
Этих трех строчек достаточно чтобы совершить звононок по номеру введенному в поле tbTellNumber. Второй параметр (false) метода Talk, говорит о том, что номер нужно набирать сразу же, не ожидая разрешений. The End Программировать для Windows Mobile используя технологию .NET чрезвычайно быстро и удобно. Сегодняшние примеры – лишние тому подтверждение. Обрати внимание, сегодня мы рассматривали только демонстрационные примеры, но на основе этих примеров вполне реально написать настоящие хакерские тулзы. Например, ты без труда сможешь отправлять с девайса владельца всю нужную тебе инфу посредством sms или устроить самую настояющую прослушку среди бела дня, ведь все для этого требуется – автоматически набрать нужный номер в нужное время. И пускай потом жертва вспоминает как его тел смоог позвонить, стоя на блокировке. На этой славной ноте я хочу закончить свою сказку и попрощаться с тобой. Удачи в нелегких кодерских делах!!!
Исходники к статье ищи в папке «Windows Mobile под контролем» Written by Антонов Игорь aka Spider_NET E-Mail: antonov.igor@live.ru
Delphi 2009: Обновленная палитра Совсем недавно состоялся релиз новой версии моего Delphi. В отличии от предыдущей, в 2009-й версии произошли значительные обновления, про некоторые из которых мы поговорим в этой небольшой статье. Больше чем релиз Последние два релиза Дельфина были скорее багфиксами, чем полноценными версиями. Новых компонент в них практически появилось, да и внутренности самого языка также не изменились. Совсем другая история с Delphi 2009. Видно, что разработчики активизировались и сделали по-настоящему новую версию любимого и ругаемого многим продукта. В ней изменений больше чем достаточно: серьезно обновилась IDE, язык вобрал в себя несколько новых конструкций, а палитра компонент прямо расцвела появились долгожданные контролы. Не буду хвалить любимый продукт, лучше расскажу все в подробностях. В рамках статьи мы рассмотрим обновленную палитру компонент, а про IDE и новые языковые конструкции ты сможешь узнать в одной из статей журнала ][акер. Красивые панельки Уже достаточно давно стало модным делать боковые панели, на которых размещаются кнопки/ссылки на основные возможности программы. Такие панели не только выглядят симпотно, но и позволяют тематически группировать расположенные на них элементы управления. Взгляни на рисунок 1.
Рис. 1 (Модные панельки)
На нем изображено основное окно программы CyD Network Utilities (привет Horrific:). Обрати внимание, в левом углу окна, расположена панелька с двумя созданными группами: Main и Network components. Группы разворачиваются и в их развернутом состоянии видны элементы управления. Как я уже и заявлял, мода на такие штучки пошла давно, но разработчики Delphi, реализовали компонент с опозданием. Хоть с задержкой, но все равно приятно. Давай посмотрим компоненты в действии. Создай в Delphi 2009 пустой проект и брось на форму компонент TCategoryPanelGroup. Пока толку от нее немного, т.к. она ничего не умеет. Создадим в ней несколько групп. Для создания новой группы щелкни правой кнопкой крысы по компоненту и выбери пункт New Panel. Создай таким образом три панельки. Теперь посмотрим, как можно визуально улучшить наше творение. Для изменения внешнего вида у компонента имеется ряд свойств: § ChevronAlignment - определяет выравнивание кнопочки для разворачивания/сворачивания внутренней панельки. § ChevronColor - цвет кнопки для сворачивания § ChevronHotColor - цвет, при наведении курсора мыши на всю ту же пимпу § GradientBaseColor - Начальный цвет, для создания градиента шапок внутренних панелей § GradientColor - Так сказать цвет к которому приведет градиент § GradientDirection - направление градиента. Может быть вертикальным или горизонтальным § HeaderAlignment - выравнивание заголовка шапки § HeaderImage - изображение, которое будет использоваться для оформления шапок внутренних панелек. § HeaderStyle - стиль шапки. Очень интересное свойство, которое наверняка пригодится при оформлении. Оно может принимать значения: hsGradient – использование; градиента; hsThemed - соответствие теме ОС; hsImage - использовать картинку в качестве фона § Images - ссылка на ImageList, картинки которого, будут использоваться при оформлении заголовков внутренних панелек. Немного покрутив эти свойства можно добиться разных красивых эффектов и создать примерно такие формы как на рисунках 2-3. Кстати, по умолчанию после компиляции приложения, все внутренние панельки появляются в раскрытом виде, это очень неудобно. Чтобы повлиять на этот процесс, достаточно установить у каждой дочерний панели свойство Collapsed в true.
Рис. 2 (Вот такие можно лабать панельки)
Рис. 3 (Дочерние панели развернуты и содержат другие элементы) Улучшенный TProgressBar Пожалуй, не один проект не может обойтись без компонента TProgressBar, посредством которого все отображают состояние выполнения долгих операций. На протяжении всех версий Delphi, этот компонент не обновлялся, и нередко для придания более симпотичного вида, приходилось использовать альтернативные разработки. Благо в новой версии дельфина ситуация изменилась, и разработчики снабдили ProgressBar новыми, давно ожидаемыми свойствами: Style - как и следует ожидать, свойство определяет стиль компонента. Оно принимает два значения - pbstNormal (стандартный) и pbstMarquee ("бегущий"). С первым все понятно, а вот второй позволяет создать анимацию. Например, этот эффект можно использовать при показе splash форм. Ты же реально не знаешь, сколько будет грузиться твое приложение? А значит отобразить эту задержку в стандартном ProgressBar будет проблематично. Раньше эту траблу многие решали обычным циклом с задержкой. Так удавалось добиться эффекта, что splash приложения не просто весит, а еще и занимается каким-то важным делом. Так вот, сейчас нет необходимости так заморачиваться плодить цикл, достаточно просто установить style в Marquee и progressBar будет автоматически показывать видимость расчета (состояние бара будет бегать из стороны в сторону). Если ты до сих пор не понял, о чем я говорю, глянь на рисунок 4.
Рис. 4 (ProgressBar делает мнимый расчет) State - свойство позволяет определить текущее состояние для ProgressBar. Если ты пользовался бесплатным клоном известного файлового менеджера TC - Unreal Commander'ом, то ты уже понял, о чем пойдет речь дальше и можешь смело пропустить абзац. Свойство позволяет управлять отображением PB. Например, у тебя в потоке выполняется копирование большего файла и есть возможность приостанавливать операцию. При таком раскладе, текущее состояние (если ты отображаешь его на pb) должно "замереть". Все хорошо, но смотрится как-то простовато. Чтобы ввести, хоть какую-то красоту для таких случаев и создано свойство state. Оно принимает одно из следующих значений: § § §
pbsError pbsPaused pbsNormal
Устанавливая, одно из этих значений ты можешь изменять внешний вид. Вернемся к нашим баранам. Пользователь поставил копирование на паузу, значит, стоит присвоить свойству state pbsPaused и выполнить соответствующие преобразования (перекраску и т.д.). Такой подход очень удобен и избавляет от лишних телодвижений. Подсказки симпотяшки Ты знаешь, для того чтобы программа успешно продавалась и полюбилась пользователям, она должна обладать простым и удобным интерфейсом. Для того чтобы добиться максимальной простоты, требуется как минимум красиво расположить элементы на форме и снабдить все важные кнопки подсказками. "Чего тут сложного?" - спросишь ты, "Заполнил везде свойство hint и дело с концом". Так оно так, но вид таких подсказок напоминает динозавров из эры Win95 и могут запросто травмировать создание Vista-совместимого пользователя. Чтобы избежать таких казусов, девелоперы снабдили 2009 версию Delphi компонентом TBalloonHint, специально предназначенный, для создания стильных подсказочек. Итак, брось этот сабжевый компонент на форму, а также любой другой элемент управления (например, кнопку). Сначала выдели кнопку (в моем случае) и в новом свойстве CustomHint выбири единственный наш BallonHint. После этого забей в свойство Hint кнопки текст подсказки и выстави ShowHint в тру. Попробуй запустить приложение, навести курсор мыши на кнопку и дождаться появления подсказки. Если ты все сделал правильно, то ее внешний вид изменится и станет более привлекательным. Красиво? Ok, но на этом операция по улучшению вида подсказок не заканчивается. У BalloonHint еще есть несколько интересных, а самой главное полезных свойсв:
§
Delay - количество миллисекунд, по истечению которых, нужно отображать хинт. Установи его в 100 и подсказка будет появляться сразу же при наведении курсора. В некоторых ситуациях такая необходимость возникает.
§
HideAfter - через сколько скрывать подсказку.
§
images - ссылка на ImageList, изображения которого можно юзать в подсказке.
§
style - стиль подсказки. Пока реализовано лишь два стиля: bhsStandart - объемная подсказка и bnsBalloon - облако с треугольником (стиль знаком тем, кто хоть раз читал комиксы).
Все свойства просты в использовании и не требуют лишних пояснений. Исключением лишь является свойство images. Заюзаем его на практике, брось на форму еще компонент TImageList и напичкай в него каких-нибудь картинок. Я бросил лишь одну. Теперь выдели кнопку и доберись до знакомого тебе свойства Hint и напиши в нем подсказку в следующем виде: Описание кнопки | Кнопка пока ничего не умеет делать 9 | 0 Не смущайся вертикальной черты, в новом Delphi она предназначена для разделения некоторых свойств. В нашем случае мы делим текст подсказки на отдельные составляющие: § § §
Заголовок ("описание кнопки") Текст подсказки ("Кнопка пока ничего…") Индекс картинки, из ImageList
Попробуй теперь запустить приложение и дождаться появления подсказки. Ее новый внешний вид тебя должен порадовать (Рисунок 5)
Рис. 5 (Подсказки симпотяшки) Простой способ создания ссылок Видно и разработчиков изрядно достало извращаться с созданием ссылок на web-сайты с помощью стандартных TLabel и они созрели на создание полноценного компонента TLinkLabel. На внешний вид, это обычный TLabel, но его свойство caption, парсится на предмент наличия ссылок и если линки найдены, то они выделяются соответствующим образом. Брось компонент на форму и впиши в свойство caption следующий текст: Мне очень нравится сайт журнала <a href="http://xakep.ru">][акеp</a>
Запусти проект и посмотри на результат. Уже на данном этапе "][акер" отображается как типичная ссылка и при наведении мышкой, курсор меняет свой вид. Тем немее, если попытаться кликнуть, то ничего не произойдет. Все дело в том, что написать код обработки ссылок все-таки ложится на плечи программиста. Благо, под кодом подразумевается всего одна строчка, которая должна находиться в обработчике OnLinkClick: ShellExecute(Handle, 'open', pchar(link), '', '', sw_show);
Рис. 6 (Ссылка на сайта за несколько секунд) Поле ввода + кнопка = ? Начать рассмотрение этого компонента сразу хочется с примера. Абсолютно любому Delphi-кодеру приходилось делать поле ввода (TEdit) для отображения пути к файлу и рядом с ним располагать кнопочку для вызова диалога открытия файлов. Когда терпение "творить" таким способом кончалось, все переходили к использованию чужих компонент или писали свои. С каждой новой версии Delphi, я надеялся, что такой необходимой контрол появится среди стандартных. Однако, свершилось это лишь в 2009 версии. Разработчики удосужились и представили компонент TButtonEdit (Рисунок 7). После перетаскивания компонента на форму, он имеет вид обычного TEdit. Чтобы создать кнопку, тебе необходимо покрутить свойства RightButton и при необходимости LeftButton. Думаю, комментарии больше не нужны.
Рис. 8 (TButtonEdit в действи) Новомодный интерфейс Как только вышел MS Office 2007 многие пользователи прониклись его новомодным интерфейсом, и разработчикам пришлось взять клавы в руки и начать обновлять вид интерфейса в своих проектах - дабы не отстать от прогресса. Только вот беда, на то время ни Delphi 2007 и уж тем более старые версии не могли похвастаться наличием соответствующих компонент. В итоге каждый стал выкручиваться, как мог. К счастью, с выходом новой версии Delphi проблеме положен конец. Библиотека VCL обзавелась соответствующими компонентами, скромненько расположившимися на закладе Ribbon Controls. На этой закладке представлено пять компонент, позволяющих с легкостью создать красивейший интерфейс. Рассмотрим весь этот процесс на практике. Создай новый проект и кинь на него следующие компоненты: § § §
Action Manager ImageList Ribbon
Первым делом разберемся с ImageList. Накидай в него несколько хороших картинок. Как ты уже наверное догадался, в дальнейшем мы будем клеить эти пикчи на кнопки. Ok, с ImageList все, теперь пришла очередь ActionManager. Создай в нем несколько Action. Я не стал заморачиваться и сделал самые распространенные: "Создать", "Открыть", "Сохранить", "Выход". Чтобы экшены не смотрелись скудно, натяни на них картинки, которые добавили в ImageList. Приготовления окончены и пора браться за самый главный компонент - Ribbon. Первое что нужно с ним проделать - выбрать в свойстве ActionManager единственный имеющийся у нас компонент данного типа. Первое, с чего начинается строительство ribbon интерфейса - с основное меню (вспоминаем круглую кнопочку в офисных продуктах мелкософта). Выдели компонент ribbon и кликни по нему правой клавишей крысы. В контекстной менюшке выбери - Add Application Menu. Если ты не промахнулся, то увидишь ту самую кругленькую пимпу. Меню создано, теперь приступим к его заполнению. Делается это стандартным способом просто перетащи из ActionManager все созданные экшены на меню и дело сделано. Главное меню готово, теперь надо бы создать закладки, на которых будут располагаться основные элементы. Табы для ribbon создаются через контекстное меню посредством пункта "Add Tab". Для примера нам хватит двух закладок. На каждой закладке ribbon принято создавать группы, содержащие элементы управления. Группы создаются через контекстное меню выделенного таба. Для полноты примера создадим две группы. Первую назовем "Основной", а вторую "Доп. группа". В них растасуем имеющиеся у нас экшены. Перенос элементов из ActionBar осуществляется стандартным Drag&Drop. На этом шаге можно считать создание простейшего ribbon интерфейса - оконченным. Компиль проект и наслаждайся модным интерфейсом, созданным за несколько минут (Рисунок 8). Сделать ribbon в Delphi не сложно, но будь осторожен и чаще сохраняй свой проект во время редактирования интерфейса. Периодически, Delphi начинает сыпать ошибками и самовольно удалять с формы брошенный компонент. Это бывает крайне редко, но, как правило, это "редко" происходит в самый неподходящий момент.
Рис. 8 (Модный интерфейс за несколько минут)
Written by Антонов Игорь aka Spider_NET E-mail: antonov.igor@live.ru
Базы Данных
Базы данных Специалисты баз данных достаточно узкоспециализированная профессия. На первый взгляд, специалист, занимающий подобную должен знать только SQL, стандарт которого был принят еще в 92-м году, но на самом деле все намного сложнее. Например, авторизованные курсы программиста Microsoft SQL Server отнимают менее месяца. Если помимо программирования взять еще курсы администратора, то весь цикл отнимет около месяца. Но, не смотря на все это, программист, получающий реальную работу, может решить далеко не все задачи. То же самое касается и администраторов баз данных. Как букварь На самом деле, все прекрасно понимают, что обучение необходимо, но в большинстве случаев мы экономим деньги или жалеем Курсы от Oracle время, надеясь на свой опыт. На знаниях не стоит экономить. Если вы отстанете хотя O9iSQL - Введение в Oracle 9i: SQL бы на день, то нагнать потом будет очень O9iPLSQL - Введение Oracle9i: PL/SQL сложно. Обучение необходимо и чтобы O9iDBA I - Основы администрирования оставаться на вершине волны. Для этого Oracle9i, часть I оно должно происходить постоянно и без O9iDBA II - Основы администрирования перерыва. Oracle9i, часть II O9iPT - Настройка производительности Сегодня мы будем делать упор на Oracle9i достаточно узкую область - базы данных и 9iNF - Oracle 9i Новые возможности для посмотрим, в какую сторону можно администраторов двигаться, что можно изучить в O9iDPU - Разработка програмных дополнение, что будет полезно объектов базы данных Oracle администраторам и программистам баз 10gSQL - База данных Oracle 10g: Основы данных. В институтах я не встречал SQL направлений, связанных непосредственно с 10gPL/SQL - База данных Oracle10g: программированием или Основы PL/SQL администрированием баз данных. И то и 10gDPU - База данных Oracle 10g: другое преподают прикладным Разработка программных единиц PL/SQL математикам в укороченном виде и все 10gNFA - Oracle Database 10g Release информация к моменту защиты диплома 2:Новые возможности для может устареть, если обучение было на администраторов баз данных первом курсе. По завершении учебного OR-10gDBA I - Основы администрирования заведения необходимо обновить знания и Oracle10g, часть I пополнить их и лучшим вариантом будет OR-10gDBA II - Основы здесь авторизованные курсы. администрирования Oracle10g, часть II Есть две профессии, связанные с базами данных и называются они: программист БД и администратор БД. В небольших организациях эти обязанности очень часто выполняет одно лицо, нередко бородатое, но очень умное. Но за океаном и в очень крупных компаниях эти профессии объединяют очень редко, потому что каждая из них требует очень глубокого понимания своей темы для максимально эффективного решения своих задач. И не смотря на это, обе профессии пересекаются во многом – знаниях, выполняемых задачах и используемых средствах. Язык запросов
Программист должен знать язык запросов к данным, используемый на сервере, дабы максимально эффективно писать запросы и оптимизировать их. Во всех базах данных используется ставший стандартом язык SQL. Последний стандарт был принят еще в 1992м году, но производители серверов баз данных далеко не во всем следуют рекомендациям. Может случиться так, что запрос написанный по всем правилам стандарта не будет выполнен, а вы увидите сообщение о синтаксической ошибке. Возможности стандарта SQL-92 слишком малы, поэтому производители серверов расширяют стандарт и создают новые языки. Я думаю, что многие слышали такие названия как Transact-SQL и PL/SQL. Первый из них поддерживается Microsoft в MS SQL Server, а второй реализован Oracle в одноименном продукте. Оба этих языка развиваются и очень динамично. В каждой новой версии сервера базы данных можно увидеть какие-то новые операторы, процедуры, функции или параметры уже знакомых нам команд. Недавно на моей основной работе перешли на новую версию Oracle. Как вы думаете, это дало нам какие-то преимущества? Я думаю, что минимум, потому что в нашем отделе мало кто представляет, чем отличаются эти версии, и никто не использует новые возможности. Я пишу эти строки и понимаю, что переход был бессмысленным. Возможно, что какие-то внутренние улучшение архитектуры позволили поднять производительность, но это же капля в море и не стоит тех денег, которые отдала компания за дистрибутив. Если не потратить хотя бы день и не разобраться в новинках, то деньги можно считать выброшенными на ветер. В современном мире отслеживать все изменения при переходе на новую версию становиться все сложнее и сложнее. Можно попытаться прочитать мануалы и все статьи Whats New перед установкой новой версии, но чаще всего на это просто не хватает времени, по крайней мере у меня. Мир развивается слишком быстро, поэтому, лучше посетить какие-то курсы и презентации. Личное общение всегда было лучшим средством получения информацией, ведь на курсах и презентациях всегда показывают ситуации, максимально приближенные к боевым, и варианты их решения с использованием новых возможностей. Чтение статей не может заменить опыт, недаром же говорят, что лучше один раз увидеть, чем сто раз услышать, а тем более прочитать. SQL для всех Язык запросов SQL необходим как администраторам, так и программистам баз данных. Да, современные базы данных, особенно MS SQL Server обладает отличным средством визуального администрирования. Вкупе с подсказками, мастерами и другими средствами упрощения жизни, уровень подготовки администратором может упасть. На наш взгляд, это очень плохая тенденция. Уровень образования должен расти, иначе все мы превратимся в глупых роботов, умеющих только двигать маленькую стрелочку в ответ на вопросы "да" или "нет". Использование языка запросов в большинстве случаев позволит вам решать возникшие проблемы в конфигурации намного быстрее. Для всех операций, которые вы делаете в Enterprise Manager есть соответствующие команда в языке запросов SQL, а точнее, в его расширении Transact-SQL. Шесть лет назад мне удалось пройти обучение на сертифицированных курсах Microsoft в МГТУ им. Баумана. Компания, где я работал, оплатила за меня сразу два курса –
администрирование и программирование. Во время обучения я убедился, что деньги потрачены не зря и знания администратора нужны программисту, а знания программиста (языка запросов) просто необходимы администратору. Но самое страшное, что я заметил во время обучения – оба курса заказали около 5 человек. Остальные на каждом из курсов были новенькими.
Курсы от Microsoft MS-2780 - Поддержка базы данных Microsoft SQL Server 2005 MS-2786 - Проектирование инфраструктуры Microsoft SQL Server 2005 MS-2779 - Реализация баз данных в СУБД Microsoft SQL Server 2005 MS-2782 - Проектирование баз данных Microsoft SQL Server 2005
Архитектура
MS-2787 - Проектирование безопасности Microsoft SQL Server 2005
Знание языка – это только пол дела, нужно еще знать и архитектуру используемого сервера базы данных, а также оптимизатор. Эти две составляющих являются достаточно сложными предметными областями и только по ним можно создавать отдельные курсы обучения. Запрос к данным сервера, максимально эффективно написанный под Microsoft SQL Server далеко не всегда с такой же эффективностью будет выполняться под базой от Oracle.
MS-2788 - Проектирование решений высокой доступности с использованием Microsoft SQL Server 2005* MS-2789 - Администрирование и автоматизация баз данных и серверов Microsoft SQL Server 2005 MS-2784 - Настройка и оптимизация запросов Microsoft SQL Server 2005 MS-2790 - Разрешение проблем и оптимизация работы серверов баз данных Microsoft SQL Server 2005 MS-2781 - Разработка серверных решений на основе Microsoft SQL Server 2005 MS-2783 - Проектирование уровня данных для Microsoft SQL Server 2005
Архитектура нужна не только программистам, но и администраторам, ведь если вы будете четко представлять себе, как сервер хранит и обрабатывает данные. Это позволит вам рассчитывать необходимое дисковое пространство, распределять нагрузку и находить максимально слабые места системы, а значит, эффективно решать их без лишних затрат. Знание архитектуры может позволить решить некоторые проблемы без лишних затрат, просто изменением какого-то параметра в настройках сервера. Профиль Мы рассмотрели уже несколько областей, в которых можно развиваться и в большинстве случаев области затрагивают как программирование, так и администрирование. Даже если вы выбрали себе узкий профиль одной из этих профессий, вы должны иметь хотя бы базовое представление о смежной области. А как мы уже не раз замечали, лучше прослушать оба курса. Даже если никогда не придется настраивать сервер базы данных и вмешиваться в глобальные настройки, эти знания никогда не помешают.
ОС Все мы умеем пользоваться ОС, особенно Windows, только вот познания большинства заканчиваются базовыми настройками. А многие ли в совершенстве владеют скриптовым языком Windows Scripting Host (WSH)? Я думаю, что нет, а ведь он позволяет автоматизировать многие рутинные операции. Помимо WSH есть еще несколько методов получить доступ к функциям системы. Каким бы ни был сервер базы данных, его возможности не безграничны, но их можно расширить с помощью использования внешних программ. При работе с работами (job) сервера баз данных от Microsoft, мы можем писать сценарии на скриптовых языках, и использовать другие возможности ОС, что значительно расширяет возможности и раздвигает рамки границ. Обращение к системе может быть выполнено с помощью хранимых процедур сервера прямо из запросов Transact-SQL.
В 2001-м году я проходил обучение на авторизованных курсах Microsoft по MS SQL Server. При этом, до этого я не имел опыта работы с данным сервером, и единственное, что пробовал сделать до курсов – выполнить инсталляцию. На мой взгляд, программа курсов оказалась достаточно удачной, но слишком насыщенной. За короткий срок над дали очень много полезной информации и очень много теории, а вот практики оказалось минимальное количество. Да, все возможные ситуации на практике в такой срок рассмотреть нереально, но можно было бы построить курс более эффективно. По завершении обучения чувствуешь себя умным, понимаешь, что все знаешь, что умеет делать SQL Server, но вот когда дело доходит до реального дела, понимаешь, что не можешь сделать даже половины из того, что изучал.
После обучения, около года мне пришлось интенсивно работать с MS SQL Server, настраивать его и программировать. Через год, я отправился на повторные курсы по новой версии того же сервера. А что, компания платит, а мне пару недель отдохнуть от работы в другом городе не помешает. На этот раз обучение прошло более продуктивным, потому что я уже знал основы. Это позволило мне сконцентрировать внимание только на новых Для повышения квалификации, мы рекомендуем закончить возможностях, а общение с равными себе (такими авторизованные курсы по же слушателями курсов) и более опытными используемой ОС. Да, именно специалистами (преподавателем) никогда не авторизованные, потому что они проходит бесследно. Общение и обмен опытом могут дать максимально полную, всегда будет полезем обоим дискутирующим точную и подробную информацию. сторонам. Получение сертификата в данной области можно оставить на собственное усмотрение. Если сертификат в основной области деятельности рекомендуем, то тут можно сэкономить на деньгах. На наш взгляд, главное – это знание, а не документы. Сертификаты являются всего лишь подтверждением ваших знаний, и своеобразной гарантией. Еще много Если вы считаете, что ваш администратор (а если вы являетесь администратором, то лично вы) знает абсолютно все и повышение квалификации не требуется, попробуйте зайти на сайт одного из учебных центров, предоставляющих обучение, и посмотрите,
сколько и какие курсы предлагаются. Во врезках к этой статьи вы можете найти название курсов, предлагаемых на данный момент двумя БД гигантами – Microsoft и Oracle. Все программы продуманы специалистами очень хорошо. Если вы уже имеете опыт работы с SQL, то нет смысла покупать вводные курсы, где дают базовые знания. Программистам с большим опытом могут оказаться не интересными даже самые сложные курсы, но получить качественную информацию из первых рук хочется. В этом случае я бы рекомендова л обратить внимание на презентации и выездные лекции. Некоторые учебные центры (например, компании Borland) могут без проблем организовать нужный именно вам курс прямо на вашем предприятии. Главный плюс такого метода – возможность специалистов и преподавателей пообщаться и обменяться знаниями.
Корпорация Microsoft регулярно проводит программы и конкурсы, в которых можно выиграть бесплатное обучение Программирование Если вы считаете, что в БД знаете уже все, я могу посоветовать заняться изучением какого-нибудь языка программирования, например, C#, C++ или Delphi. Когда мне пришлось год работать администратором баз данных, то мои знания программирования оказались большим плюсом, а по завершению испытательного периода, этот плюс очень качественно отразился в заработной плате. Любое руководство компании будет только радо тому, что их сотрудники могут решать смежные задачи. Для написания простых программ, с использованием современных средств, уже не нужно иметь сверх уникальный склад математического ума. Администраторы и программисты БД уже обладают хорошим багажом знаний, чтобы расширить свои знания на программирование офисных приложений.
Плюсом может оказаться и полноценное знание и умение администрировать ОС, а также поддерживать сети. Нет, заменить сетевой кабель может кто угодно, но не помешает еще и умение обжимать витую пару. Из области администрирования лучше всего иметь представление об Active Directory, уметь заводить новых пользователей и вводить их в домен. Если организация, на которой вы работаете предоставляет возможность бесплатного обучения, то лучше воспользоваться ею. Знания лишними не бывают. WEB трансляции Для повышения квалификации и получения информации из первых уст очень хорошим вариантом может послужить WEB. Тут, на мой взгляд, лучше всех работу поставила компания Microsoft с WEB трансляциями. Выбирая нужную трансляцию, вы сможете получить интересующую информацию, не отрываясь от производства или не выходя из дома. Трансляции и видеоролики являются очень удобным средством, передачи информации и намного превосходят статьи. Для любого производителя обучение и предоставления пользователям информации является достаточно приоритетной задачей. Далеко не все любят читать с экрана, а запустив трансляцию или ролик можно откинуться в кресле и с удовольствием впитывать что-то новое.
Softline (edu.softline.ru) предлагает очень широкий набор курсов различных производителей Итого Жаль, что цены на обучение достаточно высокие и не всем по карману, а компании еще не все предлагают своим специалистам бесплатную возможность повышения квалификации.
Знания и опыт сотрудников – это основное благосостояние фирмы. Некоторые руководители считают, что если они набрали хороших специалистов, то не нужно дополнительное обучение, они и так все знают. Это заблуждение, которое становиться очевидным уже через год. ИТ индустрия развивается со скоростью пару лет. Именно за этот промежуток времени, изменяется более 50% технологий. Еще вчера мы думали, что с точки зрения баз данных, клиент-сервер это предел мечтаний, а сегодня уже прошли через многоуровневые системы и переходим на сервис ориентированную архитектуру. Если не двигаться в ногу со временем, то можно застыть во вчерашнем дне и потеряться насовсем. Не знаю как вам, а мне просто необходимо обучение. Я наркоман на новую информацию и если не буду что-то новое читать или изучать, то начнутся ломки. Поэтому моя работа связана с ИТ, ведь здесь информации бездонное море. Как говорил Ленин...
Written by Фленов Михаил aka Horrific WWW: http://flenov.info
SOFT
Быстрее. Еще быстрее! Некоторые люди предпочитают приложения типа «все в одном флаконе», другие не любят отвлекаться и получают только то, что хотят. Именно для вторых данный обзор. Обзор софта, который каждый день помогает получать обратную связь с максимальной скоростью. Горячие клавиши, командная строка, классификация файлов и папок и многомного-много чего еще помогают не то, чтобы ускорить нашу жизнь. Все это помогает сделать ее проще. Ну, загружается просмоторщик графики спустя 5 секунд после клика. Ну, прокручивает страницу Акробат медленнее на 3 десятых…. Онлайновый переводчик прекрасно справляется со своей работой – полминуты максимум и нужное слово в шляпе буфере. Да пускай в день мы проделаем десять, двадцать, сто или тысячу таких операций. Экономия времени будет ни-о-чем. И, вроде, можно на этом сделать exit. А можно просто взглянуть под другим углом. Нередко, находясь полностью погруженным в работе, приходилось отвлекаться. Например, на именование переменной или слоя. Пока открыли браузер, пока ввели урл, пока, пока, пока… Вроде 30 секунд, а темп сбит. И уже приходится перестраиваться, концентрироваться, иногда вспоминать, чего хотел. Звонок коллеге по сотовому телефону: - Петр Ивановчи, посмотрите на сетевом ресурсе скан документа. Это то, что нужно? - Сейчас (открывает фотошопом) Пауза. - (про себя) Блин, $#&X?+_Y, сколько там можно ковыряться?... Прошло две минуты. Звонящего подставили на полтора рубля. Петру Ивановичу Изя это еще припомнит… Когда лучше использовать специализированное приложение только с одной функцией можно привести миллион ситуаций. А два миллиона для ситуаций, когда лучше было бы запустить что-то «потяжелее». Поэтому победу одерживает компромисс. Каждому свое, но в подавляющем большинстве случаев, я предпочитаю разделять софт. Первая, так называемая «read-only» группа, а вторая – что-то, типо, «read-write-deleterecovery-etc». Представляю подборку софта, который запускается множество раз, ежедневно. Для всех категорий пользователей. Текстовый редактор С виду, примитивнейшая вещь, при детальном рассмотрении оказывается просто незаменимой. Блокнот (здесь и далее имеется ввиду не стандартный notepad, а используемый текстовый редактор) – первое приложение, которому «скармливается» файл с неизвестным расширением. Блокнот – это то, чем мы правим «на лету» веб-странички, скрипты, «батники». Блокнот – это то, куда мы записываем сею секундные мысли с последующим размножением текстовых документов на столе. Блокнот – это… Это либо Notepad++, либо EmEditor.
EmEditor Я пользуюсь вторым, зато первый абсолютно бесплатен. http://www.sourceforge.net/projects/notepad-plus/ http://www.emeditor.com/ Просмоторщик графики IrfanView (http://www.irfanview.net/) и без вариантов. Мне нужно моментально открыть картинку. Для всего остального есть Фотошоп.
IrfanView
Графический редактор Все-таки запускать Photoshop не всегда целесообразно. Например, при использовании комбинации «PrtSc» + Сохранить на рабочий стол. Примечание: автору известно про специализированные программы для снятия скриншотов, публикования файлов, виджетов-записулек и так далее. Не стоит придираться к приводимым примерам, ибо область действия рассматриваемых приложений намного шире. С наипростейшими задачами справляется «доле-секундо-стартующий» (win+r+mspaint). Для «неэтовского пэинта» тоже находится работенка.
MS
Paint
Paint.NET (http://www.getpaint.net/redirect/main_hm.html)
PDF-читалка В принципе, можно использовать абсолютно «голый» Adobe Reader. Но я, все-таки, отдаю предпочтение фокситу.
Однажды этот вьюер оказался значительно производительнее продутка от Adobe, что и предрешило его дальнейшую судьбу: ассоциированным приложения для .pdf является именно Foxit. А еще мне нравится, когда документ открывается на том месте, где был закрыт.
Foxit Reader (http://www.foxitsoftware.com/)
Веб-браузер Мое субъективное мнение таково, что «огнелис» все-таки быстрее. Или мне просто так показалось, когда я до этого вовсю пользовался Оперой и Ослом. Но ничто не мешает вам держать на компьютере Opera, IE7 (и его многочисленные надстройки), FireFox, Safari. В принципе, каждый из них соответствует самым высоким стандартам и различия в той же скорости минимальны. Поэтому, выбирайте серфер исходя из своих вкусовых предпочтений. Кстати. На домашней странице «Эппл» с особым пафосом декларируется, что их браузер – самый быстрый. Забавные ребята.
FireFox 3 На подходе восьмая версия IE, а также браузер от Гугл. Посмотрим, что предложат нам гиганты, а пока на моем десктопе привилегированным ярлыком среди себе подобных является Лисичка. Аська Интернет-мессенджеры давно и надолго вошли в нашу жизнь. Как и браузеров, «асек» также превеликое множество: ICQ, QIP, Miranda, Trillan… А ведь еще есть всякие «Гуглтолк», «Мэйлру-агент» и прочие, менее распространенные пейджеры и протоколы. Хоть «Квип» и страшноват… Нет, он не страшноват – в некоторых местах он просто уродец (даже скины не спасают)! Все равно, он невероятно прост, быстр и удобен.
QIP
Огромным плюсом является возможность запускать несколько экземпляров программы одновременно. Переводчик Переводчик – очень удобная и нужная штука. Есть в прямом смысле переводчики, а есть просто словари. Я предпочитаю приложения второй группы и лидером здесь, безусловно, является Babylon.
Babylon Конечно, профессионального, узкоспециализированного софта не осталось. Тот же «Вавилон» может переводить и тексты через онлайн-службу. Но это только плюс. Аудио – видео Где-где, а здесь выбор не то, что гигантский - он неисчерпаемый. Это и специализированные решения, и не очень, и плагины (к тому же IrfanView). Есть гигантские медиа-центры (от Майкрософт или Неро), а есть куча самопала. Многие любят Windows Media за его богатые возможности, я же для аудио предпочитаю Winamp, а для видео – BS Player. Тут опять, дело вкуса и привычки, поэтому ничего советовать не буду. Кстати, если у вас есть проблемные файлы, могу порекомендовать VLC – он крутит все что можно и нельзя.
VLC может проигрывать даже поврежденные файлы Надеюсь, хоть кто-то открыл из этого обзора для домохозяек что-то новое. Но если таковых не найдется – будет еще лучше!
Written by Sergio_Lightning aka Коновалов Сергей E-mail: sergio@devkon.ru
Я сказал крякам «НЕТ!» Не имея возможности выкладывать сотни, а то и тысячи долларов за платный Photoshop или Matcad, мы давно привыкли использовать взломанные версии программ. Найти чудотворное лекарство или кряк можно для всего – и мы ищем! Но вот, что я тебе скажу: «Можно обойтись и без этого!» Все, больше никаких кряков. Только легальные версии! Если не кряк – то как? Я программист и зарабатываю деньги тем, что пишу софт. Каждый раз, когда я вижу крякнутую версию какой-то программы, я думаю: а ведь на ее месте, могла быть и моя разработка. Сразу становится понятно, почему при непременно растущем количестве закачек программы, продажи лицензии идут очень вяло. Досадно! А теперь представь, что программа – это буханка хлеба, которую ты ежедневно покупаешь в магазине. Мысли о том, что ее можно взять бесплатно и выйти из магазина, не оплатив покупку, даже не возникает. Это просто неприемлемо! Так чем же отличается кража буханки от кражи Total Commander’a? По большому счету, ничем! Но если не использовать крякнутые программы, – что делать? Готовить кошелек и бежать за лицензией? Если тебе позволяют финансы, или затраты оплатит компания, в которой ты работаешь, то – да, это вариант! Но лично мне многие продукты пока не по карману, да и вообще, свою заплату предпочитаю тратить на другие вещи. Тем более, я отлично знаю: практически для любого платного продукта есть бесплатная альтернатива, с теми же возможностями, а зачастую и предоставляющая что-то сверх того. Конечно, перейти с полюбившейся программы непросто, а замена на первых порах может показать до раздражения непривычной или дико неудобной. Но это лишь вопрос времени. Вскоре, будь уверен, ты сам будешь удивляться: «Как же я раньше не замечал этой замечательной программы?». Среди огромного количества «альтернативного софта» мы выбрали для тебя самое лучшее. Отсеяли глючные недоделки, откровенных середнячков и пионерские забавы, оставив только качественные продукты, которые используем сами. Начнем? Замена Total Commander’у В качестве файлового менеджера у меня всегда было два любимчика: Total Commander и FAR. Первый нравился за продуманный и удобнейший интерфейс, а второй подкупал своей функциональностью, расширяемой за счет плагинов. FAR всегда был бесплатен для граждан бывших советских республик (а сейчас вообще распространяется с открытыми исходниками), поэтому расставаться с ним не пришлось. А вот для Total Commander’а пришлось поискать достойную замену. Среди большого количества бесплатных файловых менеджеров, удивил Unreal Commander. По сути, это тот же самый Total Commander, только бесплатный. Основные элементы интерфейса, горячие клавиши, функции – все перенято у платного продукта. Более того, авторы реализовали поддержку плагинов Total Commander. Словом, перейти с привычного средства, которым я начинал пользоваться в далеком 2000 году (тогда, еще до наезда со стороны Microsoft, он назывался Windows Commander), оказалось не просто, а очень просто. Если сомневаешься, то взгляни на список основных возможностей:
• • • • • •
Встроенный FTP клиент. Поддержка тем оформления. Работа с архивами. Быстрый поиск файлов. Совместимый формат комментариев с TC. Встроенный вьювер, читающий все: от текста до мультимедийных файлов.
Unreal Commander • • •
URL: x-diesel.com Заменяет: Total Commander Альтернативы: xplorer (www.zabkat.com)
А архивировать чем? Наиболее распространенными архиваторами всегда были ZIP и RAR. Первый я использовал редко, а вот вторым – сделал кучу архивов. Если найти бесплатную альтернативу ZIP не проблема, то с RAR дела обстоят хуже. Тем не менее, альтернатива была найдена – PeaZIP. Этот бесплатный архиватор способен паковать файлы в: 7Z, ARC, BZ2, GZ, PAQ/LPAQ, PEA, QUAD, TAR, UPX, ZIP и распаковывать из ACE, ARJ, CAB, DEB, ISO, LHA, RAR, RPM, , ARC, BZ2, GZ, PAQ/LPAQ, PEA, QUAD, TAR, UPX, ZIP. Думаю, поддержки этих архивов хватит с лихвой. В качестве единственного минуса – нельзя создавать RAR-архивы. PeaZIP • • •
URL: peazip.sourceforge.net Заменяет: WinRAR, WinZip Альтернативы: 7-Zip (www.7-zip.org/ru/)
Пишем болванки Для записи болванок я, как и многие пользователи Windows, всегда использовал Nero Burning Rom. В этой программе реализовано все, что необходимо, и использовать ее – одно удовольствие, жаль только, что дорогое. Погуглив, я отыскал с десяток тулз, предлагающих услуги записи всевозможных дисков. Скачал я их все, но мою любовь завоевала лишь одна – CDBurner XP. Эту программу можно смело назвать качественной заменой Nero. Программа умеет записывать как CD, так и DVD-диски. Очень порадовало, что программа использует свой собственный движок. Например, несколько из протестированных мною тулз простонапросто предоставляли графический интерфейс, а всем остальным занималась Винда. Диски программа записывает отлично. За месяц использования я не закосячил (тьфутьфу!) ни одной болванки. Все диски хорошо писались и читались на разных приводах. В этом есть заслуга встроенной функции проверки записавшейся болванки. Проверка длится минут десять, но по ее результатам становится ясно – оставлять болванку или отправлять в треш. После нескольких дней тестирования я решил снести Nero и пользоваться сугубо CDBurner XP. Правда, один небольшой минус у нового помощника по записи все-таки есть. В момент записи CdBurner XP неплохо отнимает системных ресурсов (в частности, дает нагрузку на ЦП). Nero в этом плане куда скромней!
CDBurner XP • • •
URL: www.cdburnerxp.se Заменяет: Nero Альтернативы: Small CD-Writer (www.avtlab.ru/scdwriter.htm)
Просмотр изображений До XnView программой №1 для просмотра и быстрого редактирования (убрать красные глаза, вырезать ненужную часть фотки) для меня всегда был проверенный временем ACDSee. Переход на XnView поначалу дался тяжеловато. Скажу больше – после недели использования XnView меня разбирало желание вернуться к старому другу, пускай даже крякнутому. Главное, что меня не устраивало в XnView – непривычный интерфейс, сильно отливающийся от того, с чем я имел дело ранее (в последних версиях программы, кстати, он сильно преобразился и стал куда удобнее). Тем не менее, я перетерпел все тягости легальной жизни («Как пафосно!» – прим. Step’а) и теперь могу смело сказать, что XnView стал моим любимым вьювером. В этой небольшой программе реализованы все необходимые мне функции: 1. Разбивка изображений по категориям. Когда откровенно в лом возиться со всякими «красивыми» программами для создания альбомов, лучше этой функции и придумать нельзя. При просмотре изображений достаточно нажать пару кнопок и все, – картинка в соответствующей категории! 2. Поддержка большего количества форматов. В этом плане XnView на несколько шагов впереди платных товарищей. Еще бы, распространяться бесплатно и уметь читать примерно 400 разных графических форматов – большая редкость. 3. Фильтры. Как и полагается подобным программам, XnView имеет стандартный комплект фильтров (шум, размытие, трансформация и т.д.). Для простых манипуляций типового набора эффектов хватит, а когда хочется чего-то большего, – можно воспользоваться внешними фильтрами от Adobe Photoshop. 4. Создание скриншотов. До XnView для создания скриншотов я всегда использовал HyperSnapDX. Теперь пользуюсь только встроенной возможностью в XnView. XnView • • •
URL: www.xnview.org Заменяет: ACDSee Альтернативы: IrfanView (www.irfanview.com)
Работа со схемами Так уж сложилось, что когда нам требуется сделать какую-нибудь схему или диаграмму, мы сразу обращаемся к мощному, но дорогому Microsoft Visio. Продукт действительно достойный, и было бы здорово, если бы компания-разработчик (тем более, такой монстр компьютерной индустрии) бесплатно предоставляла ее, скажем, студентам. Впрочем, многие предпочитают совершенно халявный аналог и уверены, что он ничуть не хуже! Чтобы вступить в наш клуб, достаточно обратиться к услугам небольшой программки Dia. Чудная прога позволяет с легкостью создавать диаграммы различной сложности. В стандартной поставке идет множество готовых для использования графических объектов разной тематики: электрические схемы, компьютерные сети, телефония и т.д. Все созданные диаграммы в Dia можно быстренько экспортировать в один из множества
поддерживаемых форматов (bmp, jpeg, png, vdx, wmf и т.д.) или вывести на плоттере. В общем, программа не раз спасала меня во время подготовки лабораторных и курсовых. Dia • • •
URL: dia-installer.sourceforge.net Заменяет: Microsoft Visio Альтернативы: Inkscape (www.inkscape.org)
Редактор графический Для различных издевательств и сложного редактирования фоток я несколько лет использовал всем известного тяжеловеса – Adobe Photoshop. Это отличная программа, и я до сих пор считаю ее лучшей. Но во время массового уничтожения на винте платного софта мне пришлось потрудиться и поискать бесплатную альтернативу. Достойной замены фотошопу всего две: свежий Paint.NET и проверенный временем The Gimp. На последнем остановлюсь подробнее. С этим редактором я познакомился в Linux. Первое впечатление, которое он на меня произвел – «заморыш». Бежали месяцы, пролетали года… И вот – уродская гусеница превратилась в чудесную бабочку. Так появился The Gimp Show – специальная сборка Gimp в стиле Photoshop. В последней версии этого кросс-платформенного графического пакета разработчики существенно подтянули интерфейс и функционал. Из основных возможностей можно выделить: • • •
•
Большой набор фильтров. Их действительно много! Поддержка плагинов. Плагины позволяют создать из этого редактора настоящего монстра для работы с графикой. Интерфейс в стиле Photoshop. Именно в этой редакции программы разработчики постарались приблизить ее внешний вид к самому известному и популярному средству для рисования. Кросс-платформенность. Если ты не хочешь привязываться к конкретной ОС, то GIMP – точно для тебя. Версии GIMP существуют под многие платформы (Linux, BSD).
The Gimp • • •
URL: www.gimp.org Заменяет: Adobe Photoshop Альтернативы: Paint.NET (www.getpaint.net), Inkscape (www.inkscape.org) для векторной графики
Работаем со звуком Я всегда любил продукты Adobe за их безупречное качество и красивый интерфейс. Помимо Photoshop я активно использовал Audition и Acrobat Reader. С последним – никаких проблем, он бесплатный. А вот за первый просят кругленькую сумму, которой у меня на данный момент просто нет. Зато на своем компьютере я держу Audacity – пожалуй, лучший из бесплатных полупрофессиональных аудио-редакторов. Для моих задач его функций вполне хватает. Продукт поддерживает самые популярные форматы (wav, aif, au, mp3, ogg), позволяет всячески редактировать аудиоматериал, накладывать
многочисленные фильтры, сводить звуковые дорожки и удобно записывать звук (например, подкастов). По функционалу Audacity отстает от своих платных коллег, но его возможностей вполне хватит тем, кто не занимается обработкой звука профессионально. Мне редактировать звук приходится нечасто, а даже если и требуется, то вся процедура сводится к банальной очистке посторонних шумов или простенькому монтажу. С этими задачами Audacity справляется на «отлично»! Audacity • • •
URL: audacity.sourceforge.net Заменяет: Adobe Audition, Sound Forge Альтернативы: mp3DirectCut (mpesch3.de1.cc)
Антивирусы, антивирусы Без антивирусных средств и персонального файрвола в наше время в Сеть лучше не выходить. Стоит только высунуться, как на тебя уже летит рой всякой заразы. До моей «тотальной легализации» на компе душа в душу жили Dr.Web и Outpost Firewall. Обеими программами я пользовался больше пяти лет и успел к ним здорово привыкнуть. Поэтому меня даже посещали мысли раскошелиться на лицензию (благо, за эти продукты просят не сильно много денег), но я все-таки решил поискать бесплатные альтернативы. Не может же быть такого, что никто из программистов не попытался сделать бесплатный антивирь и firewall! Немного побродив по инету, я нашел несколько халявных антивирусов. Больше всех приглянулся Avast! Home. Это платный по своей сущности антивирус, но для некоммерческого использования разработчики отдают его безвозмездно. Чтобы убедиться в работоспособности антивиря, я установил его под виртуальной машиной, вылез из нее же в инет и решил побегать по сайтам с кряками – в надежде подхватить какую-нибудь заразу. Для улучшения улова я заюзал IE шестой версии, славящийся нулевой безопасностью. Не прошло и получаса, Avast! начал орать, как резаный, сообщая о найденной угрозе. Отлично, следовательно, эвристик антивируса был живым и работоспособным. Антивирусный сканер также показал себя с хорошей стороны. Все подсунутые вирусы были найдены и обезврежены. После проведенных тестов Avast! перекочевал из виртуальной машины в рабочую ОС и живет тут до сих пор, не забывая регулярно обновляться. Avast! Home • • •
URL: www.avast.com Заменяет: Антивирус Касперского, NOD32, Dr.Web и прочие Альтернативы: Avira AntiVir (www.free-av.com), avast! Home Edition (avast.ru)
Файрвол Поиск альтернативы для моего любимого Outpost был весьма нелегким. Бесплатных персональных файрволов мне попалось всего четыре штуки, из которых три осеклись сразу, так как качества и стабильности в работе у них не наблюдалось. Я уже было
подумал, что нормального такого продукта не найти, как вдруг Гугл вывел меня на comodo.com, где я и познакомился с будущим другом. Comodo Personal Firewall – не просто персональный брандмауэр. Это настоящий центр обеспечения безопасности. Он ничуть не хуже Outpost обеспечивает защищенность твоего пребывания в Сети и обустроит локальную безопасность с помощью хорошо продуманной проактивной защиты и наличия антивирусного сканера. Компоненты CPF очень гибки в настройке, поэтому все можно подогнать максимум под себя. Из ключевых возможностей стоит отметить: • • • •
Качественный сетевой экран. Гибкая в настройке проактивная защита. Быстрый и качественный AadvWare/SpyWare-сканер. Хорошая конфигурация защиты в целом.
Comodo Personal Firewall PRO • • •
URL: comodo.com Заменяет: Agnitum Outpost Альтернативы: нет
Шифрование данных Конфиденциальные данные я всегда хранил на защищенном диске, созданном в программе PrivateDisk. Среди бесплатных альтернатив я обратил внимание на утилиту TrueCrypt. Она также позволяет создать защищенный контейнер, который может быть смонтирован в системе и использоваться, как обычный диск. TrueCrypt позволяет самостоятельно выбрать алгоритм шифрования для создаваемого контейнера. Из алгоритмов к твоим услугам: AES, Serpent, Two fish, AES-two fish и т.д. Помимо создания защищенных контейнеров, TrueCrypt, как и PrivateDisk, может создать защищенный раздел на флешке или просто зашифровать целиком раздел жесткого диска. TrueCrypt • • •
URL: truecrypt.org Заменяет: PrivateDisk, BestCrypt Альтернативы: нет
Бесплатному софту – «Да!» Как видишь, вовсе необязательно юзать платный софт. Даже под Windows существует множество бесплатных программ. Надо только потратить чуточку времени на их поиски, после чего спокойно работать и забыть о кряках. Не думай, что приведенные в статье программы – это предел и у них нет альтернатив. Есть, и много, поэтому если тебе не понравился предложенный мной вариант, то просто загляни на наш DVD и ты увидишь большую подборку программ, про которые я не упоминал. Полная халява Если ты не хочешь платить ни за ОС, ни за софт и в тоже время не испытывать угрызений совести, то обрати внимание на дружественную версию Linux’a – Ubuntu. Из всех
дистрибутивов пингвина – это, пожалуй, самый дружелюбный и простой в обучении. Графическая оболочка KDE/GNOME и входящие в нее программы уже сразу после установки позволяют приступить к выполнению типичных задач. И заметь – все это совершенно бесплатно! Бесплатный софт одной строкой ГРАФИКА • • • • •
Inkscape (www.inkscape.org). Векторный редактор. GIMP (www.gimp.org). Растровый редактор. blender (www.blender3d.org). Студия 3D-моделирования. dia (www.gnome.org/projects/dia). Редактор диаграмм, графиков и схем. IrfanView (www.irfanview.com). Просмотрщик картинок.
МУЛЬТИМЕДИА • • • • • •
Traverso DAW (www.traverso-daw.org). Многоканальный звуковой редактор. AIMP2 (www.aimp.ru). Удобный и красивый аудиоплеер. GX::Transcoder (www.germanixtranscoder.de). Конвертации аудио и видео файлов. VLC (www.videolan.org/vlc). Медиаплеер. VirtualDub (www.virtualdub.org). Легендарный видеоредактор. Audacity (audacity.sourceforge.net). Простое средство для записи и редактирования звука.
АНТИВИРУСЫ И БРЭНДМАУЭРЫ • • • • • • •
ClamWin (ru.clamwin.com). Свободный антивирусный сканер. avast! Home Edition (avast.ru). Антивирусный пакет. Comodo AntiVirus (www.antivirus.comodo.com). Полноценный антивирус. Comodo FireWall (www.personalfirewall.comodo.com). Брандмауэр. AVZ (www.z-oleg.com/secur/avz). Полуавтоматический антивирус. Avira (free-av.de). Известнейший антивирус. Ashampoo Firewall (www.ashampoo.com). Компактный файрвол.
ИНТЕРНЕТ • •
Mozilla Firefox (www.mozilla.ru). Расширяемый браузер. Opera (www.opera.com). Быстрый и безопасный браузер.
ФАЙЛОВЫЕ МЕНЕДЖЕРЫ • •
freeCommander (www.freecommander.com). Двухпанельный файловый менеджер. xplorer2 (zabkat.com/x2lite.htm). Файловый менеджер.
ТЕКСТОВЫЕ РЕДАКТОРЫ И ПРОЦЕССОРЫ • • • •
OpenOffice.org (ru.openoffice.org). Альтернатива Microsoft Office. Abiword (www.abisource.com). Свободный текстовый процессор. PDFCreator (www.pdfforge.org). Создание PDF из любого приложения. Eclipse (www.eclipse.org). Многофункциональная IDE для разработчиков.
•
Notepad++ (notepad-plus.sourceforge.net). Бесплатный редактор текстовых файлов.
РАБОТА С ДИСКАМИ • • •
DeepBurner Free (www.deepburner.com). Программа для записи CD и DVD-дисков. Small CD-Writer (www.avtlab.ru). Быстрая запись дисков. CDex (cdexos.sourceforge.net). Оцифровка аудио-CD.
Written by Антонов Игорь aka Spider_NET E-mail: antonov.igor@live.ru
Профессиональные инсталяторы Наличие удобного инсталлятора – одно из главных требований к программному продукту, созданного для платформы Windows. Рынок программного обеспечения предлагает богатый выбор решений для создания профессиональных инсталляторов. Про наиболее популярные и известные программы данного типа мы расскажем в этой статье. Зачем необходим инсталлятор Инсталлятор, прежде всего, нужен для комфортного развертывания программного продукта. Пользователи, использующие, в качестве операционной системы Windows привыкли, что все необходимые действия для правильной установки программы берет на себя инсталлятор представленный в виде мастера. В таких случаях все, что требуется от пользователя – это следовать рекомендациям мастера установки. Таким образом, действия для установки ПО со стороны пользователя минимальны. Чем проще установка и использование программы, тем выше вероятность ее покупки. Программист должен возложить на инсталлятор всю рутинную работу, которая может отпугнуть пользователя от использования программы. Например, если вашей программе требуется наличие в системе нестандартных компонентов, библиотек, то вовсе ненужно возлагать на пользователя их установку, регистрацию и подобных действий. Чем больше будет требоваться действий от пользователя, тем меньше пользователей будут соглашаться их выполнять. Для примера взглянем на продукты от компании Microsoft. Любой из них снабжен отличным мастером установки (инсталлятором), который требует от пользователя совершить лишь пару кликов мышкой, а не ломать голову над редактированием конфигурационных файлов или еще чего. Install Shield 2008 http://www.installshield.com/ Shareware Install Shield идеально подходит для создания простых и сверх сложных инсталляций. Разработчики снабдили свое творение всем необходимым: от типичной функции расположения файлов проекта в файловой системе и создании ярлыков запуска, до возможности создания защищенных инсталляций (необходимостью ввода лицензионных ключей и т.д.). Большая функциональность и универсальность этого продукта, сделало его главным инструментом для создания инсталляторов таких компаний как: Borland, Adobe, Corel, ABBY и т.д.
Рис.1 (Главное окно программы) Ключевые возможности
1. Тест на соответствие системным требованиям. Не нужно полагаться, что у пользователя скачавшего вашего программу, системные требования идеально подходят для ее работы. Чтобы не разочаровать пользователя неработоспособностью программы или хуже того испортить ему ОС, лучше поручить инсталлятору, все проверить до начала установки. Проверке можно подвергнуть: тип процессора, объем ОЗУ, версию ОС, наличие установленных программ и т.д. 2. Создание нескольких вариантов установки. Профессиональная программа должна поддерживать минимум два типа установки: Выборочная и Типичная. В IS можно без проблем сделать разные сценарии установки. 3. Создание ярлыков. Ярлыки на запуск установленной программы можно создать в любом месте (Рабочий стол, Меню Пуск и т.д.). 4. Взаимодействие с реестром. На этапе установки можно вносить в реестр, все необходимые. На этапе конфигурирования инсталлятора вы можете экспортировать в инсталлятор целых ветки реестра. Таким образом подогнать реестр системы разработчика и пользователя не составит труда. 5. Включение в инсталлятор ODBC драйверов. При распространении программ работающих с базами данных нельзя быть до конца уверенным, что в системе конечного пользователя будут присутствовать все необходимые драйвера для доступа к данным (сразу хочется вспомнить извечные проблемы с BDE). Поэтому лучше перестраховаться и включить все драйвера в инсталлятор. Хоть такой шаг и увеличит размер вашего проекта, зато создаст гарантию, что пользователь сможет работать с вашим приложением.
Рис.2 (Экспорт драйверов ODBC) 6. Создание конфигурационных файлов настроек. Когда для хранения настроек программы используются ini файлы (конфигурационные файлы), то после установки приложения желательно сразу создавать конфиг с настройками по умолчанию. 7. Создания переменных среды. 8. Создания/Изменения файлов в формате XML. 9. Установка прав. Достаточно полезная функция для распространения программы в корпоративных сетях, когда требуется ограничить возможность использования программы определенным пользователям домена. Разобраться с этими нюансами можно на этапе установки Главный минус собственного инсталлятора 10. Поставка дополнительных компонентов. Когда программе требуются какие-то Требуется лишнее время на вашей нестандартные библиотеки/компоненты, лучше не разработку. Разработав проект, вам потребуется потратить не мало надеяться, что пользователь их скачает сам, проще времени на написание еще одной включить их в инсталлятор. программы – собственного инсталлятора. Таким образом, вам 11. Поддержка мобильных устройств. IS имеет все для создания инсталлятора приходится сосредотачиваться необходимое программы для мобильных устройств, работающих сразу на двух «продуктах». под PalmOS или Windows Mobile. Также как и при создании обычных инсталляций, вам доступны все необходимые функции (взаимодействие с реестром мобильной ОС, создание ярлыков, установка DLL, проверка и поставках необходимых компонент и т.д.). 12. Создание Trialware. В IS можно реализовать возможность ограниченного времени использования вашей программы. Другими словами, можно не изобретать самостоятельно ограничители использования вашей программы, а все сделать средствами IS. Доступно несколько вариантов ограничений: количество дней, наступление указанной даты.
13. Взаимодействие с серверными приложениями. Эта возможность особенно пригождается, когда создается инсталлятор для программы, которая взаимодействует с серверными компонентами (сервером баз данных, web-сервером). Данная функция позволяет: выполнить скрипт на языке SQL (поддерживаются следующие сервера БД: MS SQL Server, Oracle, MySQL), установить компонент для ISS (Internet Information Services) и т.д. 14. MSI и EXE. Install Shield одинаково хорошо создает как MSI инсталляторы, пригодные для распространения через групповые политики AD, так и стандартные EXE. 15. Интерфейс. Для создания неповторимого внешнего вида будущего инсталлятора, в IS встроен удобный редактор диалоговых окон. С его помощью легко изменять все диалоговые окно, которые пользователь увидит во время работы мастера установки. 16. Встроенный сканер поиска зависимых компонент. Чтобы не ошибиться с включением в инсталлятор тех или иных компонент, в IS встроен сканер зависимостей. Он позволяет определить какие библиотеки, компоненты требуются для корректной работы вашего приложения. 17. Отладчик MSI. IS мощная многофункциональная система для создания инсталляций, а чем больше возможностей, тем в них проще запутаться и допустить ошибку. Для решения подобных проблем в IS есть полноценный MSI отладчик. Вердикт
Отличный пакет для создания действительно профессиональных инсталляций. Благодаря обилию функций, любой программист останется доволен. Разработчики постарались на славу и снабдили свой пакет всеми необходимыми инструментам. Жаль только, что цена продукта достаточно высока, поэтому потенциальными потребителями будут лишь крупные компании.
Рис. 3 (Редактор интерфейса диалоговых окон) Smart Install Maker http://www.sminstall.com/ Shareware Smart Install Maker – построить инсталляторов, разработанный российскими разработчиками. По сравнению с Install Shield, эта программка кажется «малюткой», тем не менее ее функциональных возможностей хватит для создания инсталляций к большинству проектов. Ключевые возможности:
1. Проверка на соответствие системным требованиям. В инсталлятор можно встроить проверку: ОС, версии MS Framework. 2. Взаимодействие с реестром. В программе предусмотрена возможность взаимодействия созданного инсталлятора с реестром Windows. Для работы доступны абсолютно все ключи: HKCR, HKCU, HKLM, KHU, HKPD, HKCC, HKDD.
Рис. 4 (Главное окно Smart Install Maker) 3. Выполнение команд. Во время работы инсталлятора можно выполнять любые команды в ОС (команды CMD, запуск программ с параметрами). Отличительной особенностью является настраивать время выполнения команд: непосредственно до установки или после. 4. Работа с конфигурационными файлами. 5. Регистрация ActiveX компонентов. Технология ActiveX знаменита своими проблемами с переносом на другой ПК. SIM позволяет регистрировать используемые в вашем проекте компоненты ActiveX и разрегистрировать их после удаления вашей программы. 6. Перенос шрифтов. Если в своей программе вы используете нестандартный шрифт, то SIM поможет корректно перенести его на ОС будущего пользователя. 7. Создание переменных среды. 8. Регистрация расширений. На этапе установки вы можете зарегистрировать расширение, которое будет ассоциироваться с вашей программой. 9. Размещение ярлыков. 10. Разбиение инсталлятора на части. Эта возможность становится актуальной, когда ваш проект имеет достаточно большой размер и вам требуется его поставлять, скажем, на FDD. В этом случае, SIM сможет создать инсталлятор, который будет поочередно просить у пользователя вставить следующую дискету.
Вердикт
Small Install Maiker, подойдет для создания стандартных инсталляторов. Низкая цена и неплохие функциональные возможности. Если требуется быстренько создать инсталлятор, то мы советуем обратить внимание именно в сторону SIM, ну а для больших проектов лучше воспользоваться пакетом типа Install Shield.
Рис. 5 (Работа с реестром) Advanced Installer 6.0.1 www.advancedinstaller.com Freeware/Shareware Разработчики этого install builder’a, наверное хотели сделать свое «детище» похожим на мощный Install Shield. По-другому и быть не может, ведь в своем продукте они реализовали большинство функций, которые есть у старшего брата – IS. Перед тем как перейти к рассмотрению функциональных возможностей хотелось бы обратить ваше внимание на условия распространения этого продукта. Авторы сразу предлагают два типа: платный и бесплатный. Нужен весь набор функций – тогда придется раскошелиться, а если программа нужна для создания простого проекта, то и не нужно платить. Ключевые возможности: 1. Проверка на соответствие системным требованиям. Проверке может подвергаться: ОС, версия установленного Windows Installer, IE, ISS, .NET Framework, разрешение экрана, экранная палитра, ОЗУ, наличие прав администратора, наличие установленных программ, тип процессора и т.д. Возможностей для проверке просто масса.
Рис. 6 (Создание проекта в Advanced Installer) 2. Размещение файлов проекта. Для размещения файлов проекта доступно любое место в ОС пользователя. 3. Создания инсталляторов, для развертывания Java. 4. Взаимодействие с реестром. 5. Поддержка создания EXE и MSI инсталляторов. 6. Регистрация расширений. 7. Корректная работа инсталляторов в 64-х разрядных версиях Windows. 8. Создание инсталляторов, для программ, являющимися службами. 9. Включение в инсталляционный пакет драйверов ODBC. 10. Регистрация объектов COM+, DCOM и т.д. 11. Полный контроль над пользовательским интерфейсом. Все диалоги доступны для редактирования. Реализована возможность выбора тем, языка и т.д. 12. Создание cpl аплетов. После завершения работы инсталлятора, в «Панель управления», создастся ярлык для запуска установленного приложения. 13. Установка после проверки серийного номера. Серийные номера можно вставлять как свои, так и подготовить возможностями AI на этапе сборки проекта. 14. Небольшое увеличение размера конечного результата. Вердикт
Когда нужна мощь и не нужен излишний функционал Install Shield, то Advanced Installer будет хорошим выбором. В этом пакете реализованы все необходимые функции и некоторые из них, можно использовать совершенно бесплатно. Не попали в обзор 1. GkWare (www.gkware.com) – shareware генератор инсталляторов со стандартными возможностями для этого класса программ (создание ключей в реестре, запуск файлов, создания MSI инсталляторов и т.д.). 2. Emco MSI Package Builder (www.emco.is) – платный построитель MSI инсталляторов. В отличии от многих программ подобного типа, данная программа специализируется лишь на создании MSI инсталляторов. Основной отличительной особенностью данной программы является не сильно разбухающей размер конечного результата. 3. Inno Setup Compiler (www.innosetup.com) – полностью бесплатный и распространяемый с исходными кодами построитель инсталляторов. Подходит для создания инсталляторов не требующих особой сложности. 4. Nullsoft Install System (http://nsis.sourceforge.net/Main_Page) – мощная, opensource система для сборки профессиональных инсталляторов. По функциональным возможностям ее можно сравнить с Install Shield или Advanced Installer. Заключение Программ для создания профессиональных инсталляторов создано предостаточно, сегодняшний обзор лишнее тому подтверждение. Тем немее, выделить абсолютно «лузера» или «чемпиона» невозможно. Все программы обладают необходимым функционалом для создания инсталляторов. Выбор конкретного продукта будет зависеть от многих нюансов, которые для каждого проекта индивидуальны. Например, шароварщикам или программистам, которые создают софт для распространения внутри компании, по душе должны прийтись Small Install Maker или даже бесплатный вариант Advanced Installer. Ну, а разработчикам, которым нужна универсальность и гибкость должны заинтересоваться в мощи Install Shield или платной версии Install Shield. Возможность Проверка соответствия системным требованиям Создание ярлыков Взаимодействие с реестром Перенос драйверов для ODBC Добавление переменных среды Установка прав Построение MSI Построение EXE Создание изменение конфигурационных
+ (10)
InstallShield 2008
Small Install Maker + (5)
Advanced Installer + (7)
+ +
+ +
+ +
+
-
+
+
+
+
+ + + +
+ +
+ + -
файлов Регистрация сервисов Регистрация COM/ActiveX Выполнение команд во время работы инсталлятора Добавление cpl аплетов Взаимодействие с серверными компонентами Создание защищенных инсталляторов Настройка диалогов Поддержка нескольких языков Инсталлятор для Java Бесплатные версии Регистрация расширений
+ +
+
+ +
+
+
+
+ (10)
-
+ + (5)
+ (10)
+ (2)
+ (8)
+ (10) +
+ (2) +
+ (8) +
+ + Таблица 1 (Сравнение возможностей.)
+ + +
*** Число в скобках – оценка по десяти бальной шкале за возможность. +- поддержка/отсутствие возможности. Вопросы экспертам: 1. Какой пакет для создания инсталляций вы используете? Чем обусловлен Ваш выбор? 2. В каких случаях лучше прибегнуть к использованию профессионального пакета для создания инсталляций? Михаил Фленов
Профессиональный программист, автор книг по программированию, создатель сайта www.vr-online.ru. 1. Я не пользуюсь готовыми решениями. Просто написал свою небольшую программку. Почему? Не вижу смысла отдавать деньги за пакеты, которые стоят недешево, и не оправдывают вложенные деньги. Конечно, если использовать все функции пакетов, то деньги будут оправданы, но мне нужно только три функции - создание архивного пакета в виде одного файла, возможность установки файлов в нужное место и создание ярлыков. Нарушать лицензию я не люблю, поэтому вариант с использованием нелегального пакета я даже не рассматривал. Поэтому потратил немного времени на написание заготовки, которую и использую. 2. В любом случае. Если нужно быстро собрать пакет, а наработок нет, то можно купить инсталляционный пакет или использовать что-то из бесплатного. Благо такие программы существуют и доступны в изобилии. Программы класса InstallShield умеют практически все, что может понадобиться даже изысканному программисту, использующему самые экзотические вещи. К тому же, это отличное решение для установки такой бездарной технологии как ActiveX. Вы когда-нибудь пытались зарегистрировать в системе ActiveX без использования regsrv или других сторонних утилит?
Андрей Шкрыль
Профессиональный программист, автор 4-х книг 1. NSIS (Nullsoft Scriptable Install System). NSIS позволяет создавать инсталляторы программ для Windows, которые умеют инсталлировать, деинсталлировать, изменять настройки системы, распаковывать файлы. Можно выбирать метод компрессии файлов упакованных в дистрибутив, а также язык инсталлятора. Реализована поддержка языка сценариев. Стоит отметить, что с помощью данного пакета были созданы инсталляторы для Winamp, Emule, Mozilla Firefox, Miranda. Данный выбор обусловлен также тем, что пакет распространяется с открытыми исходными кодами. 2. В каких случаях лучше прибегнуть к использовании профессионального пакета для создания инсталяций? Понятие "профессиональный инсталлятор", на мой взгляд, субъективное, ведь при наличии достаточного опыта разработчик может написать инсталлятор специально под свою задачу. Я считаю, что прибегать к инсталлятору нужно всегда если программа делается не для себя, а рассчитана на некоторое количество людей. Это не только правило хорошего тона, но и забота о пользователе, а также профессиональный подход к дальнейшему продвижению своей программы.
Written by Антонов Игорь aka Spider_NET E-mail: antonov.igor@live.ru
В доступе отказано Вы учитесь в школе, университете, либо просто на работе есть халявный Интернет, но некоторые сайты заблокированы, в адресе запрещены слова (sex, mp3 и т.п.), а размер скачиваемого файла ограничен. Знакомые проблемы, не так ли? Пришло время узнать, как разобраться с ними раз и навсегда! Ключ от всех дверей Если в вашей сети руководствуются принципом «разрешено все, что не запрещено», то считайте, что вам разрешено все! Существуют так называемые CGI-Proxy или анонимайзеры. Для простого обывателя - это обычная веб-страничка, с одинокой кнопкой и полем ввода. В текстовый элемент управления вы вводите забаненный урл и… вуаля, оказываетесь на нужном сайте. Меньше слово, больше дела. Набираем в браузере www.proxy7.com (можно не набирать – данный прокси умер уже давно) и смотрим: кроме рекламы различного характера в центре присутствуют необходимые контролы. Вводим нужный адрес и через некоторое время лицезреем залоченный портал.
Как это работает? Сервер, через который вы обращаетесь, скачивает запрашиваемую страницу к себе, правит ссылки и загружает объекты (картинки, flash и т.д.). На выходе получается примерно такая ссылка: http://www.cgi-proxy.com/http/www.vr-online.ru. Если поддерживается шифрование, то адрес в браузере будет выглядеть как-то так: http://www.cgi-proxy.com/dsf234SDF22fhtdfxcvvv3 - а теперь попробуй, определи, что это не ссылка на порнографию! В настройках (см. скриншот) можно отключить скрипты, «плюшки», шифровать URL и еще много чего – все зависит от конкретного веб-прокси. CGI proxy регулярно падают. С такой же регулярностью появляются все новые и новые. Поэтому я не привожу ссылок – на момент прочтения они 100% будут неактуальны.
И еще, не стоит забывать, что вместо вашего ip, в журнал попадет адрес сервера фанатикам анонимности посвящается (хотя все, опять же, зависит от конкретного вебпрокси, который тоже ведет логи). Существует ряд проблем, связанных как с конкретным прокси, так и общей технологией. Например, некоторые не грузят картинки, другие работают через день. Самой главной, пожалуй, является некорректное отображение части ресурсов, из-за невозможности «переделать их под себя» (то есть модифицировать Flash или ява-скрипты). Кстати, я уже не говорю о том, что скорость доступа к запрашиваемому ресурсу падает в разы. Но все же лучше, чем ничего. Напоследок, все что можно и нельзя узнать о прокси-серверах, находится здесь: http://www.freeproxy.ru. Качать – не перекачать Теперь разберемся с ограничением на скачиваемый файл. Если естественным путем это сделать не удается, воспользуемся сервисом www.getfirelink.net. Зарегистрировавшись, абсолютно бесплатно мы можем, указав путь, загрузить на сервер файлы размером до 100 метров. После этого у них же его разбить на доступные по весу для скачивания части.
А можно сделать еще круче: если ваш провайдер сделал вам подарок в виде персонального почтового ящика, трафик при скачке инфы с которого не учитывается, то можно отправлять файлы прямо на него, экономя драгоценные метры! Конечно, за бесплатность нужно расплачиваться: иногда часами приходится ждать нужные файлы, размер ограничен (хотя ничто не мешает вам заплатить сделать
пожертвование), редкие, но все же, перебои в работе. С каждым днем популярность растет, а это приводит к нагрузке на сервера. И что дальше – не известно. Проблемы у владельца уже были, но хочется пожелать ему удачи (к сожалению, ресурс благополучно загнулся, но шанс, что когда-нибудь воскреснет - есть – прим. автора, в очередной раз приводящего статью к актуальности). Лучше «файерлинка» я пока ничего не видел. Даже нет смысла давать ссылки на платные порталы. Но на всякий случай приведу еще один альтернативный ресурс. Traffic compressor - отправка только на e-mail, бесплатно файлы размером не более 10 мегабайт, 5 минут перерыв между запросами - ну разве это конкурент? Особенно если есть такая прекрасная штука, как веб-прокси. ICQ В настоящий момент сервисы в интернете продублировали все, что только можно. Аська в этом числе. Несмотря на то, что официальный сайт позволяет общаться через браузер, лично мне больше симпатичен другой ресурс – www.meebo.com.
Как видно на рисунке, сервис предоставляет доступ не только к ICQ. Вконтакте у одноклассников В моем университете расходы только на эти две социальные сети в месяц были больше ста тысяч! Неудивительно, что после декларации потраченного трафика их заблокировали. Учитывая популярность сайтов и такую же популярность администраторов сетей их блокировать (в том числе и зеркала), ответ народных умельцев не заставил себя долго ждать. Zapretanet.ru – один из лучших способов оставить админов в дураках.
Конечно же, не могу не дать корректно работающий с сабжевыми ресурсами прокси http://thethirtytwo.com/cgiproxy/nph-proxy.cgi. Но ведь к моменту публикации, умрет же, зараза!
Written by Коновалов Сергей aka Sergio_Lightning E-mail: sergio@devkon.ru
Креатиff
Мнимая вечность Глава 0. Вступление Не знаем тайны мы вселенной, Не думаем, что мы одни, А строим мифы мы не ленно, О том, что явно есть ОНИ. Во вселенной много звезд, звездных систем. Представим на секунду, что можно достичь их все! Какие тогда тайны откроются перед нами, далеко не простыми хомо – сапиенсами. Этот рассказ как раз и повествует о событиях на одной очень – очень далекой планете в другой вселенной, с другими законами физики. Где есть бога, где существует магия, где пятый постулат Евклидовой геометрии, о том, что через прямую и точку, не лежащую на ней, можно провести прямую, параллельную данной, и только одну - недействителен, а при скорости света, которая здесь иная, которая, кстати, здесь достижима, длина тела не становиться равной нулю, его масса не предстает бесконечной, и время для него не останавливается. ))) Этот рассказ, конечно, не о математике, не о физике, а о простой вечности, которая недоказуема, ибо нельзя отрицать чье – либо отсутствие, можно только подтвердить присутствие.
Глава 1. Начало великого конца Когда настал конец пути, Ты в новый сильно не гони, Дождись пока черед идти, И тут уж ты не потони. Гра – Ургак правил третью сотню лет. За это время столица Кромагра, бессмертная столица независимого объединения орочих земель Мораны, подвергалась ожесточенным нападениям воинственных Морра, которые выжигали целые деревни орков, уничтожали доблестное население бессмертного вида. Они не жалели никого. Орки, как могли, защищали свои земли. Все было тщетно. Они, физически намного более крепкие, чем морра, уступали им по ряду параметров: организованности, сплоченности и ратному духу. Вождь морра - Кайн III, сын легендарного полководца – Кайна II Непобедимого, ненавидел орков и поклялся на могиле отца истребить всех этих «отродьев ада» и стать полноправным правителем неразделенных земель Трипонии. - Просыпайся, Ургак, просыпайся, - усердно тряс своего правителя воевода Мораны, правая рука Ургака, Гра – Магок, - Кайн опять напал на Сараду, на этот раз, боюсь, не выстоит! Ургак в мгновение ока схватил своего воеводу за тунику, верхнюю одежду орочей знати, и подставил нож к самому его горлу. - Эй, эй, ээээй, это же я – Уграк, твой воевода, - жалобно вопил он, - Ну и что, что я принес плохую весть, это же не значит, что ты меня должен убивать… верно?.. - Ох, извини, последнее время меня стали посещать кошмары, мне грезится во сне, буд – то за мной кто - то постоянно наблюдает. Я уже перестал нормально спать. Даже не помню, когда я в последний раз был бодрым и свежим. У меня такое предчувствие, что все скоро измениться. Будто сам дьявол следит за мной. - Ничего, ничего, ты главное больше спи, отдыхай… Да, Ургак, а почему бы тебе… не убрать нож от моего горла? - Еще раз извини, - царь убирает нож и вкладывает его в свои золоченые ножны. - Так то лучше… Ургак, ты не попытаешься еще раз меня убить, если я повторю свою новость: «МОРРА НАПАЛИ НА САРАДУ!». - Ах ты черт! Опять этот выскочка покушается на мою империю! Он уничтожает мои города, убивает моих подданых, сжигает мой авторитет, а я не могу даже посмотреть ему в глаза! Он не хочет переговоров, не стермиться прекратить эту бессмысленную вражду! Я вырву его проклятое серце и заставлю съесть его! - Я понимаю твой гнев, он праведен, Кайн понесет еще свое наказание, и как я хочу, чтоб – бы это случилось как можно скорее. Но… мой дорогой друг, сейчас не врямя для угроз и обид – идет война, война, после которой останется единственный вид, и как я хочу, чтобы это были мы!
- Да, да, конечно, давай уже, рассказывай, как обстоят дела в Сараде? - Комендант Зри – Магок доложил, что тяжелые пешие отряды морра окружили Сараду. В городе с последнего восстания почти не осталось провизии и оружия. Половина населения перебита твоими же «дружинниками», подавляющими восстание. Город находится в пустынной местности, и помощь должна будет уничтожить всю армию Кайна, чтобы снять осаждающих! Молчание… - (тихо под нос) Он за все мне ответит… (Громко) Так пошли же ты на него, наконец, армию, Гра – Магок, убей его, и пусть его голова будет висеть на воротах нашей славной столицы, прямо напротив моего окна! - Ты думаешь, мой великий царь, что я не сделал бы этого сам?! У нас нет армии! Вся армия уничтожена в битве под Старлицем, когда Кайн призвал на помощь этих огромных Огров! Или ты забыл, как мы спасались с поля боя бегством, под рев ужасных тварей?! - Агггррр! Да будет проклят тот день, когда я надел эту корону! Мой предок, Гра – Мурон, основал эту империю. Он передал мне бразды правления, когда сам уже уходил из жизни. В тот день, в день его ухода, радовались лишь морра, наши заклятые враги. Он лично короновал меня новым императором и велел сбереч империю, сделать ее более процветающей и могущественной. Я, похоже, вдалеке от его указаний… я потерпел поражение… морра разоряют наши города… мои же подданые не любят меня… многие уже собираются поднять восстание… Не удивлюсь, если пограничные города уже предали меня и перешли на сторону врага… Объединенные же племена Кайна процветают. Да, настало то время, когда во всем мире меняются властители. Старая власть склоняется перед новой, сильной и дерзкой, способной на отчаянные подвиги. Мы, орки, существовали в Трипонии несколько десятком миллиардов лет. Нас создал Бессмертный огонь из подножия Великой Орочей скалы. Мы появились сразу разумными существами, не проходили стадии развития, существовали все врямя, когда существовала наша планета. Но, единственное, чего не даровал нам Бессмертный огонь – способности к эволюции. Мы остались такими же, какими были наши предки. Каждый новый рожденный орк – это не продолжение предыдущего, - это начало нового. Да, у нас было время, мы могли создать мощнейшую цивилизацию, подчинить и управлять всеми существующими видами, создать нечто совершенное, что стало бы началом создания абсолютного… - Извини, что перебиваю тебя, Ургак, я поминаю, ты – философ, каких нужно поискать, твое видение отличается от видения большинства других наших прекрасных братьев, ты видешь проблему от ее зарождения, а не поверхностно. Вот почему Гра – Мурон и выбрал тебя. Все, что мы сейчас можем сделать – это лишь попытаться сохранить наш великий вид в борьбе с врагом. Мы не должны пессимизировать текущую обстановку, - она и так практически безнадежна. Наша главная задача сейчас – это выжить. Ведь нельзя стереть с лица Трипонии то, что она создала с теким тщанием.
- Ты, как всегда, прав, мой друг, мы не должны поддаваться настроениям, которые навевает нам наш враг. Все что нам нужно сейчас – это с минимальными потерями откинуть морра назад и восстановить империю: повесить предателей, поправить демографию и вырастить новую армию для новой битвы. - Так давай указаний, Гра – Ургак, прикажи мне реализовать новый план нашего спасения! Мы выполним его с такой точностью, с какой неспособно Яркое Светило вставать каждый день и скрываться каждую ночь! - Приказываю Продолжение следует…
Written by CLS E-mail:
"Без ограничений" Everybody’s going to the party Have a real good time, Dancing in the desert Blowing up the sunshine.
- На мой взгляд, самый лучший чай - это заваренный в специальном чайничке. Причём, чайничек должен быть обязательно фарфоровым и с высоким носиком. Металлический, конечно же, допустим, но со временем он имеет тенденцию ржаветь, а также чай потихоньку накапливается на его стенках. Так уж повелось - металлическую поверхность, особенно внутри, не делают достаточно гладкой. Кому как, но эти старые слои влияют на вкус чая нового. Что уж говорить про деревянные чайнички. Конечно, есть круг людей, которые предпочитают деревянную посуду, ссылаясь на то, что без неё еда или напитки теряют свой вкус. Не спорю, так как дерево даёт свой привкус, то без него вкус у еды будет другим… у напитков тоже. Впрочем, как я уже сказал, самый лучший чай - это тот самый, первый, без привкусов и добавок. То есть, лимон, сахар, мёд, варенье - это вкусно, но это уже не чай, это уже лимон, сахар, мёд, варенье с чаем. Для получения чая, кроме, собственно, хорошего чая и фарфоровой посуды, надо ещё соблюсти некий ритуал. Я делаю это так: заливаю чай кипятком на 2-3 минуты, после чего переливаю чай в чистую посуду и быстро прячу его в прохладное место типа погреба или холодильника. Так он не теряет свой вкус. Если у вас есть место, где прохладно, и где не хранится чего-нибудь пахучее, то лучше поставьте чай туда. Отдаёт в голове до сих пор. Он бредил, у него был жар. С утра ему стало плохо - тошнота, озноб, температура повышалась, слабость во всём теле. Было похоже на отравление, впрочем. - Ну ладно, ещё месяц подзаработаю, а потом… Ну да, я материалист, и что с того? ***** Да что они там всё время говорят? За окном было пасмурно и темно, всё небо было грязного серого цвета с прорехами, солнце с утра так и не показалось. Но дождь всё не шёл и не шёл. Автобус мерно урчал двигателем, по ногам дул тёплый воздух из обогревателя. Неторопливо катясь по маршруту, неторопливо открывая двери на остановках, чтобы в них ворвался прохладный уличный воздух… он только будит ото сна, заставляет чуть приподнять веки, но не более. Всё равно двери закроются, и я снова начну засыпать, положив голову на плечо. Мир ленился сегодня, ну или мне так казалось. - Витя! Витя! Витя, мальчик мой! - пробежала мимо полная женщина в желтом пальто. Кто-то откликнулся ей на задних сидениях. - Бр-р-р, Хр-р-р, - хряпнул ей в ответ Федор, всё так же глядя в окно скучающим взглядом.
На ухо ему села муха, и он нехотя повёл головой. Муха, такая жирная, тяжёлая, грузно взлетела и плюхнулась рядом на спинку сиденья. Через пару остановок откуда-то понабежали люди, быстро заняли сиденья, он даже уступил своё тёплое местечко какому-то старику с сумкой на колёсиках. Тот неуклюже протаскивал её через вертушку, быть может, этим и разбудил его. Почти в самых задах автобуса сидели двое. Один был с грустным лицом и бутылкой пива, смотрел отрешённо в пол, закинув ногу на ногу. - Коль, - спросил его второй, - тебе плохо? - Коля часто закивал и сжал губы. Ну… хочешь… сходим щас в клуб, успокоишься… да ладно тебе, что ты в самом деле. Не думай о ней. Вот. И эти туда же. Почему же мне так скучно? Он мельком взглянул на человека с пивом. Не верю, что он такой старый. Это только сейчас, только в данный момент он стареет, потому что он хочет стареть. Он не хочет жить, впрочем. Или хочет? Я иногда думаю, что страшнее - жить в постоянных муках, или умереть? Те, кто помоложе - подростки, дети, не хотят умирать, но иногда поступают так. Те, кто постарше, в том числе и всевозможные культуры, запрещают умирать вообще. Человеческая жизнь, жизнь простого человека - самое ценное, ибо без человека не будет культуры, без простого человека не будет сложных, не будет ничего. Хотя нет, вру, будет что-то другое. А что делать, если скучно? Его бросили, но ведь это временно. А скука - это разрушения. Это действия на кого-то другого. - Она ведь тебя не любила никогда, - проговорил он тихо, как бы невзначай нависая над брошенным, - а ты был просто дураком. Ты и сейчас дурак. Она не помнит тебя, у неё был другой ещё много раньше вашего расставания. Она забыла тебя ещё тогда. И теперь ты один, убиваешь себя и отталкиваешь остальных. - Я хочу сдохнуть. - Вскрой вены. Он вышел, тут снова становилось скучно.
*****
Иногда мне кажется, что всё это бред. Иногда мне кажется, что ничего вокруг не существует, и что стоит мне как-то неосторожно вздохнуть, и вся иллюзия вокруг меня лопнет, и сам я перестану существовать. - К слову, о приготовлении пищи. Именно о приготовлении, а не о самой пище. Ножи. Чем вы режете? Сейчас много продают много дешёвых кухонных ножей с пилками на месте лезвия. Очень удобная вещь - дешёвая и в принципе вечная - ею можно работать на любой поверхности, хоть резать хлеб на камне. Даже когда нож основательно затупился, то он всё равно продолжает пилить. В какой-то момент он достигает так сказать предела своей тупости, потому что режущая кромка стала плоской. И всё, режущие свойства ножа становятся постоянными. Но. Пила - это, конечно, хорошо. Но! Она никогда не даст
ровных кусочков, ровных поверхностей. На каждом кусочке будут видны бороздки и неровности, а если вы режете что-то мягкое, например, только что сваренную курицу, то у вас будет получаться месиво и рваные куски, как будто их отрывали зубами. Я советую использовать кухонные ножи без пилки, но с широким полотном. Цена не так уж важно совсем не обязательно покупать ножи ценою свыше 500 рублей, и тем более ножи за 5-10 тысяч вам ничего не дадут. Эти ножи рассчитаны на поваров в ресторанах, где они постоянно в работе и за ними ухаживают. Тогда они дадут выгоду. А в остальном это будет бесполезная трата денег. Какой-то странный набор информации. Так вблизи смотришь на неё, и она вроде осмысленная, цельная. А издали это похоже на рисунки абстракционистов - тут мазок, там пятнышко. Сами по себе мазки и пятнышки имеют смысл. вот, скажем, синее пятно - это синее пятно, как ты его не поверни. А как посмотришь чуть в сторону, а там уже какое-то зелёное пятно, а на него налезает красная полоса. И что это, откуда это, какая тут связь? Не понятно. Хотя…
*****
- Захожу в квартиру, спотыкаюсь и падаю. Чуть не раздавила кота. Неуклюжая. Что-то чёрное прижалось на пару секунд к стене, скрутилось в комок и рвануло в сторону кухни. Я пошла за ним, но никого не нашла. Да и не было никогда. У меня ведь нет котов… нет котов… Где-то я это уже слышал. - Ты боишься галлюцинаций? - спросил он, глядя в потолок. - Не то чтобы, - она помолчала, и вдруг затараторила, - понимаешь, они приходят когда у меня всё хорошо. Они ломают что-то. Как будто приходят вырвать меня из состояния “хорошо”, и им это удаётся. Появляются и быстро пропадают, раздразнят и уйдут. - И что же ты будешь делать? - Я не знаю. Если бы я знала… не важно. - Нет, важно, - он приподнялся на локтях и повернул к ней слегка припухшие от сухого воздуха глаза. Почему именно сейчас она кажется такой сильной, хотя слова говорят о другом? Она готова плакать, вон, глазки на мокром месте. А какие у неё глаза красивые, они почти всегда смеются, и даже сейчас. Просит о помощи как обычно в своём стиле. - Я знаю, кто послал ко мне дьявола, - она посмотрела сквозь него. - Чушь. Через полчаса, когда он уснёт, она пойдёт в ванную и вскроет себе вены. Он проснётся через час после этого, на часах будет 02:12 ночи с субботы на воскресенье. Он смотрел на неё. Она уже давно умерла. Тело было холодным.
- Я тебя люблю, - тихо сказал он, выпил на кухне и ушёл спать. - Я не хочу смерти. Многие ошибаются. Ошибки не стоят жизней. Жизнь дороже всего на свете. - Почему ты так думаешь? - спросил кот, отделяясь от стены и садясь около батареи. - Это на биологическом уровне. Если все будут умирать, то не будет нас. Не будет человечества. Каждая жизнь дорога потому, что эта жизнь может сыграть ключевую роль в роли всего человечества. Это так пошло с самого начала. Закон выживания. Тот, кто не приспособлен к окружающей среде, тот умирает. Все, кто не был согласен с темой продолжения рода, те умерли. Кот лизал лапу и молчал. Очень долго было тихо, едва слышалось только уютное почмокивание кота. Наконец, в темноте около батареи, откуда только что доносилось чмоканье, резко открылись два светящихся глаза и уставились на него. - Циниками не бывают в таком возрасте, - глаза стояли неподвижно и не моргали, - для этого надо прожить по крайней мере лет 60. А ты ещё молод, многого не понимаешь. Тебе ведь наплевать на человечество, ты всего лишь хочешь вернуть её. - Да.
*****
Свет давил на глаза почти физически. Она сидела рядом на кресле и читала книжку. Сквозь прикрытые веки он видел зажившие шрамы на её руках. Слегка бледное лицо, но живое, такие же смеющиеся глаза. Прошло несколько часов, и вот они стояли в метро. Он поставил на пол большую спортивную сумку, достал автомат и открыл огонь по стоящим на платформе людям. - Развязка должна быть быстрой, надоела тягомотина. К тому же я просто устал, извини, малыш. Он посмотрел на неё. Она была спокойна, как-то безучастно поглядывая на валяющиеся на полу трупы и измазанные в тёмной крови пол и стены. Он опустил ствол: и это скучно. Он хотел развлечься, а не получилось. Несколько секунд было забавно - только что живые тела прошивались пулями, и те становились мягкими, падали и лежали как мешки с картошкой. Всё это было похоже на какую-то компьютерную игру - главный герой идёт по локациям в поисках врагов. Хрупкие враги и почти бессмертный главный герой. Когда враги стали подниматься, он не удивлялся. Тёмные пятна и следы от пуль на глазах пропадали, люди вставали, потирали ужаленные пулями места, кряхтели и стонали. Было так интересно смотреть на опустевшую в несколько секунд станцию, и на то, как она снова заполнялась серой гудящей массой… Пока хватало сил, он стрелял, они выбили у милиционера автомат, и она тоже включилась. Подошедший через минуту поезд был взорван гранатой. Всё, больше гранат не было, а обоймы было всего две. Под грохот, прикрывая руками голову и глаза от пыли и падающих сверху обломков, они спрыгнули на пути и побежали.
… - А то есть смерть? - Смерть - есть всё. И даже чуть больше. Без смерти нету жизни, равно как, впрочем, и без жизни нету смерти. В этом смысле они равны. Я не смогу уснуть, если кого-то не убью. И в принципе хорошо, что они потом встают - можно убивать и убивать. Это как игра в шахматы: главное - процесс, а от результата ничего не изменится. … - Кто ты такой? - Сомневаюсь, что тут нужны имена. Это только идентификаторы, они могут быть любыми. Зовите меня “Первый”. … Он выглянул в окно. Там занималось утро нового дня. Она спала на кровати за спиной, нервно вздрагивая от очередного взрыва или крика. - Зажигай! - проревел кто-то хрипло, и через секунду что-то вспыхнуло вдалеке, а затем в воздух взмыл столб огня и раздался глухой рокот. Она неохотно повернулась на другой бок. Устал. Он щёлкнул выключателем. Свет не работал. Ничего не работало. Ни воды, ни электричества, ничего. Там за окном, они все устали, но им нечего делать - они не могут убить друг друга. После каждой смерти они встают и продолжают. Никто ничего не делает - они хотят есть, но это не обязательно, ведь никто не умрёт от этого. Они хотят пить, но это тоже не нужно. Вообще ничего не нужно. От скуки они громят друг друга и всё вокруг. И вот только у меня, наверное, остался страх. Страх потерять самого себя, и стать такими, как они. Страх потерять её, которая сейчас спит рядом. Я тоже хочу спать, но не могу. А она… а она может себе это позволить, и пусть будет так. Хотя, что толку. По двери кто-то стал отчаянно колотить. - Ты ведь сам этого хотел. Снятие ограничений, свобода и равенство. Братство - это уже по вашей части, - сказал чёрный кот в углу. - Да. Скука - это зло, нет ничего страшнее скуки. Даже один скучающий может перевернуть мир, что уж говорить про мир, который скучает целиком. Он сел рядом с ней, прислонился спиной к стене. - К чёрту всё, мне надоело. Глаза его потихоньку закрывались, по телу разливалось приятное тепло умиротворённость. Он моргал всё медленнее и медленнее, подолгу не поднимая век.
и
Она лежала в ванной слева от него, холодная, мёртвая со вскрытыми венами. Он сидел рядом, прислонившись спиной к стене, моргая всё медленнее и медленнее. Сквозь полуприкрытые веки он посмотрел вниз - руки его потихоньку синели, из запястья были в свежей крови. Он чувствовал как жизнь уходит из него. - Спасибо, - прошептал он и закрыл в последний раз глаза. - Так чего же ты хотел? - промурчал кот, отворяя лапой дверь. Но ему уже не ответили. Мда. Как вы мне надоели. Кот тенью проскользил по стенам и запрыгнул на подоконник. - Вот так посмотришь, и вроде одно. А так, - он провёл запой перед глазами, вслушиваясь в сумасшедшие крики, вой и рёв сирен, грохот взрывов и падающих зданий, - совсем другое. Жаль… очень жаль.
*****
- Если не хотите думать о проблемах с рисом - промывать его и всё в таком духе - то берите рис в пакетиках. Да, не стесняйтесь, это вполне нормально. Такой рис уже промыт, расфасован в порционные пакетики, его нужно только варить на слабом огне минут 20, потом дать стечь воде. И можно подавать к столу. При этом он будет рассыпчатым, и никто не мешает использовать при этом специи. Помните, что время - деньги. Гости будут рады вкусной еде, а вы - её быстрому и простому приготовлению. Не гнушайтесь нововведений. Самый распространённый и самый опасный миф - это миф о том, что в старину всё было лучше, вкуснее. В старину люди редко доживали до 50 лет, и отнюдь не от того, что им отрубили голову. Ну, и напоследок, хочу обратиться ко всем хозяйкам и хозяинам. Помните, что всё в ваших руках. Нет слов “не могу”, есть “не хочу”. Удачи вам!
END
Written by Мартынов Алексей aka Neon_Kaligula - 2008.02.28 - 2008.03.21 =============================