В этой книге описаны основные средства языка C++, которые необходимо освоить начинающему программисту. После рассмотрения элементарных понятий (переменных, операторов, инструкций управления, функций, классов и объектов) читатель легко перейдет к изучению таких более сложных тем, как перегрузка операторов, механизм обработки исключительных ситуаций (исключений), наследование, полиморфизм, виртуальные функции, средства ввода-вывода и шаблоны. Автор справочника — общепризнанный авторитет в области программирования на языках С и C++, Java и С# — включил в свою книгу множество тестов для самоконтроля, которые позволяют быстро проверить степень освоения материала, а также разделы "вопросов и ответов", способствующие более глубокому изучению основ программирования даже на начальном этапе.
Книга известного профессионала в области баз данных посвящена новым версиям самой популярной в настоящее время базы данных, рассчитанной на широкий круг пользователей - MySQL. Подробно рассматриваются такие вопросы, как установка и конфигурирование MySQL, выполнение повседневных задач и улучшение производительности. На примере тестовых баз данных он приводит решения проблем, с которыми читатель обязательно должен столкнуться при практическом использовании реляционной СУБД MySQL. Читатель получит навыки интеграции MySQL с такими программными средствами, разработанными сторонними компаниями, как компиляторы языков PHP и Perl, позволяющими создавать с помощью запросов к базе данных динамические Web-страницы. Кроме того, здесь приведен обширный справочный материал, посвященный таким темам, как типы столбцов, операторы, функции, синтаксические конструкции языка SQL, интерфейсам C API, Perl DBI и PHP API. В книге уделено особое внимание доработкам и дополнениям, появившимся в версиях 4.1 и 5.0.
Книга рассчитана на пользователей, администраторов и разработчиков систем клиент/сервер на основе MySQL.
Книга представляет собой уникальное наглядное пособие по основам программирования на языке сценариев Java Script. В ней рассмотрены базовые средства Java Script и методы их использования для решения конкретных задач, возникающих при разработке Web-страниц.Читатель узнает, как сделать Web-страницы динамическими, из более чем двухсот коротких уроков, каждый из которых основан на одном-двух примерах, наглядно демонстрирующих результаты работы операторов Java Script. В книге содержится около 500 копий экранов с текстами сценариев и Web-страниц.
Простота, ясность и наглядность изложения делают эту книгу незаменимой для тех, кто приступает к изучению Java Script; она будет также полезной для более искушенных пользователей HTML.
В удобной наглядной форме описаны все элементы РНР — популярного языка создания CGI-сценариев. Рассмотрены не только особенности синтаксиса языка, но и редактирование кода в программах EditPlus и UltraEdit, а также установка РНР и сервера Apache. Материал систематизирован таким образом, что читатель может использовать книгу и как учебник, и как справочник. Примеры, взятые из реальной практики Web-программирования, позволяют лучше усвоить теоретический материал. Книга рассчитана на самую широкую аудиторию — не только на новичков, но и на опытных программистов.
Эта книга предназначена для профессиональных разработчиков программного обеспечения в среде Delphi и написана двумя признанными экспертами в этой области. В текст книги включен исходный код множества прекрасных примеров работоспособных приложений по всем обсуждаемым темам, включая примеры приложений рабочего стола, многоуровневых и Web ориентированных приложений. Каждый пример подробно комментируется, что делает данную книгу отличным учебником, позволяющим быстро освоить создание разнообразных эффективных приложений. В этой книге описана стратегия создания пользовательских приложений, динамических библиотек, применения многопоточного режима, создания специальных компонентов и многого другого. Вы узнаете как с помощью Delphi создаются приложения, в которых используются технологии CLX™, BizSnap™, DataSnap™, SOAP, ASP и беспроводной связи.
В новом издании авторы постарались сохранить дух и традиции прежних изданий книг этой серии, которые, возможно, сделали их наиболее читаемыми книгами о Delphi в мире, а также двухкратным призером читательских симпатий книг по Delphi.
Внедряя приложение для настольных систем, нельзя ожидать, что оно сразу станет играть важную роль в какой-то отрасли. Об этом свидетельствует и опыт разработки QuarkXPress двумя группами специалистов, начиная с версии 1.0 еще в 1987 году.Это приложение создавалось в надежде на то, что оно понравится пользователям, ибо разработчикам не хотелось их разочаровать.В настоящее время почти каждое печатное издание готовят к выпуску при помощи QuarkXPress: от газеты, которую читатель достает каждое утро из своего почтового ящика, до меню ужина в его любимом ресторане. В большинстве издательских компаний благодаря QuarkXPress работа ведется гораздо эффективнее и быстрее, ведь по своим возможностям она намного превосходит устаревшие, дорогостоящие специализированные системы, применявшиеся когда-то для набора текста и оформления печатных изданий. С QuarkXPress возможность выпускать роскошные издания при относительно небольших затратах получают не только крупные и самые лучшие, но и небольшие издательства и даже отдельные пользователи. В этом и состоит элитарность и в то же время демократизм QuarkXPress.
Данная электронная книга является источником исчерпывающих сведений обо всех аспектах разработки компьютерных игр. Поскольку она написана в виде сборника интервью от первого лица, то читатель получает достоверную информацию, не искаженную через призму мнения автора.В приложении к книге приведены биографические справки большинства знаменитых программистов, художников, звукоинженеров - тех, кто раскрыл секреты своего мастерства на страницах описываемой книги.
По заявлению издателей, это - единственная книга на русском языке, описывающая создание компьютерных игр и увлекательно смакующая все детали этого процесса. Автор книги, Марк Зальцман, известный американский журналист. Его публикации, посвященные компьютерным играм, печатаются в авторитетнейших изданиях США, таких как USA Today, Playboy magazine, Yahoo! Internet Life.
"Компьютерные игры" - собрание опыта специалистов-разработчиков известных компьютерных игр: дизайнеров, программистов, продюсеров, музыкантов, звукоинженеров и других специалистов в этой области. Книга объединяет более ста миниинтервью, знакомясь с которыми, читатель получает представление об основных этапах разработки игр.
В книги подробно описаны этапы создания игр. Она поможет начинающим авторам правильно составить документацию и выбрать жанр будущей игры, раскрывает тонкости технической поддержки, способы тестирования новых продуктов. Книга рассказывает об особенностях игровых жанров, принципах создания различных типов игр, их уровней, персонажей и миссий. Специалисты делятся опытом практической работы над созданием проекта: от программирования до музыкального оформления программы.
Но игру мало создать - ее еще нужно уметь продать. Книга содержит советы по организации сбыта игр, маркетингу, продвижению продукта на рынок и способам развития проектов. Кроме того, "Компьютерные игры" - отличное практическое руководство для тех, кто поставил себе целью добиться успеха в области создания компьютерных игр. Секретами карьерного роста делятся самые успешные разработчики, рассказывая, как можно зарабатывать деньги, занимаясь любимым делом. В книге содержатся сведения о том, где и каким образом можно получить специальное образование и даются ссылки на отраслевые интернет-ресурсы.
PostgreSQL заслуженно считается одной из лучших СУБД, распространяемых с открытыми текстами, а по своим возможностям PostgreSQL успешно конкурирует со многими коммерческими пакетами.
Настоящая книга была задумана как практическое руководство по PostgreSQL версии 7.1.x, хотя большая часть материала в равной степени относится как к предыдущим, так и к будущим версиям PostgreSQL. При подборе материала авторы стремились к тому, чтобы читатель как можно быстрее освоил практические навыки работы с PostgreSQL. Хотя в книге затрагиваются некоторые теоретические аспекты функционирования СУБД, подобные теоретические отступления будут относительно короткими. Прежде всего, мы стремились к тому, чтобы полученные знания позволили читателю самостоятельно создать работоспособную базу данных PostgreSQL и обеспечить ее дальнейшее сопровождение. Надеемся, книга поможет всем, кто хочет ближе познакомиться с СУБД PostgreSQL и ее возможностями.
Книга ориентирована на широкий круг читателей, интересующихся объектно-реляционной системой управления базами данных (ОРСУБД) PostgreSQL. Предполагается, что читатель знаком с системами Linux и Unix, хотя и не является экспертом в области баз данных. Хотя все примеры тестировались в системе Red Hat Linux, практически весь материал относится к большинству систем семейства Unix.
Данная книга является практическим руководством по программированию интерпретатора Bourne shell - стандартного командного интерпретатора в Unix, полностью совместимого с интерпретатором BASH shell в Linux. Книга предназначена для начинающих и опытных программистов и содержит множество полезных примеров, советов и подсказок. С ее помощью читатель сможет быстро научиться создавать shell-сценарии для реальных задач и ситуаций, возникающих в большинстве систем UNIX и Linux.
Книга является в некотором роде учебником по Web-програмированию. Я сделал попытку написать ее так, чтобы даже самый неподготовленный читатель, владеющий лишь основами программирования на одном из алгоритмических языков, смог овладеть большинством необходимых знаний и в минимальные сроки начать профессиональную работу в Web.
В удобной, наглядной форме описаны все элементы PHP - популярного языка CGI-сценариев. Рассмотрены не только особенности синтаксиса языка, но и редактирование кода в программах EditPlus и UltraEdit, а также установка PHP и сервера Apache. Материал систематизирован таким образм, что читатель может использовать книгу и как учебник и как справочник. Примеры, взятые из реальной практики Web-программирования позволяют лучше усвоить теоретический материал. Книга расчитана на самую широкую аудиторию - не только на новичков, но и на опытных программистов.
В этой книге описан новый подход к созданию Web-приложений, известный как Ajax. Авторы рассматривают составные части Ajax: JavaScript, CSS, DOM и объект XMLHttpRequest. Кроме того, в книге нашли отражение вопросы управления кодом, взаимодействия клиента и сервера и применения архитектуры "модель-представление-контроллер" на разных уровнях приложения. Читатель также найдет сведения о защите и производительности - важных характеристиках, существенно влияющих на популярность любого продукта. Рассматриваемые вопросы иллюстрируются примерами практического использования Ajax. В приложениях содержится дополнительная информация об инструментальных средствах, о языке JavaScript и библиотеках. Материал книги изложен на высоком уровне и будет полезен специалистам высокой и средней квалификации.
В рамках Ajax объединено несколько дисциплин, поэтому читатели могут прийти к пониманию данной инфраструктуры различными путями.Часть предполагаемой аудитории - это профессиональные разработчики корпоративных систем, имеющие ученые степени в области компьютерных наук, за плечами которых годы продуктивной работы над большими программными продуктами. Их кругозор позволяет выйти за рамки уровня представления классического Web-приложения. Другую группу читателей составляют Web-дизайнеры, которые освоили "новую среду", изучив такие языки, как PHP, VisualBasic, JavaScript и ActionScript. Нельзя также забывать разработчиков приложений, перешедших от настольных систем к Web, и системных администраторов, которых в основном интересуют инструментальные средства управления на базе Web.
Все эти категории читателей объединяет неподдельный интерес к Ajax. При написании книги мы попытались в той или иной мере учесть интересы каждой из этих категорий. Ajax - это объединение различных технологийи, изучая данную инфраструктуру, вам неизбежно придется столкнуться с новыми для себя вопросами. Мы призываем вас расширить свой кругозор и повысить квалификацию. Затраченные усилия окупают себя, а результаты проявляются в различных областях нашей профессиональной деятельности.
Эта небольшая книга посвящена "сердцевине" языка C++ - основным идеям (построению объектов и налаживанию взаимодействия между ними), без которых невозможно овладеть этим языком программирования. Обучаясь на простых примерах, читатель постепенно знакомится с кругом идей объектно-ориентированного программирования и основными конструкциями языка C++.
Прочитав эту книгу, можно писать довольно сложные программы. Но всего важнее то, что знание основных идей и конструкций языка позволяет легко ориентироваться в мире C++ и других объектно-ориентированных языков, самостоятельно получать недостающие знания. Книга рассчитана на школьников средних и старших классов.
Данная статья предназначена для начинающих программистов, которые никогда не работали с потоками, и хотели бы узнать основы работы с ними. Желательно, чтоб читатель знал основы ООП и имел какой-нибудь опыт работы в Delphi.
Для начала давайте определимся, что под словом "поток" я подразумеваю именно Thread, который еще имеет название "нить". Нередко встречал на форумах мнения, что потоки не нужны вообще, любую программу можно написать так, что она будет замечательно работать и без них. Конечно, если не делать ничего серьёзней "Hello World" это так и есть, но если постепенно набирать опыт, рано или поздно любой начинающий программист упрётся в возможности "плоского" кода, возникнет необходимость распараллелить задачи. А некоторые задачи вообще нельзя реализовать без использования потоков, например работа с сокетами, COM-портом, длительное ожидание каких-либо событий, и т.д.
Всем известно, что Windows система многозадачная. Попросту говоря, это означает, что несколько программ могут работать одновременно под управлением ОС. Все мы открывали диспетчер задач и видели список процессов. Процесс - это экземпляр выполняемого приложения. На самом деле сам по себе он ничего не выполняет, он создаётся при запуске приложения, содержит в себе служебную информацию, через которую система с ним работает, так же ему выделяется необходимая память под код и данные. Для того, чтобы программа заработала, в нём создаётся поток. Любой процесс содержит в себе хотя бы один поток, и именно он отвечает за выполнение кода и получает на это процессорное время. Этим и достигается мнимая параллельность работы программ, или, как её еще называют, псевдопараллельность. Почему мнимая? Да потому, что реально процессор в каждый момент времени может выполнять только один участок кода. Windows раздаёт процессорное время всем потокам в системе по очереди, тем самым создаётся впечатление, что они работают одновременно. Реально работающие параллельно потоки могут быть только на машинах с двумя и более процессорами.
Для создания дополнительных потоков в Delphi существует базовый класс TThread, от него мы и будем наследоваться при реализации своих потоков. Для того, чтобы создать "скелет" нового класса, можно выбрать в меню File - New - Thread Object, Delphi создаст новый модуль с заготовкой этого класса. Я же для наглядности опишу его в модуле формы. Как видите, в этой заготовке добавлен один метод - Execute. Именно его нам и нужно переопределить, код внутри него и будет работать в отдельном потоке. И так, попробуем написать пример - запустим в потоке бесконечный цикл:
Запустите пример на выполнение и нажмите кнопку. Вроде ничего не происходит - форма не зависла, реагирует на перемещения. На самом деле это не так - откройте диспетчер задач и вы увидите, что процессор загружен по-полной. Сейчас в процессе вашего приложения работает два потока - один был создан изначально, при запуске приложения. Второй, который так грузит процессор - мы создали по нажатию кнопки. Итак, давайте разберём, что же означает код в Button1Click:
тут мы создали экземпляр класса TNewThread. Конструктор Create имеет всего один параметр - CreateSuspended типа boolean, который указывает, запустить новый поток сразу после создания (если false), или дождаться команды (если true).
свойство FreeOnTerminate определяет, что поток после выполнения автоматически завершится, объект будет уничтожен, и нам не придётся его уничтожать вручную. В нашем примере это не имеет значения, так как сам по себе он никогда не завершится, но понадобится в следующих примерах.
Свойство Priority, если вы еще не догадались из названия, устанавливает приоритет потока. Да да, каждый поток в системе имеет свой приоритет. Если процессорного времени не хватает, система начинает распределять его согласно приоритетам потоков. Свойство Priority может принимать следующие значения:
tpTimeCritical - критический
tpHighest - очень высокий
tpHigher - высокий
tpNormal - средний
tpLower - низкий
tpLowest - очень низкий
tpIdle - поток работает во время простоя системы
Ставить высокие приоритеты потокам не стоит, если этого не требует задача, так как это сильно нагружает систему.
Ну и собственно, запуск потока.
Думаю, теперь вам понятно, как создаются потоки. Заметьте, ничего сложного. Но не всё так просто. Казалось бы - пишем любой код внутри метода Execute и всё, а нет, потоки имеют одно неприятное свойство - они ничего не знают друг о друге. И что такого? - спросите вы. А вот что: допустим, вы пытаетесь из другого потока изменить свойство какого-нибудь компонента на форме. Как известно, VCL однопоточна, весь код внутри приложения выполняется последовательно. Допустим, в процессе работы изменились какие-то данные внутри классов VCL, система отбирает время у основного потока, передаёт по кругу остальным потокам и возвращает обратно, при этом выполнение кода продолжается с того места, где приостановилось. Если мы из своего потока что-то меняем, к примеру, на форме, задействуется много механизмов внутри VCL (напомню, выполнение основного потока пока "приостановлено"), соответственно за это время успеют измениться какие-либо данные. И тут вдруг время снова отдаётся основному потоку, он спокойно продолжает своё выполнение, но данные уже изменены! К чему это может привести - предугадать нельзя. Вы можете проверить это тысячу раз, и ничего не произойдёт, а на тысяча первый программа рухнет. И это относится не только к взаимодействию дополнительных потоков с главным, но и к взаимодействию потоков между собой. Писать такие ненадёжные программы конечно нельзя.
Синхронизации потоков
Если вы создали шаблон класса автоматически, то, наверное, заметили комментарий, который дружелюбная Delphi поместила в новый модуль. Он гласит: "Methods and properties of objects in visual components can only be used in a method called using Synchronize". Это значит, что обращение к визуальным компонентам возможно только путём вызова процедуры Synchronize. Давайте рассмотрим пример, но теперь наш поток не будет разогревать процессор впустую, а будет делать что-нибудь полезное, к примеру, прокручивать ProgressBar на форме. В качестве параметра в процедуру Synchronize передаётся метод нашего потока, но сам он передаётся без параметров. Параметры можно передать, добавив поля нужного типа в описание нашего класса. У нас будет одно поле - тот самый прогресс:
Вот теперь ProgressBar двигается, и это вполне безопасно. А безопасно вот почему: процедура Synchronize на время приостанавливает выполнение нашего потока, и передаёт управление главному потоку, т.е. SetProgress выполняется в главном потоке. Это нужно запомнить, потому что некоторые допускают ошибки, выполняя внутри Synchronize длительную работу, при этом, что очевидно, форма зависает на длительное время. Поэтому используйте Synchronize для вывода информации - то самое двигание прогресса, обновления заголовков компонентов и т.д.
Вы наверное заметили, что внутри цикла мы используем процедуру Sleep. В однопоточном приложении Sleep используется редко, а вот в потоках его использовать очень удобно. Пример - бесконечный цикл, пока не выполнится какое-нибудь условие. Если не вставить туда Sleep мы будем просто нагружать систему бесполезной работой.
Надеюсь, вы поняли как работает Synchronize. Но есть еще один довольно удобный способ передать информацию форме - посылка сообщения. Давайте рассмотрим и его. Для этого объявим константу:
В объявление класса формы добавим новый метод, а затем и его реализацию:
Используя функцию SendMessage, мы посылаем окну приложения сообщение, один из параметров которого содержит нужный нам прогресс. Сообщение становится в очередь, и согласно этой очереди будет обработано главным потоком, где и выполнится метод SetProgressPos. Но тут есть один нюанс: SendMessage, как и в случае с Synchronize, приостановит выполнение нашего потока, пока основной поток не обработает сообщение. Если использовать PostMessage этого не произойдёт, наш поток отправит сообщение и продолжит свою работу, а уж когда оно там обработается - неважно. Какую из этих функций использовать - решать вам, всё зависит от задачи.
Вот, в принципе, мы и рассмотрели основные способы работы с компонентами VCL из потоков. А как быть, если в нашей программе не один новый поток, а несколько? И нужно организовать работу с одними и теми же данными? Тут нам на помощь приходят другие способы синхронизации. Один из них мы и рассмотрим. Для его реализации нужно добавить в проект модуль SyncObjs.
Критические секции
Работают они следующим образом: внутри критической секции может работать только один поток, другие ждут его завершения. Чтобы лучше понять, везде приводят сравнение с узкой трубой: представьте, с одной стороны "толпятся" потоки, но в трубу может "пролезть" только один, а когда он "пролезет" - начнёт движение второй, и так по порядку. Еще проще понять это на примере и тем же ProgressBar'ом. Итак, запустите один из примеров, приведённых ранее. Нажмите на кнопку, подождите несколько секунд, а затем нажмите еще раз. Что происходит? ProgressBar начал прыгать. Прыгает потому, что у нас работает не один поток, а два, и каждый из них передаёт разные значения прогресса. Теперь немного переделаем код, в событии onCreate формы создадим критическую секцию:
У TCriticalSection есть два нужных нам метода, Enter и Leave, соответственно вход и выход из неё. Поместим наш код в критическую секцию:
Попробуйте запустить приложение и нажать несколько раз на кнопку, а потом посчитайте, сколько раз пройдёт прогресс. Понятно, в чем суть? Первый раз, нажимая на кнопку, мы создаём поток, он занимает критическую секцию и начинает работу. Нажимаем второй - создаётся второй поток, но критическая секция занята, и он ждёт, пока её не освободит первый. Третий, четвёртый - все пройдут только по-очереди.
Критические секции удобно использовать при обработке одних и тех же данных (списков, массивов) разными потоками. Поняв, как они работают, вы всегда найдёте им применение.
В этой небольшой статье рассмотрены не все способы синхронизации, есть еще события (TEvent), а так же объекты системы, такие как мьютексы (Mutex), семафоры (Semaphore), но они больше подходят для взаимодействия между приложениями. Остальное, что касается использования класса TThread, вы можете узнать самостоятельно, в help'е всё довольно подробно описано. Цель этой статьи - показать начинающим, что не всё так сложно и страшно, главное разобраться, что есть что. И побольше практики - самое главное опыт!
Как отправить письмо через PHP, используя формы, и как при этом устранить возникающие проблемы с кодировкой? Рассмотрим на простом примере, как отправить вопрос через формы на сайте.
У нас будет 3 поля для ввода:
Ваше имя:
* E-mail:
* Вопрос:
Причем "Ваше имя" не является обязательным параметром.
Для простоты и удобства разместим форму и код прогараммы в одном файле. Важно указать кодировку страницы (windows-1251), чтобы далее не возникало проблем с перекодированием из win в koi (ниже)
Итак, приступим. Начало документа стандартное:
Код:
Далее идет 2 логические части:
1 - вывод формы
2 - обработка формы и отправка письма
Вначале идет вывод формы.
Для удобства в начале определяем e-mail через переменную $mailto, на который будет отсылаться письмо из формы.
Далее мы определяем, была ли нажата кнопка "отправить".
В конце формы имеется кнопка "отправить", она имеет аттрибуты name="ok" и value="отправить". После нажатия на нее переменная $ok будет иметь значение "отправить". Если кнопка не нажата, то переменная не определена.
Таким образом, выражение if (empty($ok)) означает буквально "если кнопка отправить не была нажата". Функция empty() возвращает true, если переменная не определена, содержит 0 или пустоту.
Код:
Далее идет вывод формы, если выполнено предыдущее условие if (empty($ok)).
Переменная $PHP_SELF означает, что обработку формы производит текущий файл, т.е. тот же, на кот. расположена форма.
Код:
В противном случае, т.е. если была нажата кнопка, идет обработка формы и отправка письма
Код:
Далее идет проверка на корректность заполнения поля "E-mail". Любители ругулярных выражений эту проверку поймут. Для остальных немного поясню:
Подразумевается, что e-mail должен быть такого вида:
слово@слово.слово
При этом слово может состоять из всех букв латинского алфавита и цифр и точка может быть не одна. (например слово@слово.слово.слово)
[a-z,0-9] - означает "любая буква латинского алфавита или цифра"
+ - означает, что [a-z,0-9] может встречаться 1 или более раз.
Если введен неправильный e-mail, то в переменную $error записывается ругательное сообщение.
Код:
Если поле "Вопрос" не заполнили, то к переменно $error добавляем еше одно ругательство:
Код:
Если переменная $error не пустая, то мы ее выводим на экран и немедленно прекращаем дальнейшую обработку с помощью exit
Код:
Ну а если таки $error осталась пустой и exit не сработал, то можно приступать к отправке письма, т.е. главной цели всего этого мероприятия...
Сформируем тему и тело сообщения:
А теперь самое главное, чтоб потом можно было прочитать письмо "по-русски" :) Функция convert_cyr_string перекодирует строку из win в koi (w-win, k-koi) Это необходимо, т.к. все почтовые клиенты по дефалту принимают письма в koi. А у нас вверху страницы стоит charset=windows-1251, поэтому функция грамотно переводит из win в koi Затем с помощью функции mail отправляется письмо на $mailto, указанный в начале файла.
Код:
Ну и самое приятное... Если письмо успешно отправлено, то выводим благодарственную надпись и предлагаем вернуться..
Код:
Стандартный конец..
Код:
P.S. Как наверно понял читатель, нужно выделить и скопировать все зеленые блоки в один файл по порядку и запустить его на сервере
Весь код является полностью проверенным и рабочим.