Минутка просвещения

Читать в телеге. Когда-то там были посты не только от меня.

Почему функциональное программирование не распространено

Отличный доклад про историю популярных сегодня языков и как мы пришли к тому, что в топе ООП-языки, а функциональное программирование — не мейнстрим. Кто хочет сразу суть и ответы — можно начать смотреть с 40:00.

СсылкаКомментировать

Права и символические ссылки

Если вы хотите сменить права на символическую ссылку, то надо использовать флаг -h для chown:

$ mkdir target
$ ln -s target symlink
$ stat -c "%U %F %N" *
ov7a symbolic link 'symlink' -> 'target'
ov7a directory 'target'
$ chown nobody symlink
$ stat -c "%U %F %N" *
ov7a symbolic link 'symlink' -> 'target'
nobody directory 'target'
$ chown ov7a symlink # ops, lets rollback
$ chown -h nobody symlink # retry with -h flag
$ stat -c "%U %F %N" * 
nobody symbolic link 'symlink' -> 'target'
ov7a directory 'target'
СсылкаКомментировать

Задержка между нажатием клавиши и появлением символа на экране

https://danluu.com/input-lag/

В статье довольно неплохо описано, почему у старых компьютеров она меньше, чем у современных. Рекомендую почитать.

С одной стороны понятно, что куча абстракций и унификация стоят того. С другой — жаль, что почти везде выгода и скорость разработки сейчас важнее эффективности.

СсылкаКомментировать

Перенаправление портов

Способов сделать это - тьма тьмущая:

  1. Настроить firewall - iptables, ufw, firewalld,... тысячи их! Обычно инструкция не всегда простая, надо курнуть манов.
  2. Если дело происходит на маршрутизаторе - то обычно есть встроенные средства (и GUI тоже).
  3. Haproxy и прочие решения для балансировки нагрузки. Сейчас такое даже в Spring есть встроенное.
  4. nginx, apache и прочие продвинутые веб-сервера.
  5. ssh. Например, так: ssh -L 80:target_server:80 gateway_server. Чего он только не умеет... Кстати, в одном из проектов этот способ был весьма удобен для отладки взаимодействия с базой, к которой не было прямого доступа.
  6. Консольные утилиты. Например, так: socat TCP-LISTEN:80,fork TCP:target_server:80.
  7. В каком-нибудь docker'е это задается на уровне конфига. В kubernetes команда port-forward делает проброс порта к поду.
  8. Ngrok. Вы ставите себе утилиту на комп и она вытаскивает наружу веб-сервер с localhost. Типа чтобы демки сайтов заказчику показывать. Звучит как эксплоит, да и исходников нет... -_-

И наверняка этим список не исчерпывается.

СсылкаКомментировать

Навигация по коду в Github

Github в ноябре добавил навигацию по коду: переход к функции в файле, переход к определению, поиск использований. Прикольная штука, жаль только поддерживаются далеко не все языки, только всякие попсовые типа Javacript, Go и Python. Примечательно, что библиотека для поддержки этого, semantic, написана командой Github на... Haskell.

СсылкаКомментировать

Значение по умолчанию minimum_should_match

Какой будет minimum_should_match в bool_query, если его не указать? Вроде как 1, но на самом деле - фигушки, если рядом есть must, то это 0:

В документации к версии 6.8 пишут:

If the bool query is a filter context or has neither must or filter then at least one of the should queries must match a document for it to match the bool query. This behavior may be explicitly controlled by settings the minimum_should_match parameter.

В версиях 7.0 - 7.4 про это не было сказано. Вообще. Хорошо хоть в 7.5 сделали отдельный раздел про этот параметр, где написано короче, но яснее:

If the bool query includes at least one should clause and no must or filter clauses, the default value is 1. Otherwise, the default value is 0.

Благо elasticsearch - опенсорс и можно посмотреть, почему такое безобразие произошло с документацией: вот ее удалили, и только через год вернули.

СсылкаКомментировать

Работа со временем

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

И продолжая временными зонами:

Причем даже крупные компании не всегда все могут сделать правильно. Из недавнего - Apple фигово показывает календарь:

И наконец, большой список заблуждений про время: https://infiniteundo.com/post/25509354022/more-falsehoods-programmers-believe-about-time

СсылкаКомментировать

GitHub Pages

Многие знают, что на гитхабе можно хостить статические сайты. Однако вряд ли всем известно, что там из коробки идет генератор статического сайта — Jekyll. Идея довольно прикольная: выбрал тему и/или задал несколько шаблонов, а потом клепаешь посты в markdown, не парясь о разметке и всем таком. Запушил посты в GitHub — и они уже опубликованы.

Однако есть нюансы. Как только надо что-то сделать что-то нетривиальное, приходится "преодолевать". Например, я столкнулся со следующими проблемами:

  1. На GitHub Pages белый список плагинов, а некоторые встроенные - не очень (например, пагинация работает только для одного раздела). Это можно решить, генерируя сайт на своем компе, но тогда теряется все удобство использования связки jekyll и GitHub.
  2. В шаблонизаторе Liquid нет логического отрицания. Там есть конечно конструкция unless, дополняющая if, но какое-нибудь (a && !b) || (!a && b) там фиг выразишь. При этом and и or есть.
  3. Иногда парсер markdown ломается, особенно если его перемешать с html-тегами. И где-то для этого используются регулярки, судя по исключениям, которые я ловил.

И еще была пара мелочей. Несмотря на это, копаться в этом было занимательно, у меня даже что-то получилось. Идея мне нравится, это правильный web в моем понимании, когда для статической инфы у тебя статический сайт, а не 10 Гб node-js модулей и не какое-нибудь адище. И клево, что контент почти полностью отделен от представления (этим мне еще Latex нравился). Но с точки зрения кода из-за ограничений GitHub Pages и jekyll получилось конечно классическое.

СсылкаКомментировать