DevConf

Сразу скажу, что от DevConf, как и от Я.Субботника неделю назад, я ожидал большего. После первых двух докладов я вообще подумал: а что я тут забыл? Хотя ладно, расскажу по порядку.

В качестве первого доклада я выбрал Tuna framework. Возможно, если бы автор получше подготовился и попробовал рассказать этот доклад заранее кому-нибудь еще, то его можно было бы понять и даже оценить. А так всё, что я могу сказать: докладчик изобрел велосипед и очень этим гордится. Он утверждает, что он, кроме всего прочего, включил в этот фреймворк client-side шаблонизатор, который работает быстрее браузера. Не знаю.

Второй докладчик половину времени гнобил первого, но при этом сам рассказывал, как работает innerHtml и как пользоваться appendChild. В итоге он явил миру самый велосипедный велосипед: функцию (!), которая является оберткой над document.createElement(!!), и всё это называется шаблонизатором (!!!). Выглядит как-то так:

_('p.some-class',
  _('a', [href: '#'])
);

А вот третий был хорош: один из разработчиков PHP 5.4 рассказывал про новые фичи, которые вошли в этот самый релиз. Говорил про перспективы, про новый формат разработки и релизов. И усиленно всех звал присоединиться к дружному клану властелинов похапе.

Дальше был рефакторинг Zend Framework 2. Рассказывал примерно то же, что написано в официальной документации. Про \Zend\Di и \Zend\Mvc. По-моему, всё, что сделал докладчик — это провел нагрузочное тестирование для двух стандартный примеров из ZF и ZF2. ZF2 значительно медленнее. Следует об этом задуматься.

Потом я пошел на доклад о репликации в MySQL. Автор очень хорошо и доходчиво рассказывал про различные варианты репликации, которые они перепробовали у себя на проекте, про проблемы, с которыми они столкнулись. Рекомендовал Galera, хоть у него и не заладилось в итоге.

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

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

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

Ну и под конец был доклад про логирование. И хотя человек говорил понятные, известные вещи, слушать его было интересно. Я узнал, что можно писать по 10 Гб логов в час и чувствовать себя хорошо, что логирование — это первое, что должно заработать у вас на проекте, что если у вас не хватает ресурсов писать качественные логи, то, вероятно, ваш проект вообще не стоит запускать. Но самое главное — это два имени: Graylog2 и Splunk.

На этом конференция закончилась и я поехал домой.

А теперь можно задавать вопросы.

Row retrieval was canceled

Здравствуйте. Сегодня я расскажу вам про Haskell и про то, что получается на стыке его ленивости и императивности всех окружающих программ.

Как вы, наверное, уже знаете, я написал этот сайт на Haskell с использованием Snap Framework. Так вот, для хранения данных у меня используется MySQL, а для работы с этими данными — целая куча библиотек: HDBC, HDBC-mysql, snaplet-hdbc. И где-то во всем этом зоопарке при выполнении запроса к базе возникала ошибка:

SqlError {seState = "", seNativeError = 2050, seErrorMsg = "Row retrieval was canceled by mysql_stmt_close() call"}

Гугл ничего не знал об этом, я тоже, поэтому ошибку отложил до лучших времен, благо возникала она нечасто и лечилась перезагрузкой страницы. И вот на глаза мне попалась такая страница на Stack Overflow. Я полез смотреть код Snap.Snaplet.Hdbc:

-- | Execute a @SELECT@ query on the database by passing the query as 'String',
-- together with a list of values to bind to it. A list of 'Row's is returned.
query
  :: HasHdbc m c s
  => String -- ^ The raw SQL to execute. Use @?@ to indicate placeholders.
  -> [SqlValue] -- ^ Values for each placeholder according to its position in
                 -- the SQL statement.
  -> m [Row] -- ^ A 'Map' of attribute name to attribute value for each
                 -- row. Can be the empty list.
query sql bind = do
  stmt <- prepare sql
  liftIO $ HDBC.execute stmt bind
  liftIO $ HDBC.fetchAllRowsMap' stmt

Вроде всё хорошо. Единственное: может, попробовать закрыть statement принудительно? Что я и сделал. Не поверите, помогло. По крайней мере ошибок я больше не увидел. Две переписанных мною функции:

query :: HasHdbc m c s => String -> [SqlValue] -> m [Row]
query sql bind = do
  stmt <- prepare sql
  liftIO $ HDBC.execute stmt bind
  rows <- liftIO $ HDBC.fetchAllRowsMap' stmt
  liftIO $ HDBC.finish stmt
  return rows
  
query' :: HasHdbc m c s => String -> [SqlValue] -> m Integer
query' sql bind = withHdbc $ \conn -> do
  stmt <- HDBC.prepare conn sql
  count <- liftIO $ HDBC.execute stmt bind
  liftIO $ HDBC.finish stmt
  liftIO $ HDBC.commit conn
  return count

Если вы вдруг снова увидите эту ошибку, вы же мне сообщите?

Я.Субботник

Сходил. Посмотрел. Честно говоря, я думал, что будет интереснее. Думал, что расскажут что-нибудь необычное или хотя бы более техническое. А на самом деле то ли я слишком умный, то ли действительно рассказывали довольно банальные штуки. Хотя есть несколько вещей, которые я оттуда вынес. Во-первых, это концепция БЭМ. Если мне когда-нибудь придется верстать и поддерживать большой проект, я обязательно обращусь к нему, хотя бы в качестве возможного варианта. А во-вторых, в-третьих и в-четвертых, это сумка, блокнот и набор карандашей с ручкой.

Сумка, блокнот и карандаши

Сумка, блокнот и карандаши

Хотя нет, обманываю. Еще узнал, что Яндекс.Диск — это не то же, что и Dropbox, а гораздо ближе к Google Drive.

Вот он, первый пост

Идея завести этот блог возникла во время обсуждения функциональных языков программирования на IT_Ground. Подумалось: а не вспомнить ли мне, что такое Haskell? И вот спустя несколько недель появился мой блог. В большей степени он — это попытка вспомнить функциональное программирование, но в то же время это изучение нового да и просто убийца времени. Я получил немало удовольствия, планируя и создавая этот блог, и надеюсь, получу ещё больше. Исходный код открыт для всех желающих и лежит на гитхабе. Код весьма нубский (что же ещё я бы смог написать со своим императивным мозгом), а потому просьба относиться с осторожностью. Не буду обещать часто сюда писать. Особой тематики тоже не планируется. Просто мой уютный бложик с моими же кавайными фоточками.

Не стесняемся оставлять комментарии.

UPD: Чуть не забыл:

module Main where

main = print "Hello world"
Моложе →