• Стоит ли переходить на React.PureComponent по-умолчанию?

    PQR
    @PQR
    React.PureComponent реализует метод shouldComponentUpdate таким образом, что он делает поверхностное сравнение props и state (не глубокое). Вот собственно код:
    https://github.com/facebook/react/blob/c8fbdac2271...
    shouldUpdate =
                !shallowEqual(prevProps, nextProps) ||
                !shallowEqual(inst.state, nextState);


    Что такое shallowEqual? Это по сути сравнение оператором === каждого элемента из prevProps с каждым элементом из nextProps. На всякий случай дам ссылку на реализацию для полного понимания: https://github.com/facebook/react/blob/6963ea4bfcd...

    В итоге всё зависит от структуры ваших props. Если в props вы передаёте объекты которые иногда мутируются, т.е. по ссылке они равны ===, но внутри какие-то данные поменялись (что само по себе выглядит странно в экосистеме redux + reselect, но вполне возможно технически), тогда использование PureComponent вам всё поломает, т.к. на экране какие-то компоненты перестанут перересовываться!

    Если же у вас всё по уму, данные которые передаются через props являются скалярными типами (string, int, float, bool) или immutable объектами, тогда смело используйте PureComponent - в некоторых случаях он поможет избавиться от лишних вызовов render.

    Важное замечание: PureComponent нужно использовать только для так называемых presentational components, т.е. для тех компонент, которые НЕ обёрнуты в вызов redux connect().

    Для container components (т.е. тех компонент, которые обёрнуты в redux connect()) нет смысла наследоваться от PureComponent, т.к. метод connect() оборачивает ваш компонент своей реализацией shouldComponentUpdate, которая также использует shallowEqual. Если вы по недосмотру унаследуете container component от PureComponent - ошибок не будет, но это не имеет никакого смыла, т.к. ваш код по сути будет дважды делать shallowEqual, а зачем делать лишнюю работу?

    Подводя итог, рецепт такой:
    - presentational components наследуем от React.PureComponent
    - container components (которые обёрнуты в redux connect()) наследуем от старого доброго React.Component
    Ответ написан
    1 комментарий
  • Как быстро сформировать сложный Excel-документ?

    PQR
    @PQR
    На тостере есть похожий вопрос по оптимизации генерации Excel из PHP, посмотрите, там дельные ответы: Оптимизация генерации excel из php?

    Расскажу также свою историю, не про запись, а про чтение большого Excel файла (несколько десятков страниц, на каждой странице 1000+ строк * 30 столбцов). PHPExcel работал но медленно. Классическая PEAR библиотека оказалась быстрее в 2 раза, но и она в итоге отрабатывала за 60+ секунд (время чтения xls файла в память PHP). Поскольку входной формат файла был известен заранее, я открыл исходники и начал выпиливать оттуда фишки, которые мне не нужны, удаляя лишний код! Некоторые функции вручную инлайнил. В итоге время чтения сократилось до 5 секунд. Резюме: если формат зафиксирован и гибкость не нужна, узкозаточенное решение (после некоторых усилий по заточке) даст хороший результат!

    Также на этот вопрос есть классический ответ на StackOverflow, который собрал все альтернативы: stackoverflow.com/questions/3930975/alternative-fo...

    Процитирую здесь, чтобы далеко не ходить или на случай если stackoverflow.com будет не доступен (валидность всех ссылок не проверял):

    For Writing Excel

    PEAR's PHP_Excel_Writer (xls only)
    php_writeexcel from Bettina Attack (xls only)
    XLS File Generator commercial and xls only
    Excel Writer for PHP from Sourceforge (spreadsheetML only)
    Ilia Alshanetsky's Excel extension now on github (xls and xlsx, and requires commercial libXL component)
    PHP's COM extension (requires a COM enabled spreadsheet program such as MS Excel or OpenOffice Calc running on the server)
    The Open Office alternative to COM (PUNO) (requires Open Office installed on the server with Java support enabled)
    PHP-Export-Data by Eli Dickinson (Writes SpreadsheetML - the Excel 2003 XML format, and CSV)
    Oliver Schwarz's php-excel (SpreadsheetML)
    Oliver Schwarz's original version of php-excel (SpreadsheetML)
    excel_xml (SpreadsheetML, despite its name)... link reported as broken
    The tiny-but-strong (tbs) project includes the OpenTBS tool for creating OfficeOpenXML documents (OpenDocument and OfficeOpenXML formats)
    SimpleExcel Claims to read and write Microsoft Excel XML / CSV / TSV / HTML / JSON / etc formats
    KoolGrid xls spreadsheets only, but also doc and pdf
    PHP_XLSXWriter OfficeOpenXML
    PHP_XLSXWriter_plus OfficeOpenXML, fork of PHP_XLSXWriter
    php_writeexcel xls only (looks like it's based on PEAR SEW)
    spout OfficeOpenXML (xlsx) and CSV
    Slamdunk/php-excel (xls only) looks like an updated version of the old PEAR Spreadsheet Writer

    For Reading Excel

    php-spreadsheetreader reads a variety of formats (.xls, .ods and .csv)
    PHP-ExcelReader (xls only)
    PHP_Excel_Reader (xls only)
    PHP_Excel_Reader2 (xls only)
    XLS File Reader Commercial and xls only
    SimpleXLSX From the description it reads xlsx files , though the author constantly refers to xls
    PHP Excel Explorer Commercial and xls only
    Ilia Alshanetsky's Excel extension now on github (xls and xlsx, and requires commercial libXL component)
    PHP's COM extension (requires a COM enabled spreadsheet program such as MS Excel or OpenOffice Calc running on the server)
    The Open Office alternative to COM (PUNO) (requires Open Office installed on the server with Java support enabled)
    Nuovo's spreadsheet-reader (csv, xls, xlsx, and ods)
    SimpleExcel Claims to read and write Microsoft Excel XML / CSV / TSV / HTML / JSON / etc formats
    PHPExcleReader Is just a ZIP with an old version of PHPExcel
    Akeneo Labs Spreadsheet Parser OfficeOpenXML (.xlsx) and CSV files
    spout OfficeOpenXML (xlsx) and CSV
    xhook's php-spreadsheetreader Claims to do most formats
    Ответ написан
    Комментировать
  • Meteor.js расцветает или чахнет?

    PQR
    @PQR
    Не согласен с предыдущим оратором (@geeek), в частности с утверждением
    В общем если хочешь быть в тренде - бери
    - Meteor совсем не в тренде.

    Если дать краткий и резкий ответ на вопрос "расцветает или чахнет?" - отвечу: интерес к Meteor чахнет, не смотря на все усилия команды разработки.

    Компания MDG (Meteor Development Group) подняла $31M инвестиций (https://www.crunchbase.com/organization/meteor) и хотела всё сделать круто, стать мейнстримом, а потом зарабатывать на хостинге Meteor проектов - такой план монетизации. Хостинг они, кстати, сделали. И в какой-то момент было много хайпа вокруг Meteor, казалось, что всё идёт по плану. Полтора года назад вышел Meteor 1.0 (октябрь 2014), потом была пара хороших релизов, которые убрали всю "сырость": Meteor 1.1 и 1.2.

    Но в середине 2015 стало понятно, что никаким мейнстримом они не стали, мейнстрим нынче React!
    Не смотря на простоту старта и скорость разработки с Meteor, были очевидны следующие минусы:

    1. Собственная система пакетов со своим центральным репозиторием https://atmospherejs.com - посмотрите на счётчики скачивания пакетов, это крохи по сравнению с npm. Посмотрите на активность разработки основных пакетов - всё очень тухленько.

    2. Собственная система сборки. С одной стороны всё работает из коробки, с другой стороны в неё не вклинишься (это сложно). Плюс всякие странные условности, что всё в глобальном пространстве имён и ваши js файлы загружаются в алфавитном порядке. В Meteor 1.3 частично решили проблему, ходят слухи, что в будущем будут использовать webpack.

    3. Собственный шаблонизатор blaze (похож на handlebars). В начале blaze выглядел хорошо, но теперь все внезапно пишут на React и многие потирают руки в ожидании Angular 2, в итоге blaze оказался ещё один велосипедом, с которым не понятно что делать.

    4. На бекенде всё ещё Node 0.10. Даже с Node 0.12 Meteor уже не работает из-за некоторых бинарных зависимостей! Обещали в будущих версиях обновиться с поддержкой Node 4.

    5. Метеор сильно завязан на MongoDb. Чтобы реактивно доставлять новые/изменившиеся данные от сервера в бразуер они парсят логи Mongo. Были попытки сделать аналогичное для SQL баз, но не увенчались успехом. В итоге встречайте их новый проект Apollo, который поверх GraphQL и не привязан к конкретной реализации бекенда www.apollostack.com А что теперь будет со старым добрым DDP?

    6. Ваше Meteor приложение одной командой можно упаковать в мобильное приложение Cordova - выглядит круто, но сейчас время ReactNative и вот мы читаем обсуждения на форумах, что возможно, они таки интегрируются с ReactNative, но когда?

    Подводя итог: ребята из MDG подняли кучу денег и хотели сделать всё сами: свои пакеты, свою сборку, свой шаблонизатор, свой реактивный протокол (DDP) и чтобы всё работало из коробки. И они сделали это!

    Только это оказалось никому не нужно, т.к. для пакетов все сидят на npm, сборка должна быть гибкой (и поэтому у нас есть gulp и webpack), самый модный шаблонизатор нынче - это React, реактивный протокол GraphQL и базы на сервере люди любят разные, а не только MongoDb. А Meteor, по сути, остался на обочине всей экосистемы и движухи вокруг JavaScript. Поняв это, MDG начали двигаться в сторону JS комьюнити и первый шаг сделан: Meteor 1.3 поддерживает нормальные модули ES2015, npm пакеты, рендринг через React и Angular. Но Meteor 1.3 - это куча костылей поверх старого велосипедного Meteor. Почитайте их планы на будущее в официальном блоге, хотя бы в этом посте: info.meteor.com/blog/announcing-meteor-1.3 - им по сути предстоит переписать всё заново! И первые ласточки такого "переписывания" - это выделение проекта Apollo.

    Возможно, со второй попытки они всё сделают правильно и Meteor 2.0 действительно выстрелит. Если только у них деньги не закончатся раньше.

    Сейчас можно взять Meteor и эффективно зарабатывать на маленьких/средних фриланс проектах, когда нужно сделать быстро и не думать о долгосрочной поддержке.
    Если же вы делаете большой продукт, то вас ждут большие потрясения и изменения в экосистеме Meteor.
    Ответ написан
    4 комментария
  • Можно ли в Redux использовать EventEmitter?

    PQR
    @PQR
    Ведь придется подписываться на нажатие клавиатуры и тд. Менять состояние часто. В общем, не очень привлекательная затея.


    На самом деле в React всё так и делают - каждое нажатие клавиатуры, каждый клик - всё это генерирует события onChange или onClick. А если используем Redux, то как следствие на каждое нажатие клавиатуры или клик куда-нибудь у нас будут генерироваться action, например такое:
    dispatch({type: TEXTAREA_CHANGE, value: newValue})
    Ответ написан
    Комментировать
  • На чем писать фронтенд легко и непринужденно?

    PQR
    @PQR
    Лёгкий, непринуждённый и, главное, надёжный Frontend - это Elm!
    https://youtu.be/ZD0GcCAopc4
    elm-lang.org
    Ответ написан
    Комментировать
  • Порекомендуйте англоязычный подкаст с IT тематикой и хорошим произношением у участников?

    PQR
    @PQR
    softwareengineeringdaily.com - Ведущий с очень чёткой речью! Гости когда как...
    Ответ написан
    Комментировать
  • Как правильно развернуть окружение через Docker?

    PQR
    @PQR
    Ставьте на голый сервер без докера - и nginx и node и php-fpm - всё на один сервер. Пусть nginx проксирует либо на php-fpm, либо на node.js в зависимости от имени хоста на который пришел запрос.

    Если очень хочется докер - делайте один контейнер а внутрь nginx+node+php-fpm (зато с докером, модно!)
    Ответ написан
  • В какой момент пора использовать ООП?

    PQR
    @PQR
    >если вы не пишите в ООП стиле - вы лох.
    Это уже устарело, сейчас в моде отказ от ООП! Посмотрите на go - процедурное программирование + интерфейсы.
    Посмотрите на Scala - функциональные подходы в Java экосистеме (сюда же Clojure и Kotlin).
    Во фронтенде сплошная функциональщина: ClojureScript, Elm, Purescript. Тот же модный нынче React+Redux.

    Так что смело забивайте на ООП и начните писать на Clojure + ClojureScript!
    Ответ написан
    Комментировать
  • Как циклу предоставить не ряд числе, а только некоторые?

    PQR
    @PQR
    Можно придумать десяток способов, но у вас достаточно простой, читаемый и понятный код получился, я бы его оставил.

    Для примера, вот альтернативы:
    $notInResult = [0,1,2,4,5,7,8];
    $all = range(0, $nColumn); //массив всех чисел от 0 до $nColumn
    $inResult = array_diff($all, $notInResult); //убираем из массива всех чисел те, которые указаны в $notInResult
    
    foreach ($inResult as $j) {
        echo $sheet->getCellByColumnAndRow($j, $i)->getValue();
    }


    Второй вариант очень похож на ваш, но вместо медленной проверки in_array используется быстрая проверка isset
    $notInResult = [0 => true, 1 => true, 2 => true, 4 => true, 5 => true, 7 => true, 8 => true]; //номера скрываемых колонок будем хранить в ключах массива, а значениями массива сделаем заглушку true
    for ($j = 0; $j < $nColumn; $j++) {
        if (!isset($notInResult[$j])) {
            echo $sheet->getCellByColumnAndRow($j, $i)->getValue();
        }
    }
    Ответ написан
    Комментировать
  • Как изменить sql_mode при подключении к MySQL из Clojure?

    PQR
    @PQR Автор вопроса
    Пол часа гуглил, ничего не нашел, задал вопрос на тостере, погуглил ещё 5 минут - нашел! Эффект генерала (тостера).

    stackoverflow.com/questions/590937/mysql-coldfusio...

    The driver needs the STRICT_TRANS_TABLES mode enabled to enforce JDBC compliance on truncation checks.

    If you can't use STRICT_TRANS_TABLES as part of your sql_mode, then you'll have to disable truncation checks by adding "jdbcCompliantTruncation=false" as a URL configuration parameter.


    Переводя на русский, я изменил строку подключения, добавив параметр jdbcCompliantTruncation=false
    (def mysql-db {:subprotocol "mysql"
                   :subname "//127.0.0.1:3306/dbname?zeroDateTimeBehavior=convertToNull&jdbcCompliantTruncation=false"
                   :user "root"
                   :password "1234"})


    И поскольку у меня в mysql.ini уже прописано sql_mode="", то в коде его менять уже не понадобится. Удаляю предпоследнюю строку (j/execute ... за ненадобностью.

    А последняя строка, как и требовалось, теперь показывает результат ({:@@session.sql_mode ""})
    Ответ написан
    Комментировать
  • Есть ли аналог Curl на PHP который не требует установки?

    PQR
    @PQR
    Лучшая библиотека для http запросов на PHP на сегодняшний день - это Guzzle. Работает без curl, если тот не доступен: guzzle.readthedocs.org/en/latest/overview.html#req...

    Но она с ООП интерфейсом.
    Ответ написан
    Комментировать
  • Как правильно сделать размонтирование элемента (блока) в react.js?

    PQR
    @PQR
    Допустим сначала вы создали компонент и отрендрили его на странице так:
    React.render(<MyComponent />, document.getElementById('container'));


    Позже, вы можете удалить его из DOM дерева, плюс React сам почистит все обработчики событий так:
    React.unmountComponentAtNode(document.getElementById('container'));


    facebook.github.io/react/docs/top-level-api.html#r...
    Ответ написан
    Комментировать
  • Как в react.js правильно сделать ajax общение с сервером?

    PQR
    @PQR
    Пробовал использовать аякс от jquery, но он почему то не работает без beforeSend в котором должно быть прописано обращение к DOM через jquery (я не знаю, что это за магия, но когда прописываешь типа $(“.class”).after(“блок html”); то обращение с сервером проходит, если этого нет или да же нет всего объекта beforeSend, то он сваливается в error).

    Это какая-то невиданная фигня, так не должно быть.
    1. beforeSend не является обязательным для работы с ajax функциями в jQuery
    2. работа с DOM (где бы она ни была - в beforeSend или ещё где-то) никак не влияет на на ajax функциональность в jQuery
    3. использование react.js также никак не влияет на на ajax функциональность в jQuery

    В общем, вы куда-то не туда капаете в поисках причины ошибки.

    Покажите что-ли текст ошибки или фрагмент кода, в котором вы отправляете ajax запрос на сервер?
    Ответ написан
    Комментировать
  • Как вы ведёте учёт финансов?

    PQR
    @PQR
    Начинал с простого Excel, потом были 1С деньги, потом перешел на веб-сервис drebedengi.ru (есть и мобильные приложения) - уже 5 лет на нём! Пробовал zenmoney и 4конверта года три-четыре назад - после дребеденег "не то" (возможно, сила привычки).
    Ответ написан
    Комментировать
  • Как правильно смонтировать cifs (ubuntu 14.04) с доступом на запись для nginx/php (www-data)?

    PQR
    @PQR Автор вопроса
    Прочитал вот этот мануал linux.die.net/man/8/mount.cifs и добавил в параметры монтирования в /etc/fstab параметр noperm - внезапно доступ на запись появился у обоих пользователей (у моего консольного и веб-сервера www-data).

    Итого, строка подключения в fstab выглядит так: //192.168.20.115/filesfolders$ /mnt/filesfolder cifs user=guest,pass=,iocharset=utf8,noperm,uid=www-data,gid=www-data,dir_mode=0777,file_mode=0777,sec=lanman 0 0

    Однако, это не снимает общих вопросов на понимание: почему у директории я вижу права drwxrwxrwx, а на деле писать в неё может только owner? Почему файлы при сообщениях permission denied файлы всё-таки создаются, но пустые (если нет доступа, то его не должно быть совсем, так ведь?)
    Ответ написан
    1 комментарий
  • Есть ли толковый php framework для SAAS?

    PQR
    @PQR
    MODx развивается в сторону удобного разворачивания в cloud, была статья на хабре: habrahabr.ru/post/141455/
    Ответ написан
    1 комментарий
  • [Решено] HgLab — Mercurial Server для Windows

    PQR
    @PQR
    Очень нужно! Наткнулся на этот Q&A спустя месяц, вопрос к автору: вы уже где-то выложили свою наработку?
    Ответ написан
  • Сервис для online-трансляции семинара?

    PQR
    @PQR
    twitch.tv
    Ответ написан
    Комментировать
  • Синхронизация файлов Mac <--> Win?

    PQR
    @PQR
    Через интернет сейчас самое популярное решение: Dropbox (http://dropbox.org). При конфликтных изменениях сохраняет обе версии файлов.

    Есть ещё много менее популярных аналогов, например SugarSync, Windows Live Mesh (работает из под OS X), Wuala, AeroFS,…
    Ответ написан
    3 комментария