• Как правильно настроить Jasmine Unit testing?

    voidnugget
    @voidnugget
    Программист-прагматик
    Сначала происходит загрузка boot.js или node_boot.js - там в window или global пишутся все методы jasmine интерфейса. Типа вот так
    'use strict';
    
    var jasmineRequire = require('jasmine-core/lib/jasmine-core/jasmine');
    
    var jasmine = jasmineRequire.core(jasmineRequire);
    window.jasmine = jasmine;
    
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000;
    
    var env = jasmine.getEnv();
    var jasmineInterface = jasmineRequire.interface(jasmine, env);
    
    function extend(destination, source) {
      for (var property in source) {
          destination[property] = source[property];
      }
    
      return destination;
    }
    
    extend(window, jasmineInterface);

    Потом идёт добавление репортера, ну или можно написать свой, под конкретные задачи...

    Инициализация под node.js отличается лишь ConsoleReporter'ом, в браузерной используется HtmlReporter.

    После инициализации в window / global уже есть все it describe expect барахло, и можно писать спеки,
    для их запуска просто делается
    jasmine.getEnv().execute();

    Там для ноды отдельно есть "удобная" обёртка для ленивых...
    Если глянуть исходники, то в принципе должно быть понятно по основным методам
    showColors - отображать ли разноцветные сообщения, форточки не умеют
    addSpecFile - добавить файлик спеки
    addReporter - добавить репортер
    configureDefaultReporter, он же ConsoleReporter
    addMatchers не помню
    loadSpecs - просто require спеков
    loadHelpers - просто require хэлперов
    loadConfigFile - загрузка конфига
    loadConfig - загрузка конфига с объекта
    addSpecFiles - добавить кучу файлов спек
    onComplete - вызвать callback по завершению
    stopSpecOnExpectationFailure - прервать выполнение тестов если возникает исключение

    В принципе
    var Jasmine = require('jasmine');
    var jasmine = new Jasmine();
    
    jasmine.loadConfig({
        spec_dir: 'tests',
        spec_files: [
            'requests/**/*.js'
        ],
    });
    
    // или jasmine.loadConfigFile('spec/support/jasmine.json');
    
    jasmine.configureDefaultReporter({
        showColors: false // если это форточки
    });
    
    jasmine.execute();

    Для запуска тестов в node.js будет достаточно.
    Ответ написан
    2 комментария
  • Как подружить jade с angular.js?

    voidnugget
    @voidnugget
    Программист-прагматик
    На стороне сервера в процессе сборки и упаковки.
    Обычно использовал gulp-angular-templatecache и gulp-jade соответственно.
    Ответ написан
  • Какую СУБД лучше выбрать?

    voidnugget
    @voidnugget
    Программист-прагматик
    Эмм... для начала нужно выучить мат часть и разобраться что такое B-tree и R-tree и как они фигурируют в современных СУБД, разобраться что такое "6ая нормальная форма" (второй курс универа).

    Если это мускуль у которого "бесконечная длинна" таблички - от 200Гб и до 1Тб, то достаточно просто использовать ENGINE ARCHIVE c R-tree индексом. В противном случае (если меньше 200Гб) нужно (учить мат часть и вправлять мозги) рефакторить базу. Лучше слезть с MySQL на PostgreSQL, а вот c MongoDB - куча проблем. Стандартные СУБД на основе B-tree для баз от 200Гб+ не подходят. MySQL исключение из-за модульности системы хранения, имеется ввиду ENGINE ARCHIVE, но так как там нет T-tree - нужен нормальный кэш. PostgreSQL даже похуже будет - нужно ковырять различные расширения типа cstore_fdw и т.п.

    uint64 ID'шник в виде хэша - очень спорное решение, даже если и предположить что в какой-то вселенной нет коллизий, то точно не в этой, и дополнительно нужно прогонять фильтр Блума. Хотя, лучше всего, просто использовать композитные ключи и не заморачиваться.

    Можно ещё попробовать HBase в Apache Phoenix обернуть, там уже есть всё готовое - и фильтр Блума и индексация, можно даже X-tree оформить. HBase, кстати, хорошо масштабируется на запись, а Cassandra, наоборот, - на чтение.

    Шардинг (партицирование) и репликацию нужно оформлять когда схема хорошо нормализирована, и когда более-менее ясно какие таблички нужно масштабировать на запись, а какие на чтение - где-то нужен CA, где-то CP, а где-то AP... (CAP теорема)

    Очень весело в PostgeSQL писать сишные функции для агрегации в материализованные представления, особенно весело с GPGPU.
    Ответ написан
  • Wifi с телефона работает плохо, с компа всё отлично, в чем может быть проблема?

    voidnugget
    @voidnugget
    Программист-прагматик
    Ну как бэ dir320 на bcm4330 (и подобных 43**) никогда не отличался умом и сообразительностью. У яблотехники, кроме макбуков конечно, банально не хватает чувствительности для него. Получается что когда идёт общение с маком - мощность тракта падает и линк с телефоном / планшетом отваливается. Это довольно распространённая проблема. Можно попробовать поставить статическое значение для исходящей мощности, или просто поднять его. На худой конец, эта какашка мамонта шьётся в OpenWRT, а там уже наверняка можно будет поднять мощность, ну и если чуть антенный тракт паяльником поковырять - тоже можно добавить чуть dbm'а...
    Ответ написан
  • Как подключить отдельные файлы используя wiredep?

    voidnugget
    @voidnugget
    Программист-прагматик
    Если читатать доки - становится понятно что есть опция exclude,
    которая принимает строки и регулярки.
    var wiredep = require('wiredep').stream;
    
    gulp.task('wiredepWIthoutJquery', function() {
      return gulp.src('index.html')
        .pipe(wiredep({
          exclude: [ /jquery/],
        }))
        .pipe(gulp.dest('./dest'));
    });
    Ответ написан
    Комментировать
  • Как превратить js объект в поток Gulp для дальнейшей записи в json файл?

    voidnugget
    @voidnugget
    Программист-прагматик
    Потоки gulp'a это не потоки node.js - в них передаётся путь файла и опционально его содержимое.
    Проще всего не заморачиваться и делать через fs
    var gulp = require('gulp'),
      g = require('gulp-load-plugins')(),
      fs = require('fs');
    
    gulp.task('writeStuff', function(done) {
      var stuff = {};
    
      fs.writeFile('file.json', stuff, function(err) {
        if (err) throw err;
        g.util.log('It\'s saved!');
        done();
      });
    });


    Вот пример как создать файл и запихнуть его в поток:
    var gutil = require('gulp-util'),
      through = require('through2');
    
    function makeFileStream(name, source, options) {
      var file = new gutil.File({
        cwd: optaions.cwd | "",
        base: options.base | "",
        path: name,
        contents: ((source instanceof Buffer) ? source : new Buffer(source))
      });
    
      var stream = through.obj(function(file, enc, done) {
        this.push(file);
        return done();
      });
    
      stream.write(file);
    
      if (options && options.src) {
        stream.end();
      }
    
      return stream;
    };
    Ответ написан
    Комментировать
  • Есть ли перспективы развития?

    voidnugget
    @voidnugget
    Программист-прагматик
    Вопрос оркестрации и DevOPS'ов сейчас довольно актуален, и там без "развернуть кучу виртулок и контейнеров в OpenStack с всякими Puppet / Chef / Ansible / Saltstack" просто никуда, особенно весело со всякими Zookeeper'aми Mesos'aми и проч SOA мутью.

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

    Потом уже стоит самому пробовать писать свои системы оркестрации (лучше всего для этого подходит golang), да и репозиторий с рецептами со временем очень сильно разрастётся. В общем нужно изучить все существующие системы деплоя и оркестрации, а потом уже думать как и что и куда.
    Ответ написан
    Комментировать
  • ExtJS 6 перелопатили или как создать простейшее приложение?

    voidnugget
    @voidnugget
    Программист-прагматик
    Нет. Нормальной сборки и загрузки в ExtJS не припоминаю (со второй версии), обычно лепил Gulp/Grunt сборщики.
    Я слез на Vaadin и доволен, хотя и с extgwt дело было, и с ZK, но остановился именно на нём.
    Ответ написан
    Комментировать
  • Что лучше для разработки инди игры Unity или Unreal engine?

    voidnugget
    @voidnugget
    Программист-прагматик
    Входит общий чистый доход, с учётом вычитания налогов и сборов.
    Можно пробовать CoronaSDK, правда там и по графике и по функционалу всё на много беднее.
    Я бы ушёл в Unreal только в случае нормальных навыков С++'a и желания полезть в их Trello / Github issues в случае возникновения проблем, а багов там до сих пор хватает. По функционалу "c коробки" у UE сейчас большое преимущество.

    Unity - более стабильный, менее производительный, на много проще, и обходится немного дешевле в долгосрочной перспективе (более 2 лет жизни проекта).
    Ответ написан
    6 комментариев
  • Как безопасно сохранять и рендерить форматированный текст в ReactJS SPA?

    voidnugget
    @voidnugget
    Программист-прагматик
    Можно рендерить в браузере, либо фильтровать.
    Никто не мешает делать вот так
    <b style="width:expression(alert('bad style!'))"> \o/ </b>

    Так что, чаще всего, кастомные стили тоже напрочь выпиливают.
    Хотя, после CSS кейлоггеров в скроллбарах и в SVG'шках, я уже мало чему удивляюсь.
    Ответ написан
    Комментировать
  • Как собрать проект в Gradle при отсутствии интернета?

    voidnugget
    @voidnugget
    Программист-прагматик
    Нужно проверить определение существующих Maven/Ivy репозиториев в build.gradle нужного модуля.
    И вот что там можно сделать:

    repositories {
        ivy {
            url "http://mycompany.com/repo" // нужно проверить доступность
            // или
            url "../local-ivy-repo" // для локальной папки с Ivy репозиторием
            
            // В Ivy можно указать структуру каталогов для поиска и путь к ivy.xml явно
            // Таким образом можно описать путь для любых зависимостей по http/https'у 
            layout 'pattern' , { 
                artifact '[module]/[revision]/[artifact](.[ext])'
                ivy '[module]/[revision]/ivy.xml'
            }
        }
    
        // Тоже самое можно и для Maven'a
        maven {
            url "http://repo.mycompany.com/maven2"
            // или
            url "../local-maven-repo"
    
            // В MavenArtifactRepository нет возможности прописать Layout, по понятным причинам
    
            // А ещё и в Ivy и в Maven'e можно указать пароль к AWS'у или http auth, правда это нестабильная фича
            credentials { // или credentials(AwsCredentials) {
                accessKey "myAccessKey"
                secretKey "mySecret"
            }
        }
    }


    Maven и Ivy используют разные структуры папок, так что, при внесении изменений вручную, это нужно иметь ввиду. Хотя для Ivy можно явно указать layout 'pattern' для самопальной структуры, а вот в Maven'e afaik так нельзя.

    Если совсем-совсем не заморачиваться, можно положить все jar'ки в папочку libs и добавить их в зависимости, вот так

    dependencies {
        runtime files('libs/a.jar', 'libs/b.jar')
        // ну, или так
        runtime fileTree(dir: 'libs', include: '*.jar')
    }


    Пишите если нужно будет что-то уточнить.
    Ответ написан
    Комментировать
  • Успешный IT стартапы?

    voidnugget
    @voidnugget
    Программист-прагматик
    Из тех где сам был:
    Uber
    SoundCloud
    Ответ написан
    Комментировать
  • Это говнокод или норма JS?

    voidnugget
    @voidnugget
    Программист-прагматик
    1. Это код человека не удосужившегося поискать любую существующую библиотеку интернационализации, либо ознакомившегося с Intl'ом для которого есть вполне вменяемые полифилы.
    2. Это характеризует его как человека который хочет делать "хорошо", а получается "как всегда" из-за недостатка знаний и опыта.
    Ответ написан
    1 комментарий
  • Какие вы знаете актуальные структуры данных которые можно использовать для индексации и хранения?

    voidnugget
    @voidnugget Автор вопроса
    Программист-прагматик
    Из интересных и перспективных структур пока откопал Fusion-tree и AF-heap.
    Было бы неплохо оформить cache oblivious версии.
    Ответ написан
  • Как хранить неполное бинарное дерево выражений в массиве?

    voidnugget
    @voidnugget
    Программист-прагматик
    Для хранения транзакций используются вспомогательные структуры, типа lsm-tree.
    Советую ещё глянуть как обстоят дела с cache oblivious b-tree.
    Ответ написан
  • Язык для написания небольших программ?

    voidnugget
    @voidnugget
    Программист-прагматик
    C питона можно собрать exe'шку.
    Ответ написан
  • Структура, архитектура JVM(внутреннее устройство), от .java до .jar?

    voidnugget
    @voidnugget
    Программист-прагматик
    Нужно читать доки по OpenJDK и копать исходники, благо там всё отлично документировано.
    Ответ написан
    Комментировать
  • Какую IDE выбрать для Go?

    voidnugget
    @voidnugget
    Программист-прагматик
    У delve интеграция с IDE' пока только в планах.
    С GDB бывает немного сложновато, у Atom'a нет его поддержки, есть SublimeGDB - ним можно пользоваться, ну и конечно же у emacs / vim тоже куча плюшек.
    Ответ написан
  • Full HD матрица в ноутбук, есть возможность установить?

    voidnugget
    @voidnugget
    Программист-прагматик
    Можно, но имхо лучше не заморачиваться, а купить новый нот, еще лучше макбук, осенью, когда выпустят pro'шки со skywell'aмы, имхо broadwell не удался (

    На материнках обычно расспаян LVDS, правда у разных производителей разная расспиновка и хрен его знает ... был удачный опыт с внедрением материнки dell 7720 в hp envy 27, но повезло что раскопал расстановку, а так - нужно логическим тестером да осциллографом щупать.
    Ответ написан
    Комментировать