Category Archives: Dev

JQ 101

JQ is an amazing tool that allows you to manipulate JSON via the command line / bash.

To be frank I was a bit weirded out by people praising something so ‘trivial’ back in the day, but then I realized how powerful this thing actually is. Manipulating JSON coming from web background may seem really simple task, but when you go to bash, it is … nightmare.

JQ makes things doable in surprisingly simple way.

The thing it is that it can be a bit hard to start with. Some people have asked me to provide them with several examples so they can have something to build on top of when developing their own stuff.

These are the basics, if you have mastered everything listed here, your logical next step would be to read the official docs like a real dev

So, this is my cheat sheet:

How to use


You can cat a file and pipe it to JQ like:

cat file.json | jq 'something'

but it is generally preferred to do it like this:

jq 'something' < file.json

I personally prefer to add -r flag to JQ so it outputs raw

jq  -r 'something' < file.json

Sample data

We are going to be working with this JSON for most of the examples

    "data": [
            "email": "",
            "username": "user1"
            "email": "",
            "username": "user2"
    "users": [
            "email": "",
            "": "user1"
            "email": "",
            "": "user2"



Simple select everything

jq -r '.' < file.json

will give you the root of the document. Doesn’t matter if it is an object or array

Select property of an object

jq -r '.data' < file.json

returns an array containing all users in ‘.data’

Select first user in data

jq -r '.data[0]' < file.json

returns first object in ‘data’ array

Select all usernames is ‘.data’

jq -r '.data[].username' < file.json



Select all usernames of ‘users’ array when keys contain dots

jq -r '.users[][""]' < file.json




Getting keys of an object

jq -r '.|keys' < file.json

gives you an array containing all keys ["data", "users"]

Getting keys of object on new lines

jq -r '.|keys[]' < file.json



Select only users called ‘user1’ from ‘data’

jq -r '.data[] | select(.username="user1")'

gives you {"username": "user1", "email": ""}

Select the emails of all users called ‘user1’

jq -r '.data[] | select(.username="user1") | .email'

Create JSON

Create object with key username and value ‘user1’

jq -n --arg mykey username --arg myval user1 '{($mykey):$myval}'

Append property to object

jq -n --arg mykey username --arg myval user1 '{($mykey):$myval}' | jq -r '. |= . + {"email": ""}'

or simpler:

echo '{"username": "user1"}' | jq -r '. |= . + {"email": ""}'

both result in:

  "username": "user1",
  "email": ""

Change value of object property

jq -n '{ "username": "user1"}' | jq -r '.username="user11"'

Create array

jq -n '[]'

same as

echo '[]' | jq -r '.'

Set value of array element

jq -n '[1,2,3]' | jq -r '.[2] |=  5'

outputs [1,2,5]

Add element to array (of unknown length)

jq -n '[1,2,3]' | jq -r '.[.|length] |=  4'

result [1,2,3,4]

My VIM Setup

This will be my first post in English, I give up – after so many year,me  having doubts about my English is going to get any better so I hope you understand me at least.

Why ?

I am using VIM as my main editor for php and javascript for more than a year already.

What I learned is that I really like this minimalist approach – building your own “IDE” step by step, including only the things you need. If you prefer full IDE – please go with Intellij (the best I have used in this class), but if you are going to use Sublime Text or VSCode or Atom or whatever, there is no reason not to use VIM instead.

Then once I got used to all the keybindings and I adjusted them a bit to fit my workflow I got hooked. Now I can barely work with “normal” text editor. I spent some time to learn touchtyping and now I am getting really irritated when my fingers have to move out of the home row of the keyboard. VIM helps a ton with this. I even added a plugin for Firefox called vimium so I can control my browser with vim key bindings (its not ideal, but its something)

Train yourself

You really need to teach yourself out of the habit of using arrow keys. In my experience this wont happen until you just disable the arrow keys. Just put this in your .vimrc


Plugin manager

First we are going to start with the plugin manager. I prefer using Vundle, one you set it up it is really easy to work with. You have other options like Pathogen or vim-plug. It doesn’t matter so much which one you choose, just pick one.


I am going to share with you just the essentials.

vim-javascript adds better syntax highlighting, but if you are writing code for nodejs

vim-node will give you better support for “gf” (go to file) and “gd” (go to definition), etc.

php-vim will get you started with PHP

YouCompleteMe will give you great autocompletion.

NERDTree will give you the file browsing capabilities that you need. At first I was using it in separate window left of window where I edit code in more classic IDE fashion, but soon I realized that I don’t really need to stay there all the time. Now I use it only when I want to open new file. Pay attention that this plugin is way more powerful than it initially seems. You can create new files/folders with “ma” or delete them with “md”. Just open nerdtree by either typing “NERDTree” or just “:e .” and hit “?” to see the full list of options.

BufExplorer gives you a list of all open buffers so you can easily navigate between them. I have mapped it to <leader>w so I can easily see everything when I have a lot of files opened.

WinTabs is an excellent plugin that will represent all the open files as tabs that you can easily switch between. Your right hand is sitting on keys J – ; and your left on A-F. VIM already usese HJKL for navigation, so it came natural to me to map :WintabsNext to <leader>f and :WintabsPrevious to <leader>a.

ALE or Asynchronous Lint Engine is amazing plugin that lets you integrate linter like eslint or php-cs-fixer with VIM. You get all the best features from the linters that you choose plus automatically fixing your code when you have. No more unformatted code, no more mixed tabs and spaces, no need to come up with excuses why you have used double instead of single quotes.

ack.vim is a plugin that lets you search for text in your project’s files. I personally chose to configure it to work with the_silver_searcher which is much faster. Just type something like Ack @todo and you will get a list of all files that contain this string.

Ctags is the way to navigate inside your code and there are several options that you can choose from, but I really like vim-gutentags. It kind of just works. Just install ctags then the plugin and you are done. I find this one most useful for PHP.

phpactor is where it gets serious. It gives you very nice features like automatically adding “use Whatever/Class/You/Need”. You can see where is your class used, it adds code navigation, jump to definition, refatoring functions, etc. I basically can’t write PHP without this plugin.


Bonus Tips

One of the best things that I have done is remapping my <leader> key to space

The default leader key is “\”, but this just adds too much stress to my right pinky finger and after a while it just hurts. Thumbs are much tougher. Moving to my tab to the right is <space>f, to the left <space>a. It made everything so much easier for me.


I hope I was being helpful. Explore and experiment. I will try to add my dotfiles soon.

Кой е собственик на страничните ми софтуерни проекти ?

Блогът на Joel Spolsky ме насочи към една дискусия, където обсъждат доста интересен въпрос – Кой е собственик на страничните ми софтуерни проекти ?

Ако не програмирате просто за да изкарвате пари, а намирате някакво странно удоволствие в това, вероятно вечер след работа драсвате по някой друг ред код по ваш собствен проект или пък по някое open source приложение, което ви е интересно.
От тук нататък има два варианта:
– вие си кютате спокойно и никой думичка не ви казва
– някой решава, че това не е много хубаво.

Явно някои ръководители смятат, че ако след края на работния ден още можеш да направиш нещо различно, явно не си работил достатъчно през деня, тоест си се скатавал във времето, в което те са ти плащали да твориш код. Други очевидно са на мнение, че ще им откраднеш уникалния софтуерен продукт и ще се наложи да се борят за частица от милионите ти. Трети пък просто не искат да се занимаваш с програмиране извън работа – трябва вечер да спиш, да гледаш телевизия и на следващия ден бодър да се появиш на работа в 8:00 или колкото там кошмарно рано трябва да ходиш на работа.
Причините са много, най-честата реакция е само една – всичко което правиш в или извън работно време е собственост на компанията, за която работиш. Разбира се не всички го правят, но тези които искат да са поне малко правно подсигурени, си правят труда или да добавят в договора някоя друга точица или мило да ви помолят да подпишете декларация на лоялност, конфиденциалност и други ..ост.

Основната причина за това е, че по дефиниция всяко интелектуално “благо”(да се надяваме, че е такова) създадено от теб е твоя собственост и това, че някой ти е платил да го направиш не променя този факт. Тоест Пешо може да напише някоя програма за Иван, но това не означава че Иван става нейния собственик, той просто си я ползва.
За това има просто решение – записваме в договора, че програмиста отстъпва или продава или каквото там се сетите, правата си над продукта на неговия работодател.

Но и това не стига.
Както някои обясни и в по-горе посочената дискусия, възможен е следния сценарии: Наемат ви като гейм дизайнер във фирма и вие всеки ден правите игри от 9 сутринта до 6 следобед. Но в един момент ви идва на ум, че искате 40% от собствеността върху крайния продукт защото набързо сте пресметнали, че точно такъв процент от мисловната ви дейност е протекъл извън работно време.
Дори на пръв поглед да изглежда радикално, все пак е логично Иван да отиде при Пешо и му каже – Виж какво, на ясно съм че изобретяването на нещо не може да става само между 9 и 6, и няма как да който и да било да докаже в колко часа си изобретил въпросното нещо,  искам всичките ти изобретения, независимо кога си ги изобретил и ще си платя за това.

До тук нещата са точни и ясни. Но ако един ден работника реши, че иска извън работно време да си напише някакво софтуерче за собствена употреба и то ли е собственост на компанията, за която работи ? На теория  – да. Това е и неприятната част, защото фирмата, за която работя няма никакво отношение към въпросния софтуер.
За предпазване от подобни ситуации идват безброй клаузи, които се отнасят до това дали софтуера, който си писал е конкурентен на софтуера, който предлага компанията, дали е в същата сфера, дали си използвал технологии разработени във фирмата и т.н. и т.н.

Винаги обаче закона, съответно договорите, подлежат на тълкуване. Всеки може да извърти всичко така че … моя съвет е да не задълбавате много в тези неща.

Когато започнах на предишното ми работно място си дойдох с едни библиотеки писани от мен. Докато работех там съм ги използвал в един-два продукта. Също така в работно  време съм правил промени по библиотеките – добавял съм функционалност, оправял съм бъгове, защото са зависели от работата ми. След като си тръгнах от там си взех последните версии и продължих да си ги ползвам. Имам ли право на това ?
Въпреки, че технически поне пачовете на тези библиотеки би трябвало да не са моя собственост …. общо взето на никой не му пука.  По същата логика аз бих могъл да ги съдя за собственост върху всеки техен продукт, който съдържа въпросните библиотеки.  Знам, че никой няма да тръгне да се заяжда за нещо такова.
Смятам че 90% от работодателите (за които бих работил) ще са на същото мнение стига страничната ми работа да не влияе на основните ми задължения.

Нека обаче сериозно да се разграничим от случая, в който аз вземам код на компанията (макар писан от мен) и го използвам за да пусна мой продукт, който има нещо общо с дейността на фирмата. Смятам го за нелоялно и тогава, мисля с право, всеки ще си има съдебни проблеми.

Странното на този казус е, че въпреки че е решен законово, уж ясно, все пак последната дума си остава на работодателя и на неговата преценка дали правите нещо нередно. Ако смятате, че има такъв шанс, говорете с мениджъра си и му обяснете ситуацията. Ако не – давайте пряко през лехата – харесайте си нещо приятно за правене и творете.