LINUX.ORG.RU

Сообщения AnonymUser

 

Поиск всех путей на графе (Небольшой тест. Часть 2)

 

Только тем, у кого есть время. Есть однонапрвленный упорядоченный граф (надо найти все пути из a в z, но, видимо, программно):

a → b, c, d, z
b → d, e, f, z
c → d, e, f, z
d → e, f, z
e → f, z
f → g, h, j, z
g → h, i, j, z
h → i, j, k, z
i → j, k, l, z
j → k, m, z
k → l, n, o, z
l → m, z
m → n, o, z
n → o, z
o → p, z
p → q, z
q → r, z
r → s, z
s → t, u, z
t → u, v, z
u → v, w, z
v → w, z
w → x, y, z
x → y, z
y → z
z → (нет исходящих)

Свой результат пишу сразу ( даже не уверен, что 100% правильный, но все ж…): Все пути:

22061

Все пути в массивах. Вывод кода: https://filebin.net/ysidtdizjge50kjh

Код для проверки: https://gitflic.ru/project/dcc0/mix-c-89-php/blob?file=allways_more_20k.php

AnonymUser
()

Небольшой тест

 

Есть однонаправленный граф. Направления показаны стрелками. Сколько существует путей из точки a в точку f? Желательно посчитать самому.

a → b, a → c, a → d
b → d, b → e, b → f
c → d, c → e, c → f
d → e, d → f
e → f
f → (нет исходящих)

Граф картинкой: https://ibb.co/RT5zLGYj

P.S. Потом напишу, что ответили нейронные сети.

AnonymUser
()

Конкурс на лучший анимированный ASCII-ART

 

Я тут подумал, мне понравилось и я подумал ещё раз: =) а ведь интересная штука - анимированный аски-арт. Можно на разных языках, можно даже полноценный мультфильм. (По следам темы Кратко про нейронные сети. Тестирование) У меня пока на тему Gentoo. И ещё в запасе, но я ее уже публиковал.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (void) {
int i, a, b;
/*Gentoo*/
const char   color_str[] = "         -/oyddmdhs+:.             \n     -odNMMMMMMMMNNmhy+-`         \n   -yNMMMMMMMMMMMNNNmmdhyb+-      \n `omMMMMMMMMMMMMNmdmmmmddhhy/`    \n omMMMMMMMMMMMNhhyyyohmdddhhhdo`   \n.ydMMMMMMMMMMdhs++so/smdddhhhhdm+`\n oyhdmNMMMMMMMNdyooydmddddhhhhyhNd.\n  :oyhhdNNMMMMMMMNNNmmdddhhhhhyymMh\n    .:+sydNMMMMMNNNmmmdddhhhhhhmMmy\n       /mMMMMMMNNNmmmdddhhhhhmMNhs:\n    `oNMMMMMMMNNNmmmddddhhdmMNhs+` \n  `sNMMMMMMMMNNNmmmdddddmNMmhs/.\n /NMMMMMMMMNNNNmmmdddmNMNdso:`     \n+MMMMMMMNNNNNmmmmdmNMNdso/-        \n/hMMNNNNNNNNMNdhs++/-`             \n/hMMNNNNNNNNMNdhs++/-`             \n`/ohdmmddhys+++/:.`                \n";

b=0;
while (b  < 1000) {
sleep(1);
printf("\033[2J\033[H");
/*fflush(stdout);*/
/*system("clear");*/
printf("\n");

for (i=0; color_str[i] != '\0'; i++ ) {

	a = rand() % 1000;

	if (a < b && i < 1000) {
	printf("\033[94m%c", color_str[i]);
	continue;
	}
	printf("\033[0m%c", color_str[i]);

		}
		b = b + 100;
}

	return 0;
}
AnonymUser
()

Кратко про нейронные сети. Тестирование

 

Попросил переписать код на Ассемблере NASM alice.yandex.ru и deep.org

#include <stdio.h>
int main (void) {
int i, a;
/*Дерево*/
char  color_str[28][299] = {"*#*=*#+:+#@@####*+#@@@%%+#@@%%%%%*+#%%*.\n",
    "*%##%#+#@@@@**@*%@@%#***%@%%@@#####@@%%\n",
    "+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n",
    "+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n",
    "%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n",
    "%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n",
    "*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n",
    "*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n",
    "%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%\n*",
    "%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%*\n",
    "@@#+*%@@@@@%%**#%##%%%@@@@%##%%#%@%#@%%@\n",
    "%@%*+##*#@%#%*#@%%%%%@@@*##+*%@@#%%%%##*\n",
    "#++#+*#@%@%++#%%%%%%%@@%=*%@#%#+#%@@@@%%\n",
    "*%%##**######%%#@%%%%%#%%##@@##%@@@@%##*\n",
    "##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n",
    "##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n",
    "####*==+%%%#@@#*@@@@@@%%@@%%+*##@@%#@#*#\n",
    "#%@@%%@@#%%*%@@@+#@@%%%%*#%%%@@#+%%*#%%%\n",
    "%%%%*#%%%#++#%@%@@@@%%%@%%@%--*@####%##%\n",
    "**#@@%**@%#+%%%*+#%#%@@@@@@@@@*=#*#%@##@\n",
    "%+*@@%##%@%+++*%%%%%%%@%*%@@#++%%@%*@@%*\n",
    "#####%%%@*++++++#####%%#++*@@%%@%*===*%%\n",
    "##**+#%**+++++=+####%%#======##+%*======\n",
    "%*+++===++++++===*###%*======*##+##++===\n",
    "***+++==+++++++==+#%%%#=====++++***+++++\n",
    "***+++++++++++++=+*##%#+++++++******++++\n",
    "***+++++++++++++++*%###++++++*******++++\n",
    "++++++++++++++***%#=%#*****+*********+++\n"    ,
};
for (a=0; a < 28; a++) {
i=0;
while((i <299) && color_str[a][i] != '\0' ) {
 
    /*Красим листья*/
    if(color_str[a][i] == '@')
    printf("\033[92m%c", color_str[a][i]);
    /*Сбрасываем цвет*/
        if(color_str[a][i] != '@')
    printf("\033[0m%c", color_str[a][i]);
                i++;
        }
    }
    return 0;
}

Переписали. Код запустить не удалось ни от одного, ни от другого. Алиса предложила вдобавок код на python, чтобы создать массив строк для Ассемблера. Но, конечно, советов разной ценности дали обе сети.

AnonymUser
()

Самый простой код

 

Снежинка в терминале. 1 штука.

#include <stdio.h>
#include <stdlib.h>
//Снежинка в консоли
void main ()
{
    system("clear");    
    system("sleep 1");
    printf("❄\n");
    system("sleep 2");
    system("clear"); 
    printf("\n\n\n ❄\n");
    system("sleep 2");
    system("clear"); 
    printf("\n\n\n\n❄ \n");
    system("sleep 2");
    system("clear"); 
    printf("\n\n\n\n\n\n ❄ \n");
}


AnonymUser
()

Селектор программ на C (заготовка).

 

Не все идеи, конечно стоит воплощать. Но мне интересно было попытаться: на самом «начальном» C написать селектор для запуска часто используемых программ.

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

Оказалось, что в общем возможно. Но, например, чтобы сэмулировать нажаите Enter, пришлось придумать трюк с двойным scanf.

Работает так: 1) названия программ пишутся в текстовый файл. Что-то вроде базы, которая пока составляется руками. Выбор пока тоже ограничен :) (заготовка, так сказать) 2) Запуск и выбор

Спасибо всем комментаторам!

Итог (а как же без него?!): все ошибки вроде бы отловил, switch, убрал, вызов теперь через execl, лишний символ в начале строки убрал. Все это оставил в комментариях. Скрипт отредактирован относительно начального варианта. Единственное: оставил clear через system, так как через execl совсем другое поведение.

P.S. Отредактировано Оставил вариант с terminos. Старые варианты в хранилище.

Тоже самое с terminos в режиме non-canonical для терминала, через getchar. https://my.mail.ru/list/mol0t/video/_myvideo/3.html

Как-то так (заготовка, что-то примерное, но должно работать): https://gitflic.ru/project/dcc0/select-and-run/blob/?file=select_history_run_cat_bufferd_file.c&branch=master

AnonymUser
()

Про звуковое уведомление флуд

 

По следам этой темы: Звуковое уведомление о сети. C. Но в Talks, потому что юмор и флуд.

Запилил ebuild для той системы: https://ibb.co/qm85xN9

И вроде репозитарий добавили в Gentoo: https://ibb.co/k3kLFw4

Ухожу, ибо чую, как сейчас говорят: «бомбанёт».

AnonymUser
()

Звуковое уведомление о сети. C.

 , ,

По следам своей старой темы (Голосовое оповещение о поче (скрипт)) решил доработать скрипт. Суть все та же: Если теряем связь с ресурсом, то запускаем программу, которая:

  1. Единожды звуком (через beep) уведомляет о том, что сети нет.
  2. Продолжает работать в фоне, с интервалом (однократно) отправляя ping на ресурс.
  3. Если ресурс доступен, уведомляет звуком и завершает работу. Параметр 1 в аргументы задает бесконечный мониторинг ресурса. Уведомлять будет только при изменении состояния.

Видео для улучшения понимания того, как работает скрипт: https://youtu.be/jVtt_ol9S4g?si=Ztz2ki6YpBl2sR-M

Удобно поставить на cron при старте. Компилируется так:

gcc test_ip.c -o  test_ip.o

Первая версия (удалена).

Отредактированный вариант (перемещён на git): https://gitflic.ru/project/dcc0/test_ip_finite_machine/blob/?file=test_ip_Christmas.c&branch=test_ip.c

https://github.com/dcc0/finite_machine_test_ip/blob/main/test_ip_Christmas.c

Вариант bash с Curl для тестирования сайта: https://github.com/dcc0/finite_machine_test_ip/blob/main/test_web_new.sh

AnonymUser
()

Запуск программ с GUI (графическим интерфейсом) из chroot. Новогодний рецепт.

 ,

Мне понадобился Hexchat. Как-то привык к нему. Но в новых дистрах он требует старый gtk+2. Решил на отдельном диске завести ещё один дистрибутив, но без установки.

Для примера был взят дистрибутив Calculate Linux 2024 года.

  1. Грузимся с Live ISO, Создаём отдельный раздел для системы, монтируем, допустим в:

mount /dev/sda8/ /mnt/d1

И копируем файлы с Live ISO Linux на этот отдельный раздел (допустим ext4), с опцией -a

cp -a /bin /mnt/d1 и т.д. (/mnt /media лучше создать вручную, дабы избежать рекурсии :) run, proc, sys копировать не надо, но можно создать эти директории)

  1. Загружаемся в основную систему.

  2. Ставим на хост:

emerge x11-apps/xhost

Выполняем на хосте:

export DISPLAY=:0 xhost +local:

  1. Делем chroot

(Может, придется поставить права на диск вроде chmod 777 /dev/sdaХ (но 777 я, конечно, круто взял :) первое что пришло в голову в качестве примера. Решайте сами, какие права нужны вам))

mount /dev/sda8 /mnt/d1

mount --rbind /dev /mnt/d1/dev

mount --make-rslave /mnt/d1/dev

mount -t proc /proc /mnt/d1/proc

mount --rbind /sys /mnt/d1/sys

mount --make-rslave /mnt/d1/sys

mount --rbind /tmp /mnt/d1/tmp

mount --bind /run /mnt/d1/run

chroot /mnt/d1 /bin/bash

. /etc/profile

export PS1="(chroot) $PS1"

(Можно продублировать в chroot, если что-то лишнее накрутили, как у меня это было:

export DISPLAY=:0)

su guest

hexchat

С Новым Годом!

AnonymUser
()

Удобная схема временного чата на PHP (шпаргалка)

 , , , ,

Памятка. Найдено на php.net по ключевым словам: sockets, php.

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

Допустим, есть модель ситуации:

  1. Сервер с VNC и ssh.
  2. На него заходят два человека из разных точек, и им требуется messaging.

Решение:

  1. На сервере запускается скрипт php, слушающий сокет через tcp (через ssh udp работать не будет. Поправьте, если ошибаюсь.).

Допустим, выбран порт 1117. Запуск из консоли сервера: php php_server_php

$server = stream_socket_server('tcp://127.0.0.1:1117');
while (1){
$socket = stream_socket_accept($server);
$ptk=stream_socket_recvfrom($socket, 15);
	if ( $ptk > 0) { 
	echo $ptk;
	}
}
fclose($socket);
fclose($server);
  1. Если нужно отправлять со своего компьютера сообщения, то через ssh осуществляется проброс порта.

Примерно так: ssh -L 1117:127.0.0.1:1117 -N -l user remote_server_ip

  1. Отправка сообщений из консоли:

echo 'Test' > /dev/tcp/127.0.0.1/1117

P.S. Без ssh можно использовать сервер udp.

$socket = stream_socket_server("udp://127.0.0.1:1117", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
    die("$errstr ($errno)");
}

do {
    $pkt = stream_socket_recvfrom($socket, 1, 0, $peer);
    echo "$peer\n";
	echo $pkt;
    stream_socket_sendto($socket, date("D M j H:i:s Y\r\n"), 0, $peer);
} while ($pkt !== false);

Отправка сообщений по протоколу udp из консоли: echo 'Test' > /dev/udp/127.0.0.1/1117

P.P.S Примеры взяты с php.net. Чуть-чуть модифицированы.

Ниже картинка, подтверждающая, что выглядит это довольно сносно: https://ibb.co/Ltnmn4R

AnonymUser
()

Раздача wi-fi для компа через proxy

 , , , ,

Вдруг кому-то пригодится (хотя специфично):

Задача: пробиться к внешнему сервису, допустим, игровому.

  1. На смартфоне ставим VPN, допустим, AdGuard VPN или Planet VPN и подключаемся куда-нибудь.

  2. Ещё на телефон ставим Android Proxy Server.

  3. Настраиваем http и https proxy в Android Proxy Server (включаем).

  4. Настраиваем TCP/UDP Relay в Android Proxy Server. (включаем) В него и пишем хост и порт игрового сервиса.

  5. Включаем раздачу WiFi.

  6. Опционально ставим Network Share Tunnel. Он прикручивается к Android Proxy Server - плагин для него (у меня непонятно, работает Network Share Tunnel или нет, но в целом указанная связка работоспособна).

  7. Опционально на компьютере можно настроить iptables для перенаправления порта сервиса на Relay.

P.S. До конца не разобрался, для чего Network Share Tunnel (в комментариях жалуются, что не у всех работает), когда связка и так работает.

AnonymUser
()

Неясности с beep

 

Доброго! Странная вещь: beep работает, только если запущен alsaplayer или pavucontrol. Если выключить, допустим, pavucontrol, то перестаёт работать, сразу же, будто карта уходит в сон.

AnonymUser
()

Доступ к веб-серверу виртуальной машины qemu извне с использование wifi (vlan0 интерфейс). Мост. Он же Bridge. Памятка.

 ,

Доступ к веб-серверу виртуальной машины qemu извне с использование wifi (vlan0 интерфейс). Мост. Он же Bridge

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

Памятка (может, кому-то пригодится), настройка осуществлялась в Gentoo Linux на нетбуке hp mini (Atom n570). Виртуальная машина: XP с веб-сервером AppServ 2.5.1.

  1. Становимся root

su

  1. Разрешаем форвардинг пакетов

echo 1 > /proc/sys/net/ipv4/ip_forward

  1. В ядре следует включить CONFIG_BRIDGE=y Если не включен, то идём

cd /usr/src/linux nano .config

Находим CONFIG_BRIDGE и редактируем Далее закрываем и сохраняем

make && make modules_installl

Не помню, надо ли копировать образ ядра, но монтируем boot и копируем в него:

mount /boot

cp arch/x86_64/boot/bzImage /boot/kernel-5.15.75-gentoo

  1. Перезагрузка. reboot

  2. Ставим программы для работы с мостом

emerge net-misc/bridge-utils

  1. Создаем мост:

brctl addbr br0

  1. Для интерфейса wifi (vlan0 (у меня wlp1s0b1) можно добавить только в режиме точки доступа, вычитал в сети), поэтому:

ifconfig wlp1s0b1 down

  1. Если вай-фай, то переводим в режим точки доступа, иначе не заработает)

ifconfig wlp1s0b1 192.168.43.1/24 (у меня вдобавок потребовался перезапуск NetworkManager)

  1. Добавляем в мост

brctl addif br0 wlp1s0b1

  1. Разрешаем от пользователя доступ к мосту (я так понял):

mkdir -p /etc/qemu echo "allow br0" >> /etc/qemu/bridge.conf

  1. Запускаем qemu от пользователя (у меня так примерно) :

qemu-system-x86_64 -accel tcg -hda win.img -m 512 -netdev bridge,id=br0,br=br0 -device rtl8139,netdev=br0

  1. В гостевой машине прописываем сетевому интефейсу адрес: 10.0.2.15; маску подсети: 255.255.255.0; шлюз: 10.0.2.2

  2. Смотрим от root, что получилось

ifconfig -a

У нас должны быть интерфейсы br0 и tap0 (после запуска qemu)

  1. Далее я добавил для tap0 адрес

ifconfig tap0 10.0.2.3 up и для br0 ifconfig br0 10.0.2.2 up

  1. Добавил tap0 в мост, т.е. в br0

brctl addif br0 tap0

(Возможно, последние действия лишние) После этого сайт виртуальной машины стал доступен по адресу: 10.0.2.15



Дополнение: получить доступ к веб-серверу виртуальной машины можно, пробросив порт 80 через клиент ssh на ней.

  1. На хосте запускается sshd - сервер ssh.

  2. С клиентской машины используем reverse forwarding

ssh -N -R localhost:8181:localhost:80 -l user 10.0.2.2

Т.е. с хоста, набрав в браузере localhost:8181, должны попасть на веб-сервер виртуальной машины.

В putty для Windows идём в ssh -> tunnels -> source=8181, Destination=localhost:80 Ставим галку на Remote.

Чуть выше ставим «ставим птичку» возле: Local ports accept connections from other hosts.


AnonymUser
()

Настройка Boot logo (Кастомизация)

 ,

У многих Boot logo (пингвины, показывающие количество потоков или ядер) не работает из коробки. В связи с этим небольшая памятка.

  1. В /boot/grub/grub.cfg в стоке linux предлагается убрать слово quiet (рядом со splash).
  2. В ядре (.config) отключить (закомментировать) #CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER=y Поставить is not set
  3. Включить boot logo в ядре: Device Drivers->Graphics->Boot logo (то, которое 224)
  4. Включить в ядре поддержку Framebuffer (вариативно, от системы)
  5. Поставить в grub.cfg нужный режим, например, vga=0x317 для 1024х768 (можно разными способами сделать).

Кастомизация (создание своего) Boot logo

  1. Заходим в /usr/src/linux/drivers/video/logo
  2. Удалим файлы: logo_linux_clut224.c и logo_linux_clut224.o (они генерируются при компиляции ядра)
  3. Отредактируем файл logo_linux_clut224.ppm в редакторе gimp по своему вкусу.
  4. Установим пакет netpbm
  5. Отредактируем количество цветов программой: ppmquant

ppmquant 224 logo_linux_clut224.ppm > logo_linux_clut224.ppm

  1. Переведем в ASCII формат Лого: pnmnoraw logo_linux_clut224.ppm > logo_linux_clut224.ppm

Для конвертации можно использовать промежуточный файл, предварительно переименовав logo_linux_clut224.ppm.

Логотип готов. Осталось перекомпилировать ядро.

P.S. Кстомизированное мной Boot Logo: https://disk.yandex.ru/i/jauzt48_ydk1zg

Пример: https://ibb.co/PcfVgD7

AnonymUser
()

Планшет Lenovo miix 3-1030 и Linux

 

Странная история. На планшете Win 8. Линукс загрузить не получается. Только Убунту версии 15 с uefi32. Но сегодня я скачал минимальный диск Gentoo 64b. Заменил в не Efi/boot файл efi32 и получилось загрузиться.

Этот файл взял из темы на форуме, про установку Убунту. Странно, что ефи32 грузит 64 битную версию.

Update: Получилось поставить Calculate Linux на планшет. Далее о том, как ставил кратко:

  1. Записал систему (64bit) на flas-usb, использовал разметку gpt, использовал программу rfus.4-4.
  2. Загрузился (загрузка с flash через fn-f12, чтобы попасть в выбор устройств загрузки) и поставил систему. Разметку диска ставил автоматическую, три раздела: swap, / и uefi. Uefi обязательно.
  3. Далее раздел uefi надо подмонтировать в /boot/efi. Там создать директорию boot и положить туда bootia32.efi по ссылке ниже.
  4. Загрузиться с диска. Должна появиться строка grub.
  5. Загрузиться в установленную систему вручную прописав в строку grub тоже, что и в grub.cfg: (Поправить fstab, названия разделов)

insmod gzio

insmod part_gpt

insmod btrfs ls

set root=(раздел с корнем, у меня был hd0,gpt2)

linux /booot/vmlinuz-номер-ядра root=/dev/mmcblk1p2

(диски могут быть с другими номерами, не как в fstab, если флешка была вынута)

initrd /boot/initramfs-номер

boot (грузимся)

  1. После загрузки требуется переустановить grub для efi-32: grub-install –target=i386-efi /dev/mmcblk1p2 –efi-directory=/boot/efi –boot-directory=/boot

  2. Сконфигурировать grub: grub-mkconfig -o /boot/grub/grub.cfg

Система должна работать. На моём планшете корректно работает тачскрин, вай-фай и прочее.

AnonymUser
()

«Операционная система» Русь

 

https://www.youtube.com/watch?v=9Jmo4FMiNg0

Интерено: два человека, судя по комментариям, увидели в консоли слово php и решили, что селектор написан на php. Разочарую. Исходник: https://gitflic.ru/project/dcc0/mix-c-89-php/blob?file=rusos_shutka.c

AnonymUser
()

Транспонирование календаря в Conky, выделение праздников и текущая дата

 , ,

Доброго всем! Тема сама за себя говорит.

Вертикальный вывод и выделение праздников:

${execp cal -v -n 1 | head -n6 | sed "s/`date +%e` \|`date +%e`$/\$\{color green\}&\$\{color grey\}/" }
${execp cal -v  -n 2 | tail -n2 | sed 's/[Сб|Вс|0-9]/\$\{color purple\}&\$\{color grey\}/g'}

Update: Вариант номер 2 горизонтальный вывод календаря в conky с подстветкой текущей даты и выходных дней.

В .conkyrc

${execp cat /tmp/cal.txt | sed  -e 's/-/\$\{color purple\}/g' -e  's/+/\$\{color grey\}/g'   -e "s/ `date +%e`\|`date +%e` \|`date +%e`\+$/\$\{color green\}&\$\{color grey\}/" -e  's/:/\$\{color purple\}/g' }

И при старте или планировщиком cron выполнить скрипт 1 раз в сутки. Сам скрипт: calendar.sh


#Обработка строк календаря в Linux (программа cal) для раскрашивания выходных дней и текущей даты
#Выходные и текущая выделяются цветом в файле .conkyrc
cal > /tmp/cal.txt

#  Обработка строки 2  #
part2=`cal | sed -n '2p'`; printf "${part2: -5}" > /tmp/cal2.txt
source=`cat /tmp/cal2.txt`
sed -i 's/'"$source"'/\'$'-&+/g'  /tmp/cal.txt
####################################################

###Обработка строки 3####
part2=`cal | sed -n '3p'`; printf "${part2: -5}" > /tmp/cal2.txt
source=`cat /tmp/cal2.txt`
sed -i 's/'"$source"'/\'$'-&+/g'  /tmp/cal.txt
#Меняем последнее число в строке, чтобы выделить воскресенье
part2=`cat /tmp/cal.txt | sed -n '3p'`; printf "${part2: -3}" > /tmp/cal2-1.txt
source=`cat /tmp/cal2-1.txt`
if [[ $source =~ [0-9+]+$ ]]; then
sed  's/'"$source"'/\'$': &/g'  -i /tmp/cal.txt
fi
###################################################



#  Обработка строки 4  #
part2=`cal | sed -n '4p'`; printf "${part2: -5}" > /tmp/cal2.txt
source=`cat /tmp/cal2.txt`
sed -i 's/'"$source"'/\'$'-&+/g'  /tmp/cal.txt
#
part2=`cat /tmp/cal.txt | sed -n '4p'`; printf "${part2: -3}" > /tmp/cal2.txt
source=`cat /tmp/cal2.txt`
if [[ $source =~ [0-9+]+$ ]]; then
sed  's/'"$source"'/\'$': &/g'  -i /tmp/cal.txt
fi
###################################################



#  Обработка строки 5  #
part2=`cal | sed -n '5p'`; printf "${part2: -5}" > /tmp/cal2.txt
source=`cat /tmp/cal2.txt`
sed -i 's/'"$source"'/\'$'-&+/g'  /tmp/cal.txt
#
part2=`cat /tmp/cal.txt | sed -n '5p'`; printf "${part2: -3}" > /tmp/cal2.txt
source=`cat /tmp/cal2.txt`
if [[ $source =~ [0-9+] ]]; then
sed  's/'"$source"'/\'$': &/g'  -i /tmp/cal.txt
fi
###################################################

#  Обработка строки 6  #
part2=`cal | sed -n '6p'`; printf "${part2: -5}" > /tmp/cal2.txt
source=`cat /tmp/cal2.txt`
sed -i 's/'"$source"'/\'$'-&+/g'  /tmp/cal.txt
#
part2=`cat /tmp/cal.txt | sed -n '6p'`; printf "${part2: -3}" > /tmp/cal2.txt
source=`cat /tmp/cal2.txt`
if [[ $source =~ [0-9+] ]]; then
sed  's/'"$source"'/\'$': &/g'  -i /tmp/cal.txt
fi
###################################################

#  Обработка строки 7  #
part2=`cal | sed -n '7p'`; printf "${part2: -6}" > /tmp/cal7-1.txt
source=`cat /tmp/cal7-1.txt`
if [[ $source =~ [0-9+] ]]; then
sed -i 's/'"$source"'/\'$'-&+/g'  /tmp/cal.txt
echo ok
fi
#
part2=`cat /tmp/cal.txt | sed -n '7p'`; printf "${part2: -3}" > /tmp/cal7-2.txt
source=`cat /tmp/cal7-2.txt`
if [[ $source =~ [0-9+] ]]; then
sed  's/'"$source"'/\'$': &/g'  -i /tmp/cal.txt
fi
###################################################

#  Обработка строки 8  #
part2=`cal | sed -n '8p'`; printf "${part2: -5}" > /tmp/cal8-1.txt
source=`cat /tmp/cal8-1.txt`
if [[ $source =~ [0-9+]+$ ]]; then
sed -i 's/'"$source"'/\'$'-&+/g'  /tmp/cal.txt
fi
#
part2=`cat /tmp/cal.txt | sed -n '8p'`; printf "${part2: -3}" > /tmp/cal8-2.txt
source=`cat /tmp/cal8-2.txt`
if [[ $source =~ [0-9+]+$ ]]; then
sed  's/'"$source"'/\'$': &/g'  -i /tmp/cal.txt
fi



Post Scriptum

Варианту проще и лучше будем рады.

Update:

Вариант обработки календаря на php:

https://gitflic.ru/project/dcc0/mix-c-89-php/blob?file=calendar.php

AnonymUser
()

Разработка системы выключения или перезарузки без sudo во Fluxbox [не рекомендуется]

 , , , без sudo,

Придумал (может быть, я не первый) такой способ выключения и перезагрузки с использованием cron, без sudo:

https://studio.youtube.com/video/0VsXXP5t80I/

  1. Пользователь сохраняет в домашней директории файл с управляющим символом, используя для этого скрипт или просто команду, например:

echo 1 > shutdown.txt

  1. Cron от пользователя root выполняет свой скрипт и читает файл пользователя, выполняет выключение или перезагрузку.

*Примерная реализация

crontab -e: */1 * * * * sh /root/shutdown_1.sh

В /root/shutdown_1.sh

Как написали ниже, у такого способа имеется уязвимость:

SHUTDOWN_COMP=`md5sum /home/user/shutdown.txt | grep -o 1`; 
if [  "$SHUTDOWN_COMP" = "b026324c" ]
then
echo 0 > /home/user/shutdown.txt & SHUTDOWN_COMP="0" & /sbin/poweroff; 
fi

Update

Скрипт от root меняется на такой:

SHUTDOWN_COMP=`grep -o 098 /home/user/shutdown.txt`; 
if [  "$SHUTDOWN_COMP" = "098" ]
then
/sbin/poweroff; 
fi

Пользовательский (не root) cron после перезагрузки меняет состояние файла /home/user/shutdown.txt или удаляет его. То есть, crontab -e:

@reboot echo 0 > /home/user/shutdown.txt

Post Scriptum

Пробую. Пока работает корректно.


  •                                               *
    

Update *

  •                                               *
    

Последнее обновление. Финальное. *

  •                                               *
    

Система перезагрузки и выключения без sudo *

  •                                               *
    
  •                                               *
    

Прислушался к советам в комментариях и пока получилась такая система: 1) две программы на языке C. Обе работают через cron. Первая проверяет наличие файла /run/shudown.txt только при старте системы. Если его нет, то создаёт его. Проверерку, вероятно, можно удалить.

Запись в cron:

@reboot  /usr/local/bin/check

Файл: check.c

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main ()
{

    FILE *file;
/*Проверим сущестование файла: если нет, то создадим,
установим права и владельца.*/
    if  (fopen("/run/shutdown.txt", "r") == NULL) {
    creat("/run/shutdown.txt",  0644);
    chown("/run/shutdown.txt", 1000, 0);
    return 0;
}}

Вторая программа для проверки управляющих символов. Запись в cron:

*/1 * * * * /usr/local/bin/shutdownreboot

Второй файл: shutdownreboot.c

#include <stdio.h>
#include <stdlib.h>
int main ()

{
    char c;
    FILE *file;
/*Откроем файл, прочитаем управляющий символ, перезагрузим или  выключим.*/
    file = fopen("/run/shutdown.txt", "r");
    c = getc (file);
    if (c == '4') 
    system("/sbin/reboot");
    if (c == '2')
    system("/sbin/poweroff");
    fclose(file);
}

И два пользовательских скрипта (кнопки), содержащих команды для записи в /run/shutdown.txt:

echo 4 > /run/shutdown.txt

и

echo 2 > /run/shutdown.txt

P.S. Код на git: https://gitflic.ru/project/dcc0/system-reboot-control

Решил сделать статью на habr: https://habr.com/ru/post/703924/

AnonymUser
()

Результаты компиляции на нетбуке (Atom). Gentoo и Calculate Linux

 , , , ,

Решил поделиться результатами компиляции разных программ на нетбуке. Машина: hp mini. Модель примерно 2009-2012 годов. Процессор: Atom N570, 1.6GZ, 2 ядра, 4 потока. Память: DDR3, 2GB. Swap 4Gb. (Разметил для swap 12 gb, показывает только 4). Система Calculate Linux 64bit. Установлены опции компиляции: -fomit-frame-pointer, -march-native, -j5, -msse, -msse2, -msse3, -mmmx, -pipe, -O2. Также -j5, –load-average=5. CCACHE_SIZE=«5G» Результаты

  1. Собрал ядро Gentoo. Затрачено времени 14 часов.
  2. Собрал браузер Seamonkey. Затрачено времени 16 часов.
  3. Не смог скомпилировать свежий FireFox. Время ожидания: трое суток. Ушёл в Swap.
  4. Пытался скомпилировать webkit-gtk. Время ожидания 10 часов. Ушёл в swap.

Добавление

  1. Собрал glibc примерно за 2 часа с небольшим.

Выводы. Видимо, можно не пытаться скомпилировать на этой машине Chrome, LibreOffice и ещё некоторые программы. Можно собрать Gentoo, но с очень лёгким De или вообще без него. Итог: самостоятельная компиляция на Atom возможна, но со многими ограничениями. Иначе нецелесообразно.

Post Scriptum

Данная тема создана для тех, кто вдруг захочет установить Gentoo на нетбук с Atom. В общем, я не рекомендую компилировать. Хотя установить Calculate Linux и собрать ядро Gentoo всё же возможно. В общем и Gentoo можно собрать, но если заранее ограничить себя небольшим спектром программам. Вопрос обновлений не рассматриваю.

Обновление

Всё-таки установил Gentoо по хендбуку. Установил без De. Из программ только: links, weechat, mc.

  1. Затраченное время (на всё): 1 сутки.

a) Удалось сократить время установки, благодаря автоматическому конфигурированию wifi (nmtui) с Livecd.

b) Сократил время, воспользовавшись предварительно Gparted с диска Calculate Linux.

c) Ядро gentoo и config предварительно сохранил после компиляции в Calculate. Правда, пришлось перекомпилировать модули.

Но в целом успешно. Помучился с русификацией консоли, не сразу нашёл какую keymap выставить. Всем спасибо.

Ещё добавления 7) Собрал Xorg-server. Затрачено времени: начал в понедельник завершил в четверг. Попутно собраны: mysql, PHP, lighttpd, rust, библиотеки c++, irssi, mcabber, fluxbox. Собрал gcc с поддержкой graphite.

Для истории фото: https://ibb.co/m65P5hd

Видео процессом загрузки Gentoo Linux на нетбуке HP mini: https://youtu.be/s6ubLc6zawU

AnonymUser
()

Интесресное свойство BASH. Модель Rust + Bash.

 ,

Интересное свойство bash/shell открыл для себя. Решил попытаться вникнуть в язык Rust. Для примера взял старый, измученный мной, алгоритм перебора перестановок Нараяны. Переписал его и уткнулся в то, что не так легко и элегантно новичку найти способ перевести аргумент командной строки в число. В C89 с приведением типов как-то просто. Искал варианты: все те, что нашёл, относительно синтаксиса и на мой субъективный взгляд, показались трудными для восприятия. Вдруг осенило меня, - можно же использовать в качестве инициализирующего скрипта bash. И появилась такая модель:

  1. Перебор перестановок на Rust с самым простым синтаксисом: данные пользователя хранятся в векторах, в самом скрипте.
  2. Стартовый скрипт на Bash создаёт копию основной программы, забирает аргументы командной строки, создаёт новые векторы и перезаписывает их в основной программе с помощью sed. Безопасно и просто. Результат: https://github.com/dcc0/permutations_rust
AnonymUser
()

RSS подписка на новые темы