LINUX.ORG.RU

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

Посоветуйте быстрый просмотрщик картинок

Форум — Desktop

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

 , ,

Mobutu_Sese_Seko
()

Но зачем?

Галерея — Рабочие места

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

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

bl
()

Посоветуйте распознавалку речи

Форум — General

В общем, возникла необходимость распознавать достаточно длинные записи речи и перегонять их в текст, а текст уже затем в субтитры. Как делать субтитры я знаю, а вот с распознаванием речи есть трудности. Я плохо разбираю английский на слух, так что хорошо бы отдавать эту часть работы программе. Но какую программу использовать? Хотелось бы поменьше ошибок и отсутствие обязательной регистрации, но отсутствие ошибок в приоритете. Pocketsphinx работает очень так себе, судя по тому, что у меня получилось. Возможно, я просто не умею его готовить.

 ,

Mobutu_Sese_Seko
()

Восхитительная вещь: Linux Live Kit, но как настроить первоначальный экран, zRam, persistence (чистый аналог MX Linux с полноценной средой)?

Форум — General

Всем доброго утра!

Tomas Matejicek (автор Slax Linux) решил провести мастер-класс по альтруизму и создал инструмент, позволяющий буквально в пару кликов создать Live-версию любой операционной системы (ну, почти любой).

https://www.linux-live.org/

https://github.com/Tomas-M

Порядок действий: очищаем установленную и настроенную систему от мусора, проверяем наличие пакетов squashfs-tools, genisoimage, zstd, если нет - ставим, чистим кэш, скачиваем и распаковываем https://github.com/Tomas-M/linux-live/tarball/master

Идем в .../Tomas-M-linux-live-7d4ad09/bootfiles/

открываем syslinux.cfg добавляем пункты меню:

LABEL default
MENU LABEL Toram on
KERNEL /boot/vmlinuz
APPEND vga=769 initrd=/boot/initrfs.img load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 apparmor=0 toram
LABEL default
MENU LABEL Persistence on
KERNEL /boot/vmlinuz
APPEND vga=769 initrd=/boot/initrfs.img load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 apparmor=0 perch

Возможно, еще также должна работать и комбинация:

LABEL default
MENU LABEL Persistence on, Toram on
KERNEL /boot/vmlinuz
APPEND vga=769 initrd=/boot/initrfs.img load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 apparmor=0 perch toram

Не проверял, если честно.

Сохраняем, закрываем.

Также заменяем скучные обои bootlogo.png на наш несравненный .png размером 640х480.

Идем в /Tomas-M-linux-live-7d4ad09/build находим строки:

if [ "$SKIPCOREMOD" = "" ]; then
mksquashfs $COREFS $LIVEKITDATA/$LIVEKITNAME/01-core.$BEXT -comp xz -b 1024K -Xbcj x86 -always-use-fragments -keep-as-directory || exit
fi

и заменяем на:

if [ "$SKIPCOREMOD" = "" ]; then
#   mksquashfs $COREFS $LIVEKITDATA/$LIVEKITNAME/01-core.$BEXT -comp xz -b 1024K -Xbcj x86 -always-use-fragments -keep-as-directory || exit
#   mksquashfs $COREFS $LIVEKITDATA/$LIVEKITNAME/01-core.$BEXT -comp lz4 -always-use-fragments -keep-as-directory || exit
   mksquashfs $COREFS $LIVEKITDATA/$LIVEKITNAME/01-core.$BEXT -comp zstd -always-use-fragments -keep-as-directory || exit
fi

Можно попробовать через lz4, но xz - точно не стоит, никакого кофе не хватит.

Сохраняем, закрываем.

Идем в /Tomas-M-linux-live-7d4ad09/config находим строку:

LIVEKITNAME="linux"

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

Сохраняем, закрываем.

Запускаем через sudo или от root: ./build

Ждем, если все отработало как нужно - идем в /tmp/ и забираем наш каталог linux-live. Перебрасываем его на флешку (я форматировал ее в ext4) и запускаем уже с флешки «наше название системы»/bootfiles/bootinst.sh

Всё. Если вдруг «не всё» - то читаем файлы readme, там всё предельно ясно расписано. Ну почти всё.

Также в /tmp/ будет лежать скрипт для создания iso образа, если вдруг он нам нужен.

- - - - - - - - - - - - - - - - - - - - - - - - - - -

Теперь вопросы к пользователям Slax (но и не только):

- как по аналогии с 01-core.sb сделать, ну например, 02-vb.sb и сохранить в нем слой с установленным VirtualBox? При этом, чтобы была возможность подключать и отключать его (равно как и другие слои/образы) на лету.

- как отредактировать оформление этого чудного начального меню с таблицей из 90-х и цветами, которые вышли из моды еще во времена молодости моей бабушки?

- как сделать чтобы при включении perch изменения шли не в каталог /changes/ на нашей флешке, с дублированием корневой системы, а как-то по уму, например, единоразово при выключении в единый файл со сжатием?

- как работает zRam? Всегда ли происходит сжатие всего, что идет в память, или только тогда, когда свободная память подходит к концу? Если всегда, то как отключить эту опцию? Интуитивно - zram=off или zram=0 в начальном меню, но не уверен.

Ну и наконец - зачем городить весь этот огород, если можно взять готовую MX Linux? Во-первых, Вы можете попробовать проделать это с любой системой, а не только с модификацией Debian без Systemd (понимаю, что для гуру - не критично, но для новичков - это ад, когда «все делаешь по инструкции», но ничего не работает, ибо у тебя «особенная» система), во-вторых, Вам не нужно вычищать весь мусор, который сочли нужным положить в систему разработчики дистрибутива - Вы просто берете и настраиваете все сами (на самом деле нет - придется 100500 раз задать вопросы на ЛОРе), с нуля, с консоли, устанавливая только то, что нужно, ну и в третьих, (продолжая тему доверия к AppImage - Какие репозитории AppImage можно считать «безопасными»?) к репозиториям основного семейства дистрибутивов всё-таки больше доверия. Но это уже дело вкуса.

 , , , ,

Starover
()

Гитаристы, линукс, ламповый звук, оффтоп, личная переписка и вообще, здесь все свои

Форум — Talks

Да создавай уж новый трэд под пространным названием на всякий случай :) затравку сделай и погоним. Всё равно, кто в приличном ом обществе придерживается темы? :)



По мотивам предыдущих тредов, которые давно уехали в архив
Кастую James_Holden, R_He_Po6oT и остальных прекрасных людей, неравнодушных к сабжевой теме
Намедни смотрел поучительное видео для самых маленьких, про то, как конденсаторы влияют на звук увеселителя
https://youtu.be/Rc7i6sjk8v0
с примерами и материалистическим объяснением
Из примеров, например, видно, что просто нарисовать схему увеселителя в каком-нибудь моделлере и понять, как он будет звучать - не выйдет. Надо смотреть, как физически проложены дорожки на плате или, например, какая внутри коробки температура и куда уплывут номиналы резисторов через пару часов работы.
Много думал.

А вот у нас тут в Линуксе есть люди, которые моделируют ламповые гитарные усилители. Принимают ли они указанные эффекты в расчёт, при написании своих замечательных плагинов?

UPD: кривую ссылку поправил

 , , , ,

ist76
()

acer aspire A315-35

Форум — Linux-hardware

Насколько subj совместим с линаксом и какие подводные камни? Читаю страшилки про oem lock и пр.: https://community.acer.com/en/discussion/635997/is-it-possible-to-install-ubu.... Насколько всё проблемно?

Внезапно, ubuntu 22.04.3 установилась без проблем (только секурбуут отключил в бивисе).

 acer aspire

thunar
()

Новорегам

Форум — Linux-org-ru

Здравствуй дорогой юный или не очень друг или подруга.
Сегодня я расскажу вам историю о том как не получить подзатыльника на сайте linux.org.ru за свой возможно первый, а может быть и нет вопрос.

Давайте рассмотрим типичный пример.Вы (не вы) установили (пытались установить) тот или иной дистрибутив linux (не linux) на свой (или не свой) персональный(или не очень) компьютер.

Но вот беда! Вы столкнулись с проблемой и понятия не имеете как её решать. Интернеты или кто-то ещё привели вас на linux.org.ru.

Кое-как сумев зарегистрироваться с желанием как можно быстрее разобраться с вопросом вы особо не думая выбираете первый попавшийся раздел и задаёте там вопрос.

Вот тут мы остановимся, не надо писать куда попало, потратьте минутку и прочтите описание веток форума linux.org.ru/forum/. Но ошибка в выборе разделе это не страшно, модераторы могут перенести вопрос в нужный раздел, в случае когда видно что вы вообще не обращали внимания куда пишете, например вопрос по запуску игры в разделе Linux-install вместо Games вы можете «получить по шапке».

АХТУНГ, ВНИМАНИЕ!

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

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

+Всем привет!, установил линукс, не работает интернет, как настроить?

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

- Вы можете просто мне помочь, а не умничать?
- Я не хочу в этом разбираться, просто скажите мне как сделать то что я хочу.
- Я ничего не понял распишите мне пошагово всё.
- Всё ясно вместо того чтобы просто помочь только балаболить можете.
- Типичное СНГ сообщество, токсики и дегенераты
- Не тратьте моё время я хочу решение, а не разбираться

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

А вот теперь давайте встанем на место активных участников форума на помощь которых вы рассчитываете.

  • 1 В мире множество дистрибутивов linux и у каждого из них свои особенности, если не указать его название в своём вопросе, то и говорить не о чем. Если у вас сомнения по поводу названия укажите ссылку откуда вы скачали дистрибутив если вы его ещё не смогли установить, в случае если дистрибутив установлен выполните команду uname -aв выводе этой команды будет содержаться необходимый минимум информации, пример:
dron@gnu:~$ uname -a
Linux gnu 5.19.0-1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 5.19.6-1 (2022-09-01) x86_64 GNU/Linux
dron@gnu:~$ 

Для уточнения можно ещё приложить вывод lsb_release -a

dron@gnu:~$ lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux bookworm/sid
Release:	testing
Codename:	bookworm
dron@gnu:~$ 
  • 2 Не указана версия дистрибутива, да, они имеют версии и например Ubuntu более 30 разных выпусков за её историю развития, конечно можно предположить что у вас одна из последних версий, но даже между двумя стабильными выпусками аж 5 разных дистрибутивов. Так что даже указав название дистрибутива нужно будет много гадать и перебирать варианты. Эта информация также содержится в выводе uname -a

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

В случае если вы находитесь в рабочем дистрибутиве вы можете получить информацию о

  • lscpu Центральном процессоре
  • lsmem Оперативной памяти
  • lsusb USB устройствах
  • lspci PCI устройствах
  • lsmod Загруженных модулях ядра для вашего оборудования
  • lsblk Размере и разметке ваших накопителей

Отвечающие могут попросить показать вывод других программ, в зависимости от ситуации. Чаще всего нужна лишь часть информации, подумайте логически что из этого указывать в своём вопросе, в случае если программа выводит очень много текста логично скопировать вывод на pastebin или подобный сервис например https://www.klgrth.io

В дополнение и я бы даже сказал как перекрытие пункта 3 есть вариант предложенный товарищем @krasnh, а именно один раз выгрузить достаточно большую обезличенную информацию о системе и ссылаться на неё в своём вопросе, это делает утилита hw-probe которая к сожалению не установлена по умолчанию. Если ваша проблема не связана с установками пакетов, поломанными зависимостями то вы можете установить утилиту hw-probe через специфичный вашему менеджер пакетов, скачать в виде самодостаточной программы формата Appimage по этой ссылке далее выполнить команду ниже и приложить к своему вопросу ссылку выданную терминалом

В случае AppImage

#скачиваете по вышеприведённой ссылке Appimage файл
#делаете файл исполняемым
dron@gnu:~/Загрузки$ chmod +x ./hw-probe*.AppImage
#запускаете
dron@gnu:~/Загрузки$ sudo -E ./hw-probe-*.AppImage --all -upload
[sudo] пароль для dron: 
Probe for hardware ... Ok
Reading logs ... Ok
Uploaded to DB, Thank you!

Probe URL: https://linux-hardware.org/?probe=ba05383ec5

Если установка утилиты произведена в систему через пакетный менеджер.

dron@gnu:~$ sudo -E hw-probe -all -upload

 Probe for hardware ... Ok
 Reading logs ... Ok
 Uploaded to DB, Thank you!
 Probe URL: https://linux-hardware.org/?probe=68dbf33470

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

  • 4 Вы не указали как вы пытались решить проблему, искали ли вы ответы в интернете, воспользовались ли поиском на этом сайте https://www.linux.org.ru/search.jsp , то есть прилагали ли вы хоть какие то самостоятельные усилия. Возможно вы что-то пытались делать, но умолчали он этом. Также очень вероятно что вы в процессе экспериментов что-то сломали сами, указывайте все ваши действия, даже если вам кажется они не относятся к вашему вопросу, в рамках разумного конечно. Если ваш вопрос касается написания кода или скрипта то приложите ваш код или отрывок из него, опять же чтобы показать что вам не просто лень, а действительно нужен совет, а так же чтобы отвечающий видел по коду где у вас ошибка, что вы делаете не так или/и что вы понимаете не так.

  • 5 Заголовок сообщения, там не надо КАПСИТЬ!!1, от этого вам быстрее не помогут, а лишь будут вас тролить и высмеивать и виноваты в этом будете исключительно вы. Напишите спокойно например «Ошибка при установке Ubuntu» или «cron не исполняет задачи». Просто краткая суть вашей проблемы и всё.

  • Не указана информация о вашей графической оболочке, графическом сервере и/или наборе ПО с оконным менеджером. Вероятно вы понятия не имеете что это всё такое. Тем не менее если ваш вопрос по поводу работы какого-то графического приложения то нужно указать в каком окружении оно работает.

Вы можете используя команды:

  • echo $XDG_SESSION_TYPE узнать Xorg у вас или Wayland

  • echo $XDG_CURRENT_DESKTOPузнать какое у вас рабочее окружение

  • echo $XDG_SESSION_DESKTOP узнать какой у вас менеджер сессий

  • Вы не указали версию программы с которой у вас проблемы или вопросы по использованию, программы постоянно развиваются, меняются и что-бы дать однозначный ответ или хотя бы попытаться это сделать нужно знать о версии программы, в графическом интерфейсе программы найдите в меню опцию «about»,«о программе» часто такое есть, если нет то можно узнать из терминала введя имя программы --help вы увидите ключи часто есть ключ --version и например узнать о версии нужно ввести имя_программы --version.

Например:

dron@gnu:~$ firefox --version
Mozilla Firefox 102.2.0esr
dron@gnu:~$ 

Если у вас изначально возникают трудности с выявлением версии программы, задайте дополнительный вопрос о том как её узнать у конкретной программы.

И это ещё не всё, ещё важный аспект это форматирование вывод программ,ваш код, логи которые попросили вас выложить, всё это нужно оформить, всё познаётся в сравнении, к примеру меня попросили выложить вывод lsblk

Вот как он выглядит без форматирования

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 1,4T 0 disk ├─sda2 8:2 0 1K 0 part └─sda5 8:5 0 1,4T 0 part /home sdb 8:16 0 74,5G 0 disk ├─sdb1 8:17 0 3,7G 0 part └─sdb2 8:18 0 70,8G 0 part / sdc 8:32 0 74,5G 0 disk └─sdc1 8:33 0 74,5G 0 part /mnt/STORAGE sdd 8:48 1 0B 0 disk sr0 11:0 1 1024M 0 rom

А вот как с форматированием

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    0  1,4T  0 disk 
├─sda2   8:2    0    1K  0 part 
└─sda5   8:5    0  1,4T  0 part /home
sdb      8:16   0 74,5G  0 disk 
├─sdb1   8:17   0  3,7G  0 part 
└─sdb2   8:18   0 70,8G  0 part /
sdc      8:32   0 74,5G  0 disk 
└─sdc1   8:33   0 74,5G  0 part /mnt/STORAGE
sdd      8:48   1    0B  0 disk 
sr0     11:0    1 1024M  0 rom  

Думаю разница очевидна, читать не отформатированный код и следовательно помогать никто не будет. А навести красоту легко. Три апострофа «```» на букву ё при английской раскладке, перевод на новую строку, ваш текст, перевод на новую строку и ещё раз три апострофа «```» Всё!

Если всё ещё непонятно умоляю прочтите >>> Как правильно копировать вывод терминала <<< потому что пользователь @Vsevolod-linuxoid уже устал, он очень добрый был, но вы его почти сломали, пусть он останется добрым, пожалуйста, пожалейте его и нас, форматируйте сообщения!

Маленькая ремарочка, обращение на «Ты» это нормально, тебе тут не тыкают, а не не выкают. В большинстве своём общение тут неформальное, лишние эпитеты бывают лишними, а обращение на «Вы» может даже посчитаться грубостью. Так что начать общение с вопросом к всему форуму лучше на «вы», а если в обсуждении вам вдруг сказали «ты» это не значит что вас не уважают, чаще всего это значит что общение неформальное, по свойски и к вам предрасположены. Говорят тут прямо и в лицо. Почему я тут постоянно выкаю? Потому что лень писать сделал/ла, сумел/ла и подобное, обращение к образному новорегу, а не тебе как личности. Нормально не значит обязательно, как хочется так и обращайтесь к другим, но если на обращение «вы» ответ «ты» оскорбляться не стоит.

И напоследок, вам тут никто ничего не должен, внезапно, да да! :D

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


Простыня будет меняться/дополняться/урезаться по мере возможности, ошибки тоже есть. Почищу какнить.

 , , новенький, , новорег

LINUX-ORG-RU
()

Выдержит ли SQLite нагрузку уровня linux.org.ru?

Форум — Talks

всем привет я пишу сайт на пхп четыре (из-за pdo это пока не получается, поэтому если есть замена pdo для работы с различными бд — подскажите)

главная фича моего движка в простой кодовой базе, в которой разберётся любой начинающий программист на html, css и php

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

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

все сообщения на сайте — как статьи на википедии, или как сообщения на ЛОРе, могут редактироваться сколько угодно раз и хранить всю историю изменений. весь ключевой вопрос лишь в том, способен ли выдержать SQLite такую нагрузку, или же придётся смотреть в сторону другой базы данных???

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

у меня своя собственная реализация сессий, которая никак не связана со встроенными сессиями на пхп и никак их не использует. то есть session_*(); и $_SESSION не задействуются. моя реализация позволяет более тонко контролировать все нюансы, например, не создавать пустую сессию «в холостую», или например точно определить, что в папке на диске достаточно места для хранения данных сессии.

вот пример базы данных для сообщений. они хранят всю историю изменений.

CREATE TABLE IF NOT EXISTS 'post'
(
	'id' INTEGER PRIMARY KEY,
	'domain' NVARCHAR(255) DEFAULT NULL,
	'sub_reply' INTEGER DEFAULT NULL,
	'date_created' DATETIME DEFAULT CURRENT_TIMESTAMP,
	'date_modified' DATETIME DEFAULT NULL,
	'flags' NVARCHAR(200) DEFAULT NULL
);

CREATE TABLE IF NOT EXISTS 'post_history'
(
	'id' INTEGER PRIMARY KEY,
	'sub_post' INTEGER NOT NULL,
	'ref_text' INTEGER NOT NULL,
	'date_created' DATETIME DEFAULT CURRENT_TIMESTAMP,
	'date_modified' DATETIME DEFAULT NULL
);

CREATE TABLE IF NOT EXISTS 'post_text'
(
	'id' INTEGER PRIMARY KEY,
	'text' TEXT DEFAULT NULL,
	'text_headers' TEXT DEFAULT NULL
);

сам текст сообщений хранится отдельно в третьей таблице, это сделано потому, что у каждой базы данных (конкретно у MySQL и PostgreSQL) на этот счёт разное мнение. кто-то хранит TEXT и BLOB далеко за пределами основной таблицы, чтобы минимизировать нагрузку при выборке из базы, а кто-то хранит там же рядышком. правильнее будет хранить TEXT отдельно. поэтому храню.

я не осилил ООП и не смог написать на классах, поэтому я писал на функциях, и я их назвал неклассами.

в папочке ./src/noclass/ у меня лежат следующие неклассы.

database.noclass.php:

<?php

function db_directory_sqlite() {
    return dirname($_SERVER['DOCUMENT_ROOT']) . '/db';
}

function db_connect($db_dsn = null, $db_username = null, $db_password = null, $db_attributes = null) {

    $db = false;

    if (strpos($db_dsn, 'sqlite:') == 0) {
        $db_file = substr($db_dsn, strlen('sqlite:'));
        if ($db_file == ':memory:') {
            $db = true;
        }
        elseif (is_writeable(db_directory_sqlite())) {
            $db = true;
        }
    }

    if ($db == false) {
        return false;
    }

    $db = db_connect_retry($db_dsn, $db_username, $db_password, $db_attributes);

    return $db;

}

function db_connect_retry($db_dsn, $db_username, $db_password, $db_attributes) {

    $db = false;

    while ($db == false) {
        try {
            $db = new PDO($db_dsn, $db_username, $db_password, $db_attributes);
        }
        catch (Exception $e) {
            if (stripos($e->getMessage(), 'DATABASE IS LOCKED')) {
                usleep(50000);
                continue;
            }

            return false;
        }
    }

    return $db;

}

function db_open_sqlite_in_memory() {
    $db_file = false;
    $db_dsn = 'sqlite::memory:';

    $db = db_connect($db_dsn);

    return $db;
}

function db_open_sqlite($db_file) {

    if ($db_file == ':memory:') {
        $db = db_open_sqlite_in_memory();

        return $db;
    }

    $db_dsn = 'sqlite:' . $db_file;

    $db = db_connect($db_dsn);

    return $db;
}

function db_open($db_dsn) {
    $db = db_open_sqlite($db_dsn);

    return $db;
}

function db_exec($db, $query_string) {
    $query = $db->exec($query_string);

    return $query;
}

function db_query($db, $query_string) {
    $query = $db->query($query_string);

    return $query;
}

function db_run($db, $query_string, $query_args = false) {
    if ($query_args == false) {
        $query = db_query($db, $query_string);

        return $query;
    }

    $query = $db->prepare($query_string);
    $query->execute($query_args);

    return $query;
}

function db_begin_transaction($db) {
    $query = $db->beginTransaction();

    return $query;
}

function db_is_transaction($db) {
    $query = $db->inTransaction();

    return $query;
}

function db_rollback($db) {
    $query = $db->rollBack();

    return $query;
}

function db_commit($db) {
    $query = $db->commit();

    return $query;
}

function db_last_id($db) {
    $query = $db->lastInsertId();

    return $query;
}

function db_insert($db, $table, $values) {

    $keys = array_keys($values);

    $values = array_values($values);

    $columns = array();
    foreach ($keys as $item) {
        $columns[] = "'$item'";
    }
    $columns = implode(',', $columns);

    $placeholders = array();
    foreach ($keys as $item) {
        $placeholders[] = "?";
    }
    $placeholders = implode(',', $placeholders);

    $query = "INSERT INTO $table ($columns) VALUES ($placeholders);";

    $query = db_run($db, $query, $values);

    return $query;

}

function db_update($db, $table, $value, $where) {

    $collection = array_merge($value, $where);
    $collection = array_values($collection);

    $fields = array();
    foreach ($value as $item => $data) {
        $fields[] = "$item = ?";
    }
    $fields = implode(',', $fields);

    $places = array();
    foreach ($where as $item => $data) {
        $places[] = "$item = ?";
    }
    $places = implode(' AND ', $places);

    $query = "UPDATE $table SET $fields WHERE $places;";

    $query = db_run($db, $query, $collection);

    return $query;

}

function db($db_name) {
    $db_file = db_directory_sqlite() . DIRECTORY_SEPARATOR . $db_name;

    $db = db_open($db_file);

    return $db;
}

post.noclass.php:

<?php

function post_insert($text_headers, $text, $replyto = false) {

    $db = db('example.db');

    if ($db == false) {
        return false;
    }

    db_begin_transaction($db);

    if (db_post_insert($db, $text_headers, $text, $replyto)) {

        db_commit($db);

        return true;

    }

    db_rollback($db);

    return false;

}

function db_post_insert($db, $text_headers, $text, $replyto = false) {

    if ($replyto == false) {

        $id = db_post_insert_id($db);

        if ($id == false) {
            return false;
        }

    }
    else {

        $replyto = db_post_select_id_single($db, $replyto);

        if ($replyto == false) {
            return false;
        }
        else {

            $id = db_post_insert_id($db);

            if ($id == false) {
                return false;
            }

        }
 
    }

    if (db_post_insert_post($db, $id, $replyto)) {

        $ref_text = db_post_insert_post_text($db, $text_headers, $text);

        if ($ref_text == false) {
            return false;
        }

        if (db_post_insert_post_history($db, $id, $ref_text)) {
            return $id;
        }

    }

    return false;

}

function db_post_insert_id($db) {

    $value = array(
        'id' => null
    );
    
    db_insert($db, 'post', $value);

    return db_last_id($db);

}

function db_post_select_id_single($db, $id) {

    $value = array(
        'id' => $id
    );
    
    $query = 'SELECT id FROM post WHERE id = :id;';

    $query = db_run($db, $query, $value);

    $row = $query->fetch();

    return ($row == false) ? false : $row['id'];

}

function db_post_insert_post($db, $id, $replyto = false) {

    $date_created = date('Y-m-d H:i:s', time());
    $date_modified = null;

    $search = array(
        'id' => $id
    );
    
    $entry = array(
        'id' => null,
        'domain' => null,
        'sub_reply' => $replyto,
        'date_created' => $date_created,
        'date_modified' => $date_modified,
        'flags' => null
    );

    // remove false, null and other zero-values from entry
    $entry = array_filter($entry);

    if (db_update($db, 'post', $entry, $search)) {
        return $id;
    }

    return false;

}

function db_post_insert_post_text($db, $text_headers, $text) {

    if ($text_headers == false) {
        //nothing to do -- skip headers
    }
    else {
        $text_headers = serialize($text_headers);
    }

    $entry = array(
        'id' => null,
        'text' => $text,
        'text_headers' => $text_headers
    );

    // remove false, null and other zero-values from entry
    $entry = array_filter($entry);

    if (db_insert($db, 'post_text', $entry)) {
        return db_last_id($db);
    }

    return false;

}

function db_post_insert_post_history($db, $sub_post, $ref_text) {

    $date_created = date('Y-m-d H:i:s', time());
    $date_modified = null;

    $entry = array(
        'id' => null,
        'sub_post' => $sub_post,
        'ref_text' => $ref_text,
        'date_created' => $date_created,
        'date_modified' => $date_modified
    );

    // remove false, null and other zero-values from entry
    $entry = array_filter($entry);

    if (db_insert($db, 'post_history', $entry)) {
        return db_last_id($db);
    }

    return false;

}

function db_post_select_count($db) {

    $query = db_query($db, 'SELECT COUNT(*) as sizeof FROM post;');

    $row = $query->fetch();

    return $row['sizeof'];

}

function post_update($id, $text_headers, $text) {

    $db = db('example.db');

    if ($db == false) {
        return false;
    }

    db_begin_transaction($db);

    if (db_post_update($db, $id, $text_headers, $text)) {

        db_commit($db);

        return true;

    }

    db_rollback($db);

    return false;

}

function db_post_update($db, $id, $text_headers, $text) {

    $id = db_post_select_id_single($db, $id);

    if ($id == false) {
        return false;
    }

    if (db_post_update_post($db, $id)) {

        $ref_text = db_post_insert_post_text($db, $text_headers, $text);

        if ($ref_text == false) {
            return false;
        }

        if (db_post_insert_post_history($db, $id, $ref_text)) {
            return $id;
        }

    }

    return false;

}

function db_post_update_post($db, $id) {

    $date_created = null;
    $date_modified = date('Y-m-d H:i:s', time());

    $search = array(
        'id' => $id
    );
    
    $entry = array(
        'id' => null,
        'domain' => null,
        'sub_reply' => null,
        'date_created' => $date_created,
        'date_modified' => $date_modified,
        'flags' => null
    );

    // remove false, null and other zero-values from entry
    $entry = array_filter($entry);

    if (db_update($db, 'post', $entry, $search)) {
        return $id;
    }

    return false;

}

function db_post_select_id($db, $id = false) {

    if ($id == false) {
        return false;
    }

    $value = array(
        'id' => $id
    );

    $query = '
SELECT * FROM post
INNER JOIN post_history AS initial ON (initial.sub_post = post.id AND initial.id = (SELECT id FROM post_history WHERE sub_post = post.id ORDER BY id ASC LIMIT 1))
INNER JOIN post_history AS current ON (current.sub_post = post.id AND current.id = (SELECT id FROM post_history WHERE sub_post = post.id ORDER BY id DESC LIMIT 1))
INNER JOIN post_text ON post_text.id = current.ref_text
WHERE post.id = :id
';

    $query = db_run($db, $query, $value);

    $row = $query->fetch();

    $row = post_row($row);

    return $row;

}

function db_post_select_page($db, $page = false, $limit = 10) {

    $pages = (db_post_select_count($db) / $limit);
    $pages = ceil($pages);

    if ($page == false) {
        $page = $pages;
    }
    elseif ($page > $pages) {
        $page = $pages;
    }
    elseif ($page < 1) {
        $page = $pages;
    }

    $offset = ($page - 1) * $limit;

    // should I make it more stronger?
    // escape offset and limit
    $query = '
SELECT * FROM post
INNER JOIN post_history AS initial ON (initial.sub_post = post.id AND initial.id = (SELECT id FROM post_history WHERE sub_post = post.id ORDER BY id ASC LIMIT 1))
INNER JOIN post_history AS current ON (current.sub_post = post.id AND current.id = (SELECT id FROM post_history WHERE sub_post = post.id ORDER BY id DESC LIMIT 1))
INNER JOIN post_text ON post_text.id = current.ref_text
ORDER BY id DESC LIMIT ' . $limit . ' OFFSET ' . $offset . ';
';

    $query = db_query($db, $query);

    $array = array();

    while ($row = $query->fetch()) {

        $array[] = post_row($row);

    }

    return $array;

}

function post_row($row) {

    if ($row == false) {
        return false;
    }

    if ($row['date_created'] == null) {
        $row['date_created'] = '(unavailable)';
    }

    if ($row['date_modified'] == null) {
        $row['date_modified'] = '(unavailable)';
    }

    if (empty($row['text_headers'])) {
        $row['text_headers'] = array();
    }
    else {
        $row['text_headers'] = unserialize($row['text_headers']);
    }

    if (empty($row['text_headers']['title'])) {
        $row['text_headers']['title'] = '';
    }

    return $row;

}

function post_escape($text) {

    $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8');
    $text = nl2br($text);

    return $text;

}

function post_input_filtered($text) {

    $text = htmlspecialchars($text, ENT_QUOTES, 'UTF-8');

    return $text;

}

function post_text_filtered($text) {

    $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8');

    return $text;

}

session.noclass.php

<?php

function session_directory() {
    return dirname($_SERVER['DOCUMENT_ROOT']) . DIRECTORY_SEPARATOR . 'db' . DIRECTORY_SEPARATOR . 'sess';
}

function session_open($session_name = 'ident') {

    $session_id = session_open_if_cookie_is_set($session_name);

    if ($session_id == false) {
        $session_id = session_new($session_name);
    }

    return $session_id;

}

function session_open_if_cookie_is_set($session_name = 'ident') {

    if (isset($_COOKIE[$session_name])) {
        $session_id = $_COOKIE[$session_name];

        if (strlen(str_replace(array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'), '', $session_id)) > 0) {
            $session_id = session_new($session_name);
        }

        return $session_id;
    }

    return false;

}

function session_load($session_id) {

    $session_file = session_directory() . DIRECTORY_SEPARATOR . $session_id;
    $session_data = false;

    if ($fp = @fopen($session_file, 'r')) {
        flock($fp, LOCK_SH);
        $session_data = fread($fp, filesize($session_file));
        $session_data = unserialize($session_data);
        flock($fp, LOCK_UN);
        fclose($fp);
    }

    if (is_array($session_data)) {
        return $session_data;
    }

    return array();

}

function session_save($session_id, $session_data = array()) {

    $session_file = session_directory() . DIRECTORY_SEPARATOR . $session_id;
    $session_data = serialize($session_data);

    if ($fp = @fopen($session_file, 'w+')) {
        flock($fp, LOCK_EX);
        $bytes_written = fwrite($fp, $session_data);
        flock($fp, LOCK_UN);
        fclose($fp);
    }

    return $bytes_written;

}

function session_new($session_name) {

    if (headers_sent()) {
        return false;
    }

    $session_id = bin2hex(session_random_bytes(8));

    $cookie_lifetime = 0;
    $cookie_path = '/';
    $cookie_domain = '';
    $cookie_secure = false;
    $cookie_httponly = false;

    if (setcookie($session_name, $session_id, $cookie_lifetime, $cookie_path, $cookie_domain, $cookie_secure, $cookie_httponly) == false) {
        return false;
    }

    return $session_id;

}

function session_random_bytes($length = 32) {
    
    $random_bytes = '';

    for ($i = 0; $i < $length; $i++) {
        $random_bytes .= chr(rand(0, 255));
    }

    return $random_bytes;

}

function session() {

    $id = session_open();

    if ($id == false) {
        return false;
    }

    $session = session_load($id);

    return $session;

}

вот вам небольшая инструкция как использовать сессии

вы просто делаете $session = session(); и создаётся новая сессия и в переменную $session загружается массив со всеми данными сессии.

если вы хотите что-то сохранить в сессию, то вы должны проделать все действия вручую:

// создаём новую сессию
// в $id помещается идентификатор сессии, ну типа PHPSESSID
$id = session_open();

// загружаем данные сессии в переменную $session
// можно для этого использовать $_SESSION но я не хочу и не буду
$session = session_load($id);

// создаём в $session приветствие
$session = array('greeting' => 'hello world!');

// сохраняем данные сессии, за вас это никто не сделает
session_save($id, $session);

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

в целом моя реализация сессий лучше пхпшной т.к. она не создаёт пустых файлов!!! каждый момент вы контролируете сами!!!

теперь давайте я вам расскажу про сообщения а-ля википедия или лор.

для отправки сообщения я делаю так:

$headers = array(
    'title' => 'заголовок письма'
);

$content = 'текст письма';

post_insert($headers, $content);

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

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

функция post_insert(); вернёт просто true в случае узбека. иначе false.

для того, чтобы отредактировать сообщение, есть функция post_update();, но первым параметром ещё нужно указать ID сообщения.

например мы только что добавили сообщение, его ID 1, теперь мы хотим его отредактировать.

$id = '1';

$headers = array(
    'title' => 'заголовок письма (отредактировано)'
);

$content = 'исправленный текст письма';

post_update($id, $headers, $content);

и теперь в базу будет сохранена новая версия сообщения.

выполняем sqlite example.db .dump и смотрим

INSERT INTO post VALUES(1,NULL,NULL,'2022-07-17 06:24:55','2022-07-17 06:25:26',NULL);

INSERT INTO post_history VALUES(1,1,1,'2022-07-17 06:24:55',NULL);
INSERT INTO post_history VALUES(2,1,2,'2022-07-17 06:25:26',NULL);

INSERT INTO post_text VALUES(1,'текст письма','a:1:{s:5:"title";s:31:"заголовок письма";}');
INSERT INTO post_text VALUES(2,'исправленный текст письма','a:1:{s:5:"title";s:64:"заголовок письма (отредактировано)";}');

по факту сообщение одно, а ревизии у него две! так-то!

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

$db = db('example.db');

if ($db == false) {
    return false;
}

$post = db_post_select_id($db, $_GET['id']);

var_dump($post);

для того, чтобы вывести страницу со списком сообщений есть функция db_post_select_page($db, $_GET['page']);

в целом мой код будет очень хорошо документирован, но это чуть попозже, пока только реализация.

мой код написан очень качественно на совесть, писал для себя.

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

главный вопрос — выдержит ли такая структура базы данных на SQLite нагрузку с бесконечным редактированием сообщений???

 ,

Spoofing
()

Релиз Goblin Camp v0.23

Форум — Games

Goblin Camp - игра на подобие Dwarf Fortress но с открытым, свободным кодом.

Изначально написана комрадом Ilkka Halila, который ее в скорости забросил.

Я некоторое время назад эту игру подобрал и неспеша привожу ее в работоспособное состояние.

Основная тема релиза – работоспособность графических тайлов под SDL2. (По ссылке есть скриншот)

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

Так же начата работа по снижению количества warning’ов которые на старый код выдает современная версия библиотеки libtcod.

Ссылка на релиз: https://gitlab.com/dhyannataraj/goblin-camp/-/releases/v0.23

P.S. Сама игра в нынешний момент далека от идеала, сейчас с ней по настоящему можно играть только в программирование игр. Но я надеюсь что в какой-то момент это поменяется… У меня есть много всяких идей…

 , , goblin camp, ,

shaplov
()

Ничего особенного,просто Fallout 2 на движке Doom

Форум — Games

https://jonasz-o.itch.io/fallout2remake3d

Проект фанатский,и активно развивается. По ссылке можно поиграть прямо в браузере,там же скачать. В том числе, под линукс (у меня правда не завелось). Что приятно - есть рус. перевод. Правда,кривоватый - в меню навыков все перепутано,так что на дверь надо делать «скрытность» вместо «взлом». Полчаса тупил в храме,пока дошло) Как по мне - это уже лучше Фоллаутов от Беседки.

 

Dog
()

Показать наименее нужные пакеты

Форум — General

Как найти наименее нужные, т.е. наиболее давно использованные пакеты?

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

Интернет про это знает совсем немного:

https://unix.stackexchange.com/questions/483900/how-to-find-unused-packages-i...

https://askubuntu.com/questions/630787/how-do-i-eliminate-unused-packages-in-...

damix9
()

much performance II

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

Всем привет! Спустя некоторое время выкладываю продолжение результатов «упорных» стараний над оптимизацией Gentoo на ПК с Intel Celeron Coppermine 900 MHz и 256 Mb RAM. Что сделал:

  • С помощью ноута собрал 17-ую версию;
  • Ядро теперь 4.14.8, а так же я поснимал еще больше звездочек в menuconfig (на старте без X и MariaDB - min 13 Mb RAM, c XFCE - min ~60 Mb RAM);
  • Нет теперь dm, запуск X происходит автоматически с помощью getty+autologin;
  • Браузер Palemoon SSE версия работает шустрее, страницы открывает почти как в 2018 году;
  • Все тот же gimp2 и теперь OpenOffice 4, который пришел на смену LO, так как LO заколебал своими багами;

Была попытка использовать вылизанную Plasma 5, но черепашьему HDD это не понравилось.

Некоторое время Gentoo даже обновлялась до первого прихода gcc. ПК использовался в качестве печатной машинки, для работы с таблицами, для того, чтобы поправить картинки в gimp, и в качестве сервера CUPS и базы данных MariaDB с последующем подключением через OO Base.

Вот еще два скриншота:

К сожалению, это последние скриншоты, ко мне наведался «ИТ отдел» с новым ПК, с установленным Windows 7, мой компьютер обещали форматнуть с аргументом !внезапно! «линукс нелицензионный, нельзя, точка», и скорее всего будет отправлен на свалку. Комп 04.01.2002 даты рождения, с ним я работал 2 года, был мной почищен от пыли и от XP ZverCD с заменой термопасты. По информации из BIOS с 45'С упало до 36. Оформляется stage4. Сегодня или завтра его последний день :(

И немного конфигов:

 ,

mfhunruh
()

Быстрая флешка под систему

Форум — Linux-hardware

Делюсь радостью: пока я сидел в криокамере, в продаже появились быстрые бюджетные флешки.

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

Купил SanDisk Ultra Flair 16GB за 800 рублей. В нетбуке нет поддержки USB 3.0, но даже через 2.0 линукс работает с этой флешки впечатляюще. (Впечатляюще для флешки. Не SSD, конечно.) В CrystalDiskMark вот такие числа через USB 2.0: https://image.ibb.co/gDL4mT/post_35_Sandisk_Ultra_Flair.png

А вот Kingston DataTraveler SE9 G2 меня разочаровал. Стоит примерно те же деньги. Быстро читается, но при записи мелких файлов превращается в обычный китайский ноунейм. Не ведитесь на красивый корпус, не берите эту ерунду.

Немного подробнее писал на эту тему в ZeroNet-е. У кого настроена нода ZeroNet, можно почитать по ссылке http://127.0.0.1:43110/1BLoGBTid3NhGu8ts3fAfHJprnbrH3wfTV/?Post:35

ЛОР, какие еще флешки подходят для установки системы и для копирования кучи мелких файлов? По отзывам получается, что в бюджетном сегменте только SanDisk тащит. Так что ли?

 , ,

Deleted
()

Хочу загрузочную флешку с кастомным дебианом (с поднятым sshd с определённым root-паролем).

Форум — General

Хочу флешку с дебианом такую, что при загрузке с неё поднимается сеть через DHCP, поднимается sshd:22 с наличием root, pass=12345.

Смысл флешки: воткнул в подопыный комп, перезагрузил комп, подождал, нашёл его IP по MAC в DHCP-сервере, законнектился к нему по ssh root:12345 и досетапил этот комп, заинсталлив ему на sata-диск дебиан и донастроив как надо.

Я правильно понимаю, что такое сработает:

  1. Берём флешку 1, катим туда ISO с убунтой/дебианом.
  2. Грузимся с этой флешки.
  3. Втыкаем флешку 2, просим загрузившийся live-дистр установить систему на флешку 2.
  4. Грузимся с флешки 2, сетапим там sshd, добавляем его в автоподнятие, заводим нужный логин, sync, готово. Теперь флешка 2 - то, что я хочу?

План выглядит как хрень, конечно. Как правильнее? Что-то в духе «накатить свежый дебиан на LXC-виртуалку, пойти в эту виртуалку, установить туда sshd, настроить доступы и поднятие сети, выключить виртуалку, трансформировать эту фиртуалку в загрузочную флешку». Это правильный путь? Как?

Чё-то стало казаться, что достать sata-диск из подопытного компа и всё заинсталлить на этот диск через USB->sata хвост - проще всего этого, но всё равно вопрос такой волшебной флешки актуален - с ней не надо раскручивать компы.

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

 

trisobakov
()

Почему мои сервера на Debian, Ubuntu взламывают, а на CRUX нет?

Форум — Talks

Вчера вспомнил про VDS, после очередного «она мне изменила, но я её простил» решил накатить Ubuntu, установить и ввести в строй по-быстрому exim, bind.

Сегодня с утра наблюдаю какой-то кошмар в htop. Ну недолго думая затёр жестокий диск и poweroff.

То есть, чтобы вы понимали, я просто оставил систему в состоянии «из коробки», не заморачиваясь настройками, не ковыряя ssh или ещё что. Установил что было нужно (exim, bind), и забил, типа работает и пусть и работает, что ещё надо-то от меня?

Лень разбираться через что и как, тратить время на изучение причин, факт лишь в том, что Ubuntu из коробки подверглась ололо-взлому за ночь.

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

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

РРРР! Бесит.

 

Spoofing
()

Игры в терминале

Форум — Games

Данный топик про игры в юниксовом терминале. Здесь я буду на регулярной основе (в идеале) описывать в отдельном комментарии какую-нибудь игру. В стартер-посте будут ссылки на эти комментарии. Обзор будет не очень подготовленным, поэтому не ждите литературных изысков. Но тем не менее те, кто любит подобное красноглазие, смогут познакомиться с играми и выбрать на свой вкус понравившуюся вещицу. Данная тема создана по аналогии с соседним топиком про стимовские игры.

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

Теги для поисковых ботов (жрите мои любимые ботики): ascii games, terminal games, ncurses games, tty games, console games, cli games, tui games, text-based games, command line games, игры в терминале, игры в консоле, игры для командной строки.

Критерии отбора:

  1. Язык программирования: Си(в приоритете), си++. Остальные пока не рассматриваются. Потенциальные в будущем - ада, фортран, бейсик, паскаль. Жирный пайтон идет лесом, хипстерские гоу, раст и иже с ними туда же.
  2. Открытые исходники с лицензиями, позволяющими модификацию, не препятствующие распространению. Свободные и одобренные дядюшкой Столлманом в приоритете.
  3. Зависимости. Без sdl и других графических либ. Опционально пускай будет, например, для музыки. Но не навязывается. NCurses и подобные библиотеки для работы с терминалом всяко одобряются и котируются. Не приветствуются в зависимостях всякие гугловские юнит тесты и другие чёрт ногу сломит либы. Для маленьких терминальных игр эта мишура не нужна.

Источники игорей:

  1. https://ttygames.wordpress.com/
  2. https://github.com/ligurio/awesome-ttygames
  3. https://inconsolation.wordpress.com/
  4. https://kmandla.wordpress.com/
  5. https://ibiblio.org/pub/linux/games/ Артефакты прошлого. Игры для терминала надо искать. Не всё собирается с современным компилятором.
  6. gopher://sdf.org/9/users/saahriktu/bttf/gamez_p0.tar.lzma (использовать lynx) - сборник ascii игр, собранный камрадом @saahriktu
  7. https://www.youtube.com/user/livibetter/videos
  8. https://zenway.ru/tag/ASCII
  9. https://blends.debian.org/games/tasks/console
  10. ASCII игры по Linux
  11. Поиск на github.com, gitlab.com по соответствующим запросам
  12. Поиск рогаликов на http://www.roguebasin.com/index.php?title=Category:Roguelike_games
  13. Все поисковики, даже малоизвестные иногда выдают страницы, на которые не попадешь с гугла или яндекса.

Сами игори:

!!!NEW!!! 1. 8f - Терминальный вариант карточной игры Сумасшедшие восьмёрки (Crazy Eights).

  1. Alienwave - Сложная Galaga-подобная игра с хорошим ascii-артом.
  2. Bricktick - Красивый клон арканоида с бонусами.
  3. CLines - Качественная реализация всеми известной офисной игры Color Lines.
  4. Dominoes - Реализация одного из вариантов игры Домино.
  5. Lwrace - Бегаем символом «O», собираем «$», избегаем «#», уворачиваемся от «o».
  6. Morpion solitaire - Отличная реализация отличной же тетрадной игры Join Five.
  7. MyMan - Пакман для терминала с множеством настроек.
  8. Peg-solitaire.c - Добротная реализация одноименной настольной игры с 5-ю раскладками.
  9. XT gyoretsu - Воссозданная с любовью и с ncurses старая тетрадная игра.
  10. Ztrack - Псевдо-тридешные гоночки с красивым бэкграундом.
  11. to be continued

 , , ,

nab_linux
()

Как порезать на главы по таймингам скачанный mp3 yt-dlp?

Форум — General

Скачиваю аудиокнигу с ютуба в виде mp3, без ненужного видео. Автор потрудился поставить в описании таймкоды. Вопрос - может ли данная утилита после скачивания и вытаскивания mp3, порезать его по ним с именованием по описанию?

Скачать и сохранить только .mp3:

yt-dlp -x --audio-format mp3 -f "bestaudio/best" --write-description  https://youtu.be/DtBkEqADtKQ

Смотрим скачанное описание:

cat 🐙[УЖАСЫ]\ Джеймс\ Герберт\ -\ Туман.\ Аудиокнига.\ Читает\ Олег\ Булдаков\ [DtBkEqADtKQ].description

...
00:00:00 Пролог
00:04:19 Глава 1
00:11:54 Глава 2
00:29:51 Глава 3
...
07:37:13 Глава 20
08:03:05 Глава 21
08:57:46 Глава 22
...

Вот по этим таймингам я и хочу порезать. И чтобы всё сложилось в отдельную папку с файлами по описанию после тайминга. Такое возможно?

 

hikikomori
()

Простые библиотеки реализующие графический интерфейс в python

Форум — Development

Под скажите подажулйста, есть ли простые библиотеки для создания граф. интерфейсов в python. Сразу говорю, qt, tkinter, gtk(Если конечно есть простая вариация GTK, то предлагать) не предлагать. В tkinter не хватает функционала, смотрю в сторону kivy, но не очень хочется юзать поскольку, всё таки программа не для мобильных девайсов. Если не найду ответа, то буду юзать либо ту библиотеку, либо буду юзать фрейм в tkinter и сделаю CLI интерфейс.

 ,

enot_obrmot
()

LineageOS 19

Новости — Android
Группа Android

26 апреля вышла девятнадцатая версия LineageOS — операционной системы на базе Android для энтузиастов. Система свободна за исключением некоторых компонентов, необходимых для работы оборудования, и является преемницей CyanogenMod. Новая версия основывается на кодовой базе Android 12.

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

>>> Подробности

 

seiken
()

Очередной выбора хостинга тред

Форум — Talks

Доброго времени суток. Не так давно я лишился возможности оплачивать сервер в scaleway. В связи с чем ищу ему замену. Я ищу себе сервер под свой инстанс NextCloud`а. 2 гига - 2 ядра и и для экономии денег медленное хранилище на обычных дисках а не новомодных nvme. Но размером от 100Гб. Так же требованием к хостингу является возможность оплаты картой МИР и цена не более 900Руб/мес

Так же планирую держать на сервере выход OpenVPN для личных нужд. В связи с чем интересует вопрос. А обязаны ли хостинги соблюдать требование ограничивать доступ к определённым ресурсам на выделенных серверах? Или искать сервер нужно расположенный в одной из евро стран?

Мне интересными показались вот такие предложения:

ispserver.ru Но не могу разобраться в каком из 3х их датацетров будет размещаться сервер.

https://justhost.ru/ Но при выборе сервера за пределами России, цена драматически вырастает за допустимые для меня размеры.

Может у кого то из ЛОРовцев есть на примете хостинг отвечающий моим запросам?

 

Behem0th
()