<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Персональный сайт</title>
		<link>http://winger.ucoz.com/</link>
		<description></description>
		<lastBuildDate>Mon, 25 Dec 2017 02:15:16 GMT</lastBuildDate>
		<generator>uCoz Web-Service</generator>
		<atom:link href="https://winger.ucoz.com/news/rss" rel="self" type="application/rss+xml" />
		
		<item>
			<title>Система тестирования по объектно-ориентированным языкам программирования : Исходник теста на языка C++</title>
			<description>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;http://ruprog.ru/wp-content/uploads/2009/04/testsystem.gif&quot; width=150px&gt;&lt;/td&gt;&lt;td&gt;Язык программирования и среда разработки( создания программы ) : C++, Builder C++ 6. 
 Название созданной программы : Система тестирования по объектно-ориентированным языкам программирования 
 Разработанная программа позволяет создавать тесты на любую тему а также проходить тесты.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
			<content:encoded>&lt;div&gt;&lt;h2&gt;Язык программирования и среда разработки( создания программы ) : C++ , Builder C++ 6.&lt;/h2&gt;
&lt;h3&gt;Название созданной программы : Система тестирования по объектно-ориентированным языкам программирования&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Разработанная программа&lt;/strong&gt; позволяет создавать тесты на любую тему а также проходить тесты. В &lt;strong&gt;созданной программе&lt;/strong&gt; разделены права доступа на студентов, для которых разрешено только проходить тесты и администраторов, для которых разрешено создавать тесты, просматривать результаты тестирования.&lt;br/&gt;Логин для администраторов admin, пароль 123.&lt;br/&gt;Для каждого теста можно указать не более 5 вариантов ответа для конкретного вопроса. &lt;strong&gt;Разработанная программа&lt;/strong&gt; позволяет установить время для каждого теста, в течении которого его необходимо пройти.&lt;br/&gt;Программа может быть переделана или доработана под Ваши условия.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Созданная ( разработанная ) программа написана на Builder C++. Исходник созданной программы хорошо прокомментирован.&lt;br/&gt;
Если возникнут вопросы по исходнику созданной программы я буду рад на них ответить.&lt;br/&gt;
Разработанная ( созданная ) программа может быть изменена под Ваши условия.&lt;br/&gt;
Вы можете заказать создание данной программы на Delphi, Java.&lt;br/&gt;
Вы можете заказать создание ( разработку ) программы, ПО по Вашему заданию.&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;срочно нужен исходник для теста - Visual C++ - CyberForum.ru&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;24 апр 2011 ... в программирование совсем не разбираюсь,но мне срочно нужен исходник 
программы на С++,либо другом языке!!!сама программа ...&lt;br&gt;http://www.cyberforum.ru/visual-cpp/thread282635.html&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Результаты работы &lt;strong&gt;созданной&lt;/strong&gt; ( &lt;strong&gt;разработанной&lt;/strong&gt; ) &lt;strong&gt;программы&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://ruprog.ru/wp-content/uploads/2009/04/testsystem.gif&quot; alt=&quot;builder система тестирования&quot; width=&quot;861&quot; height=&quot;651&quot;/&gt;&lt;/p&gt;

&lt;br/&gt;Скачать реализацию созданной программы( 0,3 Мб ).
&lt;p&gt;Вы можете заказать:&lt;/p&gt;

&lt;p&gt;Стоимость &lt;strong&gt;исходного кода разработанной программы&lt;/strong&gt; составляет &lt;strong&gt;1000 руб&lt;/strong&gt;.&lt;br/&gt;
Для заказа &lt;strong&gt;исходника созданной программы&lt;/strong&gt;, пожалуйста, заполните форму, расположенную ниже.&lt;/p&gt;

&lt;p&gt;Если у Вас имеются вопросы по &lt;strong&gt;разработке , созданию программ, ПО &lt;/strong&gt;заказу и получению &lt;strong&gt;исходников&lt;/strong&gt; или любые другие вопросы, Вы можете связаться со мной отправив письмо по адресу &lt;strong&gt;order@ruprog.ru&lt;/strong&gt;, написав в icq – &lt;strong&gt;401410793&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;</content:encoded>
			<link>https://winger.ucoz.com/news/sistema_testirovanija_po_obektno_orientirovannym_jazykam_programmirovanija_iskhodnik_testa_na_jazyka_c/2017-12-25-161</link>
			<dc:creator>supoinclus</dc:creator>
			<guid>https://winger.ucoz.com/news/sistema_testirovanija_po_obektno_orientirovannym_jazykam_programmirovanija_iskhodnik_testa_na_jazyka_c/2017-12-25-161</guid>
			<pubDate>Mon, 25 Dec 2017 02:15:16 GMT</pubDate>
		</item>
		<item>
			<title>Обзор и тестирование MicroSDHC карты памяти SanDisk Ultra SDSDQUIN-016G-G4 16 ГБ : Карта памяти программы на языке с</title>
			<description>Компания SanDisk, основанная в 1988 году в США, на сегодняшний день является одним из мировых лидеров по производству систем хранения на базе флеш-памяти.</description>
			<content:encoded>&lt;div&gt;&lt;p&gt;Компания SanDisk, основанная в 1988 году в США, на сегодняшний день является одним из мировых лидеров по производству систем хранения на базе флеш-памяти. Ее продукция используется в центрах обработки данных, персональных компьютерах, мобильных и цифровых бытовых устройствах. Компания специализируется на выпуске:&lt;br/&gt;
– Твердотельных (SSD), встраиваемых (iNAND/eMMC, iSSD) и беспроводных накопителей;&lt;br/&gt;
– Картах памяти различного формата (Secure Digital, CompactFlash, Memory Stick) и картридеров для них;&lt;br/&gt;
– USB флеш-памяти;&lt;br/&gt;
– Аудио- и видеоплееры;&lt;br/&gt;
– Решения для корпоративного рынка.&lt;/p&gt;&lt;p&gt;Причем в каждом из направлений существует множество моделей, позволяющих удовлетворить вкусы самого изысканного потребителя. Например, существуют целых шесть классов только microSD карт памяти, отличающихся различным назначением, емкостью и скоростными характеристиками. &lt;/p&gt;&lt;p&gt;В данной статье будет рассмотрена microSDHC карта памяти, входящая в серию SanDisk Ultra (класс Мультимедиа, «лучший выбор для смартфонов и планшетов»), – SanDisk Ultra SDSDQUIN-016G-G4 (емкость 16 ГБ).&lt;/p&gt;&lt;h1&gt;Технические характеристики&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;Семейство&lt;/strong&gt;: SanDisk Ultra&lt;br/&gt;&lt;strong&gt;Особенности&lt;/strong&gt;: Защита от экстремальных температур, воды, ударов и рентгеновских лучей&lt;br/&gt;&lt;strong&gt;Область использования&lt;/strong&gt;: для фотографий и записи FullHD видео (1920 х 1080)&lt;br/&gt;&lt;strong&gt;Емкость карты&lt;/strong&gt;: 8, 16, 32, 64 и 128 ГБ&lt;br/&gt;&lt;strong&gt;Формат&lt;/strong&gt;: microSDHC (8, &lt;strong&gt;16&lt;/strong&gt;, 32 ГБ), microSDXC (64, 128 ГБ)&lt;br/&gt;&lt;strong&gt;Размеры&lt;/strong&gt;: 14,99 x 10,92 x 1,02 мм&lt;br/&gt;&lt;strong&gt;Стандарт&lt;/strong&gt;: UHS-I&lt;br/&gt;&lt;strong&gt;Производительность (запись)&lt;/strong&gt;: Class 10 (не менее 10 Мбайт/сек)&lt;br/&gt;&lt;strong&gt;Скорость чтения данных&lt;/strong&gt;: до 48 Мбайт/сек&lt;br/&gt;&lt;strong&gt;Рабочая температура&lt;/strong&gt;: –25° C – +85° C&lt;br/&gt;&lt;strong&gt;Температура хранения&lt;/strong&gt;: –40° C – +85° C&lt;br/&gt;&lt;strong&gt;Комплектация&lt;/strong&gt;: SD-адаптер для microSD/microSDHC/microSDXC карт памяти&lt;br/&gt;&lt;strong&gt;Гарантия&lt;/strong&gt;: 10 лет&lt;/p&gt;&lt;h1&gt;Упаковка, комплектация и внешний вид&lt;/h1&gt;&lt;p&gt;Формат поставки microSDHC UHS-I карты памяти SanDisk Ultra SDSDQUIN-016G-G4 – это картонная упаковка с прозрачным окном и на которой указана принадлежность карты к серии Ultra, наличие в комплекте SD-адаптера, ее скорость чтения до 48 Мбайт/сек, соответствие карты на запись классу 10 (не менее 10 Мбайт/сек) и конечно же емкость 16 ГБ (правда есть сноска на обратной стороне, что 1 ГБ равен 1000000000 байт). По наличию надписи «FullHD Video» уже понятно для каких устройств она предназначена: видеокамеры, видеорегистраторы, планшеты, смартфоны и прочее, способные записывать видео с разрешением 1920х1080.&lt;/p&gt;&lt;p&gt;Задняя сторона содержит описание на множестве языков, где жирным можно заметить и русскоязычную часть. На ней есть англоязычное упоминание о программе SanDisk RecuePRO, обеспечивающую восстановление потерянных данных с карты памяти. Производитель дает 10-и летнюю гарантию на карту.&lt;/p&gt;&lt;p&gt;Если раньше производители карт памяти поставляли их в прочных пластиковых боксах, то сейчас, с целью снижения затрат, «активно» используют простой пластиковый «конверт». Компания SanDisk не является исключением. Внутри него так же находится и SD-адаптер.&lt;/p&gt;&lt;p&gt;Размеры microSDHC UHS-I карты памяти SanDisk Ultra SDSDQUIN-016G-G4 стандарты, но сам производитель говорит о ней (а точнее о ее корпусе), как «водостойкое, невосприимчивое к экстремальным температурам, ударопрочное устройство с защитой от рентгеновских лучей». Такое описание расширяет области применения не только для домашнего использования, но и для активного отдыха/путешествий. Лицевая сторона карты имеет серо-красный окрас и на ней же указан тип карты, емкость 16 ГБ, соответствие стандартам Class 10 и UHS-I. Обратная сторона – черная.&lt;/p&gt;&lt;p&gt;Особенность данной модели карты памяти – это наличие в комплекте SD-адаптера, позволяющего без каких-либо проблем использовать microSD/microSDHC/MicroSDXC карту памяти SanDisk в устройствах с соответствующим слотом. Качество корпуса неплохое (не развалится при первом же использовании).&lt;/p&gt;&lt;p&gt;У SD-адаптера есть защелка Lock, блокирующая запись информации на карту памяти и ее стирание.&lt;/p&gt;&lt;p&gt;Устанавливается microSDHC карта в адаптер легко (без приложения усилий), при этом, в случае тряски, неплохо держится в нем, и так же легко вытаскивается одним пальцем.&lt;/p&gt;&lt;h1&gt;Программное обеспечение&lt;/h1&gt;&lt;p&gt;1. «&lt;strong&gt;SanDisk Memory Zone&lt;/strong&gt;». Для владельцев Android-устройств через «Google Play» можно установить приложение «&lt;strong&gt;SanDisk Memory Zone&lt;/strong&gt;» с русскоязычным интерфейсом, позволяющее просматривать содержимое памяти (внутренней и SD) и ...&lt;/p&gt;&lt;p&gt;… обеспечить резервное копирование данных. В приложении можно подключить облачное хранилище (доступны DropBox, Box, Google Drive, Picasa, SugarSync, Facebook, SkyDrive, Amazon S3).&lt;/p&gt;&lt;p&gt;Настроек у программы немного.&lt;/p&gt;&lt;p&gt;2. «&lt;strong&gt;SanDisk RescuePRO&lt;/strong&gt;». Данное приложение закачивается с сайта, указанного с обратной стороны упаковки. Позволяет восстановить данные в случае их утери, работает не только с картами памяти SanDisk, но и с другими накопителями. Это коммерческая программа и ее можно запустить в ознакомительных целях, но в этом случае сохранить все данные не получиться. Доступны версии Standart и Deluxe.&lt;/p&gt;&lt;h1&gt;Тестовый стенд&lt;/h1&gt;&lt;p&gt;При тестировании использовалась следующее оборудование:&lt;/p&gt;&lt;p&gt;Центральный процессор: Intel Core i5-4670K &lt;br/&gt;
Система охлаждения: Noctua NH-U14S&lt;br/&gt;
Термоинтерфейс: Arctic Cooling MX-2 &lt;br/&gt;
Материнская плата: ASUS Z97-PRO&lt;br/&gt;
Оперативная память: DDR3-1600 2x8Гб Kingston HyperX FURY HX316C10FWK2/16 (частота DDR3-2133 11-12-11-30 2T 1.65V)&lt;br/&gt;
Видеокарта: Интегрированная Intel HD Graphics 4600&lt;br/&gt;
Накопители: SSD OCZ Vector 150 240 Gb SATA III и HDD Toshiba DT01ACA200 2 Тб &lt;br/&gt;
Корпус: Thermaltake Armor Revo Gene&lt;br/&gt;
Контрольная панель: Scythe Kaze Master KM01-BK&lt;br/&gt;
Блок питания: be queit! STRAIGHT POWER E9 450W&lt;br/&gt;
Операционная система: Windows 8.1 Профессиональная x64&lt;/p&gt;&lt;p&gt;microSDHC карта памяти SanDisk Ultra SDSDQUIN-016G-G4 16 ГБ подключалась к картридеру Transcend TS-RDF8K USB 3.0, поддерживающий работу с картами Compact Flash, M2, Micro SD, Micro SDHC, Micro SDXC, MS, MS Duo, MS Pro, MS Pro Duo, SD, SDHC, SDXC, включая UHS. Он в свою очередь подключался к заднему порту USB 3.0 материнской платы ASUS Z97-PRO.&lt;/p&gt;&lt;p&gt;По умолчанию карта памяти SanDisk имеет файловую систему FAT32 и доступно 14,8 Гбайт.&lt;/p&gt;&lt;h1&gt;Результаты тестирования&lt;/h1&gt;&lt;p&gt;1. «&lt;strong&gt;CrystalDiskMark 3.0.3&lt;/strong&gt;» &lt;/p&gt;&lt;p&gt;Пресет 50 и 100 Мб&lt;/p&gt;&lt;p&gt;Пресет 500 и 1000 Мб&lt;/p&gt;&lt;p&gt;Пресет 2000 и 4000 Мб&lt;/p&gt;&lt;p&gt;В данном тесте карта памяти SanDisk показывает заявленные значения, при последовательном чтении получили чуть выше 47 Мбайт/сек, а при записи стабильно ~13,7 Мбайт/сек, что соответствует заявленным характеристикам карты (чтение до 48 Мбайт/сек, запись – Class 10, то есть не менее 10 Мбайт/сек).&lt;/p&gt;&lt;p&gt;&lt;br/&gt;
2. «&lt;strong&gt;HD Tune Pro 5.50&lt;/strong&gt;». &lt;/p&gt;&lt;p&gt;Тест «Benchmark/Бенчмарк»&lt;/p&gt;&lt;p&gt;Тест «File Benchmark/Бенчмарк файла»&lt;/p&gt;&lt;p&gt;Тест «Random Access/Случайный доступ»&lt;/p&gt;&lt;p&gt;При последовательном чтении так же получили очень близкие результаты к тесту CrystalDiskMark – ~45,7/~13,2 Мбайт/сек при чтении/записи и привычные показатели при работе с разными блоками данных – чем меньше размер блока, тем ниже скорость. Производитель не зря рекомендует использовать карту для записи FullHD видео, где важна именно скорость работы при последовательном доступе.&lt;/p&gt;&lt;p&gt;3. «&lt;strong&gt;USBFlashSpeed&lt;/strong&gt;».&lt;/p&gt;&lt;p&gt;Данный тест так же подтверждает заявленные показатели карты.&lt;/p&gt;&lt;p&gt;4. &lt;strong&gt;Копирование в Windows 8.1&lt;/strong&gt;. Работа велась с SSD Corsair.&lt;br/&gt;
Скорость работы оценивалась на копировании 1 файла размером 2,11 Гбайт. Графики ниже.&lt;br/&gt;&lt;br/&gt;
Чтение.&lt;/p&gt;&lt;p&gt;Запись.&lt;/p&gt;&lt;p&gt;Идеальные графики, хотя скорости чуть ниже, чем показанные в предыдущих тестах.&lt;/p&gt;&lt;p&gt;5. &lt;strong&gt;Тестирование на смартфоне&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Напомним, что производитель позиционирует свою серию microSD карт памяти SanDisk Ultra как «лучший выбор для смартфонов и планшетов», посмотрим как дела обстоят с работой в смартфоне Prestigio MultiPhone 5504 DUO под управлением ОС Android 4.4. Использовался бесплатный тест «&lt;strong&gt;A1 SD Bench&lt;/strong&gt;», скачанный из «Google Play».&lt;/p&gt;&lt;p&gt;Тут, при чтении, получили значение 33,12 Мбайт/сек, что говорит о том, что возможности карты упираются в ограничения самого смартфона, а вот скорость записи на прежнем уровне – 13,24 Мбайта/сек.&lt;br/&gt;
С точки зрения скорости работы внутренней памяти смартфона, то карта памяти SanDisk получается отличным кандидатом на использование ее в качестве основной, так как у нее скорость записи выше, чем у встроенной.&lt;/p&gt;&lt;p&gt;Все тесты и практическая работа говорят нам об высоких скоростных показателях карты памяти SanDisk Ultra SDSDQUIN-016G-G4 16 ГБ.&lt;/p&gt;&lt;h1&gt;Выводы&lt;/h1&gt;&lt;p&gt;В серию SanDisk Ultra входит несколько моделей microSD карт памяти с разными скоростями чтения (90-30 Мбайт/сек) и протестированная microSDHC карта памяти SanDisk Ultra SDSDQUIN-016G-G4 емкостью 16 ГБ относится к «высокоскоростным» моделям данного семейства. Она полностью соответствует заявленным скоростным характеристикам, обеспечивая чтение со скоростью ~45-47,5 Мбайт/сек и запись на уровне ~13-13,5 Мбайт/сек. Подобные показатели запросто позволяют использовать ее для записи FullHD видео, а особые свойства корпуса и карты (влагозащишенный и ударопрочный корпус, невосприимчивость к высоким температурам, защита от ренгтеновских лучей) обеспечат надежное хранение данных на ней. Еще одна особенность, про которую стоит упомянуть, – это наличие в комплекте microSD/microSDHC/microSDXC-адаптера, который приятно порадует потенциального покупателя, особенно когда цена будет находиться на том же уровне, что и у конкурентов.&lt;br/&gt;
Можно посетовать на невысокую емкость тестируемой карты памяти (всего 16 ГБ), отчего записывать длительное видео будет проблематично, но в серию SDSDQUIN входят модели до 128 ГБ, а значит определиться с емкостью карты не проблема.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Преимущества&lt;/strong&gt;:&lt;br/&gt;
+ Защищенный корпус карты памяти&lt;br/&gt;
+ Неплохие скоростные характеристики&lt;br/&gt;
+ Наличие в комплекте microSD/microSDHC/microSDXC-адаптера &lt;br/&gt;
+ Возможность использования фирменного ПО для резервного копирования данных (закачивается бесплатно) и восстановления данных (доступна демо-версия)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Недостатки&lt;/strong&gt;:&lt;br/&gt;
– Не выявлено&lt;/p&gt;&lt;p&gt;Благодарю компании SanDisk и DNS за предоставленную карту памяти и возможность публикации обзора.&lt;/p&gt;&lt;/div&gt;</content:encoded>
			<link>https://winger.ucoz.com/news/obzor_i_testirovanie_microsdhc_karty_pamjati_sandisk_ultra_sdsdquin_016g_g4_16_gb_karta_pamjati_programmy_na_jazyke_s/2017-08-17-105</link>
			<dc:creator>supoinclus</dc:creator>
			<guid>https://winger.ucoz.com/news/obzor_i_testirovanie_microsdhc_karty_pamjati_sandisk_ultra_sdsdquin_016g_g4_16_gb_karta_pamjati_programmy_na_jazyke_s/2017-08-17-105</guid>
			<pubDate>Thu, 17 Aug 2017 06:04:50 GMT</pubDate>
		</item>
		<item>
			<title>Использование DSP-сопроцессора DM8168 с помощью фреймворка C6Accel : Использование Win32 Api для Bmp Resize</title>
			<description>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;http://habrastorage.org/files/925/c68/7f5/925c687f57554086a9993a409b9a021d.jpg&quot; width=150px&gt;&lt;/td&gt;&lt;td&gt;В этой статье мы познакомимся с отладочной платой DM816x/C6A816x/AM389x и фреймворком C6Accel (он же C6EZAccel), а также рассмотрим инструкции по наладке системы для выполнения встроенных тестовых приложений.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
			<content:encoded>&lt;div&gt;&lt;img src=&quot;http://habrastorage.org/files/925/c68/7f5/925c687f57554086a9993a409b9a021d.jpg&quot;/&gt;&lt;br/&gt; &lt;br/&gt; В этой статье мы познакомимся с отладочной платой DM816x/C6A816x/AM389x и фреймворком C6Accel (он же C6EZAccel), а также рассмотрим инструкции по наладке системы для выполнения встроенных тестовых приложений.&lt;br/&gt; &lt;br/&gt; Всё началось с интересной идеи использовать алгоритмы нынче очень популярной библиотеки компьютерного зрения OpenCV на микропроцессоре. Однако, изучив немного тему, идея уточнилась. Почему бы не реализовать алгоритмы не просто на ядре ARM, а на специализированном ядре для цифровой обработки сигналов DSP? Тем самым разгрузим ядро ARМ, ускорим выполнение алгоритмов, и, глядишь, самое громоздкое приложение заработает в реальном времени.&lt;br/&gt; &lt;br/&gt; Итак, что же использовать для решения задачи? Оказалось вариантов немного…&lt;br/&gt; XDAIS (eXpressDsp Algorithm Interoperability Standard). TI также предоставляет фреймворк под названием Codec Engine, который позволяет эффективно выполнять алгоритмы, написанные с использованием интерфейса XDAIS. TI поставляет все свои кодеки в рамках ПО для SoC и рекомендует использование Codec Engine. C6EZAccel также состоит из библиотеки на стороне ARM, являющейся надстройкой над Codec Engine, который предоставляет APIs (интерфейсы программирования приложений). А они, в свою очередь, позволяют коду приложения на стороне ARM вызывать выполнение алгоритмов XDAIS на DSP. Эта библиотека содержит в себе управление кешем, преобразование адресов, передачу параметров и обработку ошибок из приложения, работающего на ARM.&lt;br/&gt; &lt;br/&gt; &lt;h5&gt;2.2. Как работает C6Accel?&lt;/h5&gt;&lt;br/&gt; Код ARM-приложения (или промежуточное ПО, которое его использует) вызывает C6Accel. Он использует оболочку библиотеки APIs и/или Codec Engine, совместимый c iUniversal APIs, которые, как и VISA APIs, используются для вызова Audio/Video/Speech-кодеков. Потом эти APIs просматривают интерфейс Codec Engine и вызывают алгоритм C6Accel на DSP, который идентифицирует вызов функции и задействует соответствующую функциональность на DSP, используя параметры, переданные из приложения.&lt;br/&gt; &lt;br/&gt; &lt;img src=&quot;http://habrastorage.org/files/cfb/6fa/a58/cfb6faa58b024ef198577d470e22cfe8.jpg&quot;/&gt;&lt;br/&gt; &lt;br/&gt; &lt;h4&gt;3. Использование EZSDK и C6Accel&lt;/h4&gt;&lt;br/&gt; Достаточно теории, приступим к практике. EZSDK 5.05.02.00 поддерживается только в Ubuntu 10.04 LTS 32-bit или Ubuntu 11.10 32-bit. Поэтому тем, у кого не установлена одна из этих ОС (конечно же, мы работали под более новой версией), придётся использовать виртуальную машину, например, VirtualBox. Инструкции по её установке и настройке имеются здесь.&lt;br/&gt; &lt;br/&gt; Далее используются следующие обозначения:&lt;br/&gt; &lt;ul&gt; &lt;li&gt;host $ – команда для выполнения на хосте;&lt;/li&gt; &lt;li&gt;target # – команда для выполнения на целевой ОС.&lt;/li&gt; &lt;/ul&gt;&lt;br/&gt; &lt;h5&gt;3.1. Установка и сборка EZSDK&lt;/h5&gt;&lt;br/&gt; Перед началом работы с EZSDK следует скачать и установить компилятор С CodeSourcery Toolchain 2009q-203. Просто распакуйте архив в домашнюю директорию.&lt;br/&gt; &lt;br/&gt; Скачайте EZSDK 5.05.02.00 и выполните:&lt;br/&gt; host $ sudo ./ezsdk_dm816x-evm_5_05_02_00_setuplinux
&lt;br/&gt; Запустится установщик. Укажите расположение CodeSourcery Toolchain, т. е. /home/%username%/arm-2009q1/bin, и путь для установки EZSDK – /home/%username%/ezsdk.&lt;br/&gt; &lt;br/&gt; Разработчики данного ПО позаботились о нас и сделали интерактивный скрипт (одна из причин строгой привязки к версии OC):&lt;br/&gt; host $ export EZSDK=&quot;${HOME}/ezsdk&quot;
host $ sudo ${EZSDK}/setup.sh
&lt;br/&gt; Скрипт установит необходимые пакеты и попросит уточнить:&lt;br/&gt; &lt;ul&gt; &lt;li&gt;путь установки целевой файловой системы – /home/%username%/targetfs;&lt;/li&gt; &lt;li&gt;путь корневой директории tftp – /tftpboot;&lt;/li&gt; &lt;li&gt;путь последовательного порта – /dev/ttyUSB0 (для подключения по USB-порту) или /dev/ttyS0 (для подключения по COM-порту);&lt;/li&gt; &lt;li&gt;ip-адрес хост-машины – у каждого свой (например, у нас 10.54.4.44);&lt;/li&gt; &lt;li&gt;расположение ядра Linux – 1-е из предложенного списка, т. е. TFTP;&lt;/li&gt; &lt;li&gt;расположение корневой файловой системы – 1-е из предложенного списка, т. е. NFS;&lt;/li&gt; &lt;li&gt;имя образа ядра, загружаемого из TFTP – uImage-dm816x-evm.bin;&lt;/li&gt; &lt;li&gt;создавать ли скрипт для minicom – согласитесь;&lt;/li&gt; &lt;li&gt;запускать ли сейчас созданный скрипт – откажитесь.&lt;/li&gt; &lt;/ul&gt;&lt;br/&gt; Cкорректируем этот скрипт: откроем его в текстовом редакторе и заменим текст «mem=364M@0x80000000 mem=320M@0x9FC00000» на «mem=364M», так как в дальнейшем невозможно будет загрузить необходимые модули ядра.&lt;br/&gt; &lt;br/&gt; Далее, для выполнения каких-либо операций на плате нужно запустить minicom с настройками, указанными в скрипте, командой&lt;br/&gt; host $ minicom -S setup_uimage-tftp_fs-nfs.minicom
&lt;br/&gt; Далее нужно перезапустить плату.&lt;br/&gt; &lt;br/&gt; Теперь при сборке EZSDK возникает проблема из-за отсутствия некоторого компонента. Можно починить, распаковав архив 8272.pcie.tar.gz в директорию /home/%username%/ezsdk/example-applications.&lt;br/&gt; &lt;br/&gt; Наконец соберём EZSDK командами&lt;br/&gt; host $ cd ${HOME}/ezsdk
host $ sudo make all
host $ sudo make install
&lt;br/&gt; &lt;h5&gt;3.2. Установка и сборка С6Accel&lt;/h5&gt;&lt;br/&gt; Скачайте C6Accel 2.01.00.11 и выполните:&lt;br/&gt; host $ sudo ./c6accel_2_01_00_11_Linux-x86_Setup.bin
&lt;br/&gt; Укажите путь установки /home/%username%/c6accel.&lt;br/&gt; &lt;br/&gt; Операционная система реального времени SYS/BIOS является составной частью EZSDK, однако версии позже 6.32.02.09 не поддерживают Real Time Data eXchange (RTDX), который необходим при сборке С6Accel. Поэтому установим SYS/BIOS 6.32.02.09 специально для С6Accel:&lt;br/&gt; host $ sudo ./bios_setuplinux_6_32_02_39.bin
&lt;br/&gt; Укажите путь установки /home/%username%/c6accel/bios_6_32_02_39.&lt;br/&gt; &lt;br/&gt; Исправим пути в файле Rules.make в /home/%username%/c6accel на следующие:&lt;br/&gt; DVSDK_INSTALL_DIR=$(HOME)/ezsdk
TARGETFS_INSTALL_DIR = $(HOME)/targetfs
C6ACCEL_INSTALL_DIR=$(HOME)/c6accel
BIOS_INSTALL_DIR = $(HOME)/c6accel/bios_6_32_02_39
DSPDEVKIT_INSTALL_DIR= $(DVSDK_INSTALL_DIR)/dsp-devkit
LINUXDEVKIT_INSTALL_DIR = $(DVSDK_INSTALL_DIR)/linux-devkit
PLATFORM = dm816x-evm
&lt;br/&gt; И, в конце концов, соберём С6Accel командами:&lt;br/&gt; host $ cd ${HOME}/c6accel
host $ sudo make all
host $ sudo make install
&lt;br/&gt; &lt;h5&gt;3.3. Выполнение теста DSP&lt;/h5&gt;&lt;br/&gt; Приятно, что C6Accel содержит в себе пример для тестирования выполнения кода на DSP-процессоре. Выполним скрипт загрузки модулей cmem и dsplink (это библиотеки связки ARM и DSP, с помощью которых грузится CodecEngine) и запустим тестирующие приложение.&lt;br/&gt; target # cd /opt/c6accel_app/c6accel_dsplib_testapp
target # ./loadmodules_ti8168_c6accel.sh
target # ./c6accel_dsplib_testapp
&lt;br/&gt; &lt;b&gt;Ура! По сообщениям в консоли видно, что всё в порядке и ничего не сломано&lt;/b&gt;&lt;p&gt;****************************************************************************** &lt;br/&gt; Sample application for testing kernels in C6Accel started. &lt;br/&gt; ****************************************************************************** &lt;br/&gt; CERuntime complete &lt;br/&gt; C6Accel handle created &lt;br/&gt; — &lt;br/&gt; Test for Vision/Analytics functions in C6Accel: &lt;br/&gt; — &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_histogram_1D_дU8… &lt;br/&gt; VLIB_histogram_1D_U8 passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_histogram_1D_U16… &lt;br/&gt; VLIB_histogram_1D_U16 passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_histogram_nD_U16… &lt;br/&gt; VLIB_histogram_nD_U16 passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_weightedHistogram_1D_U8… &lt;br/&gt; VLIB_weightedHistogram_1D_U8 passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_weightedHistogram_nD_U16… &lt;br/&gt; VLIB_weightedHistogram_nD_U16 failed the test! &lt;br/&gt; VLIB_unpackMask32 passed the test! &lt;br/&gt; VLIB_packMask32 passed the test! &lt;br/&gt; VLIB_subtractBackGroundS16 passed the test! &lt;br/&gt; VLIB_subtractBackGroundS32 passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_extractLumaFromUYUV… &lt;br/&gt; C6accel test for VLIB_extractLumaFromUYUV passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_convertUYVYsemipl_to_YUVpl… &lt;br/&gt; VLIB_convertUYVYsemipl_to_YUVpl passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_convertUYVYpl_to_YUVint… &lt;br/&gt; VLIB_convertUYVYpl_to_YUVint passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_convertUYVYint_to_YUVpl… &lt;br/&gt; VLIB_convertUYVYint_to_YUVpl passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_convertUYVYint_to_RGBpl… &lt;br/&gt; VLIB_convertUYVYint_to_RGBpl passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_ConvertUYVYint_to_YUV420pl… &lt;br/&gt; VLIB_ConvertUYVYint_to_YUV420pl passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_convertUYVYint_to_LABpl… &lt;br/&gt; VLIB_convertUYVYint_to_LABpl passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_convertUYVYint_to_HSLpl… &lt;br/&gt; VLIB_convertUYVYint_to_HSLpl passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_convertUYVYint_to_LABpl_LUT… &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Completed initialization. &lt;br/&gt; VLIB_convertUYVYint_to_LABpl2 passed the test! &lt;br/&gt; Testing VLIB_harrisScore_7x7… &lt;br/&gt; VLIB_harrisScore_7x7 passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Initializing Legendre Polynomial &lt;br/&gt; &lt;br/&gt; Computing Legendre Moments &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_legendreMoments… &lt;br/&gt; VLIB_legendreMoments passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_normalFlow_16… &lt;br/&gt; VLIB_normalFlow_16 passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_kalmanFilter_4x6 functions… &lt;br/&gt; VLIB_kalmanFilter_ VLIB_recursiveFilterHoriz1stOrderS16… &lt;br/&gt; VLIB_recursiveFilterHoriz1stOrderS16 passed the test! &lt;br/&gt; &lt;br/&gt; Testing VLIB_recursiveFilterVert1stOrядра.der… &lt;br/&gt; VLIB_recursiveFilterVert1stOrder passed the test! &lt;br/&gt; &lt;br/&gt; Testing VLIB_recursiveFilterVert1stOrderS16… &lt;br/&gt; VLIB_recursiveFilterVert1stOrderS16 passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_bhattacharyaDistance_U32… &lt;br/&gt; VLIB_bhattacharyaDistance_U32 passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_L1DistanceS16… &lt;br/&gt; VLIB_L1DistanceS16 functions passed the test &lt;br/&gt; VLIB_dilate_bin_mask passed the test! &lt;br/&gt; VLIB_dilate_bin_square passed the test! &lt;br/&gt; VLIB_dilate_bin_cross passed the test! &lt;br/&gt; VLIB_erode_bin_mask passed the test! &lt;br/&gt; VLIB_erode_bin_square passed the test! &lt;br/&gt; VLIB_erode_bin_cross passed the test! &lt;br/&gt; Testing VLIB_trackFeaturesLucasKanade_7x7… &lt;br/&gt; VLIB_trackFeaturesLucasKanade_7x7 passed the test! &lt;br/&gt; VLIB Canny functions Test results: &lt;br/&gt; IMG_conv_7x7: passed the test! &lt;br/&gt; VLIB_xyGradient: passed the test! &lt;br/&gt; VLIB_nonMaximumSuppressionCanny: passed the test! &lt;br/&gt; VLIB_doublethresholding: passed the test! &lt;br/&gt; VLIB_edgeRelaxation: passed the test! &lt;br/&gt; &lt;br/&gt; Calling Chained Canny API: &lt;br/&gt; Chained Canny edge detection function failed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_integralImage8… &lt;br/&gt; VLIB_integralImage8 passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_integralImage16… &lt;br/&gt; VLIB_integralImage16 passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_imagePyramid8… &lt;br/&gt; VLIB_imagePyramid8 passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_imagePyramid16… &lt;br/&gt; VLIB_imagePyramid16 passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_gauss5x5PyramidKernel_8… &lt;br/&gt; VLIB_gauss5x5PyramidKernel_8 passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_gauss5x5PyramidKernel_16… &lt;br/&gt; VLIB_gauss5x5PyramidKernel_16 passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_gradientH5x5PyramidKernel_8… &lt;br/&gt; VLIB_gradientH5x5PyramidKernel_8 passed the test! &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Testing the function: VLIB_gradientV5x5PyramidKernel_8… &lt;br/&gt; VLIB_gradientV5x5PyramidKernel_8 passed the test! &lt;br/&gt; &lt;br/&gt; VLIB_initMeanWithLumaS16 passed the test! &lt;br/&gt; VLIB_updateEWRMeanS16 passed the test! &lt;br/&gt; VLIB_initMeanWithLumaS32 passed the test! &lt;br/&gt; VLIB_updateEWRMeanS32 passed the test! &lt;br/&gt; VLIB_initVarWithConstS32 passed the test! &lt;br/&gt; VLIB_updateEWRVarianceS32 passed the test! &lt;br/&gt; VLIB_initVarWithConstS16 passed the test! &lt;br/&gt; VLIB_updateEWRVarianceS16 passed the test! &lt;br/&gt; VLIB_updateUWRMeanS16 passed the test! &lt;br/&gt; VLIB_updateUWRVarianceS16 passed the test! &lt;br/&gt; — &lt;br/&gt; Test for Image processing functions in C6Accel: &lt;br/&gt; — &lt;br/&gt; Tests for Histogram functions successful &lt;br/&gt; Test for Median Filtering functions successful &lt;br/&gt; Tests for Convolution functions successful &lt;br/&gt; Tests for Correlation functions successful &lt;br/&gt; Tests for Sobel Filter successful &lt;br/&gt; Test for Image multiplication functions successful &lt;br/&gt; Tests for Image addition functions successful &lt;br/&gt; Tests for Image substraction functions successful &lt;br/&gt; Tests for Color Space Conversion functions successful &lt;br/&gt; C6accel_IMG_ycbcr422pl_to_ycbcr422sp() successful &lt;br/&gt; C6accel_IMG_ycbcr422sp_to_ycbcr422ile() successful &lt;br/&gt; C6accel_IMG_ycbcr422sp_to_ycbcr420pl successful &lt;br/&gt; — &lt;br/&gt; Test for Fixed point Signal processing functions in C6Accel &lt;br/&gt; — &lt;br/&gt; Tests for FFT functions successful &lt;br/&gt; Tests for Invers FFT functions successful &lt;br/&gt; Test for Auto Correlation function successful &lt;br/&gt; Tests for DoT Product functions successful &lt;br/&gt; Tests for Matrix multiplication successful &lt;br/&gt; Tests for FIR Filtering functions successful &lt;br/&gt; Test for IIR Filter successful &lt;br/&gt; — &lt;br/&gt; Test for Fixed point Math functions in C6Accel &lt;br/&gt; — &lt;br/&gt; Test for Arithmetic RTS functions successful &lt;br/&gt; Tests for Conversion RTS functions successful &lt;br/&gt; Tests for IQmath Conversion functions successful &lt;br/&gt; Tests for Mathematical IQmath functions successful &lt;br/&gt; Tests for Arithmetic IQmath functions successful &lt;br/&gt; Tests for Trignometric IQmath functions successful &lt;br/&gt; — &lt;br/&gt; Test for Floating point Math Functions in C6Accel &lt;br/&gt; — &lt;br/&gt; Test for Arithmetic RTS functions successful &lt;br/&gt; Tests for Conversion RTS functions successful &lt;br/&gt; Tests for Floating point RTS single precision functions successful &lt;br/&gt; Tests for Floating point RTS double precision functions successful &lt;br/&gt; — &lt;br/&gt; Test for Floating point Signal processing Functions in C6accel &lt;br/&gt; — &lt;br/&gt; Test for Floating point DSP FFT function successful &lt;br/&gt; Test for Floating point DSP vector multiplication successful &lt;br/&gt; Test for Floating point DSP vector reciprocal function successful &lt;br/&gt; Test for Floating point DSP vector reciprocal function successful &lt;br/&gt; Test for Floating point DSP vector weighted sum function successful &lt;br/&gt; Test for Floating point DSP vector dot product function executed successful &lt;br/&gt; Tests for Floating point DSP matrix functions successful &lt;br/&gt; Tests for Floating point DSP Matrix Multiplication functions successful &lt;br/&gt; Test for Floating point DSP matrix transpose function successful &lt;br/&gt; Tests for Floating point DSP autocorrelation functions successful &lt;br/&gt; Tests for Floating point DSP convolution functions successful &lt;br/&gt; Test for Floating point DSP FIR filter successful &lt;br/&gt; Test for Floating point DSP Inverse FFT function successful &lt;br/&gt; Test for Floating point DSP BIQUAD Filter successful &lt;br/&gt; Test for Floating point to Double precision successful &lt;br/&gt; Test for Complex to real and imaginary passed successfully &lt;br/&gt; -&amp;gt; Asynchronous Calls &lt;br/&gt; Tests for FFT functions successful &lt;br/&gt; Tests for Sobel Filter successful &lt;br/&gt; Test for Arithmetic RTS functions successful &lt;br/&gt; ****************************************************************************** &lt;br/&gt; All tests done. &lt;br/&gt; ******************************************************************************&lt;br/&gt; &lt;/p&gt;&lt;br/&gt; &lt;br/&gt; &lt;h4&gt;4. Тест сравнения работы функций OpenCV на ARM и DSP&lt;/h4&gt;&lt;br/&gt; OpenCV (Open Source Computer Vision Library) – библиотека алгоритмов компьютерного зрения, обработки изображений и численных алгоритмов общего назначения с открытым исходным ко-дом. Библиотека написана на C и C++, однако поддерживается Java, Python и др. Работает под Linux, Windows и Mac OS X.&lt;br/&gt; &lt;br/&gt; OpenCV представляет собой простую в использовании библиотеку компьютерного зрения с более чем 500-ми функций, способными работать в реальном времени. Они охватывают множество областей, такие как контроль качества на производстве, системы безопасности, обработку изображений в медицине, пользовательские интерфейсы, стереоскопическое зрение и роботостроение.&lt;br/&gt; &lt;br/&gt; Так как библиотека OpenCV является переносимым ПО, её можно скомпилировать в большинстве систем, в которых предусмотрен компилятор C/C++. OpenCV успешно используется на ARM, MIPS, Xscale и других процессорах.&lt;br/&gt; &lt;br/&gt; Стоит заметить, что в C6Accel 2.01.00.11 имеются не все функции OpenCV, а лишь 50.&lt;br/&gt; &lt;br/&gt; &lt;h5&gt;4.1. Установка и сборка OpenCV&lt;/h5&gt;&lt;br/&gt; Следуйте инструкциям для сборки OpenCV 2.2.0 под ARM-платформу. При их выполнении помните, что CodeSourcery Toolchain уже установлен.&lt;br/&gt; &lt;br/&gt; Скопируем разделяемые библиотеки OpenCV в целевую файловую систему.&lt;br/&gt; host $ cp ${HOME}/build/lib/* ${HOME}/targetfs/usr/lib
&lt;br/&gt; &lt;h5&gt;4.2. Сборка и выполнение теста&lt;/h5&gt;&lt;br/&gt; Первая проблема, с которой пришлось столкнуться, – это ошибка при загрузке изображений. Почему-то не нравятся картинки с расширением png, ошибка локализована в функции cvCreateImage. Ладно, изменим на другое расширение, например, bmp. Это можно сделать так:&lt;br/&gt; host $ cd ${HOME}/c6accel/soc/app/c6accel_opencv_testapp/opencv_images
host $ for fname in *.png; do convert &quot;$fname&quot; &quot;$fname.bmp&quot;; done
&lt;br/&gt; И конечно, не забудем изменить расширения в исходном коде. В файлах appMain.c и c6accel_opencv_testfxns.c расположенных в директории /home/%username%/c6accel/soc/app/c6accel_opencv_testapp заменим все вхождения строки «.png» на «.png.bmp», для этой цели удобен текстовый редактор gedit с комбинацией клавиш Ctrl+H.&lt;br/&gt; &lt;br/&gt; Второй проблемой оказались ошибка при выполнении функции C6Accel_test_Matchshapes и отказ работы функции cvFindCornerSubPix (в связи с известным багом http://code.opencv.org/issues/963).&lt;br/&gt; &lt;br/&gt; В файле appMain.c закомментируем строку с функцией C6Accel_test_Matchshapes. А в файле c6accel_opencv_testfxns.c закомментируем текст со строки &lt;br/&gt; //cvFindCorner SubPix issue to be resolved
и включительно до строки &lt;br/&gt; printf(&quot;Called ARM FindCornerSubPix function (time: %f ms)&amp;#92;n&quot;, t_algo / 1000.0 / n);
&lt;br/&gt; Напоследок соберём и запустим тестовое приложение.&lt;br/&gt; host $ cd ${HOME}/c6accel
host $ sudo make opencv_app
host $ sudo make opencv_app_install
target # cd /opt/c6accel_app/c6accel_opencv_testapp
target # ./loadmodules_ti8168_c6accel.sh
target # ./c6accel_opencv_testapp
&lt;br/&gt; Ура! После долгих мучений всё заработало.&lt;br/&gt; &lt;br/&gt; &lt;b&gt;Результат работы приложения подытожен в таблице&lt;/b&gt; &lt;b&gt;Функция OpenCV &lt;/b&gt;&lt;br/&gt; &lt;b&gt;Среднее время&lt;br/&gt; выполнения&lt;br/&gt; на ARM, мс&lt;/b&gt;&lt;br/&gt; &lt;b&gt;Среднее время&lt;br/&gt; выполнения&lt;br/&gt; на DSP, мс&lt;/b&gt;&lt;br/&gt; &lt;b&gt;Отметка о&lt;br/&gt; выборе&lt;br/&gt; DSP&lt;/b&gt;&lt;br/&gt; &lt;b&gt;Разница между результатами выполнения&lt;br/&gt; на ARM и DSP (расстояние в пространстве &lt;br/&gt; L2, если не указано иное)&lt;/b&gt;&lt;br/&gt; cvCanny&lt;br/&gt; 43.218000&lt;br/&gt; 42.804000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; get Affine transform matrix&lt;br/&gt; 0.557000&lt;br/&gt; 0.411000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; Affine transform&lt;br/&gt; 46.325000&lt;br/&gt; 36.554000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 7926.342031&lt;br/&gt; 2D Rotation Matrix&lt;br/&gt; 0.314000&lt;br/&gt; 0.378000&lt;br/&gt; &lt;strong&gt;-&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; Rotation using Affine&lt;br/&gt; 55.380000&lt;br/&gt; 40.985000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 774.451419&lt;br/&gt; cvIntegral&lt;br/&gt; 6.537000&lt;br/&gt; 8.232000&lt;br/&gt; &lt;strong&gt;-&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; cvMinMaxLoc&lt;br/&gt; 3.083000&lt;br/&gt; 1.660000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; Результаты совпадают&lt;br/&gt; cvNorm&lt;br/&gt; 1.881000&lt;br/&gt; 1.336000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; AddS&lt;br/&gt; 9.573000&lt;br/&gt; 12.434000&lt;br/&gt; &lt;strong&gt;-&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; AbsDiff&lt;br/&gt; 9.036000&lt;br/&gt; 14.349000&lt;br/&gt; &lt;strong&gt;-&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; AbsDiffS&lt;br/&gt; 10.555000&lt;br/&gt; 12.670000&lt;br/&gt; &lt;strong&gt;-&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; Add&lt;br/&gt; 8.931000&lt;br/&gt; 15.852000&lt;br/&gt; &lt;strong&gt;-&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; cvDilate&lt;br/&gt; 3.182000&lt;br/&gt; 1.282000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; cvErode&lt;br/&gt; 3.093000&lt;br/&gt; 1.281000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; cvLaplace&lt;br/&gt; 180.171000&lt;br/&gt; 11.968000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; cvPyrDown&lt;br/&gt; 4.265000&lt;br/&gt; 4.917000&lt;br/&gt; &lt;strong&gt;-&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; cvFilter2D&lt;br/&gt; 519.593000&lt;br/&gt; 21.259000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 3651.030129&lt;br/&gt; cvFindContours&lt;br/&gt; 11.915000&lt;br/&gt; 17.753000&lt;br/&gt; &lt;strong&gt;-&lt;/strong&gt;&lt;br/&gt; Результаты совпадают&lt;br/&gt; EqualizeHist&lt;br/&gt; 5.809000&lt;br/&gt; 8.921000&lt;br/&gt; &lt;strong&gt;-&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; SetZero&lt;br/&gt; 0.634000&lt;br/&gt; 3.871000&lt;br/&gt; &lt;strong&gt;-&lt;/strong&gt;&lt;br/&gt; 132898.252336&lt;br/&gt; Rectangle&lt;br/&gt; 5.847000&lt;br/&gt; 1.307000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; Circle&lt;br/&gt; 3.652000&lt;br/&gt; 3.323000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; Flip&lt;br/&gt; 12.372000&lt;br/&gt; 12.071000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; Copy&lt;br/&gt; 2.479000&lt;br/&gt; 6.072000&lt;br/&gt; &lt;strong&gt;-&lt;/strong&gt;&lt;br/&gt; Sobel&lt;br/&gt; 5.463000&lt;br/&gt; 7.197000&lt;br/&gt; &lt;strong&gt;-&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; ConvertScale&lt;br/&gt; 5.139000&lt;br/&gt; 6.044000&lt;br/&gt; &lt;strong&gt;-&lt;/strong&gt;&lt;br/&gt; Adaptive threshold&lt;br/&gt; 89.986000&lt;br/&gt; 33.231000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; cvMulSpectrums&lt;br/&gt; 91.865000&lt;br/&gt; 15.221000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 0.086427&lt;br/&gt; cvDFT&lt;br/&gt; 597.131000&lt;br/&gt; 99.666000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; cvNormalize&lt;br/&gt; 57.318000&lt;br/&gt; 13.576000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; cvSmooth&lt;br/&gt; 109.345000&lt;br/&gt; 57.467000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 1771.619316&lt;br/&gt; HoughLines2D&lt;br/&gt; 2314.028000&lt;br/&gt; 634.262000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 46306.904723&lt;br/&gt; cvCornerHarris&lt;br/&gt; 653.550000&lt;br/&gt; 168.213000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 0.136828&lt;br/&gt; cvCornerEigenValsAndVecs&lt;br/&gt; 3430.892000&lt;br/&gt; 870.525000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 350.751214&lt;br/&gt; cvCornerMinEigenVal&lt;br/&gt; 1384.182000&lt;br/&gt; 1.155000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; –&lt;br/&gt; cvMulSpectrums&lt;br/&gt; 91.711000&lt;br/&gt; 15.323000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 0.086427&lt;br/&gt; cvDFT&lt;br/&gt; 597.707000&lt;br/&gt; 99.412000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; cvNormalize&lt;br/&gt; 58.782000&lt;br/&gt; 13.751000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; GoodFeaturesToTrack&lt;br/&gt; 1259.277000&lt;br/&gt; 279.508000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; –&lt;br/&gt; FindCornerSubPix&lt;br/&gt; –&lt;br/&gt; 449.029000&lt;br/&gt;  &lt;br/&gt; cvMatchTemplate&lt;br/&gt; 1576.569000&lt;br/&gt; 221.753000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 3.741657&lt;br/&gt; cvThreshold&lt;br/&gt; 2.182000&lt;br/&gt; 4.442000&lt;br/&gt; &lt;strong&gt;-&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; cvBoundingRect&lt;br/&gt; 0.036000&lt;br/&gt; 0.302000&lt;br/&gt; &lt;strong&gt;-&lt;/strong&gt;&lt;br/&gt; Разница между полученными площадями – 0.000000&lt;br/&gt; cvDrawContour&lt;br/&gt; 0.030000&lt;br/&gt; 0.989000&lt;br/&gt; &lt;strong&gt;-&lt;/strong&gt;&lt;br/&gt; cvContourArea&lt;br/&gt; 0.049000&lt;br/&gt; 0.231000&lt;br/&gt; &lt;strong&gt;-&lt;/strong&gt;&lt;br/&gt; Plotting&lt;br/&gt; –&lt;br/&gt; 183.243000&lt;br/&gt;  &lt;br/&gt; CvtColor&lt;br/&gt; 16.283000&lt;br/&gt; 13.804000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; 0.000000&lt;br/&gt; Resize&lt;br/&gt; 18.357000&lt;br/&gt; 17.617000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; cvCalcOpticalFlowPyrLK&lt;br/&gt; 2472.993000&lt;br/&gt; 146.874000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; Оба результата состоят из 445 особенностей&lt;br/&gt; HaarDetectObjects&lt;br/&gt; 2522.499000&lt;br/&gt; 460.350000&lt;br/&gt; &lt;strong&gt;+&lt;/strong&gt;&lt;br/&gt; Оба результата состоят из 5-ти элементов.&lt;br/&gt; ARM:&lt;br/&gt;   0:   46,   48 (42x42)&lt;br/&gt;   1:  174,   48 (37x37)&lt;br/&gt;   2:  240,   51 (38x38)&lt;br/&gt;   3:  110,   48 (40x40)&lt;br/&gt;   4:   92,   37 (131x131)&lt;br/&gt; DSP:&lt;br/&gt;   0:   47,   49 (40x40)&lt;br/&gt;   1:  175,   49 (35x35)&lt;br/&gt;   2:  240,   52 (37x37)&lt;br/&gt;   3:   17,  198 (34x34)&lt;br/&gt;   4:  110,   48 (38x38)&lt;br/&gt; &lt;br/&gt; &lt;br/&gt; По результатам можно сделать выводы:&lt;br/&gt; &lt;ul&gt; &lt;li&gt;У некоторых функций имеется разница между результатами выполнения. Архитектура сигнальных процессоров, по сравнению с микропроцессорами общего применения, имеет некоторые особенности, связанные со стремлением максимально ускорить выполнение типовых задач ЦОС. DSP ориентированы, в первую очередь, на многократное выполнение умножения с расчётом «на лету» адресов перемножаемых элементов массивов. Алгоритм, реализованный на различных базовых операциях, может давать различные результаты.&lt;/li&gt; &lt;li&gt;Не все функции работают быстрее на DSP, чем на ARM. Можно заметить закономерность: это функции базовых операции над матрицами или функции, которые в основном из них состоят. Такие «плохие» функции можно выполнять на ARM, в то время как другие пере-нести на DSP. В случае перегрузки процессора ARM использование некоторых «плохих» функций на DSP может быть терпимым.&lt;/li&gt; &lt;li&gt;При использовании «хороших» функции на DSP можно достичь улучшения в разы и даже более чем на порядок. Это, как правило, наиболее трудоёмкие функции.&lt;/li&gt; &lt;/ul&gt;&lt;br/&gt; Таким образом, балансируя между быстродействием, загрузкой процессоров и результатами выполнения можно существенно оптимизировать работу приложения.&lt;br/&gt; &lt;br/&gt; Полезные ссылки:&lt;br/&gt;
&lt;/div&gt;</content:encoded>
			<link>https://winger.ucoz.com/news/ispolzovanie_dsp_soprocessora_dm8168_s_pomoshhju_frejmvorka_c6accel_ispolzovanie_win32_api_dlja_bmp_resize/2017-06-29-42</link>
			<dc:creator>supoinclus</dc:creator>
			<guid>https://winger.ucoz.com/news/ispolzovanie_dsp_soprocessora_dm8168_s_pomoshhju_frejmvorka_c6accel_ispolzovanie_win32_api_dlja_bmp_resize/2017-06-29-42</guid>
			<pubDate>Thu, 29 Jun 2017 00:01:14 GMT</pubDate>
		</item>
		<item>
			<title>Курс программирования на языке Си: учебник : Язык си учебник</title>
			<description>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;https://winger.ucoz.com//www.youtube.com/embed/K3ROGavUCzU&quot; width=150px&gt;&lt;/td&gt;&lt;td&gt;Аннотация: 
 Настоящий учебник предназначен для изучения программирования на стандартном языке Си.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
			<content:encoded>&lt;div&gt;&lt;b&gt;Аннотация:&lt;/b&gt;
&lt;br/&gt;&lt;br style=&quot;line-hieght: 4px&quot;/&gt;&lt;p&gt;Настоящий учебник предназначен для изучения программирования на стандартном языке Си. Ориентация сделана как на изложение синтаксиса и семантики конструкций языка, так и на их практическое использование при решении типовых задач программирования. Целью учебника является изложение методики и принципов корректного, структурированного программирования на языке Си. Программы, иллюстрирующие конструкции и возможности языка, написаны максимально понятно для читателя. Авторы нигде не гнались за эффективностью кода в ущерб его структурированности и простоты. Возможности современных компиляторов языка Си таковы, что они позволяют генерировать весьма эффективный код по тексту хорошо структурированной программы без специальных ухищрений программиста, направленных на повышение быстродействия или незначительную экономию памяти. Книга написана на основе дисциплин, которые авторы в течение ряда лет преподавали в Московском институте электроники и математики на факультетах прикладной математики, автоматики и вычислительной техники и факультете повышения квалификации инженеров. Материал курса соответствует учебной программе дисциплины «Алгоритмические языки и программирование». Изучение указанной дисциплины, в частности языка Си, служит основой для курсов по математическому обеспечению компьютеров и сетей, по операционным системам, построению компиляторов и системному программированию. Издание предназначено для студентов и преподавателей вузов, а также для желающих освоить самостоятельно программирование на языке Си.&lt;/p&gt;
&lt;/div&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Программирование на языке C, урок 1 - YouTube&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://winger.ucoz.com//www.youtube.com/embed/K3ROGavUCzU&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;br&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</content:encoded>
			<link>https://winger.ucoz.com/news/kurs_programmirovanija_na_jazyke_si_uchebnik_jazyk_si_uchebnik/2017-06-19-148</link>
			<dc:creator>supoinclus</dc:creator>
			<guid>https://winger.ucoz.com/news/kurs_programmirovanija_na_jazyke_si_uchebnik_jazyk_si_uchebnik/2017-06-19-148</guid>
			<pubDate>Mon, 19 Jun 2017 13:30:33 GMT</pubDate>
		</item>
		<item>
			<title>Lock-free структуры данных. Эволюция стека : стек на основе списка C++</title>
			<description>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;http://habrastorage.org/getpro/habr/post_images/f8c/585/ccf/f8c585ccff8dc53d367cd6471284a350.jpg&quot; width=150px&gt;&lt;/td&gt;&lt;td&gt;18 марта 2014 в 10:14 
 
Lock-free структуры данных. Эволюция стека
 
 В предыдущих своих заметках я описал основу, на которой строятся lock-free структуры данных, и базовые алгоритмы управления временем жизни элементов lock-free структур данных.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
			<content:encoded>&lt;div&gt;&lt;p&gt;18 марта 2014 в 10:14&lt;/p&gt;
&lt;h1&gt;
Lock-free структуры данных. Эволюция стека
&lt;/h1&gt;
&lt;img src=&quot;http://habrastorage.org/getpro/habr/post_images/f8c/585/ccf/f8c585ccff8dc53d367cd6471284a350.jpg&quot; align=&quot;right&quot;/&gt;&lt;br/&gt; В предыдущих своих заметках я описал основу, на которой строятся lock-free структуры данных, и базовые алгоритмы управления временем жизни элементов lock-free структур данных. Это была прелюдия к описанию собственно lock-free контейнеров. Но далее я столкнулся с проблемой: как построить дальнейший рассказ? Просто описывать известные мне алгоритмы? Это довольно скучно: много [псевдо-]кода, обилие деталей, важных, конечно, но весьма специфических. В конце концов, это есть в опубликованных работах, на которые я даю ссылки, и в гораздо более подробном и строгом изложении. Мне же хотелось рассказать &lt;i&gt;интересно&lt;/i&gt; об интересных вещах, показать пути развития подходов к конструированию конкурентных контейнеров.&lt;br/&gt; Хорошо, — подумал я, — тогда метод изложения должен быть такой: берем какой-то тип контейнера — очередь, map, hash map, — и делаем обзор известных на сегодняшний день оригинальных алгоритмов для этого типа контейнера. С чего начать? И тут я вспомнил о самой простой структуре данных — о стеке.&lt;br/&gt;своей статье 1986 года, хотя есть сведения, что впервые этот алгоритм был описан в системной документации IBM/360. &lt;br/&gt;&lt;b&gt;Историческое отступление&lt;/b&gt;&lt;p&gt;Вообще, статья Treiber&apos;а — своего рода Ветхий Завет, пожалуй, первая статья о lock-free структуре данных. Во всяком случае, более ранних мне не известно. Она до сих пор очень часто упоминается в списках литературы (reference) современных работ, видимо, как дань уважения к родоначальнику lock-free подхода.&lt;br/&gt;&lt;/p&gt;&lt;br/&gt; Алгоритм настолько простой, что я приведу его адаптированный код из libcds (кому интересно — это интрузивный стек cds::intrusive::TreiberStack):&lt;br/&gt;// m_Top – вершина стека
bool push( value_type&amp;amp; val )
{
back_off bkoff;
value_type * t = m_Top.load(std::memory_order_relaxed);
while ( true ) {
val.m_pNext.store( t, std::memory_order_relaxed );
if (m_Top.compare_exchange_weak(t, &amp;amp;val,
std::memory_order_release, std::memory_order_relaxed))
return true;
bkoff();
}
}
value_type * pop()
{
back_off bkoff;
typename gc::Guard guard; // Hazard pointer guard
while ( true ) {
value_type * t = guard.protect( m_Top );
if ( t == nullptr )
return nullptr ; // stack is empty
value_type * pNext = t-&amp;gt;m_pNext.load(std::memory_order_relaxed);
if ( m_Top.compare_exchange_weak( t, pNext,
std::memory_order_acquire, std::memory_order_relaxed ))
return t;
bkoff();
}
}
&lt;br/&gt; Этот алгоритм неоднократно разобран по косточкам (например, тут), так что я повторяться не буду. Краткое описание алгоритма сводится к тому, что мы долбимся с помощью атомарного примитива CAS в m_Top, пока не получим желаемый результат. Просто и довольно примитивно.&lt;br/&gt; Отмечу две интересных детали:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;Safe memory reclamation (SMR) необходим только в методе pop, так как только там мы читаем поля m_Top. В push никакие поля m_Top не читаются (нет обращения по указателю m_Top), так что и защищать Hazard Pointer&apos;ом ничего не нужно. Интересно это потому, что обычно SMR требуется во всех методах класса lock-free контейнера&lt;/li&gt; &lt;li&gt;Таинственный объект bkoff и его вызов bkoff(), если CAS неуспешен&lt;/li&gt; &lt;/ul&gt;&lt;br/&gt; Вот на этом самом bkoff я хотел бы остановиться подробнее.&lt;br/&gt;&lt;br/&gt;&lt;h1&gt;Back-off стратегии&lt;/h1&gt;&lt;br/&gt;&lt;img src=&quot;http://habrastorage.org/getpro/habr/post_images/d63/e59/6ef/d63e596ef84a9bded93047a95ee926df.jpg&quot; align=&quot;right&quot;/&gt;&lt;br/&gt; Почему CAS неуспешен? Очевидно потому, что между прочтением текущего значения m_Top и попыткой применить CAS какой-то другой поток успел изменить значение m_Top. То есть мы имеем типичный пример конкуренции. В случае сильной нагрузки (high contention), когда N потоков выполняют push/pop, только один из них выиграет, остальные N – 1 будут впустую потреблять процессорное время и мешать друг другу на CAS (вспомним протокол MESI кеша). &lt;br/&gt; Как разгрузить процессор при обнаружении такой ситуации? Можно отступить (back off) от выполнения основной задачи и сделать что-либо полезное или просто подождать. Именно для этого предназначены back-off стратегии. &lt;br/&gt; Конечно, в общем случае «сделать что-либо полезное» у нас не получится, так как мы не имеем понятия о конкретной задаче, так что мы можем только подождать. Как ждать? Вариант со sleep() отметаем — немногие операционные системы могут обеспечить нам столь малые тайм-ауты ожидания, да и накладные расходы на переключение контекста слишком велики — больше, чем время выполнения CAS.&lt;br/&gt; В академической среде популярностью пользуется стратегия &lt;i&gt;экспоненциального&lt;/i&gt; back-off. Идея очень проста: &lt;br/&gt;class exp_backoff {
int const nInitial;
int const nStep;
int const nThreshold;
int nCurrent;
public:
exp_backoff( int init=10, int step=2, int threshold=8000 )
: nInitial(init), nStep(step), nThreshold(threshold), nCurrent(init)
{}
void operator()()
{
for ( int k = 0; k &lt; nCurrent; ++k )
nop();
nCurrent *= nStep;
if ( nCurrent &amp;gt; nThreshold )
nCurrent = nThreshold;
}
void reset() { nCurrent = nInitial; }
};
&lt;br/&gt; То есть мы в цикле выполняем nop(), с каждым разом увеличивая длину цикла. Вместо nop() можно вызвать что-то более полезное, например, вычислить bitcoin hint-инструкцию (если таковая имеется), которая говорит процессору «у тебя есть время выполнить свои внутренние дела» (опять-таки, вспомним MESI – таких дел у процессора может быть море).&lt;br/&gt; Проблема с экспоненциальным back-off проста — трудно подобрать хорошие параметры nInitial, nStep, nThreshold. Эти константы зависят от архитектуры и от задачи. В коде выше значения для них по умолчанию взяты с потолка.&lt;br/&gt; Поэтому на практике довольно неплохим выбором для десктопных процессоров и серверов начального уровня будет yield() back-off — переключение на другой поток. Тем самым мы отдаем свое время другим, более удачливым потокам, в надежде, что они сделают то, что им требуется, и не будут нам мешать (а мы — им).&lt;br/&gt; Ст&lt;b&gt;о&lt;/b&gt;ит ли вообще применять back-off стратегии? Эксперименты показывают, что ст&lt;b&gt;о&lt;/b&gt;ит: примененная в нужном узком месте правильная back-off стратегия может дать выигрыш в производительности lock-free контейнера в разы.&lt;br/&gt;&lt;br/&gt; Рассмотренные back-off стратегии помогают решить проблему с неудачными CAS, но никак не способствуют выполнению основной задачи — операций со стеком. Можно ли каким-то образом объединить push/pop и back-off, чтобы back-off стратегия активно помогала выполнению операции?&lt;br/&gt;&lt;br/&gt;&lt;h1&gt;Elimination back-off&lt;/h1&gt;&lt;br/&gt; Рассмотрим проблему неудачного CAS в push/pop с другой стороны. Почему CAS неудачен? Потому что другой поток изменил m_Top. А что делает этот другой поток? Выполняет push() или pop(). Теперь заметим, что операции push и pop для стека комплементарны: если один поток выполняет push(), а другой в это же время — pop(), то в принципе вообще не имеет смысла обращаться к вершине стека m_Top: push-поток мог бы просто передать свои данные pop-потоку, при этом основное свойство стека — LIFO – не нарушается. Остается придумать, как свести вместе оба эти потока, минуя вершину стека.&lt;br/&gt;&lt;br/&gt;&lt;img src=&quot;http://habrastorage.org/getpro/habr/post_images/3bc/9f1/777/3bc9f1777d1a7c5cc104d496f63728a1.png&quot; align=&quot;right&quot;/&gt;&lt;br/&gt; В 2004 году Hendler, Shavit и Yerushalmi предложили модификацию алгоритма Treiber&apos;а, в котором задача передачи данных между push- и pop-потоками без участия вершины стека решается с помощью специальной back-off стратегии, названной ими &lt;i&gt;исключающей&lt;/i&gt; back-off стратегией (elimination back-off, я бы перевел ещё как &lt;i&gt;поглощающая&lt;/i&gt; back-off стратегия).&lt;br/&gt;&lt;br/&gt; Имеется массив elimination array размером N (N — небольшое число). Этот массив является членом класса стека. При неуспехе CAS, уходя в back-off, поток создает дескриптор своей операции (push или pop) и случайным образом выбирает произвольную ячейку этого массива. Если ячейка пуста, он записывает в неё указатель на свой дескриптор и выполняет обычный back-off, например, экспоненциальный. В этом случае поток можно назвать пассивным.&lt;br/&gt; Если же выбранная ячейка уже содержит указатель на дескриптор P операции какого-то другого (пассивного) потока, то поток (назовем его активным) проверяет, что это за операция. Если операции комплементарны — push и pop, — то они взаимно поглощаются: &lt;br/&gt;&lt;ul&gt;&lt;li&gt; если активный поток выполняет push, то он записывает в дескриптор P свой аргумент, передавая таким образом его в операцию pop пассивного потока;&lt;/li&gt; &lt;li&gt; если активный поток выполняет pop, то он читает из дескриптора P аргумент комплементарной операции push.&lt;/li&gt; &lt;/ul&gt;&lt;br/&gt;&lt;img src=&quot;http://habrastorage.org/getpro/habr/post_images/a52/3a9/f9e/a523a9f9e344f45001e57a7d9d622694.png&quot; align=&quot;right&quot;/&gt;&lt;br/&gt; Затем активный поток помечает запись в ячейке elimination array как обработанную, чтобы пассивный поток при выходе из back-off увидел, что кто-то волшебным образом выполнил его работу. В результате активный и пассивный потоки выполнят свои операции &lt;i&gt;без обращения к вершине стека&lt;/i&gt;.&lt;br/&gt; Если же в выбранной ячейке elimination array операция та же самая (ситуация push-push или pop-pop), — не повезло. В этом случае активный поток выполняет обычный back-off и далее пытается выполнить свой push/pop как обычно, — CAS вершины стека.&lt;br/&gt; Пассивный же поток, окончив back-off, проверяет свой дескриптор в elimination array. Если дескриптор имеет отметку, что операция выполнена, то есть нашелся другой поток с комплементарной операцией, то пассивный поток успешно завершает свой push/pop.&lt;br/&gt; Все вышеописанные действия выполняются в lock-free манере, без каких-либо блокировок, поэтому реальный алгоритм сложнее описанного, но смысл от этого не меняется.&lt;br/&gt; Дескриптор содержит код операции — push или pop, — и аргумент операции: в случае push — указатель на добавляемый элемент, в случае pop поле указателя остается пустым (nullptr), в случае успеха elimination в него записывается указатель на элемент поглощающей операции push.&lt;br/&gt; Elimination back-off позволяет значительно разгрузить стек при высокой нагрузке, а при малой, когда CAS вершины стека почти всегда успешен, такая схема не привносит вообще никакого оверхеда. Алгоритм требует тонкой настройки, заключающейся в выборе оптимального размера elimination array, что зависит от задачи и реальной нагрузки. Можно также предложить адаптивный вариант алгоритма, когда размер elimination array изменяется в небольших пределах в процессе работы, подстраиваясь под нагрузку. &lt;br/&gt; В случае несбалансированности, когда операции push и pop идут пачками — много push без pop, затем много pop без push, — алгоритм не даст какого-либо ощутимого выигрыша, хотя и особого проигрыша в производительности быть не должно по сравнению с классическим алгоритмом Treiber&apos;а. &lt;br/&gt;&lt;br/&gt;&lt;h1&gt;Flat combining&lt;/h1&gt;&lt;br/&gt; До сих пор мы говорили о lock-free стеке. Рассмотрим теперь обычный lock-based стек:&lt;br/&gt;template &lt;class T&amp;gt; class LockStack {
std::stack&lt;T *&amp;gt; m_Stack;
std::mutex m_Mutex;
public:
void push( T&amp;amp; v ) {
m_Mutex.lock();
m_Stack.push( &amp;amp;v );
m_Mutex.unlock();
}
T * pop() {
m_Mutex.lock();
T * pv = m_Stack.top();
m_Stack.pop()
m_Mutex.unlock();
return pv;
}
};
&lt;br/&gt; Очевидно, что при конкурентом выполнении производительность его будет весьма низка — все обращения к стеку сериализуются на мьютексе, всё выполняется строго последовательно. Можно ли как-нибудь повысить performance?&lt;br/&gt; Если N потоков одновременно обращаются к стеку, только один из них захватит мьютекс, остальные будут дожидаться его освобождения. Но вместо того, чтобы пассивно ждать на мьютексе, ждущие потоки могли бы анонсировать свои операции, как в elimination back-off, а поток-победитель (владелец мьютекса) мог бы помимо своей работы выполнить и задания от своих собратьев. Эта идея легла в основу подхода flat combining, описанного в 2010 году и развивающегося и по сей день.&lt;br/&gt;&lt;img src=&quot;http://habrastorage.org/getpro/habr/post_images/b92/0bd/319/b920bd319e28fd34f25e01ba4d460daf.png&quot;/&gt;&lt;br/&gt; Идею подхода flat combining можно описать следующим образом. С каждой структурой данных, в нашем случае со стеком, связан мьютекс и список анонсов (publication list) размером, пропорциональным количеству потоков, работающих со стеком. Каждый поток при первом обращении к стеку добавляет к списку анонсов свою запись, расположенную в thread local storage (TLS). При выполнении операции поток публикует в своей записи запрос — операцию (push или pop) и её аргументы — и пытается захватить мьютекс. Если мьютекс захвачен, поток становится комб&lt;b&gt;а&lt;/b&gt;йнером (combiner, не путать с комбайн&lt;b&gt;ё&lt;/b&gt;ром): он просматривает список анонсов, собирает все запросы из него, выполняет их (в случае со стеком здесь может применяться поглощение (elimination), рассмотренное ранее), записывает результат в элементы списка анонсов и наконец освобождает мьютекс. Если же попытка захвата мьютекса не удалась, поток ожидает (spinning) на своем анонсе, когда комбайнер выполнит его запрос и поместит результат в запись анонса.&lt;br/&gt; Список анонсов построен таким образом, чтобы уменьшить накладные расходы на управление им. Ключевым моментом является то, что список анонсов редко изменяется, иначе мы получим ситуацию, когда к стеку прикручен сбоку lock-free publication list, что вряд ли как-то ускорит сам стек. Запросы на операцию вносятся в уже существующую запись списка анонсов, которая, напомню, является собственностью потоков и находится в TLS. Некоторые записи списка могут иметь статус «empty», означающий, что соответствующий поток не выполняет в настоящий момент никаких действий со структурой данных (стеком). Время от времени комбайнер прореживает список анонсов, исключая давно неактивные записи (поэтому записи списка должны иметь какой-то timestamp), тем самым уменьшая время просмотра списка. &lt;br/&gt; Вообще, flat combining является очень общим подходом, который с успехом распространяется на сложные lock-free структуры данных, позволяет комбинировать разные алгоритмы, — например, добавлять elimination back-off в реализацию flat combining-стека. Реализация flat combining на C++ в библиотеке общего пользования также является довольно интересной задачей: дело в том, что в исследовательских работах список анонсов является, как правило, атрибутом каждого объекта-контейнера, что может быть слишком накладно в реальной жизни, так как каждый контейнер должен иметь свою запись в TLS. Хотелось бы иметь более общую реализацию с единым publication list для всех объектов flat combining, но при этом важно не потерять в скорости.&lt;br/&gt;&lt;b&gt;История развивается по спирали&lt;/b&gt;&lt;p&gt;Интересно, что идея анонсирования своей операции перед её выполнением восходит к началу исследований lock-free алгоритмов: в начале 1990-х годов были предприняты попытки построения общих методов преобразования традиционных lock-based структур данных в lock-free. С точки зрения теории эти попытки успешны, но на практике получаются медленные тяжелые lock-free алгоритмы. Идея этих общих подходов как раз и была — анонсировать операцию перед выполнением, чтобы конкурирующие потоки увидели её и помогли её выполнить. На практике такая «помощь» была скорее помехой: потоки выполняли одну и ту же операцию одновременно, толкаясь и мешая друг другу.&lt;br/&gt; Стоило немного переставить акценты — с активной помощи до пассивного делегирования работы другому, более удачливому потоку — и получился быстрый метод flat combining.&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1&gt;Заключение&lt;/h1&gt;&lt;br/&gt; Удивительно, что такая простая структура данных, как стек, где и писать, казалось бы, не о чем, позволила продемонстрировать столько интересных подходов к разработке конкурентных структур данных!&lt;br/&gt;&lt;i&gt;Back-off стратегии&lt;/i&gt; применимы повсеместно при конструировании lock-free алгоритмов: как правило, каждая операция заключена в бесконечный цикл по принципу «делаем пока не удастся», а в конце тела цикла, то есть именно тогда, когда итерация не удалась, не лишним будет поставить back-off, который может уменьшить давление на критические данные контейнера при большой нагрузке.&lt;br/&gt;&lt;i&gt;Elimination back-off&lt;/i&gt; – менее общий подход, применимый для стека и, в меньшей степени, для очереди.&lt;br/&gt; Получивший развитие в последние годы &lt;i&gt;flat combining&lt;/i&gt; является особым трендом при построении конкурентных контейнеров — как lock-free, так и fine grained lock-based.&lt;br/&gt; Надеюсь, мы ещё встретимся с этими техниками в дальнейшем.&lt;br/&gt;Начало&lt;br/&gt; Основы:&lt;br/&gt;&lt;br/&gt; Внутри:&lt;br/&gt;&lt;br/&gt; Извне:&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;</content:encoded>
			<link>https://winger.ucoz.com/news/lock_free_struktury_dannykh_ehvoljucija_steka_stek_na_osnove_spiska_c/2017-06-03-11</link>
			<dc:creator>supoinclus</dc:creator>
			<guid>https://winger.ucoz.com/news/lock_free_struktury_dannykh_ehvoljucija_steka_stek_na_osnove_spiska_c/2017-06-03-11</guid>
			<pubDate>Sat, 03 Jun 2017 17:17:07 GMT</pubDate>
		</item>
		<item>
			<title>Microsoft Visual C++ 2015 Redistributable Package 14.0.23026 [RUS&amp;#92;ML](2015) : Стандартный календарь C++</title>
			<description>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;http://www.staffcop.ru/rekl/box_new_219.gif&quot; width=150px&gt;&lt;/td&gt;&lt;td&gt;Программа российских производителей для слежения за компьютерами и контроля работы сотрудников.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
			<content:encoded>&lt;div&gt;&lt;img src=&quot;http://www.staffcop.ru/rekl/box_new_219.gif&quot; align=&quot;left&quot; alt=&quot;StaffCop - программа для слежения за компьютерами&quot;/&gt; &lt;p&gt;Программа российских производителей для слежения за компьютерами и контроля работы сотрудников. Может применяться в локальных сетях и на персональных компьютерах.&lt;/p&gt;
 &lt;p&gt;&lt;b&gt;Основные возможности программы:&lt;/b&gt;&lt;/p&gt;
 &lt;ul&gt;&lt;li&gt;&lt;b&gt;мониторинг:&lt;/b&gt; отслеживает запущенные программы и приложения, веб-сайты и поисковые запросы, перехватывает сообщения по Email, Skype, ICQ и в социальных сетях, фиксирует включение/выключение компьютера, делает скриншоты экрана, записывает нажатие клавиш;&lt;/li&gt; &lt;li&gt;&lt;b&gt;запрет/разрешение доступа:&lt;/b&gt; блокирует USB-накопители, запрещает доступ к определенным сайтам и программам, внесенным в черный список, или открывает доступ только к ресурсам, которые занесены в белый список;&lt;/li&gt; &lt;li&gt; &lt;b&gt;сбор статистики:&lt;/b&gt; формирует детализированные отчеты о действиях пользователей компьютеров и предоставляет статистику использования рабочего времени, проведенного за ПК.&lt;/li&gt; &lt;/ul&gt;&lt;p&gt;С помощью StaffCop можно понять, на что тратится рабочее время сотрудников, повысить дисциплинированность персонала, предотвратить утечки конфиденциальной информации. Программа предназначена для руководителей, системных администраторов, сотрудников отдела кадров и службы безопасности. Продукт прост в установке и настройке. Разработчик предоставляет техническую поддержку на русском языке по телефону, E-Mail, посредством тикетной системы и любыми другими удобными для пользователей способами.&lt;/p&gt;
 Скачать StaffCop 5.8 &amp;gt;&amp;gt;&amp;gt; &lt;/div&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C++ 9 Календарь - YouTube&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://winger.ucoz.com//www.youtube.com/embed/CfhdOouo91A&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;br&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</content:encoded>
			<link>https://winger.ucoz.com/news/microsoft_visual_c_2015_redistributable_package_14_0_23026_rus_92_ml_2015_standartnyj_kalendar_c/2017-05-30-180</link>
			<dc:creator>supoinclus</dc:creator>
			<guid>https://winger.ucoz.com/news/microsoft_visual_c_2015_redistributable_package_14_0_23026_rus_92_ml_2015_standartnyj_kalendar_c/2017-05-30-180</guid>
			<pubDate>Tue, 30 May 2017 17:27:51 GMT</pubDate>
		</item>
		<item>
			<title>Связный список : Заполнение двусвязного списка C++</title>
			<description>Свя́зный спи́сок  — базовая динамическая структура данных в информатике, состоящая из узлов, каждый из которых содержит как собственно данные, так и одну или две ссылки («связки») на следующий и/или предыдущий узел списка.</description>
			<content:encoded>&lt;div&gt;&lt;p&gt;&lt;b&gt;Свя́зный спи́сок&lt;/b&gt; — базовая динамическая структура данных в информатике, состоящая из узлов, каждый из которых содержит как собственно данные, так и одну или две ссылки («связки») на следующий и/или предыдущий узел списка.[1] Принципиальным преимуществом перед массивом является структурная гибкость: порядок элементов связного списка может не совпадать с порядком расположения элементов данных в памяти компьютера, а порядок обхода списка всегда явно задаётся его внутренними связями.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;b&gt;Линейный однонаправленный список&lt;/b&gt;&lt;/i&gt; — это структура данных, состоящая из элементов одного типа, связанных между собой последовательно посредством указателей. Каждый элемент списка имеет указатель на следующий элемент. Последний элемент списка указывает на NULL. Элемент, на который нет указателя, является первым (головным) элементом списка. Здесь ссылка в каждом узле указывает на следующий узел в списке. В односвязном списке можно передвигаться только в сторону конца списка. Узнать адрес предыдущего элемента, опираясь на содержимое текущего узла, невозможно.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Длина списка&lt;/b&gt;. Количество элементов в списке.&lt;/li&gt;
&lt;li&gt;Списки могут быть &lt;b&gt;типизированными&lt;/b&gt; или &lt;b&gt;нетипизированными&lt;/b&gt;. Если список типизирован, то тип его элементов задан, и все его элементы должны иметь типы, совместимые с заданным типом элементов списка. Обычно списки, реализованные при помощи массивов, как правило, типизированы.&lt;/li&gt;
&lt;li&gt;Список может быть &lt;b&gt;сортированным&lt;/b&gt; или &lt;b&gt;несортированным&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;В зависимости от реализации может быть возможен &lt;b&gt;произвольный доступ&lt;/b&gt; к элементам списка.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Здесь ссылки в каждом узле указывают на предыдущий и на последующий узел в списке. По двусвязному списку можно эффективно передвигаться в любом направлении — как к началу, так и к концу. В этом списке проще производить удаление и перестановку элементов, так как легко доступны адреса тех элементов списка, указатели которых направлены на изменяемый элемент.&lt;/p&gt;
&lt;p&gt;Разновидностью связных списков является кольцевой (циклический, замкнутый) список. Он тоже может быть односвязным или двусвязным. Последний элемент кольцевого списка содержит указатель на первый, а первый (в случае двусвязного списка) — на последний.&lt;/p&gt;
&lt;p&gt;Как правило, такая структура реализуется на базе линейного списка. С каждым кольцевым списком дополнительно хранится указатель на первый элемент. В этом списке ссылки на NULL не встречается.&lt;/p&gt;
&lt;p&gt;Также существуют циклические списки с выделенным головным элементом, облегчающие полный проход через список.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;сложность прямого доступа к элементу, а именно определения физического адреса по его индексу (порядковому номеру) в списке&lt;/li&gt;
&lt;li&gt;на поля-указатели (указатели на следующий и предыдущий элемент) расходуется дополнительная память (в массивах, например, указатели не нужны)&lt;/li&gt;
&lt;li&gt;некоторые операции со списками медленнее, чем с массивами, так как к произвольному элементу списка можно обратиться, только пройдя все предшествующие ему элементы&lt;/li&gt;
&lt;li&gt;соседние элементы списка могут быть распределены в памяти нелокально, что снизит эффективность кэширования данных в процессоре&lt;/li&gt;
&lt;li&gt;над связными списками гораздо труднее (хотя и, в принципе, возможно) производить параллельные векторные операции, такие, как вычисление суммы&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</content:encoded>
			<link>https://winger.ucoz.com/news/svjaznyj_spisok_zapolnenie_dvusvjaznogo_spiska_c/2017-05-29-29</link>
			<dc:creator>supoinclus</dc:creator>
			<guid>https://winger.ucoz.com/news/svjaznyj_spisok_zapolnenie_dvusvjaznogo_spiska_c/2017-05-29-29</guid>
			<pubDate>Mon, 29 May 2017 02:51:35 GMT</pubDate>
		</item>
		<item>
			<title>Шаблоны C++ справочник разработчика : Справочник языка C++</title>
			<description>Шаблоны C++ справочник разработчика 
 
Шаблоны C++ представляют собой активно развивающуюся часть языка программирования, предоставляющую программисту новые возможности быстрой разработки эффективных и надежных программ и повторного использования кода.</description>
			<content:encoded>&lt;div&gt;&lt;h3&gt;Шаблоны C++ справочник разработчика&lt;/h3&gt;
&lt;p&gt;&lt;br/&gt;
Шаблоны C++ представляют собой активно развивающуюся часть языка программирования, предоставляющую программисту новые возможности быстрой разработки эффективных и надежных программ и повторного использования кода. Данная книга, написанная в соавторстве теоретиком C++ и программистом-практиком с большим опытом, удачно сочетает строгость изложения и полноту освещения темы с вопросами практического использования шаблонов. В книге содержится масса разнообразного материала, относящегося к программированию с использованием шаблонов, в том числе материал, который даст опытным программистам возможность преодолеть современные ограничения в этой области. Книга предполагает наличие у читателя достаточно глубоких знаний языка C++; тем не менее стиль изложения обеспечивает доступность материала как для квалифицированных специалистов, так и для программистов среднего уровня.&lt;/p&gt;
&lt;p&gt;----------------------&lt;cut&amp;gt;----------------------&lt;/p&gt;
&lt;p&gt;Автор: Дэвид Вандевурд, Николай М. Джосаттис&lt;br/&gt;
Издательство: Вильямс&lt;br/&gt;
Год: 2003&lt;br/&gt;
Страниц: 544&lt;br/&gt;
Формат: DjVu&lt;br/&gt;
Качество: хорошее&lt;br/&gt;
Язык: русский&lt;br/&gt;
Размер: 5,69 Мб&lt;/p&gt;

&lt;p&gt;Скачать:&lt;br/&gt;&lt;/p&gt;
Необходимо зарегистрироваться чтобы прочитать текст или скачать файлы---&lt;br/&gt;
Далеко не все новости попадают на главную. Самое интересное, как всегда, остается за кадром. Все новости дока вы можете просмотреть перейдя по ссылке.&lt;br/&gt;
Чтобы иметь возможность получать новости в подборке надо всего лишь подключиться к доку.&lt;/div&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Справочник по функциям C/C++ - CodeNet&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;очень прикольный справочник, но хотя бы s закончить - было бы супер! 13. 
Аноним ... И ещё для функций C++ Builder подобный справочник нужен.&lt;br&gt;http://www.codenet.ru/progr/cpp/spr/&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</content:encoded>
			<link>https://winger.ucoz.com/news/shablony_c_spravochnik_razrabotchika_spravochnik_jazyka_c/2017-04-30-176</link>
			<dc:creator>supoinclus</dc:creator>
			<guid>https://winger.ucoz.com/news/shablony_c_spravochnik_razrabotchika_spravochnik_jazyka_c/2017-04-30-176</guid>
			<pubDate>Sun, 30 Apr 2017 07:23:51 GMT</pubDate>
		</item>
		<item>
			<title>Ая версия : Справочник языка с++</title>
			<description>Общие положения: 
 
 Комментарии на 3DNews.ru доступны всем желающим старше 18 лет. Для того, чтобы принять участие в обсуждении материалов, необходимо авторизоваться с помощью аккаунтов одной из социальных сетей и других сторонних сервисов; 
 Комментарии на 3DNews.</description>
			<content:encoded>&lt;div&gt;&lt;strong&gt;Общие положения:&lt;/strong&gt;&lt;br/&gt;
&lt;ol&gt;
&lt;li&gt;Комментарии на 3DNews.ru доступны всем желающим старше 18 лет. Для того, чтобы принять участие в обсуждении материалов, необходимо авторизоваться с помощью аккаунтов одной из социальных сетей и других сторонних сервисов;&lt;/li&gt;
&lt;li&gt;Комментарии на 3DNews.ru премодерируемы, за исключением сообщений, в которых имеются ссылки и прикреплённые изображения. Информация во всех прочих комментариях предварительно не просматривается и не редактируется, но администрация оставляет за собой право сделать это позднее;&lt;/li&gt;
&lt;li&gt;В отдельных случаях может быть введён режим премодерации всех комментариев, либо же полный запрет комментирования;
&lt;/li&gt;&lt;li&gt;Все комментарии отражают только мнения их авторов;&lt;/li&gt;
&lt;li&gt;За порядком в комментариях следят модераторы. Они имеют право редактировать и удалять сообщения, а также банить пользователей без уведомления и объяснения причин;&lt;/li&gt;
&lt;li&gt;Любые вопросы и пожелания относительно комментариев следует направлять на comments@3dnews.ru. В письме следует указать свой ник, используемый аккаунт социальной сети или другого стороннего сервиса, URL материала и ссылку на комментарий и/или его содержание. Письмо следует отправлять с адреса электронной почты, который привязан к аккаунту. Письма, не соответствующие этим рекомендациям, а также письма пользователей, неоднократно нарушивших правила комментирования, не рассматриваются;&lt;/li&gt;
&lt;li&gt;Сообщения об ошибках, опечатках, недочётах, а также любые другие предложения по улучшению качества материала следует отправлять с помощью системы Orphus (выделите спорную часть материала мышью и нажмите CTRL+ENTER) или же на адрес электронной почты автора или редактора соответствующего раздела (см. раздел Контакты). Комментарии с подобными сообщениями могут быть приняты к сведению редакцией, но будут удалены;&lt;/li&gt;
&lt;li&gt;Правила могут быть изменены или дополнены без специального уведомления пользователей.&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;&lt;strong&gt;В комментариях на 3DNews.ru запрещены:&lt;/strong&gt;&lt;br/&gt;
&lt;ol&gt;
&lt;li&gt;Использование слов с матерными корнями и их производных, а также визуально или по смыслу похожих на них. Обращаем особое внимание на то, что замена символов или любые другие манипуляции с текстом, в результате которых он может быть воспринят, как содержащий мат, также запрещены. Это же касается не только текста, но и любых других материалов, а также ссылок на них;
&lt;/li&gt;&lt;li&gt;Злоупотребление грубыми и просторечными словами и выражениями, а также жаргонизмами и сленгом;&lt;/li&gt;
&lt;li&gt;Спам, реклама и антиреклама в любом проявлении;&lt;/li&gt;
&lt;li&gt;Агрессия, угрозы, обвинения и оскорбления в любом виде в адрес редакции и её сотрудников, других читателей, отдельных граждан или групп граждан, объединенных неким признаком, а также просто неуважительное отношение к указанным лицам;
&lt;/li&gt;&lt;li&gt;Призывы к насилию, а также одобрение любых действий, в результате которых может быть нанесён физический или моральный вред отдельным гражданам или группам граждан, в том числе с летальным исходом;&lt;/li&gt;
&lt;li&gt;Материалы и ссылки на материалы экстремистского, политического, порнографического и религиозного характера, а также материалы и ссылки на материалы, пропагандирующие терроризм, употребление/изготовление наркотических/взрывчатых и других запрещённых веществ, самоубийства и педофилию, либо же оправдывающие их;&lt;/li&gt;
&lt;li&gt;Троллинг, флейм, флуд, боты, кибермоббинг, фишинг;&lt;/li&gt;
&lt;li&gt;Попытки обхода системы фильтрации;&lt;/li&gt;
&lt;li&gt;Любой контент, не относящийся к теме материала, на странице которого доступно обсуждение;&lt;/li&gt;
&lt;li&gt;Материалы и ссылки на материалы, нарушающие или позволяющие нарушить чужую интеллектуальную собственность;&lt;/li&gt;
&lt;li&gt;Размещение сторонних материалов без указания ссылки на первоисточник, включая любые некорректные цитирования или заимствования, либо же их компиляцию;&lt;/li&gt;
&lt;li&gt;Выдавать себя за другое лицо или предоставлять неверные сведения о себе, а также иными способами вводить в заблуждение других читателей, модераторов и сотрудников редакции;&lt;/li&gt;
&lt;li&gt;Материалы и ссылки на материалы, нарушающие чью-либо конфиденциальность, включая персональные данные, а также любые сведения и сообщения, порочащие честь, достоинство или деловую репутацию граждан и организаций;&lt;/li&gt;
&lt;li&gt;Всё, что редакция сочтёт неподходящим контентом, а также любые другие материалы или ссылки на них, нарушающие законы и подзаконные акты РФ, либо же запрещённые к распространению на территории РФ;&lt;/li&gt;
&lt;li&gt;Создание мультиаккаунтов, если основной аккаунт забанен, а также использование сервисов временных e-mail при регистрации аккаунта;&lt;/li&gt;
&lt;li&gt;Использование аккаунтов сторонних сервисов, которые были заблокированы этими сервисами или в которых наблюдается подозрительная активность;&lt;/li&gt;
&lt;li&gt;Использование аккаунтов, для которых не указан и/или не подтверждён адрес электронной почты;&lt;/li&gt;
&lt;li&gt;Грубые и регулярные нарушения норм и правил русского языка;&lt;/li&gt;
&lt;li&gt;Обсуждение действий модераторов;&lt;/li&gt;
&lt;li&gt;Любые действия, способные нарушить нормальную работу, функциональность или внешний вид сайта или его отдельных частей, а также любого другого ПО или оборудования сайта и его пользователей или иных систем, в том числе сторонних. Материалы и ссылки на материалы, описывающие любые подобные действия или делающие их возможными;&lt;/li&gt;
&lt;li&gt;Нарушение перечисленных выше правил при регистрации и указании ника;&lt;/li&gt;
&lt;li&gt;Использование транслита.&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;Если пользователь, по мнению модераторов или сотрудников редакции, нарушает любое из вышеперечисленных правил, то его аккаунт и/или IP-адрес банится, а все его сообщения удаляются. Также могут удаляться ветки комментариев. В исключительных случаях после бана удаляются лишь некоторые комментарии. Редакция оставляет за собой право принимать любые меры, находящиеся в ее распоряжении и в рамках законодательства РФ, в отношении пользователей, неоднократно нарушивших любое из вышеперечисленных правил.&lt;/div&gt;</content:encoded>
			<link>https://winger.ucoz.com/news/aja_versija_spravochnik_jazyka_s/2017-04-20-99</link>
			<dc:creator>supoinclus</dc:creator>
			<guid>https://winger.ucoz.com/news/aja_versija_spravochnik_jazyka_s/2017-04-20-99</guid>
			<pubDate>Thu, 20 Apr 2017 05:17:50 GMT</pubDate>
		</item>
		<item>
			<title>Презентация на тему: &quot;Аппендицит Библиотеки. Стандартная библиотека C (libc) POSIX-совместимые методы работы с ОС Стандартная библиотека C++</title>
			<description>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_1.jpg&quot; width=150px&gt;&lt;/td&gt;&lt;td&gt;Слайд 1 Аппендицит Библиотеки Слайд 2 Стандартная библиотека C (libc) POSIX-совместимые методы работы с ОС Стандартная библиотека C++ (STL) Шаблонные контейнеры и алгоритмы.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
			<content:encoded>&lt;div&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;li&gt; &lt;h5&gt;Слайд 1&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_1.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Аппендицит Библиотеки&quot;/&gt; Аппендицит Библиотеки &lt;h5&gt;Слайд 2&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_2.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Стандартная библиотека C (libc) POSIX-совместимые методы работы с ОС Стандартная библиотека C++ (STL) Шаблонные контейнеры и алгоритмы. Пространство и&quot;/&gt; Стандартная библиотека C (libc) POSIX-совместимые методы работы с ОС Стандартная библиотека C++ (STL) Шаблонные контейнеры и алгоритмы. Пространство имен std WinApi Библиотеки для работы с объектами операционной системы WIndows Дополнительные библиотеки ATL, WTL Нестандартные библиотеки Boost, Blitz, wxWidgets, QT, GTK+ и т.п. &lt;h5&gt;Слайд 3&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_3.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Стандартная библиотека С - libc&quot;/&gt; Стандартная библиотека С - libc &lt;h5&gt;Слайд 4&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_4.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Модули libc assert Диагностика errno Коды ошибок ctype Классификация символов limits Пределы целых чисел float Пределы вещественных чисел locale Языко&quot;/&gt; Модули libc assert Диагностика errno Коды ошибок ctype Классификация символов limits Пределы целых чисел float Пределы вещественных чисел locale Языковые настройки math Математические функции signal Сигналы и исключительные ситуации stdarg Переменное число аргументов stddef Вспомогательные макросы stdio Ввод-вывод stdlib Полезные функции string Функции для работы с С-строками time Дата и время &lt;h5&gt;Слайд 5&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_5.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Диагностика - assert.h Диагностика состояний assert (выражение ) проверяет выражение на истинность. Если выражение истинно, то ничего не происходит Ес&quot;/&gt; Диагностика - assert.h Диагностика состояний assert (выражение ) проверяет выражение на истинность. Если выражение истинно, то ничего не происходит Если выражение ложно, то оно (вместе с именем файла и номером строки) выводится в stderr, после чего программа завершается Пример использования int f ( int const * u ) { assert ( u != 0 ); return *u ; } void main () { int c = 0 ; int a = f ( &amp;amp;c ); int b = f ( NULL ); } int f ( int const * u ) { assert ( u != 0 ); return *u ; } void main () { int c = 0 ; int a = f ( &amp;amp;c ); int b = f ( NULL ); } &lt;h5&gt;Слайд 6&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_6.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Классификация символов – ctype.h Классификация Проверка принадлежности символа к той или иной категории Конвертация Преобразование регистров (заглавны&quot;/&gt; Классификация символов – ctype.h Классификация Проверка принадлежности символа к той или иной категории Конвертация Преобразование регистров (заглавных в строчные и наоборот) Имя функцииАргумент является…Имя функцииАргумент является… isalpha буквой iscntrl управляющим символом isdigit цифрой isgraph графическим isxdigit шестнадцатеричной цифрой ispunct графическим, но не alnum isalnum цифрой или буквой isprint печатаемым islower буквой в нижнем регистре isspace пробельным isupper буквой в верхнем регистре Имя функцииДействие tolower конвертирует символ в нижний регистр, если возможно toupper конвертирует символ в верхний регистр, если возможно &lt;h5&gt;Слайд 7&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_7.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Языковые функции - locale.h Информация о локализации Позволяет управлять данными о локали, т.е. набором знаний об используемых единицах измерений, час&quot;/&gt; Языковые функции - locale.h Информация о локализации Позволяет управлять данными о локали, т.е. набором знаний об используемых единицах измерений, часовых поясах, специальных символах, языковых символах и т.п. Функция setlocale Устанавливает текущую локаль Функция localeconv Обеспечивает доступ к текущей локали &lt;h5&gt;Слайд 8&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_8.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Математические функции - math.h Тригонометрия Тригонометрические функции для углов в радианах Вычисления Имя функцииДействиеИмя функцииДействие sin си&quot;/&gt; Математические функции - math.h Тригонометрия Тригонометрические функции для углов в радианах Вычисления Имя функцииДействиеИмя функцииДействие sin синус asin арксинус cos косинус acos арккосинус tan тангенс atan арктангенс sinh гиперболический синус atan2 арктангенс по катетам cosh гиперболический косинус Имя функцииДействиеИмя функцииДействие ceil округление до ближайшего большего floor округление до ближайшего меньшего frexp извлечение мантиссы и степени ldexp умножение на степень двойки log натуральный логарифм exp экспонента log10 десятичный логарифм pow целая степень sqrt квадратный корень modf целая и дробная части fabs абсолютное значение (модуль) fmod частное и остаток от деления &lt;h5&gt;Слайд 9&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_9.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Полезные функции - stdlib.h Макросы минимум и максимум Макросы длин _MAX_PATH, _MAX_EXT, _MAX_DIR, _MAX_DRIVE Функции принудительного завершения exit,&quot;/&gt; Полезные функции - stdlib.h Макросы минимум и максимум Макросы длин _MAX_PATH, _MAX_EXT, _MAX_DIR, _MAX_DRIVE Функции принудительного завершения exit, abort, atexit Вспомогательные функции abs, div, qsort, getenv, itoa, atoi Функции выделения памяти calloc, malloc, realloc, free Функции генерации случайных чисел srand, rand #define __max(a,b) (((a) &amp;gt; (b)) ? (a) : (b)) #define __min(a,b) (((a) (b)) ? (a) : (b)) #define __min(a,b) (((a) &lt;h5&gt;Слайд 10&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_10.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Память и строки - string.h Функции работы с памятью Функции работы со строками Имя функцииДействие void* memset (void*, int val, size_t size) Заполнен&quot;/&gt; Память и строки - string.h Функции работы с памятью Функции работы со строками Имя функцииДействие void* memset (void*, int val, size_t size) Заполнение памяти void* memcpy (void* dst, void const* src, size_t size) Копирование памяти int memcmp (void const* dst, void const* src, size_t size) Сравнение памяти void const* memchr (void const*, int val, size_t size) Поиск в памяти Имя функцииДействиеИмя функцииДействие strset Заполнение строки strdup Дублирование строки strcpy Копирование строки strcat Конкатенация строк strcmp Сравнение строк stricmp Безрегистровое сравнение strchr Поиск символа strrchr Поиск символа с конца strlen Длина строки strnlen Длина строки с ограничением strcoll Сравнение строк (с локалью) stricoll Безрегистровое сравнение (с локалью) strspn Префикс из набора символов strrev Разворот строки strtok Разбиение на лексемы strstr Поиск подстроки &lt;h5&gt;Слайд 11&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_11.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Ввод/вывод - stdio.h Работа с файлами fopen, fclose, feof, ferror, fflush Текстовый ввод/вывод fprintf, fscanf fgetc, fgets, fputs Бинарный ввод/вывод&quot;/&gt; Ввод/вывод - stdio.h Работа с файлами fopen, fclose, feof, ferror, fflush Текстовый ввод/вывод fprintf, fscanf fgetc, fgets, fputs Бинарный ввод/вывод fread, fwrite Позиционирование fseek, ftell Прочее remove, rename &lt;h5&gt;Слайд 12&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_12.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Стандартная библиотека С++&quot;/&gt; Стандартная библиотека С++ &lt;h5&gt;Слайд 13&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_13.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Состав библиотеки Стандартная библиотека C Все методы стандартных библиотек помещены в пространство std Все заголовочные файлы переименованы с префикс&quot;/&gt; Состав библиотеки Стандартная библиотека C Все методы стандартных библиотек помещены в пространство std Все заголовочные файлы переименованы с префиксом «с» и без расширения. Например стал STL Стандартная библиотека шаблонов Содержит основные контейнеры и алгоритмы для работы с ними &lt;h5&gt;Слайд 14&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_14.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Standard Template Library Контейнер Хранение набора объектов в памяти Итератор Механизм перечисления данных в контейнере Алгоритм Способы обработки и &quot;/&gt; Standard Template Library Контейнер Хранение набора объектов в памяти Итератор Механизм перечисления данных в контейнере Алгоритм Способы обработки и преобразования данных в контейнерах Адаптер Надстройка над контейнером Функтор Сокрытие функции в объекте, связывание &lt;h5&gt;Слайд 15&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_15.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Популярные контейнеры Линейные контейнеры и адапторы vector, list, deque, stack, queue, priority_queue Ассоциативные контейнеры map, set, multimap, mu&quot;/&gt; Популярные контейнеры Линейные контейнеры и адапторы vector, list, deque, stack, queue, priority_queue Ассоциативные контейнеры map, set, multimap, multiset Строки string, wstring Потоковые контейнеры ifstream, ofstream, stringstream &lt;h5&gt;Слайд 16&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_16.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Потоковый ввод-вывод в STL Объекты файлов ifstream, ofstream Предопределенные объекты std::cin, std::cout, std::cerr, std::endl Флаги инициализации Оп&quot;/&gt; Потоковый ввод-вывод в STL Объекты файлов ifstream, ofstream Предопределенные объекты std::cin, std::cout, std::cerr, std::endl Флаги инициализации Операции чтения/записи Операторы &amp;gt; Пользовательские операторы Перегрузка операторов &amp;gt; &lt;h5&gt;Слайд 17&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_17.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Средства WInApi&quot;/&gt; Средства WInApi &lt;h5&gt;Слайд 18&lt;/h5&gt; &lt;img src=&quot;http://how-use.com/images/4/8/prezentatsija-na-temu-appenditsit-b_18.jpg&quot; width=&quot;800&quot; align=&quot;left&quot; alt=&quot;Ввод/вывод средствами WinAPI Объекты ядра Windows Дескрипторы HANDLE Метод CloseHandle Метод CreateFile Метод ReadFile Метод WriteFile&quot;/&gt; Ввод/вывод средствами WinAPI Объекты ядра Windows Дескрипторы HANDLE Метод CloseHandle Метод CreateFile Метод ReadFile Метод WriteFile &lt;/li&gt;
&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;http://www.myshared.ru&lt;/div&gt;</content:encoded>
			<link>https://winger.ucoz.com/news/prezentacija_na_temu_appendicit_biblioteki_standartnaja_biblioteka_c_libc_posix_sovmestimye_metody_raboty_s_os_standartnaja_biblioteka_c/2017-04-19-191</link>
			<dc:creator>supoinclus</dc:creator>
			<guid>https://winger.ucoz.com/news/prezentacija_na_temu_appendicit_biblioteki_standartnaja_biblioteka_c_libc_posix_sovmestimye_metody_raboty_s_os_standartnaja_biblioteka_c/2017-04-19-191</guid>
			<pubDate>Wed, 19 Apr 2017 15:24:13 GMT</pubDate>
		</item>
	</channel>
</rss>