понедельник, 8 декабря 2014 г.

Переделываем под себя чужой пакет для Meteor.

Есть замечательный пакет reactive-table, который позволяет сэкономить массу времени на выводе коллекции объектов в табличном виде. В этом пакете из коробки работают:

  • сортировка
  • настройка отображения только части полей
  • кастомизация полей
  • фильтрация по подстроке

Собственно, с фильтрацией и была основная проблема.

Для отрисовки таблицы нужно вызвать шаблон:


{{> reactiveTable collection=cases settings=tableSettings}}

В результате чего будет отрисована строка с фильтром (в правом верхнем углу) и под ней таблица с данными.

По дизайну моего приложения строка фильтра должна была находиться среди других управляющих элементов и совсем не справа. Разработчик reactive-table не предлагает возможности разместить этот элемент в другом месте. Загонять элемент на нужное место ухищрениями CSS мне показалось неправильным.

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

{{> reactiveTableFilter settings=tableSettings space='cases'}}
...
<!-- немного HTML -->
...
{{> reactiveTable collection=cases settings=tableSettings space='cases'}}

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

По шагам:
  1. Форкнуть проект на github: https://github.com/ecohealthalliance/reactive-table.git
  2. cd my-project
  3. mkdir packages
  4. cd packages
  5. git clone https://github.com/a-ruzin/reactive-table.git
  6. добавим ссылку на оригинальный репозиторий, чтобы можно было pull'ить изменения
    git remote add up https://github.com/ecohealthalliance/reactive-table.git
  7. cd reactive-table
  8. 4-ую строку package.js заменим на: "xxx:reactive-table"
  9. cd .. 
  10. meteor add xxx:reactive-table

В четвертом пункте вместо 'xxx' может быть любая строка (например, ваш аккаунт на meteor.com).

Все, после этого уже можно править код.

Желательно сразу переключиться на другую ветку, чтобы уменьшить количество проблем с merge, если ваши изменения окажутся кривыми или за время разработки основной разработчик убежит вперед:

  1. git checkout -b my-feature
Теперь мы свободно меняем исходник пакета и проверяем его работу на своем живом проекте.

После того, как все отладили, commit'им и затаскиваем в свой репозиторий на github.com.
  1. git commit -am "my feature"
  2. git push origin my-feature
Если вы сочли ваши изменения полезными для других можно сделать pull-request автору оригинального пакета.


пятница, 13 июня 2014 г.

MeteorJS

Начал изучение MeteorJS. https://www.meteor.com/

Первое впечатление - лучшее средство для прототипирования web-приложений.

Из существенных плюсов:

  1. Разработка полезного кода через минуту после старта проекта (вам не надо готовится, придумывать структуру проекта, настраивать окружение, поднимать веб-сервер и пр.)
  2. "Моно"-культура (если считать JavaScript+HTML единой платформой, то кроме этого ничего больше не понадобится - ни Python, Ruby, PHP, C# и т.п.)
  3. Запуск "серверного" JavaScript. Часть кода обязана запускаться на сервере, чтобы гарантировать отсутствие взлома.
  4. Reactive programming. Вы можете представления своих объектов сделать "живыми", т.е. если кто-то другой их меняет, то эта информация тут же доходит до вашего приложения и представления автоматически показывают обновления. Работает "из коробки".
  5. Удобная система шаблонов
  6. Автоматическая сборка JS/HTML - можно раскидать файлы проекта почти "как угодно", проект соберется и будет работать - т.е. вы можете разместить файлы на свой вкус, и при этом не заморачиваться с импортами из нужных каталогов.
  7. LiveCodeUpdate - как только вы внесли изменение в код, он автоматически обновляется на клиентах (особенно удобно для отладки приложений) - вам не надо перезагружать браузер. При использовании рекомендаций (типа хранение параметров в Session) пользователь может даже не заметить, что код поменялся.
  8. Packages. Система пакетов - с этим еще предстоит разобраться, но есть масса готовых пакетов (я использую: iron-router, collection2, simple-schema, autoform) и возможность писать и публиковать свои: https://atmospherejs.com/.
Написано пока мало кода, есть свои сложности с освоением, но, в целом, очень приятная среда.

четверг, 6 марта 2014 г.

MySQL: VARCHAR vs TEXT

После обновления командой разработки структуры БД появилась таблица со 114 колонками, из которых 15 типа LOGTTEXT. По факту MySQL начал тормозить, даже на операциях, которые не должны вызывать проблем (обновление одного поля по первичному ключу). 
Мои изыскания на тему, может ли это быть основной/единственной причиной тормозов не дали положительного результата. Вот ссылки крупицы знаний, которые удалось найти:


TEXT and BLOB is stored off the table with the table just having a pointer to the location of the actual storage.
VARCHAR is stored inline with the table. VARCHAR is faster when the size is reasonable, the tradeoff of which would be faster depends upon your data and your hardware, you'd want to benchmark a realworld scenario with your data.
http://stackoverflow.com/questions/2023481/mysql-large-varchar-vs-text  


MySQL needs to allocate TEXT column separately which causes some overhead, but I guess it is minimal.
http://forums.mysql.com/read.php?24,105964,105984#msg-105984

TEXT data types are stored as separate objects from the tables and result sets that contain them. This storage is transparent — there is no difference in how a query involving a TEXT field is written versus one involving a VARCHAR field. Since TEXT is not stored as part of a row, retrieval of TEXT fields requires extra [edited 1/22] memory overhead.
http://www.pythian.com/blog/text-vs-varchar/
Если подытожить, то дополнительный расход есть, но он не должен быть значительным.

Тем не менее, мы от`ALTER`или таблицу и заменили LONGTEXT'ы на VARCHAR (благо в нашем случае объемные тексты не применялись).

О результатах сообщу дополнительно...

... похоже помогло.

После переделки LONGTEXT -> VARCHAR скорость вернулась на прежний уровень.