Главная » Правописание слов » Как написать программу для raspberry pi

Слово Как написать программу для raspberry pi - однокоренные слова и морфемный разбор слова (приставка, корень, суффикс, окончание):


Морфемный разбор слова:

Однокоренные слова к слову:

Digitrode

цифровая электроника вычислительная техника встраиваемые системы

Как программировать Raspberry Pi на языке C

Одноплатный компьютер Raspberry Pi зачастую программируют на языке Python. Но это вовсе не значит, что данный миникомпьютер нельзя программировать на каком-либо другом языке.

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

Язык C представляет собой C мощный язык программирования общего назначения. Он быстрый, довольно гибкий и доступен на всех платформах. Он очень эффективен. Это главная причина, почему он очень популярен, несмотря на то, что ему уже больше 40 лет. Данный язык был первоначально разработан Деннисом М. Ричи для разработки операционной системы UNIX в Bell Labs, а его первая реализация произошла в 1972 году на компьютере DEC PDP-11.

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

Чтобы продемонстрировать, как создать программу на C, скомпилировать ее и запустить на Raspberry Pi, мы напишем простую программу, которая будет печатать «hello world» в терминале. Процесс программирования на C состоит из четырех этапов: создание файла с исходным кодом, компиляция программы, создание исполняемого файла и выполнение программы.

Для начала откройте текстовый редактор Nano и создайте новый файл с расширением «.c», введя его в командной строке:

В этом файле вы напишете код на языке программирования C. Вы можете написать код в любом текстовом редакторе, просто удостоверьтесь, что файл имеет расширение «.c». Теперь введите этот код в Nano:

После ввода кода нажмите Ctrl-X и Y, чтобы сохранить и выйти из Nano.

Код, написанный на C, необходимо будет скомпилировать, прежде чем он будет запущен на компьютере. Компиляция – это процесс преобразования кода, который вы написали, в машиносчитываемые инструкции, которые могут быть поняты процессором компьютера. Когда вы компилируете исходный файл, создается новый скомпилированный файл. Например, ввод команды ниже будет компилировать hello-world.c в новый файл под названием myfirstcprogram.

Теперь нам нужно сделать нашу программу исполняемой. Для этого нам просто нужно изменить права доступа к файлам. Введите это в командной строке:

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

Таким образом, программирование на языке C для Raspberry Pi является простым и достаточно быстрым.

Источник

Программирование видео слоя в Raspberry Pi с использованием DispmanX API

В этой статье я хочу продемонстрировать использование DispmanX API одноплатных компьютеров Raspberry. DispmanX API предоставляет возможность создавать на десктопе Raspberry новые отображаемые слои. Слои висят над слоями. Их можно динамически создавать, удалять, перемещать, их можно масштабировать. При этом, сам видеоконтроллер будет их объединять и отображать на экране монитора. Интересно, что слои могут иметь альфа канал, и тогда, изображения всех слоев будут сами собой смешиваться. Так же, кроме 32-ти двухбитных ARGB слоев можно создавать, например, YUV420 слои, или слои других типов. В Raspberry по умолчанию уже есть два слоя. Самый нижний содержит изображение десктопа. Весь вывод через иксы идет в этот слой. И есть второй, самый верхний слой, в котором живет изображение курсора мыши.

Я покажу, как создавать новый слой, писать в него изображение и как его перемещать по экрану. Собственно говоря, на демо видео выше и показана работа такой программы. Здесь созданы четыре новых 32-х битных слоя ARGB. В каждый из слоев я записываю пикселы из заранее подготовленных битмапов. Мои битмапы это изображения облаков, солнца и воздушных шаров. Слои перемещаются по экрану с разной скоростью, нависая над самым нижним иксовым слоем.
Итак, DispmanX API. Это довольно низкоуровневая штука специфичная именно для Raspberry и его видеоконтроллеров. И это «нестандартная» штука. Вообще в ядре Linux и в графической подсистеме Linux есть место для программирования видео слоев через DRM, Direct Rendering Manager, но создатели Raspberry почему-то решили создать свой велосипед. Хотя, с другой стороны это не сложный велосипед, на котором вполне можно ездить. DispmanX работает на Pi-Zero, на Raspberry Pi / Pi2 / Pi3 и Pi4. В общем на всех малинках. Хотя, по правде говоря, на Pi4 уже есть нормальный OpenGLESv3. Тут такие бубны возможно уже и не нужны. Но с другой стороны, DispmanX гораздо проще (хотя и меньше возможностей), чем OpenGLES.

Чтобы писать программы с использованием этого DispmanX API нужно подключать заголовочный файл /opt/vc/include/bcm_host.h. Кроме этого, потребуется еще и линковать программу с библиотекой libbcm_host.so, которая расположена в папке /opt/vc/lib.

Все функции нужного нам API начинаются с vc_dispmanx_*…

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

Теперь можно создать «ресурс», который будет содержать изображение слоя:

Здесь тип слоя выбран 32-х битный с альфа каналом. Но могут быть другие типы, как я уже написал, даже YUV. Использование YUV слоя имеет смысл для динамических слоев, например, при воспроизведении видео. Тогда объем записываемых данных в экран существенно снижается, да и перекодировать YUV в RGB не нужно, что экономит ценные такты процессора.

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

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

Для начала изменения элементов на дисплее нужно сделать:

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

Как можно понять из названия функции изменения вступят в силу после очередного кадрового импульса видеоразвертки.

Запись пикселов в слой производится функцией:

К сожалению, несмотря на наличие параметра rect, невозможно обновить произвольный фрагмент внутри изображения. Можно обновить только «полосу», то есть top и bottom прямоугольника можно задавать, но left всегда будет 0 и right всегда будет по ширине изображения.

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

В своей программе я написал небольшую обертку над DispmanX API. Это позволяет мне каждый слой описывать отдельной структурой:

Ну и многие мои оберточные функции принимают параметром указатель на такую структуру:

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

Так же я написал функцию для чтения битмапа. Причем, функция хитрая — если в битмапе встречается чисто зеленый пиксел 0x00FF00, то я рассматриваю его как прозрачный пиксел в моем изображении и соответствующим образом выставляю байт Alpha этого пикселя в ноль.

В паинте нарисовал три изображения.

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

В вечном цикле перемещаю слои по экрану с разной скоростью:

Кстати говоря, на Raspberry можно посмотреть список всех видеослоев командой vcgencmd с параметром dispmanx_list. Вот так выглядит вывод этой команды на Pi4 до запуска моего демо:

Как и я написал уже есть два слоя: слой для Xorg и слой для мыши.

А вот так выглядит список слоев после запуска моего demo:

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

Я знаю, что микрокомпьютеры Raspberry иногда используются для создания различных киосков. И для киосков иногда нужно делать OSD, On Screen Display — то есть накладывать одно изображение поверх другого. Мне кажется, что DispmanX API идеально подходит для этих применений. Возможно кому-то понравится такое решение.

Источник

Изначально Raspberry Pi создавался скорее как учебное пособие для программистов. Но одноплатный мини ПК оказался настолько востребован, что быстро перерос статус простого помощника

Какой язык выбрать для Raspberry Pi

Это устройство напоминает Ардуино, но с уклоном в программирование. Если Arduino больше подходит для любителей поработать руками, то Raspberry Pi в большей степени – головоломка для мозга. На Хабре, да и на сайте разработчиков полно интересных проектов, основу которых составляет именно «малина». Это и датчики разного типа, и роботы, и аналоги планшетов (iPad, конечно, не заменит, но эксперимент отличный). Из ограничений здесь – только ваша фантазия и скилл в программировании.

Популярность сделала свое дело – под Raspberry Pi адаптированы практически все популярные языки программирования. КПД у всех разный и сегодня мы предлагаем не концентрироваться на каком-то одном проекте, а коротко пройтись по языкам, пригодным для работы с «малиной».

Scratch

Один из основных языков Raspberry Pi. Создавался как язык для детей, а его разработчики использовали принцип конструктора Лего. Создание программы на Scratch напоминает составление блок-схемы. Программы состоят из отдельных графических блоков, каждый подписан, в числе поддерживаемых есть и русский язык.

Подходит для первых шагов в освоении IoT. Язык набирает популярность, а его исходники включены в Raspbian.

Один из базовых языков для работы с «малиной». Если ваш проект предполагает работу с серверными системами, например, в составе IoT, то C – идеальный выбор. Он позволяет отказаться от машинных команд и вывести производительность на максимум. Сама Raspbian – Unix система и C в ней базовый язык.

Если проект предусматривает работу с «яблочными устройствами», придется использовать Objective-C. Но и это проблемой не станет, компилятор без проблем понимает обычный C код.

Создавая проекты на Raspberry Pi работать придется в 2 направлениях:

С++ подходит под обе задачи. Язык обеспечивает безопасность, надежность и скорость работы – то, что нужно для Raspberry Pi.

Если выберете этот язык, то работать придется по такой схеме:

Создавать код сразу на Raspbian будет сложно, пока что полноценную среду для этого не создали. Критическим недостатком это назвать нельзя, концепция Java (возможность запуска на любой платформе) позволяет создавать приложения для «малины» без ограничения функционала.

JavaScript

Изначально создавался как «язык для непрограммистов». Нечто, обладающее функционалом Java, но с более низким входным порогом. Задача решена, и мы получили легкий и функциональный язык для создания веб- и десктопных приложений. В работе пригодится платформа Node JS и сторонние библиотеки, в частности jQuery.

Python

Отсылка к этому языку скрыта в названии самого устройства, Pi указывает именно на Python. Для новичков этот язык – идеальный старт. Его синтаксис несложный, код получается простой и удобочитаемый, используются стандартные английские слова, запомнить их несложно.

Даже среда разработки на Raspberry Pi (IDLE) работает на этом языке. На сайте разработчиков есть развернутое руководство по Python, также в сети полно исходников по Python Games.

Языку уже больше 30 лет, и он до сих пор востребован. Из особенностей отметим громадное количество модулей CPAN и возможности по работе с текстом. Лучше всего Perl характеризует его символ – верблюд. Код получается может и не слишком красивым, зато он надежен и подходит для решения сложных задач.

В последние годы его популярность постепенно снижается, но на Raspberry Pi этой тенденции пока нет. Идеально подходит для сбора информации, задачу облегчает масса разных дополнений, расширений. Работать с кодом просто, наблюдается снижение быстродействия по сравнению, например, с C, но для «малины» это некритично.

CSS3 и HTML5

Эту связку рекомендуем тем, кто решил на основе «малины» создать виртуальную оболочку для смарт дома (Raspberry Pi подходит не только для развлекательных проектов). В Raspberry Pi встроен браузер Epiphany, значит нам необходим веб язык. Решение таких задач с помощью CSS3 и HTML5 максимально экономичное и быстрое.

Erlang

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

Прикладной язык с такими задачами не справится, но Erlang может. В случае с «малиной» подойдет только людям со стажем в программировании.

Заключение

Выбор языка для работы с Raspberry Pi должен проводиться с учетом того, какую задачу собираетесь решить. Для детской игрушки нелогично будет использовать Erlang, для умного дома лучше выбрать CSS3+HTML, чем Scratch. В остальном перед вами полная свобода действий, никто не загоняет вас в жесткие рамки. Занимайтесь творчеством, прокачивайте скилл в программировании и обязательно делитесь результатами своих экспериментов с Raspberry Pi.

Источник

5 способов сделать Python-сервер на Raspberry Pi. Часть 1

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

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

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

Примечание: эта статья является своего рода «экспериментом», как-то в комментариях жаловались что на Хабре недостаточно статей для начинающих. Я попытался восполнить пробел, ну а по оценкам будет видно, имеет смысл продолжать в таком формате или нет.

Настройка Raspberry Pi

Будем надеятся, что у читателя есть Raspberry Pi, которая подключена к домашней сети через WiFi или Ethernet, и читатель знает что такое IP адрес и как зайти удаленно на Raspberry Pi через SSH при помощи putty. Мы будем рассматривать так называемую headless-конфигурацию — без клавиатуры и монитора. Но перед тем, как делать что-то с Raspberry Pi, пара небольших лайфхаков.

Совет N1. Чтобы что-то удаленно делать с Raspberry Pi, на нем нужно настроить SSH, а по умолчанию он выключен. Можно пойти традиционным способом, и запустить стандартный конфигуратор, но можно сделать проще — после записи образа диска достаточно создать пустой файл ssh (без расширения) в корне SD-карты. Дальше, после загрузки Raspberry Pi, SSH будет сразу активен.

Чтобы зайти удаленно на устройство, нужно узнать IP-адрес Raspberry Pi. Для этого достаточно открыть контрольную панель своего маршрутизатора, найти там список DHCP-клиентов, скопировать оттуда нужный IP-адрес (например, это будет 192.168.1.102), и ввести команду putty.exe pi@192.168.1.102 (для Windows) или ssh pi@192.168.1.102 для Linux или OSX.

Однако, IP-адреса могут меняться, например после перезагрузки маршрутизатора, это не всегда удобно. Из этого следует Совет N2 — настроить статический IP-адрес. Для этого на Raspberry Pi выполняем команду sudo nano /etc/dhcpcd.conf, и вводим следующие настройки:

Если нужен адрес WiFi, то интерфейс будет wlan0, если Ethernet то eth0. IP-адреса разумеется, нужно тоже подставить свои. После перезагрузки убеждаемся что IP-адрес правильный, введя команду ifconfig.

Теперь все готово, можем приступать к Python. Все примеры даны для Python 3.7, т.к 2.7 уже давно устарел, и поддерживать его бесмысленно. Но при небольших изменениях кода все заработает и там, если нужно. Кстати, язык Python является кроссплатформенным — это значит что весь приведенный ниже код можно запустить и на Windows и на OSX, ну и разумеется, на Raspberry Pi. Из этого следует Совет N3 — отлаживать программу можно и на обычном ПК, а уже готовую версию заливать на Raspberry Pi. Возможно, придется лишь сделать функции-обертки для методов GPIO, все остальное будет работать.

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

Способ 1: командная строка

Самый простой способ, не требующий вообще никакого программирования.

Выбираем нужную папку на Raspberry Pi, и вводим команду:

Все, на Raspberry Pi работает файловый сервер! Достаточно зайти на страницу http://192.168.1.102:5000 и мы увидим наши файлы в браузере:

Способ 2: SimpleHTTPServer

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

Команда os.chdir является опциональной, если мы хотим предоставить доступ из сервера к какой-то другой папке, кроме текущей.

Способ 3: HTTPServer

Это уже полноценный web-сервер, способный обрабатывать GET и POST-запросы, возвращать разные данные и пр. Но и кода разумеется, понадобится больше.

Рассмотрим минимально работающий вариант сервера:

Запускаем браузер, и видим в нем нашу HTML-страницу:

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

Добавим в HTML тег img:

Исходный файл «raspberrypi.jpg» разумеется, должен лежать в папке с программой. Добавим в функцию do_GET возможность получения файлов:

Запускаем сервер, и видим соответствующую картинку:

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

Теперь мы можем открыть в браузере ссылку http://192.168.1.102:5000/status и увидеть текущие параметры системы:

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

Заключение

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

Важно: меры безопасности

Если для Raspberry Pi будет использоваться внешний IP-адрес, обязательно стоит помнить о мерах безопасности. Может показаться что ваш мини-сервер никому не нужен, однако сейчас не составляет труда пакетно просканировать все диапазоны IP-адресов (как пример, Украина, Австрия) и найти все доступные устройства. Так что обязательно стоит поменять пароль на Raspberry Pi, и не стоит хранить на устройстве какую-либо конфиденциальную информацию (папки Dropbox, имена/пароли захардкоженные в скриптах, фото и пр).

Источник

Мега-Учебник Flask, Часть 17: Развертывание на Linux (и даже на Raspberry Pi!)

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

Цель данного руководства — разработать довольно функциональное приложение-микроблог, которое я за полным отсутствием оригинальности решил назвать microblog.

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

В этой статье я исследую традиционные способы размещения приложения в сети Интернет, а потому сосредоточусь на использовании Linux серверов, а также на весьма популярном миникомпьютере Raspberry Pi. Облачные сервисы мы рассмотрим в следующей статье.

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

Где же нам найти хост для размещения? На сегодняшний день существует много предложений недорогого хостинга. Наименее затратным вариантом является использование VPS (virtual private server) — виртуальной машины, выглядящей для нас как выделенный сервер, однако на самом деле разделяющей физические ресурсы с другими пользователями хостинга. Вы можете изучить предложения на lowendbox.com, если хотите арендовать VPS для экспериментов (заметьте, ссылка не реферальная, а значит я не получу ни цента с вашего клика по ссылке).

Еще один простой способ раздобыть хост для установки нашего приложения — установка виртуальной машины на ваш собственный домашний компьютер. Если вы пользователь Windows или Mac и хотели бы приобрести опыт разворачивания приложения на сервере, управляемом Linux, и при этом не потратить ни копейки — тогда это ваш вариант. Установите VirtualBox, скачайте ISO образ Linux дистрибутива по вашему усмотрению, создайте Виртуальную Машину (VM) и установите на неё ОС при помощи ранее скачанного образа.

По моему мнению, выбор сделать вовсе не сложно. Для меня важно, чтобы платформа была открытой, т. к. большое сообщество разработчиков и пользователей справляется с задачей поддержания надежности и безопасности продукта гораздо лучше, чем одна компания может сделать, работая в одиночку над своим закрытым продуктом. Кроме того, мы бы хотели иметь доступ к большому количеству софта для установки, т. к. в случае возникновения проблем, в этом случае у нас будет больше шансов решить их. Основываясь на описанных выше критериях, я предпочту использовать сервер под управлением Linux или BSD серверу, работающему на Windows и OS X.

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

В качестве упражнения, при подготовке этой статьи, я протестировал несколько дистрибутивов Linux (дело в том, что на моем VPS отсутствует опция установки BSD). Я опробовал Fedora, Ubuntu, Debian и CentOS. Ни один из этих дистрибутивов не оказался простым в установке, но из них всех, установка и настройка CentOS прошла наиболее гладко, так что дальше речь пойдет именно о CentOS.

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

Готовы? Тогда начнем!

Хостинг на CentOS 6

Я предполагаю, что у нас есть свежеустановленный дистрибутив CentOS 6 на выделенном сервере или на VPS. Виртуальная машина на вашем PC также подойдет, но прежде чем продолжить, установите ОС.

Настройка клиентской стороны

Давайте начнем с авторизации на нашем новеньком CentOS 6 сервере. Откройте командную строку на вашем ПК (или Cygwin консоль если вы используете Windows) и запустите команду:

Далее вам будет предложено ввести пароль пользователя root. Если это выделенный сервер или VPS, то вы вводили пароль во время процесса установки. Если это ваша собственная виртуальная машина, то вы установили пароль во время инсталляции.

Установка пакетов с программным обеспечением

Теперь, когда мы вошли в систему, нам необходимо установить всё требуемое программное обеспечение, которое наверняка будет включать Python и веб сервер. Кроме того, мы заменим sqlite на более надежную СУБД — MySQL.

Команда, используемая для установки ПО в CentOS называется yum. Мы можем установить все требуемые пакеты одной командой:

$ yum install python python-devel httpd httpd-devel mysql-server mysql-devel git gcc sudo

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

Создание отдельного пользователя для нашего приложения

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

Мы назовем новый аккаунт apps, предполагая, что со временем у нас будет работать несколько приложений на этом сервере. Т.к. приложения будут запускаться под учетной записью веб сервера, мы добавим наш аккаунт apps в группу веб сервера (которая была создана во время установки Apache), таким образом, веб сервер будет иметь права на чтение и запись файлов нашего приложения. Если вы не знакомы с системой прав пользователя в Unix, тогда краткое руководство может быть найдено в Википедии.

Команда создания пользователя apps в CentOS выглядит так:

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

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

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

Вход без пароля

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

Теперь откройте терминал на вашем ПК (пользователи Windows — bash-консоль Cygwin-а). Для проверки наличия ключей, запустите следующую команду:

Если в папке имеются файлы id_rsa и id_rsa.pub, как показано выше, вы можете двигаться дальше. Если этих файлов нет, тогда выполните следующую команду:

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

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

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

Теперь мы должны скопировать эти данные в буфер обмена, а затем переключиться в CentOS, где выполнить следующую команду:

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

Эти команды изменят владельца этих файлов на аккаунт apps, а затем сделают папку и файл доступными только новому владельцу.

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

Если все прошло гладко, вам не придется вводить пароль для получения доступа.

Установка приложения

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

Приложение должно быть расположено на git сервере, доступном с нашего сервера. Я буду использовать свой репозитарий на github. Вы также можете использовать его, или, если вы предпочитаете, вы можете клонировать репозитарий и сделать его своим собственным.

Для установки microblog на наш сервер, нам будет достаточно команды git clone:

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

Первое, имеется несколько новых файлов на самом верхнем уровне — runp-sqlite.fcgi, runp-mysql.fcgi and killpython. Файлы *.fcgi представляют собой стартовые скрипты, используемые веб серверами, которые работают с FastCGI протоколом. Скрипт killpython будет перезапускать приложение после обновлений. Мы рассмотрим это всё позже.

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

Теперь будем это делать так:

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

Еще одно изменение имеется в файле setup.py, который занимался настройкой виртуального окружения. Теперь этот скрипт устанавливает также пакет mysql-python, который необходим SQLAlchemy для работы с СУБД MySQL. Кроме того, пакет Flask-WhooshAlchemy теперь устанавливается из моего собственного форка, т. к. у меня не получилось связаться с автором оригинального пакета и договориться о включении моих исправлений в основной дистрибутив.

Настройка MySQL

База данных sqlite, которую мы использовали всё это время прекрасно подходит для простых приложений, но когда мы перебираемся на полноценный сервер, который может обслуживать несколько одновременных запросов, лучше будет использовать более надежнуюю СУБД. Поэтому мы настроим MySQL для нашего microblog-а.

Мы уже установили MySQL, так что нам осталось лишь создать базу данных и пользователя с правами на эту базу. Для управления сервером базы данных мы используем консоль mysql:

И теперь, в командной строке mysql, мы создадим базу данных apps и пользователя с тем же именем:

Заметьте, что вы должны указать пароль пользователя apps в секции identified by. Для простоты, я установил пароль apps, но при реальной настройке БД необходимо использовать более надежные пароли. Не путайте пользователя apps базы данных с пользователем apps системы.

Инициализация приложения

Теперь, когда база данных готова, мы можем инициализировать наш microblog.

Для начала создадим виртуальное окружение:

Затем создаем базу данных:

Заметьте, как мы установили переменную окружения DATABASE_URL. Теперь приложение будет использовать MySQL базу данных вместо sqlite.

Далее мы компилируем все сообщения в нашей базе переводов:

И в конце, мы даем право на запись группе в две папки, которые должны быть доступны веб серверу:

Папка search.db используется нашей базой полнотекстового поиска Whoosh. Папка же tmp должна быть доступна для записи, для чего — станет ясно позднее.

Настройка Apache

Последнее, что нужно сделать — настроить веб сервер Apache.

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

Вот список команд, которые соберут и установят текущий выпуск mod_fcgid:

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

Установив этот модуль, мы приступаем непосредственно к настройке нашего сервера. Для этого мы должны отредактировать конфигурационный файл Apache. Различные дистрибутивы Linux так и не пришли к единому мнению по поводу расположения и именования этого файла, т.ч. вам придется разобраться с этим вопросом самостоятельно. Например, в CentOS, конфигурационный файл расположен по адресу /etc/httpd/conf/httpd.conf.

Сюда мы просто добавим определение нашего сервера. В конце файла добавьте следующие строки (делайте это от имени администратора root, т. к. этот файл не доступен на запись для простых пользователей):

Параметр FcgidIPCDir указывает на папку, где будут создаваться файлы сокетов. Я обнаружил, что по умолчанию они создаются в папке, в которой пользователь apache не имеет права на запись, поэтому я решил размещать эти файлы в /tmp.

Apache будет выполнять этот файл для запуска нашего приложения. Заметьте, как мы поместили название базы MySQL в окружение, чтобы Apache мог узнать его.

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

Для активации произведенных изменений, мы должны перезапустить сервер из-под аккаунта root:

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

Установка обновлений приложения

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

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

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

Команда git pull скачает все новые и обновленные файлы с нашего сервера git. Затем, мы обновим нашу базу данных и перекомпилируем файлы перевода, если они изменились. И это всё!

Теперь когда все обновления получены, необходимо перезапустить FastCGI процессы, и это несколько затруднительно, т. к. мы вошли под пользователем apps, непривелигированным пользователем, в то время как процессы FastCGI принадлежат пользователю apache.

И в этом случае нам пригодится sudo. Команда sudo позволяет пользователям запускать приложения от имени другого пользователя. Мы не хотели бы давать нашему пользователю apps слишком много прав, поэтому дадим ему только право отправлять сигналы останова FastCGI процессам, запущенным пользователем apache.

Скрипт killpython из нашей папки microblog, делает как раз это:

Загвоздка в том, что если мы запустим этот скрипт от имени пользователя apps, у нас не будет необходимых привелегий для остановки процессов, принадлежащих пользователю apache. Чтобы позволить пользователю apps прерывать эти процессы, мы должны внести небольшие изменения в файл /etc/sudoers:

Заметьте, что эти изменения вы должны вносить от имени пользователя root, т. к. /etc/sudoers это системный файл.

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

Теперь, войдя под учетной записью пользователя apps, мы можем прерывать процессы python выполнив команду:

Если процессы FastCGI будут прерваны, Apache перезапустит их, получив следующий запрос к microblog-у.

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

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

Что еще можно добавить

Хостинг на Raspberry Pi

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

Кстати, заметьте, что Raspbian является ответвлением дистрибутива Debian, а это значит что приведенные ниже инструкции будут применимы (возможно, с минимальными корректировками) и для серверов на базе Debian/Ubuntu.

Теперь мы повторим те же шаги, которые мы прошли для CentOS, чтобы настроить RPi сервер.

Настройка клиентской стороны

Raspberry Pi представляет собой полноценный компьютер. Вы можете подключить HDMI монитор, клавиатуру, мышь и работать прямо на нем для настройки серверного ПО. Вроде того, как мы делали на CentOS (да и вообще на любом дистрибутиве Linux), вы можете просто подключить Raspberry Pi к сети, а затем подключиться к ней при помощи ssh. Смотрите подраздел «Настройка клиентской стороны» выше, чтобы настроить ssh на своем ПК.

Заметьте, что я не затронул установку и настройку самой Raspberry Pi, т. к. об этом написана масса статей. Я предполагаю, что Raspberry Pi уже запущена и подключена к сети.

Установка пакетов с программным обеспечением

Т.к. Pi всё же представляет собой машину с ограниченной мощностью, мы не будет устанавливать полновесный Apache/MySQL стэк, как мы сделали это на CentOS. Вместо этого, мы применим легкий подход. В качестве веб сервера мы используем Lighttpd, небольшой веб сервер с очень хорошей и эфективной реализацией FastCGI. В качестве СУБД мы оставим sqlite.

Для CentOS мы использовали yum для установки пакетов. В дистрибутивах же семейства Debian, используется менеджер пакетов apt-get:

Команда update скачивает и обновляет список пакетов на ваш Pi. Команда upgrade обновляет все установленные пакеты до их последних версий. Рекомендуется запускать эти команды периодически, чтобы сохранять актуальность используемого ПО. И, наконец, команда install устанавливает необходимые нам пакеты.

Создание отдельного пользователя для нашего приложения

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

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

Вход без пароля

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

Установка приложения

Приложение устанавливается при помощи git:

Инициализация приложения

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

Заметьте, что setup.py попытается установить поддержку для MySQL и эта попытка будет провалена, но это и не страшно, т. к. мы не используем MySQL.

Все файлы принадлежат пользователю pi. Но как мы увидели в случае с CentOS, веб сервер будет запущен от имени другого пользователя. Т.к. обеспечение безопасности не является необходимостью на этом сервере, мы поступим проще:

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

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

Настройка Lighttpd

Lighttpd имеет встроенную поддержку FastCGI, а значит нам не придется заниматься установкой отдельного модуля для этих целей.
Всё что нам нужно сделать — добавить наш сайт в конфигурационный файл, расположенный по адресу /etc/lighttpd/lighttpd.conf:

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

Выражение fastcgi.server определяет поведение нашего FastCGI сервера, доступного по адресу /microblog. Причина, по которой мы не разместили приложение по адресу / проста, возможно позднее мы запустим больше одного приложения, и в таком случае размещение всех адресов нашего приложения в /microblog будет играть роль пространства имен.

Внутри определения FastCGI мы задаем расположение сокет файла в папке /tmp и путь к нашему файлу runp-sqlite.fcgi, который Lighttpd будет запускать для старта FastCGI процессов. Опция check-local сообщает Lighttpd о необходимости отправлять запросы FastCGI серверу, даже если запрошенный путь соответствует файлу на диске. max-procs ограничивает количество процессов FastCGI до 1, что для небольшого сервера вполне достаточно, а также поможет избежать потенциальных проблем при нескольких одновременных запросах на запись в базу sqlite.

Секция alias.url отражает запросы к статике на локальный путь к соответствующему файлу..

Скрипт runp-sqlite.fcgi очень похож на тот, что мы использовали на CentOS, только без перезаписи настроек базы данных:

Некоторые необходимые исправления

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

Во-первых, наши файлы javascript и css не загружаются. Проблему легко решить, заглянув в исходный код страницы на странице входа. В шаблоне base.html эти файлы заданы абсолютными путями, которые начинаются со /static, однако же мы добавили префикс /microblog к нашим адресам. Например, вот как указана ссылка на файл CSS:

В то время, когда на самом деле мы бы хотели видеть здесь /microblog/static/bootstrap.min.css, и, конечно же, мы не можем просто добавить /microblog в шаблон base.html потому что это приведет к неработоспособности нашего приложения на сервере разработки, запущенном на нашем ПК. Решением является генерация этих адресов автоматически при помощи url_for:

После обновления, все js и css файлы будут загружаться корректно.

Но попытка залогиниться, обнаружит новую проблему. Сразу после авторизации, мы получаем ошибку 500. К счастью для нас, у нас включено логирование, поэтому быстрое изучение /home/pi/microblog/tmp/microblog.log приводит нас к следующий ошибке:

Это еще что? Мы не запускаем несколько потоков, но очевидно, что наше приложение всё же использует несколько потоков. Единственное отличие между сервером для разработки и этим состоит в том, что тут мы используем flup для FastCGI сервера. Заглянув в исходный код этого модуля, мы узнаем, что по умолчанию flup запускает многопоточный сервер.

Возможным решением может быть использование одного потока сервера FastCGI, предоставляемого flup. Однако, это может навредить производительности в случае нескольких конкурирующих подключений. Другим, более перспективным путем решения этой проблемы, может стать разрешение многопоточности в sqlite (которая, кажется, полностью поддерживается). Многопоточность можно разрешить в SQLAlchemy, установив check_same_thread параметр в False в нашем конфигурационом файле config.py:

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

И, наконец, мы запустии наше приложение на Raspberry Pi!

Установка обновлений приложения

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

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

Заключение

Обновленное приложение доступно, как всегда, на github. Или же вы можете скачать его в виде zip архива по ссылке:
Скачать microblog 0.17.

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

Источник

Теперь вы знаете какие однокоренные слова подходят к слову Как написать программу для raspberry pi, а так же какой у него корень, приставка, суффикс и окончание. Вы можете дополнить список однокоренных слов к слову "Как написать программу для raspberry pi", предложив свой вариант в комментариях ниже, а также выразить свое несогласие проведенным с морфемным разбором.

Какие вы еще знаете однокоренные слова к слову Как написать программу для raspberry pi:



Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *