Linux: как рекурсивно заменить пробелы в названии файлов и директорий

Файлы с пробелами в имени иногда неудобно обрабатывать в скриптах, поэтому я стараюсь их не использовать. Но если есть директория, в которой находятся файлы с пробелами в именах, и хочется их все переименовать так, чтобы вместо пробелов использовались, например, символы подчеркивания, то в Linux это легко сделать с помощью утилиты find:
find /path_to_dir/ -depth -name "* *" -execdir rename 's/ /_/g' "{}" \;
Флаг -depth указывает утилите, что сначала надо обрабатывать содержимое текущей директории, а только потом саму директорию (что позволяет нам сначала переимновать все файлы внутри директории и только потом ее саму); флаг -execdir позволяет выполнить слудующую за ним команду из текущей директории; rename - утилита, установленная в Ubuntu по умолчанию. В итоге find ищет в заданной директории все файлы и поддиректории с пробелами в именах, а rename - заменяет пробелы на подчеркивания.

С++: Безопасность относительно исключений при вызове функций

Этот пост - перевод статьи Герба Саттера: GotW #102: Exception-Safe Function Calls.

Простой вопрос

1. Что вы можете сказать о порядке выполнения функций f, g и h и выражений expr1 и expr2 в приведенных ниже фрагментах кода? Предпалагается, что expr1 и expr2 не содражат в себе вызовов других функций.
// Пример 1(a)
//
f( expr1, expr2 );
// Пример 1(b)
//
f( g( expr1 ), h( expr2 ) );

Вопросы посложнее

2. Разбирая доставшийся вам в наследство код, вы наткнулись на следующий фрагмент:
// Пример 2
 
// В заголовочном файле:
void f( T1*, T2* );
 
// В месте вызова:
f( new T1, new T2 );
Есть ли в этом коде проблемы с безопасностью относительно исключений или любые другие проблемы? Объясните.

3. Продолжая изучать старый код, вы обнаруживаете, что кому-то не нравился код, приведенный в примере 2, и позднее он был изменен на:
// Пример 3
 
// В заголовочном файле:
void f( std::unique_ptr<T1>, std::unique_ptr<T2> );
 
// В месте вызова:
f( std::unique_ptr<T1>{ new T1 }, std::unique_ptr<T2>{ new T2 } );
Какие улучшения привнес новый подход относительно старого (и привнес ли вообще)? Остались ли проблемы с безопасностью относительно исключений? Объясните.

4. Покажите, как можно реализовать функцию make_unique, которая бы решала проблемы с безопасностью в примере 3, и которую можно было бы вызывать следующим образом:
// Пример 4
 
// В заголовочном файле:
void f( std::unique_ptr<T1>, std::unique_ptr<T2> );
 
// В месте вызова:
f( make_unique<T1>(), make_unique<T2>() );

Как открыть несколько соединений Tor для использования в Python скриптах (на примере Ubuntu)

В предыдущем посте я показал, как можно использовать соединение Tor из Python-скрипта (а также как устанавливать и запускать Tor-сервис в Ubuntu). Преимущество того подхода (по сравнению с использованию Privoxy в качестве прослойки мeжду SOCKS и HTTP) заключается в том, что он легко масштабируется: можно открыть любое (на сколько хватит аппаратных ресурсов) количество соединений и каждому Python процессу дать по одному прокси-порту (c Privoxy это тоже можно сделать, но несколько сложнее).
Здесь же я проведу в качестве примера Bash-скрипт, который открывает заданное количество Tor-соединений и для каждого соединения запускает два Python-скрипта.

Python3: как выполнять HTTP запросы через Tor (на примере Ubuntu)

В этом посте я опишу как пользоваться Tor в своих Python-скриптах. Зачем это нужно? Например, чтобы изменить свой видимый IP адрес для сервиса, к которому вы обращаетесь.
Нам понадобится установленный Tor и Python (я использую третий, но второй, по идее, тоже должен работать). Многие советуют использовать дополнительный сервис Privoxy между Tor, который работает как SOCKS-прокси и библиотеками Python, которые хотят получить HTTP-прокси, но я не очень понял, зачем, если в Python можно пользоваться SOCKS-прокси напрямую.
У меня установлена Ubuntu, поэтому и весь процесс я описываю для этой ОС. В других, я так понимаю, все должно быть примерно так же (Python-код должен работать в любом случае, разница может быть только с установкой и запуском Tor).

Использование умных указателей в C++

Этот пост - перевод статьи Герба Саттера: GotW #89 Solution: Smart Pointers.

Постановка проблемы

Простой вопрос

1. В каких случаях следует использовать shared_ptr а в каких - unique_ptr? Приведите как можно больше соображенией на эту тему.

Вопросы посложнее

2. Почему практически всегда следует использовать make_shared для создания объекта, которым будут впоследствии владеть shared_ptr? Объясните.

3. Почему практически всегда следует использовать make_unique для создания объекта, которым будет владеть unique_ptr? Объясните.

4. Что такое auto_ptr?

NodeJS: простейший Express сервер

Этот пост в каком-то смысле продолжение поста про простейший NodeJS сервер, принимающий JSON объекты. Помимо того, что сервер может принимать данные извне (в данном случае, с помощью POST-запроса и JSON), хорошо бы чтобы он умел выдавать пользователю web-страницу с имеющимися данными. В принципе, в случае с одной страницей можно было бы вручную дописать сервер из предыдущего поста, но я решил использовать фреймворк Express, который сэкномит время на написание кода, а в дальнейшем позволит легко масштабировать сервер. Более того, Express имеет встроенные средства для генерации HTML кода из шаблонов страниц (я буду использовать EJS), и много других вещей, которые тоже, вполне возможно, пригодятся в дальнейшем.

SparkFun ESP8266 Thing: подключение датчика движения

Стоит такая задача: подключить датчик движения к микроконтроллеру ESP8266, который будет в свою очередь как-нибудь реагировать на движение в поле видимости датчика (в моем примере он будет мигать светодиодом на плате). В качестве датчика движения я буду использовать вот такой PIR сенсор. Про свою ESP8266 The Thing от SparkFun я уже писал, например, здесь: настройка IDE и прошивка. Мне повезло, и мой PIR сенсор работает от 3,3 В, поэтому его можно запитать прямо от платы. Встречаются очень похожие сенсоры, где регулятор напряжения на входе принимает минимум 5 В. В таком случае можно пустить питание прямо на выход регулятора, минуя его (это описано, например, здесь или здесь), потому что сама плата питается от 3,3 В (ну или использовать отдельное питание для PIR сенсора).