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

C и C++

int  main(int argc, char* argv[])
{
    argc;    // количество аргументов + 1
    argv[0]; // имя программы
    argv[1]; // первый аргумент
    argv[2]; // второй аргумент
    // ...
}

Bash

#!/bin/bash

# $# — количество аргументов
#
# $* — аргументы одной строкой
# $@ — список аргументов

echo $0    # имя скрипта
echo $1    # первый аргумент
echo $2    # второй аргумент
# ...
echo $9    # девятый аргумент
echo $(10) # десятый аргумент
echo $(11) # одиннадцатый аргумент
# ...

Cmd.exe

echo %0 REM имя срипта
echo %1 REM первый аргумент
echo %2 REM первый аргумент
REM ...
echo %9 REM девятый аргумент

Python

import sys

sys.argv      # список аргументов
len(sys.argv) # количество аргументов + 1
sys.argv[0]   # имя скрипта
sys.argv[1]   # первый аргумент
sys.argv[2]   # второй аргумент
# ...

Java

public class CommandLine {
    static public void main(String args[]) {
        args.length; // количество аргументов
        args[0];     // первый аргумент
        args[1];     // второй аргумент
        // ...
    }
}

C Sharp

class MainClass
{
    static int Main(string[] args)
    {
        args.Length; // количество аргументов
        args[0];     // первый аргумент
        args[1];     // второй аргумент
        // ...
    }
}
Реклама

Файловый хостинг Amazon S3 + Django + Heroku

Django — библиотека для создания сайтов на языке Python.

Heroku — платформа, которая позволяет размещать сайты, сделанные на Django.

Heroku не предоставляет постоянного хранилища для файлов, которые пользователь загружает через сайт, поэтому необходимо воспользоваться каким-то сторонним сервисом, например, Amazon S3.

Допустим, что мы уже зарегистрировались на Heroku и Amazon.

Настройка Amazon

Перейдем в My Security Credentials (учетные данные безопасности).

My Security Credentials

Создадим новый ключ доступа с помощью кнопки Create New Access Key.

Create New Access Key

Появится окно с идентификатором ключа и секретным ключом. Их надо сохранить, чтобы потом настроить Heroku. Сохранить можно в файл с помощью кнопки Download Key File.

Access Key

Теперь нужно перейти в Amazon S3 и создать хранилище (кнопка Create Bucket).

Amazon S3

Зададим DNS-совместимое имя хранилища и регион такой же как на Heroku, чтобы минимизировать задержки при передаче данных. Остальные настройки можно оставить без изменения. Имя понадобится для настройки Heroku.

Create Bucket

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

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

Загрузим один файл, чтобы узнать по какому адресу располагается наше хранилище. Адрес зависит от выбранного региона. Часть ссылки, которая подчеркнута красным, понадобится для настройки Heroku.

example.txt

Настройка Heroku

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

Heroku Config Variables

Требуется назначить 4 переменные окружения на основе настроек Amazon:

  • AWS_ACCESS_KEY_ID — идентификатор ключа.
  • AWS_SECRET_ACCESS_KEY — секретный ключ.
  • AWS_STORAGE_BUCKET_NAME — имя хранилища.
  • AWS_URL — адрес, по которому располагается хранилище.

Настройка проекта Django

Для работы с Amazon S3 нужно установить пакеты django-storages и boto3.

  • django-storages — это коллекция хранилищ для Django.
  • boto3 — библиотека для работы с сервисами Amazon.

Если используется файл requirements.txt для удовлетворения зависимостей, то в него нужно прописать пакеты нужных версий, например:

django-storages==1.6.5
boto3==1.4.7

Установить пакеты можно следующей командой:

pip install -r requirements.txt

В файле settings.py нужно прописать следующий код.

INSTALLED_APPS = (
    ...
    'storages',
    ...
)

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')
AWS_URL = os.environ.get('AWS_URL')

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

AWS_MEDIA_URL = "{}/{}/".format(AWS_URL, AWS_STORAGE_BUCKET_NAME)

MEDIA_URL = AWS_MEDIA_URL

Продолжение будет…

Добавление Sitemap с помощью DjangoCMS

Sitemap — XML-файлы с информацией для поисковых систем (таких как Google, Яндекс, Bing, Поиск@Mail.Ru) о страницах веб-сайта, которые подлежат индексации.

DjangoCMS может самостоятельно сгенерировать Sitemap с опубликованными на сайте страницами.

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

  1. В файле настроек settings.py добавляем django.contrib.sitemaps в INSTALLED_APPS.
  2. Добавляем следующую строчку в начало файла urls.py.
    from cms.sitemaps import CMSSitemap
  3. В том же файле (urls.py) добавляем в список urlpatterns следующий код.
    url(
        r'^sitemap\.xml$',
        'django.contrib.sitemaps.views.sitemap',
        {'sitemaps': {'cmspages': CMSSitemap}}
    ),
    
  4. Запускаем локальный сайт. Вводим в адресную строку браузера http://127.0.0.1:8000/sitemap.xml (или кликаем по ссылке) и убеждаемся в наличие Sitemap.

Ссылки

How to create sitemaps (официальная документация на английском)

Openshift и Django: раздача загруженных файлов

Интерфейс сайта может позволять пользователю загружать файлы. Файлы должны загружаться в папку, которая указана в переменной MEDIA_ROOT в файле settings.py следующим образом.

MEDIA_ROOT = os.path.join(os.environ['OPENSHIFT_DATA_DIR'], 'media')

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

При использовании Django-CMS, файлы загружаются именно в MEDIA_ROOT.

Но есть сложность с раздачей этих файлов. Django не имеет инструментов для раздачи загруженных файлов на боевом сервере.

Чтобы раздавать загруженные файлы надо пойти на хитрость. Сделать так, чтобы они раздавались как static-файлы.

static-файлы автоматически собираются в папку, которая указана в переменной STATIC_ROOT.

Читать далее Openshift и Django: раздача загруженных файлов

Отладка Django-сайта на боевом сервере OpenShift

Ни в коем случае нельзя включать отладку на боевом сервере. Рекомендуется создать копию сервера, недоступную для пользователя.

В файле settings.py задается переменная DEBUG. Если при загрузке страницы произошла ошибка, то в зависимости от значения этой переменной выдается либо страница с HTTP ошибкой, либо страница с отладочной информацией.

На локальном сервере разработчика значение DEBUG равно True большую часть времени, а на боевом сервере значение DEBUG должно быть всегда равно False. Но можно создать тестовый сервер, копию боевого, где значением DEBUG можно управлять.

Следующий код позволяет включать и отключать отладку на локальном сервере и на сервере Openshift. Код располагается в файле settings.py.

import os
ON_PAAS = 'OPENSHIFT_REPO_DIR' in os.environ
LOCAL_DEBUG = True
ENV_DEBUG = os.environ.get('DEBUG') == 'True'

DEBUG = (not ON_PAAS and LOCAL_DEBUG) or (ON_PAAS and ENV_DEBUG)

if ON_PAAS and DEBUG:
    print("Warning: debug mode!")

Переменная ON_PAAS равна True если код выполняется на сервере Openshift, иначе она равна False. Переменная LOCAL_DEBUG включает или отключает локальную отладку.

При отключении отладки на локальном сервере в список ALLOWED_HOSTS должна быть добавлена строка ‘localhost’.

ALLOWED_HOSTS = ['localhost']

Включить отладку на сервере Openshift можно если создать переменную окружения DEBUG со значением True.

Управлять переменными окружения на Openshift можно с помощью инструмента rhc. Следующие команды включают отладку на сервере Openshift.

rhc env set DEBUG=True -a test
rhc app stop -a test
rhc app start -a test

Где test — это имя приложения. Первая команда устанавливает переменную окружения, а две другие перезапускают приложение.

Отключить отладку можно следующими командами.

rhc env unset DEBUG -a test
rhc app stop -a test
rhc app start -a test

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

rhc env set DEBUG=False -a test

 

Угол опрокидывания тела

ugol-oprokidivaniya.png

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

\alpha = arctg \left(\frac{X_M}{Y_M}\right)

Расчет на Питоне:

import math
Xm = 1.5
Ym = 2
math.degrees(math.atan(Xm / Ym))

Результат примерно 37°.

Публикация проекта в PyPI

PyPI — это хранилище пакетов Python.

Регистрируемся на сайте PyPI и на TestPyPI. Поле PGP Key ID заполнять необязательно. На TestPyPI регистрироваться не обязательно, это хранилище нужно только для тренировки, перед тем как опубликовать пакет в PyPI.

В домашней папке пользователя создаем файл .pypirc. Точка в начале имени файла обязательна. Этот файл нужен программе twine, которая выкладывает пакеты. О ней пойдет речь позже.

Добавляем в файл следующее содержимое.

[distutils]
index-servers =
    pypi
    testpypi

[pypi]
repository = https://pypi.python.org/pypi
username = Логин
password = Пароль

[testpypi]
repository = https://testpypi.python.org/pypi
username = Логин
password = Пароль

Вместо Логин и  Пароль указываем логин и пароль, использованные при регистрации на сайтах PyPI и TestPyPI.

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

  • example
    • example
      • __init__.py
      • foo.py
    • LICENSE.txt
    • MANIFEST.in
    • README.rst
    • setup.cfg
    • setup.py

Для большей наглядности приведу изображение.

pypi-dirs-and-files.png

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

Для публикации проекта нужно заполнить файл setup.py, все остальные файлы могут быть пустыми.

Файл setup.py следует заполнить следующим образом.

from setuptools import setup, find_packages

setup(
    name='example',
    version='0.0.1',
    description='Короткое описание',
    packages=find_packages(),
    author='Имя автора',
    author_email='Почта@автора',
    url='http://Сайт проекта',
)

В файле лучше использовать только латиницу.

Чтобы собрать пакет, в папке, где содержится файл setup.py (папке проекта), выполняем следующую команду .

python setup.py sdist

После этого в папке проекта появятся папки dist и example.egg-info.

pypi-dirs-and-files-after-build.png

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

pip install twine

Зарегистрируем пакет в тестовом хранилище TestPyPI следующей командой.

twine register -r testpypi dist/example-0.0.1.tar.gz

С помощью опции -r задается хранилище, которое было указано в файле .pypirc.

Загрузим пакет в хранилище следующей командой.

twine upload -r testpypi dist/example-0.0.1.tar.gz

Пакет появится в списке пакетов на сайте хранилища.

testpypi-your-packages.png

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

Построение графиков в Python. Библиотека Matplotlib и ее руссификация

Matplotlib — библиотека Python для отображения двумерных и трехмерных графиков.

Установить Matplotlib в Ubuntu можно следующей командой:


sudo pip3 install matplotlib

В Windows применяет аналогичная команда, только без sudo.

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

matplotlib-bad-russian-label

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

from matplotlib import rc

font = {
    'family': 'Arial',
    'weight': 'normal',
    'size': 12,
}
rc('font', **font)

Этот код устанавливает для всех надписей шрифт Arial размером 12.

Чтобы шрифт Arial присутствовал в Ubuntu, следует установить пакет шрифтов Windows следующей командой:


sudo apt install msttcorefonts

Ниже приведен пример скрипта, отображающего график синусоидального напряжения 220 В 50 Гц.

from math import *
from matplotlib import pyplot
from matplotlib import rc

font = {
    'family': 'Arial',
    'weight': 'normal',
    'size': 12,
}
rc('font', **font)

Um = 220 * 2 ** 0.5  # Амплитуда сигнала
F = 50  # Частота сигнала
P = 3  # Количество периодов сигнала
N = 100  # Количество точек на период
Fd = F * N  # Частота дискретизации
Td = 1 / Fd  # Период дискретизации

t = [n * Td for n in range(P * N)]  # Время
u = [Um * sin(2 * pi * F * t) for t in t]  # Сигнал

pyplot.ylabel('Напряжение, В')
pyplot.xlabel('Время, с')
pyplot.plot(t, u)
pyplot.grid()
pyplot.show()

Получается следующий красивый график:

matplotlib-220v-50hz

IDLE в качестве калькулятора

idle

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

На картинке показано вычисление простейшего выражения 2 + 2 * 2. После ввода этого выражения и нажатия Enter вы получите результат 6 в следующей строке.

Программа устанавливается вместе с установкой Python. Можете нажать на ссылку и скачать версию 3. Установщик весит около 30 МБ. Установка проходит быстро и легко.

Программистам будет приятно конвертировать числа между системами счисления. Например, если ввести шестнадцетиричное число 0xF0F и нажать Enter, то вы получите десятичное число 3850. Ввод двоичных чисел осуществляется с помощью префикса 0b, например 0b1100 даст 12. Чтобы конвертировать десятичное число в двоичное, используйте функцию bin(). Например bin(12) даст 0b1100. Для шестнадцетиричных чисел используйте функцию hex().

А если изучить язык Python, то можно легко и быстро писать сложные программы. Более удобного средства для вычислений любой сложности я не знаю. Громоздкие математические программы не нужны.

Ниже показано получение таблицы синуса с шагом в 30 градусов в две строчки:

idle_sin_table

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

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

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

2016.06.14 23:10:06

(14 июня 2016 год, 23 часа 10 минут 6 секунд. Год из 4 цифр. Месяц, день месяца, часы, минуты и секунды из двух цифр, дополняются нулями. Часы в 24 формате).

Система шаблонов Форматная строка
date (Linux) %Y.%m.%d %H:%M:%S
C/C++ %Y.%m.%d %H:%M:%S
Python %Y.%m.%d %H:%M:%S
SQLite %Y.%m.%d %H:%M:%S
ISO 8601 YYYY.MM.DD hh:mm:ss
Qt yyyy.MM.dd hh:mm:ss
C# yyyy.MM.dd HH:mm:ss