понедельник, 23 января 2012 г.

wiki и производительность труда

Совершенно случайно открыл для себя удивительно продуктивный способ увеличить КПД на работе.

Небольшое вступление. У нас в процессе работы активно используется wiki для очень многих вещей - описание продуктов, процессов, задач, планов и т.п. Эта wiki достаточно продвинута - например можно написать:
с кем:логин
и в итоге это, при просмотре, преобразуется в
c Васей Пупкиным.
Или можно напсать номер тикета из jira:
MINIVERTIS-12
и он преобразуется в
MINIVERTIS-12[ --Создание очередной поделки-- ]( логин ).
Естественно поддерживаются всякие подсветки синтаксиса, списки, таблицы, автоматическое оглавление и т.п.

Так вот, все это очень удобно применять для протоколирования своей деятельности за день - какие тикеты закрыл, что почитал, с кем говорил, кому проиграл в настольный теннис ;). Например вот такой у меня получился лог за несколько дней:

=== 19
  * разбирался с проблемами индексации в работе. Такая конфигурация работает, но надо доп. проверки:
    %%
   
common_title : job_name,company_name
_ : _
    %%
   * работал над MINIVERTIS-12 - релевантность уже прокидывается в protobuf. Осталось получить неплохое число для него
   * помогал кому:логин с пакетом для тезауруса
   * совещался с кем:1, кем:2, кем:3 по поводу нового проекта спецсниппетов для законов. Пока больше вопросов чем ответов. Точно придутся поднимать бету среднего. Свой визард. Возможно даже базовый.


=== 20
  * говорил с кем:логин1 - он будет помогать нам встраиваться в бленднер. Запросил для него права.
  * совещался с кем:1, кем:2, кем:3, кем:4, кем:5 по поводу законов. с меня json после получ. тикета от Лены. prewalrus сильно менять не надо будет. 
  * хурал. скоро релиз дин. аттрибутов
  * говорыл с кем:6 - обещал все на след. недели
  * подготовил серп для постройки идеальной выдачи
  * почти готов MINIVERTIS-12 - остались мелкие штрихи

=== 23
  * готов MINIVERTIS-12 - выкачен на сервер
  * консультировал кого:логин по поводу работы с dsindexer
  * подробоно отвечал на вопросы Сегаловича по сервису поиска по мобильным приложениям
  * переделал серп для идеальной выдачи

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

понедельник, 16 января 2012 г.

Emacs и style guide

У нас на работе для части (основной) С++ кода поменялся style guide - добавлися pre-commit hook, который запрещает коммитить файлы, в которых  есть пробелы в конце строки. Оказалось что в моем любимом emacs справиться с данной напастью оказалось очень легко. Помог отличный пакет
show-wspace, который уже был установлен. Осталось только добавить строку
(add-hook 'c-mode-common-hook 'show-ws-highlight-trailing-whitespace)

и вуаля - все проблемные строки сразу подсвечиваются.

Все настройки для emacs можно найти тут:
emacs-configuration (сам файл для посдветки пробелов находится тут: ai/colorize.el

up.
Как мне напомнили в комментах (спасибо Ваня!) можно еще автоматически удалять пробелы при сохранении файла. Сделать это только для С/С++ режима можно так:
(add-hook 'c-mode-common-hook
      (lambda()
        (add-hook 'local-write-file-hooks
              '(lambda()
                 (save-excursion
                   (delete-trailing-whitespace))))))

воскресенье, 15 января 2012 г.

Новый способ ведения блога

Купил BlogPress для iPad - вроде на первый взгляд удобно. Будем надеяться, что это поможет реанимировать блог - благо многое прочитал и многое написал - есть что рассказать. Всех с наступившим НГ!



понедельник, 10 января 2011 г.

Процесс программирования с псевдокодом

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


(defun my-ppp-comment-region (top bottom)
  ""
  (interactive "r")
  (setq macro [home ?\M-m ?\C-z ?/ ?\C-z ?/ ? ])
;;  (apply-macro-to-region-lines top bottom macro
  (save-excursion
    (let ((end-marker (copy-marker bottom))
          next-line-marker)
      (goto-char top)
      (if (not (bolp))
          (forward-line 1))
      (setq next-line-marker (point-marker))
      (while (< next-line-marker end-marker)
        (goto-char next-line-marker)
        (save-excursion
          (forward-line 1)
          (set-marker next-line-marker (point)))
        (unless (looking-at "[ \t]*$")
            (save-excursion
              (let ((mark-active nil))
                (execute-kbd-macro (or macro last-kbd-macro)))))
        );;while
      (set-marker end-marker nil)
      (set-marker next-line-marker nil))))

и затем добавил
(define-key c-mode-base-map (kbd "C-M-;") 'my-ppp-comment-region)

в
c-mode-common-hook

например так:

(defun my-c-mode-common-hook ()
  ;; включить режимы auto-newline и hungry-delete
  (c-toggle-auto-hungry-state 1)
  (flyspell-prog-mode);;включаем проверку правописания в комментариях и строках 
  (ispell-change-dictionary "american")
  ;; работает как C-j  
  (define-key c-mode-base-map "\C-m" 'c-context-line-break)
  ;;добавлеям комментарии для Проектирования с Помощью Псевдокода
  (define-key c-mode-base-map (kbd "C-M-;") 'my-ppp-comment-region)
  ...
)
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)

в результате по C-M-; мое описание волшебным образом превращается в готовый комментарий к функции.

прагматизм

Недавно закончил читать "Программист-прагматик" Ханта и Томаса - книгу, которую многие рекомендовали прочитать.
Одним словом: понравилось. Книга написана простым и приятным языком. Освещен широкий круг вопросов от использования vcs, до способов определения требований проекта. Книга сильно перекликается с Совершенным кодом Макконелла и тот кто читал последнюю найдут в этой книге не очень много нового. Но повторить еще раз отличные советы никогда не бывает вредно, так о потраченном времени я нисколько не жалею. К тому же эта книга подтолкнула меня вступить в ACM с этого года - посмотрим сколько нового я успею узнать через эту организацию :).

улучшение compile-mode в emacs

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

Для меня таким инструментом, стал emacs. И операцией, которую мне всегда хотелось улучшить - была компиляция. Связка: "сохранить текст + скомпилировать/собрать и запустить тесты" выполняется мною в день очень часто и оптимизировать ее очень хотелось.

Чего хочется добиться:


  • автоматически сохранять все буфера перед началом компиляции: это избавит нас от надоедливых вопросах о необходимости сохранить измененные буфера
  • в некоторых каталогах проектов над которыми я работаю используются makefile из каталогов верхнего уровня: хочется, что бы при компиляции автоматически происходил поиск нежного файла - это избавит от необходимости переключаться на другой буфер перед компиляцией
  • хочется что бы после успешного завершения компиляции/тестирования окно compile автоматически закрывалось, а при ошибках оставалось бы для  дальнейших разбирательств
  • компиляцию и тестирование запускать различными комбинациями клавиш
Вооружившись следующими ссылками:

получилось следующее решение, удовлетворяющее вышеозначенным требованиям:

(defun upward-find-file (filename &optional startdir)
  "Move up directories until we find a certain filename. If we
  manage to find it, return the containing directory. Else if we
  get to the toplevel directory and still can't find it, return
  nil. Start at startdir or . if startdir not given"

  (let ((dirname (expand-file-name
 (if startdir startdir ".")))
(found nil) ; found is set as a flag to leave loop if we find it
(top nil))  ; top is set when we get
   ; to / so that we only check it once

    ; While we've neither been at the top last time nor have we found
    ; the file.
    (while (not (or found top))
      ; If we're at / set top flag.
      (if (string= (expand-file-name dirname) "/")
 (setq top t))
      
      ; Check for the file
      (if (file-exists-p (expand-file-name filename dirname))
 (setq found t)
; If not, move up a directory
(setq dirname (expand-file-name ".." dirname))))
    ; return statement
    (if found dirname nil)))


;; Helper for compilation. Close the compilation window if
;; there was no error at all.
(setq compilation-finish-functions 'compile-autoclose)
(defun compile-autoclose (buffer string)
  (cond ((and 
          (string-match "finished" string) 
          (not (string-match "*grep*" (buffer-name (get-buffer buffer)))))
         (bury-buffer "*compilation*")
         (winner-undo)
         (message "Build successful."))
        (t                                                                    
         (message "Compilation exited abnormally: %s" string))))

;;функция сохраняет содержимое всех буферов
;;и затем вызывает make из католога где находится текущий файл
(defun my-compile-file ()
  "Save all files and compile"
    (interactive)
    (save-some-buffers 1)
    (let ((default-directory (or (upward-find-file "Makefile") ".")))
      (compile (format "cd %s && make -k -j8" default-directory))
      )
  )

;; support for compile tests
(defun my-compile-tests-file ()
  "Save all files and compile"
    (interactive)
    (save-some-buffers 1)
    (let ((default-directory (or (upward-find-file "Makefile") ".")))
      (compile (format "cd %s && make -k -j8 check" default-directory))
      )
  )
;;устанавливаем нашу функцию
(global-set-key  [f7] 'my-compile-file)
(global-set-key  [(shift f7)] 'my-compile-tests-file)

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

вторник, 28 декабря 2010 г.

моя конфигурация emacs

Опубликовал свою текущую конфигурацию emacs:

https://github.com/ai81/emacs-configuration.

Она представляет собой клон конфигурации

http://eschulte.github.com/emacs-starter-kit/

которая в свою очередь является переработкой в стиле литературного программирования конфигурации

http://github.com/technomancy/emacs-starter-kit/.

Я несколько переработал  оригинал убрав найденные конфликты, добавив свои настройки (например для erlnag) и значительно расширив поддержку C++/C -  в частности интегрирован cedet. Так же много добавлено для git.

Тестировалась на паре linux - на win требует доработки (если будет время, то сделаю). Может кому пригодится.