Проекты для практики программирования на c. Где новичку в программировании найти упражнения и идеи для проектов? Алгебра комплексных чисел

Новости 20.04.2019

С помощью open source проектов можно усовершенствовать свои навыки, исправляя чужие ошибки и создавая что-то новое. Можно найти проект, который будет полезен и для собственного бизнеса, например, в медицине или e-commerce. Кроме того, как практикующие программисты, один из лучших способов мотивировать себя на занятия программированием - это работа с open source проектами. Специально для читателей блога Geekbrains мы собрали список таких проектов из разных сфер деятельности:

Пакет программного обеспечения для работы с медицинскими изображениями. 3D Slicer доступен на нескольких платформах, в числе которых Windows, Linux и OS X.

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

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

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

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

Свободная операционная система типа Unix.

Офисный пакет для совместной разработки с функционалом, как у Microsoft Office или OpenOffice.org.

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

ПО для создания и управления обучающим аудио и видео контентом.

Мультиплатформенная система управления корпоративным контентом написанная на Java. Работает с несколькими базами данных (в том числе MySQL, Oracle, PostgreSQL, SQLLite, и другие), а также поддерживает несколько методов аутентификации.

Софт для создания частных и общественных облаков.

Сервис позволяет создавать опросы и делиться с контактами на сайте. Удобный способ собирать данные для их последующего анализа.

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

Проект создан силами Open Source сообщества и предназначен для обеспечения лучших решений для предприятий с помощью бизнес аналитики.
Основные области применения:

  • создание отчетов
  • анализ
  • сбор Данных
  • платформа бизнес-аналитики

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

Модульная open source система управления цифровыми данными.

Бесплатный софт для e-commerce.

Библиотека для быстрого фильтрования и сортировки больших коллекций - до 100000 элементов в браузере.

Языки c open source

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

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

Где найти больше open source проектов?

Один из самых крупных веб-сервисов для совместной разработки IT-проектов. Абсолютно бесплатен для open source проектов. Девиз сервиса “Social coding” можно перевести, как “Кодим вместе”.

Предназначен популяризовать open source проекты. С помощью инструментов, которые там предоставлены, разработчики создали мощное программное обеспечение в более чем 430,000 проектах; на ресурсе более 3,7 млн зарегистрированных пользователей. Популярный каталог объединяет более 41,8 млн клиентов с проектами open source и обслуживает более 4800000 скачиваний в день.

Цель Fossdroid - продвигать open source приложения на Android с помощью проекта F-Droid. Fossdroid берет свои данные из F-Droid и организует приложения в порядке, похожем на Google Play, с возможностью просмотра их по популярности.

Как узнать является ли ПО open source и каковы правила его использования?

Необходимо понимать, что не все open source проекты могут быть использованы в коммерческих целях или свободно модифицированы.Чтобы узнать, является ли ПО open source и каковы правила его использования, нужно посмотреть его лицензию . Обычно полный ее текст находится непосредственно в коде.

Я хочу попасть в команду С++ на работе. Их задача - писать CGI на С++ (главным образом, но не ограничиваясь ими). Я знаю базовый С++. Чтение списка в С++ book guide вопрос о том, что у меня есть три книги от друга (у меня на самом деле был первый).

  • Язык программирования С++ - Bjarne Stroustrup - для справки
  • С++ Шаблоны Полное руководство - Дэвид Вандевоорде/Николай М. Йосуттис
  • Современный дизайн С++ - Андрей Александреску

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

    Настройка, в которой я нуждаюсь. У меня есть Macbook и личная дрянная Ubuntu dev серверная машина. Я могу bootcamp установить любую ОС, если это необходимо.

    Можете ли вы также дать мне несколько советов о том, как начать писать CGI (или любой учебник)?

Большое спасибо.

5 ответов

Позвольте мне добавить к вашему списку материал для чтения; С++ FAQ Lite - это самый лучший ресурс для изучения входов и выходов С++. Это полезно как в качестве ссылки для старых таймеров, так и в качестве введения для новичков. Я бы настоятельно рекомендовал прочесть столько, сколько вы можете, и попробуйте небольшие примеры, демонстрирующие каждую функцию, упомянутую перед присоединением к реальному проекту.

Как только вы почувствуете себя немного комфортно на этом языке, я бы рекомендовал взглянуть на Github и посмотреть, есть ли проекты на С++ , которые нуждаются в некоторой помощи. Что касается образов, созданных компьютером или общего интерфейса шлюза, оба эти языка являются агностиками. Они могут быть написаны на любом языке программирования, хотя разные языки программирования будут иметь разные существующие библиотеки для их обработки. Я предлагаю вам прочитать по этому вопросу, чтобы лучше понять стандарт/алгоритмы (в зависимости от того, из какого из двух вы имели ввиду). После того, как вы более знакомы с предметом, вы должны лучше понять документацию соответствующих библиотек.

Что касается среды разработки, я нахожу, что Ubuntu является самым простым в настройке, потому что почти вся настройка может быть сведена к серии команд apt-get install . Например:

Sudo apt-get install build-essential

Независимо от того, какую ОС вы используете, вы, вероятно, захотите создать и запустить свой код в предсказуемой, воспроизводимой среде. Я должен также указать, что окружающая среда, которую вы разрабатываете, не обязательно должна быть такой же, как та, на которой вы действительно строите и запускаете свой код. Например, вы можете написать весь свой код в Mac OS X, но создайте и выполните свой код в контейнере Docker , который запускает Экземпляр Ubuntu с предустановленной, воспроизводимой конфигурацией сборки/запуска.

С точки зрения ресурсов для реализации CGI в С++ (и для другого кода), пожалуйста, просмотрите страницу

Лучший способ стать лучше на С++ - это писать код на С++. Начните с простого raytracer без каких-либо внешних зависимостей (просто напишите вывод в файл PPM).

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

Постройте это, когда у вас будет больше опыта. Вернитесь назад, отредактируйте свой код, добавьте более сложные функции, сторонние библиотеки (например, напишите выходной файл JPEG, начните использовать бит boost, например, умные указатели).

Промыть, повторить.

ответьте на заголовок вопроса:), предполагая С++ 03

И да, у вас хороший рецензент на вашей стороне, если вам нужно изучить хороший С++. Сохраните копию соответствующего стандартного файла (open-std.org)

Программа находит простые числа до тех пор, пока пользователь перестанет спрашивать. Реализации: Python №1 , Haskell , JavaScript , Java , , Python №2

Калькулятор для ипотеки

Вычислить месячные выплаты фиксированного срока в течение заданных N сроков с заданной процентной ставкой. Реализации:

Обмен-возврат

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

Перевод из двоичной системы в десятичную и обратно

Калькулятор

Сначала простой с базовыми операциями, потом можно добавить фичи. Реализации: Python , Haskell

Конвертер температуры, валюты, масс и т.д.

Будильник

Простые часы, которые играют звук после некоторого числа минут или часов или в определенное время.
Python , Java

Расстояние между городами

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

Валидатор кредитной карты

Берет номер кредитной карты от производителя (Visa, MasterCard, American Express, Discover) и проверяет на правильность номер (разберитесь, как кредитные карты используют контрольную сумму). Реализации: Haskell , Python , Java ,

Факториал числа

Решить с помощью циклов и отдельно с помощью рекурсии. n! = n * (n-1) * … * 1, 0! = 1. Реализации: Haskell , Python ,

Алгебра комплексных чисел

Показать сумму, умножение, сопряжение, отрицание в отдельных функциях (разность и деление могут быть сделаны путем использования нескольких уже написанных функций). Реализация: Haskell

Счастливые числа

Счастливое число определено следующим процессом. Начиная с некоторого положительного целого числа, замените число суммой квадратов его цифр и повторяйте процесс до тех пор, пока число не будет равным одному(на чем все и остановится) или оно будет циклиться бесконечно. Если цикл конечен, то изначальное число называется счастливым. Найдите первые 8 счастливых чисел. Реализации: Python , Haskell , Java , C++

Названия чисел

Показать как читается число на английском. Вы можете использовать уже существующую реализацию или написать свою, она должна поддерживать значения до одного миллиона или до максимально возможного целого значения в данном языке программирования, если оно меньше миллиона. По желанию: поддержка отрицательных чисел, нуля, чисел с плавающей запятой Реализации: Haskell , Python , , C++

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

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

Классические алгоритмы

Гипотеза Коллатца

Найдите число шагов, за которые получится единица, используя следующий процесс: берём любое натуральное число n больше единицы. Если оно чётное, то делим его на 2, а если нечётное, то умножаем на 3 и прибавляем 1. Реализации:
Python №1 , Java , JavaScript , Java №2 , , Java №3 ,

Сортировка

Реализовать два типа сортировочных алгоритмов: сортировка слиянием и сортировка простыми обменами. Реализации: , Python , , C++

Задача ближайшей пары

Задача ближайшей пары точек или задача ближайшей пары — это задача вычислительной геометрии: дается n точек в метрическом пространстве, найти пару точек, расстояние между которыми наименьшее. Реализации: Python №1 , Python №2

Решето Эратосфена

Решето Эратосфена — один из самых эффективных способов нахождения всех небольших простых чисел (ниже 10 миллионов). Реализации:
Python №1 ,
JavaScript ,
Python №2 , , Java ,
C++

Графы

Граф из связей

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

Эйлеров путь

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

Соединенный граф

Напишите программу, ввод которой представляет из себя граф и вывод представляет из себя отчет, в котором указано соединена ли каждая вершина или нет. Реализация: Python

Алгоритм Дейкстры

Напишите программу, которая будет находить короткий путь в графе, используя его вершины. Реализации:
Python

Структуры данных

Инвертированный индекс

Текст

Перевернуть строку

Вводится строка, и программа ее переворачивает и распечатывает на экран. Реализации:
Python №1 ,
Python №2 , Java №1 ,
Haskell ,
Python №3 ,
Java №2 ,
,
JavaScript №1 ,
Java №3 ,
Python №4 ,
JavaScript №2

Поросячья латынь

Это «тайный язык», представляющий собой зашифрованный английский. Чтобы сделать поросяче-латинское слово из английского, нужно первые согласные звуки в слове переместить в конец и прибавить ay (Например: «banana» превращается в anana-bay). Подробнее о правилах читайте в Википедии. Реализации:
Python №1 ,
Python №2 ,
Java №1 ,
Java №2 ,
,
Java №3 ,
Python №3

Счетчик гласных

Вводится строка, и программа считает количество гласных в тексте. Для усложнения задачи можно генерировать отчет о том, сколько раз какая гласная была найдена. Реализации:
Python №1 ,
Python №2 ,
Haskell ,
Java №1 ,
,
Java №2 ,
Python №3

Проверка на палиндром

Программа проверяет на то, что введенная строка является палиндромом (то есть читается слева направо так же, как и справа налево). Реализации:
Python №1 ,
Python №2 , Java ,
Haskell ,
Python №3 ,
,
Java

Счетчик слов в строке

Посчитать число слов в строке. Для усложнения задачи считать эти строчки и сгенерировать отчет. Реализации:
Python №1 ,
Python №2 , Java ,
Haskell

Текстовый редактор

Приложение в стиле блокнота, способное открыть, редактировать и сохранять текстовые документы. По желанию: добавить подсветку синтаксиса и другие фичи. Реализации:
Python ,
С++/QT

Генератор RSS ленты

Дается ссыка на ленту RSS/atom, извлечь все посты и распечатать на экран. Реализация:
Python

Стикеры

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

Проверка показателей индексов фондовой биржи

Программа, которая проверяет цены акций фондовой биржи для списка наименований акций, введенных пользователем. Пользователь может указать, насколько часто будут проверяться значения акций фондовой биржи. Если реализация в виде утилиты командной строки, покажите увеличилась ли цена акции или ушла вниз. По желанию: если реализация сделана с использованием графических интерфейсов, программа может показывать зеленую или красную стрелочку в зависимости от того, как изменилась цена акции. Реализации:
Python

Гостевая книга / журнал

Простое приложение, позволяющее людям добавлять комментарии или добавлять записи в журнал. В нем есть возможность добавлять или закрывать комментарии, а также время добавления записи. По желанию: запустите приложение на такой облачной платформе как Google App Engine или Heroku или любой другой(если возможно).

Гороскоп

Программа проверяет ваш гороскоп на разных сайтах, посвященных этому и соединяет все прогнозы воедино для каждого дня. Реализации:
Python

Шифр Винежера / Вернама / Цезаря

Функции для шифрования и расшифровывания сообщения с данными. Затем отправьте их другу. Реализации:
Python ,
Java

Предложения для любого подарка

Ввести разные подарки для определенных людей. Когда пришло время для того, чтобы вручить подарок, программа сгенерирует произвольный из введенных. По желанию: предложить место, где их можно приобрести (возможно, ссылку на страницу в сервисе Amazon).

Конвертер из языка разметки Markdown в HTML

Переводит текст, отформатированный с помощью Markdown в файл HTML. Реализовать базовые теги такие, как p , strong , em и так далее. По желанию: реализовать все теги из документации к синтаксису Markdown . Реализация:
Python

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

Программа позволяет пользователю вводить текстовую строку и затем в отдельном поле регулярное выражение. После запуска программа должна выдать все подходящие под регулярное выражение строчки или флаг ошибки. Реализация:
Python

Сети

Программа FTP

Программа, осуществляющая пересылку файлов туда и обратно из удаленного веб-сервера. Реализация:

Монитор трафика

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

Сканер портов

Введите IP адрес и диапазон портов, в которых программа попробует найти открытые порты на данном компьютеров путем соединения с каждым из ним. При успешном соединении программа должна пометить порт как открытый. Реализации:
Python №1 ,
Python №2, Python №3 ,
Python №4

Проверка электронной почты (POP3 / IMAP)

Пользователь вводит различную информацию своего аккаунта, включая веб-сервер и IP, тип протокола (POP3 или IMAP) и приложение будет автоматически проверять почту каждый заданный интервал времени. Реализация:
Java

Инструмент поиска для сетевого протокола Whois

Пользователь вводит IP и адрес хоста и программа просматривает информацию через сетевой протокол Whois и выводит регистрационные данные. Реализация:
Python

Проверка сайта в установленное время

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

Классы

Продуктовый инвентарь

Создайте приложение, которое позволяет вести учет инвентаря продуктов. Создайте класс Product, элементами класса будут цена, номер, количество. Затем создайте класс Inventory, ведущий учет различных продуктов и который считает общую стоимость инвентаря. Реализации:
Python №1 ,
Ruby ,
JavaScript ,
,
Python №2

Система бронирования отелей / авиабилетов

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

Bank Account Manager

Создайте класс Account, который будет абстрактным классом для трех классов CheckingAccount(контокоррентный счет), SavingsAccount (сберегательный вклад) и BusinessAccount (счет, возникающий при создании бизнеса). Управляйте кредитами и дебитами с этих счетов в стиле программы для банкомата. Реализация:
Python

Расписание приема врача

Создайте класс Patient и класс Doctor. Пусть доктор может принять несколько пациентов, установите расписание того, как доктор будет принимать 16 пациентов в течение 8 часового рабочего дня.

Менеджер рецептов

Создайте класс Recipe с ингридиентами и вставьте объекты данного типа в менеджер рецептов, которая их распределит по категориям(основные блюда и десерты) или по ингридиентам(курица, говядина и так далее)

Галерея изображений

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

Площадь и периметр фигуры

Создайте абстрактный класс Shape и затем создайте производные классы, такие как бриллиант, прямоугольник, круг, треугольник и так далее. Затем происходит перекрытие имен функций, ищущих площадь и периметр для каждого типа фигуры. Реализации:
Java ,
Python

Цветочный магазин с возможностью заказа

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

Создание древа семьи

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

Поточность

Создание индикатора процесса загрузки

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

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

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

Веб

Индексатор веб-страницы

Создайте приложение, которое соединяется с веб-сайтом, забирает оттуда все ссылки или изображения и сохраняет их в качестве списка. *По желанию: Организуйте проиндексированную информацию, удалите дублирующиеся данные. Залейте результаты в индекс-файл. * Реализации:
Python

Веб-браузер с вкладками

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

Доска для рисования онлайн

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

Получить атомное время из интернет-часов

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

Получить текущие данные о погоде

Получите актуальные погодные данные по почтовому индексу. По желанию: Попробуйте определить местоположение пользователя автоматически. Реализация:
Python

Авто-логин и автоматические действия по таймеру

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

Генератор электронных открыток

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

Система контент-менеджмента

Создайте собственную систему управления контентом (CMS) наподобие Joomla, Drupal, PHP Nuke и т.д. Начните с малого. По желанию: Разрешите добавление модулей/аддонов.

Доска объявлений (Форум)

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

CAPTCHA-генератор

Когда-нибудь видели изображения с цифрами и буквами, которые нужно ввести в форму регистрации на каком-нибудь онлайн-сервисе? Это нужно для фильтрации автоматической регистрации ботами и предотвращения спама. Попробуйте создать собственную капчу для онлайн-форм.

Файлы

Создание викторины

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

Файловый проводник

Создайте собственный небольшой файловый проводник для Windows. Добавьте ту функциональность, которую вам не хватало в обычном проводнике Windows или в Finder на Mac OS.

Утилита для сортировки Excel/CSV файлов

Читает записи в файле, сортирует их и записывает их обратно в файл. Позволяет выбрать различные варианты сортировки и сортировку по конкретному полю. Реализация:
Python

Создайте Zip-архиватор

Пользователь добавляет файлы из различных директорий, а программа архивирует их в zip-файл. По желанию: применить Примените современные алгоритмы сжатия. Начните с кода Хаффмана. Реализация:
Java

Генератор PDF файлов

Приложение, которое может читать текстовый файл, файл HTML или какой-либо другой файл и генерировать из него PDF. Отлично подходит для онлайн конвертеров, где пользователь загружает файл и программа возвращает PDF файл По желанию: запустить приложение в облачных сервисах, таких как Google App Engine или Heroku, если возможно.

Программа для теггирования Mp3

Изменяет и добавляет ID3v1-теги в MP3-файлы. Можете попробовать добавить обложку альбома в хедер MP3-файла, или другие ID3v2-теги.

Менеджер кода

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

Базы данных

Анализатор SQL-запросов

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

Инструмент удалённого соединения с SQL-сервером

Утилита, которая может выполнять запросы на удалённые сервера с локального компьютера посредством сети интернет. Утилита должна воспринимать удалённый хост, имя и пароль пользователя, выполнить запрос и вернуть результаты. Реализация:
Python

Генератор отчётов

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

Планировщик событий и календарь

Сделайте приложение, которое позволит пользователю заносить дату и время события, а также кое-какие заметки в календарь. Пользователь должен иметь возможность просмотреть календарь или найти определенное событие. По желанию: добавить возможность создавать повторяющиеся события (каждый день, неделю, месяц, год и т.д.)

Домашняя бухгалтерия

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

Адресная книга

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

Программа для отслеживания ТВ-серий

Не хотите пропустить любимый сериал? Нет записывающего устройства или хотите найти серию и записать её позднее? Создайте приложение, которое будет осуществлять поиск по сайтам телевизионных передач, определять названия/время/каналы и добавлять их в базу данных. База данных/веб-сайт затем могут посылать вам email-уведомления о начале сериала и о канале трансляции. Реализация:
Python

Система планирования путешествий

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

Графика и мультимедиа

Слайд-шоу

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

Проигрыватель онлайн-видео

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

Mp3 Плеер

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

Проигрыватель онлайн-музыки

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

Приложение для создания ватермарков

Хотите защитить авторские права на некоторые изображения? Добавьте своё лого или текст на изображение, чтобы никто не мог украсть графику с вашего сайта. Создайте программу, накладывающую ватермарк на изображение. *По желанию: Используйте многопоточность для одновременной обработки нескольких изображений. * Реализация:
Python

Черепашья графика

Стандартный проект, в котором вы создаёте плоскость из квадратов 20х20. С помощью различных команд вы управляете черепахой, которая рисует линию на плоскости. Вы можете двигать её вперёд, назад, двигать влево и вправо, поднимать и опускать перо и т.д. Подробную информацию ищите в Google по запросу “черепашья графика”. По желанию: добавьте в программу возможность считывать список команд из файла

Безопасность

Шифр Цезаря

Реализуйте шифр Цезаря, как шифрование, так и дешифрование. Ключом является целое число от 1 до 25. Этот ключ сдвигает буквы алфавита (от A до Z). При шифровании каждая буква алфавита заменяется буквой, находящейся на выбранное количество позиций дальше (алфавит закольцовывается). Таким образом, при использовании ключа 2 “HI” становится “JK”, а при использовании ключа 20 “HI” превращается в “BC”. Это простое моноалфавитное шифрование легко взламывается, поскольку злоумышленник, у которого на руках есть зашифрованное послание, может использовать частотный анализ, или просто попробовать все 25 ключей. Реализации.

Ежегодно по всему миру проходит множество конференций, так или иначе
связанных с UNIX и FOSS. Участие IT-специалиста в программе одной из них —
отличный способ выделиться, продемонстрировать неординарность своего мышления и
умение излагать мысли. Мы ознакомимся с пятью наиболее креативными проектами,
представленными на конференциях USENIX и Linux Symposium за последние два года.

Korset — HIDS без ложных срабатываний

Феноменальная популярность небезопасных языков программирования C и C++
оказалась фатальной с появлением интернета и сетевых технологий. Проблеме срыва
стека уже свыше 25 лет, но эффективного ее решения до сих пор не придумано.
Производители железа снабжают процессоры NX-битом, который, как оказалось,
способен остановить только учителей информатики. В операционные системы
встраивают разнообразные рандомизаторы адресов, – они хоть и усложняют процесс
внедрения shell-кода, но также легко обходятся. Создатели компиляторов не
отстают и придумывают прополисы и прочие расширения. Идеалисты постоянно кричат
о типо-безопасных языках и виртуальных машинах. Каждый год исследователи
представляют новые системы защиты, но явного прогресса нет и кажется, что
эффективное решение не будет найдено никогда.

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

Существует два типа HIDS : обучаемые и основанные на правилах .
Слабость первых в необходимости предварительного "прогона" приложения, –
обучаемой HIDS нужно время на анализ того, что обычно делает приложение, чтобы
уже потом на основе этих данных ограничить софтину в возможностях. В то же время
такая HIDS просто технически не способна узнать обо всем, что может приложение,
и довольно часто дает ложные срабатывания.

HIDS, основанные на правилах, действуют по-другому. Они предлагают
пользователю самому составить список того, что дозволено приложению (какие
системные вызовы разрешены, к каким файлам и устройствам оно может обращаться и
т.д.), а все остальные действия будут пресекаться. Недостаток: чтобы точно
составить правила, нужно серьезно попотеть (попробуй как-нибудь на досуге
написать список правил SELinux для Apache и всех его модулей с нуля).

Разработчики концептуальной HIDS Korset (www.korset.org),
анонсированной на Linux Symposium 2008, предложили объединить оба типа систем
обнаружения вторжений для создания сверхнадежной HIDS, работающей без
вмешательства пользователя и не требующей обучения или написания правил. Korset
базируется на идее Control Flow Graph (CFG ), который представляет
собой граф, отражающий очередность выполнения системных вызовов приложением.
Такой граф строится автоматически во время сборки приложения и загружается ядром
перед его исполнением. Если во время работы процесс инициирует системные вызовы,
не описанные в графе, или даже делает их не в том порядке — процесс завершается.

Чтобы воплотить мысль в реальность, создатели Korset снабдили GNU build tools
(gcc, ld, as, ar) специальными обертками, которые строят CFG на основе исходных
текстов и объектных файлов приложения. Для реализации сидящего в ядре Monitoring
Agent был модифицирован ELF-загрузчик, который во время загрузки исполняемого
файла в память находит и загружает закрепленный за ним CFG (файл
приложение.korset). Специальная хук-функция security_system_call, прописанная в
структуре security_operations, запускается при каждом системном вызове и сверяет
его с записью в CFG. Ну, а чтобы связать все это воедино, в структуру
task_struct добавили ссылку на CFG и его состояние.

На первый взгляд, Korset прост в реализации и удобен в использовании. Но не
все так радужно. Во-первых, CFG убивает возможность генерации кода на лету, без
которой в некоторых случаях просто не обойтись. Во-вторых, CFG — не панацея.
Если взломщик умудрится оформить системные вызовы shell-кода таким образом,
чтобы они соответствовали прописанным в CFG (например, сделает open(), но не
конфигурационного файла, а псевдотерминала), то ничто не помешает ему в
проникновении. Ну и, в-третьих, в текущем состоянии Korset далек от продакшн:
работа только на x86, с программами без динамической линковки, многопоточности,
сигналов и инструкций вроде setjmp и longjmp.

Vx32 — песочница в пространстве пользователя

Идея использовать песочницы для запуска небезопасного кода далеко не нова.
Близкие примеры: Chroot, FreeBSD Jail, Linux Lguest, Solaris Zones. JavaVM –
тоже своего рода песочница, принуждающая использовать типо-безопасный язык для
создания приложений и применяющая многочисленные рантайм проверки на
безопасность. Даже VMWare и qemu есть не что иное, как песочницы, позволяющие
запустить ОС в изолированном виртуальном окружении.

Особого внимания заслуживают песочницы, основанные на прозрачной трансляции
опкодов x86. Чтобы понять, что это такое, представь себе Java, которая умеет
исполнять обычный x86-код, скомпилированный с помощью gcc. При этом
подконтрольная программа не может выйти за границы своей области памяти и
навредить работе виртуальной машины. Единственный путь наружу — специальный API.
Ничего кроме для нее не существует. Такой вид песочниц наиболее интересен,
потому как не требует вмешательств в ядро, не принуждает к использованию
типо-безопасных языков, транслируемых в байт-код, не эмулирует целую аппаратную
платформу и позволяет как угодно ограничить исполняемую программу с помощью
урезания API до минимума. На его основе даже можно построить целую операционную
систему, работающую в пространстве пользователя.

К сожалению, популярности такой тип песочниц не получил. Реализация требует
софтверной интерпретации инструкций процессора (с целью их модификации), ведь
чтобы подконтрольное приложение оставалось в изоляции, нельзя допустить, чтобы
оно смогло производить системные вызовы или обращаться к функциям, не
оговоренным в API (инструкции int и call). Нельзя передавать управление на код
за пределами своего адресного пространства (jmp) или читать данные вне своей
зоны видимости (тут уж совсем засада). Поэтому инструкции должны анализироваться
и при необходимости исправляться. Как следствие: на порядки отстающая
производительность.

Проект Vx3 2 (pdos.csail.mit.edu/~baford/vm/),
представленный на конференции USENIX’08, вдохнул в идею подобных песочниц новую
жизнь благодаря одному хитрому приему, который позволил вывести
производительность чуть ли не на уровень нэйтивного кода. Все дело в границах
области данных. Обычно для ограничения области данных подконтрольной программы
интерпретаторы анализируют все куски кода, содержащие хоть какое-то упоминание
об адресе, будь то чтение из буфера, работа со стеком или обращение к файлу.
Анализируется и, в случае необходимости, исправляется каждая инструкция, несущая
в себе адрес. В то же время на долю различных переходов и обращений к
подпрограммам остается жалкий процент действий, не несущий особой нагрузки на
интерпретатор. Разработчики Vx32, отлично это понимая, просто ограничили область
данных программы сегментными регистрами (ds, es, ss), которые все равно не
применяются в современных ОС из-за плоской модели памяти. В результате,
интерпретатор Vx32 должен заботиться только об анализе инструкций-переходов
(число которых очень мало: jmp и производные, call, int, ret) и пресекать
попытки изменения сегментных регистров, а самую трудоемкую работу по соблюдению
границ видимости области данных выполнит процессор, который делает это в сотни
раз быстрее.

Уже сейчас Vx32 стабильно работает, а на его основе создано несколько
проектов, среди которых ОС Plan9, работающая в режиме хост-системы, и "эмулятор"
Linux (Linux API поверх Vx32). Производительность этих систем приближается к
нэйтивному коду (оверхед редко превышает 80%). Недостаток же у системы всего
один: привязанность к x86.

KvmFS — удаленное управление виртуальными серверами

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

Бум популярности виртуализации начался сразу после появления ее поддержки в
современных x86-процессорах. Теперь виртуальный сервер может работать без явного
оверхеда и модификации практически на любой ОС, оснащенной соответствующим
драйвером.

В Linux такой драйвер называется kvm, и для его задействования обычно
применяется виртуальная машина qemu. Сама по себе qemu представляет множество
интересных возможностей для управления серверами, включая функции
заморозки/разморозки, простой способ миграции по Сети, поддержку сжатых образов
дисков и т.д. Управлять сервером с помощью qemu одно удовольствие, но если таких
серверов сотни, а то и тысячи, и все они разбросаны по множеству машин,
начинаются серьезные проблемы.

Проект KvmFS , представленный на Linux Symposium 2007, как раз и
призван упростить процесс администрирования множества удаленных виртуальных
машин. KvmFS использует протокол 9P (тот, что из
) для создания
виртуальной файловой системы, которую можно удаленно монтировать, например из
Linux, и управлять множеством инстанций qemu на удаленном сервере путем записи
специальных команд в файлы. Сервер KvmFS прочитает команды и отправит их нужному
процессу qemu. Для наглядности далее приводится пример запуска виртуальной
машины на сервере host.org:

# mount -t 9p host.org /mnt/9
# cd /mnt/9
# tail -f clone &
# cd 0
# cp ~/disk.img fs/disk.img
# cp ~/vmstate fs/vmstate
# echo dev hda disk.img > ctl
# echo net 0 00:11:22:33:44:55 > ctl
# echo power on freeze > ctl
# echo loadvm vmstate > ctl
# echo unfreeze > ctl

А вот так производится миграция виртуального сервера на другую машину:

# mount -t 9p host1.org /mnt/9/1
# mount -t 9p host2.org /mnt/9/2
# tail -f /mnt/9/2/clone &
# cd /mnt/9/1/0
# echo freeze > ctl
# echo "clone 0 host2.org!7777/0" > ctl
# echo power off > ctl

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

AXFS — запуск приложений без помещения в RAM

Linux стремительно завоевывает рынок мобильной и встраиваемой техники. Все
больше производителей смартфонов заявляют об использовании открытой ОС в
следующих моделях своих устройств. Множество компаний выдвигают на рынок
специальные версии дистрибутивов Linux для мобильных устройств. Линус Торвальдс
пропускает в ядро огромное количество патчей с реализацией поддержки того или
иного мобильного оборудования и кажется, что хакерский рай уже так близко…

К сожалению, не все так просто. Изначально ядро Linux разрабатывалось для
рабочих станций и серверов, и только совсем недавно тукс потянул крылышки к
смартфонам. Поэтому почти все подсистемы ядра рассчитаны (и оптимизированы) на
применение в стандартных настольных конфигурациях, которые непременно обладают
жесткими дисками, быстрым видеоадаптером, большим объемом оперативной памяти и
весьма нескромной производительностью. Некоторые из этих проблем решаются
достаточно просто. Например, требуемые объемы памяти можно понизить до
приемлемого уровня, собрав ядро с поддержкой только самого необходимого и
потюнив систему через /proc. Низкопроизводительная видеоподсистема? Ну, тогда и
тяжелый X Server не нужен, хватит framebuffer’а! А вот с остальным сложнее. В
частности, в ядре до сих пор нет файловой системы, позволяющей использовать все
возможности современных flash-накопителей.

Список фич, которыми должна обладать такая файловая система, следующий:

  1. Переписывание данных только в случае крайней необходимости. Основанные на
    flash-памяти накопители имеют ограничение по части количества циклов
    перезаписи.
  2. Прозрачное сжатие данных.
  3. Умение работать без уровня эмуляции блочного устройства, который создает
    совершенно ненужный оверхед.
  4. Устойчивость к перебоям питания.
  5. Поддержка XIP (eXecute-In-Place), т.е. возможности запустить программу
    прямо с flash-накопителя, без загрузки в оперативную память.

Давно интегрированная в ядро jffs2 не поддерживает и половины этих
возможностей, а вот созданная компанией Nokia ubifs (интегрирована в ядро
2.6.27) очень хороша и умеет почти все, кроме пятого пункта. За счет XIP можно
сделать большой шаг вперед. Поясню. На мобильных устройствах операционная
система обычно прошивается в память типа NOR, которая, в отличие от используемой
во флешках NAND-памяти, поддерживает обращение к произвольным ячейкам.
Произвольный доступ делает ее очень похожей на оперативную память и даже
позволяет использовать в этом качестве. Надо только научить файловую систему
мапить отдельные участки NOR-памяти в память виртуальную – и, о чудо,
полноценная операционная система может работать, не потребляя RAM.

Загвоздка с XIP лишь в том, что это технология никак не вписывается в дизайн
универсальной операционной системы. По сути это хак, который пытается смешать
несовместимые подсистемы ядра. Создатели файловой системы AXFS (Advanced
XIP File System
), анонсированной на Linux Symposium 2008, попытались
исправить этот недочет при помощи официальных механизмов ядра. Еще в ядро
2.6.13, в рамках интеграции dcss-драйвера для архитектуры s390, был добавлен
специальный механизм, позволяющий обращаться к памяти flash-диска напрямую (файл
/mm/filemap_xip.c). До создателей AXFS этот механизм попытались использовать
разработчики xip-патчей для cramfs, но в результате получили грязный хак,
который никак нельзя было выдать за оптимальное решение. Разработчики же AXFS
проконсультировались с авторами подсистемы виртуальной памяти и создали
64-битную файловую систему, достоинства которой:

  1. XIP для памяти NOR-типа.
  2. Возможность работать с NAND-памятью (XIP автоматически отключается).
  3. Прозрачная компрессия с размером блока от 4 кб до 4 Гб.
  4. Умение работать как с блочными устройствами, так и напрямую.

Записывать она не умеет (образ файловой системы создается специальной
утилитой), но это и не требуется для прошивок, выпускаемых производителем
аппарата.

Libferris — новый уровень виртуальных ФС

В последнее время виртуальные файловые системы завоевали особую популярность.
Пользователей они привлекают своей универсальностью, благодаря которой не нужно
тратить время на изучение новых интерфейсов и чтение мануалов. С точки зрения
программистов, виртуальная ФС — очень удобный и простой способ связывания
компонентов большой системы без выдумывания нового API и использования сложных
RPC.

Чтобы не быть голословным, приведу лишь некоторые примеры из громадного
списка таких ФС: подсистема Gnome VFS, которая позволяет "ходить" по архивам,
ssh-сессиям, ISO-образам; подсистема KDE KIO, разработанная для тех же целей;
ядерный модуль fuse, на основе которого создано просто гигантское количество
самых разнообразных файловых систем. А если уж мыслить в более глобальных
масштабах, то не обойтись без упоминания об операционных системах Inferno и
Plan9, где виртуальные ФС являются центральной частью ОС и связывают все
компоненты системы в единый комплекс.

Проект libferris (www.libferris.com),
которому была посвящена одна из лекций Linux Symposium, в этом плане идет еще
дальше. Кроме возможности монтирования массы разнообразных ресурсов, он
предлагает механизм управления приложением (Firefox, X Window) через файловый
интерфейс, позволяет легко преобразовать XML-документ в файловую систему и
обратно, поддерживает атрибуты, которые на лету извлекаются из внутренних
метаданных документа, и обладает еще массой интересных особенностей. Другими
словами, проект libferris выводит виртуальные ФС на новый уровень, который
раньше был доступен лишь в упомянутом Plan9.



Рекомендуем почитать

Наверх