Dic: быстрая память

    image

    Как часто вы не могли вспомнить ту или иную команду в Git, Vim, Linux, C++? Сколько времени вы тратите на поиск ответа в man или в интернете? Пробовали ли вы когда-нибудь писать свои собственные справочники и чем это заканчивалось? Хотели бы вы немного помочь вашей памяти?
    Разрешите вам помочь. Под катом небольшая история эволюции моих справочников и утилита Dic.


    Вспомнить все


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

    Сначала все шло хорошо, если я не мог чего-то вспомнить, то обращался к справочникам и (благодаря иерархической структуре) быстро находил нужную информацию, но иногда я охотнее откладывал решение задачи «на потом» потому, что мне было просто лень открывать нужный справочник и искать в нем (хоть и быстро) информацию. Сначала я не обращал на это внимание, сводя все к собственной лени, но с того самого времени, как я перешел на Xmonad, понял — дело вовсе не во мне. Проблема в том, что для нахождения очень небольшой порции информации я заставляю себя совершать слишком сложные действия: переходить в каталог со словарем, открывать словарь нужным редактором, используя мышь находить нужную информацию — все это слишком сложно для решения крошечной задачи, от того и лень ее решать. Для меня, как программиста любящего «велотренажеры» в программировании, это был вызов невиданной дерзости и я нашел решение!

    Dic


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

    На практике это выглядит следующим образом. Предположим мне нужно узнать, что делает команда git init, я набираю в терминале:
    dic git init
    

    и получаю краткое (в одно предложение) описание команды:
    ЛОКАЛЬНЫЙ РЕПОЗИТОРИЙ
      git init - создание репозитория в текущем каталоге
    
    КЛОН
      git clone <url> [<dir>] - клонирование репозитория по указанному адресу в текущий каталог (или в каталог dir)
    Используйте dic имяСловаря имяРаздела
    


    «Как быть, если я не помню имя команды, но знаю что она делает?» — спросите вы. Выход столь же прост:
    dic git | grep ''инициализация нового репозитория''
    

    на экране появится запись:
    init — инициализация нового репозитория (init,clone)
    

    говоря нам что нужно читать раздел dic git init.

    Прирост в скорости поиска информации был очевиден. Если раньше мне нужно было минимум минута-две для поиска в справочниках или в интернете, то сейчас хватает десяти секунд (я даже засекал!).

    Как это работает


    Конечно, предлагаемое мной решение подойдет не всем. Во-первых — вам нужен Bash, во-вторых — под рукой всегда должен быть терминал и вы должны уметь быстро с ним работать, в-третьих — вы должны уметь правильно составлять справочники (т.к. Dic этого делать не умеет). Если вас это не пугает, то давайте «сядем за штурвал» и посмотрим на «приборную панель»:
    image
    • Dic использует содержимое каталога .dic/library/ для получения доступных словарей и управления ими;
    • Каталог .dic/library/ содержит подкаталоги (словари). Имя каждого словаря должно быть максимально коротким и информативным (например, словарь по Vim у меня называется vim). При этом вызов dic vim заставит dic работать с каталогом .dic/library/vim;
    • Каждый словарь должен содержать файлы без расширения (разделы), имена которых должны быть максимально короткими и информативными. Эти файлы и содержат всю информацию, необходимую нам в будущем. Например, файл, содержащий информацию о командах индексации Git, у меня называется .dic/library/git/index;
    • Каждый раздел содержит краткое описание команд (утилит, других важных данных), относящихся к этому разделу. Все команды записываются в отдельной строке и часто (необязательно) группируются в параграфы. Команда должна быть записана следующим образом: команда — описание. Вот небольшой пример раздела словаря:
      ИНИЦИАЛИЗАЦИЯ
      	   git init — инициализация нового репозитория
      
    • Помимо разделов, каждый справочник содержит два системных файла: desctiption — файл содержит описание справочника, contents — файл содержит описание всех разделов с указанием в скобках всех команд, описанных в каждом из разделов.

    Вот, собственно, и все, что нужно Dic для работы со словарем, все максимально просто.

    Теперь пару слов о доступных командах:
    1. dic — инициализация Dic, если это еще не было сделано и вывод списка доступных словарей, если инициализация уже проводилась;
    2. dic имяСловаря — вывод списка разделов, относящихся к данному словарю;
    3. dic имяСловаря имяРаздела — вывод содержимого раздела;
    4. dic имяСловаря имяРаздела команда — вывод описания команды;
    5. dic -h — помощь по Dic;
    6. dic -u — update словарей из Github.com


    Всем миром


    Иметь под рукой удобный словарь хорошо, а если он будет заполняться сразу несколькими людьми — еще лучше! Именно поэтому Dic может использовать репозиторий на Github.com для обновления своих словарей. Конечно вы можете обойтись и без git, просто скопировав нужные вам словари в каталог .git/library, и даже создавать собственные словари, но стала бы Wikipedia.org 6-м по посещаемости сайтом в Интернете, если бы не командная работа всех пользователей?!
    Если у вас еще нет Git, обязательно установите его. После первого запуска Dic, он сам создаст каталог .dic/library у вас в домашнем каталоге и скачает в него все доступные на сегодняшний день справочники. Если же вы хорошо знакомы с Git, то сможете вести собственную ветку справочников, которая, возможно, будет добавлена в основную и вашими справочниками смогут пользоваться другие. Если вы почувствовали, что ваши справочники устарели, просто выполните dic -u и он сам обновит их из репозитория.

    С чего начать


    1. Установите Git (опционально).
    2. В конце поста вы найдете ссылку на скрипт Dic. Скачайте его и положите в удобное место. Лично я создал символическую ссылку d на Dic, чтобы еще быстрее обращаться к справочникам.
    3. Выполните скрипт dic.sh (для этого не нужны права root), он создаст каталог .dic/library/ в вашем домашнем каталоге и попытается создать в нем Git репозиторий используя git clone.
    4. Если вы не хотите использовать Git, так же внизу поста вы найдете ссылку на репозиторий Github.com. Скачайте оттуда интересующие вас справочники и поместите их в каталог .dic/library/ и Dic готов к работе.


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

    Полезные ссылки


    1. Скрипт Dic
    2. Репозиторий справочников на Github.com
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 57

      +35
      man git init:

      GIT-INIT(1)                                                                                                                                           Git Manual                                                                                                                                          GIT-INIT(1)
      
      NAME
             git-init - Create an empty Git repository or reinitialize an existing one
      
      SYNOPSIS
             git init [-q | --quiet] [--bare] [--template=<template_directory>]
                       [--separate-git-dir <git dir>]
                       [--shared[=<permissions>]] [directory]
      ...
      


      Чем это отличается от вашего велотренажёра?
        0
        Не вся информация есть в формате man pages. Кроме того, в этот велотренажер можно положить какие-то нюансы, которые лично вы часто забываете или путаете.
          +2
          Если мы про команды, то в дебиане, например, есть полиси, что каждая команда должна иметь страницу man'а. Насчёт другого не скажу, хотя sysctl'ы и сишная stdlib тут водится.
            +1
            Не про команды. Например, копаетесь в какой-то редкой либе или изучаете новый язык.
          +1
          Отличается многим, в первую очередь man намного полнее моего решения, но Dic преследует цель создать свой справочник с быстрым поиском (ведь в своем всегда ориентироваться проще).
            +6
            man apropos
            man whatis

            + команда "/" в man page

            не благодарите :)
              +5
              У манов есть одна большая беда: секция EXAMPLES если и есть, то отличается поразительнейшей куцестью и бессмысленностью, потому что простейшие применения команд и так понятны, а более заковыристые в примерах никогда не пишут. А дополнить ман-страницу — та ещё морока и получишь ты своё обновление релиза через два своего дистрибутива. Офигенно.

              Потому и клепают эти велосипеды.
                +3
                Я примеры использования часто смотрю на commandlinefu.com
                  0
                  Двумя руками за! Всегда убивало — ну что сложно что-ли пару — тройку примеров в конце привести?!
                  +1
                  Ещё в копилку: info — гипертекстовые мануалы, причём можно легко свои делать.
                    0
                    Честно говоря, я не очень верю, что сейчас многие пользуются info… Даже GNU-шные мануалы проще читать в браузере.
                0
                В какой-то убунте:
                $ man complete
                No manual entry for complete
                В макоси открывается список встроенных команд bash, без пояснений как этим пользоваться.

                Справка внутри программы:
                usage: complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]

                Все очень плохо.
                  +1
                  Это не программа, а внутренняя функция Bash. В убунте по-моему используется не Bash, а дебиановский Dash — разные оболочки, поэтому я не удивлён, что в Dash такой функции может и не быть вообще. В макоси всё правильно открывается — ман по Bash, дальше поиском можно найти подробную справку по complete.

                  С аналогичным успехом можно смотреть справку по if или echo.
                    –1
                    Эта команда в dash есть. Ну и да, я все понимаю, только меня это никак не приблизило к использованию этой команды.
                    (См. комментарий, на который я отвечал, для контекста.)
                      –1
                      Эта команда в dash есть.

                      Разве? У меня что-то нету.

                      app-shells/dash-0.5.7.3-r1
                      
                        0
                        Значит, я ошибся. На той машине с убунтой она у меня запускалась, хотя там запросто мог быть bash, я не посмотрел.
                          0
                          В Ubuntu, как и во всех известных мне Debian-based дистрибутивах, в интерактивном режиме используется bash, потому что dash пригоден только для выполнения скриптов и в консоли совершенно неюзабелен.
                      +1
                      В OS X в man bash можно найти BUILTIN COMMANDS, а там уже complete… Но да, это прекрасный пример. Её ведь там еще фиг найдешь (не говоря уж о том, что man complete действительно дает две странички, после которых еще нужно догадаться о необходимости man bash (man sh), т.к. в SEE ALSO упомянут sh, но не bash!).

                      " — Нет в мире совершенства! — вздохнул Лис"
                      –1
                      man bash?
                         Completing
                             complete (TAB)
                                    Attempt  to  perform  completion on the text before point.  Bash attempts completion treating the text as a variable (if
                                    the text begins with $), username (if the text begins with ~), hostname (if the text begins with @), or command (includ‐
                                    ing aliases and functions) in turn.  If none of these produces a match, filename completion is attempted.
                      
                        –1
                        Это справка про нажатие клавиши TAB. А мне надо про встроенную команду, у которой 25 флагов, так пока и оставшихся для меня восхитительной тайной:
                        usage: complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]
                          0
                          Посмотрел, все в мане есть, раздел «Programmable Completion», так что не надо тут
                    +1
                    Сколько времени вы тратите на поиск ответа в man или в интернете? Пробовали ли вы когда-нибудь писать свои собственные справочники и чем это заканчивалось?
                    Часто бывает «сделал и забыл», а через год снова нужно сделать, и я помню, что когда-то как-то я это уже делал, но в интернетах почему-то то старое решение не находится, или же находится пять разных решений, и я не помню, каким я воспользовался в прошлом.
                    Поэтому я завёл блог, в котором записываю свои «лайфхаки», чтобы, когда понадобится, быстро найти. Думал использовать для этого Wiki, но там пришлось бы больше заниматься каталогизацией и структурированием информации. Блог с тегами проще.
                      0
                      Я тоже думал о блоге и Wiki (у меня даже есть одна), но отказался от этого по двум причинам:
                      1. Чтобы воспользоваться нужен интернет, а бывали случае (находился в глуши), когда вопрос срочный, а интернета под рукой нет;
                      2. Чтобы вести Wiki и блог нужно тратить довольно много времени на добавление информации, ведь хочется чтоб это было достаточно «красиво» для уровня блога, а тут все пишется на скорую руку.
                        0
                        1. Для меня это не проблема, но теоретически можно держать локальную копию блога в том или ином виде.
                        2. «Красиво» мне не нужно (хотя красивую темку установил, каюсь :), я пишу для себя, поэтому там самый минимум информации, просто пошаговые инструкции или команды для терминала, чтобы быстренько копипастнуть и снова забыть.
                        На написание этого комментария я потратил в пять раз больше времени, чем на один пост в блоге :)
                          0
                          Хм… на мой взгляд, вики лучше чем блог… И суть как раз в том, чтоб, наоборот, потратить время на структуризацию и удобное оформление… Да на это уходит в разы больше времени, но информация укладывается намного лучше и в дальнейшем быстро восстанавливается. У меня даже две вики =) Одна локальная, в которой проделанные работы и планы, а другая с общей информацией, которая доступна с внешки.

                          Да и по теме… Если не можешь вспомнить команды vim или git — это означает, по моему опыту, что не так уж часто ими пользуешься. А если это так, то через какое-то долгое время, одна строчка из словаря всё равно не поможет вспомнить всё что необходимо.
                            +3
                            Можно ещё Evernote использовать для этого, тогда всегда в кармане будет вся информация.

                            Когда часто пользуешься, то и не нужны никакие справочники, а вот какие-нибудь консольные команды в Linux или OS X, которые нужно вводить один раз в год-два, их и не нужно вспоминать, достаточно скопировать в Терминал.
                              0
                              Дома я пишу на PHP, JS, Vim и Bash (не считая HTML и CSS), а на работе на Java, тут ненароком забываешь некоторые мелочи при переходе от языка к языку, и совсем не оттого, что у меня мало опыта )
                                +1
                                Вы меня не совсем правильно поняли. Какой бы большой у Вас бы небыл опыт, то всегда будет та информация, которой Вы пользуетесь постоянно, и та которой редко. Ваш велосипед покрывает середину между этими крайностями. Но тут, есть одна загвоздка, допустим у меня. Если какие-то конфиги редко меняются, то их синтаксис совершенно забывается и пару строк, которые я себе когда-то оставлял, только вгоняют в больший ступор и путают. То, что используется реже со временем забывается.
                                Всё это сугубо индивидуально и специфично. Надеюсь Ваш скрипт кому-нибудь поможет.
                            +4
                            tiddlywiki.com/ Wiki в одном файле. Пользуюсь давно — страшно доволен.
                              0
                              Спасибо, завёл себе файлик.
                            0
                            Я использую с этой целью приватный гугло-сайт. Все готовое, можно структурировать информацию, если сильно захочется (вложенные странички), готовый хороший поиск по сайту, можно расшаривать отдельные странички другим пользователям (хоть на просмотр, хоть на редактирование).
                            +2
                            Мне обычно помогают commandlinefu.com и explainshell.com
                              0
                              Забавная выдача:

                              explainshell.com/explain?cmd=hg:
                              Mercurial source code management system

                              explainshell.com/explain?cmd=svn:
                              Subversion command line client tool

                              explainshell.com/explain?cmd=git:
                              the stupid content tracker

                                0
                                explainshell сделан несколько для другого, он показывает man файл с отфильтрованными аргументами
                                  0
                                  Это выдача и обычного man.
                                  Wikipedia:
                                  Torvalds has quipped about the name git, which is British English slang roughly equivalent to «unpleasant person». Torvalds said: «I'm an egotistical bastard, and I name all my projects after myself. First 'Linux', now 'git'.» The man page describes git as «the stupid content tracker».
                                0
                                Спасибо, проект полезный. Здорово подходит в качестве общего источника своих руководств.

                                В последнее время много странных попыток сделать свои manpages. Странных с точки зрения выбранных инструментов: node.js (tldr), Ruby on Rails (bropages), — чудовищный overhead. Проект Delphinum лишён такого недостатка: bash + text = сама простота. Полагаю, популярны были бы обычные полноценные manpages, но заточенные именно под примеры и краткие сведения о командах.

                                Недавно подобный файлик для Vim создали: master.vim. Скрипт для vim, который позволяет учить vim в vim. И создавать собственные руководства, которые забываете.

                                Я пока не завёл себе своего словарика, по старинке пользуюсь обычными manpages и крутейшей книгой их мейнтейнера The Linux Programming Interface, для vim встроенным help и всяческими vimcasts.
                                  0
                                  А при чем тут Rails? Обычный ruby gem.
                                    0
                                    Действительно gem. Извиняюсь, ошибся.
                                    0
                                    Как я упоминал выше — это всё от того, что в манах примеров почти не пишут. А синтаксис у команд иногда такой, что ман приходиться очень долго раскуривать, чтоб понять как вообще оно запускается.
                                    0
                                    Да, и ещё в Zsh есть отличное автодополнение, которое показывает возможные команды и опции: link.
                                      –3
                                      Come on, and help me, mr. Dic… © не моё
                                        +1
                                        Он Dr. Dick.
                                        Увидел этот клип по ТВ в конце 90-x и посмеялся.
                                        0
                                        Предлагаю посмотреть в сторону Bash completion — поддерживается куча утилит, можно писать свои правила автодополнения на Bash. Идея Zsh на два комментария выше интересная и её можно реализовать на Bash.

                                        Ещё есть apropos — это агрегатор мануалов, помогает, если помните, что должна делать команда, но не помните её названия.
                                          0
                                          Идея интересная. Надо будет прикрутить это к Alfred.
                                            0
                                            Если вы пишете в своем словаре
                                            git init — создание нового репозитория

                                            А потом делаете
                                            dic git | grep ''инициализация нового репозитория''

                                            То так вы ничего не найдете.

                                            С другой стороны, Яндекс, с его морфологией и блекджеком что-нибудь да найдет.

                                            А если знать английский, и поискать гуглем на stackoverflow… :)
                                              0
                                              Согласен. Dic не претендует на полноценную поисковую систему )
                                                0
                                                А если знать английский, и поискать гуглем на stackoverflow…

                                                Надо для этого удобный консольный клиентик сделать (:
                                              0
                                              А я записываю все что нужно в файлик tips. Когда что-то надо, пишу в терминале cat ~notes/tips или сразу грепаю вывод :)
                                                0
                                                Что-то похожее на идею автора уже есть, скрипт ищет ответы на Stack Overflow и сразу выдает только код: github.com/gleitz/howdoi. И удобный интерфейс для emacs к ней github.com/arthurnn/howdoi-emacs.
                                                  0
                                                  Насколько я понял, была поставлена одна задача, а решена другая. Предлагаемый инструмент дает возможность, грубо говоря, поиска по словарю, где в качестве ключа используется слово. Этим же свойством обладают обычные словари (толковые и переводные), а также традиционные средства: man, info, apropos, apt-cache search и т.п. За счет узкой специализации, разумеется, можно что-то оптимизировать и настроить под себя, так что Dic безусловно имеет право на существование.

                                                  Но изначальная проблема состоит в том, что айтишнику не хватает идеографического (семантического) словаря. Проблема достаточно серьезна, поскольку типичная задача формулируется как «угадай, что нужно угадать» или «вспомни слово, которое я забыл». Косвенным подтверждением того факта, что Dic полностью не решает проблему, является использование grep'а как штатного механизма поиска:
                                                  dic git | grep ''инициализация нового репозитория''

                                                  Я не знаю хороших готовых средств решения этой проблемы, сам бы хотел найти.

                                                  PS.
                                                  c того самого времени, как я перешел на Xmonad, понял — дело вовсе не во мне.
                                                  Что-то не пойму, причем здесь Xmonad.
                                                    0
                                                    Начну с конца:
                                                    Xmonad — отложил мышку и, соответственно, теперь нужно что-то сугубо консольное и клавиатурное
                                                    Семантический словарь — я об этом очень много думаю, и вскоре решу и эту задачу, но все же цель была именно та, которая решена с помощью Dic, а именно вспомнить что делает та или иная команда зная ее имя
                                                    +6
                                                    Ээх!
                                                    Почитайте, пожалуйста, про zsh autocomplete

                                                    Вот как это выглядит
                                                    image

                                                    Дополнения уже написаны для большого количества приложений, и можно их писать самому. Плюс в том, что вам достаточно нажать tab, и все эти магические подсказки появятся. Причем дополнения многоуровневые и не только текстовые.
                                                      +2
                                                      Спасибо. Это интересно )
                                                      +1
                                                        +1
                                                        Я для подобных задач использую OutWiker.
                                                          0
                                                          man -k bash
                                                          man bash | grep -i alias -C 5
                                                          Примерно так.

                                                          Only users with full accounts can post comments. Log in, please.