Гра­фичес­кий интерфейс не убил коман­дную стро­ку. Наобо­рот, в пос­леднее вре­мя она пережи­вает ренес­санс. GitHub ломит­ся от прог­рамм, перек­ладыва­ющих на нее задачи, которые при­выч­нее решать при помощи обык­новен­ных при­ложе­ний. В этом есть своя логика: как пра­вило, такие ути­литы сочиня­ют для себя, а отказ от GUI зна­читель­но уско­ряет решение задачи.
 

Простые графики

Datafart гораздо проще, чем gnuplot, но часто большего и не требуется
Datafart гораз­до про­ще, чем gnuplot, но час­то боль­шего и не тре­бует­ся

Боль­шинс­тво средств для пос­тро­ения гра­фиков черес­чур серь­езны для казу­аль­ного исполь­зования: дос­таточ­но ска­зать, что в крат­ком спис­ке команд gnuplot целых четыр­надцать стра­ниц, пол­ная же инс­трук­ция занима­ет 254 стра­ницы. Ког­да нужен единс­твен­ный гра­фик, и быс­тро, gnuplot со все­ми его тон­костя­ми — это перебор. Для такого слу­чая луч­ше подой­дет сер­вис datafart, к которо­му мож­но обра­тить­ся из коман­дной стро­ки. Он не обла­дает даже малой долей воз­можнос­тей gnuplot и уме­ет лишь одно: стро­ить прос­тей­шие линей­ные гра­фики вре­мен­ных серий.

info

Прог­раммы, пред­назна­чен­ные для исполь­зования из коман­дной стро­ки, как пра­вило, раз­рабаты­вают для плат­форм, сов­мести­мых с UNIX. Но при помощи Cygwin похожую сре­ду все же мож­но вос­создать и в Windows.

Ли­нук­соиды и маково­ды могут добавить в .bashrc (на Маке — .bash_profile) стро­ку «alias datafart="curl --data-binary @- datafart.com"». Она поз­волит отправ­лять дан­ные в сер­вис по коман­де datafart. На вхо­де коман­да при­нима­ет спис­ки чисел, раз­делен­ных про­белом. Каж­дое чис­ло в стро­ке опре­деля­ет вер­тикаль­ную коор­динату соот­ветс­тву­ющей кри­вой, стро­ки озна­чают их позицию по горизон­таль­ной оси. В прос­тей­шем слу­чае мож­но ука­зать по одно­му чис­лу в стро­ке, соот­ветс­тву­юще­му зна­чению какого‑либо парамет­ра в нуж­ный момент вре­мени.

Для скар­мли­вания дан­ных ути­лите слу­жит стан­дар­тный механизм UNIX — pipes. Коман­да datafart < data.txt переда­ет ей дан­ные, сох­ранен­ные в фай­ле data.txt. Мож­но обой­тись и без про­межу­точ­ных фай­лов. Это дела­ется при­мер­но так:

echo '
56.8919 70.5289
58.3461 72.6642
61.1512 76.1516
67.7851 84.589
' | datafart

Ра­зуме­ется, ник­то не ждет, что поль­зователь при­мет­ся сос­тавлять стол­бики цифр вруч­ную. Смысл в дру­гом: дан­ные в таком фор­мате очень прос­то генери­ровать авто­мати­чес­ки. Нап­ример, сле­дующая стро­ка стро­ит при помощи datafart гра­фик колеба­ния кур­са дол­лара в течение года; информа­ция извле­кает­ся с сай­та РБК:

python -c 'import urllib2; print "\n".join([i.split("\t")[5] for i in urllib2.urlopen("http://export.rbc.ru/free/cb.0/free.fcgi?period=DAILY&tickers=USD&lastdays=365&separator=TAB&data_format=BROWSER&header=0").readlines()])' | datafart

В ответ datafart выдаст корот­кий адрес в интерне­те, по которо­му рас­положен готовый гра­фик. Это удоб­но — ссыл­ку мож­но тут же показать дру­гим. Боять­ся за сох­ранность дан­ных нет смыс­ла: через десять минут гра­фик будет авто­мати­чес­ки уда­лен.

По­хоже­го резуль­тата мож­но добить­ся и с помощь ути­литы hist (уста­нов­ка: pip install bashplotlib, тре­бует­ся Python). Она стро­ит гис­тограм­мы пря­мо в тек­сто­вом режиме. Фор­мат дан­ных, исполь­зуемых ути­литой, похож на фор­мат datafart. Есть, впро­чем, неболь­шое отли­чие: гис­тограм­ма будет лишь одна, поэто­му переда­вать hist более одно­го чис­ла в стро­ке не сто­ит.

 

Борьба с прокрастинацией

Ин­тернет отвле­кает. На людей, которым он нужен для работы, за сут­ки обру­шива­ется боль­ше иску­шений, чем свя­той Анто­ний стер­пел за всю жизнь. Прог­раммис­ты зна­ют об этой беде не понас­лышке, поэто­му оби­лие ути­лит, пред­назна­чен­ных для борь­бы с прок­расти­наци­ей, совер­шенно не удив­ляет.

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

Workmode написан на JavaScript и нуж­дает­ся в Node.js. Уста­нов­ка выпол­няет­ся при помощи коман­ды npm install workmode -g. Пос­ле это­го мож­но перей­ти к запол­нению чер­ного спис­ка. Коман­да workmode add ад­рес сай­та поз­воля­ет допол­нять его новыми сай­тами (здесь и далее кур­сив озна­чает, что текст мож­но и нуж­но менять). Ког­да все готово, дос­таточ­но ввес­ти workmode start, и дос­туп к сай­там в спис­ке ока­жет­ся зак­рыт. Открыть его сно­ва мож­но при помощи коман­ды workmode stop.

info

Chocolatey — пакет­ный менед­жер для Windows. С его помощью лег­ко уста­новить и Node.js (choco install nodejs), и Ruby (choco install ruby), и Python (choco install python), которые необ­ходимы для работы упо­мяну­тых в статье прог­рамм.

Дру­гая похожая ути­лита называ­ется letsplay (уста­нов­ка: npm install -g letswork). Она стро­же, чем workmode, и по умол­чанию бло­киру­ет все сай­ты разом, делая исклю­чение лишь для тех, которые поль­зователь явно ука­зал. Раз­решен­ные сай­ты нуж­но перечис­лить пос­ле коман­ды letswork. Нап­ример, коман­да, бло­киру­ющая все сай­ты, кро­ме GitHub, Stack Overflow и developer.apple.com, выг­лядит так:

letswork github.com stackoverflow.com developer.apple.com

Что­бы раз­бло­киро­вать зак­рытые сай­ты, пре­дус­мотре­на коман­да letsplay. Она тоже поз­воля­ет перечис­лить домены‑исклю­чения, но смысл исклю­чения дру­гой: пос­ле вво­да коман­ды они ока­жут­ся заб­локиро­ваны.

И бло­киро­вать, и раз­бло­киро­вать сай­ты при помощи workmode или letswork/letsplay мож­но вруч­ную, но про­ще перело­жить эту задачу на авто­запуск по рас­писанию, что­бы бло­киров­ка вклю­чалась в начале рабоче­го дня и сни­малась в кон­це. В Windows для это­го есть коман­да schtasks, в OS X — launchd (им мож­но поль­зовать­ся вруч­ную или уста­новить Lingon), в Linux — cron.

Letswork и letsplay прек­расно работа­ют и обла­дают толь­ко одним недос­татком: бло­киров­ку слиш­ком прос­то снять. Тре­бует­ся огромная сила воли, что­бы не сде­лать это­го при пер­вой же воз­можнос­ти.

Скрипт pom ата­кует прок­расти­нацию с дру­гого угла. Он пред­став­ляет собой кон­соль­ную реали­зацию помидор­ного метода управле­ния вре­менем. Суть метода сво­дит­ся к раз­делению рабоче­го дня на получа­совые отрезки. Пред­полага­ется, что уж 25 минут даже самые без­воль­ные субъ­екты могут перетер­петь, не отвле­каясь от дела. Затем сле­дует пятими­нут­ный перерыв, пос­ле чего тай­мер заводят еще на пол­часа.

Обыч­но получа­совые отрезки отме­ряют при помощи кухон­ного тай­мера в виде помидо­ра (отсю­да и наз­вание). Pom помога­ет обой­тись без тика­юще­го ово­ща из плас­тмас­сы. Что­бы запус­тить тай­мер, нуж­но ввес­ти коман­ду pom со­обще­ние. Pom запишет сооб­щение в файл ~/pom.log и нач­нет отсчет вре­мени. Ког­да 25 минут исте­кут, он сооб­щит об этом страш­ным элек­трон­ным голосом и посове­тует нем­ного отдохнуть. Затем эта пос­ледова­тель­ность дей­ствий пов­торя­ется — и так до побед­ного кон­ца. Уста­новить pom мож­но коман­дой npm install -g pom, для чего опять же пот­ребу­ется Node.js.

 

Списки задач

Глав­ный герой филь­ма «Пом­ни» стра­дал ред­кой фор­мой амне­зии: он разучил­ся фор­мировать новые вос­помина­ния. Что­бы не забыть, что про­исхо­дит, он записы­вал самые важ­ные фак­ты в виде тату­иро­вок на сво­ей коже. Если бы он был прог­раммис­том, то мог бы заменить свои запис­ки ути­литой doing (уста­нов­ка: gem install doing, тре­бует­ся Ruby). Она понадо­бит­ся тем, кто боит­ся потерять нить мыс­ли из‑за информа­цион­ной перег­рузки.

По сути дела, doing — это спи­сок задач наобо­рот. Он нужен не для того, что­бы записы­вать свои пла­ны (хотя и это воз­можно), а для того, что­бы не забыть, чем ты занят пря­мо сей­час. К при­меру, я бы мог сооб­щить doing, что пишу статью, при помощи коман­ды «doing now пишу статью». По коман­де doing last ути­лита напом­нит мне об этом, а коман­да doing finish уве­домит ути­литу о том, что задача выпол­нена (до это­го, увы, еще далеко). Наконец, добавить задачу на будущее мож­но при помощи doing later опи­сание пла­на.

Об­зор более тра­дици­онных спис­ков задач для коман­дной стро­ки сле­дует начать с Todo.txt. Эта поч­тенная ути­лита раз­вива­ется с 2006 года и за без малого десяти­лет­ний срок обросла фан­тасти­чес­ким количес­твом воз­можнос­тей и аддо­нов. Что­бы уста­новить ее, нуж­но ска­чать с сай­та todotxt.com шелл‑скрипт todo.sh и сде­лать его исполня­емым фай­лом. Кро­ме того, авто­ры ути­литы рекомен­дуют про­писать для todo.sh али­ас поп­роще — нап­ример, t. Пред­положим, что мы сде­лали это.

Лю­бой спи­сок задач дол­жен уметь три вещи: добав­лять новые пла­ны, показы­вать зап­ланиро­ван­ное и отме­чать выпол­ненные. Для добав­ления пла­нов в Todo.txt слу­жит коман­да t add "опи­сание задачи", а спи­сок выводит t list. Каж­дый пункт спис­ка снаб­жен поряд­ковым номером. Это нуж­но для того, что­бы опе­риро­вать отдель­ными задача­ми. Нап­ример, коман­да «t do 1» сооб­щает ути­лите о выпол­нении пер­вой задачи, а «t pri 3 a» под­нима­ет при­ори­тет треть­ей задачи до уров­ня а. Пов­торный ввод t list поз­воля­ет оце­нить эффект, который про­изве­ли эти опе­рации.

Сле­дующий уро­вень слож­ности — про­екты. Что­бы отнести одну из задач в Todo.txt к опре­делен­ному про­екту, дос­таточ­но добавить в ее опи­сание наз­вание про­екта, пред­варен­ное зна­ком +. Нап­ример, добавить задачу «про­тес­тировать Taskwarrior» в про­ект «Статья», мож­но так:

t add "протестировать Taskwarrior" +статья

Эта задача будет выводить­ся и в общем спис­ке, и в спис­ке задач, отно­сящих­ся к про­екту «Статья», который мож­но уви­деть по коман­де «t list +статья».

info

Для Windows сущес­тву­ет порт Todo.txt на .NET github.com/benrhughes/todotxt.net. Прав­да, он не ори­енти­рован на коман­дную стро­ку, а име­ет собс­твен­ный интерфейс, широко исполь­зующий горячие кла­виши.

Taskwarrior — еще одно мощ­ное средс­тво ведения спис­ка задач для коман­дной стро­ки. Это, в отли­чие от Todo.txt, уже не прос­то шелл‑скрипт. В боль­шинс­тве дис­три­бути­вов Linux прог­рамму мож­но уста­новить коман­дой sudo apt-get install task; под OS X поможет brew install task, для Windows сбор­ка Taskwarrior есть в репози­тории Cygwin (как и в Linux, она называ­ется прос­то task). Коман­дный интерфейс Taskwarrior име­ет нес­коль­ко тон­ких отли­чий от Todo.txt: нап­ример, при добав­лении задачи не тре­буют­ся кавыч­ки. Мелочь, а при­ятно:

task add *название задачи*

Ес­ли начать опи­сание задачи со стро­ки priority:H, то ее при­ори­тет уве­личит­ся до мак­симума. Стро­ка project:наз­вание добав­ляет задачу в про­ект с ука­зан­ным наз­вани­ем, а recur:час­тота дела­ет ее пов­торя­ющей­ся; час­тота может иметь зна­чение daily (ежед­невно), weekly (еже­недель­но) и monthly (еже­месяч­но). Спи­сок задач выводит коман­да task, и она тоже, как и ее ана­лог в Todo.txt, под­держи­вает филь­тра­цию по про­ектам, при­ори­тету и про­чим парамет­рам.

Taskwarrior прогнозирует вероятность выполнения списка задач в срок. Прогноз, как правило, пессимистичен
Taskwarrior прог­нозиру­ет веро­ятность выпол­нения спис­ка задач в срок. Прог­ноз, как пра­вило, пес­симис­тичен

Ин­терес­ное начина­ется, если обра­тить вни­мание на богатые нас­трой­ки отоб­ражения спис­ка, а так­же на ста­тис­тичес­кую фун­кци­ональ­ность Taskwarrior. Коман­да task stat рас­ска­жет о спис­ке задач боль­ше, чем хотелось бы знать, а task burndown пред­ста­вит ту же информа­цию в виде псев­догра­фичес­кой гис­тограм­мы, где по горизон­тали отло­жены дни, а по вер­тикали — сум­марное чис­ло добав­ленных и завер­шенных задач. Под гра­фиком Taskwarrior выводит собс­твен­ную оцен­ку сро­ков выпол­нения всех пла­нов, под­счи­тан­ную на осно­вании накоп­ленной им ста­тис­тики исполь­зования прог­раммы.

 

Заметки на память

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

info

При исполь­зовании Windows для того, что­бы уста­нав­ливать RubyGems, тре­бует­ся нес­коль­ко боль­ше уси­лий, чем в Linux или OS X. Самый прос­той спо­соб получить нуж­ную сре­ду — RubyInstaller для Windows.

Нач­нем с прос­того. Ути­лита под наз­вани­ем boom пред­назна­чена для хра­нения коротень­ких однос­троч­ных записей‑снип­петов — нап­ример, ссы­лок, телефо­нов и дру­гой подоб­ной информа­ции. Ее мож­но уста­новить при помощи коман­ды gem install boom, для чего тре­бует­ся Ruby. Пос­ле уста­нов­ки нуж­но пер­вым делом завес­ти спи­сок снип­петов (спис­ков может быть нес­коль­ко, но для начала хва­тит и одно­го). Это дела­ется при помощи коман­ды boom наз­вание спис­ка. Что­бы добавить снип­пет в спи­сок, слу­жит коман­да boom спи­сок наз­вание_снип­пета текст. Извлечь вве­ден­ный текст мож­но при помощи коман­ды boom наз­вание_снип­пета.

$ boom gifs
$ boom gifs wtf http://i.imgur.com/xjFLxXf.gif
$ boom wtf
Boom! Just copied http://i.imgur.com/xjFLxXf.gif to your clipboard.

Прог­рамму jrnl хочет­ся срав­нить не с Evernote, а, ско­рее, с Day One — популяр­ным при­ложе­нием для ведения днев­ника. Пос­ле уста­нов­ки (pip install jrnl, тре­бует­ся Python) соз­дать новую днев­никовую запись мож­но, вве­дя стро­ку jrnl today: текст записи. Вмес­то today мож­но написать yesterday или любую дру­гую дату; в этом слу­чае запись будет датиро­вана зад­ним чис­лом. Пер­вое пред­ложение записи ста­новит­ся заголов­ком, а сло­ва, начина­ющиеся с сим­вола @, счи­тают­ся тегами. Вве­ден­ная информа­ция будет зашиф­рована алго­рит­мом AES-256. Если же ввес­ти jrnl без парамет­ров, прог­рамма откро­ет тек­сто­вый редак­тор, и соз­данный в нем текст ста­нет новой записью.

Ути­лита ajour (уста­нов­ка: npm install -g ajour, тре­бует­ся Node.js) похожа на jrnl, но в отли­чие от него датиру­ет записи авто­мати­чес­ки. Это упро­щает дело: новая запись добав­ляет­ся коман­дой ajour текст и не тре­бует англо­языч­ных добавок, обоз­нача­ющих дату. Что­бы не соз­давать новую запись, а дописать пару строк к пос­ледней, слу­жит ключ -t, который нуж­но при­писать пос­ле тек­ста. Днев­ник сох­раня­ется в фай­ле ajour.md в фор­мате Markdown.

Вер­шина кон­соль­ного эвер­нотос­тро­ения — прог­рамма Stash, которая хра­нит замет­ки в собс­твен­ном облачном сер­висе (trystash.com). Ее интерфейс не осо­бен­но отли­чает­ся от интерфей­са сопер­ников. Стро­ка stash наз­вание текст соз­дает новую запись с ука­зан­ным наз­вани­ем; теги мож­но перечис­лить в кон­це тек­ста пос­ле клю­ча -t. Коман­да stash all выда­ет пол­ный спи­сок записей, а stash tags спи­сок тегов поз­воля­ет отыс­кать запись по ее тегам. Наконец, для того, что­бы извлечь и прос­мотреть запись по наз­ванию, слу­жит коман­да stash наз­вание.

 

Поиск информации

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

Вот насущ­ный при­мер: шелл‑скрипт currency-convert.sh, который мож­но ска­чать по адре­су goo.gl/QF4cXX. Он пред­назна­чен для того, что­бы кон­верти­ровать денеж­ные сум­мы из одной валюты в дру­гую. Све­жие кур­сы прог­рамма извле­кает из Google Finance. Тре­буют­ся ли объ­ясне­ния, для чего это нуж­но? Открой ~/.bashrc в тек­сто­вом редак­торе и добавь туда стро­ку

alias zenrus="./currency-convert.sh RUB USD 1"

Те­перь тебе не нуж­но покидать коман­дную стро­ку, что­бы сле­дить за тем, как рас­тущий курс дол­лара прев­раща­ет твою зар­пла­ту в пыль.

Есть и более эска­пист­ские раз­вле­чения: нап­ример, бит­коин. Его прыж­ки и падения мож­но отсле­живать при помощи при­ложе­ния btc (уста­нов­ка: npm install btc -g от рута; тре­бует­ся Node.js). Пос­ле запус­ка она отоб­ража­ет кур­сы бит­коина в нес­коль­ких популяр­ных сер­висах.

Дру­гая вол­нующая тема — это, разуме­ется, погода. Сущес­тву­ет мно­жес­тво ути­лит, поз­воля­ющих узна­вать ее из коман­дной стро­ки. Раз­личия чаще все­го сво­дят­ся к исполь­зуемым источни­кам информа­ции. Прог­рамма weather-cli (уста­нов­ка: pip install weathercli, тре­бует­ся Python) добыва­ет све­дения о погоде с сер­виса openweathermap.org. Спо­соб при­мене­ния прост: weather наз­вание города --units celsius. Его, впро­чем, мож­но упростить еще силь­нее, если задать перемен­ные окру­жения WEATHER и WEATHER_UNITS. Пер­вая дол­жна содер­жать наз­вание инте­ресу­юще­го города, а вто­рая — нуж­ную еди­ницу изме­рения (в нашем слу­чае — celsius, то есть гра­дусы Цель­сия). Пос­ле это­го для того, что­бы узнать погоду, хва­тит коман­ды weather без вся­ких аргу­мен­тов.

Ути­лита howdoi помога­ет прог­раммис­там быс­тро находить образцы кода (уста­нов­ка: pip install howdoi, тре­бует­ся Python). Зап­рос на англий­ском язы­ке вво­дит­ся пря­мо пос­ле коман­ды, пос­ле чего она без лиш­них пре­дис­ловий выда­ет код из самого под­ходяще­го отве­та с сай­та Stack Overflow. Ключ -а поз­воля­ет уви­деть не толь­ко код, но и весь ответ целиком. Как и с любым поис­ковиком, слу­чают­ся про­махи. Порой при­ходит­ся уточ­нять фор­мулиров­ку зап­роса, но чаще howdoi находит имен­но то, что нуж­но.

Reddit command line app — это утилита для прокрастинации
Reddit command line app — это ути­лита для прок­расти­нации

Прог­рамма Reddit command line app при­дума­на для тех, кто не толь­ко не боит­ся прок­расти­нации, а наобо­рот, стре­мит­ся к ней. При запус­ке это при­ложе­ние выводит заголов­ки десяти пос­ледних пос­тов на сай­те Reddit. Ключ -r поз­воля­ет отфиль­тро­вать пос­ты, отно­сящи­еся к опре­делен­ному суб­редди­ту (раз­делу): нап­ример, коман­да reddit -r hearthstone покажет десять пос­тов про игру Hearthstone. Про­читать инте­ресу­ющий пост мож­но при помощи коман­ды reddit но­мер пос­та, а что­бы открыть ссыл­ку в бра­узе­ре, надо добавить в кон­це стро­ки -url. Да, это не самый прос­той спо­соб читать Reddit, но, однажды начав поль­зовать­ся коман­дной стро­кой для все­го, уже слож­но оста­новить­ся.

Оставить мнение