• [Асинхроность и nodejs] Кто что использует против callback hell и почему?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js

    Выше очень правильно заметили, что нужно разбивать методы на логические части поменьше, а не писать простыней, но еще есть проблема в том, что нужно сделать несколько запросов в БД или другим внешним источникам, к файлам, другим серверам, и потом на основе всех фрагментов данных, полученных асинхронно, исполнить бизнес-логику и сформировать ответ. Асинк прекрасно с этим справляется, как в примере ниже.

    
    var dataRequests = [];
    // массив запросов к разным данным (БД, файлы, сетевые вызовы)
    var dataResults  = {};
    // я предпочитаю не использовать массив results, который дает async
    // а вместо этого делать именованные фрагменты данных
    // и писать их в свой хеш
    
    // добавляем один запрос к данным
    dataRequests.push(function(callback) {
    	db.queryRow(
    		'SELECT * FROM TableName1 where Field1=?', [someValue1],
    		function(err, res) {
    			dataResults.firstPiceName = res;
    			callback(err, null);
    		}
    	);
    });
    
    // добавляем второй запрос к данным
    dataRequests.push(function(callback) {
    	db.queryValue(
    		'SELECT count(*) FROM TableName2 where Field2=?',
    		[someValue2],
    		function(err, res) {
    			dataResults.secondPiceName = res;
    			callback(err, null);
    		}
    	);
    });
    
    // вызываем массив запросов асинхронно
    async.series(dataRequests, function(err, results) {
    	// тут делаем бизнес-логику над dataResults в котором у нас есть
    	// все фрагменты данных .firstPiceName и .secondPiceName
    	// и формируем общий результат
    });
    

    А еще рекомендую ставить тег "node.js" на вопросы по ноде.

    Ответ написан
    1 комментарий
  • Почта России и коллапс

    Warchoon
    @Warchoon
    Нифига не разгребли. Висят на «экспорте» две мелких китайских посылки с начала апреля.
    Ответ написан
    Комментировать
  • Android: AutoCompleteTextView + SimpleCursorAdapter. Фильтрация данных, возможно ли?

    ara89
    @ara89
    насколько я понял, нужно обновлять курсор при вводе текста в TextView. добавьте TextWatcher и при обновлении текста обновляйте курсор новым запросом к бд
    Ответ написан
    3 комментария
  • Расскжите про робокассу пожалуйста

    Подключался как ИП. Проценты списываются с меня (для удобства клиента). Скудная панель управления. Нельзя подключить несколько магазинов на 1 аккаунт. Несколько аккаунтов можно привязать к одному ИП доп договором, но отчёты будут отдельно для каждого аккаунта.
    Дополнительно хочу подключить QIWI (http://ishopnew.qiwi.ru/reg.html).
    По России в основном оплачивают обычной платёжкой для банка.
    Ответ написан
    2 комментария
  • Существуют ли системы активного шумоподавления для помещений?

    Lincoln6Echo
    @Lincoln6Echo
    Это невозможно. Слишком короткая длина волны у звука — любое перемещение в помещении поломает всю систему.
    Наушники работают, но активно только на низких и средне-низких частотах + звукоизоляция на высоких частотах за счет физической изоляции ушей наушниками, и потому-что заранее известно расстояние между динамиком и ушной мембраной.
    Для помещений эффективнее заказать двухкамерные стеклопакеты, с разной величиной камер, такие сейчас многие делают, за счет разности шага камер и соответственно отсутствия резонанса, они эффективно гасят шум с улицы.
    Если совсем заморачиваться, можно сделать оклейку стен из тонкого пробкового материала, такое даже в виде рулонов обоев есть.
    Ответ написан
    7 комментариев
  • ИП программист во фрилансе

    reaferon
    @reaferon
    Касса для ИП — это довольно хлопотно.
    Могу предложить такой вариант: заключите договор с платежной системой (у меня, например, с rbkmoney.ru). Выставляете заказчикам счет на оплату с помощью платежной системы, они оплачивают удобным способом (банковская карта, электронные деньги etc), деньги поступают на счет в платежной системе. В любой момент можно заказать перевод средств на р/с, при этом для налоговой все красиво (договор, отчетные документы) и никаких плясок с z-отчетами по кассе. Минус — комиссия за вывод средств, что-то около 3%. Но ведь и кассовый аппарат не бесплатен.
    Еще плюс: по кассе за каждую операцию придётся отчитываться перед налоговиками. При прохождении средств через платежную систему отчитываетесь лишь за операции перевода средств на р\с. Я, например, вывожу средства раз в квартал (хотя поступают в ПС они практически ежедневно). Соответственно, и отчетность лишь за одну операцию, что в разы проще.
    Ответ написан
    3 комментария
  • После переустановки не работает MySQL

    @likeit
    По логам очевидно, что сервер не стартует из-за отсутствия баз. Базы создаются скриптом из папки scripts, а не mysql_upgrade. Проще всего было бы переустановить пакет с полным удалением и позволить установщику самому сделать работу.
    Ответ написан
    Комментировать
  • Ajax подгрузка файлов?

    neosys
    @neosys
    Реализуйте что-то типа стека (массива), куда вы будете подкладывать новые файлы.

    Параллельно огранизуйте функцию, которая слушает какой-то кастомный ивент типа «file-upload-added».

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

    Я имею ввиду что-то типа этого:

    var files = [];
    
    .bind("file-upload-added", function() {
        var file;
        
        if (files.length) {
            file = files.pop();
        } else {
            return;
        }    
        
        $.ajax({
            ...
            ...
            ...
            
            success: function() {
                .trigger('file-upload-added');
            }
        })
    });
    
    .bind("file-upload-selected", function(file) {
        files.push(file);
        
        .trigger('file-upload-added');
    })
    


    Дальше допилите под свои нужды
    Ответ написан
    Комментировать
  • Поиск одинаковых подстрок в строке?

    @al13n321
    Copy-paste detector есть в PMD: pmd.sourceforge.net/pmd-5.0.1/cpd.html (не нашел сходу нормального описания на их сайте; когда-то видел статью про то, как он устроен: там суффиксный массив).

    Если нужен именно алгоритм, то за O(N log N) (или, если постараться, O(N)) в худшем случае можно использовать суффиксный массив, суффиксное дерево или суффиксный автомат (осторожно, статьи ориентированы на спортивное программирование, стиль кода может быть непривычным).

    Пожалуй, проще всего работать с суффиксным массивом: это просто все суффиксы строки, упорядоченные в лексикографическом порядке (конечно, сами суффиксы хранятся не как строки, а как индексы начала). Для всех пар соседних суффиксов можно быстро найти LCP (наибольший общий префикс). Пусть дана минимальная длина (назовем ее L) искомых подстрок. Если в суффиксном массиве нашлись K последовательных (в лексикографическом порядке) суффиксов таких, что LCP любых двух соседних не меньше L, то LCP их всех есть подстрока исходной строки, входящая в нее хотя бы K раз. Используя эту идею, за O(N log N) можно, например, найти все подстроки длины L, встречающиеся хотя бы K раз (хотя это проще сделать хешами, как предложил mihaildemidoff). Наверно, можно аналогично перебирать подходящие строки в порядке убывания длины или количества вхождений. Но наверно это удобнее делать суффиксным деревом.

    Наверно, прямо при построении суффиксного дерева можно для каждой вершины найти количество вхождений соответствующей ей подстроки. Таким образом, мы найдем вообще для каждой подстроки количество ее вхождений. Но чтобы получилось O(N), а не O(N^2) данных, подстроки будут разбиты на группы (соответствующие вершинам дерева) с одинаковым количеством вхождений, и все произойдет за O(N). Того же самого можно (проще в реализации и сложнее в понимании) добиться и суффиксным автоматом (он в некотором смысле двойственен суффиксному дереву). Такой конструкции, наверно, достаточно для решения поставленной задачи в любой разумной конкретной формулировке.
    Ответ написан
    1 комментарий
  • Какую версию Python изучать?

    ks_ks
    @ks_ks
    Смотря сколько собираетесь учить.

    Если пару-тройку лет, то третью — потому-что вероятно большАя(если не бОльшая) часть библиотек и решений, перейдет на неё, за это время. Если за месяц-два планируете освоить, то 2.6\2.7 — потому-что сейчас большинство на них пишут и соответственно большинство библиотек и решений именно на нем. :)

    А почему вообще питон?
    Есть куча других замечательных языков — не холивара ради, но что вы на нем собираетесь делать?
    От направления деятельности нужно выбирать язык,
    и его версию, соответственно.

    Ну и до кучи — изучив любой из питонов, вы будете легко воспринимать, код на любых других версиях
    — правда, немного почитав про отличия (их не так много, к слову).
    Однако, без большого количества правильных примеров вам будет сложно прочувствовать
    все прелести новых конструкций, которые появились в 3.*, по отношению к 2.6\2.7.
    Ответ написан
    2 комментария
  • Как хранить 3 000 000 картинок и 100 000 файлов?

    qxfusion
    @qxfusion
    Посмотрите в сторону OCFS2 (распределенная, без мета сервера, проверено в продакшене, без «волшебных грибов») + DRDB (создание RAID over Network) — для DRDB рекомендую использовать или 2x10Gbps (дуплетом) или 1x40Gbps учитывая объемы.

    По поводу разделения на 2 ДЦ — в DRDB это возможно, хотя сама OCFS2 это позволяет.

    Консистентность решается средства ФС, НО если есть деградация сети — то можно получить колоссальную просадку IOPS.

    По поводу перераспределения — тут увы не скажу, но скорее нет чем да, как вариант можно использовать Cassandra но при переносе в любом случае будет потеря IOPS за счет циклом миграции и пересчета кольца.

    Я бы лично для OCFS2 рекомендовал сменить ОС на RHEL/OEL/CloudLinux/CentOS — т.к. там она работает хорошо, а вот с другими ОС…
    Ответ написан
    6 комментариев
  • ASUS P7P55D-Pro — шум в колонках при отключении питания компьютера?

    @sequence
    Была подобная проблема на дешевой акустике. Оказалось безбожно шумел трансформатор и кривой диодный мост.
    Выпаял мост нафиг, вместо него напрямую зацепил зарядку от давно умершего телефона Nokia (импульсный выпрямитель, 9V, 0,75А)
    Про гул в колонках забыл как о страшном сне. Удачи )
    Ответ написан
    Комментировать
  • Apache Mod_Rewrite — как заставить остановиться после срабатывания RewriteRule?

    WaveCut
    @WaveCut Автор вопроса
    PHP Dev
    Сам спросил — сам ответил. Необходимо использовать условие:
    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^/image\/.*$
    RewriteRule  ^.*$ imageWrapper.php [NC,L]
    
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^.*$ index.php [NC,L]
    
    Ответ написан
    Комментировать
  • Генерация 1млн билетов со случайными уникальными ID

    karellen
    @karellen
    Если это не синтетическая задача типа «как бы вы забили гвоздь, имея только молоток», то с такими задачами хорошо справляется Redis — в set можно записать заранее все номера (в любом виде — хоть числа, хоть строки, хранить миллион номеров понадобится всего пару-тройку МБ памяти) и через SPOP получать случайное число с алгоритмической сложностью О(1).
    Ответ написан
    1 комментарий
  • Генерация 1млн билетов со случайными уникальными ID

    Stdit
    @Stdit
    Как вариант, можно завести дополнительное поле (sort) у билетов и заполнить его уникальными случайными числами. После этого сделать индекс по user_id и sort. Тест на таблице в миллион записей (InnoDB):

    mysql> SELECT * from ticket WHERE user_id = 0 ORDER BY sort LIMIT 10;
    +--------+------+---------+
    | id     | sort | user_id |
    +--------+------+---------+
    | 923164 |    1 |       0 |
    | 171274 |    2 |       0 |
    | 217458 |    3 |       0 |
    | 182627 |    4 |       0 |
    | 183120 |    5 |       0 |
    | 483756 |    6 |       0 |
    | 210156 |    7 |       0 |
    | 362920 |    8 |       0 |
    | 311591 |    9 |       0 |
    | 545096 |   10 |       0 |
    +--------+------+---------+
    10 rows in set (0.00 sec)
    
    mysql> UPDATE ticket SET user_id = 1 WHERE id IN (923164, 171274, 217458);
    Query OK, 3 rows affected (0.01 sec)
    Rows matched: 3  Changed: 3  Warnings: 0
    
    mysql> SELECT * from ticket WHERE user_id = 0 ORDER BY sort LIMIT 10;
    +--------+------+---------+
    | id     | sort | user_id |
    +--------+------+---------+
    | 182627 |    4 |       0 |
    | 183120 |    5 |       0 |
    | 483756 |    6 |       0 |
    | 210156 |    7 |       0 |
    | 362920 |    8 |       0 |
    | 311591 |    9 |       0 |
    | 545096 |   10 |       0 |
    | 230442 |   11 |       0 |
    | 472816 |   12 |       0 |
    | 138187 |   13 |       0 |
    +--------+------+---------+
    10 rows in set (0.00 sec)
    
    
    Ответ написан
    Комментировать
  • Платёжный агрегатор. Какой лучше?

    ValdikSS
    @ValdikSS
    Я использую интеркассу. Потому, что не нужно ручное подтверждение сайта и работает с частными лицами без всяких бумажек.
    Ответ написан
    1 комментарий
  • MySQL кеширует запросы даже при выключенном кешировании?

    Shedal
    @Shedal
    Это совсем не обязательно кэш.

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

    Во-вторых, MySQL также на время кэширует план выполнения запроса.

    как от этого избавиться?
    Я не думаю, что от этого стоит (или даже можно) избавляться. Вреда никакого, одна сплошная польза :)
    Ответ написан
    Комментировать
  • MySQL: прерывание скрипта Alter Table (что-то плохое может произойти)?

    @AndreyMorozov
    Имхо не крэшнется ничего, при alter table создается временная таблица.
    Ответ написан
    3 комментария
  • Чем заменить медленный запрос с LIKE?

    Anonym
    @Anonym
    Программирую немного )
    Я так понимаю, номера телефонов хранятся строкой. Тогда с минимальными изменениями БД можно попробовать Fulltext индекс и поиск через MATCH/AGAINST.
    Ответ написан
    Комментировать
  • Типизированные Request и Response

    dohlik
    @dohlik
    ИМХО, задача реквеста — принять входящие данные (POST/GET/COOKIE и прочие заголовки), инициировать запуск нужного метода контроллера, и вернуть реквест с результатом. Соответственно, вся логика (валидация, запросы к БД и т.д.) должна лежать в контроллере, но не запросе. Request — служебный класс, и его имеет смысл разбивать на подклассы, если возможны различные варианты обработки входящего запроса, но никак не подстраиваться под бизнес-логику.
    Ответ написан
    1 комментарий