ria pc game
fle game engine - движок для создания игр
fle game engine - движок для создания игр


Balls and holes PC game / Balls and Holes PC игра
Вакансии
Игродельня
Сегодня
22 февраля 2019 15:16
Вход Регистрация Забыли пароль ?

ria pc game - megainformatic обзор 110_2
Привет ! Я разработчик игры ria pc game. В этом обзоре самый свежий релиз игры.
подробнее...

Теги создание сайтов, создание игр, дизайн, игры, информатика, уроки photshop, php, c++, музыка, delphi, cms, робосайт
Статьи сайта
megainformatic - Плагин для 3DS MAX из DX9 SDK

megainformatic - Мастер-класс: Создание модели и текстуры Коммандного Центра (как в StarCraft 2)

megainformatic - Мастер-класс: Создание модели и текстуры Коммандного Центра (как в StarCraft 2) Часть 2

megainformatic - Мастер-класс: Создание модели и текстуры Коммандного Центра (как в StarCraft 2) Часть 3

megainformatic - Мастер-класс: Создание модели и текстуры Коммандного Центра (как в StarCraft 2) Часть 4

megainformatic - Мастер-класс: Создание модели и текстуры Коммандного Центра (как в StarCraft 2) Часть 5

megainformatic - Мастер-класс: Создание модели и текстуры Коммандного Центра (как в StarCraft 2) Часть 6

Система управления сайтом - megainformatic cms e-shop

Система управления сайтом - megainformatic cms e-shop

Система управления сайтом - megainformatic cms e-shop

megainformatic - Уроки 3ds max - Введение в 3ds max

megainformatic - ГАЛЕРЕЯ 3D-моделей

megainformatic - СОЗДАНИЕ МАКЕТА ПОМЕЩЕНИЯ

megainformatic - Создание макета помещения - этап 2

megainformatic - МОДЕЛИРОВАНИЕ НА УРОВНЕ МНОГОУГОЛЬНИКОВ

megainformatic - СОЗДАНИЕ ПРЕДМЕТОВ ОБСТАНОВКИ ПОМЕЩЕНИЯ

megainformatic - Моделирование обстановки помещения

megainformatic - Создание модели автомобиля

megainformatic - Создание текстурной развертки для модели автомобиля

megainformatic - Создание анимации вращающихся колес автомобиля

megainformatic - игра Нечто: Необъяснимое и в плену желаний

megainformatic - Основы 3D-анимации, экспорт скелетной анимации

megainformatic - Подготовка модели к использованию скелетной анимации

megainformatic - Продолжаем Создание скелета для данной модели

megainformatic - Построение ирерархических связей между объектами и основы 3d анимирования

megainformatic - Особенности экспорта моделей и анимации экспортером kWXPort080719 из 3ds max 2009 

megainformatic - Создание модели броневика (Хэд)

megainformatic cms e-mailer

megainformatic cms e-mailer

megainformatic cms e-mailer

Бесплатная Система Управления Вашим Сайтом - megainformatic cms free

megainformatic - Путешествие в мир 3d

megainformatic - Путешествие в мир 3d - страница 2

megainformatic - Путешествие в мир 3d - страница 3

megainformatic - Путешествие в мир 3d - страница 4

megainformatic - Путешествие в мир 3d - страница 5

megainformatic - Путешествие в мир 3d - страница 6

megainformatic - Создание модели броневика (Хэд) - Анимация вращения колес

megainformatic cms express files

megainformatic cms express files

megainformatic cms express files

megainformatic - Уроки Photoshop - Чудеса

megainformatic cms express files - Развертывание сайта на Вашем хостинге

megainformatic - Настольная игра "Веселый Буквоежка"

megainformatic - Уроки delphi directx 8.1

megainformatic - Уроки delphi directx 8.1 - Урок 1 - Введение в Delphi DirectX 8.1. Создание шаблона стартового приложения.

megainformatic - Уроки delphi directx 8.1 - Урок 1 - Введение в Delphi DirectX 8.1. Создание шаблона стартового приложения. Страница 2

megainformatic - Урок 2 Создаем и обрабатываем команды меню.

megainformatic - Урок 2 Создаем и обрабатываем команды меню. Страница 2

megainformatic - Урок 3 Оконный и полноэкранный режимы работы D3D-приложения. Управление игрой средствами DirectInput8

megainformatic - Урок 3 Оконный и полноэкранный режимы работы D3D-приложения. Управление игрой средствами DirectInput8 - Страница 2

megainformatic - Урок 3 Оконный и полноэкранный режимы работы D3D-приложения. Управление игрой средствами DirectInput8 - Страница 3

megainformatic - Урок 4 Построение класса приложения

megainformatic - Урок 4 Построение класса приложения - Страница 2

megainformatic - Урок 5 Построение классов игровых объектов и других необходимых классов

megainformatic - Урок 5 Построение классов игровых объектов и других необходимых классов - Страница 2

подробнее

Fez - игра для PC 2013 год

2013 год, разработчик Polytron
инди-игра жанра головоломка/платформер, разработанная независимой студией Polytron

Описание игры

инди-игра жанра головоломка/платформер, разработанная независимой студией Polytron

для просмотра изображений в увеличенном виде кликните по одному из них.


Fez игра головоломка для PC
Fez игра головоломка для PC
Fez игра головоломка для PC
Fez игра головоломка для PC


Трейлер

 


Размер файлов - 886 Мб

музыка из игры + установщик игры

Fez - игра для PC 2013 год СКАЧАТЬ ТОРРЕНТ
[downloads:32]

Для скачиваня торрент раздачи вам потребуется программа mu-torrent (скачивайте бесплатную версию)

КАК ТУТ СКАЧИВАТЬ ?

===========================
ПРАВООБЛАДАТЕЛЯМ - файлы представленные здесь для скачивания не являются собственностью автора публикации, взяты из общедоступных источников информации и не используются для продажи, сдачи в прокат или иного способа извлечения коммерческой выгоды.

Сайт не распространяет и не хранит электронные версии произведений, а лишь предоставляет доступ к создаваемому пользователями каталогу ссылок на торрент-файлы, которые содержат только списки хеш-сумм

подробнее

Спеши увидеть ! Игра ria pc game в жанре нео квеста, новеллы,
реалити детермайнед мини геймс, love story и sci fi от независимого российского разработчика.



Риа PC игра / Ria PC game EN | RU

read paper in english



платформа: PC Windows
жанр: quest, mini games, love story, sci fi
движок: fle game engine

ria pc game





ria pc game ДОСКА ПОЧЕТА !



вышла полная версия игры 11.01.2019 ! доступна для скачивания

complete version of game 11.01.2019 released ! enabled for download




megainformatic_ twitter
здесь можно писать ваши комментарии по проекту -
впечатления, отзывы, замечания, пожелания и т. п.



ria pc game





В файле Media2\base\params.txt
In file Media2\base\params.txt

quest_mode=1; //включение 1, отключение 0 режима квеста. on/off quest mode.




версия 11.01.2019
Дистрибутив состоит из 2-х файлов и вам нужно скачать их оба:

1)
ria_pc_game_11012019_setup.exe 720 Kb

Контрольные суммы для проверки целостности скачанного файла (для версии 11.01.2019).

CRC32: 926A8297
MD5: 28BC4D8F9B3AE397CAE2797AA939F3F5
SHA-1: C20A25DF7222BEF56CD0B4E30A82DF825F81BDCD

2)
ria_pc_game_11012019_setup-1.bin 1,29 Gb

Контрольные суммы для проверки целостности скачанного файла (для версии 11.01.2019).

CRC32: 0870EEC7
MD5: 1DDE994558D89531D40E032A174EC7BC
SHA-1: 04C6A65E51C8D000351DA3D720B30F7564C17012







Свободное место на носителе для установки игры: 2,62 Гб

После успешного скачивания обоих файлов и сверки контрольных сумм можно запускать ria_pc_game_11012019_setup.exe
чтобы начать установку игры на ваш ПК.



Контрольные суммы можно проверить утилитой - HashTab



версия 4.11.2018




размер: 1,34 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 2,51 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 4.11.2018).

CRC32: 08C04F7B
MD5: 985E4FC7870AA90B4648FC22F05A638A
SHA-1: 5595DBC9AB0B4DE45BF48133D7D29E9B1DDD3A50



версия 18.07.2018
ВНИМАНИЕ !!! Версия доступна для скачивания только пользователям поддержавшим проект.




размер: 1,29 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 2,41 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 18.07.2018).

CRC32: CFEA7DE6
MD5: 57FD10F3DD6A0F90459A5328A4687730
SHA-1: CEC804B3663723724074BA252FE8410303A843F2



Ria PC game + Pencil Paper and the Ball + Нечто Необъяснимое в плену желаний - начало

Теперь проект объединяет 3 игры !

ria pc game -
для запуска используйте start.exe

Pencil Paper and the Ball + Нечто Необъяснимое в плену желаний - начало
для запуска используйте ppab_start.exe





105 ria pc game темная сторона

105 ria pc game темная сторона
просмотров: 9980


103 ria pc game видеообращение в поддержку проекта

105 ria pc game темная сторона

104 ria pc game видеообзор игры часть 1

104 ria pc game видеообзор игры часть



104 ria pc game видеообзор игры часть 2

104 ria pc game видеообзор игры часть 2



104 ria pc game видеообзор игры часть 3

104 ria pc game видеообзор игры часть 3



104 ria pc game видеообзор игры часть 4

104 ria pc game видеообзор игры часть 4



104 ria pc game видеообзор игры часть 5

104 ria pc game видеообзор игры часть 5



104 ria pc game видеообзор игры часть 6

104 ria pc game видеообзор игры часть 6



104 ria pc game видеообзор игры часть 7

104 ria pc game видеообзор игры часть 7



104 ria pc game видеообзор игры часть 8

104 ria pc game видеообзор игры часть 8



104 ria pc game видеообзор игры часть 9

104 ria pc game видеообзор игры часть 9
просмотров: 9980









ria pc game





ria pc game





ria pc game





ria pc game

глава 2 дом тети Кейси



Я начинаю литературную основу игры ria pc game -
она будет также публиковаться здесь.

До этого я не планировал что-либо размещать,
но теперь решил - надо.

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

И игра конечно не будет строго следовать
сюжету. Будут и отличия. Иногда значительные.

Но надеюсь вы понимаете, что текст и игра
и должны немного отличаться.

Текст всегда преследует одну цель -
описательно-повествовательную.

А игра - совсем другую - чтобы было занимательно
и интересно.

Поэтому эти отличия справедливы.

К тому же сложно все описанное воплотить
вот так, сразу.

Так что будьте терпеливы.

Спасибо за внимание и понимание.

ria pc game - история
102 ria pc game review



99 ria pc game review



ria pc game обзор #101

101 ria pc game обзор

ria pc game review #101

101 ria pc game review

i 100 ria
и сто рия

i 100 ria и сто рия



i 100 ria pink
и сто рия розовый

i 100 ria pink и сто рия розовый



вышла полная версия игры 27.12.2017 ! complete version of game 27.12.2017 released !







Началом разработки игры можно считать 2008 ! год. В том виде в каком
игра представлена сейчас, она создается уже 4й месяц и работа продолжается.
Вы можете поддержать проект.
подробнее







Вышла полная версия игры 11.01.2019





еще видео





описание и история



ria pc game call вызов

еще скриншоты







Если Вы хотите и можете материально поддержать проект.



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



можно перечислить средства на банковскую карточку. Пожалуйста свяжитесь
со мной через форму комментариев на странице ниже, оставив свой емайл. Вам
будут высланы реквизиты для перевода. Спасибо !

web money
web money
R247856066494

yandex money
yandex money
41001702554684









Системные требования:

Windows XP / 7 / 8 / 10
directx 9c
~1,58 Gb (версия 20.12.2017) свободного места на носителе информации (не включая размер дистрибутива).

Интерфейс игры RU / EN.

вышла полная версия игры 11.01.2019 !





Риа PC игра / Ria PC game EN | RU





540 руб / 9 usd

приобрести полную версию ria pc game. Если вы не поддерживали проект, можно сразу приобрести полную версию.







300 руб / 5 usd

Если Вы поддерживали проект, то получаете полную версию бесплатно.



версия 11.01.2019
Дистрибутив состоит из 2-х файлов и вам нужно скачать их оба:

1)
ria_pc_game_11012019_setup.exe 720 Kb

Контрольные суммы для проверки целостности скачанного файла (для версии 11.01.2019).

CRC32: 926A8297
MD5: 28BC4D8F9B3AE397CAE2797AA939F3F5
SHA-1: C20A25DF7222BEF56CD0B4E30A82DF825F81BDCD

2)
ria_pc_game_11012019_setup-1.bin 1,29 Gb

Контрольные суммы для проверки целостности скачанного файла (для версии 11.01.2019).

CRC32: 0870EEC7
MD5: 1DDE994558D89531D40E032A174EC7BC
SHA-1: 04C6A65E51C8D000351DA3D720B30F7564C17012







Свободное место на носителе для установки игры: 2,62 Гб

После успешного скачивания обоих файлов и сверки контрольных сумм можно запускать ria_pc_game_11012019_setup.exe
чтобы начать установку игры на ваш ПК.



Контрольные суммы можно проверить утилитой - HashTab



240 руб / 4 usd

Получение немного ограниченной версии по сравнению с полной.



версия 4.11.2018




размер: 1,34 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 2,51 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 4.11.2018).

CRC32: 08C04F7B
MD5: 985E4FC7870AA90B4648FC22F05A638A
SHA-1: 5595DBC9AB0B4DE45BF48133D7D29E9B1DDD3A50



версия 18.07.2018
ВНИМАНИЕ !!! Версия доступна для скачивания только пользователям поддержавшим проект.




размер: 1,29 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 2,41 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 18.07.2018).

CRC32: CFEA7DE6
MD5: 57FD10F3DD6A0F90459A5328A4687730
SHA-1: CEC804B3663723724074BA252FE8410303A843F2



версия 03.05.2018
ВНИМАНИЕ !!! Версия доступна для скачивания только пользователям поддержавшим проект.




размер: 1,17 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 2,13 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 03.05.2018).

CRC32: 3CBC7E76
MD5: 93762F7A808550BCE2CF95E94F92D7DF
SHA-1: AA0A16BBA6B7BDBA3A15815D1EE7F17092807DFD



версия 06.04.2018
ВНИМАНИЕ !!! Версия доступна для скачивания только пользователям поддержавшим проект.




размер: 1,14 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 2,05 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 06.04.2018).

CRC32: 275714C0
MD5: BDA450EEBF2C7C8842F52FBB363BBAB7
SHA-1: 602927A87AAC85884CB7C07B72F05E59A3EBB1C6



версия 14.03.2018
ВНИМАНИЕ !!! Версия доступна для скачивания только пользователям поддержавшим проект.




размер: 1,15 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 2,02 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 14.03.2018).

CRC32: 81AEDBD3
MD5: B583BF5FC3510525665AADD5E2EFC729
SHA-1: 46EFA787A5F3CEA3FCC151F3D5C1016D5FF083A8



версия 20.02.2018
ВНИМАНИЕ !!! Версия доступна для скачивания только пользователям поддержавшим проект.




размер: 1,14 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 2,0 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 20.02.2018).

CRC32: E76A77C8
MD5: A7D72CDE197D9AC596FB90F22B087519
SHA-1: C2E08342A1567C784280C39724863C056777A34E



версия 09.02.2018
ВНИМАНИЕ !!! Версия доступна для скачивания только пользователям поддержавшим проект.




размер: 1,12 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 1,96 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 09.02.2018).

CRC32: D7385B20
MD5: 698DEA29E712E207B1E87192DE237165
SHA-1: 724A3237D8449B510B40A98F291A758C3E2A8E99



версия 31.01.2018
ВНИМАНИЕ !!! Версия доступна для скачивания только пользователям поддержавшим проект.




размер: 1,07 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 1,81 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 31.01.2018).

CRC32: E0525406
MD5: 696E46BFBCAD73A015ECC30E9BCD389C
SHA-1: 0EA57DBEFB79EBCD88717D501B5264020C95565B



версия 25.01.2018
ВНИМАНИЕ !!! Версия доступна для скачивания только пользователям поддержавшим проект.




размер: 1,01 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 1,66 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 25.01.2018).

CRC32: 8DEAC21A
MD5: 35075BD74F392FA9F41F4940D1EE9EA0
SHA-1: 4764AAE47F4A8179B83B3CA9607A58842856D053

ВНИМАНИЕ !!! В данной версии по-умолчанию включен режим цензуры.

Но вы можете его отключить.

Для этого перед стартом приложения откройте в любом текстовом редакторе (лучше
в обычном Блокноте) файл
Media2\base\params.txt

в строке
uncensored=0; //включение 1, отключение 0 отображения контента для взрослых - on/off for adult content

замените значение на
uncensored=1; //включение 1, отключение 0 отображения контента для взрослых - on/off for adult content

Сохраните изменения.

После этого можно запускать игру.







версия 18.01.2018
ВНИМАНИЕ !!! Версия доступна для скачивания только пользователям поддержавшим проект.




размер: 1,01 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 1,68 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 18.01.2018).

CRC32: 0375867A
MD5: 857B0FB2DDF1A0D28694C863D7EDAB2F
SHA-1: 8E7B01CF0E86E2779B3FAF23EDCDBF4500DD2DE1









версия 13.01.2018
ВНИМАНИЕ !!! Версия доступна для скачивания только пользователям поддержавшим проект.




размер: 1,01 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 1,67 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 13.01.2018).

CRC32: AF193E1C
MD5: D3026AF1F292AF0DAE2ABEEED1083169
SHA-1: 33C4B26BC0B60B768D4F2240BB5EFDD538125BEE









версия 10.01.2018
ВНИМАНИЕ !!! Версия доступна для скачивания только пользователям поддержавшим проект.




размер: 1,0 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 1,67 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 10.01.2018).

CRC32: 96476DFF
MD5: EA1F1138BC062B62C30D2F9720661792
SHA-1: C24D81B9E4F0779673349481585AE46D7D70BB24









версия 05.01.2018
ВНИМАНИЕ !!! Версия доступна для скачивания только пользователям поддержавшим проект.




размер: 1,0 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 1,63 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 05.01.2018).

CRC32: AF0BB8CD
MD5: C2CCAF463AE8A5A1B68614E4C9073ACB
SHA-1: B425BCB5F48CA64E88D10E8CA07E83077071C119





версия 01.01.2018
ВНИМАНИЕ !!! Версия доступна для скачивания только пользователям поддержавшим проект.




размер: 0,99 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 1,62 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 01.01.2018).

CRC32: 17557346
MD5: 977D84961C69E28D6FBFBF20DD16D3B7
SHA-1: 26783625447281B3096CD8B93DDDC4E4052C5698





версия 27.12.2017
ВНИМАНИЕ !!! Версия доступна для скачивания только пользователям поддержавшим проект.




размер: 0,98 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 1,59 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 27.12.2017).

CRC32: 027E38E8
MD5: 219499FFD94942823FE84D32118070A1
SHA-1: 9D903F0332F7E1EA09860D968C441825753B267F





версия 20.12.2017
ВНИМАНИЕ !!! Версия доступна для скачивания только пользователям поддержавшим проект.




размер: 0,98 Gb
файл в виде sfx самораспаковывающегося архива.


Свободное место на носителе для установки игры: 1,58 Гб

Контрольные суммы для проверки целостности скачанного файла (для версии 20.12.2017).

CRC32: 9ACFBAEF
MD5: A6D3FC4A1CE8E9F88E4ECA094847D6C7
SHA-1: 07914C396057FC99451014265A8CE5C43F4DABEE





версия 14.12.2017
ВНИМАНИЕ !!! Версия доступна для скачивания только пользователям поддержавшим проект.


размер: 365 Mb
Контрольные суммы для проверки целостности скачанного файла (для версии 14.12.2017).

CRC32: 5E879748
MD5: 09B4F4F2AB658F6D9A8E1E9892887D06
SHA-1: 7566D6FC35BB7F5431FE3FFBF525C720B1D4DFB9





более ранние версии







Подарки для тех, кто поддержал проект:

Стальной юзер
1$ немного ограниченная полная версия.

Бронзовый юзер
5$ - полная версия игры + ваше имя в финальных титрах проекта и благодарность !

Серебряный юзер
9$ - полная версия игры + ваше имя в финальных титрах проекта и благодарность + бонусные возможности (персональное место в игре)!

Золотой юзер
15$ и выше - полная версия игры + ваше имя в финальных титрах проекта и благодарность + бонусные возможности + инструменты создания дополнений и своих игр !

Платиновый юзер
>20$ - полная версия игры + ваше имя в финальных титрах проекта и благодарность + бонусные возможности + инструменты создания дополнений и своих игр !! + эксклюзивные материалы и секреты, возможность использования ваших идей в дальнейшем развитии проекта.

подробнее

We all live in a yellow submarine !

То есть - Все мы живем в желтой подлодке.

Давайте представим что наш земной шар - это большая пребольшая подлодка, которая парит в океане космоса.

Представили ?

Дух захватывает.

Правда масштабы Земли не позволяют это представить.

Тогда можно представить что-то поменьше - дом в котором Вы живете.

Вот это уже представляется легче.

А теперь представьте, что у вас есть какое-то личное дело, которое Вас всецело захватывает.

Ну, например, Вы писатель и пишете книгу, или программист, создающий свою компьютерную игру, или художник или сценарий или или ...

И вот, Вы понимаете, что уже не можете выйти за некие рамки дозволенного.

Вы хотите покорить космос, но увы.

У вас нет возможностей, чтобы покорить его.

Да, конечно, Вы можете фантазировать или играть в такие игры как kerbal space program, но выйти за пределы своей мини-вселенной, своего мира, Вы не можете.

Кто-то скажет: друг, зачем это тебе ? Довольствуйся малым. Тем что есть.

Согласен.

В жизни мы так и делаем. Каждый день. Каждый час. Каждый миг.

Душа просит всегда большего и если знаешь, что есть какой-то предел, стена, за который выйти нельзя, это удручает.

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

В позитивном - это уютный домик, в котором тебе живется хорошо.

А открытый космос - это неизвестность, таящая в себе опасность гибели.

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

Мы начинаем урок № 1380, посвященный изучению своего личного мира.

А как можно изучить личный мир, как не на своем примере ?

И если познать личный мир, то можно узнать кое-что и обо всем космосе.

Как это ?

Очень просто: если ты понимаешь самого себя, то в космосе найдешь только самого себя.

Ведь космос - это пространство, как зеркало.

Как можно познать пустоту ? Пространство ? Только познав себя.

Вот и получается, что познавая себя мы познаем космос, как это ни странно звучит.

к новым мирам

Так начинается новая игра в масштабах целой вселенной !

Или вот шарик в ямке - не самый удачный момент.

шарик в ямке - не самый удачный момент

Глава 1

Пришелец с другой планеты

По стадиону мерно разгуливал, точнее прыгал средних размеров красный шарик, похожий на
футбольный мяч, но раза в 1,5 больше его.

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

- Привет ! - выдавил я из себя боязливо.

- А что, разве Вы меня видите ?

- Да Вы уже тут битый час круги меряете.

- Вообще-то мне запрещены контакты 1 рода. И уж тем более не разрешены контакты 2 рода.
Значит Вы меня видите ?

- Вижу.

- Это плохо.

- Вы пришелец ?

- Наивный вопрос молодой человек. Я живу в параллельном мире, если соотносить это с
вашим пониманием. И то что Вы меня сейчас видите - всего лишь временная ошибка,
связанная с флуктуациями энергий. Скорее всего больше Вы меня здесь никогда не увидите.

- Ну что ж. Все равно приятно встретить незнакомца из неизвестных миров.

- Что поделать. Такое случается. Иногда.

- Не посчитайте меня за наглеца, а не могли бы вы хоть немного рассказать о своем мире.
Об этой параллельной вселенной ?

- Конечно же могу. Если Вам это будет приятно и интересно.

- Я весь внимание.

- О! Ну что ж. Зовут меня Зеленый. И это всего лишь мой сон.

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

Населяют нашу планету всяческие существа, не похожие никоим образом на Вас. У нас даже нет
рук. По крайней мере у некоторых. Но зато мы можем умело пользоваться силой мысли, чтобы
использовать любые предметы как если бы у нас были нормальные конечности.

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

- Так значит для Вас это всего лишь Сон ?

- Выходит так.

- Забавно.

- Более того, необычно. И вам не кажется, что это открытие ! Сенсация. Правда толку от неё
мало.

- Почему ? Вы имеете в виду вот такие дальние межпланетные путешествия ?

- Да. Во-первых, потому что никто не поверит, а подтверждений естественно нет. А во-вторых,
просто это временное явление, и повторить его еще раз я вряд ли смогу, да и не сам я это
сделал.

- Но ведь это Ваш сон ?

- Конечно.






подробнее

       
  Урок 5: Первая композиция в Mod Plug Tracker 1.16. Описывается создание композиции в ModPlug Tracker 1.16  
       
 

На вкладке Patterns происходит вся основная работа по созданию композиций. Ноты вводятся в текущую позицию с клавиатуры. Текущая позиция определяется нотным курсором, пометить новую позицию можно щелчком мыши. Если Вы задали раскладку клавиатуры в стиле IT (см. пункт меню View > Setup > Keyboard > Keyboard preset > Impulse Tracker), то расположение нот будет таким же как в IT (см. урок 6 Ввод нот).

Для проигрывания звука Вам понадобится хотя бы один сэмпл. Скачать его можно здесь. Или используйте то, что есть у Вас под рукой - свои сэмплы или сэмплы из других композиций.

 
       
 

Загрузка сэмпла в текущий слот - для этого перейдите на вкладку Samples и нажмите кнопку Import sample - эта кнопка позволит вам открыть один из понимаемых программой форматов сэмплов (обычный wav или многие многие другие форматы, подробнее см. help по MT). Можно также импортировать сэмпл из другой композиции - для этого воспользуйтесь окном структуры композиции (см. предыдущий урок). Откройте узел Instruments Library в этом окне и открывайте последовательно требуемый диск, папки, подпапки и когда дойдете до самих композиций, то они будут помечены в виде зеленых папок. Открыв такую папку Вы получите в нижнем окне список сэмплов данной композиции. Загрузить сэмпл можно простым перетаскиванием в окно сэмпла (черная область) на вкладке Samples.

импортирование (или просто - открытие) существующего сэмпла
 
       
 

Теперь вернемся на вкладку Patterns и попробуем ввести несколько нот. Находясь на этой вкладке Вы можете работать в двух режимах - в режиме проигрывания нот и в режиме записи нот. Переключение режимов осуществляется комбинацией клавиш [Ctrl] + [Space]. (Space - это пробел).

Чтобы записать несколько нот перейдите в режим записи нажав данную комбинацию или нажав мышкой кнопку записи (Record) на вкладке Patterns. Щелкните мышью место в текущем паттерне, в которое Вы хотите записать ноту. Нажмите клавишу с нотой и в текущей позиции появится нота.

 
       
 

Как видите все достаточно просто. Чтобы ввести следующую ноту пометьте мышью следующую позицию или воспользуйтесь клавишами управления курсором (стрелками) для перемещения на следующую позицию.

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

 
       
 

В поле Instrument можно изменить текущий (используемый для проигрывания и записи нот) сэмпл/ инструмент.

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

Всё, что не содержит нот - это паузы (или тишина). Однако если длина сэмпла большая, то он будет звучать, пока не будет встречена следуюшая нота или пока он не закончится (если он не зациклен).

Для видоизменения проигрывания звука, придания ему иной окраски или эффектного звучания применяются различные эффекты. Об эффектах рассказано в уроке 7 . Для ввода эффекта вы переходите в мини-столбец для записи эффектов и вводите идентификатор эффекта (букву или цифру) и его параметры - две последующие шестнадцатиричные цифры. Типы эффектов отличаются для разных форматов, поэтому информация по ним содержится в справочной системе MT - Help > Contents > Getting Started > Effects.

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

 
       
  Для паттернов можно задавать имена. Последовательность воспроизведения паттернов находится над основным окном содержимого паттерна. Для того, чтобы добавить/исключить/переместить паттерн в этой последовательности используйте мышь с левой и правой кнопкой. Можно включать/отключать звучание отдельных каналов - для этого щелкайте мышью по заголовкам каналов (Channel 1 и т.д.).  
       
 

Для воспроизведения композиции используйте кнопки панели инструментов или следующие клавиши - F5 - воспроизведение композиции с текущей позиции останова (F8). F6 - воспроизведение композиции с начала. F7 - воспроизведение текущего паттерна. [Ctrl] + [F7] воспроизведение паттерна с текущей позиции редактирования нот.

MT позволяет работать одновременно с неограниченным числом композиций во всех поддерживаемых форматах. При этом поддерживается авто-импорт при копировании/вставке/замене отдельных фрагментов композиций в разных форматах. Чтобы закрыть текущую композицию выберите ее в окне структуры композиции и дайте команду File > Close. Можете также использовать стандартные кнопки для Windows-окна и все преимущества многооконного интерфейса.

 
       
 

Сохранять композицию также предельно просто - выберите команду File > Save или File Save As. При этом композиция будет сохранена в текущем (или выбранном формате). Можно также легко экспортировать композицию в Wave/MP3/Midi формат - для этого используются соответствующие пункты меню.

 

Это было краткое вступление по основам использования Mod Plug Tracker 1.16. Более подробно о создании композиций рассказано в цикле статей "Теория и практика компьютерной музыки в трэкерах".
 
       
       
       
       
       
  [Предыдущий урок] [Следующий урок] [Все уроки]  

роман Eternity Вечность - автор Синицин Андрей megainformatic - страница 5

 

к странице 1 к странице 2 к странице 3 к странице 4 страница 5 к странице 6

 

* * *



Был найден более подходящий пример для решения задачи,
которая стояла передо мной.

c:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\simple

Его мы и будем изучать далее.

А еще у меня в ходе работы возникла такая мысль:
всё что я делаю - это документирую свою деятельность в форме статей.

Если бы кому-то из непрограммисткой области пришло на ум задокументировать
какие-то свои действия и выложить на всеобщее обозрение, то
это выглядело бы по-меньшей мере странно. :)

Представьте, работник автосалона пишет:

Пришел на стэйшн, сделал то-то и то-то, чтобы раскрутить клиента
на покупку того или иного авто. И т.д.

Хотя идея, кстати говоря, не такая уж и странная.
Другие работники этой отрасли усвоив такие знания смогут
таким образом достичь каких-то результатов.

Правда в программировании результат всегда точно определен.
Это либо работающая программа делающая действия по решению
четко поставленной задачи, либо не делающая её.

Конечно с покупкой или не покупкой такой программы результат
более чем размыт.

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

И если в программировании опять же всё более-менее ясно -
хотя бы с точки зрения получения результата на уровне: Да - получилось
или Нет - не получилось.

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

Конечно же с точки зрения непосвященного деятельность программиста -
это точно такие же "магические заклинания" и "танцы с бубном".

Но и в той и другой отрасли результат легко оценить: если программа
работает - то она дает ответ на поставленные вопросы.

Если продукт продан и прибыль получена - то это тоже очевидно.

Другой вопрос, на тему которого мне бы тоже хотелось порассуждать, как это сейчас
модно во всяких ток-шоу, так это попытка расценивать деятельность
менеджеров и программистов на уровне того же самого программирования.

Но увы. В силу определенных причин такая оценка всегда крайне субъективна -
хоть, как говорится, результат и можно оценить как Да/Нет - 

но эти самые Да и Нет крайне размыты и зависят от личных качеств субъекта
который решает что оно Да или что оно Нет.

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


Обычно тот, кто считает себя квалифицированным видя перед собой какое-то
сложное решение, почти неглядя выбирает второй вариант.

Таким образом на первый план выходят не знания, а такая составляющая
как доверие к разработчику.

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

Если же такого нет - полагаются на случай.

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

Конечно может не совсем уж так трагично, но всё-таки и не совсем приятно.

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

На нехватку финансирования, выделенного времени и т. д.

Одним словом люди с неудачным опытом совместного сотрудничества на уровне
"заказчик-исполнитель" просто расходятся в стороны и ищут каких-то новых вариантов.

Вот и всё.

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

Если будут какие-то ограничения - с финансовой стороны, либо со стороны временных рамок,
либо, что чаще и бывает - и с той и с другой стороны, да еще сдобренной хорошей порцией
сложностей в самом проекте и поставленных задачах, то если Ты только начинаешь работать
с таким проектом - впору задуматься: а стоит ли браться ?

Хуже бывает если выбора уже нет, и всё может окончиться отрицательным результатом и 
отрицательным опытом сотрудничества.

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

И всё зависит от:
квалификации разработчика,
способности адекватной оценки результата со стороны заказчика
и 
конечно же доступного бюджета и временных рамок.

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

Примеры ?

Да вот навскидку: услуги по перевозу грузов или пассажиров; оказание услуг в образовательной
сфере; концертная деятельность; розничная продажа товаров;

А в программировании ?

Заказчик порой может придумать что-то немыслимое. Не имея даже малейшего представления
как это реализовать и вообще возможно ли это. Он просто где-то что-то услышал-увидел-ему
подсказали.

И вперед.

Дальше начинается кино.

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

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

Но чем сложнее идея, тем сложнее и тернистее путь заказчика, который решил, не своими руками,
всё это реализовать.

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

Тогда и начинается новое кино.

Вера в то, что всё будет хорошо, даже если всё плохо, спасает нас. Это надежда на лучшее
и на то, что всё меняется к лучшему.

Модель её использования очень проста: зачем ругаться и мучать друг друга, когда можно всё
решить мирно и спокойно ?

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

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

Искреннее и доброжелательное отношение - вот ответ на любые вопросы и любые проблемы,
которые будут решаться в этом случае как бы сами собой.

Почему так ?

Да потому что всегда тот кто хочет найти, находит. А тот кто напротив, изначально дал
себе установку на отрицательный результат - его и получит в итоге.

Не будьте врагами сами себе !

Тот кто привык что-то ругать и критиковать, в итоге и получит лишь ответную ругань и
критическую болтологию.

Тот кто настроен на креативное русло - достигнет и созидательных результатов. Неважно каких -
отрицательных с точки зрения того, кто их будет оценивать и принимать или положительных.

Помните - любые оценки - это известная доля субъективизма, а потому не ищите позитива там,
где сами плодите и порождаете негатив.

Начинайте изменяться начиная с прямо сейчас и прямо с себя. И только потом уже глядя
по-сторонам.

И да, запомните наконец, эту простую истину -

Искреннее и доброжелательное отношение - вот ответ на любые вопросы и любые проблемы,
которые будут решаться в этом случае как бы сами собой.

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

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

Решение всегда есть, его всегда можно найти. Но имеется в виду такое - которое
даст положительный результат, а не отказ от работы или откат от проблемы.

Положительное и позитивное возникает только там, где не ищут позитив днём с огнём,
а где это уже устоялось и считается за норму.

Только так и никак более.

Простите, но увы, я не даю рецептов, на гарантированные результаты.

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

Будьте всегда людьми не только слова, но и дела.

Не воспринимайте всё вышесказанное как простую формулу или рецепт.

Ошибка именно в том, что всё пытаются воспринимать просто и "КАК ЕСТЬ".

На самом деле не всё "ПРОСТО" и не всё следует понимать "КАК ЕСТЬ".

Забудьте про такие стереотипы.

Искать позитив и генерировать его это не одно и то же.

Здоровое зерно будет расти только на здоровой почве. Даже если Вы заранее
ложите в почву здоровое зерно, не надейтесь просто на то, что раз
оно здорово, то и плоды его тоже будут здоровыми. Почва тоже должна
быть здоровой, а если нет - то должна быть оздоровлена.

Так и человек. Не может генерировать или воспринимать позитив, если
сам он изнутри не позитивен. Это будет лишь притворство и ничего
более.

Путь этот труден и извилист.

Вы наверное уже устали от такого "менторского" и "назидательного" стиля.
Умных мыслей и установок.

Добро и зло существуют и сосуществуют в тесной связи и взаимозависимости.
Одно не может быть без другого. Как день без ночи и наоборот.

Одно перетекает в другое, плавно и не плавно, существуют и сосуществуют
самые разнообразные его формы и виды. Мыслимые и немыслимые, очевидные
и совсем мало распространенные, даже уникальные, маниакальные и 
малоизученные.

Носителей настоящей истины нет. Всё решается в конкретных обстоятельствах.

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

И никакое из них не будет являться истиной в последней инстанции.
Потому что её нет и быть не может.

Всё применимо только в конкретных условиях и обстоятельствах и результат
и его достижимость, и достижение результата.


Почему мы не живём вечно и нам кажется, что мы делаем что-то уже бесконечно ?

Мудрость.

Она не приходит сразу и ко всем.

Мудрыми становятся и остаются также не сразу и не все.

Все мы разные.

У каждого из нас свой путь.

Свои трудности и проблемы.

Но и свои радости и достижения.


Нет такого человека, который бы был АБСОЛЮТНО СЧАСТЛИВЫМ.

Счастье достигается тем, что постоянно его надо искать и есть неиссякаемая
надежда на то, что Мы его найдём !

На этом пожалуй я закруглюсь.

Простите если утомил Вас своими философскими или какими-либо еще высказываниями.

Просто вылилось, как говорится. 

Видимо хотелось сказать и оно свершилось.

Далее мы будем работать более предметно и опять
займёмся вышеуказанными вопросами.

Итак пример 
c:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\simple

Пример включает 2 приложения:

simples - т. е. simple Server

и

simplec - т. е. simple Client

Оба приложения являются консольными. Выполнив их сборку в среде MSVS 2005 или выше
Вам нужно будет запускать их из окна коммандной строки Windows, чтобы
увидеть результат их работы.

Если любой из примеров запустить с параметром тире -

simples -
simplec -

То будут выведены возможные параметры коммандной строки для запуска данного приложения.


cd C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\
netds\winsock\simple\server\Debug

C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\simple\server
\Debug>simples -
Usage
simples -p [protocol] -e [endpoint] -i [interface] [-4] [-6]
Where:
        -p protocol   - is one of "TCP" or "UDP"
        -e endpoint   - is the port to listen on
        -i interface  - is the string local address to bind to
        -4            - force IPv4
        -6            - force IPv6

Defaults are TCP,5001 and INADDR_ANY and IN6ADDR_ANY (if IPv6 present)


Кстати, чтобы не набирать в коммандной строке длинные строки, можно один раз набрать их
в текстовом редакторе, например в Блокноте, а потом просто копировать и вставлять
в окно коммандной строки.

Для примера я запустил сервер с такими параметрами


C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\simple\server
\Debug>simples -p TCP -e 80 -i 127.0.0.2
socket 0x7c bound to address 127.0.0.2 and port 80


	
Т. е. задал для сервера использование протокола TCP, подключил к порту 80 и привязал к
ip - 127.0.0.2

Сервер работает и остается в памяти пока не будет нажата комбинация клавиш [Ctrl] + [C].
Он ожидает запросов от клиента.


Клиент, это приложение simplec.

Запускается с такими параметрами -
	
simplec -p  -n  -e  -l 


Значит надо указать те же параметры, что были указаны у simples, чтобы клиент мог успешно
подключиться.
simplec -p TCP -n 127.0.0.2 -e 80 -l 10


Запуск simplec с указанными параметрами осуществляем в отдельном окне коммандной строки
Windows.


C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\simple\client
\Debug>simplec -p TCP -n 127.0.0.2 -e 80 -l 10
Client attempting connection to: 127.0.0.2 port: 80
Connection established...
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 0]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 1]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 2]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 3]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 4]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 5]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 6]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 7]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 8]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 9]] from server


Отправка/получение тестовых данных происходит 10 раз подряд (циклически), поскольку
я указал при запуске simplec параметр -l 10.

Как работает сервер simples Мы рассматривать здесь не будем, т. к. это не
нужно для моей непосредственной задачи. У меня серверная часть реализована не на
c++, а на php.

Вы, при желании и наличии такой необходимости, можете сами изучить исходный код
simples взяв его из Windows SDK 7.0.
О том, где скачать его и как с ним работать я уже рассматривал ранее.

Как лучше к этому подойти Вы сейчас и узнаете на примере изучения simplec.


Основная проблема с которой Вы возможно столкнетесь, по крайней мере с ней
сталкивался я, это работа со строками.

В примере simplec используются обычные символьные строки char. Но большинство
Windows - приложений работают с unicode.

Для работы с unicode, а точнее чтобы от него не зависеть, нужно использовать
так называемые generic строки - там где вы явно задаете строку применять оператор _T


CString cs_str = _T("Simple string sample");



Если указывать L


CString cs_str = L"Simple string sample";


То сразу будет использоваться unicode, независимо от кодировки, которая задана в настройках
 проекта.

Если же использовать _T - то в зависимости от настройки проекта будут применяться либо ANSI
строки, либо unicode.

В большинстве приложений Windows всегда используется unicode. Но на низком уровне, с которым
работает
Windows Sockets 2 ведется работа с каждым байтом информации отдельно. Поэтому вопрос
кодировки
и преобразований из одной кодировку в другую очень важен, и когда Вы будете разрабатывать
свои приложения с использование Windows Sockets 2 API, то волей-неволей столкнетесь
с проблемой
использования строк и их различных видов.

Основные ошибки какие могут быть - это утечки памяти - memory Leaks и Access Violation.
Когда какая-то память выделяется, но
не освобождается, или идёт обращение к участку памяти, в непредусмотренном адресном
пространстве.


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

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

В тестовых приложениях можно экспериментировать - чтобы лучше понять ту или 
иную особенность, которая не совсем понятна или вызывает ошибку.

Поскольку вариантов работы может быть множество, а правильный, естественно
никто вам не укажет, нужны будут собственные эксперименты с кодом.

И без ТЕСТОВЫХ приложений тут никак не обойтись.

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

Документация и мануалы всегда дают какой-то пример, но чтобы
его лучше понять нужно писать собственный код и экспериментировать.

Например у нас объявлена символьная строка char -


char            hoststr[NI_MAXHOST],


NI_MAXHOST это системная константа равная 1025.

Чтобы очистить строку от неинициализированных данных применяем функцию -


SecureZeroMemory(&hoststr, sizeof(hoststr));


Но может возникнуть 2 вопроса:

Почему &hoststr, а не просто hoststr ?


Т. е. так - 


SecureZeroMemory(hoststr, sizeof(hoststr));



И почему sizeof(hoststr), а не strlen(hoststr) ?

Т. е. так -


SecureZeroMemory(hoststr, strlen(hoststr));



Такой код -


SecureZeroMemory(&hoststr, sizeof(hoststr));



Будет правильным, только если строка определена как
массив элементов char -



char            hoststr[NI_MAXHOST],


Но если имеется такой массив -


char *hoststr = "localhost";


Или 


char *hoststr;


Когда строка формируется динамически и её длина может быть любой в допустимых 
пределах.


В этом случае - char *hoststr - это уже не массив, а указатель на массив и очищать его
нужно не так -


SecureZeroMemory(&hoststr, strlen(hoststr));


А так -


SecureZeroMemory(hoststr, strlen(hoststr));


Потому что &hoststr - так мы очистим не массив, т. е. не значения которые хранятся
в буфере строки, а значение указателя - он станет равным 0 или NULL. При
этом считается, что его память была освобождена.

И тут возникает сразу 2 ошибки:

1) Memory Leaks - утечки памяти - потому что указателю было присвоено NULL значение,
без предшествующего освобождения буфера оператором delete [] hoststr;  //только
если буфер создавался динамически -


char *hoststr = new char[ request_str_symbols_count ];


request_str_symbols_count - подразумевается, что это некоторая числовая константа.

2) Поскольку hoststr был обнулен, то попытка обращения к нему вызовет ошибку
Access Violation - поскольку память уже недоступна в переменной hoststr.



И второй вопрос - о разнице между sizeof и strlen -



SecureZeroMemory(&hoststr, sizeof(hoststr));
SecureZeroMemory(&hoststr, strlen(hoststr));


Разница здесь в том, что функция sizeof - возвращает длину всей выделенной памяти для буфера 
hoststr в байтах, а strlen возвращает длину строки hoststr - количество символов до первого
втретившегося символа \0.

Понятно, что когда hoststr еще только был объявлен, но не очищен, там содержатся
какие-то неинициализированные данные, т. е. по сути мусор. И неизвестно есть ли
там символ \0 - символ конца строки. А если и есть - то непредсказуемо - в какой позиции
он находится.


Так что выполняя команду 


SecureZeroMemory(&hoststr, sizeof(hoststr));


Над буфером hoststr (буфер - это синоним строки - какой-то участок памяти, просто когда
мы говорим строка - то подразумеваем, что в памяти содержатся символьные данные
представляющие какую-то читаемую текстовую строку, но буфер в более общем смысле
может содержать любые двоичные данные - а не только текст), мы тем самым
инициализируем весь выделенный ей участок памяти нулевыми значениями.


Но команда - 


SecureZeroMemory(&hoststr, strlen(hoststr));


Является логически неправильной, т. к. будет очищена в лучшем случае часть строки
до первого встретившегося 0 байта. Ну а может быть, что такого символа
вообще не окажется в неинициализированных данных, тогда hoststr останется
неинициализированной.


Конечно если строка уже была инициализирована - например туда уже было
помещено значение строки, тогда команда будет иметь эффект. Но опять же
очищен будет не весь буфер, а только часть его до первого символа
нуль-терминатора (т. е. \0 ).


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

Например, от обилия таких вопросов, я даже спросил себя:
Ну почему, почему в C++ работа со строками так сложна и неочевидна,
не всегда ясно и понятно что происходит и почему возникает ошибка
в том или ином месте.

Ошибки как я уже говорил те же самые - Access violation и memory leaks.

Ответ звучит просто - возьмите язык php - он делался по-сути для
удобной работы со строками ! Потому что вся информация, которую
в php приходится обрабатывать и выводить - это, как правило,
строковые данные.

Так что, как видите, для работы со строками существует ЦЕЛЫЙ ЯЗЫК php !!!
Так что понятно, что c++ не может охватить всех нюансов, особенно
если Вы о них даже не знаете.

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




Теперь можно приступать к изучению кода -

c:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\simple\
client\simplec.cpp


Функция с которой начинается исполнение - 
int __cdecl main


Сначала запустить сервер -

Открываем окно коммандной строки Windows - Пуск - Программы -
Служебные Windows - Коммандная строка

cd C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\simple\
server\Debug

simples -p TCP -e 80 -i 127.0.0.2

Не закрываем окно.


Теперь работаем с приложением клиентом - simplec


simplec -p TCP -n 127.0.0.2 -e 80 -l 10

Я буду запускать клиент из MSVS в режиме отладки,
поэтому эти параметры укажу в -

Command Arguments как описывалось на странице 4
-p TCP -n 127.0.0.2 -e 80 -l 10

c:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\simple\
client\simplec.cpp

Итак шагаем по коду в режиме отладки (как это делать тоже уже описывалось
на странице 4)


Сначала в цикле обрабатываются введенные агрументы коммандной строки -

    // Parse the command line
    if (argc >1)
    {
        for (i=1; i < argc; i++)
		
		
	Отладочные значения могут оказаться такими -
	
address_family = 0
		
		
socket_type = 1


server_name = 0x007f4d6d "127.0.0.2"
//т. е. через параметр server_name мы задаем url по которому надо обращаться к серверу
//для решения вашей задачи можно подставить любой сервер,
для примера я использую megainformatic.ru


port = 0x007f4d7a "80"
//для megainformatic.ru также нужно будет использовать этот порт


maxloop = 10
//количество итераций отправки данных клиентом.



Небольшое отступление.

В чём отличие в применении символов & и * в языке c++ ?

Символ * - это указатель на адрес переменной, а не на её значение, если символ
звездочки применяется к параметру функции -

пример -


SearchCRLF(const char * strData, size_t data_length, size_t * found_at)


в данном случае переменные strData и found_at представляющие параметры
функции SearchCRLF будут указателями на адрес - или передаются по-ссылке
(имеют ссылочный тип).

strData при этом указывает на адрес массива из элементов типа char

Поскольку объявлена как 


char * strData


Ключевое слово const означает, что данные указателя
являются неизменными -
т. е. изменяться внутри функции не будут (иначе это вызовет ошибку).

Таким образом, в операциях присваивания strData может находиться только
по правую сторону от знака =.

Необходимость ключевого слова const вызвана тем, что
если мы опустим его - 

будет считаться, что данные в strData можно изменять.

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


Поскольку все char строки являются массивами, то негласно считается, что


char * strData


и


char strData[100];


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

Во-втором случае - блок представляет адрес на данные заранее известного размера -
из 100 символов (или байт), поскольку размер char - это размер 1 байта
в памяти.


Посмотрим на второй параметр функции -


size_t * found_at



прежде чем, попасть в функцию, параметр может быть определен так -


size_t search_result = -1;

//...

//и где-то дальше он передается в функцию

SearchCRLF(strData, strDataSize, &search_result);



Как видим при search_result появился значок &

Он как раз и означает, что в функцию будет передано не значение переменной search_result,
а указатель (адрес), по которому хранится данное значение.

Поскольку функция была объявлена так -


void SearchCRLF(const char * strData, size_t data_length, size_t * found_at)
{
	//...
	
	//то мы можем изменять значение параметра found_at тем самым вернув из
	//нашей функции измененный результат
	
	*fount_at = 0; //так мы изменяем значение параметра found_at переданного по ссылке
	//(указатель на адрес как было указано выше)
}


Чем это отличается от варианта 

void SearchCRLF(const char * strData, size_t data_length, size_t found_at)
{


?


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

Таким образом, в операциях присваивания внутри тела функции,
он может появляться только с правой стороны  -


void SearchCRLF(const char * strData, size_t data_length, size_t found_at)
{

	//...

	size_t some_var = found_at; //вот так
	
	//а вот так мы его уже изменить не сможем - будет ошибка
	found_at = 1;
	
}


Как видим в этом и состоит необходимость применения слова const для
строковых данных из символов char.

Для простых типов, таких как size_t - представляющих беззнаковое целое число,
применение оператора * автоматически подразумевает, что параметр
передается по-ссылке, а значит может быть изменен в теле функции.

Если * нет - значит передается значение.

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

Поэтому когда мы указываем слово const -


const char * strData


Подразумеваем, что строка будет передаваться как бы "по-значению" и изменить
её будет нельзя.

Ну а когда const не указан - можно.


Вот такое небольшое отступление.

Далее мы продолжим изучение примера simplec.


Для решения стоявшей передо мной задачи нужна была всего 1 итерация.
Либо несколько - в случае ошибки соединения с сервером - это тоже
нужно будет предусмотреть и реализовать.


Далее всё идёт обычным порядком описанном в мануале по Win Sock 2
(где и как его прочитать я также упоминал в 
Windows Sockets 2, ping, Windows SDK 7, чем открыть hxs файл - страница 4) -


    // Load Winsock
    if ((retval = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
    {
	
	
	//...
	
	// Make sure the wildcard port wasn't specified
	//тут убеждаемся не используется ли порт по-умолчанию - если задан 0 для него
    if (_strnicmp(port, "0", 1) == 0)
        Usage(argv[0]);

	Для нас важен именно 80 порт т. к. simples я запустил именно с 80 портом
	
	Да и megainformatic.ru также слушает этот - 80 порт.
	
	    retval = getaddrinfo(
                        server_name,
                        port,
                        &hints,
                        &results
                        );
//? определяется имя сервера если задан его ip и наоборот.
// Нужно будет проверить это задав сервер как megainformatic.ru
						
	
	
	
	Если всё нормально и ошибок нет -
	
	начинаются попытки коннекта -
	
	
	while (addrptr)
    {
        conn_socket = socket(addrptr->ai_family, addrptr->ai_socktype,
			addrptr->ai_protocol);

	//...
	
	retval = getnameinfo(
					addrptr->ai_addr,
					(socklen_t)addrptr->ai_addrlen,
					hoststr,
					NI_MAXHOST,
					servstr,
					NI_MAXSERV,
					NI_NUMERICHOST | NI_NUMERICSERV
					);			
					
					//ага, вот оно ! тут пытаемся получить данные если
					//задано именно доменное имя
	
//...


    // Make sure we got a connection established
    if (conn_socket == INVALID_SOCKET)
    {
        printf("Unable to establish connection...\n");
        goto cleanup;
    }
    else
    {
        printf("Connection established...\n");
    }

Если ошибок нет - в консоль выведет	Connection established...

Т. е. соединение успешно установлено.


Далее происходит самое главное и интересное, ради чего собственно всё и делалось -


    //
    // cook up a string to send
    //
    loopcount = 0;
    for (;;)
    {
	
		//в буффер заносим некоторый текст, который будем передавать серверу
		//в моей основной задаче этот текст - это запрос у сервера данных:
		//например такой: 

GET /?page=474 HTTP/1.1\r\n
Host: megainformatic.ru\r\n
Connection: Close\r\n


Таким образом, на примере приложения simple из Windows SDK 7
можно изучить все необходимые шаги для базовой работы с Windows Sockets 2,
аналог которого есть в языке php и называется fsockopen -

о нём я рассказывал в статье -
Работа с сокетами fsockopen из php

На этом ползволю себе закруглиться, т. к. более подробно
изучить пример simple Вы сможете сами - скачав Windows SDK 7.



к странице 1 к странице 2 к странице 3 к странице 4 страница 5 к странице 6

megainformatic live chat
Начать беседу
X
 

Оставленные комментарии



fle game engine - движок для создания игр
fle game engine - движок для создания игр


Something: Unexplained 2 captive of desires / Нечто: Необъяснимое 2 в плену желаний
Костя Коробкин Комикс Коллекционное издание - 6 комиксов, 81 страница, 220 mp3 треков
megainformatic Размещение баннерной рекламы у нас
Время загрузки: 1,4469