LINUX.ORG.RU

Избранные сообщения LINUX-ORG-RU

И Снег и Сугробы и Ёлки на вашем ПеКа

 , , ,

--           Зависимости              -
---------------------------------------
-- curl    -  загрузка ёлочек         -
-- scrot   -  снимок рабочего стола   -
-- love2d  -  запуск снежка и ёлочек  -
---------------------------------------
-- Создать каталог `новый_год`        -
-- Создать в каталоге файл `main.lua` -
-- Скопировать в файл этот код.       -
-- Используя терминал запутсить из    -
-- созданного каталога программу      -
--                                    -
--   Вот так запустить  `love .`      -
---------------------------------------
--            Управление              -
---------------------------------------
-- Нажать 1 - установит фон рабочего  -
--            стола в программе, как  -
--            будто на нём идёт снег  -
---------------------------------------
-- Нажать 2 - убрать сугробы, но снег -
--            то падает и они вырастут-
--            снова, но другие уже :) -
---------------------------------------
-- Нажать 3 - Загрузить и отобразить  -
--            просту ёлочку           -
---------------------------------------
-- Нажать 4 - Загрузить и установить  -
--            нарядную новогоднюю ёлку-
---------------------------------------
-- Нажать 5 - Вернуть чёрный фон      -
---------------------------------------
--    Нажать esc или q для выхода     -
---------------------------------------
-- Программа проверяет время и если   -
---------------------------------------
-- Время 23:45 - Загружается и отобра -
--               жается простая ёлочка-
---------------------------------------
-- Время 00:00 - Загружается и отобра -
--               жается нарядная ёлка -
---------------------------------------
-- Эти действия по времени происходят -
-- автоматически предупреждая о под-  -
-- ходе и наступлении нового года гы  -
---------------------------------------
-- Устанавливать ли фон автоматически -
---------------------------------------
local autobackround = false; --вкл/выкл
---------------------------------------
local sugrob = {}
local snow   = {};
local snow_opacity = 0;
local screen_width = 0;
local screen_height= 0;
local tree_image = nil;
local background = nil;
local tree_opacity = 0;
local tree_url =
{
  [1] = 'https://i.ibb.co/f24xCMp/1.png';
  [2] = 'https://i.ibb.co/KLpSKdZ/2.png';
};
local once_call_tree_1 = true;
local once_call_tree_2 = true;
----------------------------------------
function get_app_path()
    return love.filesystem.getSaveDirectory()..'/';
end
function load_tree(id)
   if love.system.getOS() == 'Android' then
      if id == 1 then
         tree_image = love.graphics.newImage('tree_1.png');
      end
      if id == 2 then
         tree_image = love.graphics.newImage('tree_2.png');
      end
      tree_opacity = 0;
      return;
   end
   local path = get_app_path();
   os.execute('curl '..tree_url[id]..' --output '..path..'tree.png');
   if love.filesystem.getInfo('tree.png')  then
      tree_image = love.graphics.newImage('tree.png');
      tree_opacity = 0;
   end
end
function draw_tree()
    if tree_image then
    local w = love.graphics.getWidth()
    local h = love.graphics.getHeight()
    local sx,sy = w/tree_image:getWidth(),h/tree_image:getHeight();
    love.graphics.setColor(1,1,1,tree_opacity);
       love.graphics.draw(tree_image,0,0,0,sx,sy);
    end
end
function update_tree(dt)
    if tree_opacity < 1 then
       tree_opacity = tree_opacity + 0.1 * dt;
    end
end
function create_sugrob()
    if love.system.getOS() == 'Android' then
       return;
    end
    local x = love.graphics.getWidth()
    local y = love.graphics.getHeight()
    local s = x/y;
    for i=1,50 do
        local xp = love.math.random(0,x);
        local cs = love.math.random(s*25,s*75);
        table.insert(sugrob,{'fill',xp,y,cs,150})
    end
end
function draw_sugrob()
    if love.system.getOS() == 'Android' then
       return;
    end
    love.graphics.setColor(0.95,0.95,1,1);
    for i=1,#sugrob do
        love.graphics.circle(sugrob[i][1],sugrob[i][2],sugrob[i][3]+sugrob[i][5],sugrob[i][4]);
    end
end
function update_sugrob(dt)
    local x,y = love.window.getMode();
    for i=1,#sugrob do
        if sugrob[i][5] > 0 then
           sugrob[i][5] = sugrob[i][5] - love.math.random(0.0,i*0.05)
        end
    end
end
function create_snow()
    local x = love.graphics.getWidth()
    local y = love.graphics.getHeight()
    local s = x/y;
    for i=1,60 do
        local xp = love.math.random(0,x);
        local xy = love.math.random(0,y);
        local cs = love.math.random(s*1,s*10);
        table.insert(snow,{'fill',xp,xy,cs,0})
    end
end
function draw_snow()
    for i=1,#snow do
        love.graphics.setColor(0.95,0.95,1,snow_opacity);
        love.graphics.circle(snow[i][1],snow[i][2],snow[i][3],snow[i][4]+snow_opacity);
    end
end
function lerp(from, to, t)
  return t < 0.5 and from + (to-from)*t or to + (from-to)*(1-t)
end
function update_snow(dt)
    local x,y = love.window.getMode();
    if snow_opacity < 0.7 then
       snow_opacity = snow_opacity + 0.1 * dt;
    end
    for i=1,#snow do
        snow[i][3] = snow[i][3] + i * 0.5;
        if snow[i][5] == 1 then
           snow[i][2] = snow[i][2] + i * 0.25 + i * 0.5 + love.math.random(0,3);
       elseif snow[i][5] == 0 then
           snow[i][2] = snow[i][2] - i * 0.25 + i * 0.5 + love.math.random(0,3);
        end
        if(snow[i][3] > y + snow[i][4]) then
          snow[i][3] = -snow[i][4];
          snow[i][2] = love.math.random(0,x);
          snow[i][5] = love.math.random(-1,1);
        end
    end
end
local button_colors =
{
    {0.5,0.0,0.0,1},
    {0.0,0.5,1.0,1},
    {0.0,0.0,1.0,1},
    {0.5,0.5,1.0,1},
    {0.0,0.5,1.0,1},
}
local button_circles = {}
local show_controls  = false;
function create_controls()
   local x = love.graphics.getWidth()
   local y = love.graphics.getHeight()
   local pose_y = (y * 0.5);
   local radius = (x * 0.01) * 5;
   for i=1,5 do
       local pose_x = radius*i * 3.5;
       table.insert(button_circles,{'fill',pose_x,pose_y,radius,button_colors[i]})
   end
end
function draw_controls()
   if show_controls then
      local b = button_circles;
      for i=1,#button_circles do
          love.graphics.setColor(unpack(b[i][5]));
          love.graphics.circle(b[i][1],b[i][2],b[i][3],b[i][4]);
      end
   end
end
function update_controls(px,py)
   if show_controls then
       local b = button_circles;
       for i=1,#button_circles do
           local cx,cy,cr = b[i][2],b[i][3],b[i][4];
           if((px - cx)^2 + (py - cy)^2 < cr^2) then
              if i == 1 then set_background(); end
              if i == 2 then sugrob = {}; create_sugrob(); end
              if i == 3 then load_tree(1);   end
              if i == 4 then load_tree(2);   end
              if i == 5 then background=nil; end
           end
       end
    end
end
function love.displayrotated(index, orientation)
    sugrob = {};
    create_sugrob();
    snow = {};
    create_snow();
    snow_opacity = 0;
    tree_opacity = 0;
    button_circles = {};
    create_controls();
end
function love.mousepressed(x,y)
    if love.system.getOS() ~= 'Android' then
       update_controls(x,y)
       show_controls = not show_controls;
    end
end
function love.touchpressed(b,x,y)
    update_controls(x,y)
    show_controls = not show_controls;
end
function love.load()
    love.filesystem.write('init','x',1);
    if love.filesystem.getInfo('icon.png') then
       love.window.setIcon(love.image.newImageData('icon.png'));
    end
    love.window.setTitle("Маааленькой ёёёлочке холодно зимооой.")
    if love.system.getOS() == 'Android' then
       love.window.setMode(1280,720,{fullscreen=true,resizable=true,vsync=true});
       screen_width = love.graphics.getWidth()
       screen_height = love.graphics.getHeight()
    else
       love.window.setMode(0,0,{resizable=true,borderless=true})
       love.window.setFullscreen(true,'desktop');
       screen_width = love.graphics.getWidth()
       screen_height = love.graphics.getHeight()
       love.window.setMode(0,0,{resizable=true,borderless=true})
       love.window.maximize()
    end
    create_sugrob()
    create_snow()
    create_controls()
end
function set_background()
   if love.system.getOS() == 'Android' then
      return;
   end
   local x,y = love.window.getMode();
   love.window.minimize()
   love.timer.sleep(1)
   local path = get_app_path()
   local status = os.execute('scrot -a '..screen_width-x..','..screen_height-y..','..x..','..y..' -o '..path..'screen.png');
   love.window.restore()
   love.window.maximize()
   if love.filesystem.getInfo('screen.png') then
      background = love.graphics.newImage('screen.png');
   end
end
if autobackround then
   set_background()
end
function love.keypressed(key)
   if key == 'q' or key == 'escape' then
      love.event.quit()
   end
   if key == '1' then set_background(); end
   if key == '2' then sugrob = {}; create_sugrob(); end
   if key == '3' then load_tree(1);   end
   if key == '4' then load_tree(2);   end
   if key == '5' then background=nil; end
end

function love.update(dt)
    if os.date('%H%M') == '2345' then
       if once_call_tree_1 then
          load_tree(1);
          once_call_tree_1 = false;
       end
    end
    if os.date('%H%M') == '0000' then
       if once_call_tree_2 then
          load_tree(2);
          once_call_tree_2 = false;
       end
    end
    update_snow(dt)
    update_tree(dt)
    update_sugrob(dt)
end
function love.draw()
    if background then
       love.graphics.setColor(1,1,1,1);
       love.graphics.draw(background)
    end
    draw_tree();
    draw_sugrob();
    draw_snow();
    draw_controls();
end

Внешний вид. Видео. Досвиданья.


По просьбе @apt_install_lrzsz сборки


Добавил кнопки появляются и исчезают по нажатию на экране.
Как альтернатива нажатия 1,2,3,4,5.
На Андроиде часть не работает.


В истории правок этого сообщения есть прошлая версия, если с этой пробелмы, но прошлая только для ПК.

LINUX-ORG-RU
()

Дёргание SOшки из Love файла - обходной путь.

 , , , ,

Ну… не совсем из love файла, но около того.
В общем так, для начала сразу скажу что делать так не надо.
Но если очень хочется то можно.

В чём суть, вы например написали программу/игру на Love2D и вам вдруг ну очень хочется добавить к ней вашу библиотеку типа libcool.so в которой что-то делается и вы эту библиотеку вызываете из вашего lua кода, только вот беда. Если вы создали love файл mycoolgame.love и положили в него libcool.so ваш код не сможет загрузить библиотеку libcool.so ибо mycoolgame.love это zip архив. Ну, не получится и всё тут. Но если очень хочется то есть черезжопный метод, мы внутри нашего love файла создадим архив с нашей библиотекой и возможно дополнительными файлами, при запуске, мы монтируем этот архив и распаковываем в каталог игры и автоматически добавляем пути до распакованных файлов в cpath и path.

Например вот наша библиотека которую мы хотим распространять вместе с нашей игрой прямо в love файле.

#include <stdio.h>

#ifdef LUAJIT
#include <luajit-2.1/lua.h>
#include <luajit-2.1/lualib.h>
#include <luajit-2.1/lauxlib.h>
#else
#include <lua5.1/lua.h>
#include <lua5.1/lualib.h>
#include <lua5.1/lauxlib.h>
#endif

int example_c_function(lua_State* L)
{
    int a = lua_tointeger(L,1);
    a+=a;
    lua_pushnumber(L,a);
    lua_pushstring(L,"hello from c");
    return 2;
}

int luaopen_lib(lua_State* L)
{
    static const struct luaL_Reg nativeFuncLib [] =
    {
         {"example_c_function", example_c_function},
         {NULL, NULL}
    };
    luaL_register(L, "lib", nativeFuncLib);
    return 1;
}

Соберём её

gcc -DLUAJIT=1 main.c `pkg-config --libs --cflags luajit` --shared -o lib.so

Аахивируем её

mkdir libs
cp lib.so libs/lib.so
zip -r9 libs.zip libs

А вот собственно сама суть и сам механизм распаковки и импорта путей.

function autoreq(zip)
    if not zip then
       print("[autoreq] failed get zip archive for unpack, argument is 'nil'")
       return false;
    end
    local function unpack(dirname,mount_point,base)
        local items = love.filesystem.getDirectoryItems(mount_point)
        if items then
            for _,val in pairs(items) do
                local path = dirname..'/'..val;
                local path_mount = mount_point..'/'..val;
                if love.filesystem.getInfo(path_mount,'directory') then
                   package.path  = package.path  ..';'..base..'/'..path..'/?.lua;';
                   package.cpath = package.cpath ..';'..base..'/'..path..'/?.so;';
                   love.filesystem.createDirectory(path)
                   unpack(path,path_mount,base)
                 elseif love.filesystem.getInfo(path_mount,'file')then
                        print("[autoreq] unpack -> "..val)
                        love.filesystem.write(path,love.filesystem.read(path_mount));
                else
                   print("[autoreq] ok -> "..val)
                end
            end
        end
    end
    local base = love.filesystem.getSaveDirectory();
    print("[autoreq] check depends in '"..base.."'")
    local dirname = "libs"
    local mount_point = "_autoreq_libs_"
    local dir = love.filesystem.createDirectory(dirname)
    local dir = love.filesystem.createDirectory(mount_point)
    data, err = love.filesystem.newFileData(zip)
    if not data then
       print("[autoreq] failed get zip archive for unpack -> '"..zip.."'")
       return false;
    end
    local success,msg = love.filesystem.mount(data,mount_point)
    unpack(dirname,mount_point,base);
    love.filesystem.setRequirePath ( package.path  );
    love.filesystem.setCRequirePath( package.cpath );
    local success,msg = love.filesystem.unmount(data);
    love.filesystem.remove(mount_point);
    print("[autoreq] all done okey")
    return true;
end

autoreq("libs.zip"); -- вызываем распаковку архива с библиотекой и импорта путей
require('lib'); -- вызываем нашу библиотеку

function love.load()
print(lib.example_c_function()) -- вызываем функцию из неё
end

Создаём love файл с нашей программой и её зависимостями

zip -r9 coolgame.love  main.lua libs.zip

Запускаем

love coolgame.love 
[autoreq] check depends in '/home/dron/.local/share/love/coolgame'
[autoreq] unpack -> lib.so
[autoreq] all done okey
0	hello from c

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

dron@gnu:~/.local/share/love$ tree 
.
└── coolgame
    └── libs
        └── libs
            └── lib.so

4 directories, 1 file
dron@gnu:~/.local/share/love$ 

Ну вот собственно и всё. На деле можно в lib.zip насовать произвольные файлы, с произвольными каталогами, например выполнить сборку openssl/luasec/luasocket

luarocks --tree `pwd`/luasec install openssl
luarocks --tree `pwd`/luasec install luasec
zip -9 -r libs.zip luasec -x 'luasec/lib/luarocks*'

И получившийся libs.zip просто добавить в свой love файл тем самым получив всё что нужно для работы с https в вашей программе. Я так и сделал в своей проверялке новостей например. Работать будет всё абсолютно прозрачно, ничего в коде учитывать и менять не надо. В том и прелесть. Ну разве что один раз вызвать autoreq('libs.zip') и всё.

Да, теряется смысл в переносимости love файлов ведь теперь там платформоспецифичные библиотеки таскаются. Но это просто вариант таскания с собой soшки если уж надо, но без всяких appimage упаковок и прочего, по иному дёрнуть внешнюю библиотеку из своей поставки из архива, просто никак нельзя. Но порой вот надо бывает. Я голову ломал довольно долго если честно пока не допёрло. Может кому пригодится.

Вроде всё. Досвиданья.

LINUX-ORG-RU
()

Воспроизведение ссылок через mpv на вашем ПеКа

 , , , , удобное

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

  • фильмом
  • ютубом
  • музыкой
  • картинкой
  • порнух… ой!

Нажать горячую клавишу и всё.

Зависимости: apt install mpv lua xclip

#! /bin/env lua
---------------
local function play_mpv()
    local appclip = nil;
    local youtudl = nil;
    local session = os.getenv('XDG_SESSION_TYPE');
    local have_mpv  = os.execute('mpv --version 2>/dev/null');
    local have_xclip = os.execute('xclip -version 2>/dev/null');
    local have_ytdlp  = os.execute('yt-dlp --version 2>/dev/null');
    local have_wlpaste = os.execute('wl-paste --version 2>/dev/null');
    local have_youbedl  = os.execute('youtube_dl --version 2>/dev/null');
    if(not have_mpv) then
      os.execute('notify-send "Для работы требуется mpv плеер"');
      os.exit(1)
    end
    if(not session) then
      os.execute('notify-send "Неизвестный тип сессии, задайте x11 или wayland"');
      os.exit(2);
    end
    if(have_xclip and session == 'x11') then
       appclip = 'xclip -o';
    end
    if(have_wlpaste and session == 'wayland') then
       appclip = 'wlpaste -p';
    end
    if(not appclip) then
       os.execute('notify-send "Нужно установить xclip для X11 или wl-paste для Wayland"');
       os.exit(3);
    end
    if(io.popen(appclip):read('*l'):sub(1,4)~='http') then
       os.execute('notify-send "Это не ссылка для воспроизведения"');
       os.exit(4);
    end
    youtudl = have_youbedl and 'youtube_dl' or nil;
    youtudl = have_ytdlp   and 'yt-dlp'     or youtudl;
    if(youtudl) then
       os.execute('notify-send Воспроизводится "$('..
       youtudl..' --skip-download --get-title  "$('..appclip..')")\n"$('..appclip..')"" &');
    else
       os.execute('notify-send "Неизвестное название"');
    end
    local success, meta , code = os.execute('mpv --keep-open=yes --loop "$('..appclip..')" > /dev/null 2>&1');
    if tonumber(code) ~= 0 or success == nil then
       os.execute('notify-send -u normal Ошибка-mpv:'..meta..':'..code);
       os.exit(5);
    end
end
-- run run run
-- дрынь на-на
play_mpv();

Ну и предупреждение.

- ИСПОЛЬЗОВАТЬ НА СВОЙ СТРАХ И РИСК, Я НЕ НЕСУ НИКАКОЙ ОТВЕТСТВЕННОСТИ
- ВСЁ ПРЕДОСТАВЛЯЕТСЯ КАК ЕСТЬ, ЛЮБЫЕ СОМНЕНИЯ ДОЛЖНЫ ВЕСТИ
- К ОТКАЗУ ОТ ИСПОЛЬЗОВАНИЯ
- ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!!
- В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК
- И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША ВИНА И ВАШИ ПРОБЛЕМЫ

Тест: Выделить ссылку и нажать F8 (иксы автоматически копируют выделенное есчё)

Да, примитив. Но зато очень удобно.
Досвиданья :3

LINUX-ORG-RU
()

Эталонные наборы данных для оценки сжатия

 , , датасет, палата мер и весов, сжатие данных

Есть ли такие? Краткий поиск через поиск ничего не показал или я не знаю как искать. Суть проста, очередной дурак (я) играется с очередным своим (а на деле велосипедным наверное) «алгоритмом» сжатия, без цели, а просто за интерес. Ну, понятно что вся суть итоговая с какими данными то или иное работает лучше, универсальных алгоритмов сжатия не существует. Но чисто для своего удобства хотелось бы иметь некий набор, например данные состоящие только из уникальных значений, данные с последовательным повторением, оно же но с разной частотой повторений или размерами этих самых повторений, смешанные данные в разных пропорциях и так далее и так далее, как набор искусственных данных для синтетической оценки коэффициентов сжатия так и реальных наборов и их комбинаций так сказать типичных в повседневной практике.

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

Можно самому напридумывать конечно, но лень и возможно будет некорректно, может есть что? А то просто совать что под руку попадётся в целом прикидывая что внутри такое себе.

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

В целом не критично, но просто если такое есть было бы удобно.
Как-то так. Может кто знает? Где и куда копать.
Если такого не существует, то надо будет заняться.

Перемещено hobbit из general

LINUX-ORG-RU
()

Новая жизнь TheirBirthday

 

С тех пор я каждый день пользуюсь этим великолепным творением и вспоминаю его замечательных создателей tiinn и hobbit с благодарностью :=)

И все было хорошо до тех пор, пока мне не пришлось перехать с Intel на ARM64, т.е. на aarch64.
И тут начались проблемы, потому что в основных репозитариях Arch и AUR этого напоминателя пока не нашлось.

В этом посте greenman выложил PKBUILD, который, если правильно понимаю, нужен для компиляции TheirBirthday под Arch.
Только я в ней не разбираюсь, и может, кто-то поможет портировать TheirBirthday в новую среду?

chukcha
()

Я выиграл!

 

Score: 777

Число попытоккомментариев: 13016

Курс скора по ЦентроЛОРБанку 0,059695759 за сообщение.


13016 - минимум столько же раз вы просрёте все свои деньги в лотереях, казино, одноруких бандитах и прочих ставки на… если будете соваться в это болото.
Поэтому не играйте в азартные игры и пусть всё будет хорошо =)

LINUX-ORG-RU
()

Идентификация строк (hash? не hash?). Не хватает матчасти.

 

Перенося различную мета-информацию (например информацию о покрытии тестами, или комментарии) между немного разными комплектами исходников возникает желание идентифицировать строки не по номеру, который может легко сползти, а по какому-то идентификатору вычисленному из самой строки…

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

   }

будет встречаться немыслимое количество раз, и ее идентификатор явно должен вычисляться не только из самой строки, но и из ее окружения… Быть каким-то составным, скорее…

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

Нет ли какой-то метрики позволяющий оценить насколько строка «самобытна». Это скобка среди пробелов, или много разных слов. Чтобы можно было

Не решались ли подобные задачи ранее? Вдруг в недрах какого-нибудь git’а все уже придумано?

Где-бы почитать про разные метрики которые можно применить к текстовым объектам, в том числе с целью их идентификации… По каким ключевым словам искать? Мне однозначно не хватает базовой теории, а интернет полон искусственного интеллекта и блокчейна…

shaplov
()

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

 , , , ,

Я вааааааще не в курсе что сейчас актуально, адекватно, живо и всё такое. Короче кто чем пользуется?

Хочется:

  • Кучки мелких разовых подработок, аля
    • «сбацать скриптик на коленке за пясот рублей» :D
    • «исправить багу»
    • «доработать/переработать/добавить/выкинуть»
    • и прочие такие вот точечные штучки дрючки
  • Нет обязательной оплаты аккаунта к доступу отзываться на подработки, сразу в сраку такое.
  • Нет проблем с оплатой на обычные карточки и железобетонная работа в РФ.
  • Нет запросов аля «подтвердите аккаунт фотой с разворотом паспорта» и прочего дебилизма.

Для общего так сказать интереса и развития, кто чего использует и какие у вашего варианта минусы и плюсы для вас? Я конечно погуглить могу и фейковые отзывы на отзывиках почитать и проплаченые статьи на сайтах аля «10 лучших фриланс бирж!» и даже делаю это, но и тут думаю спросить будет не лишним.

Заранее спасиба 😊

LINUX-ORG-RU
()

Идентификация переживающая очистку печенек и истории

 , ,

Есть такое? Вот зашёл я на rtings, а у них счётчик, капиталюги-жадюги. 3 девайса посмотрел - потом плоти. Очистка данных спасает, пока что. Не хочу дожить до момента когда перестанет спасать, хочу сам такую гадость сделать. Есть идеи?

DumLemming
()

Та самая статистика

 ,

Ко дню знаний:

linux=# select users_on.nick, count(*) from (select comments.userid, comments.reactions from comments join topics on comments.topic=topics.id where not comments.deleted and not topics.deleted union all select userid, reactions from topics where not deleted) as messages join users as users_on on (users_on.id=messages.userid), jsonb_each_text(reactions) join users as users_who on (users_who.id=key::int) where value=E'\U0001F921' and not users_on.blocked and not users_who.blocked group by users_on.nick order by count desc limit 20;

     nick     | count 
--------------+-------
 alex1101     |   415
 ox55ff       |   283
 Dimez        |   210
 ips2010      |   202
 xwicked      |   189
 windows10    |   186
 Shushundr    |   185
 LINUX-ORG-RU |   184
 hateyoufeel  |   180
 t184256      |   177
 papin-aziat  |   172
 wandrien     |   167
 serg002      |   163
 firkax       |   158
 sanyo1234    |   148
 Werenter     |   139
 monkdt       |   134
 dataman      |   126
 tempuser003  |   122
 SerW         |   118
(20 строк)


maxcom
()

TOTP 2FA приложения: для GitHub и не только

 , , ,

В связи с тем, что GitHub ещё раз более настойчиво начал напоминать о необходимости включить 2FA, стало интересно: какими приложениями для этих пользуются пользователи ЛОР?

Какими ещё пользовались и что в них нравилось или не нравилось?

grem
()

Научите готовить бинарник, чтобы addr2line распознавал адреса функций

 ,

Всем привет, хочу найти утечку с помощью функций mtrace/muntrace, но не могу понять, почему утилита addr2line не может перевести адрес в код и строку.

Вот демо-пример:

#include <mcheck.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
    mtrace();

    for (int j = 0; j < 2; j++)
        malloc(100);            /* Never freed--a memory leak */

    calloc(16, 16);             /* Never freed--a memory leak */
    exit(EXIT_SUCCESS);
}

Пробовал собирать с разными уровнями включения отладочных символов:

g++ -g test.cpp -o test
g++ -g3 -ggdb test.cpp -o test
g++ -g3 test.cpp -o test
g++ -O0 -g3 test.cpp -o test
g++ -g -rdynamic test.cpp -o test
g++ -g3 -rdynamic test.cpp -o test

Запускаю приложение: MALLOC_TRACE=/tmp/test.log ./test

Получаю вывод с помощью команды mtrace ./test /tmp/test.log:

Memory not freed:
-----------------
           Address     Size     Caller
0x00005586d69a6690     0x64  at 0x5586d6472190
0x00005586d69a6700     0x64  at 0x5586d6472190
0x00005586d69a6770    0x100  at 0x5586d64721a5

Утилита mtrace пытается конвертировать адреса в читабельные строки в коде с помощью addr2line, но ничего не выходит. Что я делаю не так?

Дополнительная информация:

  1. Когда в malloc включена трассировка, адреса вызывающих функцию malloc/realloc/free функций определяются через встроенную в gcc функцию: __builtin_return_address(0)
  2. Далее этот адрес через функцию dladdr преобразуется в пару <бинарник>[адрес]
  3. утилита mtrace использует далее парсит пару <бинарник>[адрес] и отдает addr2line
sotlef
()

Но зачем?

Вот так с помощью нехитрых приспособлений буханка черного или белого хлеба превратилась в троллейбус.

Вот еще ракурс. Have a nice day

bl
()

🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡

 clown

🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡🤡
🤡🤡🤡🤡🤡
🤡🤡🤡🤡
🤡🤡🤡
🤡🤡
🤡

LINUX-ORG-RU
()

Простите бога ради ``\/^.^\/``

 , , , ,

Но что-то я туплю конкретно.

Есть к примеру такая сетка 8x8

 _0_1_2_3_4_5_6_7                         _0__1__2__3__4__5__6__7
0|0 0 0 0 0 0 0 0                        0|0  1  2  3  4  5  6  7
1|0 0 0 0 0 0 0 0                        1|8  9  10 11 12 13 14 15
2|0 0 0 0 0 0 0 0 (с вот таким порядком) 2|16 17 18 19 20 21 22 23
3|0 0 0 0 0 x 0 0 ---------------------> 3|24 25 26 27 28 x  30 31 
4|0 0 0 0 0 0 0 0                        4|32 33 34 35 36 37 38 39
5|0 0 0 0 0 0 0 0                        5|40 41 42 43 44 45 46 47
6|0 0 0 0 0 0 0 0                        6|48 49 50 51 52 53 54 55
7|0 0 0 0 0 0 0 0                        7|56 57 58 59 60 61 62 63 

Тут позиция по ординатам x = 3x5, номер x = 29

Как быстро преобразовывать позицию x в координату x:y и обратно, без циклов.

Ну например ячейка 43 вычисляем 5x3, есть позиция 5x3 вычисляем 43.

Реальная сетка у меня 255x255 то есть 65536 позиций. Так что switch() не прокатит.

Я вот прям чёт не догоняю и меня переклинило уже, аж прям бесит и ощущение что я придурок =(


UDP: >>>>>> Решено

UDP:2 >>>> Фикс косяка

LINUX-ORG-RU
()

Перепакуйте rar в zip пожалуйста, если не трудно

 ,

Озвучка для игры https://drive.google.com/file/d/1Kx_1Zw5MtkJF2A5uypOYlyMD9ixb6h83/view?usp=sharing

unrar не хочет, в man про конвертацию локали ничего нет.

unrar: Pathname cannot be converted from UTF-16BE to current locale.

RAR archive data, v4, os: Win32

Игра The stanly parable если что, досталась на халяву ::)

LINUX-ORG-RU
()

Revision Demoparty 2023

 , , , ,

Стартанул Revision Demoparty 2023.
Ждём приколюх, докладов графических психов и крутых демосценеров и их шизофреничных проектов.
Наконец IRL, может быть с кодированием в прямом эфире в виде шоу, попозже.

Летс маза факинг гооооуууууууууууууууууууууууууууууууууууууууууууууууууууу

 █▄▄▄▄ ▄███▄       ▄   ▄█    ▄▄▄▄▄   ▄█ ████▄    ▄           
+█  ▄▀ █▀   ▀       █  ██   █     ▀▄ ██ █   █     █          
-█▀▀▌  ██▄▄    █     █ ██ ▄  ▀▀▀▀▄   ██ █   █ ██   █         
+█  █  █▄   ▄▀  █    █ ▐█  ▀▄▄▄▄▀    ▐█ ▀████ █ █  █         
-  █   ▀███▀     █  █   ▐             ▐       █  █ █         
  ▀               █▐                          █   ██         
                  ▐                                          

Живая трансляция

Выкладки работ, презентации, доклады

Место для публикации работ

LINUX-ORG-RU
()

Почтальонов 20 лет по ошибке сажали в тюрьму из-за «кривого» ПО

 

Британская почтовая компания Post Office десятками лет использовала ПО Horizon с ошибкой в коде. Оно применялось для учета всех продаж и вело неверные подсчеты. Программа указывала на недостачу денег, и сотрудники компании, «ответственные» за нее, попадали в тюрьму или лишались личных сбережений, а некоторые даже кончали с собой. Количество пострадавших исчисляется сотнями.

Без вины виноватые

Сотрудники британской почтовой компании Post Office Ltd. на протяжении последних 20 лет рисковали оказаться за решеткой или как минимум без жилья и средств к существованию из-за ошибок в программном обеспечении. Как пишет портал The Verge, компания использовала специализированный софт Horizon, принадлежащий японской Fujitsu. За ее разработкой стоит британская ICL – она создала Horizon в 1995 г. В 1998 г. Fujitsu стала единственным акционером ICL, а в 2002 г. она перестала существовать под своим именем и была переименована в Fujitsu.

В Horizon присутствовала фатальная ошибка, из-за которой ПО вело неправильные подсчеты и раз за разом показывало недостачи денег, которые руководители почтовых отделений Post Office затем приписывали сотрудникам отделений. В компании были уверены в том, что Horizon работает безупречно.

BBC пишет, что случай с Post Office стал крупнейшей судебной ошибкой за всю историю Великобритании, поскольку из-за бага в Horizon пострадали без преувеличения сотни невиновных людей. Сама компания существует с 1986 г., и на начало 2019 г. ее штат насчитывал свыше 5000 сотрудников.

Сломанные судьбы
BBC пишет, что из-за программистов ICL и руководства Post Office жизнь многих сотрудников почтовых отделений была разрушена. От кого-то ушел супруг, а кто-то, как, например, Джанет Скиннер (Janet Skinner), лишился возможности растить своих детей.

Скиннер не просто разлучили с детьми – ее посадили в тюрьму на девять месяцев после того, как злополучное детище Fujitsu выявило в отделении, в котором она работала, недостачу в размере 59 тыс. фунтов стерлингов (6,148 млн руб. по курсу ЦБ на 26 апреля 2021 г.).

Но случай Джанет Скиннер далеко не самый вопиющий. Уверенность британских руководителей в том, что японское ПО безупречно, привело к тому, что свободы лишилась ни в чем не повинная беременная женщина. И даже это, как выяснилось, не предел – в одном из офисов компании Post Office программа Horizon выявила недостачу почти в 100 тыс. фунтов стерлингов (10,42 млн руб.). Ее «повесили» на сотрудника отделения, и тот, узнав об этом, покончил жизнь самоубийством. Это не надоумило руководство Post Office проверить, все ли в порядке с ПО Fujitsu. В итоге всего несколько месяцев спустя новый сотрудник, заменивший покончившего собой, тоже пострадал из-за ошибок в работе Horizon.

Британская судебная система была беспощадная не только к беременным женщинам, но и к пожилым мужчинам. Так, 62-летний Виджай Парех (Vijay Parekh), пишет The Guardian, провел в тюрьме полгода. Его обвинили в краже 72 тыс. фунтов стерлингов (7,5 млн руб.), и адвокат посоветовал ему признать вину.

Тюрьма или потеря жилья
По информации BBC, ошибочные подсчеты, производимые Horizon, привели, в общей сложности, к судебному преследованию почти 740 сотрудников Post Office за период с 2000 по 2014 гг. Число людей, получивших повестки в течение последних семи лет, еще подлежит уточнению.

Вариантов у работников Post Office, оказавшихся «под прицелом» ПО Horizon, было не так уж много. Кто-то отправлялся в тюрьму, а кто-то мог остаться без единого фунта сбережений в попытке покрыть недостачу, которой на самом деле не было, из своего кармана.

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

Horizon все еще работает...
https://www.cnews.ru/news/top/2021-04-26_krivoj_soft_krupnoj_pochtovoj

https://en.wikipedia.org/wiki/Horizon_(IT_system)

novus
()

Потестируйте мою игрушку?

 ,

Написал свой карточный сим - игрушку типа Stacklands, картинки по ссылке:
https://imgur.com/a/hoSITMv

Бета-билды есть для Lin/Win/Mac/Android. Пока интерфейс только на английском, переводом на все языки еще не озадачился.

Есть желающие потестить?

Магазин (itch.io):
https://stacksengine.itch.io/stacks-space

Shadow_Walker
()

Переводилка для вашего ПекА

 , , , ,

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

Обновлено.

Зависимости apt install lua xclip xsel xdotool aosd_cat translate-shell

Вопщем таксь.
Порой, нужно не просто выделить текст где угодно и увидеть его по перевод по горячей клавише,
но и получить его перевод в виде текста. К счастью в x11 есть аж три буфера обмена.
Поэтому добавил опцию copy_translated=true/false.

Суть проста:

  • вешаете скрипт, например на F7
  • выделяете произвольный текст без его копирования через контекстное меню(как и было)
  • нажимаете F7 и
  • всплывает текст перевода (как и было)
  • нажимаете среднюю кнопку мышки и в любом поле ввода вставляется оригинальный текст
  • нажимаете правую кнопку мышки и через контекстное меню делаете вставить и вставляется переведённый вариант
  • повторное нажатие F7 ещё раз покажет перевод, без повторного выделения
#! /bin/env lua
local poptrans =
{
    -- select language from lang to lang
    lang_from = "auto", --auto,en,fr,de or other
    lang_to   = "ru",
    -- copy translated text to clipboard
    -- if you select text (no use context menu textcopy)
    --   - middle mouse button paste translated text
    --   - right mouse button context menu paste original text
    --   - script used 2 levels X11 clipboard buffest of 3 levels :)
    copy_translated = true,
    -- how more seconds show you translated text
    show_timer = 3,
    -- popup translated text under mouse position
    follow_mouse = true,
    -- if follow_moise is false, set translated
    -- text position static coords
    popup_pose_x = 0,
    popup_pose_y = 0,
    -- max width message in screen, zero is auto
    popup_width  = 0,
    -- get text from system clipboard
    app_clipboard = "xclip -o 2> /dev/null",
    -- set text to system clipboard
    app_set_clipb = "xsel -b -i ",
    -- get mouse systemd coords
    app_mousepose = "xdotool getmouselocation 2> /dev/null",
    -- show text popup with translated text
    app_popup_msg = "aosd_cat -x %d -y %d -B white -R white -t 0 -p 0 -u %d -w %d"
}

function poptrans:run()
    local translated = '';
    self.previos_text = '';
    -- read clipboard
    local exec = io.popen(self.app_clipboard);
    local text = exec:read('*all');exec:close();
    -- get cursor position
    exec = io.popen(self.app_mousepose);
    if self.follow_mouse then
        self.popup_pose_x,self.popup_pose_y = exec:read("*all"):match("x:(%d+) y:(%d+)");
        self.popup_pose_x = self.popup_pose_x+3; exec:close();
    end
    -- do not translate previos text or empty or translated text
    if text ~= previos_text and text ~= '' and text ~= translated then
      local from = ''
      if self.lang_from ~= "auto" then
        from = self.lang_from;
      end
      exec = io.popen('trans   '..from..':'..self.lang_to.." -b '"..text.."'");
      translated = exec:read("*all"); exec:close();
      if self.copy_translated then
         exec = io.popen(self.app_set_clipb,'w')
         exec:write(translated:sub(1,#translated-1));
         exec:flush();
         exec:close();
      end
      previos_text = text;
      exec = io.popen(
      self.app_popup_msg:format(
      self.popup_pose_x,self.popup_pose_y,self.show_timer*1000,self.popup_width),"w");
      exec:write(translated);exec:close();
    end
end

poptrans:run()

Не используйте версию из истории правок!. Там опасный баг с кавычками, (спасибо @maxcom исправить дал)
Единственное что там полезно это пример как делать перевод через гугл API по токену.
Но раз появилась возможность правки то ::)

- ИСПОЛЬЗОВАТЬ НА СВОЙ СТРАХ И РИСК, Я НЕ НЕСУ НИКАКОЙ ОТВЕТСТВЕННОСТИ
- ВСЁ ПРЕДОСТАВЛЯЕТСЯ КАК ЕСТЬ, ЛЮБЫЕ СОМНЕНИЯ ДОЛЖНЫ ВЕСТИ
- К ОТКАЗУ ОТ ИСПОЛЬЗОВАНИЯ
LINUX-ORG-RU
()