View on GitHub

blog

О программировании и не только

письма юному программисту, #01

письмо первое

Привет, мой сыночек.

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

Мощный ноутбук, подаренный тебе в 10 лет, 4 года ждал этого момента, когда ты попросил папу - “настрой мне Windows, я хочу научиться писАть программы”. Что ж, отлично, я в очередной раз вычистил весь хлам который накопился после последней переустановки винды. Заодно установил WSL2 и Ubuntu-20.04, благо, Windows с недавних пор отлично дружит с Linux, более простую интеграцию с ВМ (Виртуальной Машиной) трудно придумать.

У нас вышел небольшой спор о русской версии Windows. С ноутбуком пришла английская версия, совершенно легальная и активированная, мы с твоим старшим братом Филиппом во время колла в скайпе дружно убеждали тебя оставить её. Надеюсь, ты уже убедился, что те пару сотен меню и названий программ не проблема знания языка, скорее наоборот, правильный способ именования. Программировать в любом случае придётся на английском, у любого программиста это основная раскладка, если, конечно, он не пишет письмо своему сыночку.

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

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

Итак, задачка №1, на 300 руб. - подсчитать сколько файлов находится на диске в твоей системе. Ты уже создал рабочее пространство в slack, мог задавать любые вопросы любым способом, или искать ответ в и-нете. Задачка осталась нерешённой, пора показать одно из решений.

В ВМ Линукс решение проще и надёжнее. Во-первых, Линукс более гибкая и удобная система, например, она видит ФС(Файловую Систему) винды, а вот для Windows увидеть все файлы в Линукс сложно. Кроме того, Линукс, как и прочие Юниксы, это инструментальная система, с помощью стандартных утилит задачка решается за минуты.

Нам понадобится пара утилит updatedb/locate. Первая из них находит и индексирует все файлы в ФС. Индексирует - это значит находит и сохраняет в своей БД(Базе Данных) все имена файлов для быстрого поиска. Надо эту утилиту запустить таким образом:

... $ sudo updatedb

Пока БД обновляется, мы продолжаем. Поиск выполняется другой полезной утилитой find, именно её в результате запустил скрипт updatedb. Когда все файлы проиндексированы, поиск любого из сотен тысяч файлов в системе выполняется мгновенно, напр., что это у нас только что выполнилось??

... $ locate updatedb
/etc/alternatives/updatedb     
/etc/alternatives/updatedb.1.gz
/usr/bin/updatedb
/usr/bin/updatedb.findutils
/usr/share/dlocate/updatedb
/usr/share/man/man1/updatedb.1.gz
/usr/share/man/man1/updatedb.findutils.1.gz

Т.е. locate нашёл и показал список файлов содержащих в имени указанный текст. Точно также можно с помощью locate получить список всех файлов в системе:

... $ locate . >all-files

Обрати внимание на маленькую точку, в ней скрыта особая магия. В этой команде она имеет специальный смысл, означающий любой символ. Т.к. имя файла состоит хотя бы из одного символа, мы можем быть уверены, что locate сохранил в новом файле all-files все доступные в обеих системах файлы. Осталось подсчитать число строк. Ещё одна утилита wc (word count) умеет это делать:

... $ wc -l all-files
553182 all-files

wc умеет считать строки, слова и символы, ключ -l показал только строки.

Задачка решена, но расскажу ещё немного о наших утилитах. Первая команда locate вывела нам список из 7 файлов. Мы можем использовать этот список в других командах, если воспользоваться ещё одним магическим символом |. Это вертикальная черта, или pipe, конвейер, передающий вывод, результат работы команды, на вход следующей команды в конвейере. Давай посмотрим, что это за файлы, имеющие слово updatedb в названии.

... $ locate updatedb|xargs file
/etc/alternatives/updatedb:  symbolic link to /usr/bin/updatedb.findutils
/etc/alternatives/updatedb.1.gz:  symbolic link to /usr/share/man/man1/updatedb.findutils.1.gz
/usr/bin/updatedb:           symbolic link to /etc/alternatives/updatedb
/usr/bin/updatedb.findutils: POSIX shell script, ASCII text executable
/usr/share/dlocate/updatedb: Perl script text executable
/usr/share/man/man1/updatedb.1.gz: symbolic link to /etc/alternatives/updatedb.1.gz
/usr/share/man/man1/updatedb.findutils.1.gz: gzip compressed data, max compression, from Unix, original size modulo 2^32 4977

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

Ещё пример, для закрепления:

... $ locate updatedb|xargs ls -l
lrwxrwxrwx 1 root root   27 фев  8 00:52 /etc/alternatives/updatedb -> /usr/bin/updatedb.findutils
lrwxrwxrwx 1 root root   43 фев  8 00:52 /etc/alternatives/updatedb.1.gz -> /usr/share/man/man1/updatedb.findutils.1.gz
lrwxrwxrwx 1 root root   26 фев  8 00:52 /usr/bin/updatedb -> /etc/alternatives/updatedb
-rwxr-xr-x 1 root root 9108 фев 18  2020 /usr/bin/updatedb.findutils
-rwxr-xr-x 1 root root 3792 янв 22  2017 /usr/share/dlocate/updatedb
lrwxrwxrwx 1 root root   31 фев  8 00:52 /usr/share/man/man1/updatedb.1.gz -> /etc/alternatives/updatedb.1.gz
-rw-r--r-- 1 root root 2089 фев 18  2020 /usr/share/man/man1/updatedb.findutils.1.gz

Первой опцией для xargs стоит ls -l, также важная команда, едва ли не самая частая. Легко запомнить - ls - это сокращение от list, т.е. список файлов. С ключом -l она показывает атрибуты файла, т.е. его права доступа, т.н. permissions, владельца/группу, дату/время последнего изменения файла, его имя. Более подробно это и многое другое я рассказал в конспекте [Линукс для начинающих] (https://ophilon.github.io/gomelug/articles/konspect.html)

Замечательно, Павлик, что ты выбрал для изучения программирования язык C# (читается си шарп, или до диез, кто понимает), и среду разработки Unity. При должном упорстве, везении и воображении с этими инструментами можно повторить успех, например, Angry Birds.

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

Языков программирования очень много, ещё больше утилит, решающих небольшую задачу. В решении задачки №1, например, мы воспользовались готовыми командами поиска файлов updatedb/locate и командой подсчёта строк wc. Сделали мы это в командном процессоре bash, автоматически запускаемом при входе в ВМ Линукс. Мы также использовали конвейер, позволяющий из нескольких команд написать простейшую однострочную программку.

Ещё важнее, что только командный процессор, сокращённо шелл (shell), даёт доступ ко всем файлам и установленным программам. Под Windows также есть свой шелл, PowerShell, с похожими на bash возможностями. Оба шелл’а являются полноценными языками программирования, программы на таких языках называются обычно скриптами. Таких скриптов в каждой ОС (Операционной Системе) множество, они неотъемлемая часть системы. Если хочешь понять как работает ОС, обязательно надо научиться хотя бы читать и понимать работу скриптов.

Ещё для тебя задачка №2. Точнее, это сразу 4 задачи с отдельной оплатой. Задачки не относятся напрямую к программированию, но дают очень важное умение - печатать на клавиатуре вслепую. На клавиатуру не надо смотреть, всё интересное и важное только на экране. Клавишы надо знать пальцами, но знать до автоматизма - см. https://www.ratatype.ru/ или https://stamina-online.com/ru. Мы с тобой договорились о таких гонорарах - 300 руб. за скорость 150 зн./мин., отдельно за русскую и англ. раскладки, при уровне ошибок < 3%. Эта скорость печати ниже средней 200 зн., так что задача вполне реальна. За скорость 300 зн./мин. гонорар будет 3 тыс. руб. за каждый язык.

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

вернуться обратно в блог