LINUX.ORG.RU

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

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

 , , , ,

Представлена оболочка командной строки для выполнения команд на человеческом языке
Группа Open Source

Разработчик из проекта River's Educational Channel представил оболочку командной строки, которая понимает человеческий язык и переводит его в команды интерпретатора Bash. Новая оболочка использует OpenAI и позволяет выполнять как простые команды для работы с файлами и директориями, так и использовать утилиты вроде ImageMagick, ffmpeg со сложными параметрами.
Видео с демонстрацией работы на YouTube

( читать дальше... )

>>> Подробности (riveducha.onfabrica.com)

ls-h
()

Отслеживание изменений файлов. Дьявол в деталях. Чем пользваться?

 

Tags: #integrity_check

Посоветуйте софт. Нужно что-то, чтобы умело:

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

Плюсом были бы возможности:

  • /etc/shadow отслеживать. - поменялся хеш, значит перебивался пароль;
  • /etc/passwd - поменялся, значит добавили и/или удалили пользователя;

Типа такого, спасибо.

dopedopedope
()

Суд присудил Lenovo выплатить 20000€ за отказ в компенсации стоимости предустановленной ОС Windows

 , ,

Группа Open Source

В марте 2018 года Лука Бонисси, итальянский разработчик и ярый сторонний СПО, купил новый планшет фирмы Lenovo с предустановленной на него ОС Windows. Пользоваться последней он не собирался, поэтому написал запрос в службу поддержки производителя планшета с просьбой возврата предустановленной ОС и получения уплаченных за нее денег (42€). После того, как в Lenovo ему отказали, причем довольно демонстративно, он подал жалобу в итальянское управление по конкуренции и рынку (AGCM), но и это оказалось бесплодным. Тогда он решил подать в суд…

( читать дальше... )

>>> Подробности (fsfe.org)

Zhbert
()

Релиз Datanymizer — анонимайзера чувствительных данных, написанного на Rust

 , production, ,

Группа Open Source

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

Для этого предлагается использовать Datanymizer — он анонимизирует данные на стороне сервера и передаст в тестовую среду уже чистый SQL-дамп, в котором персональные данные удалены или заменены несуществующими данными, похожими по формату на реальные.

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

Подробное описание установки и использования читайте в статье.

>>> Подробности (evrone.ru)

Alve
()

Хочу сделать регистрацию без email, посоветуйте вычислительную задачку для браузера

 

Возникла идея сделать один мелкий сайтик с юзерами, а там регистрация. В силу того, что я не понял, зачем мне для регистрации просить email, да ещё гонять трафик и снюхиваться со всякими email-серверами, то емейла/телефона при регистрации не будет.

Но минимально защититься от спама хочется. Самодельный генератор капчи есть, написанный на крестах, который генерит капчу за 1..2 мсек, но всё же простейший ДДОС с кучей запросов на эту капчу быстро ушатает генератор и исчерпает запасы качп в базе, а завязываться на доступность гугловых рекапч не хочется, да и лишние коннекты ваять, когда генератор уже есть. Неважно насколько он крутой, важно что нейросеть у атакующего тяжелее этого генератора.

Поэтому возникла идея поставить капчу позже, а сначала попросить юзера доказать, что он выдержал некий proof-of-time алгоритм (и возможно proof-of-memory с микрокодом типа как в RandomX, но похрен). Proof-of-time - это, короче, пруф того, что ты регался не менее 5 секунд. Реализуется как 5 обменов с браузерным JS, между которыми не может быть менее секунды, причём сервер не утруждает себя хранением состояния, чтобы выдерживать SYN-flood-атаки (запустили регистрацию 100500 раз и свалили).

Посылаем браузеру структуру данных, с прошитым в ней миллисекундным timestamp, изменить который без разрушения структуры невозможно, просим прислать нам структуру обратно через секунду и забываем про факт посылки. Когда через секунду браузер присылает эту структуру назад, мы смотрим на прошитый в ней timestamp и понимаем, прошло ли достаточно времени для её возврата нам или юзер читерит. Далее генерим аналогичную структуру для второго состояния и так далее, пока не получим возврат на последнюю посылку. То есть, нужен алгоритм генерации такой структуры данных, валидность которой наступает в будущем.

На экране юзера такая регистрация будет выглядеть как прогресс-бар, который тупо доходит до 100% за 5 секунд.

Простейший вариант - тупо зашифровать своим секретным ключом AES128 строчку вида <256-bit-random-salt> и на входе расшифровывать обратно, сверяя timestamp. Но может есть чё попроще или наоборот поумнее, понадёжнее или «так же надёжно, но вычислительно сильно дешевле»?

А ещё были такие идеи на тему proof-of-memory: генерим на сервере 512 байт данных и запоминаем, а юзеру отправляем 1 МБ, где в случайных местах замешаны эти 512 байт. Потом посылаем юзеру 10 запросов в рандомные места этого 1 МБ куска, ответы на большинство из которых нас не волнуют. Пара запросов, которые попадают в «наши данные» мы проверяем, но юзер вынужден помнить весь 1 МБ, не зная где среди них лежат наши данные. Потом я прочитал про RandomX и понял, что это содомия, а нормальные чуваки просто генерят какой-то псевдомашинный код на тему перемещения блоков в памяти, который (код) юзер физически состоянии исполнить только имея, скажем, 4 гига оперативы - короче надо ещё про это почитать! Жаба конечно задушит каждому дебилу по 1 МБ рассылать. Нужно, чтобы псевдокод для исполнения у жертвы не мог вернуть верный результат без использования настоящих 16 мегабайт памяти, но чтобы результат работы кода был мизерным и был известен серверу прямо в момент генерации этого рандомного дьявольского псевдокода.

igloev
()

STM32 output <> input

 

Добрый день, как красиво поменять режим с выхода OD на вход ? Ну чтобы одной строчкой в виде макроса.

Нашел код китайца, что-то не могу понять как это работает, сори за затуп.


#define TM1637_DIO_IN()     {GPIOC->CRL&=0XFFFF0FFF;GPIOC->CRL|=8<<12;}
#define TM1637_DIO_OUT()    {GPIOC->CRL&=0XFFFF0FFF;GPIOC->CRL|=3<<12;}

Ну с GPIOC всё понятно, CRL может быть и CRH в зависимости от номера порта, правильно? А дальше меняется режим? не могу сообразить :(

CRL&=0XFFFF0FFF

Это GPIOC Pin 3 верно?

Если нужен Pin 9 то :

CRH=0XFFFFFF0F

?

AUX
()

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

 ,

Случай #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
()

Переключение языка: левый shift - один язык, правый shift - другой язык.

 ,

Здравствуйте, подскажите какой дистрибутив выбрать, чтобы настроить такой вариант переключения языков: левый shift - один язык, правый shift - другой язык. На стековерфлоу нашел, что такое было возможно в одной из версий Убунты, но в следующей - возможность пропала. В принципе нашел как это сделать на С++, но хотелось бы стандартными средствами.

Jack22
()

Dos флуд GET запросов по домену, ip адресу, как остановить?

 , ,

Решено

AntiDOs1111
()

Все извесные djb2 коллизии

 , , ,

UPD: Дададада strcmp в общих случаях быстреее, не пишите мне про это, всё есть в треде, спаааасииибо ))

У кого есть список коллизий хеш алгоритма djb2? Выбрал его как замену strcmp() ибо не смотря на все оптимизации с SSE2 strcmp() проигрывает почти в 4 раза.

[DEBUG] (src/engine.c:timer_start:112) Timer 0 'strcompare' Start: 0.000000
[DEBUG] (src/engine.c:timer_stop:133)  Timer 0 'end' End: 0.189000
[DEBUG] (src/engine.c:timer_start:112) Timer 0 'strhash-compare' Start: 0.000000
[DEBUG] (src/engine.c:timer_stop:133)  Timer 0 'end' End: 0.053000

Ну и опционально, приведу код может кто ещё подскажет как ускорить

Сейчас поиск элемента в материале такой 1000000 интераций поиска 0.189000 секунд cpu MHz: 3501.001

material_item material_entry_item(material_entry* me, char* name) {

  for(int i = 0; i < me->num_items; i++){
    if(me->names[i][0] == name[0]){
    if (strcmp(me->names[i], name) == 0){
       return me->items[i];
    }}
  }

  material_item empty;
  memset(&empty, 0, sizeof(empty));
  return empty;
}

Оно же с хешем djb2 1000000 интераций поиска 0.053000 секунды cpu MHz: 3501.009

long
hash(char *str)/*djb2*/
{
    register long hash = 5381;
    register int c;

    while ((c = *str++))

    hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

    return hash;
}


material_item material_entry_item2(material_entry* me, char* name) {

  for(int i = 0; i < me->num_items; i++){
    if(me->names[i][0] == name[0]){
    if(hash(me->names[i]) == hash(name)){
       return me->items[i];
    }}
  }

  material_item empty;
  memset(&empty, 0, sizeof(empty));
  return empty;
}

Сам файл материала выглядит так он загружается в в стуктуру material_entry каждая строка вносится в union material_item именно поиск item мы и выполняем по имени

float  sadfsdf = 0
int  sadfsadf = 0
bool dfgdfgdf = 0
float asdfaksdfhaskdjf = 0 
bool  sdfasdjfioasdjf = 0
int  fsdfaefasdfasdfas = 0
float  sadfasdfaefsf = 0
float aasdfasdfsadf = 0
float asiodufhaoiuefhw = 0
bool  654654sadfasdf = 0
int  fq34tgsergwtysdfgg = 0
float asdfasdfsdfasfwe = 0
bool sdfggesrdf = 0
int asdfgrstghrth = 0
int atyehdfdfhdfgh = 0
float adtghrt6htrh = 0
int test_value = 333

Ну первое что приходит на ум это добавить в material_entry поле hash куда делать предрасчёт хеша так мы сократим время поиска ещё в ~двое. Ну может у кого иди какае ещё будет как сделать ещё быстрее (без openmp и прочего параллелизма) Но основной вопрос про коллизии djb2, хочется их знать и проверять на этапе загрузки материалов.

Оригинальный код тут https://github.com/orangeduck/Corange/blob/master/src/assets/material.c https://github.com/orangeduck/Corange/blob/master/include/assets/material.h

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

чекер коллизий (без проверок аллокации, так что ну вы поняли) акоммулирует в себе всё уникальное чекает входящее и сохраняет в себе для последующих сравнений

void hash_cheker(char * str)
{

    static char ** hash_cheker_storage  = NULL;
    static long hash_cheker_storage_num = 0;
    
    if(hash_cheker_storage == NULL)
    {
        hash_cheker_storage_num++;
        hash_cheker_storage = malloc(sizeof(char**) * hash_cheker_storage_num+1);
        hash_cheker_storage[hash_cheker_storage_num-1] = malloc(sizeof(char)* strlen(str));
        memset(hash_cheker_storage[hash_cheker_storage_num-1],'\0',strlen(str));
        strcat(hash_cheker_storage[hash_cheker_storage_num-1],str);
        debug("HASH CHECK OK: %s ",str);
        return;
    }

    bool new_elem = false;
    for (int i = 0; i < hash_cheker_storage_num; i++)
    {
        if(strcmp(hash_cheker_storage[i],str) == 0)
        {
           return;
        };
    };


    for (int i = 0; i < hash_cheker_storage_num; i++)
    {
        if(hash(hash_cheker_storage[i]) == hash(str))
        {
            error("Сollision Hash between '%s' (%ld) and '%s' (%ld) choose another name for '%s'",
            hash_cheker_storage[i],hash(hash_cheker_storage[i]),
            str,hash(str),
            str);
            return;
        };
    };

    hash_cheker_storage_num++;
    hash_cheker_storage = realloc(hash_cheker_storage,sizeof(char**) * hash_cheker_storage_num+1);
    hash_cheker_storage[hash_cheker_storage_num-1] = malloc(sizeof(char)* strlen(str));
    memset(hash_cheker_storage[hash_cheker_storage_num-1],'\0',strlen(str));
    strcat(hash_cheker_storage[hash_cheker_storage_num-1],str);
   
    debug("HASH CHECK OK: %s ",str);
    for (int i = 0; i < hash_cheker_storage_num; ++i)
    {
        debug("HASH: %-10s = [%ld]",hash_cheker_storage[i],hash(hash_cheker_storage[i]));
    }
}

А вот вся суть


[DEBUG] (main.c:hash_cheker:78) HASH CHECK OK: asdfgrstghrth 
[DEBUG] (main.c:hash_cheker:81) HASH: sadfsdf    = [229482278995104]
[DEBUG] (main.c:hash_cheker:81) HASH: sadfsadf   = [7572915206835201]
[DEBUG] (main.c:hash_cheker:81) HASH: dfgdfgdf   = [7572282502104081]
[DEBUG] (main.c:hash_cheker:81) HASH: asdfaksdfhaskdjf = [1788434361038682215]
[DEBUG] (main.c:hash_cheker:81) HASH: sdfasdjfioasdjf = [-531356999790002134]
[DEBUG] (main.c:hash_cheker:81) HASH: fsdfaefasdfasdfas = [2674916009048082468]
[DEBUG] (main.c:hash_cheker:81) HASH: sadfasdfaefsf = [3622462406116730534]
[DEBUG] (main.c:hash_cheker:81) HASH: aasdfasdfsadf = [-7929917643305991168]
[DEBUG] (main.c:hash_cheker:81) HASH: asiodufhaoiuefhw = [-2980351034500385520]
[DEBUG] (main.c:hash_cheker:81) HASH: 654654sadfasdf = [6604793431210835103]
[DEBUG] (main.c:hash_cheker:81) HASH: fq34tgsergwtysdfgg = [7202372098568309662]
[DEBUG] (main.c:hash_cheker:81) HASH: asdfasdfsdfasfwe = [1799994182520512308]
[DEBUG] (main.c:hash_cheker:81) HASH: sdfggesrdf = [8246908965533417028]
[DEBUG] (main.c:hash_cheker:81) HASH: asdfgrstghrth = [-7043038456319946496]
[DEBUG] (main.c:hash_cheker:78) HASH CHECK OK: atyehdfdfhdfgh 

Сам материал же выглядит так

material_item material_entry_item2(material_entry* me, char* name) {

  register long hash_name = hash(name);
  for(register int i = 0; i < me->num_items; i++){
    if(me->hash[i] == hash_name){ //me->hash[i] предрасчитан заранее на этапе инициализации material_entry
       return me->items[i];
    }
  }

  material_item empty;
  memset(&empty, 0, sizeof(empty));
  return empty;
}

UDP: Правда я лоханулся ибо доступ к аллоцируемой памяти дольше и для предрасчёта надо брать статичный массив, а в нём уже ссылаться на позицию item. Ай да и ладно, пока что химичу, основной вопрос с колизиями решён, тему закрою. Но в целом, если использовать #pragma omp parallel for для поиска по strcmp() то эта комбина рвёт как тузик грелку поиск по хешу.

Deleted
()

Дизайн числовых полей ввода

 ,

Привет, подскажите, как правильно делать числовые формы ввода. Конкретно, интересют две вещи:

  • где располагать единицу измерения
  • по какому краю выравнивать названия полей

Вот для примера три варианта (названия выровнены по правому краю, относительно них вообще нет идей).

  • Var 1 — не понравился коллегам (самый ацтойный, по их мнению)
  • Var 2 — немного напрягает меня, т.к. буковки слегка замыливают циферки с точки зрения парсинга (может это только у меня так?)
  • Var 3 — единицу измерения сложнее вычленить визуально

Беглое гугление толком ответов не дало. Как делают такие формы правильные пацаны?

s3rjke
()

Чем легко переслать файл с одного хоста на другой в гетерогенной сети?

 , , , ,

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

Например, если это *nix<->*nix и ни на одной стороне нет ни SSH ни NFS-сервера, то начинаются всякие извраты типа расшаривания каталога на отдающей стороне по HTTP каким-нибудь gatling-ом и скачивание его на получателе wget-ом.

Если *nix<->Windows, то мучительное вспоминание опций вызова smbclient-а и расшаривание каталога в Винде (если есть на это права). Если прав нет, то опять вариант с HTTP.

Если Windows<->*nix и каталог не расшарить, то совсем всё плохо. Даже при наличии SSH-сервера на приёмнике, использование psftp не сахар.

Иногда выручает имеющийся в сети файловый сервер.

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

Если один из хостов работает под Андроидом, то дело вообще табак (флешку некуда сувать).

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

Хочется от непривилегированного пользователя на одном хосте дать команду «готов принять», а на другом — «кинуть этот файл тому хосту». Без СМС, регистрации, аутентификации, и зависимости от конкретной сети.

Лоровец, поделись своим опытом в этом вопросе и отговори меня от запиливания своего велосипеда (уже поздно).

unterwulf
()

C 8 Марта Девочки ::) ★★★★★

 

Deleted
()

Программы, которым нет аналогов на Linux

 , ,

Привет.

Скажите, есть ли такие программы на Windows/MacOS/smth else, вот которым вообще аналогов нет под Linux и вот прям нечем заменить?

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

zamazan4ik
()

По разнообразному пейзажу

 

А в каких играх можно заморачиваться с сюжетом, а можно просто отложить всё в сторону и пробежаться по разнообразной местности? Наподобие https://www.youtube.com/watch?v=jkDaWtT8ikU . (Помимо игр Bethesda.) Желательно под Линукс. Желательно бесплатно.

Итак:

  • Planet Nomads, если когда-нибудь выйдет релиз.
  • Everything, но 350 рублей за такое жалко. И кувыркание сводит атмосферность на нет.
  • Star Citizen, но он только в Стиме, и непонятно, что будет в итоговой версии.
  • Elite: Dangerous, но цена высоковата, планеты однообразны, а Линукс не поддерживается.
  • X3 — но в видео нужно очень долго искать поверхность планет. Настораживает.
  • Firewatch, Valley, WoW, Overgrowth, TES, Witcher 3 — но по отзывам и видео они не отличаются от «Сталкера», в котором свободой не пахнет. Значит, надо покупать котов в мешке, либо качать из сомнительных источников. И половина не поддерживает Линукс.
question4
()

Программа для определения качества настроек энкодера видео

 

Есть ли программа, которая следующую простыню:

Encoding settings : cabac=1 / ref=11 / deblock=1:-3:-3 / analyse=0x3:0x113 / me=umh / subme=11 / psy=1 / psy_rd=1.00:0.05 / mixed_ref=1 / me_range=48 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=0 / chroma_qp_offset=-3 / threads=6 / lookahead_threads=6 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=16 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=240 / keyint_min=23 / scenecut=40 / intra_refresh=0 / rc_lookahead=60 / rc=crf / mbtree=0 / crf=17.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / vbv_maxrate=50000 / vbv_bufsize=62500 / crf_max=0.0 / nal_hrd=none / filler=0 / ip_ratio=1.40 / pb_ratio=1.30 / aq=3:0.90
Приведет в нечто подобное: «2 прохода, ~veryslow»? Чтобы скопипастил в программу и сразу понял, не вчитываясь, что у того васяна хоть битрейт и на несколько мегабит выше, да настройки ultrafast, а у того, что с placebo, лучше будет, даже в случае если битрейт в 2 разе ниже

cast Napilnik

Moderators
()

Трехмерная печать в GNU/Linux

 ,

Привет, ЛОР.

Так получилось, что я давно сюда ничего не писал, и уже начал немного скучать. Давай я расскажу тебе про свой 3d принтер.

На скриншоте запечатлен процесс изготовления пластиковой детали, состоящий из разработки трехмерной модели, преобразования модели в G-code и печати на 3d принтере.

( читать дальше... )

Deleted
()

Какой почтовый сервер выбрать?

 

Арендовал VPS, настроил openVPN и захотелось мне свою собственную почту. В вопросе не особо разбираюсь, основы конечно постараюсь освоить но делать буду по какой-нибудь инструкции. Поэтому нужно что-нибудь не запредельно сложное и редкое, чтобы были инструкции с примерами в сети. Ну и конечно если уж вникать то во что-то перспективное, в то что может пригодится потом. ОС - Ubuntu Server 16.04.

mbivanyuk
()

SEO-шники тут есть?

 , , , ,

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

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

Inshallah
()

Подскажите CMSку моей мечты

 

Сразу скажу, не уверен, что такое вообще существует в природе, ибо требования у меня противоположны всему, что сейчас воспринимается как мейнстрим. В общем, нужна CMS для сайтов, которые заведомо _не_ относятся (и никогда не будут относиться) к категории «высоконагруженных». При этом имеются два совершенно категорических требования:

1) свободное распространение и использование без ограничений (в том числе без всяких обязательных ссылок и т.п.)

2) ничего тьюринг-полного на стороне клиента; JS, HTML5, CSS3 запрещены под страхом смертной казни, то есть если CMS генерит что-то из перечисленного, то она не рассматривается вообще, вот то есть даром не нужна; в идеале — генерит XHTML и использует мелкий CSS-файлик на десяток классов;

Кроме того, есть ещё несколько более мягких, но тоже существенных пожеланий:

3) Язык реализации. В идеале она вообще должна быть написана на C или C++ с использованием минимума (лучше — zero) внешних библиотек, но такого, скорее всего, не бывает. PHP я терпеть ещё готов, Perl с его системой библиотек и dependecny hell — уже с трудом, что касается Питона, Руби, Джавы и прочей экзотики — мне проще будет её самому написать. Или без сайта обойтись.

4) Хранилище. Идеальная с моей точки зрения CMS не использует никакие СУБД вообще от слова совсем, то есть даже SQLite. Для хранения всего и вся — обычные текстовые файлы в обычных директориях.

5) Кастомизация. Сменные темы, среди которых есть что-нибудь лёгкое и НЕ привязанное к конкретной ширине экрана.

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

Если кто видел что-то подобное, киньте ссылочку :-)

Croco
()