metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2011-11-01 08:57 pm

Haskell, гротесковое

Енумераторы-итератии наконец заработали так, как я себе это представлял.
Ошибок было две:
Ключевая: надо было IO action лифтить внутрь iteratee и там всю работу и выполнять. А не внутри IO дергать енумератор с итератее-парсером и доставая результат:

неправильно, теряет куски буферов :
processWeather3 :: SerialPort -> IO () 
processWeather3 serial = loop
     where loop = do a <- E.run_ $ enumSerial serial E.$$ P.iterParseLine
                     BS.putStrLn a
                     loop

правильно:
iterWeather5 = loop
     where loop = do a <- P.iterParseLine
                     liftIO $ BS.putStrLn a
                     loop

processWeather5 :: SerialPort -> IO () 
processWeather5 serial = E.run_ $ enumSerial serial E.$$ iterWeather5

Вторая ошибка: в протоколе одного девайса после строки данных идет \r\n. в протоколе другого только \r. Строки разделены пустыми строками как бог на душу положит.
Я пишу парсер на attoparsec таким образом:
do skipWhile isSpace_w8 --пропускаем whitespace 
   data <- ReadData     --читаем строку данных
   skipWhile isSpace_w8 --пропускаем whitespace (т.е. - перенос строки)
   return data
Так вот, skipWhile, что характерно - будет ждать данных пока не придет хоть что-нибудь, отличающееся от предиката. Если девайс не гонит данные непрерывным потоком - то это повисает до истечения таймаута.
Таймауты, впрочем, вообще не обрабатываются - пакет serialport на них возвращает пустые строки. Дойдут руки - буду разбираться как это исправлять, кроссплатформенным образом.
И да, я вспомнил, зачем же я это все делал: меня задрало не иметь под руками прототипа софта, который можно единообразно запустить как винде, так и на линуксе и который бы работал с висящими на ком-порту девайсами согласно разнообразных от фонаря придуманных протоколов.

[identity profile] sgalitsky.livejournal.com 2011-11-01 06:04 pm (UTC)(link)
..когда ж до питона дело дойдет?

[identity profile] metaclass.livejournal.com 2011-11-01 06:06 pm (UTC)(link)
Я вот думаю заставить себя это написать еще раз на C, если руководство раньше не возмутится откровенным занятием непонятной хреновиной на работе :)

[identity profile] sgalitsky.livejournal.com 2011-11-01 06:09 pm (UTC)(link)
лучче на ФОРТРАНе..

[identity profile] metaclass.livejournal.com 2011-11-01 06:16 pm (UTC)(link)
Что характерно, недавно знакомый искал программистов на фортране, для каких-то научных расчетов.

[identity profile] sgalitsky.livejournal.com 2011-11-01 06:19 pm (UTC)(link)
гидродинамика, прочность или что-то ядРеное.
самое оно для этого языка.

[identity profile] sgalitsky.livejournal.com 2011-11-01 06:39 pm (UTC)(link)
очередной проэкт для "Забабахинских чтений"?))))))))))))))))

[identity profile] nicka-startcev.livejournal.com 2011-11-01 07:38 pm (UTC)(link)
Извращенцы.
Когда я еще учился, то есть, этак в начале века, было модно считать, что фортран быстрее сей. Особенно 77, а 90й (в котором появилась поддержка рекурсии) типа не так круто. Но при аккуратном кодировании, когда на С пишет сишник а на фортране фортранист, выяснялось, что на с/с++ и код короче и глюкогенных мест меньше, и работает чуть быстрее.

Так что фортран - это банальное поддержание устаревшего/унаследованного кода, и когда вымрет последний фортранодинозавр, эта услуга заметно вздорожает.

[identity profile] theiced.livejournal.com 2011-11-01 07:48 pm (UTC)(link)
где это было модно?

[identity profile] nicka-startcev.livejournal.com 2011-11-01 08:01 pm (UTC)(link)
Физфак ЛГУ. Много запутанного унаследованного кода, который всем лень переписать под современные реалии.

[identity profile] theiced.livejournal.com 2011-11-01 09:05 pm (UTC)(link)
старый говнокод - это просто старый говнокод.

[identity profile] fraks-nsk.livejournal.com 2011-11-02 01:31 am (UTC)(link)
Когда я еще учился - работали на FORTRAN IV, на ДВК и СМ.
Пытались переписать одну критичную подпрограммку с фортрана на макро, в целях ускорения. Поделие на макро оказалось медленнее фортрана в разы, а то и на порядки. Очень дофига.
Так что тот фортран на той платформе математику считал превосходно.

[identity profile] nicka-startcev.livejournal.com 2011-11-02 04:05 am (UTC)(link)
Либо у переписывавших квалификация была не очень.
Получить проигрыш в разы - это ж постараться надо.

[identity profile] fraks-nsk.livejournal.com 2011-11-02 04:18 am (UTC)(link)
Ну квалификация понятно что хуже т.к. в идеале можно было получить как минимум скорость равную фортрану.

Для ухудшения в разы при использовании простых инструкций - надо постараться, а вот при операциях с плавающей точкой стараться не надо - оно само получится. Процедура там была - быстрое преобразование Фурье, т.е. одна математика.

[identity profile] nicka-startcev.livejournal.com 2011-11-02 04:49 am (UTC)(link)
Бабочка - она короткая, там буквально пара лишних инструкций или переходов в основном цикле могут дать существенное пенальти по скорости. Что интересно, тоже слышал байки(?) о преимуществах фортрана именно на примере быстрого фурье.

Кстати, у меня переписывание ГОСТ-что-то-там-89 с сей на ассемблер дало примерно трехкратный прирост скорости и я абсолютно точно знаю, почему именно и в каких случаях такое переписывание вообще ничего не даст кроме лишних трат времени.

[identity profile] fraks-nsk.livejournal.com 2011-11-02 05:11 am (UTC)(link)
Подпрограммка на фортране была строчек 60 наверное, ее тупо переписали на ассемблер.
С переходами и циклами проблем точно не было, все упиралось в плавающую точку - это очень тяжелая операция для проца. Вот щас подумалось что тогда тупанули - надо было дизассемблировать исполняемый модуль и посмотреть во что оно там транслировалось из фортрана, и уже это допиливать а не изобретать с пустого места.

Паскаль там транслировался в Макро - и было все видно что он там намутил, а фортран - сразу в obj.

[identity profile] nicka-startcev.livejournal.com 2011-11-02 05:23 am (UTC)(link)
Ага. Если есть интересности со скоростью - смотри, что там наассемблировалось.

А паскаль в плане оптимизации мне как-то никогда не нравился.

[identity profile] fraks-nsk.livejournal.com 2011-11-02 06:14 am (UTC)(link)
Много лет пишу складские и учетные программки на Delphi, к оптимизации у меня нет вопросов :)

[identity profile] nicka-startcev.livejournal.com 2011-11-03 05:02 am (UTC)(link)
Скотский учёт - это отдельная тема. Там, типично, 99% времени тратится на ожидание ввода от пользователя или с диска.

[identity profile] skif-by.livejournal.com 2011-11-02 06:11 am (UTC)(link)
Что характерно, все численные модели прогноза погоды до сих пор на fortran :) Ну с некоторой обвязкой на цэ, максимум.

[identity profile] theiced.livejournal.com 2011-11-01 07:41 pm (UTC)(link)
руби же

[identity profile] slonopotamus.livejournal.com 2011-11-02 05:38 am (UTC)(link)
Зачем вы везде эту маргинальщину пытаетесь совать?