• Какие технологии выбрать для написания чата?

    voidnugget
    @voidnugget
    Программист-прагматик
    Если вы упоротый рубист, стоит реализовать сервер на основе
    faye/faye-websocket-ruby или imanel/websocket-ruby с воркерами на sidekiq. В качестве окружения я лично предпочитаю JRuby. Ещё я видал как люди гоняли рубисткий sock.js. Я даже не представляю почему у него популярность ниже того же socket.io, а поддержка в разы лучше.

    Также обязательно нужно написать fallback на Server-sent events и long polling.
    Хотя можно вообще на заморачиваться с websocket'aми - его может будет достаточно, и для чатов с большим количеством народу производительность у него будет выше чем у Websocket'ов.

    А так, в соседней вселенной, я обычно использую Vert.x и местный sock.js с откатом на sse.
    Ответ написан
    Комментировать
  • Выбор фреймворка для создания REST-сервисов

    voidnugget
    @voidnugget
    Программист-прагматик
    Не знаю о каком-таком "множестве фреймворков" идёт речь.
    Сейчас кроме swagger-codegen'a нормальных кодогенераторов замечено не было, оно дружит со Scalatra и play2. В принципе можно написать любой шаблон для кодогенерации под что душе угодно, и не такое уж это и муторное занятие как принято думать.

    Генерация Swagger спеки, вместе с endpoint'aми по схеме БД пока только в планах у typesafe, также они хотели написать автоматическую REST-мапилку с шаблонными контроллерами, аля tastypie под Scala. Ещё с этой же серии есть django-rest-framework и это всё барахло неоднократно переписывалось под Node.js. Под PHP подобных вундервафей замечено не было - там тоже принято "кодогенерировать" по схемам БД, и там тоже были плюшки для генерации спек Swagger'a.

    Я вот планирую написать что-то похожее под Vert.x.
    Ответ написан
  • Кто нибудь учился в Китае? На программиста? Стоит ли там учиться?

    voidnugget
    @voidnugget
    Программист-прагматик
    1. Знаю одного индвида который опосля перебрасля на пмж.
    2. У него был CEN факультет.
    3. Стоит выбирать не место обучения, а место работы после обучения - он выбрал Foxconn, и потом долго матерился. Сейчас вроде перебрался в Малайзию и разрабывает разнообразные вариации ARM'ов.

    Китай "выбирают" из-за государственных программ, соц-пакетов и поощрений.
    Ответ написан
    Комментировать
  • С чего начать изучать BigData?

    voidnugget
    @voidnugget
    Программист-прагматик
    BigData не очень то и связана со структурами данных - в основном это разнообразные пространственные структуры, скорее больше связана с алгоритмами NLP, классификации и машинного обучения.

    В первую очередь нужно выбрать средство обработки и хранения.
    В случае с Java это HBase Cassandra
    HBase - когда пишется в базу очень много, и большинство индексов "самодельные".
    Cassandra - когда соотношение чтения / записи 4:3, так как в Cassandra уже есть средства колоночной индексации.

    В случае с реальным высоконагрузом это ScyllaDB - обладает теми же особенностями что и HBase, но С++11 и Share-nothing approach и от того в 6-7 раз шустрее.

    Для БД до 200Гб хватит банального MySQL'я c R-tree индексом и Engine Archive.
    Вот PostgreSQL при правильной настройке спокойно строит B-tree индексы для объёмов данных в 500-700Гб, что для MySQL'я непосильная задача Ну и в PostgreSQL часто приходится дописывать сишные функции агрегации и строить по ним разнообразные индексы, иногда пространственные (gin/gist).

    Вот небольшой обзор разных типов индексов.

    От себя ещё добавлю MVP-tree для поиска похожих персептивных хэшей и Fusion-tree как более съедобный вариант дерева Ван Емде Боаса.

    По поводу хипстер-культа вокруг MongoDB - скажу что PostgreSQL с индексами на хэш-таблицах и небольшими множествами документов в 1.5-3 раза шустрее, потому что "Building Index with Vodka". А нормальная репликация и партицирование напрямую зависит от принципов решения задачи Консенсуса в каждом конкретном приложении, и без понимания работы Raft / Paxos не стоит надеятся на чудеса той же MongoDB или PostgreSQL, они являются не более чем инструментами для решения этой задачи.

    MongoDB очень даже ничего для реактивных проектов на основе Meteor, а для всего остального уже GoldenHammer™.

    По индексации, надо обязательно-обязательно прочитать книги Ханны Самет
    Foundations of Multidimensional and Metric Data St... = Applications of Spatial Data Structures: Computer ... + The Design and Analysis of Spatial Data Structures

    В принципе книжки Foundations of Multidimensional and Metric Structures должно хватить с головой, но можно "дочитывать" более полное описание в более древних работах. Одним словом тётка "жжёт", и я не знаю почему это до сих пор никто не перевёл.

    Ну после того как разобрались что и где и как хранить, теперь можно думать по поводу обработки...
    Есть древняя книжка "Алгоритмы интеллектуального Интернета" и "Программируем коллективный разум" Хоть названия переведены на русский довольно странно и звучат довольно наивно - это хорошее введение в простые средства обработки и анализа данных.

    По машинному обучению можно пройти курс Эндрю Ына на курсере.

    Есть Южный DataScience-централ, там есть много чего полезного. Его можно почитывать. Есть ещё поверхностные CheetSheet'ы, видел и получше, но не нашёл.

    Как DeepLearning адепт советую разобраться с Theano, и методами описанными тут. В продакшенах эта штука до безобразия слоупочна и видел товарищей которые более-менее успешно слезли на Neon.

    Если лезть в Java, то на примере Spotify чаще всего используются связки
    Apache Kafka -> Apache HBase -> Apache Storm -> Apache Spark (mllib) -> Apache HBase -> Apache Phoenix -> Hibernate + любой MVC фреймворк и т.п.

    Естественно об относительно высокой производительности и хорошем вертикальном масштабировании речи не идёт, если брать C++11 ScyllaDB -> Neon хорошо отпрофилировать и допилить, можно получить в 3-5 раз выше производительность и соответственно гораздо меньшие задержки, но обычно всем влом. REST API под такое обычно пытаются писать на сях (без плюсов) в виде расширений под Nginx, что является довольно породистым извратом - в большинстве случаев банального golang/netty будет достаточно.

    В Hadoop стэк сейчас принято не лезть, так как он очень "заынтерпрайсян" и без хорошей поддержки и допилки со стороны вендоров в реальных проектах просто неюзабелен, по этому почти все на него, в той или иной степени, забили. Например, тот же Spotify.

    По поводу HA и Zookeeper можно увидеть много срача, особенно в Netflix'e, по этому для менеджмента высокой доступности лучше использовать именно их решения - eureka или для отказоустойчивости Hystrix. Хотя я не могу сказать что это достаточно зрелые проекты - в них тоже хватает изъянов, но они на много шустрее остальных Apache поделок.

    Нельзя делать одновременно отказоустойчивые и высокодоступные приложения - потому что CAP теорема имеет место быть.

    Ещё есть очень тонкий момент с Java в целом - нужно минимизировать время сборки мусора и лезть в offheap, стоит глянуть как реализованы буферы в netty - это arena аллокатор по типу того что используется jemalloc и различная misc.unsafe ересь. Можно ещё пробовать Hazelcast / Terracotta, но принципиально там тоже самое, только платно и "расспределённо".

    Для REST API я чаще всего использую Vert.x и ванильную Java.
    Overhead от Scala довольно таки большой, а время компиляции просто вырвиглазное.
    Для минимизации копи-пасты вполне безопасно использовать Groovy c @ Immutable и @ CompileStatic.
    Но в Vert.x'e он весь "динамичный" :|

    Я ничего не могу сказать по поводу производительности Clojure, он местами через чур invokeDynamic. Естественно что ванильная Java будет шустрее, но я без понятия на сколько.

    Желаю Вам приятного вечера.

    p.s. не везде проставил ссылки просто потому что хочу спать.
    Ответ написан
    4 комментария
  • Для новичка лучше учить ЯП исходя из задач, которые хочется решать или наиболее простой язык?

    voidnugget
    @voidnugget
    Программист-прагматик
    Есть один важный аргумент против питона, ruby и php - относительно низкая производительность, и следовательно невозможность разработки полноценных "реактивных" решений. Node.js будет шустрее, а golang с Java (J2SE) и подавно...

    Нужно выбирать язык исходя из полноты, качества поддержки и зрелости существующих инструментариев.
    Если это вэб - лучше ити в сторону meteor + react <-> express + mongo и не парить одно место.
    Если нужна производительность бэкенда - лучше смотреть в сторону ванильной Java с netty, это Vert.x.
    Касательно зрелости и качества поддержки - история умалчивает, но аналогов особо то в других платформах нету.
    Ещё стоит разобраться со вторым Angular'ом когда он выползет с альфы, правда там сначала был TypeScript, а теперь Dart + JS :x

    Главным аргументом против Java является ужаснейший Overhead разнообразных J2EE поделок с сервлетами, подавляющее большинство существующих решений использует именно это окружение - по сравнению с ванильным Netty, Overhead составляет 1 к 30. Scala тоже имеет довольно большой overhead, но он не является проблемой, вот скорость компиляции просто ужасна - в ~100 раз медленнее Java. Для того что бы эффективно выполнять задачи в Scala (Python / Erlang / Clojure etc) - нужно проводить 80% времени в интерпретаторе, не всем это по душе, да и мешает внедрению нормального CI с TDD/BDD. Имхо Groovy более юзабелен сейчас чем Scala, особенно для скриптов, и оверхед у него минимальный (при правильном приготовлении), и скорость компиляции не доставляет неудобств.

    C# + asp.net решение двузначное, я не знаю как сейчас обстоят дела с OpenSource проектами в оных местах - последние два года ситуация обещала исправится (CLR заOpenSource'или), но чуда так и не произошло.

    Long story - short. Если тремя предложениями, то ...
    Стоит вообще забить на Python, учить JS Meteor Express React MongoDB и опционально Dart со вторым Angular.
    Также важно научится собирать фронтэнды gulp'ом со всякими минификаторами, livereload'ами (browsersync), stylus node-sass jshint jscs csslint jsbeautifier ... и прочим барахлом. Ruby'сткий Sass с compass'ом стоит обходить стороной из-за слоупочности.
    Ответ написан
    6 комментариев
  • JavaEE + front-end(фриланс) - реально?

    voidnugget
    @voidnugget
    Программист-прагматик
    Популярность JavaEE в современных проектах стремится к нулю - большая часть существующих фреймворков отказываются от сервлетов и "ынтерпрайсностей" в пользу ванильной Java с Netty, и тому есть довольно много причин. Ну, хотя бы намного более высокая производительность, по моему личному опыту где-то 1:30. Из исключений припоминаются Grails, Ninja framework. Есть ещё динозавры типа Struts и Wicket - их часто используют "по привычке" вместе со Spring'ом, но практической выгоды от подобного не много. В общем у всех есть свои причины "ынтерпрайстности", но по большей части это связано с "бюрократией" контор-разработчиков.

    Стоит познакомится с Vert.x и ratpack.
    Play2 - тоже хорошо, но наблюдается значительный overhead из-за использования Akka + Scala.
    Стоит разобраться с GraphQL и Relay + React. Ну и поиграться чуток с Meteor + React.
    На определённом этапе нужно реализовывать свой собственный транспорт для EventSource, я как раз собираюсь этим заняться в свободное время.
    Ответ написан
    4 комментария
  • Как следует организовать базу и поиск по 1 000 000 000 000 (триллиону) записей на 100ТБ?

    voidnugget
    @voidnugget
    Программист-прагматик
    Я бы даже лучше уехал в сторону scylladb - более толковая штука чем Cassandra / Hbase.
    Ответ написан
    Комментировать
  • Какие методики тестирования мобильных приложений существуют?

    voidnugget
    @voidnugget
    Программист-прагматик
    Приёмочное тестирование (e2e) обычно выполняют через Selenium, а конкретно Appium. Стараюсь что бы одни и те же тесты можно было использовать для тестирования и в iOS и в Android. Функциональное тестирование под Android немного отличается - там есть возможность прогонять тесты прямо в виртуальной машине через Robolectric, обычно так тестируют сервисы в андроиде. Для тестирования в iOS я обычно использую Cedar или Slephnir
    Ответ написан
    4 комментария
  • Возможно ли починить процессор?

    voidnugget
    @voidnugget
    Программист-прагматик
    Предположительно это конденсатор на 22pf - припаять можно, но желательно перепроверить номинал у соседних. Значит лишь то что процессор снят с горелой материнки, и уже подвергался пайке с использованием не самых качественных расходников.

    Армянское Радио Тут не то что ювелирная работа - обычно микроскопа/очков и хорошего паяльника достаточно. Тут проблема в том что при пайке 0201 страшен тепловой удар, и нужен индукционный паяльник.

    Mirn Тут простые конденсаторы по питанию.
    Ответ написан
    5 комментариев
  • Как организовать перебор и обработку большого кол-ва данных?

    voidnugget
    @voidnugget
    Программист-прагматик
    Нужно отрефакторить схему, привести всё в божеский вид к 5-6 нормальной форме.
    80% всех проектов с которыми приходилось иметь дело "аля магазин на РНР" индексирует varchar и еже с ним. Из-за этого "выборка 2К товаров" - просто непосильная задача. Стоит почитать книжку SQL Antipatterns и High Performance MySQL. Разобраться как работает InnoDB, и как вообще происходит оптимизация.

    Пример "говно-схемы"
    Table products
    id unsigned int autoincrement (PK)
    name varchar(255) NOT NULL
    group varchar(255) NOT NULL
    oneAttr varchar(255)
    otherAttr varchar(255)
    anotherAttr varchar(255)
    description varchar(255)
    dateCreated DATETIME

    Нужно разбить минимум на 4 таблички
    Table products
    id unsigned int autoincrement (PK)
    name varchar(255) NOT NULL
    group_id unsigned int NOT NULL (FK)
    description varchar(255)
    dateCreated DATETIME

    Table product_groups
    id unsigned int autoincrement (PK)
    name varchar(255) NOT NULL

    Table products_attrs
    id unsigned int autoincrement (PK)
    name varchar(255) NOT NULL

    Table product_attrs_values
    product_id unsigned int (PK <- FK)
    attr_id unsigned int (PK <- FK)
    attr_value varchar(255) NOT NULL

    Ну и т.п.

    Это второй курс универа :)
    И очень много обывателей даже до него не дотягивает, что меня довольно таки печалит.
    И, конечно-же, нужно уметь использовать EXPLAIN.
    Ответ написан
  • Как правильно составить алгоритм безопасной авторизации?

    voidnugget
    @voidnugget
    Программист-прагматик
    Ну, во первых, стоит разобраться в чём же разница между аутентификацией и авторизацией - со стороны подобный вопрос выглядит довольно нелепо. Во вторых, если https считать небезопасной средой - можно пробросить ключики по Диффи-Хелману и шифровать трафик AES'ом, но это для полных параноиков, и ещё HMAC-SHA256 можно прикрутить... sha1(sha1(whatever)) с точки зрения криптографии полный "пэ". Обычно бэкенды принято делать stateless и всю инфу хранить в рамках пользовательской сессии, просоленной и пошифрованной. А, непосредственно, сами пароли в BCrypt / SCrypt etc.

    Аутентификация в таком случае может выглядеть следующим образом
    1. Происходит обмен ключами
    2. Человек отправляет свой логин-пароль на сервак по шифрованному каналу
    3. В ответ получает объект пользовательской сессии, который сохраняет в куках
    Сессия представляет собой не что иное как сериализированный шифрованный объект с "солью" которая прописана на всех запущенных экземплярах бэкенда - таким образом куда бы запрос не пришёл, он везде обрабатывается одинаково, и отпадает потребность в session-storage.
    4. Опционально, в рамках пользовательской сессии заводятся CSRF-токены.
    5. Опционально, весь траф нужно эскейпить, включая всякие там JSONP и прочее. Ангуляр вообще с коробки требует весь JSONP префиксить таким чудом ")]}',\n"
    Ответ написан
    Комментировать
  • Конвертер из Ruby в Go возможно ли?

    voidnugget
    @voidnugget
    Программист-прагматик
    Нет.
    Ответ написан
    Комментировать
  • Как получить значения JSON (JS)?

    voidnugget
    @voidnugget
    Программист-прагматик
    var x = {
      key1: 'dumbvalue',
      key2: '12345678',
      key3: '11234567'
    };
    
    var regex = /^1234/;
    
    var results = Object.keys(x).filter(function(key) {
      if (typeof x[key] === 'string') {
        return x[key].match(regex) !== null;
      }
    
      return false;
    }).map(function(key) {
      return x[key];
    });
    
    console.log(results);
    Ответ написан
  • PHP ==> ??? ===> PostgreSQL. Что выбрать в качестве прослойки?

    voidnugget
    @voidnugget
    Программист-прагматик
    Doctrine DBAL / ORM
    Ответ написан
    Комментировать
  • Какие вы знаете коммерческие приложения, написанные на Java?

    voidnugget
    @voidnugget
    Программист-прагматик
    Spotify, Amazon, Linkedin, Uber, Netflix
    Ответ написан
    Комментировать
  • Альтернатива free mandrill?

    voidnugget
    @voidnugget
    Программист-прагматик
    Почтовые сервера чуть более чем полностью состоят из боли, крови, дерьма, слёз, соплей и страданий...

    Как-то сам написал почту на Apache James + Vaadin дашборд, и думаю, в обозримом будущем, опубликовать её на github'e.

    Если нужны адовые объёмы рассылок и всякое такое - пишите в скайп, обсудим.
    Ответ написан
  • Как использовать Angular JS в cordova?

    voidnugget
    @voidnugget
    Программист-прагматик
    Вот так.
    Ну и можно использовать вот это.
    Ответ написан
    Комментировать
  • PHPStorm, куда слезть с него? nodejs / frontend разработчики, поможете?

    voidnugget
    @voidnugget
    Программист-прагматик
    Atom / Sublime обычно покрывает все потребности.
    Хотя для вёрстки часто использую Brackets.
    Сейчас занимаюсь портированием работы с PSD'шками с Brackets в Atom - не нравится как работает Avocode в Atom'e.
    Ответ написан
    Комментировать
  • Как оптимизировать передаваемый трафик через socket.io?

    voidnugget
    @voidnugget
    Программист-прагматик
    Если используется deflate - смысла пережимать нету.
    Можно поиграться с JSZip, но это создаст дополнительную нагрузку.
    Если хотите создать эффективный протокол - лучше использовать protobuf.
    Ответ написан
    Комментировать
  • Gulp.run() является устаревшим. Как исправить ошибку?

    voidnugget
    @voidnugget
    Программист-прагматик
    gulp.task('default', ['server'], function() {
      gulp.watch('src/jade/**', ['jade']);
      gulp.watch('src/css/**', ['postcss']);
      gulp.watch('src/images/**/*.@(png|jpg)', ['images']);
    });

    Для livereload'а лучше использовать browsersync.
    Важно не забывать возвращать потоки и вызывать callback'и что бы нормально происходила синхронизация.

    Нужно делать так
    gulp.task('js',function(){
        return gulp.src('./assets/js/*.js')
            .pipe(doSomeStuff());
    });

    и вот так
    var merge = require('merge-stream');
    
    gulp.task('js',function(){
        merged = merge();
        [
          'mdpi', 'hdpi', 'xhdpi'
        ].forEach(function(density) {
        merged.add(gulp.src('app/images/**/*.@(png|gif|jpeg)')
            .pipe(doSomeMagicStuff()))
            .pipe(gulp.dest('dist/images/' + density)));
        });
    
        return merged;
    });

    если нужно обрабатывать несколько файлов одновременно.

    Ну и можно использовать callback'и
    var plato = require('plato');
    
    gulp.task('plato', function(done) {
        plato.inspect('app/**/*.js', 'reports', {}, function(reports) {
            done();
        });
    });
    Ответ написан
    Комментировать