Рассылка закрыта
При закрытии подписчики были переданы в рассылку "БЛОГика: полезные советы" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Проектирование и кодирование - две стороны одной медали.
Оглавление
Дайджест: Проектирование и кодирование - две стороны одной медали.Проектирование одно из важнейших умений программиста, в этом выпуске я попробую вкратце ознакомить вас с ним. Ошибки продолжаются.Понял причину искажений, всё дело в публикаторе subscribe, который режет непрерывные строчки. Что поделать, текстовые письма накладывают на него ограничения. В основном это происходит с HTML тэгом пробела. Думаю ни для кого не составит труда удалить лишние ";" или "nb sp", а так же соединить порвавшийся код в предыдущих выпусках. В будущем же я постараюсь избежать таких проблем. Напоминание.Рассылка имеет свой почтовый адрес - comp.soft.prog .vsnetmsoffice-owner@subscribe.ru. Если у вас возникли какие-либо замечания или пожелания, пишите. Можете присылать свои статьи, если они будут приемлемого качества, возможно, я их и опубликую. Не забывайте только про ограничение в 15Кб на письмо, иначе оно просто не пройдёт. Напоминание.Вследствие диких экспериментов subscribe, вашему вниманию предоставлена новая возможность, где вы можете проголосовать on-line или почтой, по каждому выпуску, поставив циферку как в школе. Надеюсь, не забыли, как это делается. Нужное меню находится почти в самом низу. Хотя для класса серебряных рассылок, к которому принадлежит данное издание, это практически не имеет никакого отношения, разве что статистику будет интересно посмотреть.
Практическое проектирование.Хотя сам я использую Visual Studio.NET 2003 Enterprise Architect Edition, данный материал подойдёт не только для следующих, но и предыдущих версий этого замечательного программного продукта. Как и обещал, в этом выпуске речь пойдёт о вспомогательных средствах проектирования, и в некоторой степени кодирования. А начнём мы данное обсуждение с несколько отвлечённой темы, но если хорошо вдуматься, то непосредственно связанное с любым видом программирования. Итак, многие из вас, скорее всего, слышали о некой схеме, которая якобы помогает создавать программы, особенно это касается высших учебных заведений, где подобное часто является обязательным условием. Чтобы лучше понять, о чём я говорю, привожу её пример:
Я не стал сразу описывать, что обозначает каждый пункт в отдельности потому, что это, прежде всего, зависит от способа применения. Очень часто в учебных заведениях пытаются использовать данную схему для написания "игрушечных" программ. "Игрушечные" программы это вовсе не компьютерные игры, которые даже в простейшем варианте нельзя так называть, а просто учебные примеры, которые набирает программист, чтобы научиться кодировать. Образно говоря, получается, людей учат "забивать гвозди микроскопом", аргументируя это надеждой на то, что в будущем сей предмет всё же будет использован по назначению, а пока вроде как привыкайте к нему родимому. И вот как раз теперь, применительно к "игрушечному" коду, настало время описать метаморфозу схемы:
Схема действий, описанная для создания "игрушечных" программ неплоха, но по большей части можно обойтись и вовсе без неё, так как основное её предназначение заключается в формировании больших или огромных проектов. Естественно, нам придётся пересмотреть своё отношение к каждому описываемому мной пункту, а чтобы знания, изложенные в текущей рубрике, не пропали даром, я сразу буду преобразовывать их в практическое руководство по Visual Studio.NET. Но не забывайте, что данное поведение с огромным успехом можно использовать в любой системе программирования, кроме того, очень часто это бывает просто необходимо, для облегчения труда программиста. Начало написание программы.С "игрушечной" схемой разобрались, теперь настала очередь реальных программ. Для удобства я рассмотрю мастера создания решений и проектов для Desktop Applications, то есть приложений рабочего стола. Для более полного понимания возьмём за основу Visual С++.NET. Выбрав пункт меню File⇒New⇒Project... мы откроем диалоговое окно New Project предназначенное для создания или добавления новых проектов в решение. В древовидном списке Project Types: выбираем папку с названием Visual C++ Projects. Внутри у неё находятся множество мастеров, но нам нужны только следующие:
В их использовании нет необходимости, однако вы можете ради опыта создать приложение с каждым из них, вследствие чего, легко убедиться, что хоть они и имеют мало общего внутри, но получаемый результат практически одинаков (естественно если вы этого захотите). Какие же из этого следуют выводы? Попытайтесь сделать их самостоятельно, до того, как прочтёте следующий абзац. Не знаю, что за выводы сделали вы, но лично мне сразу приходит на ум различие между схемой программы и её кодом. В свою очередь это подводит нас к следующему этапу разработки. Он заключается в том, что начинать нужно не с кодирования, а с постановки задачи и составления схемы программы, причём всё это можно осуществить, не написав ни одной строчки кода. Более того, кодирование в данном случае противопоказано, поскольку не даёт программисту сосредоточиться на проектировании, и сбивает с толку грамматическими конструкциями языка. В конечном итоге такой порочной практики нам придётся держать в голове не только возможности, которыми должно обладать наше изделие, но и код, которыми они реализованы, так как не будет никакого различия между схемой и кодом. Постановка задачи.Под постановкой задачи многие принимают простейшую инструкцию того, что необходимо получить. У многих она ассоциируется с постановкой задач для "игрушечных" программ, в данном случае такой минимализм будет неуместен. Простейшие задачи описываются просто лишь потому, что сами являются простыми, и тут дело даже не в степени сложности, а в самом количестве задаваемых параметров. Я не зря привёл в пример мастера создания решений и проектов, именно они помогают уловить основную суть моих рассуждений. Следовательно, нам в первую очередь нужно описать возможности, которые бы мы хотели получить от нашей программы. Воспользуйтесь любым из выше приведённых мастеров. Даже если вы программируете на другом языке, это не будет иметь значения, пока мы не дойдём до этапа кодирования. Кодировать мы все равно не будем, так как цель данного урока состоит в условном программировании или в программировании без кодирования. То есть, для начала, гораздо полезнее будет научиться проектировать, если конечно вы не хотите до конца жизни быть "игрушечным" программистом. Необходимо отметить одну важную особенность, а именно, что постановка задачи и схема программы взаимосвязаны, и по большому счёту второе является продолжением первого. Такое же соответствие происходит с кодированием программы и её тестированием. Но существует одна очень важная особенность, никогда эти две группы не должны пересекаться. Для чего это нужно и что вообще значит? Ответ ищите чуть выше, когда я описывал различные мастера, а, следовательно, и дальнейший способ кодирования программы. Можно пойти в рассуждениях гораздо дальше. Предположим мы малость повредились в уме и решили написать огромный проект целиком на ассемблере без использования каких-либо высокоуровневых наворотов. Скажете это невозможно, безусловно, если сразу приступить к кодированию на успех можно не рассчитывать. Но если правильно поставить задачу, а так же составить схему программы, то нам просто останется планомерно двигаться к намеченной цели, кодируя строчку за строчкой. Причём не важно, какой язык это будет, так как приложение будет уже составлено. Для лучшего усвоения приведу конкретный пример. Предположим, на позарез понадобилось окно Windows имеющее строку заголовка и контекстную область. Как бы мы ни изощрялись, какую бы систему ни выбрали, результат всегда будет один. Вот это и называется постановкой задачи, когда программист исходит только из того, что хочет получить. А если нам понадобилось главное меню, и не простое, а золотое (в прямом смысле имитирующее золото). Нет проблем, просто напишите это в постановке задачи и не бойтесь, что в последствии не сможете его запрограммировать. Это не столь важно, так как Visual Studio.NET встроены инструменты, способные раскалывать и не такие "орешки". О технологиях упрощающих жизнь программиста и позволяющих добиться желаемых результатов речь пойдёт ниже. Схема программы.Схема программы - это поведенческая модель создаваемой вами системы. Суть её проста, если для постановки задачи вам нужно описать все желаемые возможности, то схема описывает, как они будут между собой связаны. В данном случае связь выражается в способности к воспроизведению каких-либо действий, следовательно, это нечто вроде программирования словами, образами или чем-нибудь иным, без употребления конкретного кода. Очень важно понимать, что схема может принимать любые виды. Она может быть чертежом, блок-схемой, битовым рисунком, текстовым файлом, смесью из всех этих, а так же многих других пунктов. Нужна же, прежде всего, для самого программиста, чтобы помочь ему не запутаться в своих мыслесплетениях. Может так случиться, что не все понимают, о чём сейчас идёт речь, но не расстраивайтесь, так как в будущем я поэтапно реализую все мои высказывания на практике. Забегая вперёд, скажу, что любое усовершенствование программы лучше проводить в следующем порядке постановка задачи⇒схема программы⇒кодирования программы, тестирование же само собой будет после них, так как обратное невозможно. Не соблюдая эти простейшие правила, вы рискуете здорово зависнуть, точнее зависнет ваш проект, захватив вас за компанию. Код программы.Я уже говорил, что кодировать мы сегодня не будем, так как это может сбить с поставленной задачи - научиться проектировать. К тому же данная тема связана с конкретной системой программирования, поэтому охватить её в паре абзацев просто невозможно. Пока могу лишь посоветовать, не путать проектирование программы и проектирование кода. Внимательно прочтите и запомните текущие понятия. Ответьте на вопросы:
Ещё раз хотелось бы отметить, что по данной теме применительно к объектно-ориентированному программированию лучше, чем третье издание книги "Язык программирования C++" от Бьерна Страуструпа я пока не встречал. Её полезно будет прочитать даже тем, кто использует другие языки, вроде Visual Basic.NET или Visual Java.NET, так как, несмотря на разницу в грамматических конструкциях, общая идея одна на всех. Программистов же не смущает, что книга по C++, а пользуются они её для изучения Visual C++ 6.0 или Visual C++.NET, что согласитесь не одно и тоже. Тестирование.Тестирование или если говорить по-русски - испытание, неотъемлемая часть работы по созданию программ. Так же часто употребляется термин - отладка, хотя многие связывают его лишь с успешным запуском кода и его сносным функционированием в дальнейшем. На мой взгляд, это гораздо более объемлющее понятие. В него входят составление вводных тестов для каждого пункта постановки задачи, которые служат для проверки неких заранее заданных условий. Помимо безошибочности, порой бывают очень важны: скорость, переносимость и многие другие параметры. Чем более коварные и изощрённые тесты вы придумаете, тем лучше. Однако стоит отметить, что на успешное их прохождение очень сильное влияние может оказать состояние самой программы, а иногда даже операционной системы. Тестирование в некоторых случаях по сложности ничуть не уступает проектированию или кодированию, отсюда и выливается в некую науку, на постижение которой уйдёт много времени. Но не стоит думать, что вы потеряете его напрасно, так как это обогатит вас новыми знаниями и умениями, поможет осмыслить или переосмыслить многие принципы программирования. Постскриптум.После краткого ознакомления с предлагаемой схемой действий по составлению программы, настало время перейти к практике. Продолжение следует в рубрике "Создание реальных проектов".
Записки философствующего программиста.Вам никогда не приходило в голову, что в Visual Studio.NET программируют одно и то же разным, а вот в Microsoft Office всё наоборот, разное программируют одним и тем же? Поясню свою мысль, в Visual Studio.NET программисты добиваются решения одних и тех же поставленных задач разными языками и мастерами проектов, а вот, несмотря на различие программных продуктов Microsoft Office и связанных с ними форматами, всё же существует некое общее ядро в построении основных библиотек. Конечно, данное высказывание спорно, ведь у Visual Studio.NET тоже единая загрузочная библиотека, но нужно же мне перед началом немного пофилософствовать. К слову сказать, существует огромное количество печатных изданий, да и электронных самоучителей по Microsoft Office. Тот же DVD-диск "Библиотека в кармане DVD 1", на одной стороне содержит десятки тысяч книг в различных жанрах, в том числе и учебные пособия, а на другой так называемый бонус - "Коллекция учебников и самоучителей". Чего там только нет, и, причём не малая часть посвящена так же Visual Studio.NET. Хотя ключевое преимущество в основном в их русскоязычном происхождении, так как MSDN может удовлетворить практически любой запрос, да и встроенная помощь по Microsoft Office русифицирована вплоть до глав описывающих программные библиотеки. К чему я клоню? К тому, что конструирование, и речь сейчас идёт не только о программировании, но и о любой другой деятельности, по большей части она зависит от способностей человека, а не от количества собранного им для изучения материала. Даже самая умная мысль, сохранённая в книге, в мозгу держится лишь мгновение, на то она и мысль. Любители сравнений могут сопоставить мыслительные процессы мозга с работой компьютера, где даже самый быстрый процессор не сможет задержать момент обработки псевдо мысли. Остановиться на середине сможет, бесконечно зацикливаться на одном и том же, то же сможет, но охватить всю её сразу и удержать, нет. Поэтому не пытайтесь выловить свои мысли. Сохраняйте их в памяти, пишите на бумаге или в компьютер, но не забывайте, что вам никогда не удастся поймать момент озарения. Конечно, любое объяснение подобием ложь, что, кстати, не мешает "нагреваться" на этом психологам, но даже ложь иногда бывает полезна. Основная идея выражена, но что же делать, если уж очень хочется повысить свой творческий потенциал. Заметили, творческий от слова - творить (создавать), а потенциал - это бездействие, которое человек может обратить в действие благодаря накопленным знаниям. Но для уточнения открываю "Современный энциклопедически словарь" с DVD-диска описанного выше, и что же я вижу:
У меня почти тоже самое определение, а ведь раньше я никогда его не читал. Вот пишу и размышляю, что вряд ли я додумался до всех этих мыслей первым. Думаете, какой мой следующий шаг? Естественно открываю "Энциклопедический словарь" от авторов Ф.А. Брокгауз, И.А. Ефрон, кстати, с того же самого DVD-диска. Включаю поиск по слову "потенциал" и помимо электрического или силового потенциала нахожу пару статей про потенциал возможностей человека. И обнаруживаю, что мои мысли по усовершенствованию процесса программирования нагло украли всякие Платоны (429 - 347), Аристотели (384 - 322), а так же их более поздний коллега Лейбниц (1646 - 1715). Кстати, если кому интересно, одна из статей от А. Жданов называется "Врожденные идеи". Для особо любопытных личностей привожу отрывок из статьи:
Вследствие моих рысканий по закоулкам знаний (так я называю электронную библиотеку) ещё раз подтверждается, что нет в мире ничего нового, и всё что остаётся, это смотреть на старые идеи с новых сторон. Не стоит думать, что в своих рассуждениях я "забрёл не в ту степь", так как именно человек, а не компьютер, определяет текущие потребности. А что как не они являются двигателем прогресса. Когда-то читал книгу Владимира Михайлова "Кольцо Уракары". В ней главный герой задурил голову людям и в какой-то степени компьютерам. Это я к тому, что могу писать в данной рассылке любую чушь, и вы все равно найдёте в ней смысл, причём не исключено, что глубинный. Таково свойство сознания "Пойти туда, не знаю куда, и найти то, не знаю что". Непонятно? Тогда читайте отрывок из этой книги взятой всё с того же пресловутого DVD-диска:
Вот и запомните, что "истина - это то, что работает", а, следовательно, и "то, что работает - истина". Вооружившись этим знанием, а так же пользуясь безнаказанностью, в случае приведения ОС в неработоспособное состояние смело вступайте в бой за светлое компьютерное будущее.
Важные изменения в ASPВ настоящий выпуск ASP были включены некоторые серьезные изменения и улучшения. Их необходимо знать при переходе от предшествующей версии ASP. Примечание. Сведения о новых возможностях ASP см. в разделе Новые возможности ASP.
В IIS 5.1 все настраиваемые параметры ASP могут изменяться в метабазе. Дополнительные сведения см. в разделе О метабазе.
Практическое проектирование в Visual Studio.NET.Запустите Visual Studio IDE и создайте новое решение c проектом в нём при помощи мастера Windows Application, не забудьте правильно указать папку местоположения, а так же набрать имя проекта и решения. Напомню, что таким образом мы получим объектную модель, принадлежащую к типу Desktop Application. Язык программирования не имеет значения, поэтому используйте то, к чему привыкли. Теперь, когда основа готова, настало время решить, что она будет уметь делать. Это не так уж и сложно, тем более, что выбранный мастер проектов сильно ограничил фантазию на эту тему.
Поздравляю, вы включили в решение файл напрямую не связанный с Visual Studio.NET. Теперь можно наблюдать появление в окне Solution Explorer новой папки с названием Solution Items. И естественно в ней располагается наш новый документ. Он уже открыт, но если вы его закроете, то сможете легко запустить заново прямо из окна Solution Explorer. Я добавил текущий файл в решение, а не в один из проектов, так как он отражает общую суть задачи, а не её отдельные составляющие. Вы можете создать тысячи библиотек или ограничиться одним лишь загрузочным файлом, всё это не важно. Задача одна, а следовательно, и постановка задачи тоже одна. Не будете же вы лихорадочно искать её по всем проектам решения, если оно слишком сильно разрастётся, к тому же подобное поведение не лучшее для программиста. Лучше сразу разложить всё в строгом порядке, чем потом в пустую терять время. Прежде чем продолжать, ответьте себе на вопрос: Почему я выбрал именно Microsoft Word? На самом деле это продиктовано не необходимостью, а просто из удобства обучения. Постановка задачи может располагаться как в одном файле, так и во множестве, иметь сложную структуру или быть простым. Типы же применяемых файлов зависят в основном только от вас. Главное помните, сейчас мы не кодируем, а проектируем, следовательно, любые намёки на код пока не допускаются. Поскольку сейчас обучение идёт в абстрактном режиме, то не буду обращаться к частностям и навязывать свою постановку задачи. Придумайте что-нибудь сами. Те, кто читал мои предыдущие выпуски, должны помнить глаз изображающий наблюдательность. Это не блажь, которая пришла мне в голову, а вполне зарекомендовавший себя приём. Если код бывает очень легко содрать и использовать по назначению или нет, то с другими источниками информации такая штука не пройдёт. Поэтому в третьем выпуске я и намекал на то, что самый простой способ развить собственное воображение, это воспользоваться чужим. Поднимите свой уровень восприятия, не позволяйте монитору зомбировать вас, а то получится как во многих популярных американских боевиках, где герои свято убеждены, что если выстрелить из пистолета в дисплей не планшетного компьютера, то система выйдет из строя, да ещё и успеет при этом разблокировать всю защиту. Или ещё один забавный пример из жизни кибер монахов: "Он смотрит, но не видит. Он слушает, но не слышит. Он двигает руками, но не понимает что делает. Он зомбированный пользователь компьютерного мира". С постановкой задачи худо-бедно разобрались, и хотя пока ничего не было сказано о самой задаче, все равно я считаю для начала этого вполне достаточно. Тем же способом введите в решение схему программы. Опять же нужно помнить о неоднозначности выбора для неё формата(ов) файла(ов). После этих действий в идеале у вас уже должна получиться программа. Пусть пока она и не содержит ни одной строчки кода, а значит и не привязана к конкретному исполнителю, но если вы можете представить способ её работы, то работу можно считать завершённой. Кстати, некоторые файлы схемы программы вполне могут содержаться в проектах, а не только в решении. Для подобных целей очень удобно добавлять в Solution Explorer папки. Создайте папку с именем "Схема загрузочного файла" в вашем текущем проекте, как это сделать догадайтесь сами, без нудных пояснений с моей стороны. Тем же способом создаются новые подпапки. Примерно то же самое возможно проделать и с Class View, хотя различие в способах обращения будут ощутимы. Не забывайте, что все находящееся в папках и не являющееся ими всего лишь ярлыки, а не сами объекты. Следовательно, их может быть много на один файл или прочий элемент, но удаление одного или всех не повлечёт за собой удаление их самих. Кодирование и тестирование: Отвлекусь на частность. Раз мы работаем в Visual Studion.NET, значит нужно использовать её инструменты. Одним из таких является Task List. Логично, что самый простой способ связать проектирование с кодированием, это задать себе задания для планомерного выполнения. Просмотрите меню по следующему пути View⇒Show Tasks⇒.... Различные виды этого окна позволят вам легко ориентироваться в типах заданий, а так же узнавать выполнены они или нет. Настройка этих возможностей происходит по следующему пути Tools⇒Options:⇒Environment⇒Task List. Пункт General понятен и без объяснений, а вот Comment Tokens я вкратце опишу. Во-первых, в Token List: по умолчанию находятся HACK, TODO и UNDONE. Причём TODO нельзя удалить или изменить её имя, так как оно используется многими мастерами проектов, допускается лишь смена приоритета. Над HACK и UNDONE издевайтесь, сколько влезет. Для удобства выставлю эти комментарии в порядке их замены одного на другое:
Никто не запрещает вам удалить HACK и UNDONE или переписать их названия по-русски, хотя это и не будет иметь положительного успеха в случае программирования на разных системах. Вообще процесс совместимости кода лучше не нарушать просто так, для собственного удовольствия. Меняйте заголовки комментариев с TODO до HACK, тем самым, управляя отображением элементов окна Task List. Если над проектом вы работаете не один, то можете добавить собственную лексему, к примеру, ДЛЯ_ПЕТИ. Пусть кодирует Петя, а проектировщику проекта достаточно будет лишь вставить соответствующий комментарий в нужную часть кода. До Петиной работы:
После Петиной работы:
Помимо комментариев вы так же можете использовать ярлыки. С переносимостью у них похуже, но зато в некоторых случая они более удобны. Создать их можно через строку меню Edit⇒Bookmarks⇒Add Task List Shortcut, а так же используя сочетания клавиш Ctrl+K+H. Ярлык появится в текущей строке кода, а так же в Task List, если не будет отфильтрован. Плюс ко всему этому можно задавать обычные, заданные пользователем задания. А для быстрого перемещения по коду, который не связан с элементом проектирования, очень полезными оказываются закладки. На сегодня всё, удачи!!!
limon (почтовые адреса в целях конспирации не указываются) Hello автор ! Блин, клёвая рассылка! Информативная, написана доступно и т.д. Только один вопрос заставил меня написать и уточнить: -- Ну нафига в ней чисто ASP?? Зачем учиться старой технологии (почему не ASP.NET???) Я бы с предпочёл увидеть (почитать) о ASP.NET 2.0 Предложение: -- Писать не про ASP, а ASP.NET 2.0 или ещё круче про AJAX и ASP.NET Atlas в частности. Это было бы гораздо интереснее и конечно увеличило кол-во подписчиков. Затронута больная тема. Дело в том, что я сжульничал и просто копировал документацию по IIS. Остальные рубрики пишу сам, но на Web-технологии просто нет времени. А жаль, как говориться хочется да не можется, точнее не успевается. Ваше предложение обязательно рассмотрю, а то когда использую чужие наработки, так и лезет фраза "Что-то прогнило в королевстве датском", и я даже знаю что. Вообще, web технологии не главные на повестке дня, но, безусловно, тесно связаны с темой данной рассылки, а, следовательно, нуждаются хоть в каком-то описании. Та же работа с базами данных Access через ASP может быть очень интересна. Если кому интересна документация IIS, то поставьте галку на все компоненты в Панель управления⇒Установка и удаление программ⇒Установка компонентов Windows⇒Internet Information Services (IIS). Жмите далее и ждите окончания установки. После этого останется только щёлкнуть на следующую ссылку http://localhost/iisHelp/iis/misc/default.asp и подтвердить подключение. Не бойтесь, оно будет локальным, но работать с сервером IIS можно будет как с настоящим. Естественно без доменов, так как они требуют что-либо вроде Windows Server 2003, а не Windows XP. Желательно использовать Internet Explorer с разрешёнными компонентами ActiveX, тут главное иметь возможность запуска script'ов, иначе меню справки не появится. В будущем постараюсь обойтись без откровенного сдирания чужого текста, но пока сказывается острая нехватка времени. Пытаюсь писать в художественном стиле и не слишком нагружать людей терминами, то есть сделать выпуски как можно доступнее для понимания. Обрадован известием о том, что рассылку считают информативной, хотя тут, я, к сожалению, добился не таких уж и больших результатов. Объясню почему. В современном информационном мире существует огромное количество материалов по любым темам. Взять хотя бы MSDN, и если не смотреть, что она на английском, то это же какой огромный запас знаний. Помимо этого очень много русской литературы, та же встроенная помощь по Microsoft Office или компьютерные самоучители, я уж молчу о печатных изданиях. Но вот что интересно, даже прочтя всю эту гору информации, можно практически ничего не добиться. А всё почему? Потому что главное - это умение пользоваться знаниями, а не их количество. В противном случае знания копились бы так же просто, как и деньги. К примеру, положил книгу на полку и уже стал умнее. А пока это далеко не так, я пытаюсь сделать рассылку не столь полной (для этого есть документация), сколь познавательной. Вроде журнала для программистов от которого не "перегреваются мозги". Ещё раз спасибо за лестный отзыв. Хотя даже если бы это было конструктивное ругательство в мой адрес, я бы его опубликовал. В общем, если возникнет какая-нибудь идея, пишите не стесняйтесь. Желаю удачи, автор.
|
В избранное | ||