Полезные мелочи PostgreSQL


Формирование одного JSONB-объекта из двух столбцов, в одном из которых ключи, а в другом – значения, с группировкой по общему полю

Допустим, у нас есть таблица props в которой есть поля id, group_id, key, value, где group_id – поле, по которому значения группируются. И мы хотим выбрать для каждой группы json-объект со всеми значениями key:value:

jsonb_object(array_agg("key"), array_agg("value")) as tags
group by

Получение данных из Sentry (своей локальной инсталляции)

  1. Нужно выяснить ID своего проекта
  2. Выполнить следующий запрос, подставив вместо “40” номер проекта (ID):
with params as (
40 as project_id
dat as (
jsonb_object(array_agg(fv."key"), array_agg(fv."value")) as tags
sentry_message as sm,
sentry_groupedmessage as sgm,
sentry_eventtag as et,
sentry_filtervalue as fv
fv.id = et.value_id
et.event_id = sm.id
sm.project_id = (select project_id from params)
sgm.id = sm.group_id
group by sm.id, datetime, sgm.message, sgm.view, sm.group_id
select * from dat

Подключение 10-осного датчика положения GY-88 к Arduino

На рынке устройств, готовых для сопряжения с микроконтроллерами, есть масса устройств для определения положения в пространстве.
Среди них есть датчики угловых скоростей (гироскопы), датчики атмосферного давления, датчики линейных ускорений, магнитометры (электронные компасы). Все они могут быть подключены к Arduino по отдельности, но есть и модули, объединяющие в себе эти функции.
Один из таких модулей – GY-88.

Continue Reading

How to make vk.com less disturbing?

How to make vk.com less disturb you from really important things?
The easiest way it to remove yourself from that social network, or not create an account, If you haven’t got one.
But, what to do, if you have lots of “friends” in vk.com, and you can’t contact them in other way?
Or, if You are using music features of vk.com?

Lets assume, that our task is: make it so, that vk.com could be used as messenger and music player at work time. Also, out of the work hours, we want to use full functionality of vk.com.

This goal could be easilly achieved by userscript, installed through GreasyMonkey/TamperMonkey.


Как разбить поле “ФИО” на имя, фамилию и отчество в PHP

Бывают случаи, когда ФИО пользователей на сайте задавалось с помощью единственного поля “ФИО”, а после какого-то времени, в ходе рефакторинга базы, решили сделать 3 поля – Фамилия, Имя, Отчество. Как же быть со старыми данными? Ведь пользователи вводят туда всё что угодно. Попадаются такие ФИО как “Иванов К.М.”, “пЕтрова ивгения”, “Константин пАВЛОВ директор”. Как же выделить из этих “ФИО” осмысленную информацию, настоящие имя, фамилию и отчество, чтобы заполнить соответствующие поля?

Когда я столкнулся с этой проблемой, я не нашел готового решения, поэтому написал инструмент сам.

Библиотека анализа и нечёткого поиска в строке фамилии, имени, отчества.

Библиотека написана на PHP и использует базу русских имен, фамилий, и отчеств (женских и мужских), взятых из википедии, и дополненных еще несколькими десятками вручную. Если вам нужно определять также другие ФИО (например, грузинские, таджикские, казахские), нужно будет дополнить базы слов в соответствующих файлах.

Взять библиотеку можно здесь: https://github.com/MihanEntalpo/FIO-Analyzer

Установка с помощью composer:

В вашем файле composer.json нужно прописать:

    "require": {
        "mihanentalpo/fio-analyzer": "*"


composer.phar install

Continue Reading

Linux backup time machine based on Python + Rsync + Mysql

in a corporate network chat:
xxx: I was hoping, that I woudln’t have to say it, but the circumstaces made me.
xxx: gentelmen
xxx: did somebody made a backup?

Yet another backup system for Linux based operation systems. Built on Python, using Rsync. Other backup solutions appeared to be too complicated (like bacula) or not having needed functions (rdiff-backup).

Pros of Linux Time MAchine

  • Works on the principle of MacOs’ TimeMachine, namely: creating incremental copies in separated folders with the ability to fastly recovery any file from any date, or use it in some another way
  • Incremental copies, based on HardLinks, so every folder contains sort of “full copy”, but non-changed files represented by hardlinks to their older versions for previous dates
  • Easy thinning of backup copies, because of hardlinks make any copy self-sufficient
  • Immediate access to files, thanks to files stored in a plain form (unlike rdiff-backup and some others)
  • Built-in functionality to create SQL-dumps of MySQL databases (to backup mysql-tables as files)
  • Automatically resume of interruped backup, from the place, where it were stopped, in case of fault
  • Backup process could be started from PC, where backups are stored, or from PC where source files are.
  • Backup frequency could be configures, so, you can limit maximal frequence, to make Linux Time Machine copy files not too often, store this information in the config file, and not move it to crontab (as it usual happen with sheduled operations like backup)
  • Easy to improve backup process by using the API, for example, add copying to several storage servers
  • Copy whole filesystem or just single folder
  • Posibility to exclude folders, files by names or masks (like *.log)
  • Function to automatically clean old, outdated copies, configured by flexible rules
  • Posibility to configure sending error message to the getSentry system (Error-logging monitor with handy web-interface)


  • The data is stored in a clean form, without compression, so, backup could use several times more space, that source data
  • Rsync should be install on both sides (source and destination) for backup to be possible
  • Another requirement is an ssh access to both systems
  • Ssh access is currently working only with key-based authentication
  • When calculating space, consumed by backup copies, single file could be counted several times (because of hardlinks), so space, occupied by it would be measured wrong (but, for example, terminal programm “du” does it the right way)


Разработка на WordPress по-человечески, с использованием GIT

Как обычно ведётся разработка на WordPress?
Одним из двух способов:
1) Полностью на удалённом сервере
1.1 Устанавливаем wordpress на удалённом сервере
1.2 Закрываем доступ к нему через .htaccess и .htpasswd чтобы посторонние не лезли, пока он не готов
1.3 Подключаемся к сайту по FTP через FileZilla и вручную создаём тему дизайна
2) На локальном сервере, с последующей одноразовой выгрузкой
2.1 Устанавливаем wordpress на локальной машине
2.2 Через /etc/hosts прописываем строчку, чтобы адрес будущего сайта указывал на локальную машину
2.3 Разрабатываем сайт на локальной машине, обращаясь к ней по адресу будущего сайта
2.4 По готовности выгружаем сайт на боевой сервер через ftp и mysql

Однако, любой разработчик, имеющий опыт командной работы над сайтом с обменом кодом посредством git, давно привычен к гораздо лучшему. Разработка “по-человечески”, с использованием удалённого git-репозитория имеет множество плюсов.

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

Continue Reading

Отключение рекламы на Digitally Imported (di.fm)

Есть такое замечательное интернет-радио – Digitally Imported, по адресу https://di.fm
Всё в нём прекрасно, за исключением того, что, при использовании бесплатного аккаунта, время от времени дают послушать рекламу.
Я понимаю, что реклама нужна, как минимум для двух вещей:
1) Склонение пользователей купить платную подписку, где рекламы не будет.
2) Заработок денег на рекламодателях

Поскольку в России, откуда я слушаю радио, видимо нет желающих подавать рекламу, то в рекламных паузах можно услышать только сообщения двух видов:
а) “Пропустите эти рекламные сообщения, и наслаждайтесь музыкой с более высоким качеством, перейдя на премиум”
б) “Digitally imported ищет крутых веб-разработчиков на полный рабочий день”
Чтобы не слышать этого, я написал браузерный скрипт для GreaseMonkey/TamperMonkey

Continue Reading

Внимание! Уязвимость нулевого дня в Firefox для Windows

В интернете появилась уязвимость нулевого дня для Windows-версии Firefox, то есть, сегодня она уже известна, но для неё ещё нет решения.
Статья с подробным разбором на английском: https://www.wordfence.com/blog/2016/11/emergency-bulletin-firefox-0-day-wild/

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

Continue Reading

Компиляция Unreal Engine 4.14, 4.15 в Debian 8 Jessie

Unreal Engine версии 4.14, вышедший относительно недавно, как всегда, имеет кучу нового функционала, и не имеет большого количества старых багов. В частности бага из версии 4.13, приводящего к тому, что при открытии редактора Widget Blueprint весь Unreal Engine Editor вылетает целиком.

К слову, зато в UE 4.14 есть баг, из-за которого редактор вылетает при открытии редактора анимаций, или редактора скелетных мешей.

В версии 4.15 поправлены все досадные баги, приводившие к вылету редактора в Linux, и добавлены такие замечательные вещи, как типы данных Set и Map в BluePrint’ах (в C++ их можно было использовать и раньше). Первые позволяют создавать набор из произвольных неповторяющихся элементов с быстрым поиском по ним, а вторые – ассоциативный массив с произвольным типом ключей и значений.

Однако, если версию 4.13 можно было без проблем скомпилировать в Debian 8 Jessie, то версии 4.14 и 4.15 для компиляции требует Clang весрии 3.9, который есть только начиная с Debian 9 Stretch, который, на момент написания этого текста, ещё не “заморожен” и является тестовым дистрибутивом.

Итак, что же нужно, чтобы собрать UE4.14 или UE4.15 в Debian Jessie:

Continue Reading