Архив метки: Программирование

Почему новичкам следует изучать Python

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

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

Python, с другой стороны, решает многие проблемы за вас. Он работает заметно медленнее, чем C++, зато на нём гораздо проще писать. И как новичка вас вряд ли заботит его скорость, вы просто хотите сделать что-нибудь крутое и изучить основные понятия.

Итак, первое решение, которое вам нужно принять — какой язык вы хотите выучить. Почему из сотен языков новичку следует изучать Python? Тому есть несколько причин…

Простой синтаксис

Часть философии языка (как показано в PEP 20, “Дзен Python”), содержит следующее:

  • Красивое лучше, чем уродливое.
  • Простое лучше, чем сложное.
  • Читаемость имеет значение.

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

Давайте сравним синтаксис языков Python и C++ на простом примере ‘Hello, World’:

C++:

#include stdout

int main() {  
    std::cout << "Hello, world!n";
}

Python:

print('Hello, world!')  

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

Python:

x=1  
while x <=5:  
    print 'x is less than 5:' + str(x)
    x += 1

PHP:

<?php  
$x=1;
while($x<=5) {  
    echo "x is less than 5: $x";
    x++;
}
?>

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

Python:

def foo(x):  
    if x == 0:
        bar()
        baz()
    else:
        qux(x)
        foo(x - 1)

C:

void foo(int x)  
{
    if (x == 0) {
        bar();
        baz();
    } else {
        qux(x);
        foo(x - 1);
    }
}

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

С ключевыми словами is, not и with, хорошо написанный скрипт на Python можно читать почти как английский текст. Это особенно верно для условий в цикле if , которые бывает сложно прочесть, когда они разрастаются:

a = None
b = None

if a is not None and b is not None:
    print 'Foo!'
else:
    print 'Bar!'

Условное выражение выше гораздо яснее, чем обычное if ((a != null) && (b != null)).

Легко установить и начать работать

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

С Python, всё, что вам нужно — это загрузить и запустить установщик и выполнить python <your-script>.py. Не нужно никаких сложных структур каталогов.

Хотя это всё реже встречается в современных языках, компиляция кода может быть сложнее, чем вы думали (впрочем, это не обязательно плохо). Просто посмотрите на этот маленький makefile для C:

CC = gcc  
CFLAGS  = -g -Wall

TARGET = myprog

all: $(TARGET)

$(TARGET): $(TARGET).c
    $(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c

clean:  
    $(RM) $(TARGET)

Замечу, что это простой makefile. Этому я бы предпочёл Python в любом случае.

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

Огромная стандартная библиотека

Одно из наиболее знаменитых преимуществ Python — стандартная библиотека, и это не просто так. Она содержит более 300 модулей (в версии 3.5), от простейшего HTTP сервера (http.server) до баз данных (sqlite3), и сжатых библиотек (gzip).

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

Главное достоинство того, что код был написан до вас — знание того, что он тщательно протестирован и не содержит ошибок. Зачастую он был давно доступен и использовался крупнейшими компаниями (о них мы поговорим позже), так что вы знаете, через что он прошёл.

Сообщество

Большое, активное сообщество означает две вещи:

  • Много самописных библиотек
  • Много людей, готовых вам помочь

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

Python постоянно занимает высокие места в различных рейтингах, таких как Redmonk (#4) и Tiobe (#4). И что более важно, язык очень востребован работодателями. На графике ниже можно видеть (представлен Indeed), что Python — второй по этому показателю язык, что даёт вам возможность применить свои навыки программирования в работе.

Почему новичкам следует изучать Python

Легко отлаживать

Один из самых сложных навыков для новичка — это отладка. Именно здесь вы по-настоящему узнаёте язык и то, как он работает изнутри. Иногда у вас будут простые ошибки типа синтаксических, в других случаях они будут проявляться в 1 из 100 запусков вашей программы. Тут вам придётся ближе познакомиться со своим отладчиком и основными ошибками в языке. К счастью для вас, Python располагает хорошей системой обработки и отчётов об ошибках, чего нет у многих других языков.

Например, если что-то пойдёт на так в C++ (разыменование неправильного указателя, обращение к элементу вне массива и так далее), вам повезёт, если упадёт программа. В таком случае вы знаете, что где-то в ней есть проблема, но едва ли знаете где (а отладчики не всегда просты и понятны новичкам). Если вам не повезло и программа не упала (или падает в случайное время), вы получите непонятные и не очень очевидные ошибки.

Что не умеет делать Python

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

Как я упоминал несколько раз, Python медленный. Точнее, очень медленный по сравнению с компилируемыми языками наподобие C, C++ или Go. Дело в том, что есть несколько особенностей, которые замедляют язык, вроде динамической типизации или сборщика мусора. Таким образом, не нужно использовать чистый Python для обработки больших массивов данных, вместо этого вам нужно добавить код на C++.

Из-за сборки мусора в Python’s его нельзя применять для систем реального времени. Причина в том, что она запускается в непредсказуемое время, так что вы не можете знать, займёт ли ваша функция 1 мс или 100 мс. Тут получается слишком много неизвестных. Вместо него для программ реального времени вам потребуется язык с ручным управлением памятью, такой как C или C++.

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

Вывод

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

Какой язык вы изучали первым и почему? Сообщите в комментариях!

Сообщение Почему новичкам следует изучать Python появились сначала на GitJournal.

Генератор (собиратор) описаний функций PHP

Читать

BASH. (Пере) подключение к WIFI

Мой небольшой нетбук на Linux работает 24/7. Он выполняет сразу несколько периодических скриптов. Так уж получилось, что его обязанность нельзя перенести на VPS или какой-нибудь хостинг. Поэтому крайне необходимо, чтобы этот нетбук непрерывно функционировал. Но наличие устойчивой ОС не гарантирует стабильность работы. Читать

Linux. Запуск скрипта каждые N секунд

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

Читать

wget: команда не найдена

У некоторых дистрибутивов Linux отсутствует пакет wget из коробки. Поэтому могут возникнуть сложности с установкой и работой других программ и обновлений. Читать

Как создать действительно случайный и доказуемо безопасный пароль / Все про пароли



Менеджеры паролей, такие как KeePass, 1Password и множество других, в значительной степени решают эту проблему. С их помощью вы можете генерировать уникальный и безопасный пароль для каждого сайта, который вы посещаете. Но такой менеджер защищен ровно настолько, насколько безопасен главный пароль, который вы используете для доступа к нему. Вы должны быть уверены, что его достаточная случайность и неугадываемость подтверждена количественными измерениями, а не только тем, что вы воспринимаете его случайным по причине наличия нескольких цифр или восклицательных знаков. Если нам требуется истинная случайность, нам понадобится кое-что специальное.

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



Бросание игральной кости позволяет получить случайное число от 1 до 6, которое даёт нам 2,58 бита информации.

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

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



В действительности нет нецелых, поэтому мы всегда округляем до ближайшего бита. В этом случае нам нужно 3 бита для хранения числа от 1 до 6, но на самом деле мы можем хранить и от 0 и до 7:

000 - 0
001 - 1
010 - 2
011 - 3
100 - 4
101 - 5
110 - 6
111 - 7


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

По сути, переменная с n-ным количеством битов может иметь 2^n (2 в степени n) возможных значений. Поскольку байт состоит из 8 битов, то он может иметь 2^8 (256) возможных значений.

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

Компьютеры имеют ограниченное количество свободной памяти. Каждый раз, когда мы объявляем переменную, небольшая часть этой свободной памяти выделяется до тех пор, пока переменная существует. Поскольку современные компьютеры имеют много памяти, то в большинстве случаев – это не проблема, особенно когда в программе всего лишь несколько переменных. Тем не менее, для программ, которые требуют большого количества переменных (например, 100 000), разница между использованием 1-байтовых или 8-байтовых переменных может быть значительной.


Так видеоигра The Legend of Zelda, выпущенная в 1987 году была 8-битной и имела ограничение для значений переменных равное 255.

Я хотел бы, чтобы энтропия для подбора моего пароля была по крайне мере 128 бит. По большинству исследований, взлом 128-битного шифрования практически невозможен с использованием методов грубой силы менее чем за несколько миллиардов лет. Используя уравнение 2^n, мы можем хранить одно из 3.4*10³⁸ различных значений, используя 128 бит. Если бы вы могли протестировать 100 миллиардов возможных значений в секунду, все равно потребовались бы десятки триллионов лет, чтобы угадать правильный пароль. Я считаю это достаточно хорошо. 128-битный пароль почти наверняка не будет слабым звеном в цепочке вашей онлайн-безопасности.

Если каждый из наших кубиков вырабатывает 2,58 бита энтропии за один бросок, то подбрасывание пяти даст нам 12,9 бита. Если мы используем 5 игральных костей 10 раз, то мы получим 129 бит информации, а для тех кто не знает результатов создадим неопределенность или энтропию равную 129 битам.

Но как превратить эти результаты в безопасный, но запоминающийся пароль?

Я использую Diceware, который является словарем слов, индексированных с помощью результатов подбрасывания пяти игральных костей. Каждый раз, когда вы бросаете 5 кубиков (или один 5 раз), числа, которые получаются, соответствуют слову в списке. Например, если на 5 кубиках выпало 1-4-2-6-3, нужно перейти на страницу со всеми словами 14xxx и обнаружить, что 14263 соответвтует «blab». Сделайте это десять раз, и вы получите строку из десяти слов. Эти десять слов — потенциальный пароль.

Далее нам поможет мнемотехника — совокупность специальных приёмов и способов, облегчающих запоминание нужной информации и увеличивающих объём памяти путём образования ассоциаций (связей). Например, можно использовать «принцип сюжета» — сочинить рассказ (сюжет), в котором задействованы запоминаемые слова. Например, чтобы запомнить последовательность слов: «Слон, домик, телевизор», — придумываем: «Слон шёл к себе в домик смотреть телевизор». Возможно, вы будете чувствовать себя глупо, но это работает, и вы будете удивлены, как быстро вы можете запомнить вещи таким образом.



В PDF формате одна из версий словаря доступна по ссылке тут, а тут версия на русском языке.

Если все это кажется излишним, помните, что это пароль, за которым хранится вся ваша финансовая и онлайн-жизнь. Если считаете, что этого того стоит, спуститесь в магазин комиксов и купите кубики. Зайдите в комнату, где нет камер, телефонов или компьютеров, бросьте кубики и напишите соответствующие слова из словаря (я бы выбрал 15 слов, чтобы убрать несколько, которых бы не знал). Затем выберите десять слов и запомните их. Это ваш пароль. Храните запись в течение нескольких дней, пока не убедитесь, что запомнили пароль, который предложено использовать для входа в менеджер паролей.

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

Снимите шапочку из фольги и продолжайте свою жизнь. Надевать её время от времени — это нормально.

Комментарий Cloud4Y


Ранее этот вопрос поднимался на Хабрахабре в постах «Ликбез по псевдослучайным генераторам» и «Практические рекомендации по выбору паролей по результатам взлома antichat.ru«.

Основные выводы полученные автором:

1. Не столь важно, каким образом программа генератор получает пароли, сколь — откуда берет начальные данные. Если не происходит никакого интерактива вообще, следует усомниться.
2. Человек едва ли может уследить за отсутствием статистически популярных комбинаций в пароле, что подтверждается подбором 31790 паролей из 41037 MD5 хешей за 8 часов.

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

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

1 2 3 4 5 6
1 ~! # $% ^
2 & * ( ) — =
3 + [ ] { }
4:; » < >
5? / 0 1 2 3
6 4 5 6 7 8 9

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

P.S.
Также рекомендую статью Charlie Hoey «A Eulogy for the Headphone Jack» (Хвала «джеку»), в которой он описывает то, как, не имея страховки, сэкономил 1000 долларов на проверке собственного здоровья, собрав аппарат ЭКГ и почему нам важно сохранить разъем для наушников и не потерять доступ к почти универсальному и свободному от лицензий порту ввода-вывода. 

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

Автор: Валерий Фетисов
Дата публикации: 2018-02-04T07:44:00.000+02:00