Re: "Крик души"
От: GUID Россия  
Дата: 09.11.03 12:39
Оценка: 20 (5)
Здравствуйте, Аноним, Вы писали:

А>Уж как программер искать «приличную» работу в Питере устал.

А>Проблема в том, что слегка молод (22 года), без "опыта". С неоконченным «высшим», 4-й курс вечернего, т.е. свободного времени хоть отбавляй. Но правда без сертификатов.
А>Надоело получать в ответ дежурные сообщения, что дескать "ваше резюме добавленно в нашу БД", в стили тех же Digital Design и Qbix.
А>Надоело и непробиваемое молчание, весьма типичное для компаний вроде Aelita, демонстрируемое в ответ на выполненные тестовые по 2-м позициям. При том что именно сия контора объявила набор стажеров и даже о записи на "обучение" молодых "спецов".

У меня нет, к сожалению, рецензии именно Вашего тестового задания (речь идет о этом задании), но, для иллюстрации, я приведу два примера (успешный и не успешный) рецензий тестовых заданий месячной давности, чтобы показать, что во-первых, задания анализируются, во-вторых, что одного только факта исполнения кандидатом тестового задания недостаточно — еще важно КАК он его сделал:

Пример 1 (отрицательный).

Плюсы:

Минусы:

В общем, решили не приглашать.

Пример 2 (положительный)

Плюсы



Минусы:


Мнение рецензента: "Не знаю как на ведущего, а на простого "программиста второго уровня" вполне тянет".

Кандидата пригласили на собеседование.
Re[3]: "Крик души"
От: alexandrov_alex США  
Дата: 10.11.03 09:11
Оценка: +2 -1
Здравствуйте, Дарней, Вы писали:

GUI>> — catch(...) — за это у нас "расстреливают";

Д>
Д> интересно, а почему он так плох? я всегда ставлю один на верхнем уровне.
Д> Если прога выдаст "unknown error" — это всё-таки лучше, чем "access
Д> violation" по крайней мере, юзера не так напугает.
Д>
Д> Только не надо кричать, что "у настаящих програмеров не бывает access
Д> violation" — почти любая прога использует "чужие" компоненты, которые
Д> имеют обыкновение меняться непредсказуемым образом. Да и в своей проге
Д> нельзя учесть все возможные сценарии. По крайней мере, за конечное время
Д>

Когда разрабатывается компонент, который предполагается встраивать куда-либо, то он должен иметь свои классы исключений и ловить ТОЛЬКО их и ВСЕ их. Иначе каша, месье...

-- Всего хорошего!
-- Alex Alexandrov, e-mail: alex_alexandrov@fromru.com
Posted via RSDN NNTP Server 1.8 beta
It's kind of fun to do the impossible (Walt Disney)
Re[7]: OFFTOP: "Крик души"
От: Дарней Россия  
Дата: 10.11.03 11:37
Оценка: +2
T>Дык не будет отладчика если задушить AV.

почему это не будет? как настроишь, так и будет. Если конечно знаешь, как ошибку вызвать — и можешь запустить прогу из под отладчика.

T>И что делать — если приходит тестер — говорит — у меня падает....иногда

T>А если это сервис? и падает он раз в 2 недели когда попадает в какую-либо незнакомую ситуацию (о простой порче памяти я не говорю) ?
T>И воспроизвести не так-то просто?

T>Без DMP тут мало что поделать можно


логи, assert'ы и инварианты, конечно. Через dump тоже наверно можно, но это какой-то совсем уж садистический метод

Предлагаю не устраивать очередной holy war. Хоть я и не согласен с расстрелом в качестве наказания за catch(...), но....
У всех свои тара... прошу прощения, методы работы Кто-то искореняет в прогах STL, кто-то catch(...) — это уж кому как нравится.
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[5]: OFFTOP: Re[7]: "Крик души"
От: Андрей Галюзин Украина  
Дата: 10.11.03 17:54
Оценка: +2
АГ>>
АГ>>template <typename T>
АГ>>void some_function(const T& original)
АГ>>{
АГ>>  try
АГ>>  {
АГ>>    T copy = original;
АГ>>    // other work
АГ>>  }
АГ>>  catch (...)
АГ>>  {
АГ>>    // cleanup
АГ>>    throw;
АГ>>  }
АГ>>}
АГ>>


G> Смотря что такое cleanup?

G> Если простая подчистка ресурсов так используйте смарт-поинтеры, классы-стражи, функторы и тп,
G> которые в деструкторе все сделают. ( Их можно передавать и темплейтным параметром)
G> Если это какой-то частный роллбэк только и только в случаях ошибки, я бы не стал это
G> запихивать в темплейтную функцию и пересмотрел бы дизайн решения.
G> Можно и в этом случае кстати попробовать предать какой-то функтор.

Согласен. Но в некоторых случаях сложность стражей превосходит сложность такого решения.
Чуть ниже Alexey Shirshov привел хороший пример.

G> Самое плохое в единичном catch (...) — это глотание ошибки.

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

G> а)Глотать _свои_ ошибки с моей точки зрения очень и очень плохо.

G> Я там видел в ветке народ предлагает для релиза ставить catch(...), так вот пусть
G> лучше она упадет и создаст Dr.Watson log. чем
G> выдаст "Unknown error" и тем самым похоронит что там за ошибка была и почему.

Для меня наиболее симпатичный вариант таков:
catch (...) на верхнем уровне приложения в котором создается дамп и выдается окошко с возможностью отослать лог + дамп
разработчикам. При этом скрываются детали ошибки (их все же можно посмотреть клацнув по кнопочке), которые большинству пользователей
не нужны и только добавят паники. Опытные пользователи при необходимости их смогут увидеть.
Вобщем почти всё так же, как по умолчанию (WinXP) .
Только окошко свое (пользователь будет думать "они контролируют ситуацию"), создание дампа не зависит от установленного в системе
отладчика и его настроек, возможность одним щелчком отправить багу разработчику да еще и в установленном разработчиком формате.

А вот научить пользователя отправлять лог и дамп в стандартном случае не так-то просто

--
aga
Posted via RSDN NNTP Server 1.7 "Bedlam"
"Крик души"
От: Аноним  
Дата: 08.11.03 22:49
Оценка: 1 (1)
Подозреваю, что сие уж многим и оскомину набило...
Уж как программер искать «приличную» работу в Питере устал.
Проблема в том, что слегка молод (22 года), без "опыта". С неоконченным «высшим», 4-й курс вечернего, т.е. свободного времени хоть отбавляй. Но правда без сертификатов.

Надоело получать в ответ дежурные сообщения, что дескать "ваше резюме добавленно в нашу БД", в стили тех же Digital Design и Qbix.
Надоело и непробиваемое молчание, весьма типичное для компаний вроде Aelita, демонстрируемое в ответ на выполненные тестовые по 2-м позициям. При том что именно сия контора объявила набор стажеров и даже о записи на "обучение" молодых "спецов".
Надоело приезжать на собеседование и с телефона проходной в оффис слышать "у нас накладка, мы свяжемся с вами позже".
Надоели сотрудники кадровых агентств тупо следующие неведомым инструкциям подбора кандидатов.

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

Понятно мне, что обивающих пороги море.
Но почему б не озаботить человека тестовым, вместо шаблонных-то ответов? А уж по результатам, вызвав на ковер, и посмотреть на оного?

Не уж то надо устроиться куда-нибудь, лишь бы взяли и стаж потек?
И только через 2-3 года со мною соизволят разговаривать "приличные конторы"?

А может просто я дурак напыщенный и вот подобного для "старта" маловато?
(по 5-ти бальной):
win32API 4
COM/DCOM/COM+ 3/2/2
ATL/WTL 3/2
ActiveX 4
ADO 2
SQL/T-SQL 3/3
C/C++ 4/4
VB 4
Asm 386(real/protected mode) 3/3

Уж не поймите, дамы/господа, меня превратно...
Нельзя ж все время быть на «удаленке», да и множество «полукоммерческих» проектов надоело.

Может подскажите чего?

-Сергей. traffic81@inbox.ru
Re: "Крик души"
От: Аноним  
Дата: 09.11.03 02:26
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Может подскажите чего?


А ты не кричи душой, она ведь не казенная у тебя. Сейчас лучше с поиском работы повременить. В декабре, смело начинай, только не зацикливайся на этих "приличных" конторах. А пока есть время, подумай что было хорошего прежде, а чего лучше в будующем избежать, нарисуй мечту, представь ее как сюжет фильма. Приличная работа — это не цель.
Re[2]: "Крик души"
От: Дарней Россия  
Дата: 10.11.03 05:44
Оценка: +1
GUI> — catch(...) — за это у нас "расстреливают";

интересно, а почему он так плох? я всегда ставлю один на верхнем уровне.
Если прога выдаст "unknown error" — это всё-таки лучше, чем "access violation"
по крайней мере, юзера не так напугает.

Только не надо кричать, что "у настаящих програмеров не бывает access violation" — почти любая прога использует "чужие" компоненты, которые имеют обыкновение меняться непредсказуемым образом. Да и в своей проге нельзя учесть все возможные сценарии. По крайней мере, за конечное время
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re: "Крик души"
От: adontz Грузия http://adontz.wordpress.com/
Дата: 08.11.03 23:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нельзя ж все время быть на «удаленке»,


Почему? Многие сидят (у нас в Грузии) и ничего, неплохо живут. Даже меня в эту авантюру затянули пару раз
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: "Крик души"
От: iddqd Россия  
Дата: 09.11.03 03:27
Оценка:
А>> Может подскажите чего?
>
>А ты не кричи душой, она ведь не казенная у тебя. Сейчас лучше с поиском >работы повременить. В декабре, смело начинай, только не зацикливайся на >этих "приличных" конторах. А пока есть время, подумай что было хорошего >прежде, а чего лучше в будующем избежать, нарисуй мечту, представь ее как >сюжет фильма. Приличная работа — это не цель.
Почему стоит повременить до декабря?

Приличная работа это не цель, а лишь средство. Для самореализации, обеспечения себе достойного существования. Например, так или иначе дистанцироваться от некоторых социальных слоев
Posted via RSDN NNTP Server 1.8 beta
Re[3]: "Крик души"
От: Аноним  
Дата: 09.11.03 04:09
Оценка:
Здравствуйте, iddqd, Вы писали:

А>>> Может подскажите чего?

>>
>>А ты не кричи душой, она ведь не казенная у тебя. Сейчас лучше с поиском >работы повременить. В декабре, смело начинай, только не зацикливайся на >этих "приличных" конторах. А пока есть время, подумай что было хорошего >прежде, а чего лучше в будующем избежать, нарисуй мечту, представь ее как >сюжет фильма. Приличная работа — это не цель.
I>Почему стоит повременить до декабря?

Доверься

I>Приличная работа это не цель, а лишь средство. Для самореализации, обеспечения себе достойного существования. Например, так или иначе дистанцироваться от некоторых социальных слоев


А у тебя уже есть своя мечта?
Re[2]: "Крик души"
От: iddqd Россия  
Дата: 09.11.03 13:51
Оценка:
Ну тестовое на то и тестовое, насколько помню у Aelita оные шли на программера и тестера. Если человек выполняет оба, то либо он сам не знает чего хочет, либо почему-то очень впечатлен вашей компанией. А теперь представьте, что в ответ он получает гробовое молчание... и как ему следует относиться к подобному?
Ведь преданность работника своей компании это весьма и весьма важная вещь.

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

Уж ответить то можно, что мол рассморели и советуем немного подучится.
Posted via RSDN NNTP Server 1.8 beta
Re[4]: "Крик души"
От: tsR Россия  
Дата: 10.11.03 03:01
Оценка:
> А у тебя уже есть своя мечта?
Мечта есть, однозначно, она наверное не может не есть
Posted via RSDN NNTP Server 1.8 beta
Re[2]: "Крик души"
От: Дарней Россия  
Дата: 10.11.03 05:46
Оценка:
Здравствуйте, GUID, Вы писали:

кстати, а за using namespace std; у вас расстреливают?
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[3]: "Крик души"
От: beretta Россия icq: 138726397
Дата: 10.11.03 06:19
Оценка:
Здравствуйте, Дарней, Вы писали:

GUI>> — catch(...) — за это у нас "расстреливают";


Д>интересно, а почему он так плох? я всегда ставлю один на верхнем уровне.


Вот, вот я что-то тоже не понял. Если прога вываливается, то перед этим можно хоть какие-то данные сохранить.
... << RSDN@Home 1.1.0 stable >>
Re[4]: OFFTOP: "Крик души"
От: trial  
Дата: 10.11.03 08:25
Оценка:
Здравствуйте, beretta, Вы писали:

B>Здравствуйте, Дарней, Вы писали:


GUI>>> — catch(...) — за это у нас "расстреливают";


Д>>интересно, а почему он так плох? я всегда ставлю один на верхнем уровне.


B>Вот, вот я что-то тоже не понял. Если прога вываливается, то перед этим можно хоть какие-то данные сохранить.


Если программа вываливается по неизвестным причинам — кто даст гарантию что эти данные имеют смысл?

Но это ладно, мне больше интерестно как отлаживаться при задушенных AV...обычно-то — упали с AV, взяли полученный dmp-файл, открыли в студии и смотрим как дошли до такой жизни....А если придушить AV то как сиё проделать?
Re[4]: "Крик души"
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 10.11.03 09:44
Оценка:
Здравствуйте, alexandrov_alex, Вы писали:

[]

_>Когда разрабатывается компонент, который предполагается встраивать куда-либо, то он должен иметь свои классы исключений и ловить ТОЛЬКО их и ВСЕ их. Иначе каша, месье...


Не согласен.
Следующий код вполне нормальный и очень часто встречается:
try{
  //do some work
}
catch(...){
  //do some cleanup
    throw;
}
... << RSDN@Home 1.1.0 stable >>
Re[4]: "Крик души"
От: Дарней Россия  
Дата: 10.11.03 10:33
Оценка:
_>Когда разрабатывается компонент, который предполагается встраивать куда-либо, то он должен иметь свои классы исключений и ловить ТОЛЬКО их и ВСЕ их. Иначе каша, месье...

остается только убедить в этом всех разработчиков компонент на рынке. А также отучить их делать ошибки
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[5]: "Крик души"
От: Ilia Kozin Россия  
Дата: 10.11.03 10:36
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Не согласен.

AS>Следующий код вполне нормальный и очень часто встречается:
AS>
AS>try{
AS>  //do some work
AS>}
AS>catch(...){
AS>  //do some cleanup
AS>    throw;
AS>}
AS>


ИМХО, а вот тут я с вами не согласен, относительно того что этот код нормальный.
Поясню свое несогласие: наличие такого кода говорит о неверно спроектированной архитектуре приложения.
Если взять хорошо продуманные библитотеки (.NET, VCL) и посмотреть на то какие они исключения наружу передают, то увидим что у всех исключений есть базовый класс, так вот, на крайний случай его и надо ловить. Такой подход позволяет использовать, например Microsoft Application Blocks for .NET, а далее уж сами решайти, что с исключениями делать, оповещать о них или записывать куда-либо.

try{
  //do some work
}
catch(Exception e){
  //do some cleanup
    throw;
}


Илья.
... << RSDN@Home 1.1.0 stable >>
Re[5]: OFFTOP: "Крик души"
От: Дарней Россия  
Дата: 10.11.03 10:37
Оценка:
T>Если программа вываливается по неизвестным причинам — кто даст гарантию что эти данные имеют смысл?

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

T>Но это ладно, мне больше интерестно как отлаживаться при задушенных AV...обычно-то — упали с AV, взяли полученный dmp-файл, открыли в студии и смотрим как дошли до такой жизни....А если придушить AV то как сиё проделать?


отлаживаться — в отладчике, конечно
И это актуально только для отладки, а не для релиза.
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[5]: OFFTOP: "Крик души"
От: beretta Россия icq: 138726397
Дата: 10.11.03 10:45
Оценка:
Здравствуйте, trial, Вы писали:

T>Но это ладно, мне больше интерестно как отлаживаться при задушенных AV...обычно-то — упали с AV, взяли полученный dmp-файл, открыли в студии и смотрим как дошли до такой жизни....А если придушить AV то как сиё проделать?


AV, не AV, а эксепшенов разных хватает.

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

Или у вас юзеры:

...обычно-то — упали с AV, взяли полученный dmp-файл, открыли в студии и смотрим как дошли до такой жизни....


Представляю их сосредоточенные лица.
... << RSDN@Home 1.1.0 stable >>
Re[5]: "Крик души"
От: beretta Россия icq: 138726397
Дата: 10.11.03 10:45
Оценка:
Здравствуйте, Дарней, Вы писали:

_>>Когда разрабатывается компонент, который предполагается встраивать куда-либо, то он должен иметь свои классы исключений и ловить ТОЛЬКО их и ВСЕ их. Иначе каша, месье...


Д>остается только убедить в этом всех разработчиков компонент на рынке. А также отучить их делать ошибки


Не расстрелять эффективнее
... << RSDN@Home 1.1.0 stable >>
Re[6]: OFFTOP: "Крик души"
От: trial  
Дата: 10.11.03 10:45
Оценка:
Здравствуйте, Дарней, Вы писали:

T>>Но это ладно, мне больше интерестно как отлаживаться при задушенных AV...обычно-то — упали с AV, взяли полученный dmp-файл, открыли в студии и смотрим как дошли до такой жизни....А если придушить AV то как сиё проделать?


Д>отлаживаться — в отладчике, конечно

Д>И это актуально только для отладки, а не для релиза.

Дык не будет отладчика если задушить AV.

И что делать — если приходит тестер — говорит — у меня падает....иногда
А если это сервис? и падает он раз в 2 недели когда попадает в какую-либо незнакомую ситуацию (о простой порче памяти я не говорю) ?
И воспроизвести не так-то просто?

Без DMP тут мало что поделать можно


Ситуация когда это говорит клиент совсем иная, естестенно.
Re[6]: OFFTOP: "Крик души"
От: trial  
Дата: 10.11.03 10:46
Оценка:
Здравствуйте, beretta, Вы писали:


B>Или у вас юзеры:


B>

B>...обычно-то — упали с AV, взяли полученный dmp-файл, открыли в студии и смотрим как дошли до такой жизни....


B>Представляю их сосредоточенные лица.


не юзеры, а тестеры

Есть разница?
Re[6]: "Крик души"
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 10.11.03 11:11
Оценка:
Здравствуйте, Ilia Kozin, Вы писали:

хъ

IK>ИМХО, а вот тут я с вами не согласен, относительно того что этот код нормальный.


Для С++ нормальный.

IK>Поясню свое несогласие: наличие такого кода говорит о неверно спроектированной архитектуре приложения.


В корне не согласен.

IK>Если взять хорошо продуманные библитотеки (.NET, VCL)


.Net — не библиотека.

IK> и посмотреть на то какие они исключения наружу передают, то увидим что у всех исключений есть базовый класс, так вот, на крайний случай его и надо ловить. Такой подход позволяет использовать, например Microsoft Application Blocks for .NET, а далее уж сами решайти, что с исключениями делать, оповещать о них или записывать куда-либо.


IK>
IK>try{
IK>  //do some work
IK>}
IK>catch(Exception e){
IK>  //do some cleanup
IK>    throw;
IK>}
IK>


IK>Илья.


Для отчистки лучше использовать finally, однако и такой код ничего. Сам часто так пишу, но не нужно путать С++ с дотнетом.
... << RSDN@Home 1.1.0 stable >>
Re[5]: "Крик души"
От: alexandrov_alex США  
Дата: 10.11.03 11:22
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS> Не согласен.

AS> Следующий код вполне нормальный и очень часто встречается:
AS>
 AS> try{
 AS>   //do some work
 AS> }
 AS> catch(...){
 AS>   //do some cleanup
 AS>  throw;
 AS> }
 AS>


Я в этом случае сделаю обертку и не буду морочить голову ни себе, ни тому, кто будет этот код за мной поддерживать. Catch должен предполагать, что исключение поймано и наружу не выходит. Делать опять throw не здорово.

-- Всего хорошего!
-- Alex Alexandrov, e-mail: alex_alexandrov@fromru.com
Posted via RSDN NNTP Server 1.8 beta
It's kind of fun to do the impossible (Walt Disney)
Re[6]: "Крик души"
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 10.11.03 11:42
Оценка:
Здравствуйте, alexandrov_alex, Вы писали:

хъ

_>Я в этом случае сделаю обертку и не буду морочить голову ни себе, ни тому, кто будет этот код за мной поддерживать.


Согласен, однако чем млохо это решиние (и чем оно отличается о написания тысячи оберток) я не понимаю.

_>Catch должен предполагать, что исключение поймано и наружу не выходит.


Почему?

_>Делать опять throw не здорово.


Почему?
... << RSDN@Home 1.1.0 stable >>
Re[7]: "Крик души"
От: alexandrov_alex США  
Дата: 10.11.03 12:02
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>

AS> _>Я в этом случае сделаю обертку и не буду морочить голову ни себе, ни
AS> тому, кто будет этот код за мной поддерживать.
AS>
AS> Согласен, однако чем млохо это решиние (и чем оно отличается о
AS> написания тысячи оберток) я не понимаю.
AS>
AS> _>Catch должен предполагать, что исключение поймано и наружу не
AS> выходит.
AS>
AS> Почему?
AS>
AS> _>Делать опять throw не здорово.
AS>
AS> Почему?

Леш, ну мы же конструктивные люди...
Можно сделать и так, и так: работать будет. Тут дело просто в личных предпочтениях. Я выберу обертки, потому что уважаю Страуструпа. А он говорил: Resource Allocation Is Initialization. Освобождение ресурсов в __finally (а твой catch(...) {throw;} это всего лишь псевдоfinally), это стиль, навязанный нам Microsoft. Конструкторы-деструкторы выглядят изящнее (для меня). К тому же try/catch зависят от msvcrt.dll, а конструкторы-деструкторы работают всегда (имею в виду стековые переменные).

-- Всего хорошего!
-- Alex Alexandrov, e-mail: alex_alexandrov@fromru.com
Posted via RSDN NNTP Server 1.8 beta
It's kind of fun to do the impossible (Walt Disney)
OFFTOP: Re[7]: "Крик души"
От: Ilia Kozin Россия  
Дата: 10.11.03 12:22
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Для С++ нормальный.

см ниже.

AS>В корне не согласен.

Опять же это все ИМХО, но хотелось бы узнать мнение. Чем хорош способ catch(...) в отличии от catch(Exception e)?
Если взглянуть на платфоры/библиотеки/технологии — .NET/VCL/COM, то в них есть интрефейс/класс для обработки ошибок.
1) Если программист использует catch (...), то получается он не знает какой фортиль выкинет его программа — ИМХО, это не хорошо и это просчеты в проектировании.
2) Если же он знает о поведении программы, то почему бы не написать класс исключения и с ним работать
плюсы:
а) "типизирование" ошибки
б) подробная информация
г) возможность использовать аналоги Microsoft Application Blocks for .NET для конкретной платформы и языка (для систем малого и среднего бизнеса это большой и жирный плюс)
минусы:
а) необходимость написания обертки для сторонних библиотек (но политика, некоторых компаний, не позволяет использовать внешние компоненты, чтобы не быть зависимыми от них и их багов, моя компания относиться к этим)

AS>.Net — не библиотека.

Согласен, просто хотел одним темином объединить .NET и VCL, впредь буду более корректным

AS>Для отчистки лучше использовать finally, однако и такой код ничего. Сам часто так пишу, но не нужно путать С++ с дотнетом.

Согласен, сам так делаю но речь шла catch, а с .NET не путаю, в теге ясно было указано что это код для C++
... << RSDN@Home 1.1.0 stable >>
Re[8]: "Крик души"
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 10.11.03 12:25
Оценка:
Здравствуйте, alexandrov_alex, Вы писали:

хъ

_>Леш, ну мы же конструктивные люди...


Вне сомнения, однако истина дороже.

_>Можно сделать и так, и так: работать будет. Тут дело просто в личных предпочтениях. Я выберу обертки, потому что уважаю Страуструпа. А он говорил: Resource Allocation Is Initialization. Освобождение ресурсов в __finally (а твой catch(...) {throw;} это всего лишь псевдоfinally), это стиль, навязанный нам Microsoft.


Хм. Спорное утверждение.

_>Конструкторы-деструкторы выглядят изящнее (для меня). К тому же try/catch зависят от msvcrt.dll, а конструкторы-деструкторы работают всегда (имею в виду стековые переменные).


Рантайм можно статические прилинковать.
И потом, дело не только в выделении ресурсов (к которым я сам предпочитаю писать обертки).
Например:
void some_class::foo()
{
  try{
    //do some work
  }
  catch(...){
    //log the message - there was error during some_class::foo
    throw;
  }
}


Это можно, конечно, обернуть в что-то вроде
void some_class::foo()
{
  struct local{
    bool _ok;
    local(){_ok = false;}
    do_work(){          
      //do some work
      _ok = true;
    }
    ~local(){
      if (!_ok){
        //log the message - there was error during some_class::foo
      }
    }
  } l;l.do_work();
}


Однако первый вариант я почему-то предпочитаю больше.
... << RSDN@Home 1.1.0 stable >>
Re: OFFTOP: Re[7]: "Крик души"
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 10.11.03 12:34
Оценка:
Здравствуйте, Ilia Kozin, Вы писали:

хъ

IK>Если взглянуть на платфоры/библиотеки/технологии — .NET/VCL/COM, то в них есть интрефейс/класс для обработки ошибок.


И в STL есть, однако std::exception слишком мало покрывает.

IK>1) Если программист использует catch (...), то получается он не знает какой фортиль выкинет его программа — ИМХО, это не хорошо и это просчеты в проектировании.


Странно. А как можно быть увереным, что твой код не выкинет исключения, типа stack_overflow? Да и банальный AV — не редкость.

IK>2) Если же он знает о поведении программы, то почему бы не написать класс исключения и с ним работать

IK>плюсы:
IK> а) "типизирование" ошибки
IK> б) подробная информация
IK> г) возможность использовать аналоги Microsoft Application Blocks for .NET для конкретной платформы и языка (для систем малого и среднего бизнеса это большой и жирный плюс)

Согласен со всем, однако не все исключения, которые возникают в программе являются "нашими". Это верно для С++, но не верно для CLS-совместимого кода, в котором все исключения должны быть предком идного класса.

хъ

AS>>Для отчистки лучше использовать finally, однако и такой код ничего. Сам часто так пишу, но не нужно путать С++ с дотнетом.

IK>Согласен, сам так делаю но речь шла catch, а с .NET не путаю, в теге ясно было указано что это код для C++

Вот именно, речь шла о catch в плюсах. А использовать в них std::exception для ловли всех исключений к сожалению невозможно.
... << RSDN@Home 1.1.0 stable >>
Re: OFFTOP: Re[7]: "Крик души"
От: Аноним  
Дата: 10.11.03 13:20
Оценка:
IK>минусы:
IK> а) необходимость написания обертки для сторонних библиотек (но политика, некоторых компаний, не позволяет использовать внешние компоненты, чтобы не быть зависимыми от них и их багов, моя компания относиться к этим)

Т.е. как минимум не позволять расширятся приложению через плагины как у Adobe Photoshop, Visual Studio, MS Office ... или не использовать кодеки как у Windows Media Player или не давать возможности в свои документы вставлять OLE объекты кроме возможно избранных производителей...

Так? Так можно и из обоймы выпасть
Re[2]: OFFTOP: Re[7]: "Крик души"
От: Ilia Kozin Россия  
Дата: 10.11.03 13:21
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Странно. А как можно быть увереным, что твой код не выкинет исключения, типа stack_overflow? Да и банальный AV — не редкость.

Это было год назад, сечас пишу под .NET, не знаю, возможно это магия или что-то еще, но мне как-то удавалось этого избежать на C++ особенно AV, возможно мне в этом помогали PurifyPlus и BoundsChecker ну и возможно играет роль "тип" приложения

AS>Согласен со всем, однако не все исключения, которые возникают в программе являются "нашими". Это верно для С++, но не верно для CLS-совместимого кода, в котором все исключения должны быть предком идного класса.

Согласен, но это уже получается дело вкуса, я бы в таком случае поставил бы несколько catch вместо catch(...),
а при необходимости наверх бы передавал бы свой класс исключения в котором сообщал детальную информацию об ошибке.
Снова повторюсь — это дело вкуса ... и методов проектирования
catch (Exception e)
{
}
catch (int i)
{
}



AS>Вот именно, речь шла о catch в плюсах. А использовать в них std::exception для ловли всех исключений к сожалению невозможно.

см выше
... << RSDN@Home 1.1.0 stable >>
Re[2]: OFFTOP: Re[7]: "Крик души"
От: Ilia Kozin Россия  
Дата: 10.11.03 13:30
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Т.е. как минимум не позволять расширятся приложению через плагины как у Adobe Photoshop, Visual Studio, MS Office ... или не использовать кодеки как у Windows Media Player или не давать возможности в свои документы вставлять OLE объекты кроме возможно избранных производителей...


А>Так? Так можно и из обоймы выпасть


... << RSDN@Home 1.1.0 stable >>
Re[9]: "Крик души"
От: alexandrov_alex США  
Дата: 10.11.03 14:03
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>

AS> _>Конструкторы-деструкторы выглядят изящнее (для меня). К тому же
AS> try/catch зависят от msvcrt.dll, а конструкторы-деструкторы работают
AS> всегда (имею в виду стековые переменные).
AS>
AS> Рантайм можно статические прилинковать.

Я имел в виду те ситуации, когда от рантайма вообще избавиться задумано.

AS> И потом, дело не только в выделении ресурсов (к которым я сам

AS> предпочитаю писать обертки). Например:
AS>
 AS> void some_class::foo()
 AS> {
 AS>   try{
 AS>     //do some work
 AS>   }
 AS>   catch(...){
 AS>     //log the message - there was error during some_class::foo
 AS>     throw;
 AS>   }
 AS> }
 AS>

AS>
AS> Это можно, конечно, обернуть в что-то вроде
AS>
 AS> void some_class::foo()
 AS> {
 AS>   struct local{
 AS>     bool _ok;
 AS>     local(){_ok = false;}
 AS>     do_work(){    
 AS>       //do some work
 AS>       _ok = true;
 AS>     }
 AS>     ~local(){
 AS>       if (!_ok){
 AS>         //log the message - there was error during some_class::foo
 AS>       }
 AS>     }
 AS>   } l;l.do_work();
 AS> }
 AS>

AS>
AS> Однако первый вариант я почему-то предпочитаю больше.
Здесь согласен. Правда, если бы под Вижуалом нормально работала функция uncaught_exception(), то все можно было бы сделать куда красивее... В 7.0 она нормальная, не знаешь?


-- Всего хорошего!
-- Alex Alexandrov, e-mail: alex_alexandrov@fromru.com
Posted via RSDN NNTP Server 1.8 beta
It's kind of fun to do the impossible (Walt Disney)
Re[3]: OFFTOP: Re[7]: "Крик души"
От: Андрей Галюзин Украина  
Дата: 10.11.03 14:30
Оценка:
IK> Согласен, но это уже получается дело вкуса, я бы в таком случае поставил бы несколько catch
IK> вместо catch(...),
IK> а при необходимости наверх бы передавал бы свой класс исключения в котором сообщал детальную
IK> информацию об ошибке.
IK> Снова повторюсь — это дело вкуса ... и методов проектирования
IK>
IK> catch (Exception e)
IK> {
IK> }
IK> catch (int i)
IK> {
IK> }
IK>


А, по-моему, вкус здесь не причём.
Простой и глупый пример:
template <typename T>
void some_function(const T& original)
{
  try
  {
    T copy = original;
    // other work
  }
  catch (...)
  {
    // cleanup
    throw;
  }
}


Чем бы ты в данном случае заменил catch(...)?
На каком основании?

--
aga
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re: OFFTOP: Re[7]: "Крик души"
От: vitaly_spb Россия  
Дата: 10.11.03 14:44
Оценка:
IK>1) Если программист использует catch (...), то получается он не знает какой фортиль выкинет его программа — ИМХО, это не хорошо и это просчеты в проектировании.

А вы знаете все, что может выкинуть ваша программа? То есть все возможные ошибки? Значит ваши программы не допускают ошибок вообще, ведь раз вы знаете ошибки — вы их уже ликвидировали. Так? А вы уверены за чужие компоненты, за бесперебойную работу Windows?

У меня дома стоит 2000, запускаю апачи как сервис. Через час-полтора по непонятной причине хоть сервис и работает не загружается страница 127.0.0.1. Вот вы в курсе из-за чего такое может быть? И разработчики я уверен нет. А ошибка есть.

А вообще прекратили бы этот спор. На вашем же сайте четко и ясно сказано: оттестированность программы не имеет значения, главное показать ее функциональность. Так что нашли из-за чего спорить.
...Ei incumbit probatio, qui dicit, non qui negat...
Re: "Крик души"
От: BioUnit Россия  
Дата: 10.11.03 15:29
Оценка:
Загляните на www.r-tt.com
Если заинтересует направление, пришлите, пожалуйста, более развернутое резюме на biounit@r-tt.com, желательно указать имеющийся опыт и наработки.
Re[2]: OFFTOP: Re[7]: "Крик души"
От: GUID Россия  
Дата: 10.11.03 16:07
Оценка:
Здравствуйте, vitaly_spb, Вы писали:

_>А вообще прекратили бы этот спор. На вашем же сайте четко и ясно сказано: оттестированность программы не имеет значения, главное показать ее функциональность. Так что нашли из-за чего спорить.


Устойчивость и Supportability — это функции программы. Они должны быть реализованы, но могут не работать (оттестированность функций действительно значения не имеет).
Re[4]: OFFTOP: Re[7]: "Крик души"
От: GUID Россия  
Дата: 10.11.03 16:14
Оценка:
Здравствуйте, Андрей Галюзин, Вы писали:


АГ>А, по-моему, вкус здесь не причём.

АГ>Простой и глупый пример:
АГ>
АГ>template <typename T>
АГ>void some_function(const T& original)
АГ>{
АГ>  try
АГ>  {
АГ>    T copy = original;
АГ>    // other work
АГ>  }
АГ>  catch (...)
АГ>  {
АГ>    // cleanup
АГ>    throw;
АГ>  }
АГ>}
АГ>


АГ>Чем бы ты в данном случае заменил catch(...)?

АГ>На каком основании?

Смотря что такое cleanup?
Если простая подчистка ресурсов так используйте смарт-поинтеры, классы-стражи, функторы и тп, которые в деструкторе все сделают. ( Их можно передавать и темплейтным параметром)
Если это какой-то частный роллбэк только и только в случаях ошибки, я бы не стал это запихивать в темплейтную функцию и пересмотрел бы дизайн решения.
Можно и в этом случае кстати попробовать предать какой-то функтор.

Самое плохое в единичном catch (...) — это глотание ошибки.
1)
а)Глотать _свои_ ошибки с моей точки зрения очень и очень плохо.
Я там видел в ветке народ предлагает для релиза ставить catch(...), так вот пусть лучше она упадет и создаст Dr.Watson log. чем
выдаст "Unknown error" и тем самым похоронит что там за ошибка была и почему.
Конечно, если речь идет о разовом заказе, можно отладить у клиента на его конфигурации и забыть про проект,
а если выпускать серийный продукт то каждый AV должен быть "радостью" для девелопера, так как позволяет улучшить продукт.

б) catch (...) ловит также и "аппаратные" исключения.

2) Глотать _чужие_ ошибки тоже не нужно. Часто такие catch(...) вызваны не просто ошибкой, а каким серьезным сбоем, могут быть утечки, порча памяти и т.п. Зачем все это богатство в своем процессе, если можно сделать внепроцессный компонент и шатдаунить процесс когда пошло что-то не так.

Но вариант с последующим throw и не глотает ошибки. Там есть throw.
Мы же отказались и от именно этого варианта в свое время из-за багофичи(асинхронных исключений) в VC 6.0 SP5 по причине которой в случаях, если определяется например два экземпляра объекта во внешней функции по отношению к исполняемой и происходит не-C++ исключение в catch(...), то деструктор второго объекта не вызывается.
Re[5]: OFFTOP: Re[7]: "Крик души"
От: dad  
Дата: 10.11.03 16:26
Оценка:
Я пробовал методы и на основе исключений и на основе возврата кодов ошибок и пришел к выводу, что все условно.
на уровне одно модуля (подсистемы, группы класов или вообще методов одного класса) можно обрабатывать исключения, выше же лучше передавать информацию об ошибках и то по запросу.
(...) действительно ловить не стоит, если ты не знаешь кто будет пользоваться твоим совтом, пусть он сам его ловит.. Если знаешь, кто будет пользоваться то лучше поймать и вернуть false, например и Unknown error в описании, что бы верхняя программа могла прохромать дальше. Хотя это тоже относительно , короче все зависит от задачи и спор получается риторическим.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[4]: "Крик души"
От: der Igel Россия  
Дата: 10.11.03 17:25
Оценка:
Hello, !

I>> Почему стоит повременить до декабря?


> Доверься


Да после 23 ноября уже можно.
Posted via RSDN NNTP Server 1.8 beta
Re: "Крик души"
От: Аноним  
Дата: 10.11.03 17:49
Оценка:
Тихо ночью, из груши ,
В друг раздался крик
"ДУШИИИИИ".
Мы немного огляделись
Шеи нет и слава богу,
Хоть не складно получилось,
но мы дальше покатились...
Re[9]: "Крик души"
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 10.11.03 18:05
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:


AS>Это можно, конечно, обернуть в что-то вроде

AS>
AS>void some_class::foo()
AS>{
AS>  struct local{
AS>    bool _ok;
AS>    local(){_ok = false;}
AS>    do_work(){          
AS>      //do some work
AS>      _ok = true;
AS>    }
AS>    ~local(){
AS>      if (!_ok){
AS>        //log the message - there was error during some_class::foo
AS>      }
AS>    }
AS>  } l;l.do_work();
AS>}
AS>


AS>Однако первый вариант я почему-то предпочитаю больше.


Здесь можно сделать проще:
//один раз объявляем для логирования
class FailLogger
{
  public FailLogger(string message)
  {
  }
  string message;
  public bool IsOk = false;
  ~FailLogger()
  {
    if (IsOk)
      Trace.WriteLine(message);
  }
}


Тогда по месту у тебя будет:
void some_class::foo()
{
  FailLogger log("Не сделалось то-то и то-то");
  do_work();
  log.IsOk = true;
}
Re: Aelita
От: tsR Россия  
Дата: 10.11.03 18:52
Оценка:
Ветка "Крик души" затеяна мною...

> Надоело и непробиваемое молчание, весьма типичное для компаний вроде

> Aelita, демонстрируемое в ответ на выполненные тестовые по 2-м
> позициям.
Думаю, что стоит вычеркнуть сию компанию из сего перечня.
Не зря оставил свой e-mail — связались, попросили уточнить, когда и что было послано.
Позвонили, объяснили, что мое выполнение тестового их не устроило.
А в связи с уходом менеджера немного протянули с ответом.
При этом все в предельно вежливой форме.

Побольше бы компаний действительно заботящихся о собственной репутации.

С уважением, всё тот же:
-Сергей. traffic81@inbox.ru
Posted via RSDN NNTP Server 1.8 beta
Re[2]: Aelita
От: dad  
Дата: 11.11.03 06:37
Оценка:
>> Надоело и непробиваемое молчание, весьма типичное для компаний вроде
>> Aelita, демонстрируемое в ответ на выполненные тестовые по 2-м
>> позициям.
tsR>Думаю, что стоит вычеркнуть сию компанию из сего перечня.

Думаю следует внести ресурс рсдн ру в число иснструментов оказывающих влияние на ай-ти рынок.
Что касается аэлиты, то я года два назад что то им делал ответа тоже не получил
(правда мне и не нужно было)
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[6]: OFFTOP: Re[7]: "Крик души"
От: JohnDoe  
Дата: 11.11.03 07:02
Оценка:
Здравствуйте, Андрей Галюзин, Вы писали:

АГ>Для меня наиболее симпатичный вариант таков:

АГ>catch (...) на верхнем уровне приложения в котором создается дамп и выдается окошко с возможностью отослать лог + дамп
АГ>разработчикам.

Ну так для этого есть SetUnhandledExceptionFilter. Все очень просто и мило.
Re[10]: "Крик души"
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 11.11.03 07:48
Оценка:
Здравствуйте, DarkGray, Вы писали:

хъ

На шарпе? Ты смеешся!
... << RSDN@Home 1.1.0 stable >>
Re[3]: Aelita
От: tsR Россия  
Дата: 11.11.03 08:16
Оценка:
d> Думаю следует внести ресурс рсдн ру в число иснструментов оказывающих
d> влияние на ай-ти рынок.
d> Что касается аэлиты, то я года два назад что то им делал ответа тоже
d> не получил
d> (правда мне и не нужно было)
С учетом того, что русский ит-рынок всего-то в 3-5 городах сосредоточен? Будь сие не так, было бы странно.
Как там... "Спасение утопающий, дело рук самих утопающих"...
Может начать создавать профсоюзы?
Posted via RSDN NNTP Server 1.8 beta
Re[7]: OFFTOP: Re[7]: "Крик души"
От: stone Канада  
Дата: 11.11.03 08:33
Оценка:
Здравствуйте, JohnDoe, Вы писали:

JD>Ну так для этого есть SetUnhandledExceptionFilter. Все очень просто и мило.


Да, ну а для совсем ленивых — CrashReport
--
Алексей
Re[2]: "Крик души"
От: TarvoAlex  
Дата: 11.11.03 08:40
Оценка:
Здравствуйте, GUID, Вы писали:

GUI>Здравствуйте, Аноним, Вы писали:


GUI>У меня нет, к сожалению, рецензии именно Вашего тестового задания (речь идет о этом задании), но, для иллюстрации, я приведу два примера (успешный и не успешный) рецензий тестовых заданий месячной давности, чтобы показать, что во-первых, задания анализируются, во-вторых, что одного только факта исполнения кандидатом тестового задания недостаточно — еще важно КАК он его сделал:


GUI>Пример 1 (отрицательный).


GUI>Плюсы:

GUI>
GUI>Минусы:

GUI>
GUI>В общем, решили не приглашать.


GUI>Пример 2 (положительный)


GUI>Плюсы


GUI>


GUI>Минусы:


GUI>

GUI>Мнение рецензента: "Не знаю как на ведущего, а на простого "программиста второго уровня" вполне тянет".


GUI>Кандидата пригласили на собеседование.



Пожалуйста, уберите из Вашего задания "Оттестированность программы не имеет значения, главное — продемонстрировать ее функциональные возможности". Т.к. первого кандидата Вы завалили именно на этом. Программа функционирует, по Вашему заявлению Вам это и надо.
А почему расстриливать за Catch()? По-моему, если человек ловит исключения — это хорошо...
По поводу неудобства UI: это ведь тестовое задание, не коммерческая программа. Я бы лучше расстрелял за Sleep(a_Wait); А если сервис "подвиснет" во время остановки? Такое с AVP случается. Что тогда? По-моему, в этом второй кандидат продемонстрировал вопиющее незнание мультитредингово программирования.
По поводу MFC: глупо не использовать стандартные библиотеки, которые идут с языком. Особенно в тестовом задании. Откуда кандидату знать, используете Вы MFC в проектах или нет?

Аноним, если тебя одна контора послала — не расстраивайся. Проверка тестового задания — процесс, на который сильно влияет человеческий фактор. Набирай квалификацию на удаленных проектах. Что тут плохого? По-моему — одно: при иммиграции за границу как Skilled Professional надо подтвердить стаж. а при удаленных проектах это может быть затруднительно.
Re[11]: "Крик души"
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 11.11.03 10:22
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:


AS>На шарпе? Ты смеешся!


А какая разница? С++ или c#?

class FailLogger:
  IDisposable
{
  public FailLogger(string message)
  {
  }
  string message;
  public bool IsOk = false;
  public void Dispose
  {
    if (IsOk)
      Trace.WriteLine(message);
  }
}




Тогда по месту у тебя будет:
void foo()
{
  using (FailLogger log = new FailLogger("Не сделалось то-то и то-то"))
  {
    do_work();
    log.IsOk = true;
  }
}
Re[12]: "Крик души"
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 11.11.03 11:53
Оценка:
Здравствуйте, DarkGray, Вы писали:

хъ

Теряешь квалификацию!

public bool IsOk = false;


Выделеные фрагменты нужно убрать.
... << RSDN@Home 1.1.0 stable >>
Re[13]: "Крик души"
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 11.11.03 12:38
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Теряешь квалификацию!


AS>
AS>public bool IsOk = false;
AS>


AS>Выделеные фрагменты нужно убрать.


Это ты про то, что в C++ так нельзя писать?

ps
Понимаешь в чем проблема, я умею писать на порядка 30 языков, сейчас активно использую где-то в районе 5-ти языков, если я буду для каждого языка помнить все тонкости синтаксиса, то место в голове у меня кончится.
Re[14]: "Крик души"
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 11.11.03 16:11
Оценка:
Здравствуйте, DarkGray, Вы писали:

хъ

DG>ps

DG>Понимаешь в чем проблема, я умею писать на порядка 30 языков, сейчас активно использую где-то в районе 5-ти языков, если я буду для каждого языка помнить все тонкости синтаксиса, то место в голове у меня кончится.

Поэтому я и ставил везде .
... << RSDN@Home 1.1.0 stable >>
Re[7]: OFFTOP: Re[7]: "Крик души"
От: Lostar Россия  
Дата: 13.11.03 17:52
Оценка:
Здравствуйте, JohnDoe, Вы писали:

JD>Здравствуйте, Андрей Галюзин, Вы писали:


АГ>>Для меня наиболее симпатичный вариант таков:

АГ>>catch (...) на верхнем уровне приложения в котором создается дамп и выдается окошко с возможностью отослать лог + дамп
АГ>>разработчикам.

JD>Ну так для этого есть SetUnhandledExceptionFilter. Все очень просто и мило.


Ну не так уж и просто... Пробовал после него вывести тривиальный MessageBox и затем сравнить текущий ExFilter с установленным тобою?
... << RSDN@Home 1.1 beta 2 >>
С уважением, Николай.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.