Создание проекта в VisualStudio. Где новичку в программировании найти упражнения и идеи для проектов

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

После установки Visual Studio можно приступать к созданию первого проекта. В Visual Studio редко когда требуется начинать с пустого файла и добавления в него кода C#. (Разумеется, возможность создания пустого проекта приложения существует. Это нужно, если действительно возникла потребность в написании кода с нуля, либо при создании решения, которое должно содержать в себе несколько проектов.)

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

Давайте создадим консольное приложение, выбрав в меню File (Файл) пункт New --- Project (Создать --- Проект):

Как можно увидеть на рисунке, в Visual Studio поддерживается возможность выбора версии.NET Framework (2.0, 3.x или 4.0), для которой должно создаваться приложение, с помощью раскрывающегося списка, отображаемого в правом верхнем углу диалогового окна New Project (Новый проект).

Утилита Solution Explorer (Обозреватель решений) , доступная через меню View (Вид), позволяет просматривать набор всех файлов с содержимым и ссылаемых сборок, которые входят в состав текущего проекта:

Обратите внимание, что внутри папки References (Ссылки) в окне Solution Explorer отображается список всех сборок, на которые в проекте были добавлены ссылки. В зависимости от типа выбираемого проекта и целевой версии.NET Framework, этот список выглядит по-разному.

Добавление ссылок на внешние сборки

Если необходимо сослаться на дополнительные сборки, щелкните на папке References правой кнопкой мыши и выберите в контекстном меню пункт Add Reference (Добавить ссылку) . После этого откроется диалоговое окно, позволяющее выбрать желаемые сборки (в Visual Studio это аналог параметра /reference в компиляторе командной строки). На вкладке Assemblies этого окна, показанной на рисунке, отображается список наиболее часто используемых сборок.NET; на вкладке Browse (Обзор) предоставляется возможность найти сборки.NET, которые находятся на жестком диске; на вкладке Recent (Недавние) приводится перечень сборок, на которые часто добавлялись ссылки в других проектах:

Просмотр свойств проекта

И, наконец, напоследок важно обратить внимание на наличие в окне утилиты Solution Explorer пиктограммы Properties (Свойства). Двойной щелчок на ней приводит к открытию редактора конфигурации проекта, окно которого называется Project Properties (Свойства проекта):

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

Утилита Object Browser

В Visual Studio доступна еще одна утилита для изучения множества сборок, на которые имеются ссылки в текущем проекте. Называется эта утилита Object Browser (Браузер объектов) и получить к ней доступ можно через меню View. После открытия ее окна останется просто выбрать сборку, которую требуется изучить:

Отличие проектов от решений

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

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

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

Тэш Постоловски «40 Side Project Ideas for Software Engineers».

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

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

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

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

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

Сторонние проекты, связанные с информатикой

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

  1. FTP клиент (предлагаемая реализация: web, CLI или десктопное приложение). Постройте простой FTP-клиент. В качестве дополнительной задачи сделайте поддержку безопасной передачи файлов (secure file transfer).
  2. HTTP-сервер (предлагаемая реализация: любой язык программирования, над которым вы хотите поработать). Для глубокого понимания HTTP постройте HTTP-сервер. Есть много доступных руководств , которые могут помочь вам в этом процессе.
  3. Постройте простую операционную систему (предлагаемая реализация: любой язык программирования, над которым вы хотите поработать). Это технически сложный проект, который поможет углубить ваше понимание работы компьютера и операционных систем. Возможно, вы захотите начать с бесплатной книги с интересным названием: «Operating Systems: From 0 to 1 ».
  4. Постройте веб-скрапер (предлагаемая реализация: любой язык программирования, над которым вы хотите поработать). Создайте инструмент, принимающий URL в качестве input и возвращающий контент в виде HTML или XML.
  5. Bandwidth monitor (предлагаемая реализация: инструмент обновления CLI в реальном времени). Создайте инструмент для отслеживания количества скачиваемых и загружаемых в интернет данных. Пускай ежемесячно присылает вам отчет на email. Для дополнительной нагрузки – прогноз пикового времени использования.
  6. Осуществление шифрования (предлагаемая реализация: любой язык программирования, над которым вы хотите поработать). Создайте инструмент, принимающий текстовую строку в качестве input и зашифровывающий ее, например, с помощью шифра Цезаря .
  7. Создайте downtime-сигнализатор (предлагаемая реализация: приложение, подключенное к Twilio API для отправки текстовых сообщений). Создайте приложение, принимающее URL как input и отсылающее вам текстовое сообщение, когда запрос к URL возвращает другой код ответа, чем 200 (OK).

Сторонние проекты, связанные с личными финансами

Эти проекты помогут вам решить практические задачи (лучше управлять своими финансами), а также улучшат ваши навыки в программной инженерии.

  1. Калькулятор прибыли и трекер (предлагаемая реализация: CLI, веб или мобильное приложение). Создайте калькулятор, который сможете использовать для отслеживания ежемесячного роста и снижения своих доходов. Вы можете руководствоваться чем-то вроде net worth worksheet от Чральза Шваба. Возможное расширение: пусть он отсылает вам отчет за предыдущие 12 месяцев 01 января каждого года.
  2. П рогноз налогов (предлагаемая реализация: веб-приложение). Это будет особенно полезно, если вы занимаетесь программной инженерией на фрилансе. Создайте инструмент, принимающий в качестве входных данных ваши заработки и выдающий ожидаемую сумму налогов, которую нужно будет уплатить в конце финансового года. Сделайте его достаточно умным, чтобы он мог учитывать периоды большего или меньшего спроса на ваши услуги.
  3. Поиск сделок (предлагаемая реализация: веб-приложение с мобильными уведомлениями). Создайте простое веб-приложение, уведомляющее, когда желанный для вас товар будет выставлен на продажу по хорошей цене. Вы можете использовать веб-скрапер для извлечения страницы продукта и уведомления вас об изменении цены.
  4. Отслеживание расходов (предлагаемая реализация: веб- или мобильное приложение). Создайте простой интерфейс, который вы сможете использовать для добавления и разбивки своих расходов по категориям. Генерируйте ежемесячный отчет, основанный на входящих данных, и напишите пользовательские уведомления вроде «тратишь слишком много на кофе… как всегда».
  5. Калькулятор финансовой независимости (предлагаемая реализация: веб-приложение). По существу, финансовая независимость это как можно большее сохранение и вкладывание доходов (инвестиции), что позволяет не нуждаться в работе для получения денег. Хотя многие финансово независимые люди продолжают работать, они могут позволить себе работать над тем, чем им нравится заниматься, а не тем, за что больше платят. Постройте инструмент для подсчета того, насколько вы далеки от финансовой независимости, основанного на ваших текущих сбережениях, инвестициях, доходах, пенсионных счетах и расходах. Примеры: FIREcalc , cFIREsim .
  6. «Разбиватель» счетов (предлагаемая реализация: мобильное приложение). Постройте простой инструмент, который поможет вам и вашим друзьям делить счет, когда вы вместе обедаете.

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

  1. Генератор случайных имен (предлагаемая реализация: CLI, веб- или мобильное приложение). Постройте генератор случайных имен (пример), создающий уникальные названия на лету, основываясь на алгоритме. Используйте приемы машинного обучения чтобы помочь натренировать программу с примерным набором данных из имен, похожих на те, что вы хотите генерировать. Или создайте собственные лексические правила генерации имен. Например, алгоритм генерации имен, вдохновением для которого послужил «Рассказ служанки », может иметь условие, что имена Служанок должны начинаться с «Оф», а оканчиваться на случайное мужское имя, например, Офпитер.
  2. И гра «Жизнь» (Conway’s Game of Life) (предлагаемая реализация: любая платформа, способная на графический рендеринг в реальном времени). Игра «Жизнь» симулирует жизнь простых клеток, которые подчиняются алгоритмическим законам. Это видео поясняет, как работает игра, и включает пример возможного результата:
  3. Процедурно генерируемый создатель карт (предлагаемая реализация: приложение на основе браузера). Создайте браузерное приложение, позволяющее процедурную генерацию карты местности на основе случайного начального числа. Карта может быть такой простой или сложной, как вы хотите. Этот проект – хорошая возможность изучить процедурную генерацию .
  4. Генератор персонажей (предлагаемая реализация: браузерное, мобильное приложение, CLI). Создайте инструмент, позволяющий случайно генерировать подходящие персонажи для вашей любимой ролевой игры, как настольной (вроде Pathfinder), так и видео-игры (вроде «Divinity: Original Sin»).
  5. Interactive fiction (предлагаемая реализация: CLI). Интересный способ войти в разработку игр без необходимости волноваться о графических ресурсах. Interactive fiction создает мир для игрока с помощью текстовых описаний. Dreamhold – хороший пример Interactive fiction с полезной командой «help».

Сторонние проекты, связанные с искусственным интеллектом

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

  1. Идеальный движок для игры в крестики-нолики (предлагаемая реализация: программа CLI). В качестве прекрасного первого ИИ-проекта попробуйте написать движок, который нельзя победить в игре в крестики-нолики. Вы можете достичь такого результата, реализовав эту стратегию , которая делает ничью худшим исходом игры.
  2. Шахматный движок (предлагаемая реализация: ). Попробуйте написать движок, способный играть в шахматы с человеком, используя GUI, совместимый с Universal Chess Interface , например, Xboard. В качестве примера посмотрите Stockfish . Чтобы упростить задачу вы можете сфокусироваться на поведении только какой-то части, например, коней.
  3. Чат-бот (предлагаемая реализация: веб-приложение). Часть лучших умов человечества сейчас заняты реалистично отвечающими чат-ботами. Это ужасно сложная задача, но если сузить рамки для вашего чат-бота, у вас будет сторонний проект на вечера и выходные. Создайте чат-бот, выдающий реалистично звучащие ответы по теме, которой вы увлекаетесь: ваша любимая музыкальная группа, видеоигра, спортивная команда, ТВ-шоу. Используйте уже существующую библиотеку, такую как ChatterBot .
  4. Определитель спама (предлагаемая реализация: любой язык программирования, над которым вы хотите поработать ). Постройте инструмент для определения, является ли письмо спамом, основываясь только на содержимом. Вы можете воспользоваться этим публичным набором данных из исследования Enron для тестирования вашего определителя спама.

Сторонние проекты, связанные с развлечениями

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

  1. Поиск времени показа фильмов (предлагаемая реализация: веб- или мобильное приложение с смс-уведомлениями или отправкой е-мэйлов). Постройте программу, которая будет уведомлять вас с помощью смс или email о времени показа потенциально интересных для вас фильмов в вашем любимом кинотеатре. Представление об «интересном фильме» может быть получено с помощью машинного обучения (если вы смотрите достаточно фильмов для получения хороших тренировочных данных) или написанного вручную алгоритма. Например, для построения программы, которая будет уведомлять вас о фильмах в жанре научной фантастики с рейтингом IMDB 7.0 и выше, или фильмах с Эми Адамс, фильмах со средним рейтингом 8.0 или выше, можно использовать Open Movie Database API вместе с HTML-парсером вроде BeautifulSoup .
  2. Б локировщик спойлеров (предлагаемая реализация: расширение браузера). В современном мире спойлеры ваших любимых фильмов, особенно таких популярных, как «Игра престолов», могут настигнуть вас повсюду (в социальных сетях/интернете/бачках с питьевой водой). Создайте расширение браузера, удаляющее все упоминания о вашем любимом шоу с загружаемых страниц или заменяющее их картинками с котятами.

З абавные сторонние проекты

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

  1. Pixel art генератор (предлагаемая реализация: любой язык программирования, над которым вы хотите поработать ). Постройте инструмент, принимающий изображение в качестве входящих данных и преобразует его в pixel art на выходе. Если хотите улучшить свои навыки, касающиеся фронтенда, генерируйте конечный pixel art используя CSS.
  2. Инструмент, предлагающий музыку (предлагаемая реализация: постройте враппер для Spotify API). Создайте инструмент, отслеживающий музыку, которую вы слушаете, и генерирующий плейлист сходного качества, но из песен, которые вы прежде не слышали. Spotify API предоставляет все инструменты, необходимые для извлечения данных о прослушанных композициях и для создания плейлиста, а движок рекомендаций – за вами!
  3. Регистратор температуры (предлагаемая реализация: Raspberry Pi, датчик температуры, веб-приложение). Подключите ваш Raspberry Pi к датчику температуры и отсылайте температурные данные из вашего дома на веб-приложение, которое сохранит их в базе данных или обновит CSV-файл. Для получения бонусных очков сделайте еженедельный отчет по температуре, присылаемый вам на email. Другие проекты Raspberry Pi: домашняя автоматизация , домашняя безопасность .
  4. Приложение для «микрообучения» (предлагаемая реализация: мобильное или веб-приложение). Постройте приложение, высылающее вам ежедневно одну страницу по теме, которую вы хотите изучить. Это может быть случайная страница из Википедии, из документации по React, о букве кандзи или страница из CIA World Factbook .
  5. Slack-бот (предлагаемая реализация: Slack API). Если вы или ваша команда используете популярное чат-приложение Slack, постройте бот, облегчающий какие-то аспекты вашей жизни. Идеи: бот заказа кофе, бот, ежедневно докладывающий о числе коммитов, сделанных в репозиториях вашей команды, или напоминалка по какой-то теме.
  6. Обои рабочего стола (предлагаемая реализация: Unsplash API , язык сценариев для вашей ОС). Постройте приложение, которое будет ежедневно обновлять обои вашего рабстола.

З адачи на написание кода

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

  1. Advent of Code (предлагаемая реализация: любой язык программирования, над которым вы хотите поработать ). Задания в Advent of Code появляются ежегодно в преддверии Рождества. Они включают множество занимательных задач, которые могут помочь вам подтянуть язык программирования, который вы изучаете или с которым хотите поработать. Задачи за 2015, 2016 и 2017 год все еще доступны.
  2. Kaggle’s Titanic Challenge (предлагаемая реализация: Python или R). Kaggle предлагает захватывающее задание, знакомящее вас с основами машинного обучения с помощью Python или R: использовать настоящий набор данных о регистрации пассажиров «Титаника» для предположений, кто из пассажиров скорее всего пережил катастрофу.
  3. Project Euler (предлагаемая реализация: любой язык программирования, в котором вы хотите попрактиковаться ). Задания в Project Euler посвящены изучению союза математики и программирования. Используйте инструменты программирования для решения разнообразных математических задач.

Сторонние проекты, связанные с обыденностью

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

  1. Выбор обеда (предлагаемая реализация: CLI, мобильное или веб-приложение). Если вы работающий программный инженер, вы, должно быть, сталкивались с самым сложным вопросом в разработке программ… «куда пойти поесть?». Ваш инструмент для выбора обеда призван дать ответ на этот вопрос. Он может быть супер-простым и делать случайный выбор из известного вам списка опций или более сложным – извлекать данные из Google Reviews и учитывать расположение, цены и тип кухни.
  2. Планировщи к свиданий (предлагаемая реализация: мобильное приложение). Самое сложное в том, что касается свиданий и длительных отношений, это решение, куда пойти на свидание. Постройте инструмент, просматривающий обзоры ресторанов, календари событий и собирающий другие данные для выдвижения идей.
  3. Инструмент для упрощения вашей электронной переписки (предлагаемая реализация: скрипты, подключенные к почтовому серверу). Если мы с вами похожи, вы еженедельно получаете слишком много писем и они накапливаются в вашем почтовом ящике. Вместо того чтобы отписываться от них от всех в припадке гнева, постройте инструмент, который будет компилировать их в одно письмо и отправлять вам его раз в неделю.
  4. Напоминалка «Возьми зонтик» (предлагаемая реализация: мобильное приложение). Постройте простое мобильное приложение, которое по утрам будет присылать вам на телефон уведомление о том, что нужно взять с собой на работу зонтик (например, если в вашей местности ожидается дождь).
  5. Отслеживатель коллекций (предлагаемая реализация: мобильное или веб-приложение). Постройте инструмент для отслеживания чего-то, что вы собираете. Вы можете следить за ценой предмета, годом изготовления, состоянием, местоположением.

Сторонние проекты, связанные с данными

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

  1. Создайте и автоматически обновляйте набор данных (предлагаемая реализация: веб-скраппер на входе и CSV на выходе). Постройте инструмент, автоматически создающий и обновляющий набор данных, касающихся чего-то, что вас интересует. Рекомендуемые наборы данных: статистика по вашей любимой спортивной команде, полеты в направлении, куда и вам бы хотелось отправиться, метеорологические данные региона, где вы живете. Самое главное, что этот набор данных должен нуждаться в регулярном обновлении по мере генерации новых данных, и это должно осуществляться автоматически. Например, когда результаты вашей спортивной команды публикуются на сайте, данные должны автоматически скрапиться и добавляться к вашему набору данных.
  2. Вступите в соревнование по науке о данных (предлагаемая реализация: R или Python). На Kaggle есть много соревнований по науке о данных, оперирующих наборами данных из реального мира и имеющих огромные денежные призы. Перед вами будут стоять реальные проблемы вроде того, как определить отравляющие онлайн-комментарии, предсказать посетителей в ресторане или распознавать объекты из космоса.

Поделитесь своим сторонним проектом

  • Что было сложнее всего в работе над этим проектом?
  • Что вы узнали, занимаясь этим проектом, чему научились?
  • Что бы вы посоветовали тем, кто хотел бы начать похожий проект?

Ежегодно по всему миру проходит множество конференций, так или иначе
связанных с 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.

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

Здесь можно найти список из более чем 100 идей для проектов , которые вы можете реализовать. Список предназначен для Python, но идеи можно выполнить и в других языках. В нём есть и не совсем серьёзные проекты, и хорошие упражнения для практики. Список крайне рекомендуется к ознакомлению и выполнению новичкам.

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

Хотите создать что-то новое? Посмотрите Idea Machine и The Internet Wishlist , где люди публикуют свои пожелания по программам, которые они хотели бы увидеть.

Если хотите практических упражнений, то пройдитесь по данному списку сайтов/ресурсов:

Общие упражнения:

  • Project Euler содержит более 500 математических задач (на теорию чисел, числовых систем и пр.), которые нужно решить, используя программирование (на любом языке).
  • Code Abbey хранит более 200 задач по программированию. За решения 125 из них выдают сертификат, чем мотивируют многих студентов.
  • Rosalind – это ещё один сайт наподобие Project Euler, который предоставляет на выбор более 200 задач по биоинформатике.
  • Codingbat.com дарит упражнения по Java и Python, как для новичков, так и для продвинутых программистов.
  • codegolf.stackexchange.com – сайт, на котором публикуют и обсуждают программистские головоломки.
  • Ruby Quiz – серия головоломок, в которых вас просят написать короткие программы различной сложности. Исходные решения описаны на Ruby, но их можно реализовать на любом языке.
  • - подборка задач на логику и программирование, к каждой есть подробный разбор решения.

Задачи из олимпиад по программированию:

  • UVa Online Judge – коллекция из сотен задач с олимпиад по программированию, с онлайн-системой проверки решений.
  • TopCoder содержит сложные задачи на алгоритмы, собранные годами с разных соревнований. Также несколько раз в месяц проводит олимпиады по программированию.
  • CodeForces похож на TopCoder, но содержит больше задач на соревнованиях и несколько особых фишек, включая «виртуальные соревнования».
  • Timus – то же, что и UVA. Содержит задачи с последних соревнований (мирового и регионального уровня).
  • SPOJ – похож на UVA, с огромным числом языков программирования на выбор.
  • USACO содержит несколько задач на алгоритмы с руководством по их решению.

Под определённые языки:

  • Для Prolog, Lisp и подобных языков посетите P-99 и L-99 , наборы из 99 задач для повышения вашей эффективности в данных языках.

Последнее обновление: 31.10.2015

Вначале подключим скомпилированную в прошлой теме библиотеку классов. Для этого в главном проекте BankApplication нажмем на пункт References правой кнопкой мыши и в появившемся меню выберем пункт Add Reference... :

Затем в появившемся окне отметим пункт BankLibrary, который будет представлять нашу библиотеку классов, и нажмем на OK.

Теперь изменим файл Program.cs в главном проекте следующим образом:

Using System; using BankLibrary; namespace BankApplication { class Program { static void Main(string args) { Bank bank = new Bank("ЮнитБанк"); bool alive = true; while (alive) { ConsoleColor color = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.DarkGreen; // выводим список команд зеленым цветом Console.WriteLine("1. Открыть счет \t 2. Вывести средства \t 3. Добавить на счет"); Console.WriteLine("4. Закрыть счет \t 5. Пропустить день \t 6. Выйти из программы"); Console.WriteLine("Введите номер пункта:"); Console.ForegroundColor = color; try { int command = Convert.ToInt32(Console.ReadLine()); switch (command) { case 1: OpenAccount(bank); break; case 2: Withdraw(bank); break; case 3: Put(bank); break; case 4: CloseAccount(bank); break; case 5: break; case 6: alive = false; continue; } bank.CalculatePercentage(); } catch (Exception ex) { // выводим сообщение об ошибке красным цветом color = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(ex.Message); Console.ForegroundColor = color; } } } private static void OpenAccount(Bank bank) { Console.WriteLine("Укажите сумму для создания счета:"); decimal sum = Convert.ToDecimal(Console.ReadLine()); Console.WriteLine("Выберите тип счета: 1. До востребования 2. Депозит"); AccountType accountType; int type = Convert.ToInt32(Console.ReadLine()); if (type == 2) accountType = AccountType.Deposit; else accountType = AccountType.Ordinary; bank.Open(accountType, sum, AddSumHandler, // обработчик добавления средств на счет WithdrawSumHandler, // обработчик вывода средств (o, e) => Console.WriteLine(e.Message), // обработчик начислений процентов в виде лямбда-выражения CloseAccountHandler, // обработчик закрытия счета OpenAccountHandler); // обработчик открытия счета } private static void Withdraw(Bank bank) { Console.WriteLine("Укажите сумму для вывода со счета:"); decimal sum = Convert.ToDecimal(Console.ReadLine()); Console.WriteLine("Введите id счета:"); int id = Convert.ToInt32(Console.ReadLine()); bank.Withdraw(sum, id); } private static void Put(Bank bank) { Console.WriteLine("Укажите сумму, чтобы положить на счет:"); decimal sum = Convert.ToDecimal(Console.ReadLine()); Console.WriteLine("Введите Id счета:"); int id = Convert.ToInt32(Console.ReadLine()); bank.Put(sum, id); } private static void CloseAccount(Bank bank) { Console.WriteLine("Введите id счета, который надо закрыть:"); int id = Convert.ToInt32(Console.ReadLine()); bank.Close(id); } // обработчики событий класса Account // обработчик открытия счета private static void OpenAccountHandler(object sender, AccountEventArgs e) { Console.WriteLine(e.Message); } // обработчик добавления денег на счет private static void AddSumHandler(object sender, AccountEventArgs e) { Console.WriteLine(e.Message); } // обработчик вывода средств private static void WithdrawSumHandler(object sender, AccountEventArgs e) { Console.WriteLine(e.Message); if (e.Sum > 0) Console.WriteLine("Идем тратить деньги"); } // обработчик закрытия счета private static void CloseAccountHandler(object sender, AccountEventArgs e) { Console.WriteLine(e.Message); } } }

В начале файла подключается библиотека:

Using BankLibrary;

В методе Main создается объект Bank, который типизирован классом Account и через который мы будем взаимодействовать с объектами Account.

В цикле while выводится список команд, который должен выбрать пользователь. После выбора одной из них в конструкции switch выполняется соответствующая команда. Каждая команда представляет получения ввода от пользователя, его преобразование с помощью класса Convert и передача аргументов методам объекта Bank.

Каждая итерация цикла while соответствует одном дню, поэтому в конце цикла вызывается метод bank.CalculatePercentage() , который увеличивает у объектов Account счетчик дней и производит начисление процентов.

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