![](/user_photo/_userpic.png)
книги хакеры / журнал хакер / специальные выпуски / Специальный выпуск 53_Optimized
.pdf![](/html/77786/195/html_YxWH3geWho.dx16/htmlconvd-bKZthA71x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|||
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
r |
|
P |
|
|
|
|
|
NOW! |
o |
|||||
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
|
|
|
||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
e |
o |
|
||
|
. |
|
|
|
|
|
Во-первых, "нельзя отпускать за- |
|||||
|
|
p |
df |
|
|
|
g |
.c |
|
|||
|
|
|
|
|
n |
|
|
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
казчика далеко". При составлении технического задания может случиться так, что заказчик что-то плохо объяснил в карточках пользователя или кто-то его не так понял. Поэтому частые релизы и консультации с заказчиком по ходу проекта могут сэкономить уйму времени – не придется переписывать то, что сделано "не так". Во-вторых, нельзя допускать, чтобы каким-то отдельным куском программы владел только один программист. Если он не сможет работать, то в его творении другой будет разбираться очень долго, что чревато неустойками и прочими проблемами с заказчиком. В идеале каждый кусок кода должен быть написан "парным программированием", то есть его должны писать два человека за одним компьютером. Один набирает, другой смотрит и советует. Периоди- чески они меняются ролями. Такой подход часто оправдывает себя, потому что одна голова хорошо, а две лучше, к тому же парам проще найти удачное решение. К тому же у кода не будет слабых звеньев - кусочков кода, понятных только их автору.
РАБОТА В КОМАНДЕ
ХП – это прежде всего командный стиль программирования, созданный для команд и в котором командному духу уделяется особое внимание. В этом плане в ХП есть множество методов, которые нельзя не упомянуть.
Взаимовыручка.
Если к тебе за помощью обратился коллега – помоги. Бывает, что много драгоценного времени тратится впустую из-за того, что разработчик не видит какой-либо своей нелепой ошибки. Случайно поставленный или лишний символ может не заметить даже матерый программист, пусть даже проходил мимо них несколько часов. Свежий взгляд на проблему позволит сэкономить массу рабочего времени. К тому же так члены команды начинают лучше понимать то, чем заняты их коллеги.
Утренние собрания стоя.
Каждый день команды "экстремальных программистов" должен начи- наться с такого собрания, на котором обсуждаются текущие планы. Стоя – чтобы не увлекаться и не засиживаться, а говорить по существу. Такие собрания позволяют любому сотруднику команды получить представление о том, что делает другой, и высказывать свои идеи и предложения для чужого сектора.
ЮНИТ-ТЕСТЫ
Еще одно нововведение ХП. Одновременно с разработкой программного модуля пишутся и модуль для его тестирования. На первый взгляд может показаться, что это лишняя ра-
бота, смысл которой выяснить невозможно. Однако в основе юнит-тестов лежат реальные потребности.
Иногда, меняя один из модулей программы, ты каким-то неявным образом затрагиваешь другой. И при этом можно потратить уйму времени на поиск "того, из-за чего все не работает". В ХП в этом случае запускаются юнит-тесты. Они выявляют те модули, которые работают с ошибками и облегчают процесс их поиска. К тому же когда в команду вливается новый че- ловек, ему может быть полезно убедиться, что изменения, которые он внес, не изменили целостности всей программы: большую часть всего проекта он мог и не видеть. Юнит-тесты также очень сильно облегчают процесс рефракторинга.
РЕФРАКТОРИНГ
Есть золотое правило программиста: если это работает – не трогай это. Экстремальные программисты на то и экстремальные - они его всячески нарушают. Рефракторинг - это о процессе, в котором код подвергается постоянной оптимизации и всяческим улучшениям. "Безжалостно рефракторить!" - вот один из девизов ХП. Вообще идея "А не переписать бы тут все..." не нова и часто приходит в голову одному разработчику, когда он смотрит на код другого. При этом процесс переписывания может продолжаться неоправданно долго и в конечном итоге не принести результатов – его бросят и оставят так, как есть, потому что "то, что было, хотя бы работает". Но как ты уже догадался, у грамотного рефракторинга тоже есть свои принципы.
Главный из них: код в конце каждого дня должен оставаться рабочим. Другими словами, нельзя углубляться и менять "сразу и все". Изменения стоит вносить небольшими порциями так, чтобы весь код в целом сохранял свою работоспособность. Написанные юнит-тесты облегчат для тебя выяснение того, не привело ли твое изменение в коде к каким-либо фатальным последствиям. Правил рефракторинга значительно больше, и про них можно написать отдельную статью. Если тебе интересно, я думаю, ты уже знаешь ключевое слово, которое надо набрать в Яндексе.
КОГДА ИСПОЛЬЗОВАТЬ ПРАВИЛА ХП
Я огласил далеко не весь "свод правил экстремального программирования". Их больше - подробнее можешь почитать на сайте или купить книгу. Однако крайне редко при разработке проекта используются все правила. Иногда из-за жестких сроков, иногда из-за того, что использование ХП требует больших трудозатрат и, как следствие, приносит меньше прибыли. Бывали случаи, когда написание юнит-тестов требовало боль-
69
ше времени, чем написание самой программы. К тому же при внесении изменений в программу приходится изменять и юнит-тесты...
Как видишь, ХП - не панацея от всех бед, и встречаются ситуации, когда использование всех ее правил потребует больше времени и сил, чем можно было сэкономит в дальнейшем. В общем, решать тебе. Советую помнить одну народную мудрость, которую любят в ХП: "Никогда нет времени, чтобы сделать сразу как следует, но всегда находится время переделать потом". Да, это философия больших проектов. Но некоторые ее правила ты можешь использовать и при работе в одиночку. Скажем, правила рефракторинга или написание юнит-теста для своей небольшой программы.
ХП – это не набор программ, а свод правил. Кроме правил, есть еще и программные средства, упрощающие и оптимизирующие работу программистов, потому что в конце концов доска с бумажными карточками в век информационных технологий выглядит как-то несолидно...
XPLANNER
Для автоматизации процесса программирования по стандартам ХП существует очень хорошее средство XPlanner, специально предназначенное для экстремальных программистов. Если ты работаешь в духе ХП, то это лучшее средство, в этой программе "реализованы" все принципы экстремального программирования. Она позволяет автоматизировать работу, даже если менеджеры, заказчи- ки и программисты находятся на разных полюсах земного шара. Звучит заманчиво? Тогда тебе сюда: www.xplanner.org.
BUG TRACKING SYSTEMS
Как ты, наверное, догадываешься, программы живут по-разному. Некоторые пишутся ради "Дня Х", когда они должны отработать и после которого о них навсегда забудут. Некоторые программы будут использоваться годами и потребуют доработок и новых
релизов. Для того чтобы автоматизи- »
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
E |
|
|||
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
R |
|
|
|
|
|
|
|
|
|
|
A |
|
|
|
|
|
|
|
|
|
|
W |
|
|
|
|
|
|
|
|
|
|
S |
|
|
|
|
|
|
|
|
|
|
K |
|
|
|
|
|
|
|
|
|
|
C |
|
|
|
|
|
|
|
|
|
|
U |
|
|
|
|
|
|
|
|
|
|
B |
|
XPlanner – мощное средство для экстремального программиста
![](/html/77786/195/html_YxWH3geWho.dx16/htmlconvd-bKZthA72x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
E |
-xcha |
|
|
|
|
||||
|
|
|
|
|
|
|
|
|||
|
R |
|
|
|
|
|
|
|
||
|
A |
|
|
|
|
|
|
|
||
|
W |
|
|
|
|
|
|
|
||
|
S |
|
|
|
|
|
|
|
||
|
K |
|
|
|
|
|
|
|
||
|
C |
|
|
|
|
|
|
|
||
|
U |
|
|
|
|
|
|
|
||
|
B |
|
|
|
|
|
|
|
70 ТЕХНОЛОГИИ ПОТУСТОРОНУКОДИНГА
Mantis – очень распространенная система Bug Tracking’a в интернете
ровать работу над такими длительными проектами, и были придуманы различные системы Bug Tracking’a, в которых пользователи программы могут сообщить о неисправности или о необходимости улучшений. Служащие технической поддержки могут выбрать, к какому разработчику или отделу разработчиков относится эта проблема. А непосредственно разработчик будет рапортовать о ходе выполнения этой задачи.
Некоторые такие системы чем-то напоминают форумы в интернете. Ты, как пользователь, найдя ошибку, заходишь, оставляешь сообщение с ее описанием. Его рассматривают, и если проблема действительно кроется в разработчиках, а не ты "не туда нажал", этой проблемой будут заниматься. Ответственный может обратиться к тебе за необходимыми уточ- нениями. Например, чтобы узнать, какую версию программы ты используешь или какая у тебя операционная система.
Эти программы сильно облегчают взаимодействие пользователей и разработчиков. С их помощью можно также контролировать разработчиков, следить за количеством багов, скоростью их устранения и т.д. и т.п.
Реализаций подобных систем множество. В виде форумов технической
поддержки (например, wiki http://c2.com/cgi/wiki?WikiWikiWeb) или каких-то внутрикорпоративных программ (XPlanner или какая-нибудь собственная разработка компании), где задачи ставят работники этой же компании, являющиеся или пользователями, или сотрудниками службы технической поддержки. Эти же системы играют еще одну немаловажную роль: на основе их логов можно рассчитывать долевой вклад программистов в решение той или иной задачи.
СРЕДСТВА ПОСТАНОВКИ ЗАДАЧ
Постановка задач в любом проекте - это одно из необходимых условий успеха. Есть поговорка: если задача поставлена некорректно, то в результате может получиться вообще все что угодно. Безусловно, можно составить техническое задание на листике за пять минут. Возможно, вы с заказ- чиком настолько хорошо понимаете друг друга, что тебе и этот листик не нужен – все и так будет сделано в лучшем виде. Если все не так радостно, имей в виду, что серьезные зада- чи могут потребовать мощных средств постановки задач.
|
|
Вот таких "технических заданий" стоит опасаться |
UML в действии |
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
|
X |
|
|
|
|
|
|
|||
|
|
- |
|
|
|
|
|
d |
|
|||
|
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
||
|
P |
|
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
BUY |
|
|
||||
|
|
|
|
|
to |
|
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
|
|||||
|
w |
|
|
|
|
|
|
|
|
|
|
|
UML (UNIFIED MODELING |
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
e |
|
||||
|
|
|
p |
df |
|
|
|
g |
.c |
|
||
|
|
|
|
|
|
n |
|
|
|
|
||
LANGUAGE) |
|
|
|
|
-x cha |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
Это стандарты для проектирования интерфейсов и функционирования серьезных программ. Не буду углубляться в его описание – в интернете он и так слишком подробно описан. Посмотри сам, как выглядят прототипы программ в разных областях программирования, и сам сделай выводы о том, по каким техническим заданиям лучше работается.
Существуют и другие средства. Для некоторых областей программирования есть специальные средства и наборы стандартов. Большинство из них специально затачиваются под ту или иную область. Для проектирования баз данных, банковских процессов, Java-программ такие средства уже существуют практически для всех видов программирования. Если все же говорить о "простых" и "средних" средствах, то Word Excel и Visio – то, что доктор прописал.
И еще один маленький совет. Уж лучше заставить человека написать подробное техническое задание, чем переписывать несколько раз "то, что поняли не так".
CVS (CONCURRENT VERSION SYSTEM)
Система контроля версий, если порусски. Чтобы ты понял, что это такое и для чего это предназначается, опишу несколько "классических ситуаций". Ты разрабатываешь какую-то программу. Выпустил релиз и продолжаешь работу над следующей версией, и вдруг в выпущенном релизе обнаруживается серьезный баг, а выпуска нового в ближайшем будущем не предвидится. Надо вернуться к выпущенной версии, исправить баг, затем вернуться к разработке новой. А в новой версии придется исправлять этот же баг уже во второй раз... Если над одними и теми же файлами работают несколько человек, конфликты между участниками этого коллективного труда неизбежны. Казалось бы, это можно решать криками "Вась, ты это файл трогаешь? Нет? Ну тогда и не трогай, я
ХАКЕРСПЕЦ 04(53) 2005
![](/html/77786/195/html_YxWH3geWho.dx16/htmlconvd-bKZthA73x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
|
|
||||
|
|
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
- |
|
|
|
|
|
d |
|
|
|
|
|
|
|
|||||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
r |
||||||||
P |
|
|
|
|
|
NOW! |
|
o |
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
m |
||||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
.c |
o |
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
|
|||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Use Case – мощное средство UML
сейчас его править буду!". Звучит смешно, но, например, я говорил это тысячи раз, а слышал еще чаще. Каждый релиз можно складывать в отдельную папочку, исправления багов вносить сначала в выпущенную версию, а потом в разрабатываемую. А если разработчики не сидят в одном помещении, вообще разделены часовыми поясами и, соответственно, могут работать в разное время? При всем этом на "исправление бага" ты уже потратил много времени, неужели для его исправления в следующей версии придется начинать все сначала? Можно и дальше продолжать изобретения велосипеда. Однако такие проблемы решают уже давно, значит, должны существовать их решения.
Как ты уже понял из названия, CVS – это система, используемая для управления версиями файлов. В нашем случае - исподниками программ. Она используется для того чтобы хранить не только текущую версию файла, но
èего "историю". В CVS хранится история всех манипуляций с файлом: когда он был добавлен в проект, когда и кем был изменен, а также какие именно изменения были внесены.
CVS – это клиент-серверное приложение. На сервере CVS хранятся все версии файлов, а клиент, как правило, имеет только одну – ту, с которой работает. После того как программист закончил вносить необходимые изменения в файл, он отправляет его CVSсерверу, который проверяет, нет ли ошибок (об этом читай ниже), и, если все в порядке, кладет файл на сервер
èприсваивает ему новую версию.
Возможно, над одним и тем же файлом работают несколько разработчи- ков, которые сами об этом не подозревают. Один открыл файл утром, работал с ним весь день и сохранил вече- ром. Другой внес небольшие изменения в середине дня. Если не воспользоваться системой контроля версий, то изменения, которые внес второй,
пропадут, когда первый сохранит свои. При использовании CVS в конце дня, если первый разработчик соберется сохранить изменения, CVS-сер- вер выдаст предупреждение: "Вы работаете со старой версией файла. В CVS уже находится новая, пожалуйста, обновите ее из CVS".
CVS позволяет также отделаться легким испугом от другой ситуации, когда в выпущенном релизе программы обнаружена серьезная ошибка, а текущая версия программы еще не готова. Без использования CVS надо хранить все файлы "релиза" в отдельных папках и вносить изменения и в них, и в текущую версию. CVS значи- тельно упрощает решение таких проблем, все файлы релиза можно пометить, и потом будет легко достать из CVS-сервера любой релиз. При этом если файлы релиза надо изменить не трогая их текущей версии, в CVS можно создать "ветвь". При этом текущая работа над новой версией будет продолжаться в обычном режиме и необходимости вносить изменения в него не будет. А когда будет готов очередной релиз, CVS поможет "слить ветви". Таким образом в новом релизе будут учтены изменения, которые были сделаны в предыдущем. Ну и еще одно неоспоримое преимущество CVS: так как последняя версия всех файлов находится на сервере CVS, работать над проектом могут люди из разных офисов, городов и даже стран.
Не обязательно прямо сейчас все бросать и, проникнувшись идеями CVS, приступать к изучению мануалов с cvs.ru. Для небольших проектов CVS может оказаться пустой тратой времени. Пока ты научишься пользоваться ей, настроишь сервер, тебе в голову может прийти такая мысль: "Если бы я не знал о CVS, я бы уже давно все написал". Это мощное и часто незаменимое средство. Если для проекта не планируется масштабных доработок и новых версий, то ис-
71
пользование CVS – лишь трата времени. Кстати, CVS - не единственное средство контроля версий, есть и другие. Однако самое широкое распространение получила именно она, да и принципы у них схожи. Напоследок скажу, что CVS сейчас распространяется все шире и "умение работать с CVS" все чаще фигурирует в призывах устроиться на работу.
ТО, ЧТО НЕЛЬЗЯ АВТОМАТИЗИРОВАТЬ
Представь, что какой-нибудь злодей решил контролировать присутствие программистов на рабочих местах. Что тут можно сказать? Контролировать работу программистов с помощью программ...
В одной из компаний решили заставить сотрудников слать письмо по электронной почте при приходе на работу. О том, как заставить The Bat отправить письмо в определенное время, на следующий день знала даже секретарша. В другой известной мне компании время твоего прихода на работу фиксировалось по времени входа в корпоративную программу. "Приходитель вовремя, версия 1.0" был написан за два дня. Так что имей в виду: все автоматизировать не получится, кое-где останется неподкупная "тетя Маша", которая будет отмечать приход и уход каждого сотрудника.
ДУМАЙ!
Я описал разные технологии и подходы к программированию. Есть такая поговорка: если человеку дать в руки молоток, то для него все вокруг начнет подозрительно казаться гвоздями". Это я о том, что следует хорошо подумать перед применением той или иной технологии и выяснить, есть ли в ней реальная потребность. Окупятся ли трудозатраты по написанию юнит-тестов? Стоит ли подвергать рефракторингу кусок кода, кото-
рому осталось работать несколько месяцев? Надо ли использовать CVS для задачи средних размеров, над которой ты работаешь на пару с товарищем? Если ты сейчас перечитаешь вопросы из введения и сравнишь их с этими, то, возможно, увидишь между ними одну существенную разницу: в вопросах введения спрашивалось, как решить задачу, а в вопросах заключения – стоит ли решать такую задачу этим методом. Если ты это видишь и понимаешь (на что я надеюсь), значит, ты что-то почерпнул из этой статьи. А еще говорят, что для того чтобы сделать правильный выбор, надо прежде всего иметь в распоряжении то, из чего будешь выбирать. Хорошо представляя себе возможности того или иного средства разработки, его преимущества и возможные проблемы, связанные с ним, ты сможешь решить, "стоит или не стоит" им пользоваться для решения этой задачи. E
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
i |
r |
|
P |
|
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
|||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
||
|
|
|
|
-x cha |
|
E |
|
|
|||
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
R |
|
|
|
|
|
|
|
|
|
|
|
A |
|
|
|
|
|
|
|
|
|
|
|
W |
|
|
|
|
|
|
|
|
|
|
|
S |
|
|
|
|
|
|
|
|
|
|
|
K |
|
|
|
|
|
|
|
|
|
|
|
C |
|
|
|
|
|
|
|
|
|
|
|
U |
|
|
|
|
|
|
|
|
|
|
|
B |
|
|
![](/html/77786/195/html_YxWH3geWho.dx16/htmlconvd-bKZthA74x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
|
|
||
P |
|
|
|
|
|
NOW! |
o |
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
BUY |
|
|
72 |
ТЕХНОЛОГИИ |
ПРОГРАММА-ПОЛИГЛОТ |
||||||||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
m |
Islander (islanderx@mail.ru) |
|||||||||||||||
|
w |
|
|
|
|
|
|
|
o |
|||||||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ERA |
|
|
n |
e |
|
ПРОГРАММА- |
|||||||||||||||
|
|
|
df |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
W |
|
|
|
|
|
|
|
ПОЛИГЛОТ |
|||||||||||||
|
S |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
K |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
C |
|
|
|
|
|
|
|
УЧИМСЯ ЛОКАЛИЗАЦИИ ПРОГРАММ |
|||||||||||||
|
U |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
чень важной характеристикой программы является поддержка языков. Именно от этого зависит то, насколько |
|||||||||||
|
B |
|
|
|
|
|
|
|
Îраспространится твой софт за рубежом, и, следовательно, величина дохода. Я постараюсь помочь тебе |
разобраться в технологиях и методах перевода и локализации ПО
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
|
Ò |
ы уже, наверное, начал |
|
писать свою програм- |
|
|
||
|
||
|
му, а по ночам тебе |
|
|
||
|
||
|
||
|
снятся горы денег, ко- |
|
|
||
|
||
|
торые ты заработаешь |
на ней. Доллары... Доллары... Прочи- тав FAQ, кучу статей, обследовав со всех сторон своих конкурентов и определив бюджет, ты понял, что русский рынок – это не для тебя. На нем можно попытаться заработать денег, и некоторые делают это успешно, но твоя программа достойна того, чтобы о ней узнал весь мир.
Тогда представь себе привередливого буржуя с толстым кошельком, который вместо того чтобы учить русский язык и пользоваться твоим продуктом, хочет непременно получить его английскую версию. Да, что поделаешь, горькая правда... Программу надо переводить. Достаточно ли перевода только на английский язык? Для начала да. Если твоя программа станет популярной, то пройдет буквально две-три недели и ты получишь трогательное письмо от забугорного, но без гроша в кармане студента, ко-
Avant Browser поддерживает аж 35 языков
торый попросит у тебя ключик к программе в обмен на перевод интерфейса. Советую сразу соглашаться, так как перевод интерфейса - обычно дело весьма долгое, нудное и дорогостоящее.
Надеюсь, теперь ты уже не сомневаешься, что тебе нужен многоязычный интерфейс, и уже представил свою программу говорящей на 24-х языках...
Мечты, конечно, но это не так далеко от реальности - сделаем первый шаг!
Среднестатистический sharewareпродукт обычно представляет собой небольшую программу, написанную на MS Visual C, Borland C++ Builder или Borland Delphi. Наши шароварщики особенно любят последнюю, поэтому я буду рассматривать перевод в контексте Delphi, однако для других сред и языков все это будет выглядеть примерно так же, и ты легко адаптируешь под них полученные знания.
Есть несколько способов хранения перевода. Первый заключается в том, что строки "жестко" зашиваются в код программы. Однако у этого способа есть один большой недостаток: его очень сложно модифицировать. То же самое можно сказать и про разные встроенные средства перевода – луч- ше их не использовать. Остановимся на двух способах, горячо любимых нашими шароварщиками: это вынос перевода в lng-файлы и "зашивание" перевода в ресурсы внешних dll-биб- лиотек.
Какой из этих способов выбрать? Если ты планируешь, что версии программы на разных языках будут отли- чаться исключительно строками, смело выбирай lng. Если же ты хочешь, чтобы у них были еще и разные ресурсы (графика, звук и проч.), то при-
дется остановиться на варианте с ресурсами в dll. Вот уж у бедного студен- та-чужестранца прибавится работы!
Можно облегчить его участь и нау- чить его пользоваться Restorator'ом. В общем, если кажется слишком мутно, посмотри на таблицу.
ПЕРЕВОД С ПОМОЩЬЮ LNG(INI)-ФАЙЛОВ
Перевод с помощью ini-файлов (обычно разработчики меняют расширение файла на lng, однако его структура идентична ini-файлу) является самым популярным в классе небольших программных продуктов. Ini-файл представляет собой обычный текстовый документ, разбитый на секции. В каждой секции есть параметры и зна- чения этих параметров. Пример iniфайла легко обнаружить в каталоге Windows.
Названия секций в файле заключа- ются в квадратные скобки, регистр символов не имеет значения. В каждой секции присутствуют параметры и их значения, которые разделены знаком "равно" по формату param=value. Полезная возможность ini-файлов – поддержка комментариев. Все комментарии начинаются со знака ";", после которого ты можешь писать все, что заблагорассудится.
Посмотрим, как все это будет выглядеть на практике. Строки обычно логически относятся к той или иной форме приложения, поэтому было бы разумно сгруппировать их по этому признаку.
Я рекомендую использовать префиксы для всех элементов управления на форме (например, для кнопки btn, для метки lbl), а для сообщений, которые будут показаны пользовате-
Возможность |
|
Перевод в lng- |
Перевод в |
Перевод, «зашитый» |
|
файлах |
ресурсах dll |
в программу |
|
|
|
|||
|
|
|
|
|
Хранение строковых значений |
|
Äà |
Äà |
Äà |
|
|
|
|
|
Хранение любых видов ресурсов, будь |
|
Íåò |
Äà |
Äà |
то графика, звук или анимация |
|
|||
|
|
|
|
|
|
|
|
|
|
Удобство редактирования |
|
Высокое |
Низкое |
Очень низкое |
|
|
|
|
|
Возможность менять данные без |
|
Äà |
Äà |
Íåò |
перекомпиляции приложения |
|
|||
|
|
|
|
|
|
|
|
|
|
Сравнение методов хранения перевода |
|
|
|
|
|
|
|
|
|
ХАКЕРСПЕЦ 04(53) 2005
![](/html/77786/195/html_YxWH3geWho.dx16/htmlconvd-bKZthA75x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|
|
|
|
||
|
F |
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
||
P |
D |
|
|
|
|
|
|
|
o |
|
|
|
|
|
|
|
|
|
|
NOW! |
r |
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
|
|
|
|
|
73 |
|
|||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
w Click |
|
|
|
|
|
o |
|
|
|
|
|
||||
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
.c |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
e |
|
|
|
|
|
|
|
|
|
p |
df |
|
|
|
|
|
лю c помощью MessageBox'ов, ис- |
|
|
|
|
|
|
|
|
|
|
|
g |
|
|
|
|
|
|
|
|||
|
|
|
|
|
n |
|
|
|
|
|
|
|
|
||
|
|
|
|
-xcha |
|
|
пользовать параметры с префиксом |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
msg. Для всех прочих строковых ме- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ток будет использоваться префикс |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
str. Что же делать со строками, кото- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
рые логически не относятся ни к од- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ной форме? Например, сообщение об |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ошибке проверки контрольной суммы |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exe-файла на том этапе, когда ни одна |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
форма еще не создана. Все очень |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
просто: создадим еще одну секцию, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
назвав ее, например, Global, и будем |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
сваливать туда эти строки. Можно |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
поступить подобным образом, если |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
какие-нибудь ресурсы с префиксами |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
msg и str используются одновремен- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
но в нескольких формах: запихнем их |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в секцию COMMON. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Также не стоит забывать, что в на- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
чале ini-файла желательно указать |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
версию приложения, для которой раз- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
работан этот файл, а также название |
|
Популярный менеджер паролей Password Commander хранит переводы как раз в lng- |
|
|||
|
|
|
|
|
|
|
|
|
языка и имя автора перевода. |
|
файлах |
|
|
|
|
|
|
|
|
|
|
|
|
|
Некоторые разработчики, например, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Кристиан Гислер (автор небезызвест- |
|
На мой взгляд, в наше время такой |
begin |
|||
|
|
|
|
|
|
|
|
|
íîãî Total Commander'à) äàþò ïàðà- |
подход неоправдан. Лучше пусть lng- |
IniFile := TMemIniFile.Create (LngFileName); |
||||
|
|
|
|
|
|
|
|
|
метрам менее говорящие названия, |
файл будет вместо 30 Кб занимать |
|
|
|||
|
|
|
|
|
|
|
|
|
например: |
45, зато и тебе, и переводчику будет |
|
for i := 0 to Form.ComponentCount - 1 do |
|||
|
|
|
|
|
|
|
|
|
|
|
сразу понятно, что к чему относится. |
begin |
|||
|
|
|
|
|
|
|
|
|
0="Нет доступа, или файл\n%s\n уже используется." |
|
Формат хранения мы разобрали, те- |
if Form.Components [i].name = '' then |
|||
|
|
|
|
|
|
|
|
|
1="Укажите шаблон(ы) файлов (например: |
перь рассмотрим технологию и алго- |
Continue; |
||||
|
|
|
|
|
|
|
|
|
s*.doc;*.tx?)" |
ритм перевода. Мы не будем уподоб- |
|
S := IniFile.ReadString (Form.Name, |
|||
|
|
|
|
|
|
|
|
|
2="Создать новый каталог:" |
ляться программам, которые при сме- |
Form.Components [i].name, '#__ERROR__#'); |
||||
|
|
|
|
|
|
|
|
|
|
|
не языка интерфейса требуют переза- |
|
|
||
|
|
|
|
|
|
|
|
|
|
|
пуска, а сделаем переключение языка |
If S <> '#__ERROR__#' then |
|||
|
|
|
|
|
|
|
|
|
|
|
"на лету". Для этого нам потребуются |
begin |
|||
|
|
|
|
|
|
|
|
|
|
|
две процедуры: одна для перевода |
If Form.Components [i] is TLabel then TLabel |
|||
|
|
|
|
|
|
|
|
|
|
|
всех компонентов формы, а другая |
(Form.Components [i]).Caption :=S; |
|||
|
|
|
|
|
|
|
|
|
|
|
для перевода любой строки по назва- |
If Form.Components [i] is TButton then TButton |
|||
|
|
|
|
|
|
|
|
|
|
|
нию ее параметра. |
(Form.Components [i]).Caption :=S; |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end; |
|
|
|
|
|
|
|
|
|
|
|
|
Procedure TranslateFormComponents (Form: |
end; |
|||
|
|
|
|
|
|
|
|
|
|
|
TCustomForm; LngFileName: string); |
IniFile.Free; |
|||
|
|
|
|
|
|
|
|
|
|
|
var |
end; |
|||
|
|
|
|
|
|
|
|
|
|
|
|
I : integer; |
|
|
|
|
|
|
|
|
|
|
|
|
Так выглядит файл system.ini, если |
|
IniFile : TMemIniFile; |
Function TranslateMessage (SectionName, MsgID, |
|||
|
|
|
|
|
|
|
|
|
открыть его в "Блокноте" |
|
S : string; |
LngFileName: string):string; |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IniFile : TIniFile; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
begin |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IniFile := TIniFile.Create (LngFileName); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Result := IniFile.ReadString (SectionName, MsgID, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
'#__ERROR__#'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IniFile.Free; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Мы имеем две функции, и это прак- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
тически все, что нужно для перевода. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Создаем в классе каждой формы при- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ложения процедуру ApplyTranslate, в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
которой вызываем |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TranslateFormComponents (self, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
‘Имя_нашего_lng-файла’), а также пе- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
реводим все прочие статические эле- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
менты управления, которые не могут |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
быть переведены автоматически. Не |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
стоит также забывать и о всплываю- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
щих сообщениях(MessageBox’ах и |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
т.п.), которые переводятся очень |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
просто. Например, если тебе надо по- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
казать сообщение о том, что выйти из |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
программы в текущий момент невоз- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
можно, пишешь вот так: |
|
|
|
|
|
|
|
|
|
|
Так выглядит lng-файл серьезной многоязычной программы |
|
» |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
E |
|
|||
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
R |
|
|
|
|
|
|
|
|
|
|
A |
|
|
|
|
|
|
|
|
|
|
W |
|
|
|
|
|
|
|
|
|
|
S |
|
|
|
|
|
|
|
|
|
|
K |
|
|
|
|
|
|
|
|
|
|
C |
|
|
|
|
|
|
|
|
|
|
U |
|
|
|
|
|
|
|
|
|
|
B |
|
![](/html/77786/195/html_YxWH3geWho.dx16/htmlconvd-bKZthA76x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
E |
-xcha |
|
|
|
|
||||
|
|
|
|
|
|
|
|
|||
|
R |
|
|
|
|
|
|
|
||
|
A |
|
|
|
|
|
|
|
||
|
W |
|
|
|
|
|
|
|
||
|
S |
|
|
|
|
|
|
|
||
|
K |
|
|
|
|
|
|
|
||
|
C |
|
|
|
|
|
|
|
||
|
U |
|
|
|
|
|
|
|
||
|
B |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
|
d |
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
F |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
t |
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
P |
D |
|
|
|
|
|
|
|
|
o |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NOW! |
r |
||||||
74 |
|
ТЕХНОЛОГИИ |
ПРОГРАММА-ПОЛИГЛОТ |
|
|
|
|
|
BUY |
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
Click |
|
|
|
|
|
|
|
m |
||
ShowMessage (TranslateMessage (self.name, |
|
|
w |
|
|
|
|
|
|
o |
||||||||||||||||||
|
|
|
w |
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
. |
|
|
|
|
|
|
|
.c |
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
e |
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
p |
df |
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
n |
|
|
|
|
||
‘msgCannotExit’, ‘Имя_нашего_lng-файла’)); |
|
|
|
|
|
|
-x cha |
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
Если такая запись покажется слиш- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
ком длинной и громоздкой (а мне так |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
и показалось), можно сделать проще. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
Создай в классе формы новую функ- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
цию TranslateMsg и используй ее: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
Function TranslateMsg (MsgID: string):string; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
begin |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
Result := TranslateMessage (self.name, msgID, ‘Èìÿ_íà- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
шего_lng-файла’) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
end; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
Вывод сообщения при этом примет |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
такой вид: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
ShowMessage (TranslateMsg (‘msgCannotExit’)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
Красота! Теперь при переключении |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
языка интерфейса не забывай вызы- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
вать ApplyTranslate у формы и добав- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
лять в lng-файл новые строчки по ме- |
|
Небезызвестная программа "Соло на клавиатуре" хранит перевод в ресурсах dll-файлов |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
ре разработки проекта. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
дут проблемы. Можно в design-time |
каждый строковой ресурс в dll дол- |
|
|
|
|
|
|
|
|
|
|
|
|
ПЕРЕВОД С ПОМОЩЬЮ |
создать форму, перевести на ней все |
жен быть уникален. Итак, в |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
"ЗАШИТЫХ" В DLL РЕСУРСОВ |
надписи и запихнуть ее в ресурсы dll, |
TranslateFormComponents ты должен |
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
Допустим, у тебя есть картинки, |
а потом читать оттуда. А можно оста- |
сначала загрузить dll-библиотеку с |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
звуки и прочие мультимедийные |
вить все формы в ресурсах приложе- |
помощью LoadLibrary, а затем полу- |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
приблуды, которые в ini-файл никак |
ния, а в dll поместить только названия |
чить нужный строковой ресурс функ- |
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
не засунуть. Что ж, придется запихи- |
элементов управления, что и было |
цией LoadString. В конце не забудь |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
вать их в ресурсы внешних dll-библи- |
сделано при работе с lng-файлами. |
вызвать FreeLibrary. |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
отек. Редактировать файлы ресурсов |
|
Подключать динамические библио- |
Я советую использовать префиксы |
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
не так удобно, в "Блокноте" их особо |
теки с переводом нужно, естественно, |
для всех ресурсов dll по формату: |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
не попишешь, поэтому для такой цели |
динамически. Делается это элемен- |
название формы "_" имя ресурса. |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
одни используют встроенный редак- |
тарно с помощью функции |
Например, если у нас на форме с име- |
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
тор ресурсов в Visual Studio, другие – |
LoadLibrary. |
нем frmMain имеется кнопка btnExit, |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
старый добрый Restorator, а ты, может |
Рассмотрим разницу между реализа- |
то название строкового ресурса будет |
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
быть, найдешь еще что-нибудь более |
цией перевода через ini-файлы и ре- |
выглядеть так: frmMain_btnExit. С по- |
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
удобное. |
|
|
|
|
|
|
|
|
|
|
|
сурсы в dll. |
мощью такой системы префиксов |
|
|
|
|
|
|
|
|
|
|
|
||||
|
Логика работы с ресурсами в dll поч- |
|
Если ты собираешься помещать в |
названия ресурсов будут удобно от- |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
ти такая же, как и при переводе с по- |
ресурсы целую форму, то функция |
сортированы, и добавление нового не |
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
мощью ini-файлов, но здесь присут- |
TranslateFormComponents òåáå, åñòå- |
составит большого труда. Имя ресур- |
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
ствуют некоторые характерные осо- |
ственно, не пригодится. В противном |
са с такими префиксами в функции |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
бенности. Например, если хранение |
случае нужно выковыривать строки |
TranslateFormComponents будет вы- |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
строк сообщений и динамических над- |
из ресурсов dll. Это не самое веселое |
глядеть следующим образом: |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
писей (msg и str) ни у кого не вызыва- |
занятие, так как ты не сможешь раз- |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
ет вопросов, то с хранением форм бу- |
бить строковые ресурсы на секции, а |
Form.name + ‘_’ + Form.Components [i].name |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Еще одна тонкость - обязательно |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
проверять наличие ресурса перед тем |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
как загрузить его, используя функ- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
öèþ: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HRSRC FindResource( |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HMODULE hModule, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LPCTSTR lpName, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LPCTSTR lpType); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Иначе будут вылезать exception'ы, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
если вдруг бедный студент-чужезе- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
мец схалтурит и не переведет пару |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
строчек. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Аналогично функции |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TranslateFormComponents перепиши |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TranslateMessage. Далее все абсолют- |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
но так же, как и с lng-файлами: созда- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ешь процедуру ApplyTranslate в клас- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
се формы и вызываешь ее по мере |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
необходимости. Для загрузки графи- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ки ты можешь использовать функции |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LoadIcon и LoadBitmap, подробное |
|
|
|
|
|
|
|
|
|
|
|
Редактор ресурсов в Microsoft Visual Studio |
|
|
описание которых можно найти в |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ХАКЕРСПЕЦ 04(53) 2005
![](/html/77786/195/html_YxWH3geWho.dx16/htmlconvd-bKZthA77x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
||||
|
|
X |
|
|
|
|
|
||||
|
- |
|
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
|
|
||||
|
|
|
|
to |
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
m |
||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|||
|
|
p |
|
|
|
|
|
|
|
||
|
|
|
df |
|
|
n |
e |
|
|||
|
|
|
|
-xcha |
|
|
|
|
|
Restorator - один из лучших редакторов ресурсов
MSDN. Я думаю, ты все понял и дальше разберешься сам. Только не забудь обучить бедного забугорного студента пользоваться Restorator'ом!
ЮНИКОД
Если твоя программа должна поддерживать возможность работы более чем с двумя различными языками сразу или же обеспечивать поддержку экзотических языков, стоит подумать о том, чтобы сразу оснастить свой продукт поддержкой юникода. Тут не все просто: если в Windows 2k/XP/2003 юникод полностью поддерживается на уровне ядра, то в Windows 9x/ME возникнут трудности. Поэтому придется определиться с тем, должна ли твоя программа работать под Win9x. Однозначных советов по этому поводу давать не стану, но скажу, что поддержка Win9x все еще очень желательна для утилиток мас-
сового использования и сравнительно недорогих.
Если же твоя программа будет работать только в Windows 2k/XP/2003, то в MS Visual С++ тебе будет достаточно определить макрос UNICODE в настройках проекта и все элементы управления автоматически начнут поддерживать юникодные надписи. В Delphi/Builder будет немного сложнее: без дополнительных библиотек тут не обойтись. Рекомендую скачать TNT Unicode Controls и использовать элементы управления только из этой библиотеки, так как они полностью поддерживают юникод. Библиотека бесплатная и распространяется с открытым исходным кодом. Можно ска- чать ее тут: http://download.tntware.com/delphi_unicode_controls/TntUnicodeControls.zip.
Если твоя программа должна поддерживать юникод в Windows 9x/ME, то тут все гораздо сложнее. В MS
75
Visual C++, кроме макроса UNICODE, надо будет использовать специальную библиотеку unicows.lib, однако всех проблем она не решит. Например, все меню и заголовки окон придется перерисовывать вручную. Эта тема очень обширная, поэтому советую почитать в MSDN раздел Microsoft Layer for Unicode. Delphi/Builder создаст проблем. TNT Unicode Controls под Win9x/ME уже не выручат, так что надо искать что-ни- будь другое. Сразу хочу тебя огор- чить: мне не удалось найти бесплатного пакета юникодных компонентов на все случаи жизни. Может быть, ты сможешь? Я остановил свой выбор на пакете ElPack (www.lmd.de/products/lmdelpack). Стандартная версия стоит $99, ее вполне хватит для среднего шароварщика.
ИНТЕРФЕЙС
Очень часто возникают следующие проблемы: в русском переводе все нормально, а, допустим, в немецком строки получаются слишком длинные и залезают на другие элементы управления, вылезают за края формы и т.д. Что делать? Тут я дам два совета: во-первых, почти любую фразу можно сократить, во-вторых, учись проектировать интерфейсы. К сожалению, наши программисты известны всему миру навороченными донельзя программами и полным отсутствием usability. Поэтому, если ты не умеешь проектировать интерфейсы, советую курить MSDN до просветления. Можешь начать курить отсюда: http://msdn.microsoft.com/library/default.asp?url=/library/enus/dnanchor/html/anch_UIDesignDev.asp. Если курить не хочется, можно заказать проектирование интерфейсов профессионалам. У нас есть несколько контор (например, www.imho.com.ua), которые этим занимаются и за определенное вознаграждение грамотно расположат элементы управления на форме. E
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
i |
r |
|
P |
|
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
|||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
||
|
|
|
|
-x cha |
|
E |
|
|
|||
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
R |
|
|
|
|
|
|
|
|
|
|
|
A |
|
|
|
|
|
|
|
|
|
|
|
W |
|
|
|
|
|
|
|
|
|
|
|
S |
|
|
|
|
|
|
|
|
|
|
|
K |
|
|
|
|
|
|
|
|
|
|
|
C |
|
|
|
|
|
|
|
|
|
|
|
U |
|
|
|
|
|
|
|
|
|
|
|
B |
|
|
![](/html/77786/195/html_YxWH3geWho.dx16/htmlconvd-bKZthA78x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
|
|
||
P |
|
|
|
|
|
NOW! |
o |
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
BUY |
|
|
76 |
ТЕХНОЛОГИИ |
.NETКОНКУРЕНТАМ! |
||||||||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
m |
Скрыпников Сергей (http://slammy.ru) и Павел Сурменок |
|||||||||||||||
|
w |
|
|
|
|
|
|
|
o |
|||||||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
E |
-xcha |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
B U C K S W A R
.NET КОНКУРЕНТАМ!
ТЕХНОЛОГИЯ .NET НА ПАЛЬЦАХ
Ïро технологию .NET написано довольно много книг. В первой части этой статьи мы расскажем о плюсах и минусах "точки нет", а в во второй - вместе напишем простенький сканер портов, который может работать сразу в
несколько потоков.
PART ONE.
» ТЕОРИЯПОЧЕМУ .NET?
Технология .NET требует обязательного рассмотрения на страницах журнала, например, потому что компания Microsoft когда-то тратила около 70-80% (по различным источникам) своего бюджета на разработку этой технологии, после выхода технология получила широкий общественный резонанс в среде программистов, и положительных отзывов было неоспоримо больше, чем негативных. Третьей основной причиной можно назвать то, что dotNET широко используется для программирования web-серви- сов/web-служб, а в наше время трудно найти человека, у которого бы не было потребности в работе с интернетом, да и за разработку сетевых программ платят больше (если, например, сравнивать одинаковый объем работы программиста сетевых служб и "обыкновенного" :). Стоит учитывать, что и до появления технологии .NET разрабатывались сетевые службы, но в одиночку этого, как правило, никто не делал (для каждого правила есть, конечно, исключения), а сейчас это сделать проще простого.
LET'S GO
Итак, перейдем непосредственно к самой .NET: чем она хороша и что в
ней не устраивает нас. Будем придерживаться принципа "сложное - понятным языком", а в обильных технических терминах ты сможешь разобраться при дальнейшем изучении этой технологии. Начнем непосредственно с плюсов (здесь и далее будет в основном рассматриваться язык VB.NET, иногда в сравнении с VB 6.0).
ПЛЮСЫ
1."Мультиязычность" dotNET. Приложения можно писать на любом из нескольких десятков CLS-совмести- мых языков. Неполный список языков программирования ты можешь найти на одной из врезок.
2.Упрощение разработки. Среда разработки Visual Studio .NET предоставляет очень удобные и мощные средства разработки приложений. Очень мощный IntelliSense (что-то наподобие помощника в написании кода). Например, программист написал: "Dim stream As New FileStream", а он ему покажет в всплывающей подсказке (hint - это по-нашему :)) перегруженные варианты синтаксиса.
Еще пример: написал - stream, а IntelliSense тебе вывесит в список "Все свойства/методы объекта". В общем, очень удобная штука, реально помогающая при написании программ (хотя некоторые ругаются матом :) и отключают эту фишку). Также присутствуют различного рода "мастера", которые точно так же облегчают эту
Добро пожаловать в .NET
нелегкую жизнь и тебе, и мне, особенно в работе с данными: фактически простенькую форму данных или решетку (grid) с привязкой к БД можно настроить только с помощью мастеров, причем не написав ни строчки кода. А если еще и пару строчек кода добавить, то получится совсем шедевр - будешь ходить и за деньги всем предлагать :).
3.Цены и свободы. Если сравнить их, например, с Visual Studio 98, которая была монолитным и недешевым пакетом, то с .NET дело обстоит несколько свободнее. .NET Framework SDK, включающий основную документацию по .NET Framework, компиляторы языков VB .NET, VC# .NET, VC++
.NET, J# и др., а также ряд небольших утилит (например, визуальный дизайнер форм), поставляется полностью безвозмездно (можно свободно ска- чать с сайта http://microsoft.com). Таким образом, можно, не потратив ни копейки, писать программы, например, в "Блокноте" (хотя ОС в этом случае все равно придется покупать :)). Кроме того, существует ряд бесплатных средств разработки от сторонних производителей. Наиболее заметные из них: SharpDevelop (поставляется с исходным кодом) и WebMatrix - творение команды разработчиков ASP .NET, сделанное "на коленке" для каких-то своих нужд, но позже доработанное до приличного продукта; весит это чудо чуть меньше 2 Мб и даже включает в себя web-сервер для тестирования ASP
.NET приложений. Сама VS .NET поставляется в широком спектре модификаций, имеется даже бесплатная, но немного урезанная версия - Express.
4.Мощная библиотека классов .Net Framework Class Library содержит самые разные средства, которые могут понадобиться при разработке программ, таких как доступ к БД, создание интерфейса, работа с графикой (GDI+), XML (в том числе XPath, XSLT, XQuery), файловая система, криптография (шифрование, хэширование, цифровые подписи), сеть и многоемногое другое, о чем ты даже и не подозревал :).
ХАКЕРСПЕЦ 04(53) 2005
![](/html/77786/195/html_YxWH3geWho.dx16/htmlconvd-bKZthA79x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||
|
|
X |
|
|
|
|
|
|
||||
|
- |
|
|
|
|
|
d |
|
|
|||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
|
||
P |
|
|
|
|
|
NOW! |
o |
|
||||
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
|
|
|
||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
m |
|
||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
df-xchan |
|
|
o |
|
"МУЛЬТИЯЗЫЧНОСТЬ".NET |
||||
|
. |
|
.c |
|
||||||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
|
|
e |
|
|
Microsoft VB .NET Microsoft VC++ .NET Microsoft C# Microsoft J# Microsoft Jscript APL
ASNA Visual RPGRPG.NET Fujitsu COBOL
Micro Focus Cobol NetExpress
F# (a mixed functional/imperative anguage based on Caml from Microsoft Research)
Eiffel Delta Forth
Lahey/Fujitsu Fortran for .NET Salford Fortran
Hugs98 Haskell
Glasgow Haskell ActiveState Perl.NET ActiveState Python.NET Mark Hammond Python.NET Mercury.NET
Mondrian Component Pascal TMT Pascal
Tachy - subset of Scheme HotDog Scheme Smalltalk SmallScript SML.NET
QKS Smalltalk [dead] A#
Active Oberon for .net AsmL
CAML Delta Forth Dyalog APL
Fortran for .NET FTN95 for .NET Haskell
ML
NetCOBOL for .NET Perl
Python SmallScript (S#)
Классы для работы с сокетами
5.Потенциальная кроссплатформенность. DotNET-приложения первоначально компилируются в так называемый промежуточный код (MSIL - Microsoft Intermediate Language), который никак не зависит от "платформы", то есть от процессора и операционной системы. А компиляция в машинный код, зависимый от процессора (JIT-компиляция, Just-in-time-ком- пиляция), происходит уже на машине конечного пользователя (другими словами, на машине дядьки, который отвалил тебе много кэш за твою очень сложную и долгую работу :)) при первом запуске программы. Это позволяет (в теории) создавать кроссплатформенные приложения, то есть заставить один и тот же бинарник запуститься и под PC, и под Macintosh. Сейчас энтузиастами ведутся разработки вариантов .NET FW под Linux, FreeBSD и Macintosh. Например, можно сказать о Mono - dotNET-cреде для Linux, которая пока еще находится на стадии глубокой альфа-версии, но ходят слухи, что программировать под это чудо научной мысли уже вполне возможно. Конечно, настоящую живую кроссплатформенность мы пока не увидим, но "возможно все".
6.ASP .NET. ASP .NET (web-прило- жения .NET) - отдельная тема для разговоров. Сотрудники компании Microsoft потрудились и создали от-
COMMON LANGUAGE SPECIFICATION (CLS)
Для улучшения взаимодействия между языками в Microsoft .NET Framework введен языковый стандарт, Common Language Specification (CLS). CLS - это поднабор свойств языка, поддерживаемых CLR, включающий свойства, общие для большинства объект- но-ориентированных языков программирования. Если ты хочешь, чтобы твои компоненты и элементы управления можно было использовать из других языков программирования, нужно создавать их на CLR-совместимом языке и обеспечить совместимость всех общих и частных членов с CLR.
Источник: www.rsdn.ru.
77
личную штуку, как бы смешно на первый взгляд это ни казалось! Теперь разработка web-приложения сравнима с программированием под Windows. Визуальный дизайн страниц, система событий и т.д.
7.Обеспечение взаимодействия приложений. DotNET предоставляет на данный момент две технологии взаимодействия приложений: .NET XML Web Services и .NET Remoting. Web Services уже сейчас очень активно используются на крупных предприятиях. Например, интернет-магазин Ozon предоставляет web-сервис для получения информации о доступных
âмагазине книгах, что позволяет разработчикам других сайтов наладить получение этой информации и использование ее в своих корыстных целях (к примеру, на http://vbnet.ru в разделе "Магазин" список книг обновляется через этот web-сервис).
8.Если ты счастливый обладатель Windows 2003, то для тебя первый минус - никакой и не минус :).
9.Плюсы, показывающие себя во всей красе при создании кода :). О некоторых из них ты узнаешь в продолжении статьи, полностью все описать невозможно, так как изменений, повторяю, так много, что об этом уже пишу книги.
МИНУСЫ
Перейдем к минусам, потому что |
|
каждому известно, что в каждой боч- |
|
ке есть ложка, а в каких пропорциях, |
|
мы предлагаем тебе решать самосто- |
|
ятельно - здесь нужно опираться |
|
только на личные потребности и |
|
ощущения. |
|
1. Основным и достаточно весомым |
|
(во всех смыслах) аргументом против |
|
.NET является размер пакета .NET |
|
Framework, который необходим для |
|
работы .NET-приложений, то есть са- |
|
ма программа, например, может ве- |
|
сить 100 Кб, но она не запустится, по- |
|
ка не скачать вышеназванный пакет |
|
(правда, скачать его нужно всего |
» |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
E |
|
|||
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
R |
|
|
|
|
|
|
|
|
|
|
A |
|
|
|
|
|
|
|
|
|
|
W |
|
|
|
|
|
|
|
|
|
|
S |
|
|
|
|
|
|
|
|
|
|
K |
|
|
|
|
|
|
|
|
|
|
C |
|
|
|
|
|
|
|
|
|
|
U |
|
|
|
|
|
|
|
|
|
|
B |
|
![](/html/77786/195/html_YxWH3geWho.dx16/htmlconvd-bKZthA80x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
E |
-xcha |
|
|
|
|
||||
|
|
|
|
|
|
|
|
|||
|
R |
|
|
|
|
|
|
|
||
|
A |
|
|
|
|
|
|
|
||
|
W |
|
|
|
|
|
|
|
||
|
S |
|
|
|
|
|
|
|
||
|
K |
|
|
|
|
|
|
|
||
|
C |
|
|
|
|
|
|
|
||
|
U |
|
|
|
|
|
|
|
||
|
B |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
|
d |
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
P |
|
|
|
|
|
NOW! |
o |
||||
78 |
ТЕХНОЛОГИИ |
.NETКОНКУРЕНТАМ! |
|
|
|
|
|
BUY |
|
|
|||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w Click |
to |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
один раз). Его последний релиз весит |
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
e |
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
КАЧАТЬ ИЛИ ПЛАТИТЬ? |
|
|
|
|
|
|
|
|
|
|
|
p |
df |
-x cha |
g |
.c |
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
24 Мб, что заметно затрудняет расп- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
n |
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
ространение приложений через сеть |
|
|
Существуют частичные решения проблемы скачивания 24 Мб |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
интернет (особенно в странах exUSSR, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
|
дистрибутива .NET FW для пользователей. Например, некая фирма |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
где со связью не все в порядке). |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
2. С применением .NET невозможно |
|
RemoteSoft предлагает за абсолютно безумные деньги программу |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
создать такие же быстрые и компакт- |
|
для прилинковки к exe'шнику только тех частей .Net Framework, |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
ные приложения, какие делают, нап- |
|
без которых эта программа не сможет жить. В итоге размер дистри- |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
ример, в C++ или Assembler, что и по- |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
|
бутива уменьшается эдак до 3-5 Мб, но в фирме люди продуман- |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
нятно. Выше уровень программирова- |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
|
ные, поэтому продают программу по принципу "утром деньги - днем |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
ния (а ассемблер, например - низкоу- |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
ровневый язык программирования) - |
|
стулья" и даже Trial не предлагают: знают, что русские обязатель- |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
ниже скорость работы программ, но |
|
но поломают :). |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
при этом заметно выше скорость их |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
разработки. А что важнее для тебя, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
решай сам: если потенциальный за- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
казчик разработки ПО требует, чтобы |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
ему разработали приложение за реко- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
рдно короткое время, то, конечно, об- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
ращайся к .NET (хотя это не означает, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
что все остальное можно выкинуть в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
помойку). Если же он требует, чтобы |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
программа запускалась и на "трешке" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
(трешкаэто не PentiumIII (пояснение |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
для очень молодых), то надевай очки |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
с толстыми линзами и за ассемблер. |
|
|
|
||
|
3. Заявленная кроссплатформен- |
|
|
|
|
ность на момент написания статьи на- |
|
|
|
||
ходилась еще на стадии разработки, и |
|
|
|
||
полноценно использовать все плюсы |
|
|
|
||
новой технологии пока возможно |
|
|
|
||
только для систем на ОС Windows |
|
|
|
||
(кстати, если кроссплатформенность |
|
|
|
||
все же удастся реализовать, то, воз- |
|
|
|
||
можно, позднее появятся кроссплат- |
|
|
|
||
форменные вирусы, а счастливы бу- |
|
|
|
||
дут те, кто никогда не скачивал себе |
|
|
|
||
.NETFW). |
|
Внешний вид нового Windows-приложения |
|
||
|
4. Остальные минусы или совсем |
|
|
|
|
несущественны, или основаны не на |
же - большой TextBox txtLog |
Anchor=Left Or Top, ó txtHost è |
|||
объективной оценке. |
(Multiline=True, ScrollBars=Vertical), |
txtThreadsCount Anchor = Left Or Top |
|||
|
|
|
внизу - два Label (lblProgress1 и |
Or Right, у кнопки - Right Or Top, у txt |
|
PART TWO. |
lblProgress2). Располагать их, конеч- |
Log -Left Or Right Or Top Or Bottom, è, |
|||
но, ты можешь по своему усмотрению. |
наконец, у двух Label'ов внизу формы - |
||||
ПРАКТИКА |
Выставляем для каждого элемента |
Bottom Or Left Or Right. |
|||
|
|
|
|||
|
|
|
свойство Anchor, которое было заду- |
Интерфейс готов. Теперь напишем |
|
|
|
|
мано разработчиками .NET для авто- |
класс clsWorker, который будет зани- |
|
ПРОГРАММИРУЕМ НА VB.NET |
ресайза контролов при изменении |
маться основной работой - сканиро- |
|||
|
|
Итак, с теорией ты уже разобрал- |
размеров формы. У контролов с над- |
вать указанные порты удаленного |
|
|
|||||
|
|||||
ся и, наверное, хочешь посмотреть, |
писями "Хост" и "Кол-во потоков" |
хоста (именно это было твоим самым |
|||
как все происходит на практике. Мы |
|
|
|
||
долго думали, что же все-таки напрог- |
|
|
|
||
|
|
|
|||
раммировать, чтобы показать некото- |
|
|
|
||
рые средства языка/технологии, при |
|
|
|
||
этом уместиться на отведенную под |
|
|
|
||
статью площадь и понравиться тебе. |
|
|
|
||
Решили написать простенький сканер |
|
|
|
||
портов, который может работать сра- |
|
|
|
||
зу в несколько потоков. Начнем?! |
|
|
|
||
СКАНЕР ПОРТОВ |
|
|
|
||
|
|
Открываем Visual Studio .NET (при |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
разработке программы использова- |
|
|
|
||
лась версия 2003 Enterprise Architect - |
|
|
|
||
последний релиз), создаем новое |
|
|
|
||
Windows-приложение. Начнем с ин- |
|
|
|
||
терфейса. Форму мы по привычке пе- |
|
|
|
||
реименовываем в frmMain, пишем за- |
|
|
|
||
головок формы (в свойстве Text). Раз- |
|
|
|
||
мещаем на форме контролы: два |
|
|
|
||
Label с надписями "Хост" и "Кол-во |
|
|
|
||
потоков", рядом с ними два TextBox с |
|
|
|
||
именами txtHost и txtThreadsCount, |
|
|
|
||
кнопка btnStart (надпись "Старт"). Ни- |
|
Исходные тексты, как-никак :) |
|
||
|
|
|
|
|
|
ХАКЕРСПЕЦ 04(53) 2005