Pull to refresh
109
0
Евгений Артюхов @jsirex

User

Send message
Да, понимаю, но вторая команда у меня тоже не вызвала в итоге '[', хотя я явно указал её.
Ну, тут есть всякие интересные моменты.

Когда я пытаюсь смотреть внутрь я вообще не вижу попытки обращения к '[' (программе). Возможно, дело в современном баше или я пользуюсь strace-ом неправильно, но

╭─sirex at sirex-notebook in /tmp 21-06-01 - 14:12:35
╰○ cat test.sh
#!/bin/bash

if [ -n "FOO" ]; then echo FOO; fi
/usr/bin/\[ -n FOO \] && echo ok
╭─sirex at sirex-notebook in /tmp 21-06-01 - 14:12:39
╰○ strace bash test.sh 2>&1 | grep stat | grep /bin
stat("/home/sirex/.cargo/bin/bash", 0x7ffd9304a900) = -1 ENOENT (No such file or directory)
stat("/home/sirex/.local/bin/bash", 0x7ffd9304a900) = -1 ENOENT (No such file or directory)
stat("/home/sirex/.cargo/bin/bash", 0x7ffd9304a900) = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/bash", 0x7ffd9304a900) = -1 ENOENT (No such file or directory)
stat("/usr/bin/bash", {st_mode=S_IFREG|0755, st_size=1234376, ...}) = 0
stat("/usr/bin/bash", {st_mode=S_IFREG|0755, st_size=1234376, ...}) = 0
stat("/usr/bin/bash", {st_mode=S_IFREG|0755, st_size=1234376, ...}) = 0
stat("/usr/bin/bash", {st_mode=S_IFREG|0755, st_size=1234376, ...}) = 0
stat("/usr/bin/bash", {st_mode=S_IFREG|0755, st_size=1234376, ...}) = 0
stat("/usr/bin/bash", {st_mode=S_IFREG|0755, st_size=1234376, ...}) = 0
╭─sirex at sirex-notebook in /tmp 21-06-01 - 14:13:00
╰○ bash --version
GNU bash, version 5.1.4(1)-release (x86_64-pc-linux-gnu)


Может, Баш неявно и услужливо преобразовывает вызов [ в нативный для себя вариант…
Это, конечно, не отменяет того, что лучше прочитать мануал и сделать наверняка правильно.
Тогда продолжу:
DevOps — это как подростковый секс: не знают что это такое, читали и видели в Интернете, хвастают друзьям, что уже делали девопс и почти лучшие в этом.
С оговоркой на то, что в пределах минорных версиях всё совместимо, но всё же вот что скажу:

Если вы «замораживаете дистрибутив» (зеркало), то у вас есть согласованность и стабильность. Но как же обновления безопасности в ентерпрайзе? правильно. их будут накатывать, т.е. дистр уже незамороженный. ставите какой-нибудь пакет, а он уже собран с другими версиями библиотек. В целом, благодаря semver и аккуратности, оно, как правило, не ломается. но всё же.

Или тот же докер. Вот банальная задача — собрать контейнер с postgresql и 5 extensions. Постгрес нужен определённой версии и лезем на postgresql.org. ставим оттуда. Оно том с какими-то версиями собрано. А поддержка ldap включили? да. ок, openssl/gcc/anything. Ок. ставим extensions. 2 в стоке были, а какой-нибудь сторонний? с чем он там собран? он точно под именно 12.6 постгрес собран? или 12.3? наверное будет работать. но это не точно. а если под 11 собирали. А ещё один придётся собирать самому. Ок, прошло время, разобрались, сделали классный докер файл. Поправили entrypoint.sh в последней инструкции. Вроде бы заново собрать не надо? а на ci ноде может и не быть кэша, а значит пересоберёте. А что вы пересоберёте? точно не то что было, т.к. много воды утекло.

Питон? ставит пакетизированным способом apt|yum install python-pip-whatever или сами pip install. А если native extension который собрать надо?

Это я всё к чему? Современная разработка более хрупкая, чем кажется. И слово «ентерпрайз дистрибутив» вас не сильно спасает. Т.к. чудо не случится. там сидят такие же, ну или немного более опытные разработчики. И они точно так же борются с возникающими проблемами и обещают вам что «ну должно работать, а если что мы быстро поправим». И становится очевидно, что хочешь-не-хочешь, а разбираться в этом всём нужно довольно глубоко.
Что-то начинает напрягать реклама в которой ещё есть и hello-world статья.

Пора и мне на хабре написать:
Название: Основы программирования за 5 минут
Текст:
Давайте выведем 2+2:
echo "2+2 = 4"

Ну вот, мы научились. Да, тут есть что улучшить, но купите наши вазелиновые шарики всего за 9.99. первым 100 000 покупателей скидка 2 копейки.
Я бы поспорил насчёт дизайна гита, но речь не об этом. Это был всего лишь случайный пример, где надпись на кнопке не так однозначна, как может показаться.
GUI часто бывает неоднозначен, запутан. В то время как консольная команда чаще будет иметь однозначное поведение.

Вот надо вам сделать в git-e soft reset на 2 коммита назад. Открываем gitk, лазим по меню, там ничего нет. тыкаем на коммит, ничего нет, догадываемся (как?) что можно нажать правой кнопкой и там выпадет «Reset master branch here». Reset — это hard reset или soft reset? Рискуем? А если мне надо другую ветку? Как выбрать?

Или вот сижу в firefox и думаю поменять страницу по-умолчанию. А где собственно? И надо бегать по меню перебирая все пункты и гадать, куда же это могли «засунуть». Предполагать, что может это в preferences. А где там дальше искать?

Да, может примеры выше — не самые хорошие, кто-то скажет: «А вот у меня в %PROGNAME% всё понятно». Но уверен, каждый не раз сталкивался с тем, что шарил по GUI в поисках нужного действия.

В Windows: правой кнопкой по файлу или папке -> копировать. Ииии… ничего не происходит. Так видит мир тот, кто не знаком с концепцией ctrl+c/ctrl+v. А крестик справа вверху программу не закрывает.

И даже в вашей любимой IDE наверняка есть кнопка «поискать кнопку, чтобы выполнить команду» по тексту этой команды. Только эту «кнопку поиска» надо тоже поискать. Например, сортировка строк.
Тут уже многие высказались, но не смог пройти мимо.
Если правило придумали, значит оно нужно было. Если кому-то кажется, что правило безсполезно, то, он может просто не знает где оно нужно?

В конце каждого файла должен быть перевод строки. А если не будет, то кто умрёт?

Многие Linux дистрибутивы поумирают. И многие программы сломаются. Конфиги часто разбиваются на отдельные файлы и складываются в /etc/что-нибудь.d/ и дальше обычной склейкой генерируется полный конфиг.
Или если есть препроцессинг исходного кода (в случае объединения файлов).
У меня на реальном java-проекте ребята имели 10+ properties файлов, которые объединялись в разных комбинациях. И в каждом файле в конце стояли дурацкие коменты «оставьте здесь пустую строчку». Пустая строка, кстати, не нужна, если бы разобрались в проблемах

Нельзя делать несколько statements на одной строке. Если я напишу $x = 1; $y = 1; $z = 1;, то читабельность ухудшится на 0.00001% и можно закрывать техотдел?

Давайте быть честными. Не «x y z», а
«size_t keyword_scan_len = GetScanKeyword(h, keywords); size_t keyword_scan_index = 1; TYPE *pi = (TYPE *)(void *)(parmi)». А когда прелетит изменение в этой строке, надо ещё всматриваться и искать, что конкретно поменялось? index? pi? len? А еслиGetScanKeyword надо было после поставить? Даже если есть строгая практика отделения объявления от присвоения, всё равно, названия переменных и их типов могут быть многобуквеннымми, а их значение константой " int c = THE_SEVENTY_EIGHT_PRIME_NUMBER".

Declare statements MUST contain no spaces and MUST be exactly declare(strict_types=1). Ох, как всё серьёзно. Ни одного пробела, причем слово MUST капсом, чтобы все понимали степень ответственности. Если вставить где-нибудь пробел, то на код ревью никто код же прочесть не сможет!

Ещё и от языка зависит. Где-то у вас не распарсится просто, а где-то не будет работать на рантайме или того хуже, будет втихую работать неправильно.

— Современные ide оснащены автоформатированием кода и если не будет стандарта во всём, то каждый коммит будет порождать тонны мусора.
— Когда оформление стандартизировано, я могу выполнять массовые исправления кода (по паттерну), рефакторинг в лоб и т.п.

Ну и наконец, вы подменили понятия. Не дресскод с людьми надо сравнивать, а с чем-нибудь таким же массовым или бумажным:
1. Представьте, что все официальные документы пишутся не от шаблона а от балды: заявление, договоры. А вы тут бухгалтер — разбирайтесь.
2. Вы купили 10 гаек на 12 но они все под разные ключи. А у некоторых не та резьба. А вы крутите эти гайки — наслаждайтесь.
3. Деньги печатаются в разных цветах, разных размеров и форм. И с разным расположением надписей. И вы работаете кассиром — добро пожаловать в персональный ад.

При строительстве кирпичного дома вы не хотите знать, что каждый кирпич — индивидуальность, личность и «он так себя видит». Вы обложите процесс изготовления кирпича максимальным набором правил. И неважных правил там не будет. Вы не станете проверять то, что не важно. Если правил слишком много и это доставляет хлопоты — то вы будете стремиться упростить проверку и сделаете процесс таковым, чтоб он легче проходил её.

Не понимаю, за что минусанули человека.
Как раз сам вышел на эту же проблему: cdn.github.com недоступен.
Пару месяцев всё работало и вот опять. Причём traceroute не проходит, а чистый tcp пропускает ack и syn. Остальное нет. И всё на белтелекоме обрывается. ByFly, Beltelecom, Mts.
но, позвольте! у вас тут три пробле… oh shit!!!
Для тех, кто не хочет читать статью целиком:

Линукс, терминал, курсы!
apt-get install -y xvfb

Ну купи
docker build .

Ну почти девопс уже ж… ну купи,
ну ннада
Думаю минусуют за грубость, а не за смысл
Ну это я ради объективности. Есть в гитлабе и хорошие стороны. Вон, дебиан же поднял себе salsa. Наверняка они много думали перед таким поворотом.

Меня от геррита останавливает только одно — кроме дженкинса не могу прикрутить никакого вменяемого ci (наподобии gitlab-ci или github actions). Кто бы подсказал как это сделать — уже бы ушёл на него.
Gerrit так и задумывался, чтоб работать над коммитами, а не над ветками.
Каждый коммит — логически законченное изменение.
Видеть в истории 50 коммитов «хождения по граблям» и потом «кусок говна, который ноканец-то заработал merged to master» — не очень приятное зрелище.
Увидеть 3 patchset-а в стиле «Add feature 1», «Add test for feature 1», «Update docs» — намного приятнее и проще ревьюить. У вас есть пачт или серия патчей. Всё.

Чего не хватает в gitlab ce:
1. Approves — плати
2. Auto Reviewers — если и есть — скорее всего плати
3. Проверка каждого коммита, а не ветки. На вопрос «зачем?» оставлю время подумать
4. Скорость ui — gitlab тормозит. Ну вот реально тормозит. Просто мы отвыкли уже от по-настоящему быстрых вещей
5. Сделал ревью, оставил комментарии. Пришёл новый пуш и все комменты outdated. Как было и как стало — иди ищи, открывай старое, вспоминай где оставил коммент, открывай новое, смотри как стало. Может доработают
6. Review имён файлов как?
7. Review commit message как?
8. Хуки и валидация commit-ов — плати/получи админские права на инстанс.

Но тут как сравнивать. Gitlab как code review system пока никакой.
Gerrit как project management system — тоже никакой.
Мониторинг вас не спасёт. Картинка будет такая:
1. всё хорошо, ни что не предвещало беды
2. всё хорошо, ни что не предвещало беды
3. всё хорошо, ни что не предвещало беды
4. Мы упали, ошибки, данные потеряны
5. всё хорошо, ни что не предвещало беды
6. всё хорошо, ни что не предвещало беды
Имею определённый опыт и взрастил уже много людей с джуна до уверенных сеньоров. Конечно, это их заслуга, кто хочешь/может — растёт.

Но вот что я вижу постоянно: человек сначала джун, уже через 3 месяца научился тыкать кнопку и хочет быть мидлом, а через полгода уже «ну когда сеньор и ЗП в $2500?». А вон Вася из конторы ХХХ умеет меньше, а уже сеньор и прочие радости.

И это большая проблема. Банально, запутались в SSL/TLS сертификатах, какой там куда? Где CA, где private key, куда dhparam класть и работа встаёт на 2 дня из-за глупостей и отсутствия базовых знаний. Научились в кубике ямл писать без понимая и любое нестандартное поведение — застряли на неделю.

Как это всё получается? Прочитал очень хороший пример про абстракции. Вот у нас есть железо, машинный код, над ним язык более высокого уровня, над ним ещё более высокого, над ним библиотека, над ней фреймворк, над фреймворком ещё IDE. Абстракции имеют свойство «течь», когда в 15% случаев поведение абстракции неожиданно.
// псевдокод
int main() {
  int fac = 1;
  for (int i=1;i<=10000000; i++) {
    fac = fac * i;
  }
  std::cout << fac; // почему не работает?
}


Имеем вероятность того, что написанная система будет работать 0.85^N (если 15% течёт, конечно), где N — количество абстракций. Прилага в кубике, которая ранает докер, который крутится на хосте, который ранает непосредственно бинарник, который на фреймворке, в котором куча библиотек, которые используют язык высокого уровня, которые интепретируются… ну да хватит. 0.85^8 = 0.2724905250390625 — вероятность, что будет работать без проблем.

И тут начинают сыпаться «сеньоры», которые просто проскочили базу. Всё меньше и меньше людей заглядывают под капот. А надо хотя бы на 2-3 абстракции вниз разобрать. А это в школах часто пропускается. И опыт показывает, что те, кто лазил под капот — быстрее и лучше понимают и решают проблемы.

Мне представляется кардио-хирург, который сделал надрез и дальше по-быстрому в инете гуглит, как там дальше.
Или зачем админу знать как на баше вывести предпоследнюю строчку, если можно на SO нагуглить?
А мне вот интересно, на сколько легальна «схема», которую я встречаю:
  1. Делаем некий тул bicycle
  2. Открываем это под opensource свободно
  3. Собираем коммьюнити, развиваем проект
  4. Пользуемся балагами сервисов, который предоставляют опенсорсным проектам плюшки бесплатно (ci/bugtracker/wiki/tools/etc)
  5. Покупаем торговую марку «My Bicycle» и вешаем на бинарники коммерческую лицензию.


Как результат: исходники вот они, все «белые и пушистые». Но как только ты эти исходники собрал — бинарник под лицензией. И тут тонкая грань, что сам по себе бинарник может и не быть под лицензией, но его имя — трейдмарк и просто так пользоваться этим нельзя. Толку от исходников, если на выходе «тыква»? Форкать и бегать sed-ом…
Я бы начал с того, что убрал гит из уравнения. У вас должен быть некий проект. Он живёт где-то в каталоге и как-то организован и понятен. Если внутри него есть какие-то фичи (которые являются полностью самостоятельными) — то они то же как-то лежат в этих папках. Всё. Если у вас 10 проектов — значит 10.

Теперь добавляем гит. Это как «вселенная проекта» — каждый коммит — состояние вселенное на определённый момент времени. Вы можете двигаться вперёд и назад по времени. Фича бранчи в данном случае — альтернативное состояние вселенной, которое не влияет на основную.

Когда большая команда разрабатывает проект, фича бранч создаётся, чтобы разрабатывать и проверять новую фичу, не мешая проекту. Если фича не стабильна, ломает всё или не совместима — можно продолжать её разрабатывать, в то время как основная ветка (часто master) выходит в прод. Предполагается, что каждая такая ветка рана или поздно будет «влита» в мастер. Т.е. в мастере будут все фичи, который условно стабильны.
В действительности ансибл вообще не декларативный.
Пример выше про «state=restarted» — это раз.
И любое действие — это императивный вызов, он просто с идемпотентностью в лучшем случае: поставь если не стоит, создай если нету и т.д. На ансибле ты не описываешь конечное состояние, ты пишешь «сделай а, сделай б»
И вот декларативный пример, который, конечно же не будет работать:
# псевдо-код
- service: httpd
  state: started
- package: httpd
  state: installed

Information

Rating
Does not participate
Location
Польша
Date of birth
Registered
Activity