LINUX.ORG.RU

Избранные сообщения POLTER

Смазка для вентиляторов (ПМС-100\200)

Форум — Linux-hardware

Закончилось масло для тримера, которое использовалось для смазки кулеров (ну и триммера) — оно всем устраивало. Если заказывать аналогичное, то оно несколько неадекватно по цене и ждать минимум неделю.

Из того, что можно пойти и купить:

  • «специализированное» в шприцах, по совсем неадекватной цене в DNS;
  • масло EURO Clean EUR A-06 для смазки бритвенных станков и тримеров, с несколько неоднозначными комментариями о качестве тары и какое-то количество о качестве самого масла в том же DNS;
  • «дешманское» масло марок ПМС-100 и ПМС-200 в радиомагазине.

Собственно возник вопрос о густоте ПМС-100 — оно по старому видео на Ютубе уже кажется гуще масла для тримеров, а тут упоминались, как подходящие для смазки, ещё более густые ПМС-200 и ПМС-400. Оно только кажется, что ПМС-100 гуще масла для тримеров или нет?

 

luiswoo
()

Боковая панель в Geany

Форум — Desktop

Geany_with_improved_notebook3.png
Возможно ли повернуть ярлыки в боковой панели на 270° без GTK_DEBUG=interactive?

 

tnray
()

Как собрать мальнький компьютер в 2024 году?

Форум — Linux-hardware

Господа, добрый вечер. Пишу я вам потому что не могу найти подходящий корпус для моей чудо сборки.

Есть стационарник, обычный корпус. Micro atx плата, видео карта. SSD, HDD 3.5. БП хороший seasonic. Хочу я это дело запихать в маленький компьютер slim что 10см в толщину и вообще сами по себе маленькие такие.

Но все упирается в бп, все миниатюрные корпусы сидят на sfx или flat atx блоках питания. Я бы может и купил такого форм фактора, но производители прямо скажем китайское г. Мой нынешний БП очень хорош и не разу меня не подводил. Питать свою систему этим борохлом другого форм фактора и постоянно покупать я не хочу…

Может быть кто-то на форуме тоже хотел подобный уровень эргономировать свое рабочее место, и хотел собрать маленький компьютер со стандартным БП. Все идеально влезает кроме блока питания. Можно использовать корзины для hdd как внешние так и внутрие за место дисковода например. Может есть возможность внешнего питания. Прошу помочь и дать названия моделей корпусов деталей, апгрейдов.

Решение вопроса

Долго искал информацию, все таки нашел производителя micro-atx с и смог подобрать себе корпус.

Тем кто также столкнется с таким выбором, можете обратить внимание на следующих производителей:

  • SilverStone
  • Jonsbo
  • CoolerMaster благодаря @basilic
  • Lian li

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

Вы всегда найдете у них пару моделей, малых по высоте и глубине, и что самое важное, в ширину до 200 см. Я принципиально против кубов в этом вопросе, не считаю их миниатюрными корпусами. Невысокий, но широкий корпус - не компактный.

Также приведу список производителей которые делают акцент именно на комбо с миниатюрными блоками питания(не зря же их смотрел). Вот их список:

  • ExeGate
  • Ziricon
  • Foxline
  • Powerman
  • Formula

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

Всем спасибо.

 , , ,

ettaluni
()

Сетевой движок на Си. Вычитывание данных из сокета в 4кб буферы.

Форум — Development

Хотелось построить сетевую подсистему, написанную на крестах, на такой идее: разные протоколы/модули обмениваются «цепочками буферов» (блохчейнами ога), в том числе и сетевая подсистема. Например, если кто-то хочет отправить по вебсокету 12 кб данных юзеру, то этот кто-то просит у центрального менеджера ресурсов 3 блока, наполняет их данными, чейнит их в одну цепь и кидает поинтер на первый блок в «сеть». Epoll-driven «сеть» отправит все данные (когда сможет) из этих блоков последовательно в сокет и отдаст «менеджеру ресурсов» блоки обратно по мере отправки. Блоки переюзываются всеми компонентами, потребляются по мере нужды, а новые коннекты не жрут память только по факту коннекта, тяжелее заддосить, всё красиво. Короче, общая идея в том, что есть некий slab-аллокатор блоков, владеющий ими и выдающий в аренду и блоки, протекая через все подсистемы и задерживаясь в сетевом модуле, если сразу запсать в сокет не удалось (больше чем TCP window или другой прикол), и в конце возвращаются в блокопрародитель обратно. Памяти при таком подходе в целом в любой момент сожрано меньше, чем если бы при наших 5к соединений каждый коннекшен бы держал собственный буфер на пару метров.

Одно но: если такая моя «сеть» решила вычитать из сокета мегабайт, то она сделает 1024/4 = 256 сисколлов read(), чтобы выжрать данные в цепь 4кб-блоков вместо одного сисколла, если бы у неё был буфер на 1 метр. На отправке те же приколы - рост числа сисколлов.

Да, есть оптимизации - можно юзать блоки разных размеров в разных местах, можно смотреть на Content-Length в случае протокола HTTP и готовиться к мегабайту оптимальнее заранее и т.п.

Но вот хотелось бы послушать разных историй про подобные «движки сети» где были похожие идеи и где авторы нашли оптимум.

Про recvmmsg/sendmmsg и io_uring в принципе в курсе.

UPDATE

«4 кб буферы» отошли в прошлое, текущее понимание затеи как «цепочка буферов разной фиксированной длины», например HTTP-ответ юзеру может быть цепочкой из буфера 4КБ (на хидеры) и за ним буфер в мегабайт под body.

 

kilokolyan
()

Консольный ФМ без glib

Форум — Desktop

Glib очень сильно окопался в мире линукса. Многие считают, что это не гномолиба, а системная библиотека. Но я приверженец ортодоксального подхода. Для меня это все также гномолиба.

В консоли использую МС, устраивает полностью. Он зависит от glib и без него не собирается. Недавно задумался, получается, что даже если в системе вообще нет графики, часть гнома всё равно присутствует.

Начал перебирать фм. Глиб везде. Без него вроде как ranger, но он инопланетный какой-то.

Какими консольными фм пользуются лоровцы? И есть ли нынче в Линуксе жизнь без glib?

 , ,

utanho
()

Подскажите ресурсы для изучения написания собственной ОС

Форум — Development

Всем привет! Я неплохо знаю языки Си и С++, а так же чуть-чуть ассемблер x86, поэтому хочу попробовать свои силы и написать собственную ОС, с ядром и системным софтом. Подскажите, пожалуйста, книги, форумы или иные ресурсы, где можно найти гайды или задать вопросы. Сразу говорю, что я не буду писать какую-то фигню, а создам полноценную ОС. Касательно времени, то проект бессрочен, поэтому чем больше толковых трудов вы дадите, тем лучше, я все изучу, независимо, сколько для этого потребуется времени. Можно англоязычные.

 

stranger1
()

Нюансы запуска процессов через system/exec

Форум — Development

Случай #1:

Как известно, при вызове exec происходит завершение всех нитей вызывающего кроме той, что вызвала system. При этом открытые дескрипторы клонируются в новый процесс (если у них не указан флаг FD/SOCK_CLOEXEC).

Представим следующую гипотетическую ситуацию:

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

Положим, что так как эта строка может содержать переменные среды, какие-то выражения подстановки и shell-related команды и синтаксис программист, написавший эту программу посчитал, что самым оптимальным образом будет запускать эту строку с помощью команды system, которая не требует списка аргументов, как семейство exec*. Плюс, так как system «под капотом» вызывает sh -c ..., то автоматически подставятся переменные, а shell-related команды и синтаксис будут работать как нужно. Так вот, глянем исходник system, например, для glibc:

<Сначала хотел показать исходник glibc, но тут слишком дофига получается кода, поэтому сжато: clone + exec + waitpid, кстати ман говорит про fork + exec + waitpid, что не совсем то же самое>

При вызове clone/fork происходит копирование открытых дескрипторов, которые наследует процесс, который запустил system. Предположим, что кто-то передал для запуска строку, содержащую запуск программы (назовем ее evil), выполняющей следующие действия:

if (fork() != 0)
    exit(0);

Что превращает ее в отвязанного от родителя демона. Однако этот fork тоже наследует все открытые хэндлеры, что приводит нас к тому, что этот демонутый процесс evil получил копию всех открытых хендлеров супервизора, однако стал от него отвязан (system вернул 0, супервизор считает, что работа выполнена).

Теперь предположим, что это супервизор с управлением по сети. То есть супервизор открывает серверный сокет и слушает команды, которые ему приходят извне. Не будем обсуждать защищенность передачи или канала связи, всё можно сломать, суть сейчас не в этом. Суть в том, что на момент запуска system супервизор владел открытым серверным сокетом (!). Да, по совести и по правилам при его создании ему нужно было выставить SOCK_CLOEXEC, но скажем честно, кто своим серверным сокетам выставляет флаг, о котором даже в мануалах на socket из 153 строк отдано 2 (!), т.е. всего 1.3%?

Таким образом, пройдя через всю цепочку форков копия серверного сокета оказывается у демонутого evil:

super      9053 alex    3u  IPv4 11458560      0t0  TCP *:34002 (LISTEN)
super      9053 alex    4u  IPv4 11464960      0t0  TCP localhost:34002->localhost:41308 (ESTABLISHED)
evil       9257 alex    3u  IPv4 11458560      0t0  TCP *:34002 (LISTEN)

Положим, что процесс супервизора по какой-то причине завершился. Ну, например, выполнив свою работу или по ошибке. И теперь начинается самая мякотка. Ведь в системе уже открыт слушающий на порту 34002 сокет! И принадлежит он программе evil! Таким образом она может прикинуться сервером, а супервизор, в свою очередь, не сможет вернуть свой сокет, поэтому система не даст ему открыть второй сокет на том же порту без REUSEPORT:

SO_REUSEPORT (since Linux 3.9)
              Permits multiple AF_INET or AF_INET6 sockets to be bound to an identical socket address.  This option must be set on each socket (including the first socket) prior to calling bind(2) on the socket.  To prevent port hijacking, all of  the  pro‐
              cesses binding to the same address must have the same effective UID.  This option can be employed with both TCP and UDP sockets.

В общем случае, когда какая-то программа-сервер запускается и получает ALREADYINUSE то надо бы сказать мол, «не не могу работать, наверное другая копия меня уже запущена» и выключиться (ну или ожидать его освобождения).

Мы же не хотим port hijacking, верно? А вот все равно профукали. Ну и теперь evil может делать что угодно. Может получать данные от клиентов, может им даже что-то отвечать,может получать список команд для запуска и запускать вместо них что угодно, сообщая наверх что всё хорошо.

Собственно, вопрос #1: почему на серверный сокет автоматически при создании не вешается FD_CLOEXEC?

Случай #2:

Мы - супервизор, запускающий программы, забудем про сетевое взаимодействие, мы сами знаем, что нам запускать. Запускают нас от root, для того, чтобы мы могли делать какую-то очень важную вещь, ну, например, читать какой-то root-owned файл:

-rw-------  1 root root        7 июн  5 23:51 rootonly

Изобразим супервизор упрощенно:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>       
#include <sys/wait.h>
#include <errno.h>       
#include <pwd.h>


static void dowork(void) {
    int pid = fork();
    int status;
    switch (pid) {
        case -1 : exit(EXIT_FAILURE);
        case 0  :
            if (setuid(1000) == -1) {
                printf("u:%u\n", errno);
            }
            if (seteuid(1000) == -1) {
                printf("e:%u\n", errno);
            }
            execl("./hijack_evil.elf", "./hijack_evil.elf", NULL);
            printf("cannot run\n");
            exit(EXIT_FAILURE);
        default :
            wait(&status);
    }
}

int main(void) {
    FILE * fileroot = fopen("/tmp/rootonly", "r");
    printf("I am %s, #%u/%u\n", getpwuid(getuid())->pw_name, geteuid(), getuid());
    
    dowork();
    
    fclose(fileroot);
    return 0;
}
gcc hijack_root.c -o hijack_root.elf

И программу, которой нельзя давать рутовые права:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>       
#include <sys/wait.h>
#include <pwd.h>

int main(void) {
    printf("I am %s, #%u/%u\n", getpwuid(getuid())->pw_name, geteuid(), getuid());
    // my stdin is 0, stdout is 1, stderr is 2, therefore...
    char buf[1024];
    read(3, buf, 1024);
    printf("%s\n", buf);
    return 0;
}
gcc hijack_evil.c -o hijack_evil.elf

Проверяем, что просто так файл прочитать нельзя:

alex@ThinkPad-L560:~$ cat /tmp/rootonly 
cat: /tmp/rootonly: Отказано в доступе
alex@ThinkPad-L560:~$ echo $USER/$UID
alex/1000

И запускаем супервизор:

$ sudo ./hijack_root.elf 
I am root, #0/0
I am alex, #1000/1000
SECRET

При этом мы не можем ставить FD_CLOEXEC на каждый хендлер, открываемый в супервизоре, потому что он может понадобиться для целей супервизора в его форках. Соответственно вопрос #2: почему внешние программы, запускаемые через exec наследуют хендлеры? Ведь очевидно, что это может быть использовано только для «угона» файлов

 ,

PPP328
()

Intel AX200 как точка доступа

Форум — Linux-hardware

Смотрю на вот это вот чудо и хочу понять, будет ли оно работать как точка доступа в 5 ГГц диапазоне.

Есть такой зверь у кого? Поделитесь выводом iw list.

Ну и чтобы два раза не вставать — что вообще сейчас нужно брать и ставить в PCI-E, чтобы сделать как минимум 802.11ac (а ещё лучше ax)?

 , , , ,

post-factum
()

Дождливый XMonad

Галерея — Скриншоты

Терминал — urxvt, бар — polybar

Конфиги: https://github.com/malyutinegor/rainy

Видео с обоями: https://i.imgur.com/CTiwPki.mp4 (они обычно всегда отключены, включаю чисто чтобы помедитировать)

>>> Просмотр (1366x768, 752 Kb)

 , , , ,

rk-d
()

Как понять, отчего программа тормозит?

Форум — General

Иногда у меня сильно тормозят некоторые программы (chrome/chromium, файловые менеджеры на разных тулкитах и даже gvim иногда). Иногда я подключаюсь к программе при помощи strace и пытаюсь понять, в чём причина тормозов. Как правило, безуспешно — мне не хватает базовых знаний (я не программист).

Вопрос: что (кроме man strace) нужно знать для поиска тормозов ПО?

Можете накидать годных ссылок на описание процесса решения проблем при помощи strace (и другого ПО)?

 

Harliff
()

Что-то странное с кэшем в Linux-дистрибутивах

Форум — General

Я не знаю, как вы, но я давно заметил, что некоторые дистрибутивы (Ubuntu, Fedora, Linux Mint) не умеют обращаться с кэшем памяти. Я не шибко знаток этой темы, но кэш просто заполняется до отказа, пока система не фризится жёстко (только перезагрузка помогает). Есть ли хотя бы какие-то вменяемые костыли, чтобы это не происходило? Знаю про решение с освобождением кэша командой «sudo sync; echo 3 > /proc/sys/vm/drop_caches», но оно настолько костыльное, что просто ощущаешь себя реальным инвалидом.

Решение

Не рекомендую делать реиндексацию. Комп тупо не справится (у меня 8 ядер, 16 Гб ОЗУ - не потянул). Проще скачать блокчейн заново.

 , , , ,

Desmond_Hume
()

Объясните сишную магию

Форум — Development

Пытался понять как реализовать SVG фильтр feComposite, ибо SVG дока унылая, поэтому залез в сорцы вебкита. Там тоже документации ноль, ещё и код очень странный.

Вот что это за ужас (src):

static unsigned char clampByte(int c)
{
    unsigned char buff[] = { static_cast<unsigned char>(c), 255, 0 };
    unsigned uc = static_cast<unsigned>(c);
    return buff[!!(uc & ~0xff) + !!(uc & ~(~0u >> 1))];
}

Я так понимаю, они проверяют что int в 0..255 диапазоне, но уж слишком странным образом.

UPD: коммит, который добавил этот код.

 ,

RazrFalcon
()

Документация к языкам программирования

Форум — Development

Всевозможные учебники и книги - это хорошо, но обычно их предлагают купить и часто не совсем дёшево, даже если они описывают базовый уровень. Бесплатным решением, очевидно, является официальная документация. Когда я открыл документацию к python, я был приятно удивлён, что она написана практически как учебник. Для Java вроде бы тоже всё относительно неплохо в этом плане, хотя хотелось бы отдельный оффлайновый pdf.

Мне захотелось скачать себе документацию в подобном виде для C и C++. Зашёл на их официальные сайты, там описание стандарта предлагают получить на сайте ISO за немалые суммы денег. Да и само описание стандарта далеко не для обучения. Хорошо, подумал я, попробую тогда посмотреть документацию к одной из реализаций языка - GCC-CPP, и вижу, что описанное там тоже вовсе не подходит для обучения. Даже описания типов и примеров объявления нет (может плохо искал, но в заголовках не заметил).

Нет, это не тред «подскажите книгу по Сям», таких для начинающих я и сам могу гору насоветовать.

Вопрос следующий: существует ли нормальная доступная бесплатная документация по которой можно изучать C, C++? Официальная документация по другим языкам была бы тоже интересна.


Update

C, C++
Online-ресурсы и учебные пособия для начинающих:

Как дополнение: Рабочая версия стандарта C++14 от 19 ноября 2014 г. (с официального сайта стандарта)


Fortran


Python
В дополнение к официальной документациипереводу руководства Python 3.1):


Object Pascal. Lazarus

Перемещено Klymedy из talks

 , , , ,

grem
()

Осиливаем DXVK в вайн, запуск любых DX11 игр в вайн без тормозов

Форум — Games

0. последние драйвера нвидии (пользователям АМД земля пухом)
1. Ставим ОБЫЧНЫЙ(НЕ СТАГИНГ) wine-3.7
2. Идем сюда https://github.com/doitsujin/dxvk/releases/tag/v0.50
3. качаем dxvk-0.50.tar.gz
4. запускаем (объявив вайн префикс если нужно) x64 или x32 в зависимости от вайна setup_dxvk.sh

ВСЕ РАБОТАЕТ ничего больше делать не нужно

если ФПС СЛИШКОМ НИЗКИЙ:
запускать с
__GL_NextGenCompiler=0

Что еще может быть причной НИЗКОГО ФПСА

Вайн без «эмуляции рабочего стола» и «оконный режим» игры, ФПС будет очень низкий, поставьте «эмуляцию рабочего стола» в настройке Вайн

(дальше специфические проблемы, редко возникают и почти незаметныы)
Ваш ДЕ конфликтует с Вулканом, я встречал это на XFCE(вплоть до зависания иксов) где ФПС до 50% ниже чем OpenGL
(на чистых иксах ФПС в вулкане ниже чем в гноме3)
предполагаю множество проблем в «минималистичных DE» где рендеринг непонятно как сделан
в Gnome3 в вулканом нет никаких проблем

другие программы использующие иксы/vdpau/opengl
запуск «некоторых» шейдеров в OpenGL паралельно Вулкану будет давать стабильный краш вулкана
хром со включенным видео на сайте, одновремено видеоплеер использующий vdpau, вулкан будет рандомно крашиться
после использования NVENC вулкан может либо не стартовать вообще либо ФПС упадет в десятки раз
Thunderbird очень силько конфликтует с вулканом по какойто причине(даже закрытый в трее без окна)
...и прочее, лучше закрыть все перед запуском

 , ,

missxu
()

Конспект по GNU Make

Форум — Development

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

1.  include / -include - включить Makefile, дупускаются shell
    шаблоны. С / без ошибки при отсутствии файла. После прочтения всего
    Makefile, имена файлов, которые указаны  директиве, проверяются на
    возможность обновления рецептами. В случае обновления включаются
    заново (основа для автоматической генерации зависимостей).

2.  Secondary expansion - после чтения Makefile и перед фазой
    обновления целей, производится второй проход по списку
    пререквизитов. Доступны автоматические переменные.
        .SECONDEXPANSION:
        main_OBJS := main.o try.o test.o
        lib_OBJS := lib.o api.o
        main lib: $$($$@_OBJS)

3.  Order-only пререквизиты - цель не будет считаться устаревшей при
    выполнении рецепта такого пререквизита
        targets : normal_prereq | order_only_prereq.

4.  Переменная VPATH - пути поиска всего. Директива vpath - пути поиска
    для определённого класса файлов.

5.  .PHONY : target - цель target всегда устаревшая. Для target не
    производится поиск неявных правил.

6.  Если в качестве пререквизита -lname, то поиск библиотеки в
    следующих местах: в текущей директории, vpath и VPATH, /lib,
    /usr/lib, prefix/lib.

7.  Если существуют несколько правил с одним двоеточием для одной цели,
    то все они объединяются в одно правило. Рецепт может быть указан
    лишь однажды, если его нет, то поиск среди неявных правил.

8.  Если существуют несколько правил с двумя двоеточием для одной цели,
    то каждое правило независимо от другого. Каждое правило может иметь
    свой рецепт иначе поиск среди неявных правил. Могут выполниться все
    рецепты, ни одного не выполниться, выполниться лишь часть рецептов.

9.  target : ; пустой рецепт, не будет производиться поиск неявного
    правила.

10. Static pattern rule
       targets : target-pattern : prereq-pattern
            recipe
       ${objects} : %.o : %.c
    Часть имени соответствующая % - stem.

11. Каждая строка рецепта исполняется в своей shell (в одной есле
    .ONESHELL). Shell, которая используется, хранится в SHELL, опции в
    .SHELLFLAGS. Значение SHELL не наследуется из окружения make.
    Exit-status shell, выполняющей команду, содержится в .SHELLSTATUS.

12. В рецепте (в начале строки):
       @ - отключает печать команды (-n и --just-print всё равно
           печатают такие команды);
       + - выполнить даже если заданы -n или --just-print;
       - - игнорировать ошибки при исполнении команды.

13. В рецепте: обращение к make переменной ${var}, к shell переменной
    $${var}.

14. При рекурсивном вызове make использовать переменную ${MAKE}
       $(MAKE) -C subdir

15. [override] undefine var - удалить переменную.

16. export / unexport var [=val] - экспортировать / не экспортировать
    переменную в sub-make. Одинокий export / unexport - экспортировать
    / не экспортировать все переменные.

17. var = val - ссылка;
    var := val - обычная переменная;
    var += val - ссылка ли, зависит от типа val;
    var ?= val - присвоить значение если var не объявлена;
    var != cmd - выполнить cmd в shell;
    ${foo:.o=.c} - заменить .o в конце слов на .c;
    ${foo:%.o=%.c}

18. Иерархия переменных:
       1. объявлянные внутри Makefile с override (дальнейшая
          модификация возможно только с override);
       2. переданные через командную строку;
       3. объявленные внутри Makefile без override;
       4. из окружения, где запускается make.
    Экспортируются переменные в sub-make:
       1. из окружения, где запускается make (редактирование внутри
          Makefile не влияет);
       2. переданные через командную строку (если Makefile редактирует
          с override, то в sub-make приходит значение из командной
          строки);
       3. объявленные внутри Makefile с export.

19. MAKEFLAGS - содержит флаги переданные при запуске make +
    переменные со значениями переданными через командрую строку, но не
    содержит цели. В переменную можно добавить флаги внутри Makefile
    или в окружении, в котором запускается make).

20. MAKELEVEL - содержит целое число, которое указывает на глубину
    рекурсии. 0 для главного make.

21. MAKECMDGOALS - содержит цели заданные при запуске make.

22. Target-specific переменные
       prog : [private] CFLAGS=-g
       prog : prog.o foo.o bar.o
           recipe
     задаёт CFLAGS в рецептах для prog, prog.o, foo.o, bar.o. Если
     private стоит, то пререквизиты не наследуют CFLAGS. Если
     переменная объявлена private на глобальном уровне, то она не
     будет видна ни в одно рецепте.

23. Pattern-specific переменные
       %.o : CFLAGS=-g

24. Match-anything pattern rule (цель одинокий %). Бывают:
      1. терминальные (%::pregeq) - prereq должен существовать, не
         может быть создан посредством другого правила.
      2. иначе - правило будет рассмотрено только если нет других
         неявных правил , чья цель совпадает с искомой.

25. Last-resort default rule
      1. %::
      2. .DEFAULT:      # если рецепт не указан, то текущее правило
                          будет удалено

26. Отмена неявного правила
       %.o:%.s
    указать ту же цель и те же пререквизиты, рецепт не указывать.
    
27. Архивы:
      1. при использовании нотации со скобками ( libname(objs) ) не
         допускать параллельного запуска make (-j опция).
      2. внутри архива содержится таблица символов (__.SYMDEF), ranlib
         lib.a её обновляет. GNU ar не требует запуска вручную,
         запускает её автоматически.

28. Договорённости:
      * Каждый Makefile должен содержать
          SHELL = /bin/sh
        для избежания проблем на системах, где SHELL может быть
        унаследована из окружения.
        
      * Не плохо задать суффиксы для которых будет производиться поиск
        неявных правил
           .SUFFIXES:             # удаляет все раннее установленные
           .SUFFIXES: .c .o
           
      * ar bison cc flex install ld ldconfig lex make makeinfo ranlib
        texi2dvi yacc chgrp chmod chown mknod - вызывать через
        переменные ${AR}, ... . Для каждой переменной-команды
        переменная с опциями образуется добавлением FLAGS к имени
        (исключение - CFLAGS, YFLAGS, LFLAGS).

       * команды, которые следует использовать напраямую (без
         переменных): awk cat cmp cp diff echo egrep expr false grep
         install-info ln ls mkdir mv printf pwd rm rmdir sed sleep
         sort tar test touch tr true gzip.

       * каждый Makefile должен задавать переменные: INSTALL,
         INSTALL_PROGRAM (дефолтно ${INSTALL}), INSTALL_DATA (дефолтно
         ${INSTALL} -m 644).

       * staged install - для целей install и uninstall поддерживать
         переменную DESTDIR
            $(INSTALL_PROGRAM) foo $(DESTDIR)$(bindir)/foo
            $(INSTALL_DATA) libfoo.a $(DESTDIR)$(libdir)/libfoo.a

       * установка info и man страниц в цели install.

       * Разбивка install на $(PRE_INSTALL), $(POST_INSTALL),
         $(NORMAL_INSTALL). Разбивка uninstall на $(PRE_UNINSTALL),
         $(POST_UNINSTALL), $(NORMAL_UNINSTALL).

Господа, у меня вот ещё какой вопрос имеется: вот написал я какую-нибудь софтину, как мне определиться с именами файлов и всего проекта? Т.е. чтобы небыло конфликтов имён с другим софтом при make install. К тому же если сегодня конфликтов нет, то завтра у меня нет никаких гарантий, что такой софт не появится. Как тут правильно поступать? Каждый проект должен писать какие-то проверки на конфликты имён? Если так, то делает ли это автоматом autoconf+automake? cmake?

 

pavlick
()

Хранение паролей

Форум — Security

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

Паролей от всевозможных аккаунтов становится все больше и больше, в связи с этим назрел вопрос об их хранении. Подскажите пожалуйста, есть ли какой нибудь сервер(soft) для централизованного хранения и доступа к нему с разных устройств? Менеджеры паролей не устраивают, т.к. неудобно разбрасывать базу между несколькими устройствами и пользователями.

 ,

torm7
()

Курс по компиляторам

Форум — Development

В 14-м году на курсере был классный курс, который я упустил. А сейчас понял что очень хочется его пройти. После гуглежа оказалось, что курс доступен бесплатно без смс прямо на сайте стенфорда.

Вот, выкладываю ссылку (может будет полезно кому-нибудь) https://lagunita.stanford.edu/courses/Engineering/Compilers/Fall2014/

Если есть ещё слоупоки кроме меня, то давайте вместе проходить!

 , ,

dsxl
()

очень хочется поделиться ))

Форум — Development

хук на бранч, gitlab vs jenkins

1. в дженкинсе наплодить джобиков (dev, test, master) и на каждый ждобик выставить галку Trigger builds remotely (e.g., from scripts). написать туда ключик, всем разные.

2. добавить в корень проекта .gitlab-ci.yml типа такого:

stages:
- build_developer
- build_test
- build_master



build_developer_job:
  stage: build_developer
  only:
  - develop
  script:
  - curl http://jenkins.url/job/project-develop/build?token=token_develop



build_test_job:
  stage: build_test
  only:
  - test
  script:
  - curl http://jenkins.url/job/project-test/build?token=token_test



build_master_job:
  stage: build_master
  only:
  - master
  script:
  - curl http://jenkins.url/job/project-master/build?token=token_master

ну и конечно добавить раннер: https://docs.gitlab.com/runner/register/index.html

и волосы будут здоровые и шелковистые.

может это просто и все знают, но у меня прям локальная победа :)

 ,

Rastafarra
()

Debian 9 Stretch + dwm

Галерея — Скриншоты

Достался мне для ремонта нетбук Acer Aspire One D255 c 1GB RAM на борту.

Поменял порванную WiFi-антенну и корпус (по счастливому стечению обстоятельвств нашел на avito за копейки), заменил планку памяти на 2GB.

Ранее установленный и работающий отнюдь не быстро на таком железе Linux Mint 17 с XFCE решил заменить на Debian 9 Stretch с dwm 6.1.

Установил с netinstall-образа со всеми необходимыми компонентами, задействовал zswap c lz4/zsmalloc, дисплейный менеджер не используется - работает автовход в сессию иксов.

Cобрал dwm с учетом патчей:

dwm-resizecorners-6.1.diff
dwm-fancybar-6.1.diff
dwm-pertag-6.1.diff
dwm-6.1-save_floats.diff
dwm-6.1-systray.diff
dwm-attachaside-6.1.diff
dwm-push-6.1.diff
dwm-r1615-selfrestart.diff

Шрифты: в системе и в панели - Cantarell 9, Font Awesome 9 для значков тегов, в терминале - Ubuntu Mono 10.

Терминал - urxvt, текстовый редактор - geany, файловый менеджер - PCmanFM.

GTK Theme - Espresso 0.1 (модифицированная), иконки - Vivacious-NonMono-Light-Yellow.

Скриншоты: PCmanFM+SMPlayer, Geany, PaleMoon+LOR.

>>> Просмотр (1024x600, 920 Kb)

 ,

mad_austronaut
()

Совместное использование ресурсов

Форум — Development

Есть проблема доступа к совместным ресурсам. Я вот не пойму, это реальная проблема, или она надумана?

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

Пусть есть условная ячейка памяти, которую разные процессы могут инкрементить. Как принято представлять эту модель? Процесс №1 считывает текущее значение из памяти(допустим - это 0), прибавляет к нему единицу, а затем записывает в память получившееся значение вместо предыдущего. Соответственно пока процесс №1 производит операцию сложения, процесс №2 может считать значение памяти, и начать свою операцию сложения. Затем, после того как процесс №1 записал результат(1) в память, процесс № 2 также записывает свой результат(1) в память, и результат 2-х инкрементов — 1.

Отсюда проистекает необходимость введения механизмов блокировок, которые, в свою очередь порождают уже другие проблемы.

Это все выглядит уродливо, как кровавое месиво.

Давайте посмотрим на это с другой стороны.

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

То есть, обычная инкапсуляция. И нет никакой проблемы.

Если это так просто, то зачем городить огород? Зачем решать несуществующие проблемы? Может это выгодно всякого рода горе-дезигнерам, делать вид, что существует проблема, нет проблемы — нет и хлебушка с маслицем?

Перемещено tailgunner из development

Перемещено jollheef из job

 , ,

vikingfilmtracker
()