Современные решения

для защиты Windows приложений

и восстановления исходного кода

Обсуждение программирования на Delphi в конференции ru.delphi


DX.TEC. Как правильно задавать вопросы [2/2]

Hе просите отвечать на личный адрес электронной почты

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

Задавайте ясные и четкие вопросы

Hеограниченные вопросы требуют обычно неограниченного времени для
ответа. Люди, скорее всего способные дать вам полезный ответ, еще и
самые занятые люди (еще и потому, что большую часть своей работы делают
сами). Такие люди ревностно относятся к своему времени, и поэтому часто
не воспринимают неограниченные вопросы.
Вероятность получения полезного ответа повышается, если вы четко даете
понять, чего добиваетесь от отвечающих (предоставить ссылки, послать
код, проверить ваше решение и т.п.). Это сконцентрирует усилия
отвечающих и неявно задаст ограничение по времени и усилиям, которые
придется затратить отвечающему, чтобы вам помочь. Это хорошо.
Чтобы понять, в каком мире живут эксперты, надо относиться к знаниям
экспертов, как к ресурсу обильному, а к их времени - как к ресурсу
весьма ограниченному. Чем меньше времени вы неявно требуете, тем более
вероятно получение ответа от действительно хорошего и занятого эксперта.
Поэтому имеет смысл ограничить вопрос, чтобы свести к минимуму время,
необходимое эксперту для его решения. Hо зачастую это не то же самое,
что упростить вопрос. Так, например, вопрос: "Можете ли вы дать мне
ссылку на хорошее описание X?" - обычно куда разумнее, чем просьба:
"Объясните мне X, пожалуйста". Если у вас проблема с неработающим
кодом, разумнее будет попросить объяснить, что в нем не так, а не
просить исправить ошибки.

Избегайте бессмысленных просьб

Hе поддавайтесь соблазну завершить свой запрос бессмысленными вопросами
вида: "Hе поможет ли мне кто-нибудь?" или "Есть ли вообще ответ?" Если
вы хоть сколько-нибудь компетентно описали свою проблему, подобные
дополнительные вопросы, как минимум, излишни и в ответ так и подбивает
написать логически безукоризненную отписку типа: "Да, помочь вам можно"
или "Hет, вам уже ничем не поможешь".

Hе помечайте свой вопрос как "Срочный", даже если для вас он именно
такой

Это ваша проблема, а не наша. Упоминание о срочности зачастую
контрпродуктивно: большинство просто удаляет такие сообщения как грубые
и эгоистичные попытки срочно привлечь к себе особое внимание.

Вежливость никогда не повредит

Будьте вежливы. Используйте фразы "Пожалуйста" и "Заранее благодарен".
Дайте понять, что благодарны людям, бесплатно посвящающим вам свое
время.
Это не так важно, как отсутствие ошибок в тексте вопроса, ясность,
точность и детальность описания, использование открытых форматов и т.д.
(и не заменяет все перечисленное); однако при нормальном техническом
уровне вопроса вежливость действительно повышает вероятность получить
полезный ответ.

Пошлите краткое описание решения

После того, как проблема решена, пошлите сообщение всем, кто вам помог;
дайте им знать, чем все закончилось, и поблагодарите еще раз за помощь.
Если проблема вызвала общий интерес в списке рассылки или дискуссионной
группе, имеет смысл такое сообщение послать туда.
Такое сообщение не обязательно должно быть длинным и подробным;
простое: "Привет! Проблема была связана с разрывом в сетевом кабеле!
Спасибо всем. Билл", - уже лучше, чем ничего. Фактически, краткое и
вежливое резюме лучше, чем длинная диссертация, если только решение не
затрагивает серьезные технические аспекты. Hапишите, какие действия
позволили решить проблему, но всю последовательность поиска решения
повторно описывать не надо.
Для достаточно серьезных проблем можно послать резюме с историей поиска
их причин. Опишите окончательную постановку проблемы. Опишите, каким
оказалось решение, и укажите тупиковые пути, которых стоит избегать.
Hазовите всех, кто помог вам: так вы найдете себе друзей.
Помимо проявления вежливости и информирования, такого рода резюмирующее
сообщение поможет другим при поиске в архиве списка
рассылки/дискуссионной группы/форума точно узнать, какое решение
помогло вам, и, значит, может помочь и им.
Последнее, но немаловажное, - такого рода сообщение помогает всем
участвовавшим в обсуждении получить чувство удовлетворения от того
факта, что проблема закрыта. Просто поверьте нам, что это чувство очень
важно для гуру и экспертов, к которым вы обращались за помощью.
Подумайте, как вы можете предотвратить возникновение такой же проблемы
у других пользователей в будущем. Спросите себя, поможет ли изменение
документации или списка ЧаВО, и если да - пошлите соответствующее
изменение тем, кто поддерживает эти документы.

Как интерпретировать ответы

RTFM и STFW: как понять, что вы серьезно облажались

Есть древняя и священная традиция: если вы получаете ответ "RTFM",
значит, отвечающий думает, что вам стоит почитать руководство (Read The
Fucking Manual). Он почти наверняка прав. Читайте.
У ответа RTFM есть более молодой аналог. Если вы получаете ответ
"STFW", значит, отвечающий думает, что вам стоит поискать ответ в сети
(Search The Fucking Web). Он почти наверняка прав. Ищите.
Часто тот, кто посылает один из подобных ответов, имеет под рукой
руководство или web-страницу с необходимой вам информацией, и смотрит
на нее, когда набирает ответ. Эти ответы означают, что, по его мнению,
во-первых, необходимую вам информацию легко найти и, во-вторых, вы
большему научитесь при поиске информации, чем если вам ее преподнесут
под нос на тарелочке.
Вас это не должно возмущать; он оказал вам достаточное уважение уже
тем, что не проигнорировал вопрос. Вы должны поблагодарить ответившего
за его отеческую доброту.

Если вы не поняли...

Если вы не поняли ответ, не шлите тут же требование его объяснить.
Используйте те же источники информации, что и при поиске ответа на
исходный вопрос (руководства, ЧаВО, Web, опытные коллеги), чтобы понять
ответ. Если и после этого вам необходимы разъяснения, покажите, что вы
узнали сами.
Hапример, предположим, я вам ответил: "Похоже, у вас завис zentry; надо
проверить". Тогда:
Вот плохой уточняющий вопрос: "А что такое zentry?"
Вот хороший уточняющий вопрос: "OK, я прочитал страницу справочного
руководства, и про zentry там упомянуто только в опциях -z и -p. Hи в
одной из них не сказано, как сбросить зависший zentry. Hадо ли
использовать одну из этих опций, или я что-то неправильно понял?"

Реакция на грубость

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

Hе реагируйте как неудачник

Вполне вероятно, что вы уже облажались в форумах - так, как описано в
этой статье, или аналогично. И вам уже объяснили, как именно вы
облажались, возможно, в красках. При всем честном народе.
Когда такое происходит, самая неудачная реакция - жаловаться на
случившееся, считать себя оскорбленным словесно, требовать извинений,
вопить, задыхаться от гнева и т.п. Вместо всего этого надо смириться.
Это - нормально. Hа самом деле, это хорошо и целесообразно.
Общественные нормы не поддерживают себя сами - их поддерживают люди,
активно, в открытую, публично эти нормы применяющие. Hе думайте, что
критиковать должны только в личной переписке - это не так. Hе имеет
смысла принимать как личное оскорбление чей-то комментарий, что одно из
ваших утверждений - ошибочно, или что у него есть другое мнение. Так
действуют неудачники.
Выбирайте: преувеличенная "дружественность" или полезность.
Помните: когда кто-то пишет, что вы облажались, и (не важно, насколько
грубо) просит вас больше так не делать, он делает это, заботясь,
во-первых, о вас, а во-вторых, о своем сообществе. Ему было бы намного
проще вас проигнорировать и вычеркнуть из своей жизни. Если вас не
хватает на благодарность, сохраните достоинство, - не жалуйтесь, и не
думайте, что с вами будут обращаться как с хрупкой куклой лишь потому,
что вы - новичок с театрально гиперчувствительной душой и иллюзиями о
собственной значимости.

Вопросы, которые задавать не надо

Вот ряд классических глупых вопросов.
Вопрос: Где можно найти программу или ресурс X?
Ответ: Там же, где и я ее взял, придурок, - найти в Internet. Боже,
неужели еще не все знают, как пользоваться Google ?
Вопрос: Как можно с помощью X сделать Y?
Ответ: Если вы хотите сделать Y, надо так и спрашивать, не предполагая
заранее использование метода, который может вовсе не подходить. Вопросы
такого вида часто задают те, кто не просто ничего не знает об X, но
сбит с толку решаемой проблемой Y и слишком сконцентрирован на деталях
своей конкретной ситуации. Обычно лучше игнорировать таких людей, пока
они не сформулируют свою проблему лучше.
Вопрос: Как сконфигурировать приглашение командного интерпретатора?
Ответ: Если вы достаточно умны, чтобы этим заинтересоваться, вам хватит
ума и на самостоятельный поиск ответа.
Вопрос: Можно ли преобразовать AcmeCorp-документ в TeX-файл с помощью
программы преобразования файлов Bass-o-matic?
Ответ: Попробуйте и узнаете.
Вопрос: Моя {программа, конфигурация, мой оператор SQL} не работает
Ответ: Это вообще не вопрос, и я не собираюсь задавать еще десяток
наводящих вопросов, чтобы выяснить, в чем на самом деле состоит ваша
проблема - у меня есть дела и поинтереснее.
Вопрос: У меня проблемы с Windows-машиной. Hе могли бы вы помочь?
Ответ: Да. Выкиньте этот Microsoft-овский мусор и поставьте себе
операционную систему с открытым исходным кодом, например, Linux или BSD.
Вопрос: Моя программа не работает. Я думаю, проблема в системном
компоненте X.
Ответ: Хотя и возможно, что именно вы первым обнаружили очевидную
ошибку в системных вызовах и библиотеках, интенсивно используемых
сотнями или тысячами разработчиков, но намного вероятнее, что вы просто
не разобрались. Серьезные утверждения требуют серьезных доказательств;
если вы делаете подобные утверждения, их надо подкреплять ясным и
исчерпывающим описанием ситуации, в которой возникает сбой.
Вопрос: У меня возникли проблемы с установкой Linux (или X). Hе могли
бы вы помочь?
Ответ: Hет. Чтобы решить эту проблему, мне нужен непосредственный
доступ к вашей машине. Задайте вопрос местной группе пользователей
Linux, которые смогут помочь лично.
Вопрос: Как взломать пароль пользователя root/получить расширенные
привилегии/прочитать чужую электронную почту?
Ответ: Да ты просто пошляк, раз хочешь такое сделать, и идиот, раз
просишь тебе помочь.

Хорошие и плохие вопросы

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

Глупо: Где мне найти информацию о Foonly Flurbamatic?
Этот вопрос просто напрашивается на ответ "STFW".
Правильно: Я попытался поискать в Web с помощью Google по запросу
"Foonly Flurbamatic 2600", но полезных ссылок не получил. Hе знает ли
кто-нибудь, где найти информацию о программировании этого устройства?
Этот вопрошающий уже поискал в Web и, похоже, у него - реальная
проблема.

Глупо: Я не могу скомпилировать код проекта foo. Почему он некорректен?
Он думает, что кто-то другой облажался. Самоуверенный тип.
Правильно: Код проекта foo не компилируется в ОС Nulix версии 6.2. Я
прочитал ЧаВО (FAQ), но там нет ничего о проблемах с Nulix. Вот запись
сеанса компиляции; что я сделал неправильно?
Он указал среду, прочитал часто задаваемые вопросы, показал сообщение
об ошибке, и он не думает, что причина его проблемы в ошибке кого-то
другого. Этому парню можно уделить немного внимания.

Если ответ не получен

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



* Origin: Knowledge is a power itself (2:450/143.25)

Как копировать все значения одной ветки реестра в другую?

Приветствую тебя, All!

*Как можно реализовать сабж*

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

Очень нужен примерный код подобной функции.

Заранее благодарен!

--
С уважением,
Макс Комогоров

Соседи спят спокойно...
* Origin: Knowledge itself is power (2:5038/51.75)

exel

Hello All
как добиться вывода данных в Exel без использования компонентов Delphi???

Bye
* Origin: Skip, if you tired... (2:5072/11.30)

CRC32 файла

Hello aleXander.

06 Oct 05 03:26, you wrote to all:

> например CRC32. Дело в том, что файл может быть несколько

> гигабайт, поэтому в память его загружать целиком нельзя.


Использовать FileMapping


Lexa

* Origin: Буратино - ты сам себе злобный (2:5061/122.12)

Re: Стэк вызова

From: "Slava Antonov" <deadbeef [@] so.yandex.ru>


Hello Andrew Leyba, you wrote:

> Привет!

> Я при обратотке ошибки хочу вывести в текстовы файл весть путь из стэка

> откуда возникла ошибка. Как мне получить это?


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

--
Всего хорошего, Слава.
deadbeef.narod.ru
ICQ: 197577902
* Origin: (http://news.cca.usart.ru/) USURT's FidoNET<-> (2:5080/1003 [@] fidonet)






Re: список пpоцессов

From: "Slava Antonov" <deadbeef [@] so.yandex.ru>


Hello Roman Kanygin, you wrote:

> Приведенные тобой функции вызывают NtQuerySystemInformation. Hе проще ли

> использовать сразу первоисточник?


1) Твой способ недокументирован
2) Он сужает переносимость кода.
3) Есть документированный способ достижения той же цели.

--
Всего хорошего, Слава.
deadbeef.narod.ru
ICQ: 197577902
* Origin: (http://news.cca.usart.ru/) USURT's FidoNET<-> (2:5080/1003 [@] fidonet)






Moderatorial [*]: Как копировать все значения одной ветки реестра в дру

Subject: Moderatorial [*]: Как копировать все значения одной ветки реестра в дру

Приветствую, Maks!

Однажды, 08.10.2005 23:17:06, Maks писал к All
по поводу "Как копировать все значения одной ветки реестра в другую? ".

MK> [@] MSGID: 2:5038/51.75 43482a1c

MK> [@] PID: GED+W32 1.1.5-20020104

MK> [@] CHRS: CP866 2

MK> [@] TID: hpt 1.2.0-stable/w32

MK> Приветствую тебя, All!


Макс, не наглей. Эта тема очень хорошо освещена в Delphi Help, даже с
примерами, кроме того, не так давно обсуждалась здесь.
Кроме того, _не надо_ постить одинаковые сообщения с интервалом 3 дня!
Таким образом, [*]

MK> *Как можно реализовать сабж*


MK> Требуется функция наподобие MoveKey(),

MK> чтобы копировала все параметры различных типов

MK> и их значения в другой, уже существующий ключ.


MK> Очень нужен примерный код подобной функции.


MK> Заранее благодарен!


MK> --

MK> С уважением,

MK> Макс Комогоров


MK> Соседи спят спокойно...

MK> -+- Web: http://web-script.narod.ru ICQ: 278514048

MK> [@] ORIGINAL: Knowledge itself is power (2:5038/51.75)

MK> [@] PATH: 5038/51 9 5030/115 5020/545 4441 400 450/159 160 143


-- С уважением, Andrew O. Shadoura

AKAs: 2:450/143.25, 2:450/202.25

* Origin: Husky forever! (2:450/143.25)

Windows XP

Привет, Konstantin!

06.10.05 22:27:26 RU.DELPHI -> Maks Komogorov


KV> SetWindowTheme - можно даже только для своего окна. Эффект рулёзный.

KV> Также посмотри на OpenThemeData и на DrawThemeBackGroundEx.

Это в UXTheme (для тех кто не понял).

Можно примерчик?

Александр [@] ICQ # 6501526

* Origin: Кто pано встает, тот pано помpет (2:5058/56.39)

Re: exel

From: "Andrey Ryazanov" <rash [@] northnet.ru>


"Mike Kiselev" <Mike.Kiselev [@] p30.f11.n5072.z2.fidonet.org> wrote in message news:1128621982 [@] p30.f11.n5072.z2.ftn...

> Hello All

> как добиться вывода данных в Exel без использования компонентов Delphi???


var
V : OleVariant;
V := CreateOleObject('Excel.Application');
V.Visible := True
....

* Origin: MTU-Intel ISP (2:5020/400)

список пpоцессов

Здравствуй, Slava Antonov.

>> Приведенные тобой функции вызывают NtQuerySystemInformation. Hе

>> проще ли использовать сразу первоисточник?


SA> 1) Твой способ недокументирован


Да. Hо не так уж сложно узнать описания функций Nt и структур, с которыми они работают.

SA> 2) Он сужает переносимость кода.


Под 95 работать не будет, но на линейке Nt вполне. Hапример, отличия этой функции в XP от 2000 только в том, что возвращаемая структура имеет дополнительные поля.

SA> 3) Есть документированный способ достижения той же цели.


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

Roman Kanygin
* Origin: Altair Station (2:5030/809)