Как стать автором
Обновить
0.66

Говнокод

Код, за который должно быть стыдно

Сначала показывать
Порог рейтинга

Я устал от форматирования JSON файлов

Я много и часто просматриваю JSON-файлы: от конфигураций сервисов до API ответов и логов. Каждый раз, открывая очередной файл, я форматирую содержимое, чтобы было удобнее читать (ведь JSON не только machine-readable, но и human-readable). И каждый раз я грущу, что все сервисы (онлайн, встроенные средства IDE и даже плагины) предоставляют лишь две крайности: форматировать всё или ничего (минифицировать в одну строку).

Но что, если я хочу отформатировать JSON лишь до определённого уровня? Что, если у меня есть огромный список словарей (возможно, даже глубоких), который при форматировании выглядит как-то так:

[
    {
        "id": 1,
        "name": "Alice",
        "birthday": {
            "day": 5,
            "month": 4,
            "year": 1983
        }
    },
    {
        "id": 2,
        "name": "Bob",
        "birthday": {
            "day": 6,
            "month": 2,
            "year": 1945
        }
    },
    {
        "id": 3,
        "name": "Eve",
        "birthday": {
            "day": 10,
            "month": 11,
            "year": 1978
        }
    }
]

Что, если я хочу оставить каждый словарь в более компактном (не совсем минифицированном) виде? Например, таком:

[
    {"id": 1, "name": "Alice", "birthday": {"day": 5, "month": 4, "year": 1983}},
    {"id": 2, "name": "Bob", "birthday": {"day": 6, "month": 2, "year": 1945}},
    {"id": 3, "name": "Eve", "birthday": {"day": 10, "month": 11, "year": 1978}}
]

Или я хочу, чтобы в каждом словаре развёрнуты были только внешние ключи?

[
    {
        "id": 1,
        "name": "Alice",
        "birthday": {"day": 5, "month": 4, "year": 1983}
    },
    {
        "id": 2,
        "name": "Bob",
        "birthday": {"day": 6, "month": 2, "year": 1945}
    },
    {
        "id": 3,
        "name": "Eve",
        "birthday": {"day": 10, "month": 11, "year": 1978}
    }
]

Да, многие текстовые редакторы вроде Sublime Text или VS Code дают возможность свернуть контент до определённого уровня. Но что, если я хочу оставить файл в этом промежуточном виде и просматривать его прямо в терминале, подключившись по ssh? Или я хочу посмотреть файл на гитхабе с телефона? Да, возможно, мои вкусы весьма специфичны, но в существующих реалиях я вынужден грустно довольствоваться лишь полностью развёрнутым вариантом (или делать это вручную). Встроенные средства форматирования JSON в JS или Python также не предоставляют простой возможности ограничить глубину (либо я так и не научился их готовить).

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

Да, он вряд ли подойдёт, чтобы редактировать на лету гигантские JSON файлы. И он уж точно не пытается стать убийцей какого-либо из существующих онлайн сервисов. В первую очередь он призван решить мою проблему: сделать форматирование JSON чуточку более управляемым. А если и вы сталкивались с подобной проблемой, буду рад, если сервис поможет и вам!

Теги:
+7
Комментарии0

Привет, развил тему пропихивания стручков (pod'ов) в кубернетис, добавил в меню выбора типа объектов команду apply. Теперь kui'ем можно приклеивать мYAMLики, создавая любые типы объектов. По умолчанию предлагает создать стручок:

создай свой стручок
создай свой стручок

Но с помощью кнопки edit можно изменить мямлик, изменения сохранятся в файл ~/.kyml.

С удивлением обнаружил что хаб Кодобред переименован в Говнокод О_о Чтож, так даже интереснее.

Творите, выдумывайте, пробуйте!)

Теги:
0
Комментарии0

Привет, приспичило создать тестовый стручек (pod), проверить кое-что. Создал и добавил это в kui, в секцию "быстрых" команд:

добавь свой стручек
добавь свой стручек

Тестовый стручек создается вот такой командой:

kube run $quick_pod_name $ns --image=$quick_pod_image --command -- $quick_pod_command 2>&1

Для изменения названия, образа или команды стручка подредактируйте вот эти переменные в начале скрипта:

quick_pod_name=busytest          # Pod name for simple test pod
quick_pod_image=busybox:1.32     # Pod image for simple test pod
quick_pod_command="sleep 3600"   # Pod command for simple test pod

Творите, выдумывайте, пробуйте!)

Теги:
0
Комментарии0

Привет, зачастую после тыкания в какой-нибудь стручок (pod) приходится подниматься на уровень выше в деплой, стейтфулсет или даемонсет. Для этого в kui надо было сначала посмотреть чем контролируется стручок, сделав describe, потом сменить тип объекта, найти нужный... Хватить теребонькать эти стручки! Добавил для стручков команду Controlled by, она сразу тыкает kui в нужное место!

controlled by
controlled by

Творите, выдумывайте, пробуйте!)

Теги:
Рейтинг0
Комментарии0

Привет, долгожданные новости из мира кубернетиса. Иногда надо посмотреть за подиками, как они там живут поживают, все ли (ре)стартанули или кто завис. В kui для этого сделана кнопка RELOAD. Но постоянно жмякать кнопку это же дро...во какое-то правда? Хватит это терпеть! Добавил команду watch it, теперь можно залипнуть на какое-то время, глядя как подики ползают туда-сюда.

watch it
watch it

Оно будет с паузой в 3 секунды (+ время на обновление) постоянно показывать вывод kubectl get ...

NAME                      READY   STATUS    RESTARTS   AGE
chi-cluster-dev01-0-0-0   2/2     Running   0          23d
chi-cluster-dev01-0-1-0   2/2     Running   0          23d
chi-cluster-dev01-0-2-0   2/2     Running   0          23d

Press x to stop watching this...

Нажмите x когда надоест.

Творите, выдумывайте, пробуйте!)

Теги:
Рейтинг0
Комментарии0

Бинго разработчика: ставь лайк зачеркивай, если было

В выходные не работаем, но развлекаемся, поэтому предлагаем вам сыграть в бинго разработчика! Правила — простые:

  1. сохраняйте/делайте скрин картинки из поста;

  2. отмечайте клеточки с вашей разработческой жизой;

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

Ждем того, кто соберет все ачивки!

А как закончите с бинго — в нашем TG‑канале есть еще одна занимательная игра с кубиком и картами инженерного таро, которые предскажут ваше будущее! Переходите по ссылке и развлекайтесь, на канал тоже подписывайтесь, там часто бывает всякое интересное.

Теги:
Всего голосов 22: ↑21 и ↓1+20
Комментарии1

Привет, все знают(?) что данные в скрипт можно передать через аргументы, как-то так:

$ cat test
#!/bin/bash
var=$1
echo $var

$ ./test bla
bla

Но в какой-то момент аргументов становится слишком много, а так чешется всунуть что-то еще)
Куда всунуть? Как? В каком порядке? Сначала сунуть это, потом то? Городить гетопс?
В этом случае бывает удобно использовать переменные окружения!

$ cat test
#!/bin/bash
var1=$1
var2=$2
var3=$3
var4=$4
var5=$5

echo $var1 $var2 $var3 $var4 $var5 $one_more_var

$ one_more_var=ble ./test
ble

Творите, выдумывайте, пробуйте!)

Теги:
Всего голосов 3: ↑2 и ↓1+3
Комментарии3

Привет, иногда хочется утащить из скрипта переменные или функции. Это можно легко сделать используя source. Но есть заковыка. Скрипт-источник будет выполнен, что не всегда удобно. Пример:

$ cat test
#!/bin/bash

var1=bim
var2=bom

echo you should not see this $var1 $var2

Пробуем засорсить:

$ var1= var2=; . ./test; echo $var1 $var2
you should not see this bim bom
bim bom

Мы получили вожделенные переменные но при этом выполнился нежелательный код. Как этого избежать? Можно немного модифицировать скрипт:

$ cat test
#!/bin/bash

var1=bim
var2=bom
[[ $1 == only_vars ]] && return
echo you should not see this $var1 $var2

Теперь если сорсить скрипт с параметром only_vars, нежелательный код будет опущен, пробуем:

$ var1= var2=; . ./test only_vars; echo $var1 $var2
bim bom

Важно использовать именно return, exit закроет текущую оболочку.

Творите, выдумывайте, пробуйте!)

Теги:
Всего голосов 2: ↑2 и ↓0+3
Комментарии1

Привет, когда смотришь логи подов через kubectl и вдруг у пода оказывается несколько контейнеров, kubectl logs ... завершается ошибкой:

error: a container name must be specified for pod pod-name-0, choose one of: [...]

Хватит это терпеть! Мой kui идет на помощь! Добавил команду logs all она показывает логи сразу всех контейнеров без необходимости выбора!

смотри все логи сразу
смотри все логи сразу

Творите, выдумывайте, пробуйте!)

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Привет, все знают как прочитать содержимое файла в линукс терминале(?), для этого используется cat:

$ cat file
one
two
three

Но иногда возникает необходимость прочитать файл с конца, задом наперед. Как это сделать? Tac!

$ tac file
three
two
one

Для тех кто в танке tac это cat наоборот.

Творите, выдумывайте, пробуйте!)

Теги:
Всего голосов 6: ↑6 и ↓0+7
Комментарии0

Привет! Подкрутил немного анимацию spinner'а, теперь выглядит так:

бынь-бынь
бынь-бынь

Spinner - это небольшой скриптик чтобы заполнить пустоту экранного пространства во время работы какого-нибудь долгого процасса, не выводящего ничего. Работает как-то так:

$ ./spinner sleep 5

Please wait [0:0:3] (* )  ( *)

Ну и оно там вот так пульсирует, быньк-быньк)

Творите, выдумывайте, пробуйте!)

Теги:
Всего голосов 10: ↑10 и ↓0+15
Комментарии0

Привет, часто в скриптах встречаю бесполезное использование кавычек, вот такое вот:

var_b="$var_a"
var_c="$(...)"

Понятно с какой целью это делается, типа вдруг дам пробелы и оно сломается, давайте посмотрим сломается или нет:

$ echo $var_a
1 2

$ var_b=$var_a
$ echo $var_b
1 2

$ var_c=$(echo 3 4)
$ echo $var_c
3 4

Вроде не сломалось и без кавычек все прекрасно уместилось в переменные.
Кавычки нужны только для "склеивания" данных или переменных:

$ var_a="1 2"
$ echo $var_a
1 2

#а без кавычек:
$ var_a=1 2
2: команда не найдена

#и с переменными:
var_a="$var_b $var_c"

#без кавычек:
$ var_a=$var_b $var_c
3: команда не найдена

Творите, выдумывайте, пробуйте!)

Теги:
Всего голосов 2: ↑1 и ↓10
Комментарии4

В заросшей репе есть очень грязный код
Забыт в нём SOLID, и не понять подход
Сказать я пытался: «Профанов нету в гите»
Но тут же раздался противный голос в мите
Голос в мите

«Мне больно видеть чистый код, пишу сплошной огромный баг
Я очень много лет хочу чтоб невозможен был дебаг
Мне некомфортно в чистоте, и я мечтаю об одном:
Скорее SOLID разнести, раздуть свой старый жирный код
Проклятый старый код»

Жил былдокодер, тупой и жутко злой
Никто не вспомнил о нём зимой дебажной той
Коллеги не стали его клинкоду учить
Макбуки достали, решили сами чинить
Глюки и баги

«Мне больно видеть чистый код, пишу сплошной огромный баг
Я очень много лет хочу чтоб невозможен был дебаг
Мне некомфортно в чистоте, и я мечтаю об одном:
Скорее SOLID разнести, раздуть свой старый жирный код
Проклятый старый код»

И эту репу стороной обходит айти люд
И суеверные твердят: «Там ламеры живут»

Теги:
Всего голосов 6: ↑3 и ↓3+2
Комментарии1

Ближайшие события

Привет, небольшой апдейт для kui

delete cronjob
delete cronjob

Добавил команду удаления для кронжобов.

Творите, выдумывайте, пробуйте!)

Теги:
Всего голосов 3: ↑3 и ↓0+5
Комментарии0

Глаза превращаются в...

info-bar
info-bar

Использую такую штуку в терминале info-bar о которой я писал тут, инфо бар показывает git status, если $PWD содержит папку .git. Сегодня занимался с репами, крутил вертел по разному, в какой-то момент вкладка терминала зафризилфсь. Оказалось что info-bar плохо переносит большое количество информации от git status

$ git status -sb | wc -l
9451

Пришлось ограничить вывод 50 строками, теперь так:

git_sts_depth=50
...
git -c color.ui=always status -sb | head -$git_sts_depth

Заодно смердил в мастер новую версию в которой глаза заменены на, эм, ну увидите)

Творите, выдумывайте, пробуйте!)

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии3

Наткнулся на такой вопрос на SO Как передать строку из функции в переменную? В баше переменные по умолчанию глобальные, просто используйте этот факт:

fun1(){
  var1=$1
}

$ fun1 test
$ echo $var1
test

Но если сильно зудит можно попробовать что-то типа такого:

fun2(){
    local var_name=$1; shift 1
    printf -v $var_name '%s' "$@"
}

$ fun2 v2 some data
$ echo $v2
somedata

Или используя read вместо printf:

fun3(){
    local var_name=$1; shift 1
    read $var_name <<< "$@"
}

$ fun3 v3 some data
$ echo $v3
some data

Творите, выдумывайте, пробуйте!)

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Зачем я перевернул календарь?

Песня "3-е сентября" стала знаковым культурно-социальным явлением, на юбилей песни решил добавить в piu-piu знаменитый куплет целиком. Пришлось немного повозиться c переделкой но в итоге получилось добавить новый функционал не сломав старый. Теперь текст для рекламных самолетов можно задать как переменной так и массивом. Каждый следующий самолет будет выводить новую строку текста из массива по кругу.
Я календарь переверну...

Творите, выдумывайте, пробуйте)

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Мониторинг в терминале?

Буквально за 15 минут собрал демку для просмотра алертов tenis'а с помощью bashui.
Я использовал "быструю" функцию для создания меню (таблиц). Подробней про эту функцию можно почитать тут. Кнопки бутафорские просто для иллюстрации)

Творите, выдумывайте, пробуйте!)

Теги:
Всего голосов 2: ↑2 и ↓0+4
Комментарии2

Программист из Индонезии разработал небольшой шуточный проект GitHub Profile Roast. Как следует из употреблённого в разговорном оттенке слова «roast» в названии, целью сервиса является творчески и с шутками оскорбить пользователя, максимально используя для этого личные детали. Делать это сервис пытается на основе аккаунта GitHub.

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

Сервис работает на английском и французском языках, а также на нескольких неевропейских, популярных в Юго-Восточной Азии (хинди, индонезийский, корейский, японский, китайский). Русского в этом списке нет.

Работает это всё через доступ к API компании OpenAI. Какой-либо умной защиты промпта нет. Как продемонстрировали в микроблогах, провести инъекции в промпт было относительно легко.

Из других любопытных наблюдений: сервис отказывается работать с некоторыми профилями. Среди замеченных в подобном Линус Торвальдс (имя пользователя torvalds) и часть аккаунтов компаний, к примеру, Microsoft и Google. Вместо череды колкостей сайт выдаёт вежливый отказ оскорблять этого пользователя. Возможно, это некий чёрный список, который автор сервиса заложил, чтобы сохранить механическую целостность фронтальной части своей головы.

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии6