I've dealt:
·· 8 of Clubs
·· 10 of Hearts
The spread is 2. Do you think the next card will be between them? (y/n/q) n
I picked: 6 of Diamonds
You bet that it would not be between the two, and it isn't. WIN!
I've dealt:
·· 3 of Clubs
·· 10 of Spades
The spread is 7. Do you think the next card will be between them? (y/n/q) y
I picked: 5 of Clubs
You bet that it would be between the two, and it is. WIN!
I've dealt:
·· 5 of Diamonds
·· Queen of Spades
The spread is 7. Do you think the next card will be between them? (y/n/q) q
You played 3 games and won 3 times.
Усовершенствование сценария
Снова упомянем вопрос о качестве тасования колоды с пороговым значением 10; это один из аспектов, которые определенно можно было бы улучшить. Также не совсем ясно, имеет ли смысл показывать разность достоинств двух первых карт. В настоящей игре мы бы точно не стали этого делать; игрок должен определить ее сам.
С другой стороны, можно пойти в противоположном направлении и вычислять шансы попадания третьей карты между двумя произвольными. Давайте подумаем об этом: шанс извлечения любой карты равен 1 из 52. Если в колоде осталось 50 карт, потому что две уже были извлечены, шанс взять любую другую карту составляет 1 из 50. Так как масть не имеет значения, у нас есть 4 шанса из 50 извлечь карту каждого другого достоинства. То есть шанс, что достоинство выпавшей карты окажется в нужном промежутке, составляет (количество карт с промежуточными достоинствами × 4) из 50. Если первыми выпали пятерка и десятка, разность составляет 4, поскольку выигравшими будут считаться шестерка, семерка, восьмерка или девятка. То есть шанс победить составляет 4 × 4 из 50. Поняли, что мы имеем в виду?
Наконец, как в любой другой игре командной строки, интерфейс можно было бы доработать. Мы оставим это на ваше усмотрение. Мы также предлагаем вам самим подумать о том, какие другие карточные игры можно было бы реализовать со столь удобной библиотекой функций.
Глава 13. Работа в облаке
Одним из важнейших достижений последних десяти лет стало дальнейшее проникновение Интернета в прикладные области. В первую очередь это касается интернет-хранилищ данных. Первоначально они служили только для хранения резервных копий, но в наши дни, с распространением мобильных технологий, облачные хранилища стали все чаще заменять обычные диски. В число приложений, пользующихся облачными сервисами, входят музыкальные библиотеки (iCloud for iTunes) и файловые архивы (OneDrive в Windows и Google Drive для устройств на Android).
Некоторые современные системы полностью основаны на облачных сервисах. Примером может служить операционная система Chrome компании Google, все рабочее окружение которой полностью основано на веб-браузере. Десять лет назад такое показалось бы странным, но теперь, если вспомнить, сколько времени мы проводим в браузере… в общем, в Купертино или Редмонде никто над этим смеяться не будет.
Облачные технологии можно использовать и в сценариях командной оболочки, так что давайте попробуем. Сценарии в этой главе в основном предназначены для OS X, но предлагаемые в них идеи легко воплотить в Linux или в других BSD-системах.
№ 89. Поддержание непрерывной работы Dropbox
Dropbox — одна из множества облачных систем хранения данных, ставшая особенно популярной благодаря своей широкой доступности в iOS, Android, OS X, Windows и Linux. Важно понимать, что Dropbox — облачная система, то есть та ее часть, что действует на вашем устройстве, — это лишь небольшое приложение, которое выполняется в фоновом режиме, соединяет вашу систему с серверами Dropbox в Интернете и имеет весьма скудный пользовательский интерфейс. Если это приложение не запущено, то невозможно успешно копировать и синхронизировать файлы с вашего компьютера в Dropbox.
Чтобы проверить, присутствует ли в системе работающая программа, достаточно вызвать команду ps, как показано в листинге 13.1.
Код
Листинг 13.1. Сценарий startdropbox
#!/bin/bash
# startdropbox — гарантирует выполнение Dropbox в OS X
app="Dropbox.app"
verbose=1
running="$(ps aux | grep −i $app | grep −v grep)"
if ["$1" = "-s"]; then # −s — немой режим.
··verbose=0
fi
if [! -z "$running"]; then
··if [$verbose −eq 1]; then
····echo "$app is running with PID $(echo $running | cut −d\ −f2)"
··fi
else
··if [$verbose −eq 1]; then
····echo "Launching $app"
··fi
··open −a $app