вторник, 28 августа 2012 г.

FFI в Лиспворкс

В общем, потребовалось из лиспа общаться с железкой на MSP430, которая подключена к компу по USB и торчит в системе в виде ttyACM. Чтобы с оным агрегатом общаться, нужно, как минимум, установить бодрейт. В Лиспворксе есть пакет serial-port, который, к сожалению, доступен только под виндой, поэтому юниксоидам нужно делать дополнительные движения.

Сначала я решил не париться, и открыть пайп, на другом конце которого сидит cu из uucp и делает за меня всё tty-специфичное. Но на машинах, где это дело крутиться будет, uucp нет, а для его устанавки нужно делать много действий, которые включают в себя ответы на кучу фиктивных багрепортов. Ещё можно вызывать stty и устанавливать флажки им, а в софте использовать обычный open. Однако, на деле выяснилось, что стандартному open в Лиспворксе от открытия файла устройства в режиме :io плохеет. В общем, надо открывать устройство позиксовым open, крутить tty-ручки и создавать на его основе лисповый stream.

У LispWorks есть foreign language interface, с помощью которого можно описать сишечные функции, структуры, переменные, подгрузить библиотеку и прочие типичные для такой задачи действия, доступные, например, в оупенсорсных UFFI/CFFI. Соответственно, можно или написать обёртку на Си, которая открывает дескриптор, дёргает termios-вызовы и возвращает причёсанный дескриптор в лисп, или вскочить на коня, выхватить шашку и описать нужное подмножество termios.h при помощи FLI. Впрочем, при чтении документации на FLI выяснилась приятная неожиданность: в LW есть встроенный парсер сишных заголовков, который сам всё описывает. Вот мой пример с termios:

(require "foreign-parser")

(foreign-parser:process-foreign-file "/usr/include/termios.h" :dff "/path/to/project/termios.lisp" :package :unix)


Всё. Это даже круче, чем sb-grovel в SBCL! Единственное, что константы, объявленные препроцессором (через #define) автоматически не конвертятся. Ну да ладно.

А вот функция, открывающая в LW tty-девайс:

(defun open-device ()
  (let ((fd (sys::unix-open *dev* 2)))
    (fli:with-dynamic-foreign-objects ((term unix::termios))
      (unix::tcgetattr fd term)
      (unix::cfsetospeed term #o10004) ;; 460800
      (unix::tcsetattr fd 0 term)      ;; TCSANOW
      (unix::tcflush fd 2))            ;; TCOFLUSH
    (sys:attach-stream fd :direction :io :automatically-close t)))

понедельник, 20 августа 2012 г.

Emacs 24 + GnutTLS

Т.к. в 24-м Емаксе встроили родную поддержку GnuTLS, то появилась возможность крутить gnutls'ный же priority string. Например,

(setq gnutls-algorithm-priority "NORMAL:+COMP-DEFLATE")

что уменьшило трафик на wl-folder-sync-current-entity с 79901 до 25511 байт, т.е. ажно в три раза!

Теперь можно спокойно забить на отсутствие в Емаксе поддержки zlib и наличие compress=deflate у Гмейловского IMAP'а, т.к. жаться будет на уровне tls. Конечно, на серверах с поддержкой RFC4731 aka ESEARCH всё не так сногшибательно кучерявей, но у Гмейла ESEARCH нету, а у кого в наши дни нет гугловского мыла?

P.S.: gnutls-algorithm-priority в равной степени справедлив и для Gnus...
P.P.S.: с другой стороны, в 23-м Емаксе можно для gnutls-cli указать --priority="NORMAL:+COMP-DEFLATE"...

Emacs 24 и еврейский вопрос

FIX: (setq-default bidi-display-reordering nil)

Я не знаю, что эти поганцы-разработчики курили, но:

Emacs 23.4:

Function Name            Call Count Elapsed Time Average Time
----------------------------------------------------------------
window-end                24          0.0962759999  0.0040114999
line-move                 65          0.0543929999  0.0008368153
line-move-visual          61          0.0482110000  0.0007903442
posn-at-point             6           0.016949      0.0028248333
line-move-partial         61          0.00342       5.606...e-05
pos-visible-in-window-p   1           0.001529      0.001529

Emacs 24.1:

Function Name            Call Count Elapsed Time Average Time
----------------------------------------------------------------
line-move                 122         4.784470897   0.0392169745
line-move-partial         118         4.106517631   0.0348009968
pos-visible-in-window-p   72          3.9990069829  0.0555417636
line-move-visual          118         0.6843929029  0.0057999398
window-end                4           0.3870196690  0.0967549172
posn-at-point             11          0.286456435   0.0260414940

Смотреть в последнюю колонку. В среднем, всё стало работать медленней в 10-20 раз. Wanderlust'ом вообще невозможно пользоваться: скролл в Summary - это агонические конвульсии больной черепахи в терминальной стадии. Самое забавное, что главный виновник тормозов скроллирования - pos-visible-in-window-p - это сишная функция, которая со времён 23.4 не изменилась.

Или, может, это общее торможение интерпретатора байткода после внедрения lexical binding?

P.S.: Не, нифига это не байткод. Вот вырезка из perf:

23.4:

 31.81%  mark_object
  9.77%  Fbyte_code
  8.01%  Fgarbage_collect
  2.29%  oblookup
  2.22%  re_match_2_internal
  1.97%  Feval
  1.95%  readchar
  1.62%  mark_char_table
  1.01%  Ffuncall
  0.83%  Fcons
  0.77%  read1
  0.76%  re_search_2
  0.71%  unbind_to
  0.67%  funcall_lambda
  0.66%  specbind
  0.58%  produce_chars
  0.58%  buf_charpos_to_bytepos
  0.58%  decode_coding_iso_2022
  0.55%  Flength
  0.54%  assq_no_quit

Как видно, основную часть времени Емакс 23 провёл в сборщике мусора, т.е. всё остальное работало со скоростью падающего домкрата. А вот ситуация в 24:

 21.11%  mark_object
 15.01%  buf_bytepos_to_charpos
  8.32%  scan_buffer
  7.20%  re_match_2_internal
  6.09%  exec_byte_code
  5.17%  Fgarbage_collect
  4.34%  buf_charpos_to_bytepos
  1.50%  oblookup
  1.30%  eval_sub
  1.29%  compile_pattern
  1.19%  readchar
  0.87%  fast_looking_at
  0.85%  mark_char_table
  0.65%  Fcons
  0.62%  Ffuncall
  0.62%  specbind
  0.57%  re_match_2
  0.54%  re_search_2
  0.52%  read1

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

- Support for displaying and editing bidirectional text, including
  right-to-left scripts such as Arabic and Hebrew.

Ага, понятно ;)
 
Надеюсь, починят.

вторник, 7 августа 2012 г.

Семейная машина

Могу с уверенностью сказать, что Вольво полностью влилась в нашу семью! Все наши более-менее крупные события она тоже переживает.

Бросили на открытой парковке в -30? Селектору передач АКПП стало очень грустно. Уехали на три недели в Сибирь и оставили машину на парковке? Получите мёртвый термостат, испарившуюся охлаждайку из  расширительного бачка и почти сдохший аккумулятор. Сдал экзамен по вождению? Дай машине сразу же обнять водителя и не выпускать его из салона из-за сломанной ручки в водительской двери. С энтузиазмом предвкушаете очередную велосипедную покатушку? От радости порвали генератор. Собираетесь в Йеллоустоун на неделю, хотите арендовать другую машину в Солт-Лейки Сити и устроить 600-мильный вояж? От негодования залюфтила-завибрировала муфта переменого газораспределения. Едете на Ниагару? Стали терять обороты на холостом ходу. Жена завтра рожать собралась? От волнения прихватило стартер и он ушёл в мир иной.

Вот и опять: папе в пятницу ночью ехать в Нью-Йорк оформлять российское гражданство сыну, и у насоса ГУР открутился выпускной штуцер и распрыскал поллитра жижи по ремню и всем шкивам...