Как стать автором
Обновить
31
0
Александр Артёменко @Svetlyak

Пользователь

Отправить сообщение
У меня, кстати, есть ещё одна разработка – скрипт, который проходится по всем форкам и ищет несмердженные в апстрим ветки. Про такое тоже можно как-то напоминать владельцу основного репозитория. В форках иногда попадаются полезные доработки, которые люди по разным причинам не превращают в пуллы и не вливают в апстрим.
Хотя странно. Я сейчас поставил Firefox Quantum 66.0.3 (64-битный). И у меня проблема не воспроизвелась, ни в обычной вкладке, ни в incognito режиме (где он написал:

Ресурс на «https://mc.yandex.ru/metrika/watch.js» был заблокирован, так как включена блокировка содержимого.[Подробнее] 12forks.com
Ресурс на «https://yandex.ru/clck/click» был заблокирован, так как включена блокировка содержимого.[Подробнее] 12forks.com


Может быть дело в каких-то дополнительных плагинах? Что-нибудь вроде адблока или ещё чего-то такого?
Очень может быть что так. Похоже на ошибку в Яндекс Формах и том, как они используют Метрику. Я уже передал информацию о проблеме разработчикам.

Спасибо за помощь!
Говоря про регистрацию, я имел в виду, что автор пулла или репозитория могут быть не зарегестрированы в моём сервисе, и даже не знать про него. Бот может прийти в любой пулл и покомментить, что пулл похоже подтухает :)
Валерий, скажи пожалуйста какой у тебя браузер?
Какого рода бот?

Такой, который будет сам находить забытые PR и напоминать о них даже без регистрации автора пулла или репозитория?
Интересно. Я сейчас перепроверил и в Chrome всё ОК. Какой у тебя браузер?
Только закладки не спасут от того, что эти задачи будут мешаться, когда ты будешь (в рамках второго пункта) пробегаться по всему списку в поисках того, на каком моменте какая задача застряла.
Да, главное – чтобы удобно было.
Сейчас мой MVP берёт весь список пуллов и тикетов и разбивает их на несколько категорий:

* Тикеты в которых есть новые комменты с момента, когда я последний раз там что-то писал или создал тикет (тут же показывается число этих комментов, а в веб-версии можно будет отображать их самих + дать возможность тут же ответить)
* Тикеты в которых давно не было активности. Пока MVP пишет лишь время с последнего коммента, но опять же, можно последние комменты и форму ответа подтянуть или сделать кнопки для быстрых ответов с шаблонами, типа: «Please, review my pull».
* Пуллы в коорых есть мердж конфликты.
* Тикеты которые я по каким-то причинам решил отложить до лучших времён + заметка для меня самого, с указанием причины. Например там можно написать, что сейчас пока времени нет на этот проект, и «отложить его на месяц». Спустя заданное время он автоматически появится в одном из списков описанных выше.

Вот такими вещами он может отличаться. И я уверен, что можно ещё много чего придумать.
Так бывает, что эти уведомления теряются в общем потоке писем. В этом и суть того, проекта который я тут описываю – показывать на одной странице в удобном виде все действия, которые тебе нужно совершить, чтобы работа по всем пуллам и тикетам двигалась вперёд.

Читать уведомления на почту конечно же надо. Но я могу читать только свои письма, и не могу повлиять на то, как их разбирают мейнтейнеры библиотек. И если мейнтейнер уведомление пропустил, то нужно как-то ему напомнить о себе. Как это сделать? Ведь гтихаб не присылает на почту напоминалку о том, что ты вот писал две недели назад коммент в таком то пулле, но там тебе никто так и не ответил. А мой сервис сможет делать и это тоже.
Спасибо за коммент.

На лиспе в наших краях много не пишут потомучто тут нет среды для его развития.

Среда не появится, если её не создать. Этим надо заниматься – писать тулинг, улучшать библиотеки, создавать компании, которые будут использовать эту экосистему. Я понемногу этим занимаюсь.

Вообще dsl можно и на функциях построить. Язык же может быть сколь угодно странным. К примеру, ORM Django или SQLAlchemy предоставляют DSL позволяющий определять модели данных и делать запросы выполняя цепочки методов.

Правилами вычисления аргументов. У функции аргументы вычисляются, как правило, в определённом порядке. В в случае DSL могут не вычисляться вовсе, а как-то трансформироваться в код, например.


К примеру, loop макрос определяет язык для итерации по коллекциям и такой простой код:


DBAAS> (loop for i in '(1 2 3 4 5)
             when (evenp i)
               collect i)

Разворачивается в более сложную конструкцию, где некоторые аргументы макроса будут вычислены (1 2 3 4 5) и (evenp i), а другие использованы для генерации кода реализующего бизнес-логику. В результате получится нечто вроде этого:


(block nil
  (let ((i nil) (#:loop-list-827 '(1 2 3 4 5)))
    (declare (type list #:loop-list-827))
    (sb-loop::with-loop-list-collection-head (#:loop-list-head-828
                                              #:loop-list-tail-829)
      (tagbody
       sb-loop::next-loop
        (sb-loop::loop-desetq i (car #:loop-list-827))
        (sb-loop::loop-desetq #:loop-list-827 (cdr #:loop-list-827))
        (if (evenp i)
            (sb-loop::loop-collect-rplacd
             (#:loop-list-head-828 #:loop-list-tail-829) (list i)))
        (when (endp #:loop-list-827) (go sb-loop::end-loop))
        (go sb-loop::next-loop)
       sb-loop::end-loop
        (return-from nil
          (sb-loop::loop-collect-answer #:loop-list-head-828))))))
Да, ответ отличный. Спасибо за ссылку!
При этом скобочность лиспа позволяет не писать поддержку каждого нового DSL в редакторе. Всё работает «из коробки». И манипуляции с кодом серьёзно упрощаются. Так что я бы не считал это рудиментом. Просто особенность к которой быстро привыкаешь.

Раз уж мы тут про DSL говорим, то при чём тут скобки?


Вот тебе пример из одной библиотеки которую я некоторое время назад написал. Она упрощает парсинг опций командной строки и большую часть работы делает за тебя. Прикладной код выглядит так:


(defmain main ((debug "Show traceback instead of short message."
                      :flag t)
               (log   "Filename to write log to.")
               (token "GitHub personal access token."
                      :env-var "TOKEN")
               &rest repositories)
  "Utility to analyze github forks."

  ;; Making real work
  (loop for repository in repositories
        do (analyze repository
                    :log log
                    :debug debug
                    :token token)))

Всё, что ты видишь до строчки Making real work, это DSL для описания функции, принимающей параметры командной строки. Под капотом оно разворачивается в такой вот код:


(progn
 (net.didierverna.clon:defsynopsis (:postfix "REPOSITORY")
   (defmain/defmain::text :contents "Utility to analyze github forks.")
   (defmain/defmain::flag :long-name "help" :env-var nil :description
    "Show help on this program." :short-name "h")
   (defmain/defmain::flag :long-name "debug" :env-var nil :description
    "Show traceback instead of short message." :short-name "d")
   (defmain/defmain::stropt :long-name "log" :env-var nil :description
    "Filename to write log to." :short-name "l")
   (defmain/defmain::stropt :long-name "token" :env-var "TOKEN" :description
    "GitHub personal access token." :short-name "t"))
 (defun main (&rest defmain/defmain::argv)
   (net.didierverna.clon:make-context :cmdline
                                      (cons "cl-info" defmain/defmain::argv))
   (let ((repository (net.didierverna.clon:remainder))
         (net.didierverna.clon:help
          (net.didierverna.clon:getopt :long-name "help"))
         (debug (net.didierverna.clon:getopt :long-name "debug"))
         (log (net.didierverna.clon:getopt :long-name "log"))
         (token (net.didierverna.clon:getopt :long-name "token")))
     (when net.didierverna.clon:help
       (net.didierverna.clon:help)
       (uiop/image:quit 1))
     (handler-bind ((t
                     (lambda (condition)
                       (uiop/image:print-condition-backtrace condition :stream
                                                             *error-output*)
                       (uiop/image:quit 1))))
       (loop for reporitory in (remainder)
             do (analyze repository :log log :debug debug :token token))))))

Тут видно, как задаются возможные аргументы, какие у них могут быть флаги и короткие названия, как запускается парсинг аргументов и их значения присваиваются переменным внутри функции.


Абстракция defmain, написанная один раз, сама задаёт разумные дефолты и избавляет меня от написания или копирования всего этого бойлерплейта в каждой программе.


Такой вот DSL. Реальный.

В результате у программистов на других языках лапшекод, который надо будет через год полностью переписать, а у программистов на Lisp лаконично сформулированная бизнеслогика, которую легко читать и поддерживать.
Проверил. Да, по HTTP. Но ведь если параноить, то надо параноить по полной – вычитывать весь код всех своих opensource зависимостей и их зависимостей, и зависимостей их зависимостей.

Кстати, opensource хорош тем, что его можно исправлять. Пока завёл issue про https: github.com/quicklisp/quicklisp-client/issues/167
А почему не стали использовать формат reStructured Text? Он хотя и более странно выглядит, чем Маркдаун, но стандартизирован, и для описания документации лучше походит, так как задумывался именно с этой целью.

В reStructured Text заложены возможности для расширения и то как это делается, тоже стандартизировано, в отличии от Markdown, где разработчик каждой библиотеки городит свой велосипед.

Информация

В рейтинге
Не участвует
Откуда
Россия
Работает в
Зарегистрирован
Активность