Pull to refresh
138
0
Владимир Губарьков @xonix

CTO

Send message

makesure — make с человеческим лицом

Reading time 8 min
Views 6.3K

Многие ли из вас используют всевозможные вспомогательные shell-скрипты в своих проектах? Это также могут быть Python или Perl скрипты. Обычно такие скрипты используются на этапе сборки или для других задач автоматизации проекта.


Примерами таких задач могут служить:


  • вспомогательные скрипты для Git,
  • запуск тестов/линтеров,
  • запуск необходимых докер контейнеров,
  • запуск БД-миграций,
  • собственно, сборка проекта,
  • генерация документации,
  • автоматизация публикации релизов,
  • развертывание и т.д.

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


Make — пожалуй, наиболее известный из подобных инструментов.


Похожий функционал известен разработчикам nodejs и любим ими в виде скриптов в package.json (npm run-scripts). Ветераны Java вспомнят Ant.


Но nodejs/Ant требуют установки, make хоть и способен выполнять функции task runner довольно неудобен в этой роли, будучи на самом деле очень олдскульным build tool со многими вытекающими "особенностями".


А shell-скрипты требуют некоторой системы и неизбежной рутины в написании (обработка аргументов, help-сообщения и т.д.).


Хотя, например, Taskfile представляет прекрасный шаблон для подобных скриптов.


Так и родился makesure.

Что это?
Total votes 11: ↑10 and ↓1 +9
Comments 50

jsqry — лучше, чем jq

Reading time 8 min
Views 8.8K

В своей прошлой статье на Хабре я писал про библиотеку Jsqry, которая предоставляет простой и удобный язык запросов (DSL) к объектам JSON. С тех пор прошло много времени и библиотека тоже получила свое развитие. Отдельный повод для гордости — библиотека имеет 98% покрытие кода тестами. Однако в этой статье речь не совсем о ней.


Думаю, многие из вас знакомы с инструментом jq, который является практически стандартом де-факто для работы с JSON в командной строке и скриптах. Я тоже являлся её активным пользователем. Но меня все время беспокоила неоправданная сложность и неинтуитивность синтаксиса запросов этой утилиты. И не меня одного, вот лишь несколько цитат с hacker news:


I have been using jq for years and still can't get it to work quite how I would expect it to.

I have the same issue with jq. I need to use my google fu to figure out how to do anything more than a simple select.

I don't know what the term would be, mental model, but I just can't get jq to click. Mostly because i only need it every once in a while. It's frustrating for me because it seems quite powerful.

I know I might be a dissenting opinion here, but I can never wrap my head around jq. I can manage jq ., jq .foo and jq -r, but beyond that, the DSL is just opaque to me.

Let's just say it: jq is an amazing tool, but the DSL is just bad.

Yeah, I find jq similar to writing regexes: I always have to look up the syntax, only get it working after some confusion why my patterns aren't matching, then forget it all in a few days so have to relearn it again later.

Одним словом, вы уже наверное догадались. Пришла идея, а почему бы не обратить мою JS библиотеку в исполняемый файл для командной строки.

Читать дальше →
Total votes 23: ↑22 and ↓1 +21
Comments 16

Разрабатываем утилиту на GraalVM

Reading time 6 min
Views 4.2K

Постановка задачи


Периодически у меня возникает задача поделиться файлами по локальной сети, например, с коллегой по проекту.


Решений для этого может быть очень много — Samba / FTP / scp. Можно просто залить файл в общедоступное публичное место типа Google Drive, приложить к задаче в Jira, или даже отправить письмом.


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


А хочется чего-то более легковесного и гибкого.


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


Скажем, часто вышеозначенную задачу я решал используя системный питон следующим однострочником


$ python3 -mhttp.server
Serving HTTP on 0.0.0.0 port 8000 ...

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

Читать дальше →
Total votes 13: ↑13 and ↓0 +13
Comments 3

Jsqry — библиотека для запросов к JS объектам и массивам

Reading time 2 min
Views 11K

Представляю вашему вниманию небольшую js-библиотеку Jsqry.
Проще всего проиллюстрировать её назначение следующим примером.


До:


var name;
for (var i = 0; i < users.length; i++) {
    if (users[i].id == 123) {
        name = users[i].name;
        break;
    }
}

После:


var name = one(users, '[_.id==?].name', 123);

Библиотечка позволяет извлекать информацию из объектов/массивов в одну строку, используя несложный язык запросов, вместо написания циклов (подчас вложенных).

Читать дальше →
Total votes 27: ↑21 and ↓6 +15
Comments 58

XPath: ускоряем итерацию по NodeList

Reading time 5 min
Views 16K
При попытке обработки не очень маленького регулярного XML-файла (на самом деле всего лишь около тысячи записей) обнаружил, что итерирование по NodeList вместе с извлечением с помощью XPath начинает существенно тормозить (занимая порядка 2 минут на моём файле), причем тормоза увеличиваются с обработкой каждого следующего узла (node). Эта проблема поднимается также

blog.astradele.com/2006/02/24/slow-xpath-evaluation-for-large-xml-documents-in-java-15

jbwhammie.blogspot.com/2011/02/make-java-xpath-work-on-large-files.html

Читать дальше →
Total votes 22: ↑22 and ↓0 +22
Comments 14

Задача Эйнштейна на Mercury

Reading time 6 min
Views 2.9K
Продолжаем неделю задачи Эйнштейна на Хабре. В дополнение к трём представленным решениям
  1. Регулярным языком
  2. Хаскеллем
  3. Прологом

позвольте представить еще одно на Mercury.

Напомним Википедию:

Mercury — язык функционально-логического программирования со строгой типизацией…
Читать дальше →
Total votes 31: ↑22 and ↓9 +13
Comments 20

Пишем интерпретатор Brainfuck на Mercury

Reading time 5 min
Views 2.4K
Продолжая неделю Brainfuck на хабре и свои эксперименты с Mercury, написал свою версию интерпретатора. Заранее прошу извинить, что еще не представил «вступительную» статью о Mercury. На самом деле, она в процессе написания.
Пока же приведу код решения, который проиллюстрирует заодно несколько возможностей языка Mercury.
Читать дальше →
Total votes 22: ↑15 and ↓7 +8
Comments 10

Игра Жизнь на языке программирования Mercury

Reading time 7 min
Views 4.7K
В рамках экспериментов с языком программирования Mercury а также под впечатлением уже неоднократно поднимавшейся в последнее время здесь темы игры Жизнь (1, 2, 3) захотелось написать свою реализацию на этом интересном языке программирования.

В двух словах о Mercury. Этот язык функционально-логического программирования замышлялся как усовершенствование prolog'а. Усовершенствование заключается в введении в пролог статической типизации (а так же декларирование режима детерминизма). Как результат — больше возможностей у компилятора создать эффективный исполнимый код, больший контроль на этапе компиляции. Любителям пролога, наверняка знаком анекдот:
Q: How many Prolog programmers does it take to change a light bulb?
A: False.

В царстве прологов нишу типизированных прочно занимает Visual Prolog. Но, стоит отметить, что подходы Visual Prolog и Mercury весьма отличны.
Читать дальше →
Total votes 30: ↑27 and ↓3 +24
Comments 12

Реализация переборного механизма пролога на Python

Reading time 3 min
Views 1.5K
Как известно (некоторым), пролог обладает тем замечательным свойством, что вызов каждого предиката в общем случае порождает несколько (хотя, может и не одной) точек возврата. Это значит то, что если на некоем шаге вызов очередного предиката потерпит неудачу, будет произведен откат исполнения к ближайшей точке возврата, и продолжено исполнение с новыми альтернативными данными, возращаемыми предикатом, породившим возврат. Когда все возвраты в некой точке исчерпаются, будет производится откат к предыдущим, пред-предыдущим и т.д. точкам возврата. Вероятно, смекалистый читатель уже сообразил, что то что в прологе записывается линейным набором предикатов, типа

pred1(X, Y), pred2(Y, Z), pred3(Z).


в традиционных языках представляется чем-то вроде следующей вложенной конструкции

for Y in pred1(X) {
  for Z in pred2(Y) {
    pred3(Z)
  }
}


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

Однако, мы отвлеклись.
Читать дальше →
Total votes 19: ↑17 and ↓2 +15
Comments 6

Цепной квайн произвольного порядка на Python

Reading time 3 min
Views 1.7K
   Впечатленный цепным полиглотным квайном японца, приведенным в этом хабратопике, я, ранее уже встречавшийся с программами-квайнами, решил познакомиться с ними плотнее. После беглого гугления и непродолжительного чтения вики/блогов/сайтов по теме, у меня зачесались руки и захотелось написать свой квайн. Квайн был написан, даже в нескольких вариантах, но этого мне показалось мало. Позже я даже написал двойной квайн (код на python генерирует код на prolog а код на prolog в свою очередь первоначальный python-код).

   Однако, тут возник вопрос. А можно ли написать квайн любого порядка (т.е. тот, который будет переходить сам в себя после N запусков)? Как оказалось, это вполне возможно. Результатом изысканий явился следующий код:

# xonix
L=19;B,Q,N,q,n=map(chr,(36,81,78,39,10))
X='import sys;sys.stdout.write(%s%s%s.replace(chr(36)+chr(81)+chr(36),chr(39)).replace(chr(36)+chr(81),chr(36)).replace(chr(36)+chr(78)+chr(36),chr(10)).replace(chr(36)+chr(78),chr(36)))'
Y='# xonix%sL=%s;B,Q,N,q,n=map(chr,(36,81,78,39,10))%sX=%s%s%s%sY=%s%s%s%sE="""%s""";exec E%simport sys;sys.stdout.write(b())'
E="""def b(l=L):
  if l==L: Ql=q
  else: Ql=B+Q*(L-l)+B;Nl=B+N*(L-l)+B
  if l>0: return X%(Ql,b(l-1),Ql)
  else: return Y%(Nl,str(L),Nl,Ql,X,Ql,Nl,Ql,Y,Ql,Nl,E.replace(n,Nl),Nl)"
"";exec E
import sys;sys.stdout.write(b())


Читать дальше →
Total votes 39: ↑32 and ↓7 +25
Comments 9

Небольшой лайфхак: смотрим скрытые записи на Хабре, используя Google

Reading time 1 min
Views 1.6K
Обычно читаю посты Хабра через Google Reader. Бывает начнешь читать какую-нибудь, возможно, интересную запись, кликаешь «Читать дальше» и получаешь «Доступ к публикации закрыт» как вот здесь: habrahabr.ru/blogs/java/73080

Метод весьма прост, открываем google.ru и в строке поиска набираем

cache:http://habrahabr.ru/blogs/java/73080/

Ну и продолжаем чтение.

Разумеется, метод сработает не всегда, а только если автор не сразу закрыл топик, и гугл успел его закешировать.
Total votes 47: ↑23 and ↓24 -1
Comments 5

(Python) Парочка полезных декораторов

Reading time 3 min
Views 951
import should
  
@should.give((5,2),7)
@should.give(("aa","bbb"),"aabbb")
@should.give(([1],[2,3]), [1,2,3])
@should.give((1,1),1) # test
def add(a,b):
  return a+b
  
@should.throw((1,0), Exception)
@should.throw((5,0), ZeroDivisionError)
@should.throw((5,0), TypeError) # test
@should.throw((5,1), TypeError) # test
def div(a,b):
  return a/b



>pythonw -u "should.py"
[!] add(1, 1) should give 1, but got 2.
[!] div(5, 1) should raise TypeError, but raised nothing.
[!] div(5, 0) should raise TypeError, but raised ZeroDivisionError.
>Exit code: 0


Читать дальше →
Total votes 26: ↑21 and ↓5 +16
Comments 15

Трекерная музыка. Приобщаемся к великому

Reading time 8 min
Views 17K
 Представляю вашему вниманию подборку из 15 моих любимых V2M-композиций от товарищей Farbrausch. Для прослушивания достаточно запустить Exe-шник. Обращаем внимание на его размер и на качество звучания!

narod.ru/disk/9788383000/q.exe.html

(Это не вирус, клянусь кармой, сам лично компилил)

Сразу оговорюсь, не работает в Висте и Windows 7, почему — не знаю =(, т.к. не использую и полный профан в системном программировании, если кто подскажет, почему — буду благодарен. В *nix под Wine должно работать.
Далее немного о трекерной музыке вообще и о процессе создания этого exe-шника
Total votes 80: ↑70 and ↓10 +60
Comments 81

Еще о парсинге на Prolog'е

Reading time 7 min
Views 3.9K
Вот тут наткнулся на, в общем-то, простую задачку состоящую в парсинге текстового файла, содержащего 5 миллионов float'ов (и подсчете их суммы). Файл генерируется следующим C#-кодом:
static void Main(string[] args)
{
  using (Stream stm = new FileStream(@"d:\numbers_large.txt", FileMode.Create))
  {
    TextWriter wr = new StreamWriter(stm);
    System.Random r = new System.Random();
    for (int i = 0; i < 5000000; i++)
    {
      double d=10000*r.NextDouble() * (r.NextDouble() > 0.7 ? -1.0 : 1.0);
      wr.Write("{0} ", d);
    }
    wr.Flush();
  }



Задача ставилась в контексте обсуждения производительности haskell'я в применении его к задачам парсинга. Я знал, что на прологе подобные задачи решаются красиво и непринужденно используя технику DCG (Definite clause grammar: 1, 2, 3, 4). Фактически, это описание грамматик на языке Пролог, и парсинг по ним, основанный на переборно-откатном принципе работы пролога.

Ну то есть обычно получается очень кратко и красиво (например, вот решение задачки о сбалансированности скобок этим методом: программа из 7 строк), но, я подозревал, что не всегда быстро. Собственно, это мне захотелось проверить.
Читать дальше →
Total votes 12: ↑10 and ↓2 +8
Comments 7

Японская версия головоломки «Волк, коза и капуста» на прологе

Reading time 3 min
Views 6.5K
Эта головоломка уже знакома Хабрахабру по этой публикации.

Суть головоломки в следующем (цитируя bor1s):
Нужно перевезти семью из шести человек и полицейского с бандитом на другой берег реки на плоту. Однако одновременно на плот помещаются только два человека (уточнение: один из которых должен быть взрослым), мама, оставшись без папы, избивает мальчиков, папа — девочек. А бандит (уточнение: в отсутствие полицейского) просто мочит всех.

Пройти головоломку online можно по ссылке: http://freeweb.siol.net/danej/riverIQGame.swf.

Пролог обычно хорошо справляется с решением таких задач, в чем я и решил убедиться…

Читать дальше →
Total votes 24: ↑18 and ↓6 +12
Comments 3

Небольшой баг Firefox (3.0.6)

Reading time 1 min
Views 418
<input type="text" id="t" />

<script>
  var t=document.getElementById("t");
  t.onblur = function () {
    t.blur();
  }
  t.focus();
</script>

* This source code was highlighted with Source Code Highlighter.


Если открыть хтмл-файл с таким кодом и убрать фокус с браузера, например, кликнув на пустое место под кнопкой «Пуск», а потом обратно на браузер — то будет невозможно ничего ввести ни в одно текстовое поле на всех вкладках, в том числе в поле ввода адреса.
Total votes 23: ↑18 and ↓5 +13
Comments 8

RE: Занимательная задачка

Reading time 1 min
Views 2.1K
Копаясь в поиске сайта, наткнулся на занимательную задачку и не смог отказать себе в удовольствии потратить 10 минут времени для решения её на полюбившемся мне прологе.

<br>% ((((1?2)?3)?4)?5)?6<br>solve(Formula) :-<br>    Signs = [+, -, *, //],<br>    member(Op1, Signs),<br>    member(Op2, Signs),<br>    member(Op3, Signs),<br>    member(Op4, Signs),<br>    member(Op5, Signs),<br>    A =.. [Op1, 1, 2],<br>    B =.. [Op2, A, 3],<br>    C =.. [Op3, B, 4],<br>    D =.. [Op4, C, 5],<br>    Formula =.. [Op5, D, 6],<br>    35 =:= Formula.<br>


Результат работы кода:
Читать дальше →
Total votes 13: ↑12 and ↓1 +11
Comments 2

Правильность скобочной структуры, prolog

Reading time 1 min
Views 6.1K
На правах развлечения в пятничный вечер.

<br>bracket("]") --> "[".<br>bracket(")") --> "(".<br>bracket("}") --> "{".<br><br>brackets --> bracket(Close), brackets, Close, brackets.<br>brackets --> [].<br><br>check(BracesStr) :-<br>    phrase(brackets, BracesStr), !.<br>

?- check("[[[]]][][[]][()]{}[]").
true.

?- check("[[[)]]][][[]][()]{}[]").
false.

P. S. Решение на вашем любимом ЯП приветствуется )
Total votes 17: ↑13 and ↓4 +9
Comments 57

Prolog, введение

Reading time 13 min
Views 102K
Довольно оживленное обсуждение предыдущей стати (http://habrahabr.ru/blogs/programming/47416/) показало, что тема пролога оказалась интересна сообществу.
Чтобы заинтересовать еще более читателя и вместе с тем облегчить ему начало работы с этим языком, я решил написать немного начальных данных о прологе.

Кратко основные особенности.
Читать дальше →
Total votes 78: ↑64 and ↓14 +50
Comments 41
1

Information

Rating
Does not participate
Date of birth
Registered
Activity