Наши инструменты

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

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

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

Утверждение это совсем простое и даже, не побоюсь этого слова, очевидное. Понятно, что если мы за рулем машины задумываемся о том, на какую скорость нам нужно переключиться, то ни о каком водительском мастерстве и речи быть не может. Сначала мы осваиваем управление, сознательно давая себе команды сделать то или иное действие: нажать педаль, включить поворотник, переключить скорость. Со временем эти действия доводятся до автоматизма и мы перестаем о них думать. Теперь наша голова может быть занята, например, поиском оптимального маршрута до работы, выбором наиболее быстрой полосы на дороге или хватанием пассажирки за коленку. Органы управления машиной — наш инструмент — стали как бы продолжением нашего тела, и позволяют нам выполнять нужные действия, не задумываясь о них.

Не нравится пример с машиной? Те же соображения верны для игры на пианино, занятий виндсерфингом, боевых искусств…

Недавно я стал ощущать примерно то же самое при программировании, после того как полностью перешел на Emacs в качестве замены всех IDE. Да, непросто запомнить комбинацию из трех-четырех, а то и более клавиш. Часто для нужных действий нет сочетаний клавиш, а иногда нет даже и встроенной возможности выполнять эти действия. Тогда я трачу кучу времени, ищу в Сети дополнения, правлю их напильником, вешаю некоторые действия на клавиши, потом несколько дней к ним привыкаю — и все. Больше я об этих действиях не думаю. Они выполняются сами, без моего участия.

Например, чтобы увеличить ширину текущего окна на 20 символов, я нажимаю Ctrl-u 2 0 Ctrl-x Shift-]. В общей сложности 8 клавиш. Я их набираю одним движением, не задумываясь, что это такое там делают мои пальцы. Когда я писал этот абзац, мне даже пришлось потратить некоторое время, чтобы осознать, что же именно я при этом нажимаю. В общем, полнейший автоматизм.

А вот с мышью автоматизм не вырабатывается. Нельзя вслепую ткнуть куда-то курсором — в этом процессе всегда участвует сознание. Сначала нужно увидеть некий визуальный маркер (кнопку, пункт меню), затем подвести туда курсор, используя обратную связь через глаза для точного позиционирования, затем щелкнуть кнопкой. Одним кликом часто дело не ограничивается, поэтому повторяем все снова. Так как в этом процессе участвует сознание, из кратковременной памяти вытесняются важные сведения. Эффективность падает.

Конечно, я все это говорю не про мышь и не про клавиатуру. И не про Emacs. И я не хочу ни за что агитировать и ни к чему призывать. Я просто хочу сделать вывод — следствие из утверждения из начала поста:

Для повышения эффективности следует пользоваться инструментами, допускающими бессознательное их использование.

УжасноПлохоНормальноХорошоОтлично (Еще не оценили)
Loading ... Loading ...

Ссылки для C-гиков

Такая вот подборка в дополнение к опубликованному ранее:

  • C @ Interview Mantra — подборка задач на C, предлагаемых на собеседованиях.
  • C Puzzles — набор сишных головоломок, неплохо прокачивает знание тонких моментов языка.
  • C Extensions — описание того, что GCC привносит в C помимо требований стандарта.
  • Coroutines in C — статья о реализации сопрограмм на C.
  • How to Use the restrict Qualifier — что такое квалификатор restrict и когда его нужно использовать.
  • Ampifying C — совершенно сносящая крышу статья, описывающая применение генерации C-кода из Lisp-кода.
УжасноПлохоНормальноХорошоОтлично (Еще не оценили)
Loading ... Loading ...

Экономим свое время в bash

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

У меня по этому поводу всплыла в памяти одна цитата:

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

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

Так вот bash (и я вслед за ним) исповедует как раз такую философию: затраченные однажды усилия не должны затрачиваться снова. Ниже я приведу несколько советов, которые в рамках этого подхода позволяют иногда сэкономить несколько секунд. Мелочь, но с миру по нитке…

CDPATH

Переменная окружения CDPATH является аналогом переменной PATH с той разницей, что вторая определяет пути поиска исполняемых файлов, а первая — пути поиска каталогов, задаваемых в команде cd.

Если CDPATH не установлена, то поиск происходит только в текущем каталоге.

Обычно соответствующая строка в ~/.bash_profile выглядит как-то так:

export CDPATH=.:~:~/Dropbox:~/dload:~/wspace

Теперь, например, если в каталоге ~/dload есть подкаталог bibl, то каким бы ни был текущий каталог, команда cd bibl приведет нас в ~/dload/bibl.

Поиск в каталогах, указанных в CDPATH, происходит в том порядке, в котором они указаны в этой переменной. Поэтому обычно первым каталогом в CDPATH указывают текущий (точка), потому что в противном случае поиск в текущем каталоге будет выполняться после всех каталогов из CDPATH, что вряд ли кто-то сочтет разумным.

alias

Команда alias позволяет создать псевдоним — короткое имя для любой команды или их последовательности. Чтобы создать псевдоним, нужно выполнить:

alias name="command"

Где, понятное дело, name — имя псевдонима, а command — что нужно выполнить, когда мы набираем в консоли name. Например:

alias pa="ps -A | grep"

дает нам новую команду pa, с помощью которой удобно искать процессы по части их имени. Обычно все вызовы alias записываются в файле ~/.bashrc.

Команда unalias выполняет обратное действие, то есть уничтожает указанные псевдонимы. Ключ -a предписывает удалить все псевдонимы.

Если выполнить alias без параметров, она выведет список всех определенных псевдонимов, причем в виде команд, которыми они создаются.

Кстати, имя псевдонима вполне может совпадать с именем существующей команды. Более того, это часто используется для задания командам «параметров по умолчанию». Например, у меня есть такой псевдоним:

alias ls="ls --color=auto"

Теперь «команда» ls будет раскрашивать свой вывод, и это не придется указывать явно. Если же мы хотим обратиться к исходной команде (то есть, временно запретить раскрытие псевдонимов), нужно перед ее именем поставить символ «\» (\ls).

Повторение набранного

Существуют специальные комбинации символов, хранящие последнюю введенную команду и ее аргументы:

  • !! — вся команда целиком;
  • !* — все аргументы;
  • !:2 — второй аргумент;
  • !$ — последний аргумент.

Чаще всего нужно обратиться или ко всей команде, или к последнему аргументу. Например, можно создать псевдоним на основе последней команды:

alias foo="!!"

или повторно выполнить команду от имени root:

sudo !!

или что-нибудь сделать с только что созданным файлом:

touch longscriptname.sh
chmod +x !$

В общем, вариантов много, проявите фантазию.

Поиск по истории команд

Это, наверное, и так все знают, но все же. Жмем Ctrl-r, вводим часть команды, затем жмем Ctrl-r до тех пор, пока не отобразится нужная команда. Enter.

На этот раз все. Призываю читателей поделиться своим bash-кунг-фу (по желанию добавлю в пост).

———> Постовой

Теперь все знают, что crystalbit ведёт delphi блог и обсуждает там аспекты программирования.

УжасноПлохоНормальноХорошоОтлично (2 голосов, средний: 5.00 из 5)
Loading ... Loading ...

Visual Studio разрушает мозг

Хе-хе, это не я, это все Петцольд сказал. Уж кому, как не ему, это знать!

А если честно, я с ним согласен. И сам все больше и больше отхожу от IDE в пользу Emacs, причем без средств управления проектами (да, я иногда меняю свое мнение). Во-первых, я нахожу, что «управление проектом» в техническом смысле — штука несколько эфемерная, и, во-вторых, в Emacs оно сделано ужасно неудобно.

В результате я решил, что хороший текстовый редактор повышает мою производительность гораздо сильнее, чем хорошая IDE. А автоматизация сборки и тестирования вполне удовлетворяется Autotools или cmake (статьи про которые я все никак не допишу), а что не смогут они, смогут сценарии bash или Power Shell.

P.S. Ссылку на Петцольда стащил у Сергея Зефирова.

УжасноПлохоНормальноХорошоОтлично (Еще не оценили)
Loading ... Loading ...

cm-super и Fedora 12

Почему-то в репозиториях Fedora 12 отсутствует замечательный пакет Type1-шрифтов cm-super. Так как жизни я себе без него не представляю, то пришлось брать соответствующий пакет на CTAN и ставить вручную. Суть поста в том, что идущие в комплекте с cm-super инструкции по установке неверны. Начиная с некоторого времени стандартные пути к .map- и .enc-файлам в TeX Live были изменены, о чем сказано в официальном предупреждении.

Для лентяев добрые люди сочинили установочный скрипт (внизу страницы).

УжасноПлохоНормальноХорошоОтлично (Еще не оценили)
Loading ... Loading ...

Emacs: переключаем раскладку одинаково с ОС

Наверное, первое, что неприятно поражает новичка в Emacs — невозможность использовать системные средства для переключения языка ввода. Не в том смысле, что оно не работает. А в том, что переключение на любой отличный от английского язык средствами ОС превращает Emacs в Notepad. Перестают работать все клавиатурные комбинации! Паника!

К счастью, Emacs, как и всякая уважающая себя ОС, имеет собственный механизм переключения языков, кодировок и прочего. И все это даже работает. Одна беда — нельзя повесить переключение и в системе, и в Emacs на одну и ту же клавишу, потому что система в таком случае тоже будет переключаться. А пользоваться разными сочетаниями в Emacs и вне него… Что ж, я долгое время так и поступал. Неудобно.

Итак, задача:

  1. Хотим переключаться везде по одной и той же клавише. Причем, чтобы если мы нажимаем эту клавишу в Emacs, использовался его внутренний механизм, в остальных случаях пусть этим занимается ОС.
  2. Хотим, чтобы п. 1 работал и в Windows, и в Linux. И желательно чтобы сценарий загрузки был общим.

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

  • убедить ОС не переключаться, пока активен Emacs;
  • после одновременного переключения и в ОС, и в Emacs, переключить ОС обратно.

Оказывается, первый вариант реализуем в Linux, а второй в Windows. Дальнейшее изложение предполагает, что в качестве универсальной клавиши переключения выбран Caps Lock.

Для Linux палочкой-выручалочкой оказывается сочетание SCIM/iBus и xmodmap. С помощью xmodmap можно переназначить Caps Lock на какое-нибудь неиспользуемое действие, например, F13. Для этого в файл ~/.Xmodmap вписываем строку:

keycode 66 = F13

Число 66 — это код соответствующей клавиши. Скорее всего, у вас будет такой же, но лучше в этом убедиться с помощью утилиты xev.

Дальше убиваем системную переключалку раскладок (без особых зверств), и настраиваем SCIM/iBus на переключение по F13, а затем отключаем переключение для Emacs, вписывая в ~/.Xdefaults строку:

Emacs*useXIM:false

Теперь остается только подправить стартовый сценарий Emacs (.emacs или init.el), вставив туда:

(global-set-key [f13] 'toggle-input-method)

Выходим из сеанса, входим обратно, тратим еще пару часов на доработку напильником, и все заработает. Для Linux это все. Я намеренно опустил некоторые подробности про настройку SCIM/iBus, поскольку времена меняются, и старые инструкции становятся устаревшими. А тут я как бы не причем: «настройте iBus на переключение по F13» еще долго не устареет. В конце концов, гугл никто не отменял. Идея использовать SCIM и его аналоги не новая, об этом много где можно прочитать.

В Windows такой фокус не пройдет, но зато один вдумчивый камрад предложил очень изящное решение (ссылка не работает?..), которое упомянуто выше: после переключения вернуть системную раскладку обратно. (Для установки Caps Lock в качестве клавиши переключения системной раскладкой нужно воспользоваться чем-то вроде lswitch или лезть в реестр.)

Теперь остается только вооружиться переменной system-type, и получим сценарий, который кроссплатформенно решает нашу задачу:

(if (eq system-type 'windows-nt)
    ((defvar safe-language-change-flag nil)
     (defun safe-language-change ()
       (interactive)
       (setq safe-language-change-flag (not safe-language-change-flag))
       (when safe-language-change-flag
         (toggle-input-method)
         (w32-toggle-lock-key 'capslock)))
     (global-set-key (kbd "<language-change>") 'safe-language-change))
  (global-set-key [f13] 'toggle-input-method))

Правда, в случае запуска в натуральной консоли проблема все еще остается.

УжасноПлохоНормальноХорошоОтлично (1 голосов, средний: 5.00 из 5)
Loading ... Loading ...