• Как избавиться от зависимых запросов?

    AMar4enko
    @AMar4enko
    Вам уже правильно сказали, что надо сделать отдельный API-метод для этой ситуации. По-сути это REST-метод получения коллекции с фильтром.
    В качестве фильтра у вас будут выступать город и категория.
    Для города и категории у вас хранится alias и id, с фронта вам прилетает alias.
    Вы проверяете, есть ли у вас в кеше сохраненные id для переданных алиасов города и категории. Если нет, то строите большой запрос с джойнами, который фильтрует по альясам. В результате выполнения вы помимо информации по музеям получите id города и категории, которые вы кладете в кеш. Последующие запросы возьмут id из кеша и запрос будет к одной таблице без джойнов с фильтром по конкретным id.
    Ответ написан
    Комментировать
  • Как определить SSE запрос?

    AMar4enko
    @AMar4enko
    Как насчет гугла?
    habrahabr.ru/post/120429

    Протокол Server-Sent Events

    Клиент отправляет запрос на сервер, сервер в ответ отправляет следующий заголовок:
    Content-Type: text/event-stream

    По этому заголовку отсеивайте. Идеально где-нибудь на прокси-сервере.
    Ответ написан
    Комментировать
  • Как использовать сериализацию?

    AMar4enko
    @AMar4enko
    Вики пишет что сериализация это "процесс перевода какой-либо структуры данных в последовательность битов". И обратная сторона - десериализация.
    Если вам нужно передать сложный объект с помощью какого-либо транспорта (файл, TCP-IP соединение, и.т.д) вам надо ваш объект на одной стороне перевести в последовательность байт, а на другой стороне восстановить из последовательности байт. Это и есть сериализация - десериализация.
    Во всех ЯП сверхвысокого уровня типы C#, Ruby, Python и т. д. есть встроенные механизмы сериализации, но иногда разработчики переопределяют методы сериализации \ десериализации для каких-то своих целей.
    Ответ написан
    Комментировать
  • Почему не получается подключиться к MySQL через PDO, когда хост БД указан в переменной?

    AMar4enko
    @AMar4enko
    А если попробовать сначала сгенерировать строку подключения, а потом уже ее в метод передать? Ну так, в порядке бреда.
    Ответ написан
  • JavaScript фреймфорк + права пользователей + интерфейс

    AMar4enko
    @AMar4enko
    Если поразмыслить, то мало скрывать-показывать элементы - для этого можно использовать, как вы правильно сказали, rootScope + директивы (ng-if, ng-hide).
    Нужно еще ведь и отдачу данных ограничить - обычный пользователь не должен получать от сервера данные, которые не может видеть.
    Т.е. недостаточно, на мой взгляд, просто скрыть колонку в таблице, если данные для этой колонки все равно прилетают с сервера.
    Ответ написан
  • Каптча в Yii без модели?

    AMar4enko
    @AMar4enko
    Смысл капчи в том, чтобы проверить ее валидность при выполнении каких-то действий.
    Как вы это будете делать без модели?
    Вы же в курсе, что под моделью в Yii подразумевается не только CActiveRecord, но все, что унаследовано от CModel, например CFormModel?
    Поэтому вы можете сделать так:
    class AgreementForm extends CFormModel{
          var $captchaText;
          public function rules(){
              return array(
                  array('captchaText', 'captcha')
              );
          }
    }
    
    // Код контроллера
    public function actionAgreement(){
          $form = new AgreementForm();
          $form->attributes = $_POST['AgreementForm'];
          $form->validate();
          if($form->hasErrors()){
          // No way, you've got missed something, dude
          }else{
          // Hooray         
          }
    }
    Ответ написан
    Комментировать
  • Чем хорош Ruby?

    AMar4enko
    @AMar4enko
    Во-первых rubygems.
    Во-вторых пример из жизни - есть gem. С десяток классов, все друг друга используют.
    Возникла необходимость чуть-чуть изменить поведение пары методов одного из классов - так бывает.
    Что вы будете делать в случае с php? Вы сделаете локальную копию библиотеки, поломаете методы так, как вам нужно.
    В случае с ruby вы можете:
    1. Полностью изменить реализацию одного метода конкретного класса
    2. Обернуть существующую реализацию своим кодом, с помощью сохранения старого метода под новым именем с помощью alias_method
    В-третьих - метапрограммирование. Хотя по значимости это стоило на первое место поставить. Именно благодаря метапрограммированию код на Ruby лаконичен и легко читаем.
    В-четвертых, мне просто приятно иметь возможность писать конструкции типа 2.hours.ago - догадаетесь, чего она делает?
    Ответ написан
    1 комментарий
  • Алгоритм вычисления проблемного периода сумм при просчете комиссии

    AMar4enko
    @AMar4enko
    Вы серьезно?
    Это же простейшая пропорция
    200 золота = 101%
    x золота = 100%

    x = (200 * 100) / 101
    Сначала отнимаете от суммы платежа все фиксированные комиссии, потом высчитываете по этой пропорции. Какие к чертям периоды?
    Ответ написан
  • Как в области разработки игр двумя-тремя словами определить понятие "порционирования" игрового времени?

    AMar4enko
    @AMar4enko
    Если я правильно понял про что речь, то эти таймауты преодолеваются донатом.
    Вот и ответ на вопрос - это механизм выбивания доната из игроков.
    Ответ написан
    Комментировать
  • Обновление нескольких полей в таблице?

    AMar4enko
    @AMar4enko
    Апдейта каждой сущности отдельно вам не избежать, но оптимизировать можно:
    - выборку сущностей, путем вытаскивания их из таблицы одним запросом через IN
    - сохранение, выполнением апдейтов в транзакции

    Вам стоит отказаться от find_or_initialize, сделать выборку сущностей через IN, обновить те, которые нашлись, определить id, которые не нашлись, для них создать новые и сохранить. Все это упаковать в транзакцию.
    Ответ написан
  • Динамическое создание классов (PHP)?

    AMar4enko
    @AMar4enko
    Вы меня простите, но вряд ли вам дадут совет, как наиболее оптимизированно сломать себе руку - в большинстве своем люди либо не ломали себе рук, либо это было очень неприятно.
    Надеюсь, метафора вам понятна.
    Ответ написан
    Комментировать
  • Yii, EAV, производительность?

    AMar4enko
    @AMar4enko
    При работе с БД не должно быть ничего неявного - вы должны от и до понимать, как работает тот или вызов ActiveRecord.
    Я разрабатывал магазин на Yii, товары с вариативными параметрами, параметры в отдельной таблице, связь "много ко многим" - все нормально бегало.
    Ответ написан
  • Вывод данных в WxRuby

    AMar4enko
    @AMar4enko
    У вас жесткий цикл, да еще и со слипом внутри.
    Любые фреймворки типа WxRuby основаны на событиях. И любое взаимодействие с интерфейсом обрабатывается в глобальном цикле обработки событий.
    Если представить, что происходит в вашем случае, то при обработке события нажатия на кнопку запускается ваш цикл, который захватывает управление и отдает только после прохождения всего цикла целиком, после чего управление возвращается обратно в основной цикл обработки событий и текстовый элемент обновляется.
    Для того, чтобы заработало конкретное данное решение, вам вместо sleep нужно сделать цикл, который будет крутиться одну секунду и внутри которого будет выполняться обработка событий (http://wxruby.rubyforge.org/doc/app.html#App_dispatch)

    Можно попробовать
    def print
     Thread.new do
       5.times{| i |
          # Вывод данных в интерпретатор
          p i
          # Вывод данных в текстовое поле
          text.value +=  i.to_s
          sleep 1
        }
      end
    end

    P.S. Ну и тег странный, конечно
    Ответ написан
    Комментировать
  • Двухсторонний шаблонизатор?

    AMar4enko
    @AMar4enko
    Дело в том, что вы старательно пытаетесь игнорировать тот факт, что в требованиях пришли к single page application на JS. И пробуете найти какой-то подход, который оставит вас в рамках текущей парадигмы разработки.
    А решения уже придуманы давно и их очень много, можно выбирать на любой вкус. И все он заключаются в том, что на сервере шаблонизации нет вообще - там только данные.
    Все взаимодействие с фронтом через REST API.

    Единственное, что может вызвать проблему в этом случае - индексация такого приложения браузером. Но и тут есть решение, требующее минимального вмешательства в код сервера - вы просто делаете снэпшоты страницы, требующих индексации, например с помощью PhantomJS, после чего отдаете их как статику с сервера при запросе от бота.
    Ответ написан
    1 комментарий
  • Нужен простой фреймворк или шаблонизатор для создания интерфейса к RESTful сервису?

    AMar4enko
    @AMar4enko
    Еще решение AngularJS + ngTable + Restangular.
    Пагинация + сортировка + фильтр таблиц будут из коробки, если с серверным API согласуете.
    Ответ написан
    Комментировать
  • [PHP][nginx] Как организовать множественную отдачу файлов пользователю?

    AMar4enko
    @AMar4enko
    По моему скромному мнению вам все-таки есть смысл отдать файл архивом, с минимальной компрессией.
    Т.е. по доступу к скрипту создаете архив с файлами, делаете редирект, чтобы он отдался через nginx.
    Ответ написан
  • Загрузка файлов с angularjs и blueimp jquery fileupload?

    AMar4enko
    @AMar4enko
    Не смогу вам дать полностью правильное решение, но дам направление.
    Дело в том, что у директивы data-file-upload есть внутренняя очередь файлов, связанная с самим uploader'ом. В первом примере выбор файла добавляет новый элемент в эту очередь. Происходит это потому, что в момент линковки директивы в DOM уже есть input[type="file"].
    Во втором случае инпуты появляются тогда, когда отрабатывает ng-repeat, и data-file-upload некуда привязать событие добавления в очередь при линковке.

    В целом, вы выбрали немного неверную модель работы с этим плагином.
    Вот мой рабочий пример:
    define(['app', 'lodash'], function(app, lodash) {
      return app.directive('fileUploader', function() {
        return {
          require: '?ngModel',
          replace: false,
          templateUrl: '/themes/main/assets/admin/js/views/directives/FileUploader.html',
          link: function($scope, element, attrs, ngModel) {
            $scope._files = [];
            $scope._uploaderOptions = {};
            if (ngModel) {
              ngModel.$render(function() {
                if (!angular.equals($scope._file, ngModel.$viewValue)) {
                  return $scope._files = ngModel.$viewValue;
                }
              });
            }
            attrs.$observe('options', function(value) {
              return $scope._uploaderOptions = $scope[value];
            });
            return $scope.$on('fileuploaddone', function(event, data) {
              return $scope.$apply(function() {
                $scope._files = $scope._files.concat(data.result.files);
                event.targetScope.clear(data.files);
                if (ngModel) {
                  return ngModel.$setViewValue($scope._files);
                }
              });
            });
          }
        };
      });
    });

    А это шаблон, который в директиве используется.
    <div class="file-uploader">
      <ul class="tiles row-fluid">
        <li class="span3 tile" ng-repeat="file in _files">
          <div class="row-fluid information">
            <div class="span12">
              <div class="preview">
                <a ng-if="file.fileMetadata.thumbnailUrl"
                   ng-href="{{file.uri}}"
                   title="{{file.name}}" target="_blank">
                  <img data-ng-src="{{file.fileMetadata.thumbnailUrl}}" width="48" alt="">
                </a>
              </div>
              <div class="info">
                <p class="name">{{file.name}}<br/><small>{{file.size | formatFileSize}}</small></p>
              </div>
            </div>
          </div>
        </li>
      </ul>
      <div file-upload="_uploaderOptions" ng-class="{'fileupload-processing': processing() || loadingFiles}">
        <div class="row-fluid fileupload-buttonbar">
          <div class="span12">
            <!-- The fileinput-button span is used to style the file input field as button -->
            <span class="btn btn-small btn-success fileinput-button" ng-class="{disabled: disabled}">
                <i class="glyphicon glyphicon-plus"></i>
                <span>Добавить...</span>
                <input type="file" name="files[]" multiple ng-disabled="disabled">
            </span>
          </div>
        </div>
        <!-- The table listing the files available for upload/download -->
        <ul class="tiles row-fluid">
          <li class="span3 tile" ng-repeat="file in queue"
              ng-class="{'processing': file.$processing(),'pending': file.$state() == 'pending'}">
            <div class="row-fluid information">
              <div class="span12">
                <div class="preview">
                  <a ng-if="file.fileMetadata.thumbnailUrl"
                     ng-href="{{file.uri}}"
                     title="{{file.name}}" target="_blank">
                    <img data-ng-src="{{file.fileMetadata.thumbnailUrl}}" width="48" alt="">
                  </a>
                </div>
                <div class="info">
                  <p class="name">{{file.name}}<br/><small>{{file.size | formatFileSize}}</small></p>
                  <strong ng-show="file.error" class="error text-danger">{{file.error}}</strong>
                </div>
              </div>
            </div>
            <div class="row-fluid progress-bar" ng-show="file.$state() == 'pending'">
              <div class="progress progress-small progress-success active fade"
                   ng-class="{pending: 'in'}[file.$state()]"
                   file-upload-progress="file.$progress()">
                <div class="bar" ng-style="{width: num + '%'}"></div>
              </div>
            </div>
          </li>
        </ul>
      </div>
    </div>

    Смысл в том, что у нас в шаблоне всегда есть одна кнопка "Добавить", нажатие на нее обрабатывает сам uploader.
    После нажатия на нее он добавит выбранный файл в очередь (в моем случае еще и загрузку начнет, потому что у меня автостарт используется). После того, как файл загрузится, сработает событие 'fileuploaddone', которое я ловлю, добавляю файл, который был загружен, к себе в список, а из очереди загрузчика удаляю.
    Ответ написан
    5 комментариев
  • Как в AngularJS сделать добавление директив "на лету"?

    AMar4enko
    @AMar4enko Автор вопроса
    Разобрался. Если кому интересно:
    Дело было, на самом деле, во внутренностях ангуляра, а точнее в том, что он при компиляции ноды принудительно проверяет наличие некоторых атрибутов, и делает для их содержимого $scope.$watch, внутри которого делает attrs.$set.
    Так как я добавлял ngRequired после компиляции ноды, то мне надо было просто сделать что-то типа:
    $scope.$watch(attrs.formControl + ".required('" + (element.attr('name')) + "')", function(value){
        attrs.$set("required", !!value)
     });

    А ngRequired, как показано выше, отслеживает значение атрибута required и обновляет валидацию.
    Ответ написан
    Комментировать