И это всё МОЁ

В очередной раз при правке кода на питоне у меня пригорело от list comprehensions.


А вот что пишут настоящие живые люди, которых никто не заставляет под дулом пистолета:



I find the list comprehension much clearer than filter+lambda



Или:



Personally I find list comprehensions easier to read. It is more explicit what is happening from the expression [i for i in list if i.attribute == value] as all the behaviour is on the surface not inside the filter function.



Ну давайте посмотрим, как этот much clearer way выглядит in the wild. Как-то так:


    def getSupportedTrackers(self):
trackers = self.getTrackers()

if not self.site.connection_server.tor_manager.enabled:
trackers = [tracker for tracker in trackers if ".onion" not in tracker]

trackers = [tracker for tracker in trackers if self.getAddressParts(tracker)] # Remove trackers with unknown address

if "ipv6" not in self.site.connection_server.supported_ip_types:
trackers = [tracker for tracker in trackers if helper.getIpType(self.getAddressParts(tracker)["ip"]) != "ipv6"]

return trackers


Просто сплошной [blabla for blabla in blablas if ...blabla...].


Просто в начале каждой такой строки ты должен мысленно стирать кусок [tracker for tracker in trackers if и читать, что же там дальше. И как писал Роберт Мартин в «Чистом коде», любые конструкции, которые принуждают читателя тренироваться пропускать себя мимо глаз, являются источником скрытых ошибок. Пропустив 500 раз мимо глаз типовой фрагмент кода, на 501-й раз вы пропускаете ПОЧТИ такой же фрагмент, в котором содержится ошибка. И в силу одинаковой натренированности рефлексов у всех разработчиков продукта, эта ошибка может оставаться незамеченной годами.


Давайте посмотрим, как этот же код можно преписать на лямбдах на руби:


    def getSupportedTrackers():
trackers = @getTrackers()

if not @site.connection_server.tor_manager.enabled
trackers = trackers.filter {|tracker| not tracker.include? ".onion"}
end

trackers = trackers.filter {|tracker| @getAddressParts(tracker)}

if not @site.connection_server.supported_ip_types.include? "ipv6"
trackers = trackers.filter {|tracker| helper.getIpType(@getAddressParts(tracker)["ip"]) != "ipv6"}
end

return trackers
end


Уже стало лучше за счёт уменьшения количества бойлерплейта, который приходится пропускать мимо. Но 3 вызова trackers.filter подряд и два идентичных вызова getAddressParts говорят нам, что этот код надо переписать.


Заметьте, что необходимость рефакторинга для устранения дублирования не была очевидна в коде с list comprehensions, потому что они за своей многословностью и нечитабельным синтаксисом скрывают суть происходящего.


Убираем дублирование:


    def getSupportedTrackers()
tor_enabled = @site.connection_server.tor_manager.enabled
ipv6_enabled = @site.connection_server.supported_ip_types.include? "ipv6"

trackers = @getTrackers()

trackers = trackers.filter {|tracker|
if (not tor_enabled) and (tracker.include? ".onion";)
next false
end

address_parts = @getAddressParts(tracker)
if not address_parts
next false
end

if (not ipv6_enabled) and (helper.getIpType(address_parts["ip"]) == "ipv6";)
next false
end

next true
}

return trackers
end


Этот код хотя и выглядит не так компактно при взгляде на экран издалека, на самом деле проще в чтении и в поддержке. Здесь нет дублирования, которое заставляет читателя многократно сверять строки, чтобы убедиться, что разработчик имел в виду именно то, что увидел читатель. А каждая строка выражает свою мысль без лишних бессмысленных слов, которые нужно отфильтровывать глазами.


P.S. Или для любителей длинных однострочников:


    def getSupportedTrackers()
tor_enabled = @site.connection_server.tor_manager.enabled
ipv6_enabled = @site.connection_server.supported_ip_types.include? "ipv6"

trackers = @getTrackers()

trackers = trackers.filter {|tracker|
next false if (not tor_enabled) and (tracker.include? ".onion";)

address_parts = @getAddressParts(tracker)
next false if not address_parts

next false if (not ipv6_enabled) and (helper.getIpType(address_parts["ip"]) == "ipv6";)

next true
}

return trackers
end


Но этот вариант по моему мнению хуже.









 ,








И это всё МОЁ

Где достать кислоту чтоб рассплавить кожу?









 ,








И это всё МОЁ

Запускаю setup.exe из офиса 2007, а он не работает, говорит надо xbps-install -S wine-32. А его уже нет.









 








И это всё МОЁ

тут понадобилось unix-time за 21 сентября, и я с удивлением обнаружил, что это 1600635600. когда это мы успели перескочить "юбилей", подумал я и спросил у ясеня date.

date -d "@1600000000"
Вс сен 13 15:26:40 MSK 2020
але, ЛОР-овцы, где вы все были 13 сентября в 15:26:40 по мск? неужели никто не нажрался?
поиск выдал лишь одно сообщение, которое все тихо проигнорили:
http://linux.org.ru/forum/talks/15894595?cid=15896363
ни у кого, что ли, на стене не висят боооольше цифровые часы, показывающие время от начала Эпохи?








 








И это всё МОЁ

Ну в принципе, мне все в packaging guidelines понятно, да и спек на пакет написан до меня. Но когда я пробую натравить на него rpmbuild, он ругается на меня, что у меня нет множества пакетов типа


(crate(some-library/default) >= 1.0.0 with crate(some-library/default) < 2.0.0)


dnf таких выражений не понимает (ни полностью, ни crate(some-library/default)). Пакеты типа rust-some-library-devel+default.noarch.fc32.rpm существуют, даже в репозитории есть, но только если знаешь точный URL. dnf их не устанавливает. Более того, dnf build-dep бодро рапортует, что все зависимости установлены (на самом деле нет).


Федоровцы, ау, как вы собираете растопакеты?









 , ,








09:55

И это всё МОЁ
И это всё МОЁ

Адвего - лидирующая система в рунете по покупке/продаже контента и крауд-услуг. В нашу команду требуется опытный разработчик с отличным знанием Perl и/или Python.


Обязанности:


– разработка проекта компании в команде разработчиков, основной стэк - perl, python, postgresql.


Требования:


– высшее техническое образование;
– отличное знание Perl и/или Python;
– уверенное знание sql (postgresql);
– желателен опыт работы с nosql БД;
– понимание концепции ООП;
– опыт бэкенд-разработки;
– работа в *nix-среде;
– умение работы в команде разработчиков (git, svn, redmine и т.п.);
– желателен опыт работы с большими объемами данных;
– желателен опыт работы в высоконагруженных проектах;
– терпимость к чужому коду.


От вас:


– работоспособность;
– инициативность;
– самостоятельность;
– ответственность.


От нас:


– удаленная работа на полный рабочий день. Если вы в Москве - частичная работа в офисе (обязательное посещение офиса 2 раза в неделю) - метро МЦК / Окружная / Владыкино / Петровско-Разумовская;
– заработная плата - от 140 тысяч рублей и выше, определяется по результатам собеседования на основе знаний, умений и опыта;


Бонусы:


– коллектив профессионалов;
– ваше участие в принятии технологических решений по дальнейшему развитию проекта;
– профессиональный рост;
– оборудование для работы, в случае необходимости (linux/mac os);
– бесплатные обеды при работе в офисе;
– удобный график работы.


Присоединяйтесь к команде Адвего! Ждем ваше резюме, обязательно указывайте ссылки на проекты и исходные коды. Пожалуйста, обязательно пришлите пример вашего кода, от 1000 строк.


Резюме принимаются тут: https://hh.ru/vacancy/40037039









 , , , ,








И это всё МОЁ






Всем привет!

Давно не было меня на лоре, взгрустнул, зашел, глянул галерею и решил добавить свое рабочее место.

Много изменилось все за это время, с DBA перешел в DevOps и вроде удачно даже. Если раньше мне вполне хватало минта, то теперь появился один из проектов, где 1С и MSSQL, появились профильные еще заточенные инструменты. Стало не очень удобно, особенно когда поставил новые мониторы и на них прям совсем ужасно все стало с масштабированием. Но потом узнал о WSL2, windows terminal и все как-то само разрулилось)

В общем, на фото:

  • 2 монитора lG W850, слева атом, справа debian на wsl2
  • Surface 2017 LTE с i7 + surface dock
  • Какая-то мышка и какая-то мех. клава
  • Galaxy buds live

За серфейс - это просто гениальный девайс. Очень удобно брать с собой в машину, в отпуск и даже в офис, куда иногда нужно ездить)

P.S Телефон вроде не тапок, но фотка вышла не очень, мож из-за ширика?





















>>> Просмотр
(1906x1378,
4543 Kb
)










 , , , ,








И это всё МОЁ

Subj



Baikal Electronics объявила о том, что её процессор Baikal-T1 и однокристальная система BE-T1000 добавлены в код ядра Linux. Таким образом, российская компания стала первым отечественным производителем, которого включили в основную ветку ядра Linux, а значит процессоры Baikal автоматически получили мировое признание. Теперь сообщество айтишников и все желающие могут свободно использовать решения на базе однокристальной системы BE-T1000 (Baikal-T). Об этом сообщается на официальном сайте компании.




На прошлой неделе вышел Linux 5.8-rc1, в котором содержится огромное количество изменений — больше, чем когда-либо. В частности, в него вошли ключевые изменения, подготовленные разработчиками из Baikal Electronics в следующих сегментах:




общий код ядра и архитектуры MIPS CPU P5600,



MIPS GIC timer,


MIPS CM2 L2,


Baikal-T1 CCU,


Baikal-T1 APB-bus,


Baikal-T1 AXI-bus,


Baikal-T1 PVT sensor,


DW APB Timer,


DW APB SSI (SPI),


DW APB I2C,


DW APB GPIO,


DW APB Watchdog.



Остальное пока находится на стадии разработки или в процессе предварительного тестирования. Эти изменения добавят уже в ядро Linux 5.9 вместе с поддержкой процессора Baikal-T1 с файлом устройств, которые используют все существующие версии драйверов.










 , , , ,








И это всё МОЁ

Привет всем, Помогите с выбором архитектуры. Использовать исключения или нет, какие есть аргументы за 1 решиение и за 2-е. Скажеться ли использование исключений на производительности?

Решение 1, с пробросом и обработкой исключений. Кажется код проще поддерживать, при этом:

class A {
public:
std::mutex statusMutex;
int status;
std::string error;
int getStatus() {
std::unique_lock<std::mutex> lock(statusMutex);
return status;
}
std::string getError() {
std::unique_lock<std::mutex> lock(statusMutex);
return error;
}
bool doX() {
try {
step1();
// step2();
// step3(); ...
return true;
} catch (const std::exception & e) {
std::unique_lock<std::mutex> lock(statusMutex);
status = -1;
error = e.what();
return false;
}
}
void step1(){
// ...
// There has been a breakdown
throw std::runtime_error ("step1 err";);
}
};

решение 2, без исключений, в плане работы на кодом кажеться не очень удобным из-за if

class A {
public:
std::mutex statusMutex;
int status;
std::string error;
int getStatus() {
std::unique_lock<std::mutex> lock(statusMutex);
return status;
}
std::string getError() {
std::unique_lock<std::mutex> lock(statusMutex);
return error;
}
bool doX() {
step1();
if (status == -1) return false;
// step2();
// if (status == -1) return false;
// step3();
// if (status == -1) return false;
// ...
return true;
}
void step1(){
// ...
// There has been a breakdown
std::unique_lock<std::mutex> lock(statusMutex);
status = -1;
error = "step1 err";
}
};

int main() {
A a;
std::future<bool> the_a_result = std::async(&A::doX, &a);
std::cout << "the_a_result = " << the_a_result.get()
<< ", a.status = " << a.getStatus()
<< ", a.error = '" << a.getError() << "'"
<< std::endl;
return 0;
}







 








И это всё МОЁ

Хочу свой дистрибутив со свежими обоями и необычными иконками.


Подрубить арчевские репозитории и забить хуй без необходимости что-то поддерживать.


Пробовал собрать LFS и не осилил. Посоветуйте простой инструмент со сборкой из палок, шишек и говна.









 








И это всё МОЁ

Насколько безопасны/не безопасны установленные мобильные банковские приложения/клиенты? Есть истории не успеха, когда это вредило?


Если что используемые банки: райф, ВТБ, сбер.


Вопрос возник в рамках переезда на lineageos, который можно установить без gapps, что даст больше свободы, но без банк-приложений.









 , , ,








И это всё МОЁ

https://www.opennet.ru/opennews/art.shtml?num=53931


Компания Google перешла к практике запрещения участия в сервисе Google News сайтов, использующих внешние ссылки в своих статьях.


Ну а дальше переписка.


P.S. В Talks бы перенести.









 , , ,








И это всё МОЁ

Добрый день. помогите разобрать написание match для isc-dhcp, читаю документацию и что то ну никак не пойму.
Разбираю по номеру порта и мак адресу коммутатора, в тпсдампе ловлю опцию
Option: (82) Agent Information Option
Length: 18
Option 82 Suboption: (1) Agent Circuit ID
Length: 6
Agent Circuit ID: 00040fa20002
Option 82 Suboption: (2) Agent Remote ID
Length: 8
Agent Remote ID: 000600259eb9062a


circuit-id -002 это я так понимаю порт, remote-id -00259eb9062a это мак коммутатора
пробую вот так
class «inv_sw_192.168.28.2» {


match if {


     binary-to-ascii(16,8, ":", suffix(option agent.remote-id, 6)) = "0:25:9e"b9:06:2a"

and


      binary-to-ascii(10,8, "", suffix(option agent.circuit-id, 1)) = "002"

);


pool {


range 192.168.28.2;


allow members of «inv_sw_192.168.28.2»;


}
в сислоге вижу no free leases т.е неправильно матчится условие.









 ,








И это всё МОЁ

Добрый день!


Подскажите как настроить prometheus.


Есть postgres_exporter ему заданы custom запросы которые долго выполняются.


В прометее для данного postgres_exporter стоит scrape_interval 60 минут, но прометей не может получить данные из postgres_exporter так как последний их долго отдает ( долго выполняются запросы, долго получаем ответ).


При этом если мы браузером идем напрямую в /metrics postgres_exporter данные формируются.


Получается что Prometheus просто не дожидается отдачи.


Какой параметр в сборе метрик прометея можно подкрутить чтоб он дожидался ответа postgres_exporter ?









 








И это всё МОЁ

Здравствуйте!


Слышал о наличии в среде Momentics эмулятора QNX, позволяющего запускать созданное ПО без копирования на целевую платформу. В интернете ничего подобного найти не могу. Подскажите, есть ли что-то подобное в природе?









 








И это всё МОЁ

К федорке подключено 2 монитора.

После подключения, кликнул на Display Settings и расположил дисплеи так как мне удобно. скриншот

Проблема в том, что после каждого lock-unlock дисплеи возвращаются в дефолные позиции еще скриншот. Т.е. каждый раз приходиться их менять местами.

Как можно исправить проблему?

Я попытался нагуглить кофиг файл, в котором эти позиции прописываются - не получилось.

Нагугли xrandr и проверил с ним: при «правильном» и «неправильном» положении оутпут xrandr-a одинаковый.

cat /etc/redhat-release 
Fedora release 32 (Thirty Two)

Gnome Version: 3.36.2

Windowing System: Wayland

Спасибо.








 , , ,








И это всё МОЁ
Кит Паккард (Keith Packard), активный разработчик Debian, лидер проекта X.Org и создатель множества X-расширений, включая XRender, XComposite и XRandR, опубликовал выпуск стандартной Си-библиотеки PicoLibc 1.4.7, развиваемой для применения на встраиваемых устройствах с ограниченным размером постоянного хранилища и оперативной памяти. При разработке часть кода заимствована из библиотеки newlib от проекта Сygwin и AVR Libc, развивавшейся для микроконтроллеров Atmel AVR. Код PicoLibc распространяется под лицензией BSD. Поддерживается сборка библиотеки для архитектур ARM (32-bit), i386, RISC-V, x86_64 и PowerPC.



И это всё МОЁ

I have a friend and his old office all in one died and he would like to purchase or build one he has a tight budget. I am working with him on a build.


If he wanted to buy a used dell MT desktop what models are a good option? I mainly buy used computers on ebay. I cant find a good site to search through.









 








И это всё МОЁ
Состоялся релиз набора стандартных утилит Toybox 0.8.4, как и BusyBox оформленного в виде единого исполняемого файла и оптимизированного для минимального потребления системных ресурсов. Проект развивается бывшим мэйнтейнером BusyBox и распространяется под лицензией BSD. Основным назначением Toybox является создания аналога BusyBox под пермиссивной лицензией, предоставляющей производителям возможность использования минималистичного набора стандартных утилит без открытия исходных текстов модифицированных компонентов. По возможностям Toybox пока отстаёт от BusyBox, но уже реализовано около 300 базовых команд.