Potpourri

Содержание

Настройка клавиатуры

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

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

Также Вы можете присвоить клавишам произвольные команды на свой вкус. Это полезно в контексте основных задач, с которыми Вы сталкиваетесь. Вот некоторые примеры:

Существуют еще более сложные модификации, которые Вы можете настроить:

Некоторые ресурсы для ознакомления с данной темой:

Демоны (Daemons)

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

В Linux systemd (системный демон) - это наиболее распространенное решение для запуска и настройки процессов-демонов. Вы можете выполнить systemctl status, чтобы перечислить текущие работающие демоны. Большинство из них могут показаться незнакомыми, но они отвечают за основные части системы, такие как управление сетью, решение DNS-запросов или отображение графического интерфейса системы. С Systemd можно взаимодействовать с помощью команды systemctl, чтобы enable, disable, start, stop, restart или проверить status сервисов.

Что более интересно, systemd имеет доступный интерфейс для настройки и включения новых демонов (или сервисов). Ниже приведен пример демона для запуска простого приложения Python. Мы не будем вдаваться в подробности, но, как вы можете видеть, большинство полей довольно понятны.

# /etc/systemd/system/myapp.service
[Unit]
Description=My Custom App
After=network.target

[Service]
User=foo
Group=foo
WorkingDirectory=/home/foo/projects/mydaemon
ExecStart=/usr/bin/local/python3.7 app.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

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

FUSE

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

FUSE (Filesystem in User Space, Файловая система в пользовательском пространстве) позволяет реализовывать файловые системы с помощью пользовательской программы. FUSE позволяет пользователям запускать код пользовательского пространства для вызовов файловой системы, а затем связывает необходимые вызовы с интерфейсами ядра. На практике это означает, что пользователи могут реализовывать произвольную функциональность для вызовов файловой системы.

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

Некоторые интересные примеры файловых систем FUSE:

Резервное копирование

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

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

Синхронизация не является резервным копированием. Например, Dropbox/GDrive - удобные решения, но когда данные стираются или повреждаются, эти повреждения распространяются на синхронизированные файлы. По той же причине решения для зеркалирования дисков, такие как RAID, не являются резервными копиями. Они не помогают, если данные удаляются, повреждаются или шифруются вирусом-вымогателем.

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

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

Для более подробного объяснения см. лекционные материалы 2019 года о Резервном копировании.

API

На этом уроке мы много говорили о том, как использовать компьютер эффективно при решении локальных задач. Вы также обнаружите, что многие из этих уроков применимы и при работе в сети Интернет. Большинство онлайн-сервисов предоставляют “API”, которые позволяют получить доступ к данным сервисов “программно”. Например, правительство США предоставляет API, с помощью которого можно узнать прогноз погоды, таким образом вы можете с легкостью получить данные в командной оболочке (shell).

Большинство API имеют схожий между собой формат. Это структурированные URL-адреса, часто расположенные на api.<сервис>.com, в которых путь и параметры запроса указывают, какие вернуть данные или какое выполнить действие. Например, чтобы узнать прогноз погоды некоторого местоположения в США, нужно отправить GET запрос (например, с помощью утилиты curl) на https://api.weather.gov/points/42.3604,-71.094. Сам ответ содержит множество других URL-адресов, которые позволяют получить конкретные прогнозы для указанного региона. Обычно ответы форматируются в JSON, который затем можно передать утилите типа jq, чтобы извлечь интересующую информацию.

Некоторые API требуют аутентификации, обычно принимающей форму секретного токена (token), который необходимо включить в запрос. Прочтите документацию API сервиса, который собираетесь использовать, чтобы узнать используемую технологию аутентификации. “OAuth” — протокол, который будет вам часто встречаться. По своей сути OAuth — это способ предоставить токены, которые могут действовать “от вашего имени” в рассматриваемом сервисе для выполнения определенных задач. Имейте в виду, что эти токены являются секретными, и каждый, кто получит доступ к вашему токену, сможет совершать любые действия, использующие токен, под вашей учетной записью!

IFTTT — сайт и сервис, завязанный на идее использования API. Он позволяет объединять события различных сервисов в произвольную цепочку. Стоит взглянуть!

Общие флаги/шаблоны командной строки

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

Оконные менеджеры

Большинство из вас привыкли использовать оконный менеджер, позволяющий перетаскивать окна программ, который по умолчанию поставляется с Windows, macOS и Ubuntu. Окна можно накладывать друг на друга, изменять их размер, перемещать в любую часть экрана. Но эти возможности характеризуют лишь один тип оконного менеджера, который называется “плавающим” (floating). Существует множество других типов, в особенности для Linux. Распространенной альтернативой является “плиточный” (tiling) оконный менеджер. Плиточный тип не позволяет окнам перекрывать друг друга, таким образом окна располагаются на экране, как панели в tmux. С плиточным менеджером экран всегда заполнен открытыми окнами, располагая их в соответствии с заданным макетом. Если открыто только одно окно, оно будет занимать весь экран. Открытие второго окна заставляет первое подвинуться, и теперь окна занимают по половине (или 1/3 и 2/3) экрана. Открывая третье, существующие окна снова поджимаются, чтобы вместить нового соседа. Как и в случае с панелями tmux, по окнам можно перемещаться, изменять их размер переставлять, используя лишь клавиатуру. Их стоит попробовать!

VPN

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

Несмотря на привлекательность данной идеи, держите в уме, что когда Вы используете VPN, все Ваши действия доверяются не Вашему текущему интернет-провайдеру, а провайдеру VPN. Все, что может увидеть Ваш интернет-провайдер, теперь вместо него видит провайдер VPN. И только если Вы доверяете ему больше, чем интернет-провайдеру, Вы в выигрыше, а в противном случае результат для Вас сомнителен. Если Вы подключены к какому-нибудь сомнительному публичному Wi-Fi в аэропорту, тогда скорее всего Вы не особо доверяете соединению, но будучи дома стоит подумать дважды.

Также Вы должны знать, что в наши дни большая часть трафика, по крайней мере деликатного характера, уже зашифрована с помощью HTTPS или TLS. И поэтому от того, на “плохой” Вы сети или нет, мало что зависит - оператор сети будет знать только о том, с какими серверами Вы взаимодействуете, но не о самих данных, которыми Вы обмениваетесь.

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

В крайнем случае, у MIT есть свой VPN для студентов, так что возможно Вам стоит взглянуть. Также если Вы собрались запустить свой, обратите внимание на WireGuard.

Markdown

Скорее всего на карьерном пути Вы столкнетесь с написанием текстов. И как правило хочется иметь возможность разметить текст простым способом. Например, сделать текст жирным или курсивом, добавить заголовки, ссылки, куски кода. Вместо использования таких тяжелых инструментов, как Word или LaTeX, предлагаем Вам попробовать облегченный язык разметки Markdown.

Вероятно Вы уже сталкивались с Markdown или по крайней мере с каким-то его вариантом. Так или иначе он частично используется и поддерживается практически везде, даже если не конкретно под своим именем. По своей сути, Markdown - это попытка конвертировать в код способ, которым люди обычно размечают текст, когда пишут простые текстовые документы. Акцент (курсив) добавляется при помощи * перед словом и после него. Сильный акцент (жирный) - аналогично с помощью **. Строки, начинающиеся с #, являются заголовками (причем количество #отражает уровень подзаголовка). Любая строка, начинающаяся с -, это пункт маркированного списка, а с номером и . - нумерованного. Бэктик (обратный апостроф) применяется для выделения строки кода, а если Вам нужно вставить блок кода, используйте тройные бэктики:

```
код начинается тут 
```

Для добавления ссылки поместите текст для ссылки в квадратные скобки, а сам URL сразу после в круглых скобках: [name](url). Markdown довольно просто начать пользоваться, и Вы можете использовать его практически везде. На самом деле, заметки к этой и другим лекциям написаны на Markdown, и Вы можете посмотреть на “сырой” Markdown здесь.

Hammerspoon (автоматизация рабочего стола на macOS)

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

Некоторые примеры того, что вы можете сделать с Hammerspoon:

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

Resources

Booting + Live USBs

При включении компьютера, до загрузки операционной системы, BIOS/UEFI инициализирует систему. Во время этого процесса вы можете нажать определенную комбинацию клавиш, чтобы настроить это программное обеспечение. Например, ваш компьютер может сказать что-то вроде “Нажмите F9, чтобы настроить BIOS. Нажмите F12, чтобы войти в меню загрузки.” во время процесса загрузки. Вы можете конфигурировать все виды настроек, связанные с аппаратным обеспечением, в меню BIOS. Вы также можете войти в меню загрузки, чтобы загрузиться с альтернативного устройства вместо вашего жесткого диска.

Live USB - это USB флеш-накопители, содержащие операционную систему. Вы можете создать один из них, скачав операционную систему (например, дистрибутив Linux) и записав ее на флеш-накопитель. Этот процесс немного сложнее, чем просто копирование файла .iso на диск. Существуют инструменты, такие как UNetbootin, которые помогают вам создавать Live USB.

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

Docker, Vagrant, VMs, Cloud, OpenStack

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

Vagrant - это инструмент, который позволяет вам описывать конфигурации машин (операционная система, службы, пакеты и т.д.) в коде, а затем создавать виртуальные машины с помощью простой команды vagrant up. Docker концептуально похож, но использует контейнеры.

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

Популярные сервисы включают Amazon AWS, Google Cloud, Microsoft Azure, DigitalOcean.

Программирование в ноутбуках

Среды программирования в ноутбуках могут быть очень удобны для выполнения определенных типов интерактивной или исследовательской разработки. Возможно, самой популярной средой программирования в ноутбуках сегодня является Jupyter, для Python (и нескольких других языков). Wolfram Mathematica - это еще одна среда программирования в ноутбуках, которая отлично подходит для выполнения программирования, ориентированного на математику.

GitHub

GitHub - одна из самых популярных платформ для разработки открытого программного обеспечения (open-source software). Множество инструментов, о которых мы говорили, от vim до Hammerspoon, размещены на GitHub. Довольно легко начать вносить свой вклад в open-source, чтобы сделать лучше инструменты, которыми мы пользуемся ежедневно.

Есть два главных способа участия в проектах на GitHub:


Редактировать страницу.

Лицензия CC BY-NC-SA.