LINUX.ORG.RU

Рефакторинг, скорость, js

 ,


0

1

Рыл библиотеку https://github.com/FredrikNoren/ungit/blob/master/source/git-promise.js

Интересует участок кода с 113 строки по 157, собственно, ниже:

const getGitError = (args, stderr, stdout) => {
  const err = {};
  err.isGitError = true;
  err.errorCode = 'unknown';
  err.command = args.commands.join(' ');
  err.workingDirectory = args.repoPath;
  err.error = stderr.toString();
  err.message = err.error.split('\n')[0];
  err.stderr = stderr;
  err.stdout = stdout;
  err.stdoutLower = (stdout || "").toLowerCase();
  err.stderrLower = (stderr || "").toLowerCase();
  if (err.stderrLower.indexOf('not a git repository') >= 0) {
    err.errorCode = 'not-a-repository';
  } else if (err.stderrLower.indexOf('connection timed out') != -1) {
    err.errorCode = 'remote-timeout';
  } else if (err.stderrLower.indexOf('permission denied (publickey)') != -1) {
    err.errorCode = 'permision-denied-publickey';
  } else if (err.stderrLower.indexOf('ssh: connect to host') != -1 && err.stderrLower.indexOf('bad file number') != -1) {
    err.errorCode = 'ssh-bad-file-number';
  } else if (err.stderrLower.indexOf('no remote configured to list refs from.') != -1) {
    err.errorCode = 'no-remote-configured';
  } else if ((err.stderrLower.indexOf('unable to access') != -1 && err.stderrLower.indexOf('could not resolve host:') != -1) ||
    (err.stderrLower.indexOf('could not resolve hostname') != -1)) {
    err.errorCode = 'offline';
  } else if (err.stderrLower.indexOf('proxy authentication required') != -1) {
    err.errorCode = 'proxy-authentication-required';
  } else if (err.stderrLower.indexOf('please tell me who you are') != -1) {
    err.errorCode = 'no-git-name-email-configured';
  } else if (err.stderrLower.indexOf('fatal error: disconnected: no supported authentication methods available (server sent: publickey)') == 0) {
    err.errorCode = 'no-supported-authentication-provided';
  } else if (err.stderrLower.indexOf('fatal: no remote repository specified.') == 0) {
    err.errorCode = 'no-remote-specified';
  } else if (err.stderrLower.indexOf('non-fast-forward') != -1) {
    err.errorCode = 'non-fast-forward';
  } else if (err.stderrLower.indexOf('failed to merge in the changes.') == 0 || err.stdoutLower.indexOf('conflict (content): merge conflict in') != -1 || err.stderrLower.indexOf('after resolving the conflicts') != -1) {
    err.errorCode = 'merge-failed';
  } else if (err.stderrLower.indexOf('this operation must be run in a work tree') != -1) {
    err.errorCode = 'must-be-in-working-tree';
  } else if (err.stderrLower.indexOf('your local changes to the following files would be overwritten by checkout') != -1) {
    err.errorCode = 'local-changes-would-be-overwritten';
  }

  return err;
}

если вычислить GitError до дерева проверок и переделать в switch - будет быстрее? Чтобы так сделать, нужны полные коды ошибок, где взять? Не потеряется гибкость при изменении вывода ошибок (вдруг кто-то добавит пару пробелов или ещё пару символов)? И нужно ли вообще заморачиваться?

Deleted

В целом, самое первое правило оптимизации в том что заморачиваться нужно там где медленно работает.

Т.е. берёшь реальный воркфлоу для тулзы и смотришь где тормозит б ольше всего. Оптимизируешь это место.

Даже если ошибка будет генерироваться вместо 0.05 секунды 0.01 секунды и ты улучшишь производительность в пять раз, что обычно очень хороший результат, то конкретно тут тебе никто даже спасибо не скажет. Вообще. Может быть и не примут даже коммит (хотя если код будет лучше читаться, может и примут как «рефакторинг», варианты тут возможны).

А если в рабочее время так будешь делать, то с работы попрут, если адекватные. И будут правы.

AndreyKl ★★★★★ ()
Последнее исправление: AndreyKl (всего исправлений: 1)

PS. Второе правило, кстати, покрытие затрагиваемой функциональности тестами (и тестами производительности, что очевидно, и тестами корректности, что многие новички часто упускают из виду).

Т.е. пишешь тесты, проверяешь на тестах что в всё работает (в т.ч. и тесты), замеряешь производительность, вносишь изменения, замеряешь производительность, проверяешь корректность.

Вуа-ля, ты оптимизатор)

AndreyKl ★★★★★ ()
Последнее исправление: AndreyKl (всего исправлений: 1)

да, в целом, если ты «потренироваться», то лучше поглядеть issues, выбрать попроще и попробовать выполнить. Проектов полно, и задач в каждом тоже вагон. Среди них можно выбрать по вкусу и по силам.

Некоторые проекты даже специально помечают баги как нибудь вроде C-Low Hanging Fruit и такие баги специально не чинят асы для того чтобы новичкам было с чего начать.

PS. Да, ну идрис я для примера метки привёл, там даже опытному программисту не очень то легко разобраться, потому что надо понимать что такое идрис и что такое хаскель и собственно что такое компилятор. Но в целом, это достижимо и технология мягко говоря свехринтересная и перспективная.

PPS. Но основная мысль всё таки: если ты хочешь попробовать силы - надо делать что то действительно полезное. Для этого нужно просто зайти в багтрекер и выбрать себе задачу. Так же разумным будет не забыть прочитать контрибьюшн гуайдлайнс проекта, спросить (в списке рассылки например), будут ли рады патчу на этот баг (даже если и будут рады в целом, но может быть уже кто то делает конкретно эту задачу). Ну, и приступать к работе.

AndreyKl ★★★★★ ()
Последнее исправление: AndreyKl (всего исправлений: 1)

Рефакторинг, скорость, js

Нам-то не гони.

anonymous ()
Ответ на: комментарий от AndreyKl

Благодарю за развёрнутый ответ.

Deleted ()

И нужно ли вообще заморачиваться?

Вангую что нет. У тебя же не молотится миллион ошибок в секунду, это не critical chain. Если ты собираешься именно оптимизировать скорость, а не просто фигней страдать, то надо делать бенчмарки и точно представлять какой профит и когда ты хочешь достичь. Ну кроме взращивания ЧСВ.

Vit ★★★★★ ()
Ответ на: комментарий от Vit

Благодарю. Сразу вдогонку вопрос: стоит ли заморачиваться с хранением файлов в mongoDB? Или сразу в папочку? Файлы как маленькие, так и большие (gridFS), а в mongo хранить ссылки?

И да, как взрастить ЧСВ? Давно писал (под Новый Год вроде), что начал изучать JS. На голом написал много всяких мелких вещей, Теперь смотрю на мир фреймворков и теряюсь... (пытаюсь «пилить», эээ, на Vue, Vuex, Vuetify, Express, Passport и куча всего мелкого - ЭТО ЖЕ УЖАС! Вроде и облегчает написание, но въехать, попробовать, полезть глубже...)

P.S. Мне вот этот парень «помогает»: https://www.youtube.com/user/TechGuyWeb/playlists И, конечно, его курсы на Udemy (вива rutracker).

Deleted ()
Последнее исправление: kaban_lyalya (всего исправлений: 3)
Ответ на: комментарий от Deleted

стоит ли заморачиваться с хранением файлов в mongoDB?

У меня на нодеке - хранится, планируется там держать терабайты. Из профитов - проще управлять, реплицировать и т.п. Maintenance, короче. Из минусов - некоторая просадка по скорости, которая обычно никого не трам-пам-пам.

На фонтелле обнаружил, что монга нафик не нужна, нагрузка совсем низкая, и весь файловый кеш засунул в leveldb. В итоге не надо париться с локальными установками.

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

И да, как взрастить ЧСВ?

Это не технический вопрос. У некоторых оно взращивается от простого ковыряния пальцем в носу. Я могу только оценивать реальную пользу для других.

Vit ★★★★★ ()
Ответ на: комментарий от Vit

Эээ. я «дорисовал» выше немного ;) Спасибо по mongo, приоткройте тему про ЧСВ (в данном случае - опыт), а то чувствую себя совсем неучем ;)

Deleted ()
Ответ на: комментарий от Deleted

всю жизнь учусь, всю жизнь чувствую себя неучем.

вопрос кстати, а ты чего в программирование пошёл?

anonymous ()
Ответ на: комментарий от Deleted

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

Vit ★★★★★ ()
Ответ на: комментарий от anonymous

Я? Не поверишь, буду студентом. А бэк... Ну Си немного, Python немного, монады, композиции, функторы - хаскелл ;)

Deleted ()
Ответ на: комментарий от Vit

Да не надо учить ;) Спасибо, что тратите время на ответы тут, на ЛОРе. Просто я не ожидал, что нора в области применения JS столь глубока. С виду всё просто, но... чтобы сделать «конфетку», а я перфекционист - читать, писать, переписывать. Ух!

Deleted ()
Ответ на: комментарий от Deleted

монады, композиции, функторы - хаскелл ;)

круто) а опыт какой? и как это вяжется с «буду студентом»? Школьник, увлекался хаскелем? Тогда вообще класс, кмк.

anonymous ()
Ответ на: комментарий от Deleted

А бэк... Ну Си немного, Python немного, монады, композиции, функторы - хаскелл ;)

Помогите дописать фирмварь esp8266 конфигурилки девайсов

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

Vit ★★★★★ ()
Ответ на: комментарий от Deleted

любопытно.. судьбы разные..

успехов, но js больно нудный. если ты на ближайшую перспективу и денег подзаработать, то оно того стоит.

Ещё раз успехов!

anonymous ()
Ответ на: комментарий от Deleted

Я обычно советую поискать на гитхабе то что нравится и методично решать тикеты в трекере. Избавляет от необходимости высасывать из пальца псевдополезные задачи. Ну а общение с другими очень помогает по-новому взглянуть на понаделанное.

Если хочется побольше экстрима - советую обратить внимание не eslint. Там настолько высокие требования, что у меня у самого терпения не хватило :). Типа, там надо сильно погружаться в тему, а у меня своих поделок хватает, не могу себе такого позволить.

Vit ★★★★★ ()
Ответ на: комментарий от Deleted

В целом, повторюсь, если на ближайшую перспективу, те.е. цель - пол года покорпеть а потом искать работу за более-меньские деньги, то оно того стоит.

Если же есть возможность, и хочешь действительно интересную, перспективную и оплачиваемую работу, то лучше посвятить время хаскелю/идрису. Просто начни заново и правильно

1. ohaskell.guide - онлайн ресурс 2. graham hutton / richard bird - любая из книг, лучше обе. 3. москвин, курс 1 на stepic.org (там два курса, тебе первый)

Это самая база будет. Через пол года неспешных, но постоянных занятий ни монады, ни лифты тебя пугать не будут. Дальше спросишь, я напишу что дальше.

Всё пмсм, конечно.

anonymous ()
Ответ на: комментарий от Vit

Мне сама концепция eslint не нравится. Выше рекомендовали, Вы тоже. Мне этот путь интересен. Буду пробовать. Спасибо за советы.

P.S. И да, проект https://github.com/speedcontrols/wifi-configurator интересен, но не для меня (с помощью железки перепрошивать другую железку - хакерство ;) Для этого мы просто описываем всё в json и через мобилу заливаем... Но зачем? Неужели так сложно было «до» создать свою прошивку? Давно просто дела не имел именно с редактированием прошивок).

Deleted ()
Ответ на: комментарий от anonymous

Книжка дома (С надМоЗгОм), зачитана, курс пройден, как ни странно (манера у препода говорить - удивляла), Весёлая книга Real world haskell - читалась, ну и, конечно, инет издание real Good и кто там, Антон да Денис ;) Просто знаний (опыта) не хватило поймать правильное написание при IO. Код превращался в франкенштейна. И зачем козе баян?

Но идея... Идеи! Они да, теперь со мной. И, как ни странно, в других языках начали всплывать, что радует.

Deleted ()
Последнее исправление: kaban_lyalya (всего исправлений: 2)
Ответ на: комментарий от Deleted

Те кто умеют делать прошивки, часто ни фига не понимают в юзабилити. И пихать менюшки ради одного раза - ненужный гимор. А фиксить их - гимор в кубе. Уже не говоря о приворачивании ради одного раза индикатора и клавиатуры. А тут просто платка за 4 бакса, которую в разъем воткнул и она по 2 проводам всё сделала. Всё продумано. Смотри на систему целиком, а не как с оптимизацией ошибок в первом посте. В рамках всего проекта данный подход выгоден.

Vit ★★★★★ ()
Последнее исправление: Vit (всего исправлений: 1)
Ответ на: комментарий от Deleted

Мне сама концепция eslint не нравится.

Без линта писать на яваскрипте - это извращенный способ стрелять в ногу. Нравится eslint или нет, других нормальных линтеров на яваскрипте нема. Есть смысл себя перебороть, чтобы сэкономить впоследствии вагон времени на отладке.

Vit ★★★★★ ()
Ответ на: комментарий от Vit

Хм, да никто не отрицает выгодности подхода ;) Просто когда проект будет вылизан, Вы перепрошьёте землю, небо, всё вокруг! ;) Не троллинга ради. Вообще, если всё сделать «по уму», то это унифицирует инструментарий прошивок. Тулза годная, отвяжете от железки - победа по всем фронтам.

Deleted ()
Ответ на: комментарий от Vit

Есть смысл себя перебороть, чтобы сэкономить впоследствии вагон времени на отладке.

Будь мужиком, возьми идрис!

anonymous ()
Ответ на: комментарий от anonymous

Глянул я. 1.3.0, Сайт 17 год пишет (значит никто не следит). Синтаксис с хаскелом не сравнить, похож - да, но хаскел ближе, ИМХО.

Deleted ()
Ответ на: комментарий от Deleted

Она УЖЕ отвязана от железки. Железка хранит только JSON формы, и выдает его по запросу в конфигурилку. Дальше конфигурилка рисует «на сайте» красивую формочку, и загоняет обратно результаты в виде простых команд («в ячейку А записать Б»).

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

Vit ★★★★★ ()
Ответ на: комментарий от Deleted

С виду там просто форматировщик текста. А eslint чекает опечатки и кривые паттерны. Ну и там достаточно примочек по форматированию, чтобы контролировать coding style и делать дополнительные тулзы не особо нужными. IMHO, нет смысла усложнять.

Vit ★★★★★ ()
Ответ на: комментарий от Deleted

Автоформатирование и линт - разные вещи. Например, линт может заставить тебя назвать переменную в camelCase вместо snake_case, или запретить использовать function там, где можно использовать стрелку, или ограничить максимальную вложенность кода.

deadNightTiger ★★★★★ ()
Ответ на: комментарий от Vit

Стоп.

Firmware for Wemos D1 mini (ESP8266) to configure speed controls (or any other device, supporting simple protocol).

Ну тогда ускоряйтесь и подстраивайтесь под рынок. Надо (если, конечно, не сделано) найти тех, кто этим пользуется более масштабно, и на каких-то правах интегрировать своё решение, взять в спонсоры ;)

Deleted ()
Ответ на: комментарий от deadNightTiger

Тыцал. Но предпочитаю следить за сказанным выше сам.

Deleted ()
Ответ на: комментарий от Deleted

Сайт 17 год пишет (значит никто не следит).

Да не, просто на вордпрессе блог, чего за ним следить? Если что случилось - восстановили из бекапа и дальше поехали.

Там штука в зависимых типах и в возможности доказать корректность программы (я потому Виту и написал что надо взять идрис если хочет сэкономить на отладке:) ). Из наиболее известных таких систем наверное Coq. Так же agda, Isabelle. Но идрис первый кто позиционируется как язык общего назначения (а не теорем прувер).

Авторы старались быть синтаксисом ближе к хаскелю, чтобы хаскелистам было знакомо. В целом получилось, кмк.

Вот тут есть лекции на русском https://www.youtube.com/watch?v=QoglUkN8d08&index=1&list=PLvPsfYrGz3w...

Книга от маннинга (ищи idris), ну и оф документация на сайте. Компилируется в js на ура. Но боюсь даже у знакомого с хаскелем займёт несколько месяцев чтобы начать.

anonymous ()
Ответ на: комментарий от Deleted

Это все лирика. Я решаю конкретные технические вопросы. То что девайс универсальный - следствие грамотного проектирования, а не цель.

Vit ★★★★★ ()
Ответ на: комментарий от anonymous

Сдуру глянул лекцию. Взять и уе^@ть! И он преподаёт! Сука, тряпками гнать таких теоретиков! Не могло оно guards вспомнить, падла. Убил всё желание смотреть. Как же, пацаны сразу крест воткнули в изучение функциональщины.

Нет слов.

Deleted ()

Когда коту нечего делать, он лижет яйца.

Virtuos86 ★★★★★ ()
if (err.stderrLower.indexOf('not a git repository') >= 0) {

Ну что за дерьмо? Нельзя было написать что-нибудь типа

err.check = (str) => {return this.stderrLower.indexOf(str) != -1;}
И заменить всю эту херату на какую-нибудь структуру типа
{
"not-a-repository" : () => {return err.check('not a git repository');},
//...
"merge-failed" : () => {return err.check('alala') || err.check('lalala') || err.check('etc');}
}
А потом просто её перебрать, вызвать функцию и подставить значение ключа, если сработает.
Еще и != -1 записали всеми возможными вариантами.

crutch_master ★★★★★ ()

если вычислить GitError до дерева проверок и переделать в switch - будет быстрее?

Во-превых, js - это не про быстрее. Во-вторых, что тебе оно даст? У тебя проверка gitError в цикле, где обрабатывается 1к запросов в секунду?

crutch_master ★★★★★ ()
Ответ на: комментарий от Deleted

Как по мне так ты через чур цепляешься к мелочам, суть там не в гуардс, вообще то Брагилевский член хаскель комитета 2020 или как там оно, так что я сомневаюсь чтобы он прям вот не мог гуардс вспомнить. Но даже если и забыл - не велика потеря. Лекции вполне сносные, я их смотрел. Других ресурсов на русском я не знаю. На английском есть побольше. Но с таким отношением.. даже не знаю как воспринимать.

Яваскрипт не та технология на которой можно уехать далеко. Как заметил выше Vit (а он на яваскрипте собаку съел, правда на оптимизации в основном и не заморачивался с затратами, я так понимаю из контекста) - без линтера там делать откровенно нечего. Но сказать честно линтер наверное и 1% не отлавливает от того что могут зависимые типы.

Когда то, когда я был на втором курсе универа, преподавательница которой было лет под 65 сказала, что за языками вроде Хаскеля вероятно будующее. Но я решил что это бурчание старушки, к своему стыду. И продолжил своё увлечение с++. Честно говоря сильно жалею. Брагилевский, на сколько я могу судить, увлёкся хаскелем где то в те же годы, может на пару лет позже. И сейчас он довольно заметный человек в этом направлении. И я ему завидую по хорошему.

Идрис действительно очень преспективная технология, очень интересная. И что вдвойне привлекает, версия 1.0 вышла только в прошлом году. Больше языков с ЗТ претендующих на «язык общего назначения» сейчас нет*, поэтому значительно легче стать одним из действительно заметных специалистов.

Правда это путь не в пол года, как тебе осталось в js, а года полтора-два. И нужно терпение и желание. Я для себя решил попробовать. Если у тебя есть время и возможность, предлагаю тебе подумать ещё раз.

А в целом, хозяин - барин.

В любом случае желаю успехов.

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

PS. я тот аноним, для ясности. был за другим компьютером.

AndreyKl ★★★★★ ()
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от AndreyKl

Да, отношение к прямому вопросу из аудитории такое (сам сразу тоже заметил). Пусть хоть Бог луны! Моё мнение уже склеилось. Это не отменяет факта нужности технологии. Я сам вижу тенденцию внедрения технологий из ФП. Это радует. Мой кумир в данной технологии - https://www.youtube.com/watch?v=NKeHrApPWlo Жаль, что он сильно болен (рак, возможно, умер уже).

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.