Как стать автором
Поиск
Написать публикацию
Обновить
144.5

C *

Типизированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Расширяем контекстное меню кнопки «Пуск» в Windows 8.1

Время на прочтение5 мин
Количество просмотров31K


В этой статье мне хотелось бы рассказать о своем опыте расширения Windows Explorer, если конкретнее, контекстного меню, называемого «Power User Menu». Не скажу, что очень нуждаюсь в старом представлении меню кнопки «Пуск», но все таки хотелось бы иметь возможность быстрого и структурированного доступа к основным функциям необходимым в работе. Power User Menu можно вызвать двумя способами: 1. Щелкнуть правой кнопкой мыши на кнопке «Пуск». 2. Нажать комбинацию клавиш Windows Key + X. Корпорация Майкрософт предоставила возможность редактирования этого меню, однако эта возможность достаточно ограниченна и не позволяет создавать иерархию меню, пункты с пиктограммами, и поддерживает только ярлыки, да и то не всех типов. Для реализации описываемого функционала мы выполним dll инъекцию в процесс Windows Explorer, а так же осуществим перехват api вызовов управляющих работой контекстного меню. В качестве подопытной операционной системы будем использовать Windows 8.1 x64.
Читать дальше →

Реализация мьютекса вне ОС на примере микроконтроллера AVR и шины TWI

Время на прочтение20 мин
Количество просмотров12K
Решил однажды для себя я соорудить погодную станцию. Датчики там разные, в том числе на шине I2C. И как годится, обычно вначале, сделал все на флагах ожидания. Но путь настоящего джедая иной, и было решено все повесить на прерывания. Вот тут и начался геморрой. Проблема, с которой я столкнулся это обработка нескольких подряд идущих запросов. Например датчик давления BMP085 для дальнейшей работы с ним, требует вытянуть из его EEPROM 11 калибровочных констант:


О том как я пришел к решению и последовательность хода мыслей изложены ниже.
Осторожно! Много текста, кода и картинок

Raytracing render на C

Время на прочтение12 мин
Количество просмотров76K
Имея опыт разработки на одном из высокоуровневых языков программирования, а также интерес к задачам из различных областей информатики, я наконец нашел возможность овладеть еще одним инструментом — языком программирования С. Исходя из собственного опыта — знания лучше усваиваются, если применять их для решения практических задач. Поэтому, было решено реализовать с нуля Ray tracing рендер (поскольку увлекаюсь компьютерной графикой ещё со школьных времен).

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


Читать дальше →

Краткое введение в GNU autoconf

Время на прочтение5 мин
Количество просмотров52K
I saw a book entitled «Die GNU Autotools» and I thought «My feelings exactly». Turns out the book was in German1. ©

Можно долго рассуждать о несовершенстве сего инструментария, о превосходстве CMake/QMake/подставьте_вашу_любимую систему сборки, но проекты, использующие autotools, окружают нас повсюду, и стоит как минимум знать, что это за зверь и с чем его едят, чтобы при попытке сделать, а то и отправить разработчикам патч, не править автосгенерированные файлы, чем я не так давно занимался.

Так же следует понимать, что именно autoconf системой сборки не является вообще, это система конфигурации перед сборкой. autoconf почему-то многие считают неким монстром, «проверяющим 15 давно несуществующих версий компилятора Fortran, а потом поддержку ключей этими компиляторами», что не совсем верно, ибо оно делает ровно то, что ему скажут. Другое дело, что многие просто копипастят его конфиг из проекта в проект, в итоге результат получается ужасающим.

В данной статье (планируется всё же осилить цикл) я хотел бы рассказать про autoconf, зачем он нужен и как его использовать.
Читать дальше →

Определение MIME-типов

Время на прочтение3 мин
Количество просмотров62K
Привет, хабр!

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

На изучение данного вопроса меня натолкнула следующая задача: определение MIME-типа файла, находящегося на smb-сервере. Лучшее, что я придумал — копировать кусок файла на локальную машину и потом, по этой части пытаться распознать его MIME-тип.



Для начала расскажу, что я нагуглил и почему мне это не понравилось:

Читать дальше →

Пишем регулировщик подсветки дисплея ноутбука для Gnu\Linux

Время на прочтение4 мин
Количество просмотров9.9K
Всем привет. Однажды мне захотелось собрать Gentoo на своем ноутбуке Samsung n143. После ночи компиляции дело дошло до сборки графической оболочки. Выбрал привычную для меня KDE4, собрал, установил. Всё оборудование и Fn-keys работали на отлично кроме Fn-клавиш регулировки уровня подсветки дисплея (и программная регулировка в KDE System Settings). Пытался решить проблему установкой пакетов samsung-backlight и samsug-tools, но ничего не получилось.
Те кому интересно как я решил эту проблему, прошу под кат.
Читать дальше →

Мир опечаток и Copy-Paste

Время на прочтение1 мин
Количество просмотров19K
Программисты допускают невероятное количество опечаток, простых логических ляпов и делают ошибки благодаря Copy-Paste. Приглашаю отпробовать их. Приятного аппетита.
Баги
Программисты часто думают, что ошибки, отнимающие больше всего времени очень сложные и коварные. А простые ошибки они не делают.
Читать дальше →

Разбираемся в С, изучая ассемблер

Время на прочтение11 мин
Количество просмотров93K
Перевод статьи Дэвида Альберта — Understanding C by learning assembly.

В прошлый раз Аллан О’Доннелл рассказывал о том, как изучать С используя GDB. Сегодня же я хочу показать, как использование GDB может помочь в понимании ассемблера.

Уровни абстракции — отличные инструменты для создания вещей, но иногда они могут стать преградой на пути обучения. Цель этого поста — убедить вас, что для твердого понимания C нужно также хорошо понимать ассемблерный код, который генерирует компилятор. Я сделаю это на примере дизассемблирования и разбора простой программы на С с помощью GDB, а затем мы используем GDB и приобретенные знания ассемблера для изучения того, как устроены статические локальные переменные в С.
Читать дальше →

Создание QR-кодов на C/C++

Время на прочтение4 мин
Количество просмотров38K
image
Это простой пример использования библиотеки libqrencode от FUKUCHI Kentaro для генерации bmp-файла с QR-кодом для какого-то текста. В интернете полно ссылок на эту библиотеку, но ни одного примера ее использования. libqrencode поддерживает QR Code model 2, описанный в JIS (Japanese Industrial Standards) X0510:2004 или ISO/IEC 18004. В настоящее время не поддерживаются режимы ECI и FNC1 QR Code model 1.
Читать дальше →

Изучаем С используя GDB

Время на прочтение6 мин
Количество просмотров109K
Перевод статьи Аллана О’Доннелла Learning C with GDB.

Исходя из особенностей таких высокоуровневых языков, как Ruby, Scheme или Haskell, изучение C может быть сложной задачей. В придачу к преодолению таких низкоуровневых особенностей C, как ручное управление памятью и указатели, вы еще должны обходиться без REPL. Как только Вы привыкнете к исследовательскому программированию в REPL, иметь дело с циклом написал-скомпилировал-запустил будет для Вас небольшим разочарованием.

Недавно мне пришло в голову, что я мог бы использовать GDB как псевдо-REPL для C. Я поэкспериментировал, используя GDB как инструмент для изучения языка, а не просто для отладки, и оказалось, что это очень весело.
Читать дальше →

Doom 3 BFG — обзор исходного кода: Многопоточность (часть 2 из 4)

Время на прочтение6 мин
Количество просмотров42K
Часть 1: Введение
Часть 2: Многопоточность
Часть 3: Рендеринг (Прим. пер. — в процессе перевода)
Часть 4: Doom classic — интеграция (Прим. пер. — в процессе перевода)

Движок для Doom III был написан в период с 2000 по 2004 год, в то время, когда большинство ПК были однопроцессорными. Хотя архитектура движка idTech4 разрабатывалась с учетом поддержки SMP, это закончилось тем, что поддержка многопоточности делалась в последнюю минуту (см. интревью с Джоном Кармаком).
Читать дальше →

Самая маленькая сбойная программа на C

Время на прочтение2 мин
Количество просмотров112K
Шведский студент Йеспер Эквист (Jesper Öqvist) получил в универе домашнее задание: написать самую маленькую программу C, которая вылетает с ошибкой (segfault, SIGFPE). Обычно студенты в таких ситуациях используют деление на ноль.

int main()
{
    return 1/0;
}

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

int main()
{
    i=1/0;
}
Читать дальше →

DOOM 3 BFG — обзор исходного кода: введение (часть 1 из 4)

Время на прочтение6 мин
Количество просмотров74K
Часть 1: Введение.
Часть 2: Многопоточность
Часть 3: Рендеринг (Прим. пер. — в процессе перевода)
Часть 4: Doom classic — интеграция (Прим. пер. — в процессе перевода)

26 ноября 2012 ID Software выпустила исходный код Doom 3 BFG edition (всего через месяц после появления игры на прилавках магазинов). Движок idTech4, которому уже почти 10 лет, был обновлен решениями, используемыми в idTech 5 (Rage — первая игра на этом движке), и с его исходным кодом ознакомиться было очень интересно.

Я бы назвал движок «idTech4 улучшенный», т.к. по сути это idTech4, но с использованием элементов idTech5:
  • Систему управления потоками (Threading system)
  • Звуковую систему (Sound system)
  • Систему управления ресурсами (Resources system)

Подробности

Ближайшие события

Первый компилятор C от Денниса Ритчи — на Github

Время на прочтение1 мин
Количество просмотров61K

Компьютер DEC с носителем DECtape

На Github выложили last1120c и prestruct-c — ранние версии самого первого компилятора С в истории. Код написан самим Деннисом Ритчи в 1972-1973 гг.

Компиляторы найдены несколько лет назад на старой магнитной ленте DECtape, вставленной в антикварный компьютер VAX производства компании DEC.
Читать дальше →

Microsoft исправила уязвимость с синим экраном

Время на прочтение1 мин
Количество просмотров39K
Два дня назад я написал статью Как уронить Windows шестью строчками кода.
Через 2 дня вышло обновление безопасности Microsoft: technet.microsoft.com/en-us/security/bulletin/ms13-046.
После установки обновления уязвимость исправили, система перестала вылетать в синий экран. Довольно оперативненько исправили: всего-то за два дня (хотя оригинальная статья появилась 3 месяца назад).

Методом исключения был выявлен пакет обновления, который исправляет уязвимость. На сайте Microsoft сказано, что он исправляет три уязвимости в ядре системы.
Про уязвимость, которой посвящен топик, Microsoft на сайте сказано следующее:

Win32k Buffer Overflow Vulnerability — CVE-2013-1333
An elevation of privilege vulnerability exists when the Windows kernel-mode driver improperly handles objects in memory. An attacker who successfully exploited this vulnerability could cause system instability.


Видимо, представители Microsoft тоже читают Хабрахабр.

Хак синтаксиса PHP

Время на прочтение5 мин
Количество просмотров29K
Вы когда-нибудь задумывались о том, как расширить ядро PHP? Что нужно для того, чтобы создать новое ключевое слово или даже разработать новый синтаксис? Если у вас есть базовые знания языка C, то проблем с созданием небольших изменений возникнуть не должно. Да, я понимаю, что это может быть немного бессмысленно, но неважно — забавно ведь.

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

<?php
class ClassName {}

Мы можем упростить синтаксис и заменить фигурные скобки на точку с запятой.

<?php
class ClassName;

Если вы попытаетесь выполнить этот код, то он, очевидно, выдаст ошибку. Не проблема, мы можем это исправить.
Читать дальше →

Как уронить Windows шестью строчками кода

Время на прочтение3 мин
Количество просмотров267K
См. также: Microsoft исправила уязвимость с синим экраном

Однажды один знакомый рассказал мне про одну уязвимость в Windows. А именно из-за нее можно легко вызвать синий экран смерти шестью строчками кода на Си. Причем программа не требует никаких прав администратора и вызывает только одну функцию масштабирования окна.


Читать дальше →

Единорог вновь готов к общению с Си++ программистами

Время на прочтение2 мин
Количество просмотров29K
Единорог вернулся
Приглашаю Си/Си++ программистов присоединиться к блогу PVS-Studio. Вы узнаете о разных интересных вещах из мира Си/Си++ и о том, кто, где и как программирует. Расскажу немного о том, что не было опубликовано на Хабре за время нашего отсутствия здесь.
Читать дальше →

«Вычислительная техника и её применение» (ноябрь 1990)

Время на прочтение10 мин
Количество просмотров42K
Дома у меня, как оказалось, сохранилась небольшая стопка потёртых компьютерных журналов, от 10-летней давности и старее. Погружение в эти страницы — не только приятная ностальгия, но и весьма интересный инсайт в ценности и чаяния того времени. Кроме того, хотелось бы сохранить всю эту информацию в более долговечной форме, чем бумажные страницы.

Я собираюсь выложить здесь подборку материалов из этих журналов, с указанием издания и авторов; поскольку до сих пор все эти тексты не существовали в цифровом виде, то НЛО вряд ли будет иметь ко мне претензии за копипаст.

Самый старый из сохранившихся номеров — "Вычислительная техника и её применение" за ноябрь 1990. Тема номера — Norton Commander. На обложке — три неопределённых компьютера с логотипами IBM, AT&T и Apple. Сзади — ещё один неопределённый компьютер с некой САПР на экране, цитата В.М.Глушкова, и адрес редакции — «СССР, Москва, Центр, проезд Серова, 4» — даже без индекса. Цена 20 коп.



Авторы выпуска: (интересно, живут ли они на Хабре?)

КЛЯУС Сергей Витальевич — научный сотрудник, занимается разработкой программного обеспечения АСУ, СУБД и систем передачи данных.

СЛОБОДЧУК Вячеслав Викторович — научный сотрудник, занимается исследованием и разработкой локальных вычислительных сетей.

ЖАРИКОВ Л.Н., СУХОРУКОВ Ф.Д. — программисты.
Читать дальше →

Автономная кроссплатформенная монолитная программа на Java

Время на прочтение21 мин
Количество просмотров63K
Я люблю desktop-приложения. Признаваться в этом нынче, похоже, стыднее, чем в связях с иностранной разведкой, но это так. Нет, это не значит, что я не люблю интернет-технологии. Более того, некоторые я не только уважаю, а даже более-менее знаю. Но, тем не менее, я скучаю по тем временам, когда программа писалась на одном компьютере, потом компилировалась и запускалась на других, разных компьютерах. Тогда везде (почти) была одна система — Windows с одной и той же API, почти не было проблем совместимости на уровне приложений, никто не материл разработчиков браузеров — все берегли нервы на разработчиков WinAPI, которые умудрялись создавать конфликты даже внутри нее одной. Но это я, конечно, иронизирую, а если серьезно — иногда и сейчас хочется написать просто desktop-приложение, да так, чтобы работало оно на всех популярных системах. Трудно? Если подумать и покопать, то не очень.

Еще я люблю языки высокого уровня с аккуратной архитектурой и строгой типизацией. Мои фавориты — Java и C#. Оба они предоставляют разработчику множество преимуществ по сравнению с C++, оба избавляют от ряда забот. Чем приходится платить? Тем, что таскаешь за собой тяжелую колоду, которая называется Oracle JVM, .NET или mono. Все три колоды весят сотни мегабайт и лицензию имеют такую, что каждый пользователь вынужден качать эту штуку сам, не путая при этом разрядность своего компьютера, а главное — программа на Java не может быть совместима со всеми версиями JVM разом, не так ли? И вот — мы приходим к тому, что просто скинуть программку другу (или миллиону друзей) и не заботиться о том, что она у него не запустится, не выходит. Приходится делать хитрые сетапы, вбивать костыли, и это я еще не упомянул .NET — однажды я видел у друга сразу 3 установленных версии, причем все три были нужны разным приложениям…

Стоп! А давайте напишем программу на Java, но так, чтобы она не требовала установки на машину какой-либо JVM, чтобы одним касанием собиралась под Windows, Linux и OS X и чтобы при этом занимала совсем чуть-чуть; так, чтобы никто даже не понял, что она написана, скажем, не на C. Невозможно? Совсем наоборот! (И нет, я имею в виду не gcj, который лишает Java всех ее прелестей. Рефлексия будет работать и даже сторонние jar вы сможете запускать).

Ну и как это сделать?

Вклад авторов