[/b/] [/d/] [/tu/] [/a/] [/ph/] [/wa/] [/cg/] [/t/] [/p/] [/dev/] [/stat/] ]
[Burichan] [Futaba] [Gurochan] [Tomorrow] [Архив-Каталог] [Главная]

Файл: 1585764500031.jpg -(461 KB, 1920x1080, 1585764500031.jpg)
461 No.174285  

Скрипты/софт облегчающий жизнь.

Прошлый тред >>43960

>> No.174286  

>>174284

> Как переписать about:config не заходя в fireeox? Заменить на другой например.

Этот конфиг хранится в ~/.mozilla/firefox/имяпрофиля/prefs.js

>> No.174288  

>>174286
Спасибо тебе.

>> No.174302  
#!/bin/sh

############################################################
# Массовая конвертация текстовых файлов из CP-1251 в UTF-8.
# $1 - Директория с исходными файлами.
# $2 - Директория для сохранения новых файлов.
############################################################

# Проверка ввода
if [ $# -ne 2 ]; then
echo "Usage: $0 <INPUT_DIRECTORY> <OUTPUT_DIRECTORY>" >&2
exit 1
fi
if ! [ -e "$1" ]; then
echo "${1}: no such directory." >&2
exit 1
fi
if ! [ -d "$1" ]; then
echo "${1} is not a directory." >&2
exit 1
fi

# Удаление "./" или замыкающего слэша
INDIR="$(basename $1)"
OUTDIR="$2"

# Создание верхней директории
if ! [ -d "$OUTDIR" ]; then
mkdir "$OUTDIR"
fi

# Пересоздаётся структура директорий
find "$INDIR" -mindepth 1 -type d |
while read DIR; do
NEWDIR=$(echo "$DIR" | sed 's,[^/]*/,,')
mkdir -p "${OUTDIR}/${NEWDIR}"
done

# Конвертация текстов
find "$INDIR" -name '*.txt' |
while read INFILE; do
OUTFILE=$(echo "$INFILE" | sed 's,[^/]*/,,')
OUTFILE=${OUTDIR}/${OUTFILE}
file "$INFILE" | grep -q 'ISO-8859 text'
if [ $? -eq 0 ]; then
MTIME=$(stat "$INFILE" | sed -n 's/^Modify: //p')
iconv -f cp1251 -t utf8 "$INFILE" > "$OUTFILE"
sed -i 's/\r//' "$OUTFILE" # CRLF -> LF
touch -d "$MTIME" "$OUTFILE"
else
cp -p "$INFILE" "$OUTFILE"
fi
done
>> No.174314  

>>174302
Я считаю к таким скриптам нужно прикручивать проверку на integrity получившихся данных и их соответствие тексту из старых файлов.

>> No.174517  

Внезапно binwalk отлично детектит и распаковывает rarjpeg, zipjpeg и некоторые другие артефакты борд.

>> No.174543  
Файл: 1586627941047.jpg -(474 KB, 904x1280, 1586627941047.jpg)
474

>>174314
Как, если даже кодировку определить автоматически надёжным способом нельзя?
Разве только показывать каждый получившийся текст и спрашивать «Y/N» — что явно не подходит, потому что таких файлов могут быть сотни.

>> No.174567  

Можно ли в утилиту коммандной строки(например chmod) вместо нормального файлового пути скормить URI(file:///path)? В мане не нашел, в гугле нашел только через < <(curl -s URIpath).

>> No.174568  

>>174567
Что должна сделать chmod с http-ссылкой?

>> No.174569  

>>174567
Если используешь GNOME, есть всякие утилиты, начинающиеся на gvfs-. Для KDE тоже что-то подобное должно быть. Это самое близкое к тому, что тебе нужно.
>>174568
Это URL. К HTTP не имеет никакого отношения.

>> No.174573  

>>174569
Спасибо. Не помогло, но могло бы помочь, их слишком мало в моей системе. Если кому-то другому интересно, то здесь о них написанно:
https://wiki.gnome.org/Projects/gvfs/doc#Tools

>> No.174575  

>>174573
Расскажи, что пытаешься сделать. Можно же сконвертировать file:// в обычный путь к файлу.

>> No.174578  

>>174575
Мне подойдет и собственнный нагугленный способ из >>174567, спрашивал на случай более верных способов сделать это.

>Расскажи, что пытаешься сделать.

Скрипт/софт облегчающий жизнь. же.

>Можно же сконвертировать file:// в обычный путь к файлу.

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

>> No.174579  

>>174517

> Внезапно binwalk отлично детектит и распаковывает rarjpeg, zipjpeg и некоторые другие артефакты борд.
> и некоторые другие

А какие ещё есть/были? Я помню, на Сосаче году в 2011 кто-то выложил в /b/ якобы самописную тулзу для стеганографии, опять же, якобы для простоты шаринга известного контента, но вряд ли кто-то пользовался exe-шником без сорцов, лол.

>> No.174580  

>>174579
Последовательно натравливать разорхиваторы же.

>> No.174582  

>>174579
ddt?
Недавно ещё жила вроде.

>> No.174592  

>>174579
да тысячи их, даже imagic так умел, как ща помню
https://opensource.apple.com/source/file/file-44/file/magic/Magdir/archive
вообще, если только стеганография (без шифрования) то
https://weekly-geekly.github.io/articles/337084/index.html
t;dr ищем сигнатуры или характерные аномалии

>> No.174601  

>>174567
>>174578

>если crul вдруг не съест локальный путь или ещё каких-то проблем

Проблемы случились, этот способ:
< <(curl -s URIpath)
взятый отсюда:
https://stackoverflow.com/questions/5735666/execute-bash-script-from-url
работает видимо лишь с bash скриптами, передавая скорее всего контент, а не адрес, чего вообще-то и следовало ожидать.
Но полистав мануал curl я нашел флаг --quote, который должен позволять отправлять некоторые комманды(ln, chmod, chown, и т.д., всего штук семь) к файлу, что мне и нужно. Возможно что только по ftp и sftp.
Кажется, в итоге придется-таки говнокодить обёртку.

>> No.174632  

>>174601

> работает видимо лишь с bash скриптами, передавая скорее всего контент, а не адрес, чего вообще-то и следовало ожидать.

Не совсем понимаю, зачем ты привязался к этому [...] < <(curl -s URIpath). Он же эквивалентен curl -s URIpath | [...]. Вот [...] <(curl -s URIpath) уже другое дело.

Передаётся там не адрес и не контент, а путь к открытому пайпу из /dev/fd/. Работает только с теми программами, которых устраивает прочитать файл последовательно и один раз. Например, file <(cat /etc/passwd) так не сработает.

Объясни всё же, зачем тебе работать с file://, почему не подходит просто сконвертировать file:// в обычный путь, нужно ли тебе поддерживать ещё какие-то протоколы.

>> No.174858  

https://linux.die.net/man/1/rlwrap

>> No.174859  

>>174858
Ухты, еще и историю с поиском умеет.

>> No.174864  

sed -i /SpamSpamSpam/d *ass

Удалить все строчки содержащие SpamSpamSpam во всех *ass

>> No.174923  

>>174632
Ни то, ни то не работает.

>почему не подходит просто сконвертировать file:// в обычный путь

Подходит, для этого я и пытался использовать curl. Устанавливать новых библиотек не хочется.

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

Но сначала хотел на си написать этот скрипт, используя какую-нибудь часто используемую библиотеку для этого, попробовал uriparser, но оказалось слишком сложным переработать её код, и простейшая ide(анюта) не очень помогала мне.
Какими ide ты пользуешься?

>> No.174924  
Файл: 1587716598187.png -(5 KB, 388x383, 1587716598187.png)
5
>> No.174934  

>>174923

>>> url = 'file:///home/anon/Downloads/(%E4%B8%80%E8%88%AC%E5%B0%8F%E8%AA%AC)%20[%E4%BC%8F%E8%A6%8B%E3%81%A4%E3%81%8B%E3%81%95]%20%E4%BF%BA%E3%81%AE%E5%A6%B9%E3%81%8C%E3%81%93%E3%82%93%E3%81%AA%E3%81%AB%E5%8F%AF%E6%84%9B%E3%81%84%E3%82%8F%E3%81%91%E3%81%8C%E3%81%AA%E3%81%84%2001-11/'
>>> urllib.parse.unquote(urllib.parse.urlsplit(url).path)
'/home/anon/Downloads/(一般小説) [伏見つかさ] 俺の妹がこんなに可愛いわけがない 01-11/'

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

>> No.174988  

>>174934

>urllib
>>Устанавливать новых библиотек не хочется.
>> No.174990  

>>174988
Но ведь urllib идет в коробке.

>> No.175201  

Давайте проверим насколько умно гитхаб блокирует проксиёбов!
Мой тор браузер забанили на скачивание https://github.com/rShetty/awesome-podcasts и, кажется, всех остальных репов, а ваш?

>> No.175202  

>>175201
Что ты имеешь в виду? Clone or download > Download ZIP? Это у меня работает.

>> No.175203  

>>175202
Да, у меня это не скачивает. У тебя отключен жс?

>> No.175206  

>>175203
Нет. Но если отключить, то тоже скачивает. Попробовал даже из-под свежезапущенного с отключенным JS.

>> No.175207  

>>175206
У меня тоже скачался сейчас. Но до этого в течении нескольких часов перезапуск не помогал. Я всё-таки думаю, что идентифицирет браузер как-то.

>> No.175301  

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

data:text/html;charset=utf-8, <html contenteditable>
>> No.175303  

И еще букмарклет, включающий/выключающий редактирование на любом сайте. Так легче копировать текст, делать навигацию курсором или делать фейковые скриншоты

Вставьте весь код как одну строку в поле URL при добавлении букмарклета.

javascript:(function(){
window.__preventLinkingCallback = window.__preventLinkingCallback || function(e){
e.preventDefault();
e.stopPropagation();
};
if (document.designMode === 'off') {
document.designMode = 'on';
document.querySelectorAll('a[href]').forEach(link => link.addEventListener('click', window.__preventLinkingCallback));
}
else {
document.designMode = 'off';
document.querySelectorAll('a[href]').forEach(link => link.removeEventListener('click', window.__preventLinkingCallback));
}
}());
>> No.175305  

>>175301
Чет не работает.
>>175303
А вот этот работает.

>> No.175577  

>>175301
>>175303
Где скачать третьих героев на js?

>> No.175580  

>>175577
https://habr.com/ru/company/jugru/blog/354014/

>> No.175598  

>>175580
Статья хорошая, но скачать игру не смог.

>> No.175606  

>>175580

>отметить его значимость для сообщества, потому что это единственный полностью написанный клон «Героев» на языке C, использующий дистрибутив оригинальных ресурсов, которые можно к нему подложить
>это единственный способ запустить третьих «Героев» на Android-устройствах

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

>> No.175633  

>>175606

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

Да, я твою не понимать.

>>175301
>>175303
>>175580
Скажите, а как из js фронтендового в браузере гарантированно чистить оперативную память? Какие техники и апи использовали для этого до wasm, где об этом почитать?

>> No.175636  

>>175606
Уже нашел, надо было на английском гуглить. Эх рунет совсем загибается.

>> No.176261  

Для тех кто не может посинкать папку в mutt, потому что в нее постоянно что-то падает:

macro index 2 <sync-mailbox><sync-mailbox>
>> No.176265  

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

>> No.176268  
Файл: 1591342247709.jpg -(104 KB, 850x927, 1591342247709.jpg)
104

>>176265

> как можно автоматизировать переименование субтитров под серии аниме?

С помощью скрипта. Смотря, в какой ОСи и как выглядят имена файлов изначально. И на чём писать.

>> No.176267  

>>176265
Что-то вроде
ls *ass | while read i ; do mv -v "$i" "$(echo $i | sed 's/replace from regex/replace to pattern/g')" ; done
но вообще у многих плееров есть опция в духе sub-auto=fuzzy которая автоматически матчит отличающиеся по имени субтитры.

>> No.176280  

>>176268

>Смотря, в какой ОСи

Достаточно заставить поставить WSL.

>> No.176287  
Файл: 1591431433308.jpg -(149 KB, 850x598, 1591431433308.jpg)
149

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

>> No.176293  

>>176265
Когда-то нашёл ranger и больше боли не знал.
В нём есть скрипт bulkrename(хоть есть и аналоги, но не гуглил), который открывает VISUAL и в нём довольно удобно редактировать, особенно в виме.
До этого однострочниками уровня for-sed.

>> No.176396  
Файл: 1591732044522.jpg -(132 KB, 440x1200, 1591732044522.jpg)
132
xrandr --output OUTPUT --scale 0.5x0.5

Уполовинивает разрешение для OUTPUT. Можно пускать не адаптированный софт на UHD мониторах или получить в четыре раза больше fps в играх. 1x1 - вернуться в обычный режим.

>> No.177145  
Файл: 1594118895567.png -(939 KB, 1000x1098, 1594118895567.png)
939

Если в ~/.ssh/config дописать нечто вида

Host *.onion
ProxyCommand socat SOCKS4A:127.0.0.1:%h:%p,socksport=9050 STDIO

то на .onion хосты по ssh можно будет просто ходить через ssh blah-blah-blah.onion.

>> No.177152  

>>177145
Я думал Уцуха Tor не уважает.

>> No.177154  
Файл: 1594126237875.png -(1219 KB, 906x1200, 1594126237875.png)
1219

>>177152
Это просто инструмент.

>> No.177155  

>>176293
ranger заслуживает большего внимания и аудитории.

>> No.177171  

>>177154
Инструмент. Моим компьютером пользуешься, а на свой постить не всегда даёшь. Несправедливо.

>> No.177239  

https://www.byronknoll.com/cmix.html

архиватор с экстремальным сжатием и потреблением ресурсов

>> No.177903  

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

#!/usr/bin/env python3

from flask import Flask, send_file
import os

app = Flask(__name__)

@app.route('/')
def screenshot():
os.system('import -window root /tmp/screen.jpg')
return send_file('/tmp/screen.jpg', mimetype='image/jpeg')

if __name__ == '__main__':
app.run()
>> No.177962  

>>177903

Но тут нужен предварительно скачанный flask, а между тем можно просто побровать использовать встроенный в пайтон веб сервер и cgi. ImageMagick не везде есть, но это уже придирки

>> No.177964  

>>177962
Это просто наколеночная поделка за 15 минут.

> встроенный в пайтон веб сервер и cgi

Не слышал про него раньше. Выглядит не так просто, как flask.

>> No.177983  

>>177903
Можно взять inetd или xinetd и без всяких питонов получать скриншот через netcat

>> No.177988  

>>177983
netcatом не очень удобно пользоваться на всяких планшетотелефонах

>> No.179383  

https://habr.com/ru/post/517146/

>> No.179387  

>>179383
За что люблю вивальди, так это подобные фитчи из коробки.
Если другие браузеры с каждым новым обновлением фитчи выпиливают, то в вивальди они появляются, при чём в более удобном виде.

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

>> No.179426  

>>179387

Это все равно хромиум.

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

>> No.179427  

>>179426
Никто не спорит, но это хромиум, в котором фитчи уже готовы, и всё сделано до нас.

И опять же, есть qutebrowser, в котором указанные фитчи уже есть пару лет(учитывая, что он релизнулся 5 лет назад).

>> No.179428  

>>179426
Да как-то не очень потихоньку https://twitter.com/MichalPurzynski/status/1293220570885062657

>> No.180446  

Есть ли какой-либо аналог sshfs умеющий в автомонтирование? Нужно делать что-то вроде

sshfsmount /mnt/sshfs
cat /mnt/sshfs/example.com/etc/passwd
>> No.180467  

>>180446

>Есть ли какой-либо аналог sshfs умеющий в автомонтирование?

Вероятно, запись с sshfs в fstab.

>Нужно делать что-то вроде

И это всё? Почему тогда нельзя просто через ssh запустить команду?

>> No.180470  

>>180467

> Вероятно, запись с sshfs в fstab.

Хосты динамические и их много. Слишком сложная и неустойчивая конструкция получится.

> И это всё?

Это пример того, как я себе представляю результат. Вот другой пример:

diff /mnt/sshfs/host{1,2}.example.com/etc/passwd

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

>> No.180879  

>>180446

СIFSD
NFS

>> No.180881  

>>180879
Как это поможет решить проблему автомонтирования неопределенного количества хостов?

>> No.181090  

>>180881

Там специальные демон автоматически монтирует файловую систему при загрузке ОС. Что делать с меняющимися хостами не знаю

>> No.181091  

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

>> No.181141  

>>181091

ansible

>> No.181142  

>>181141
И как это поможет?

>> No.181144  

>>181142

Можно

> при обращении прозрачно соединяться с хостами, а после завершения всех операций разъединяться

https://stackoverflow.com/questions/53819706/difference-in-two-file-using-ansible-module

>> No.181145  

>>181144
Но приведенный пример даже не соединяется с удаленным хостом, а работает только на локалхосте. Каким боком он тут вообще?

>> No.181154  

>>181145

Нету разницы. Просто прописываешь удаленные хосты в инвентарь.

>> No.181155  

>>181154

> Просто прописываешь удаленные хосты в инвентарь.

Как сделать чтобы они туда прописывались при обращении к файлу?

>> No.181156  

>>181141
Тоже решительно не понимаю при чем тут Ansible, но вместо него советую pyinfra (https://pyinfra.com/).

Для SSH всем советую включить мультиплексировние в ~/.ssh/config (предварительно сделайте mkdir -p ~/.ssh/sockets):

Host *

      ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 600

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

>> No.181157  

>>181156

> но вместо него советую pyinfra (https://pyinfra.com/)

Пробежал по документации, но не нашел там упоминания как эту штуку куда-либо смонтировать.

>> No.181158  

>>181156
>>181157

> не понимаю при чем тут Ansible
> смонтировать

ansible/pyinfra позволяет выполнять операции на группах удаленных хостов, например читать с них файлы и делать diffы

>> No.181159  

>>181158
Но мне нужен прямой доступ к файлам удаленных хостов а не операции на удаленных хостах.

>> No.181190  

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

>> No.181195  

>>181190
Говорить об управлении памятью в отрыве от языка так себе идея. С конкретным языком можно почитать в оф доках или гайдах по языку.

>> No.181225  
Файл: 1602658766181.png -(1202 KB, 1280x720, 1602658766181.png)
1202

>>181190
А какие вообще бывают? GC, RAII, ARC (тоже RAII, только в компайл-тайме) и руками. Дальше ищи про поколения в GC и разные виды аллокаторов.

>> No.181561  

>>181225
Посоветуй книжку, если разбираешся.

>> No.181564  

https://www.memorymanagement.org/

>> No.182424  

>>181564
Спасибо, интересная ссылка, но похоже материалы там достаточно старые, и например много интересных в этих вопросах языков не рассмотренно, например D, Go и Rust не рассмотренны.

>> No.184270  
| Пастебин    |  Лицензия | На чём написан |
| bsd.ac | ISC | C++ |
| sprunge.us | WTFPL | Python |
| termbin.com | MIT | C |
>> No.184554  

https://why-vi.rocks/

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

:w !sudo tee %

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

:%!fmt -s -w 72

Также на этом сайте описана интеграция с tmux(1)

>> No.184830  

>>174285
Здесь есть целая коллекция сценарий практически на любой случай жизни.
https://github.com/LukeSmithxyz/voidrice/tree/master/.local/bin

Если нужно что-то новое, то первым делом иду туда, вдруг уже всё написано :-)

>> No.184832  

>>184554

> :%!fmt -s -w 72

А в vim это просто gv

>> No.184835  

>>184830

Ну не знаю, не очень понятно зачем нужен скрипт compiler, когда можно
просто написать Makefile.

>> No.184836  

>>184832

>А в vim это просто gv

http://vimdoc.sourceforge.net/htmldoc/visual.html#gv

Я не понял как, объясни пожалуйста.

>> No.184842  

>>184836
Опечаточка вышла, gq на самом деле.

>> No.184932  

>>184842

Ну вот да, это больше похоже. Хотя я всё ещё не понял, что надо
набрать, чтобы получить форматирование под 72 символа на строку твоим
способом.

>> No.184942  

>>184932

:set textwidth=72
V

выделяешь нужный кусок текста

gq
>> No.184944  

>>184942

Спасибо

>> No.185055  

Такой артефакт нашёл:
http://scripts.dragon-it.co.uk/

>> No.185117  
Файл: 1610119932254.png -(55 KB, 746x555, 1610119932254.png)
55
>> No.185120  

>>185055
>>185117

Главное чтобы жизнь облегчало

>> No.185180  

А что, куклоскрипт уже и скачать негде? Пишет, будто сайт заблокирован.

>> No.185181  

>>185180
Скачай с гитхаба.

>> No.185184  

>>185181

>Невозможно установить расширение с этого сайта

Значит, не судьба.

>> No.185185  

>>185184
Скачай в виде юзерскрипта.

>> No.185190  
Файл: 1610223864333.png -(127 KB, 471x512, 1610223864333.png)
127

>>185180
УМВР

Поставь софт облегчающий жизнь, а именно клиент wireguard[0].
Соотвественно можешь купить vps в для того, чтобы там настроить по
инструкции[1]. Либо можешь сразу в мануалы системы залезть, если там
подробно написано как wg интерфейс создать. Можешь покупать на vultr
или hetzner, главное, чтобы сервер был не в РФ, если ты собираешься
обходить блокировки сайта в РФ.

Не можешь или не хочешь настраивать сам ? Плати Найди тех,
кто за тебя сделал[2] и доверяй им.

>>185184

>>Невозможно установить расширение с сайта
>Значит не судьба

Не в обиду тебе, но это ламерское мышление.

[0]: https://www.wireguard.com/install/
[1]: https://www.wireguard.com/quickstart/
[2]: https://kitsune.su/configurations

P.S: Лучше бы вы не у себя устанавливали джаваскрипт, с содержимом вам
неизвестным, а поучили бы перл немного, создали тред в /d и присылали
туда патчи для вакабы версии 3.0.7

>> No.185192  

>>185190
Лучше всего вы бы у себя устанавливали джаваскрипт, с содержимым вам известным.
Да.

>> No.185195  

>>185190

> Лучше бы вы не у себя устанавливали джаваскрипт, с содержимом вам
> неизвестным, а поучили бы перл немного, создали тред в /d и присылали
> туда патчи для вакабы версии 3.0.7

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

>> No.185205  

>>185190
Звучит сложно, не нужно и с подозрительными ссылками, две из которых не позволяют установить соединение, а третья с какими-то QR-кодами, которые не очень хочется трогать.
Хотел установить куклу, потому что все расхваливт, что удобно. А там еще мудохаться надо с чем-то непонятным и неизвестно безопасным ли. Жил без нее и еще проживу.

>> No.185211  

>>185205

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

А ты звучишь, как идиот.
Первые две ссылки на официальный сайт протокола wireguard,
а последния с конфигами для vpn клиента wireguard,
конфиги в виде qr кода, чтобы тебе,
не пришлось вводить текст конфига и публичных ключей в нём.

>> No.185212  

>>185211

>А ты звучишь, как идиот.

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

>Первые две ссылки на официальный сайт протокола wireguard, а последния с конфигами для vpn клиента wireguard

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

>> No.185213  

>>185195

Я скорее про то, что отдельный нужный функционал можно при желание и
знание перла запилить
1) Самому
2) На всю борду
3) Без лишнего джаваскрипта в браузере, который тут у многих отключен

Тред про куклоскрипт уже был https://nowere.net/b/res/180278.html

>> No.185214  

>>185212

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

>> No.185215  

>>185212
Может прочитать его пост и посмотреть по ссылкам, а не плеваться кислотой?

>> No.185216  

>>185215
Зачем, если я вам доходчиво сказал, что не хочу. Я же не обзывал вас или что-то в этом духе, не надо мне навязываться.

>> No.185220  

>>185216

>Навязываться

Именно ты пришёл в тред посвящённый софту облегчающему жизнь и написал о своём неосиляторстве:
1) Отрытия заблокированных сайтов
2) Установки юзерскриптов
3) Чтения документации с гитхаба
4) Чтения сайта о wireguard
Это всё оффтоп.

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

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

То что ты чего-то хочешь или не хочешь, считаешь нужным или ненужным также оффтоп.

>> No.185443  
awk 'BEGIN{srand()}{for (i=1;i<=length;i++) {c=substr($0, i, 1);printf("%c", rand()<0.5?toupper(c):tolower(c));}print ""}'

Отсюда: https://twitter.com/gumnos/status/1268525177677262848
Только не копируйте не понятный вам код в командную строку

>> No.185444  

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

>> No.185453  

>>185444
mpd?

>> No.185463  

>>185453

Спасибо!

Вообще я не хотел, но у него boost только в BUILD DEPENDS:
https://openports.pl/path/audio/mpd

Так что ладно, наверное им я и буду музыку слушать, если вдруг не порт mus:
https://git.sr.ht/~q3cpma/mus

Кстати заходите на sourcehut.org мне кажется там много интересного, его тот же человек делает, что за sway и wlroots раньше[1] был ответственнен.

[1]: https://drewdevault.com/2020/10/23/Im-handing-wlroots-and-sway-to-Simon.html

>> No.185464  

>>185463
Еще можешь mpv попробовать, он правда больше под видео заточен, но как музыкальным плеером я им тоже пользуюсь.

>> No.185465  

Ну и раз уже я поднял тред, я недавно написал небольшой скрипт для xterm:

#!/bin/sh
echo -n "\033]0;$@\007"

Позволяет поставить заголовок для окон xterm, просто сделав xterm-name example_name. Это нужно для того, чтобы выбирать нужный терминал из списка окон, каким-нибудь dmenu или с помощью уже включённой в состав оконного менеджера менюшки в моём случае. Более того, можно поставить в заголовок вывод команды, например xterm-name $(hostname).
Ограничения в том, что для окон с tmux это не работает и tmux надо сначала отсоеденить, а потом снова подсоеденить к терминалу (tmux detach и tmux attach).
Судя по доке с tldp должно работать и с {u}rxvt.

>> No.185470  

>>185465
Твой скрипт работает только в определённой реализации /bin/sh. `printf "\033]0;%s\007" "$*"` работает везде и везде одинаково.

>> No.185476  

>>185470
Разве echo это не внешняя программа?

>> No.185481  

>>185476
Почти все шеллы имеют echo как встроенную команду. /bin/echo существует на всякий случай.

>> No.185482  

>>185481
Но ведь получается что если у шелла нету встроенного echo то он просто фолбекнется на внешний, но скрипт все равно будет работать.

>> No.185483  

>>185482
Не, не будет. Попробуй его в bash запустить. На некоторых системах /bin/sh это /bin/bash. А вот printf работает как положено на любой POSIX-совместимой системе.

>> No.185484  

>>185483
В bash работает, за исключением того момента что автор забыл ключ -e добавить.

>> No.185485  
#!/bin/sh 
printf "\033]0;$@\007"

>>185465

Спасибо, я поменял, но я не понял, почему именно так:

printf "\033]0;%s\007" "$*"

>>185483

Ну, у меня ksh, да. Но судя по мануалу, ты прав

https://man.openbsd.org/echo.1#STANDARDS

>>185484

Автор c tldp это взял, там такого ключа не было
https://tldp.org/HOWTO/Xterm-Title-3.html

>>185481
Иногда /bin/echo может быть тем же исполняемым файлом, что и /bin/sh
Можете меня поправить, но у меня так минимум с тремя системными утилитами

SHA1 (/bin/tar) = cf5ce0343f6c62b3637d9c7b8329f58d58ec5bb6
SHA1 (/bin/pax) = cf5ce0343f6c62b3637d9c7b8329f58d58ec5bb6
SHA1 (/bin/cpio) = cf5ce0343f6c62b3637d9c7b8329f58d58ec5bb6

Ведь они могут узнать своё имя просто из нулевого аргумента, а остальные опции парсить в соответствии с именем

>> No.185486  
Файл: 1610976229980.jpg -(107 KB, 720x960, 1610976229980.jpg)
107

>>185485

> Иногда /bin/echo может быть тем же исполняемым файлом, что и /bin/sh

На этом поприще заметно выделяется busybox, куда таких утилит засунули несколько сотен. Зато с ним удобно initrd собирать.

>> No.185524  

Новерь, посоветуй Джаббер–сервер, да и клиент. На данный момент я использую xmpp.jp и клиент Psi+, но тут стала появляться проблема, что многие сообщение просто не доходят до собеседника, что их нужно повторно отправлять.

Либо его аналоги какие–нибудь. Но только не "Телеграмм"!

>> No.185525  

>>185524

> многие сообщение просто не доходят до собеседника, что их нужно повторно отправлять

Вроде со многими s2s так.

>> No.185527  

>>185524
Не смотрел в сторону tox?

>> No.185551  

>>185485

> Спасибо, я поменял, но я не понял, почему именно так

"\033]0;$@\007" превращается в "\033]0;$1" "$2" "$3\007". "\033]0;$*\007" превращается в "\033]0;$1 $2 $3\007". Если оставить "$@", то xterm-name hello world как положено работать не будет.

printf "\033]0;%s\007" "$*" нужно потому, что без этого не работает xterm-name '%: n\a'.

>> No.185558  

>>185525

> Вроде со многими s2s так.

Ох…

>>185527
Хорошо, не знал про него. Только его функционал мне кажется избыточным.

>> No.185562  

>>185558

> Только его функционал мне кажется избыточным.

Но ведь никто не заставляет весь этот функционал использовать.

>> No.185566  

>>185551

Поправил. Теперь, будем думать, как его с тмуксом совместить.

>> No.185574  

Rss читалка конечно облегчат жизнь, но как у неё с язвимостями типа:
Billion laughs attack
quadratic blowup entity expansion
и другим, которые связаны со слабостями xml парсера ?

Может кто-то кроме меня пользуется ?

>> No.185607  
Файл: 1611249958302.png -(509 KB, 1366x768, 1611249958302.png)
509

>>185453

Извините, я не cмог удержаться и поставил winamp audacious. Всё из-за внешнего вида.
Вот отсюда скины можно брать:
https://skins.webamp.org/
Вот здесь как их легко включить:
https://wiki.archlinux.org/index.php/Audacious#Winamp

Прилагаю иллюстрацию для того, чтобы вам удостоверить, что всё работает.

>> No.185676  

>>185607
Впервые встречаю реального человека, который слушает Mass of the Fermenting Dregs. Как хорошо не быть уникальным. Cmus в качестве аудиоплеера не пробовал?

>> No.185715  

>>185524
Gajim/Conversations/Siskin в зависимости от платформы и Prosody, . Не хочешь свой собственный поднять? Я запилил и включил все, что захотел, могу помочь с настройкой. По поводу недоставленных сообщений, вы оба на xmpp.js находитесь? У него XEP для отложенной доставки включены, от собеседника к тебе все доходит?

>>185525
Наоборот, сервера для того и нужны, чтобы не спать 24/7 и мониторить коммуникации, обычно p2p этм страдают.

>>185527
Tox только усилит проблему доставки, ох и натерпелся я с ним в свое время. Хотя, вроде, весьма кривая отправка после появления собеседника в сети была года 3-4 назад, забыл уже. И аудиозвонки, которые в XMPP только один клиент под андроид нормально начал поддерживать с прошлого года, хотя расширение, описывающее их, довольно старое.

А так XMPP — лучшее по сумме характеристик, что было придумано. Весьма удобно, а для шифропанков завезли Tor и OMEMO. Из децентрализованных пробовал Tox и Ring/Jami и у обоих доставка сообщений весьма криво работает. Есть еще Matrix, но он в текущем состоянии — жуткое дерьмо, у которого сервер СЕРВЕР, КАРЛ написан на питоне, а официальный клиент — на электроне, судя по всему, сейчас главная цель у создателей инвестиции попилить, а на качество забили хер. Хочешь зайти в большую группу — виснет на минуту и в состоянии покоя жрет 600Мб оперативки, не рекомендую.

>> No.185716  

>>185715
О как, слово лол тут трется при отправке?

>> No.185718  

>>185715

> Наоборот, сервера для того и нужны, чтобы не спать 24/7 и мониторить коммуникации, обычно p2p этм страдают.

Я когда-то держал свой jabber сервер и там сообщения на другие сервера терялись с завидной регулярностью, хотя с самим сервером никаких проблем не было. Внутри все ходило как часы. Сейчас вот как раз на tox и перелез, он значительно реже по тихому сливает сообщения в /dev/null.
>>185716
лол

>> No.185721  

>>185718

>на другие сервера

Можешь по https://compliance.conversations.im их проверить, хотя ты про него, наверное, знаешь. В этом и проблема, я все контакты на своем регистрирую. В первое время не настроил SSL нормально, с других серверов даже подключиться не могли, не сразу понял, в чем дело.
Только им пользуешься? Я укатился отовсюду, использовал Tox параллельно с телеграмом и потом пока искал ему замену, рад, что на самохостинг перешел.

Да, в конце зачеркивания лол написал, а он съелся почему-то вместе с форматированием.

>> No.185723  

>>185721

> Можешь по https://compliance.conversations.im их проверить, хотя ты про него, наверное, знаешь.

Это давно было, с тех пор многое поменялось.

> Только им пользуешься?

Как основным im.

> Да, в конце зачеркивания лол написал, а он съелся почему-то вместе с форматированием.

странно&# лол

>> No.185725  

>>185715

> вы оба на xmpp.js находитесь?

Нет.

>> No.185732  

>>185676
CMUS пробовал о чём выше и написал. Мне не хватило в нём
• Возможности запустить его как демон, типа mpd. Без этого я не особо вижу смысл в туи. Этого и в audacious нет, но там просто красиво
• Возможности поставить на автоматическое проигрывание весь альбом. В audacious это гораздо проще делается плейлистом. Я именно что дискографии слушаю.

>Как приятно не быть уникальным.

Так может я твоё отражение, как в ghost in the shell.

>>185715

>сервер на пайтоне

И что ? Про sanic или gunicorn не слышал ?

>клиент на электроне

Не воодушевляет, да, но это всё ещё самый кроссплатформенный и при этом удобный для них гуй
inb4: qt

>> No.185753  

>>185732
Слишком очевидно, но moc[p] пробовал?
Плейлисты есть, демон есть. Плеер минимальный. Максимум - назначение скриптов на Fn-клавиши.

c: fe

>> No.185764  

>>185725
В этом и проблема, попроси его переехать или написать админу, чтобы починил.

>>185732
Про sanic или gunicorn не слышал ?
Да лучше бы и не слышал. Nginx — наше все.

>qt

Ага, хотя и его питоном испоганить можно. Gajim использует биндинги под GTK, на старте 100-200Мб памяти съедает, жду порта Dino под винду.

>> No.185775  

>>185753

Благодарю. Собрали почти все аудиоплееры без графического интерфейса, хех. Однако я не особо вижу смысла в запускаемом в терминале демоне для проигрывания музыке, если я буду слушать его только с одного устройство. Кроме самого ноутбука где я могу этот демон запустить и сервера в облаке с менее чем 50G, есть ещё шестой iPhone, но я не уверен, что на такую закрытую платформу завезли плеер, который будет работать по совместимуму с демоном протоколу.

>>185764

>на старте 100-200Мб памяти съедает

Если вас смущает прожористость пайтона, то хочу вас заверить, что на нём можно писать не тратя так много памяти. Для начала используя tuple вместо list где это возможно.

Вот видео по теме памяти в пайтоне с русского пайкона дветысячисемндацатого года
https://youtu.be/D0vbuIDOV4c

youtube-dl https://youtu.be/D0vbuIDOV4c

Можно конечно, сказать, что если писать на Си, то такого потребления не будет, но:
Во первых в Си гораздо проще забыть освободить память и нет уборщика мусора, который если что не нужный объект удалит.
Во вторых в Си гораздо проще засунуть выделение памяти в цикл.
Во третьих динамически выделяемая память в Си тоже не бесплатная. Хоть это стандартом совсем не оговорено, но malloc(0) аллоцирует совсем не ноль байт.

Не поймите меня неправильно, мне оба языка нравятся и на Си и на пайтоне я писал.

>> No.185776  

>>185775

> Для начала используя tuple вместо list где это возможно.

И 100500 подобных трюков для каждой используемой структуры данных для каждой из библиотек.

>> No.185777  

>>185776

>И 100500 подобных трюков для каждой используемой структуры данных для каждой из библиотек.

Изпользование одного итерируемого типа вместо другого для вас трюк ?

>> No.185780  
Файл: 1611454924390.png -(723 KB, 1280x720, 1611454924390.png)
723

>>185776
Все трюки питона чтобы работало лучше не идут ни в какое сравнение с количеством знаний, чтобы на плюсиках вообще работало

>> No.185781  

>>185777

Создать нормальный язык для вас трюк?

>> No.185782  

>>185780

Причем здесь c++? Есть же языки помимо этих двух.

>> No.185783  
Файл: 1611459318718.jpg -(33 KB, 500x373, 1611459318718.jpg)
33

>>185782
Остальные языки хуже.

>> No.185784  

>>185781

>Создать нормальный язык для вас трюк ?

Нет не трюк, почему же? Можно взять lex, yacc и сделать ещё одну версию awk, но, на мой скромный взгляд, просто написать () вместо [] в пайтоне проще.
А ваш loaded question уж очень похож на

>пи пи пу пу

Потому что пайтон и так нормальный язык, а новерь не торт и тупеет.

>> No.185788  

>>185775

> Для начала используя tuple вместо list где это возможно.

Разница будет заметна только если у тебя 100500 подобных объектов.

>> No.185790  

>>185784

> пайтон и так нормальный язык

То есть в твоем представлении нормально не уметь в лексикоскопию?

>> No.185791  

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

>> No.185792  

>>185783

ССЗБ

>> No.185793  
Файл: 1611483867069.png -(713 KB, 1000x710, 1611483867069.png)
713

>>185791

> Если запросов много, то уборщик мусора будет тормозить.

Ну вообще если не устраивают дефолтные параметры то он там настраивается. Или даже дергается вручную при необходимости.

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

Эта проблема отлично решается дедупликатором памяти.

>> No.185794  

>>185793

> дедупликатором памяти

костыль

>> No.185795  

>>185793

> Ну вообще если не устраивают дефолтные параметры то он там настраивается. Или даже дергается вручную при необходимости.

Можно вообще отключить. И переписать на cython.

>> No.185796  
Файл: 1611484877135.png -(1867 KB, 888x1200, 1611484877135.png)
1867

>>185794
Он создан как раз для решения подобных проблем и не только в питоне. И вообще запуск нескольких инстансов одного приложения - весьма распространенная штука, вплоть до того, что обработка входящих соединений через fork() является классикой.

>> No.185797  

>>185796

> запуск нескольких инстансов одного приложения - весьма распространенная штука

Ага, как и хранение состояния во внешней базе данных.

>> No.185833  
>firefox --kiosk

O
Файафокс только со скрытым адресс баром и табами.
Нашёл когда искал как запустить firefox с определённым профилем, для i2p.

>> No.185834  

https://staff.aist.go.jp/t.nakano/VocaListener/

>> No.185836  

>>185833
Если сделать себе .desktop файл с таким файафоксом и выставить в качестве домашней страницы веб-приложение, то чем бы это отличалось от этих всех web-to-desktop приложений на электроне?

>> No.185838  
Файл: 1611576674771.jpg -(615 KB, 925x1302, 1611576674771.jpg)
615

>>185836

> чем бы это отличалось от этих всех web-to-desktop приложений на электроне?

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

>> No.185853  

Уцухо, как тебе ?

https://github.com/Antynea/grub-btrfs

>> No.185854  
Файл: 1611599982941.png -(4113 KB, 2480x2480, 1611599982941.png)
4113

>>185853
Выглядит как скрипт автоматической перегенерации конфига grub при создании снапшота. Возможно некоторым пользователям арча зайдет.

>> No.186091  

>>180470
Ты можешь со своими боtнетами писать на васме, а не тут? Мне нужно чтобы новерь работал, а в соседнем треде кгб понтуется cорм-ом и рекомендует не генерировать много лукового трафика.

>> No.186098  

>>186091
Ботнеты обычно не по ssh управляются, если что.

>> No.186103  

>>186098
Некоторые по ssh, не надо.

>> No.186232  

Мне было лень разбираться с projectile и иже с ним, поэтому у меня теперь есть менеджер сессий для Emacs из двух функций на елиспе и pipemenu под Openbox. Код не ахти, конечно. Его составные части уже лежали здесь.

Вот это суём в .emacs:

(defun write-sexp-into-file (filename sexp)
(let* ((bfr (find-file-noselect filename)))
(with-current-buffer bfr
(erase-buffer)
(print sexp bfr)
(save-buffer 0))
(kill-buffer bfr)))
(defun read-sexp-from-file (filename)
(let* ((bfr (find-file-noselect filename))
(sexp (read bfr)))
(kill-buffer bfr)
sexp))
(ignore-errors (mkdir (concat (getenv "HOME") "/.esessions")))
(defun save-session (where)
(interactive "sWhere")
(let ((all-files (mapcar #'buffer-file-name
(cl-remove-if-not #'buffer-file-name
(buffer-list))))
(dest (concat (getenv "HOME") "/.esessions/" where)))
(write-sexp-into-file dest all-files)))
(defun restore-session (where)
(interactive "sWhere")
(let ((all-files (read-sexp-from-file
(concat (getenv "HOME") "/.esessions/" where))))
(mapc #'find-file all-files)))

Вот это суём в файлик (у меня ~/bin/esessions.scm) и делаем chmod +x:

#!/usr/bin/guile
!#
(import (sxml simple))
(define *esessions* (string-append (getenv "HOME") "/" ".esessions"))

(define (listdir dirname)
(let loop ((dir-stream (opendir dirname)) (acc '()))
(let ((current-item (readdir dir-stream)))
(cond ((eof-object? current-item) (closedir dir-stream) acc)
((or (string=? current-item "..") (string=? current-item "."))
(loop dir-stream acc))
(else (loop dir-stream (cons current-item acc)))))))

(define (wrap-execute label exec)
`(item (@(label ,label))
(action (@(name execute))
(execute ,exec))))

(define (wrap-items items)
(sxml->xml `((openbox_pipe_menu ,@items))))

(define (execute ssn)
(string-append "emacs --eval '"
(with-output-to-string (lambda ()
(write `(restore-session ,ssn))))
"'"))

(define (generate-sessions)
(let* ((sessions (listdir *esessions*))
(items (map (lambda (ssn) (wrap-execute ssn (execute ssn)))
sessions)))
(wrap-items items)))

(generate-sessions)

Ну и pipemenu для openbox, menu.xml:

<menu execute="/home/$USER/bin/esessions.scm" id="esessions-menu" label="emacs..."></menu>
>> No.186233  

>>186232
Подправлю на случай, если каталога нет:

(define (generate-sessions)
(let* ((sessions (if (access? *esessions* F_OK)
(listdir *esessions*) '()))
(items (map (lambda (ssn) (wrap-execute ssn (execute ssn)))
sessions)))
(wrap-items items)))
>> No.186243  

>>186232

>pipemenu под Openbox

А оно совместимо с каким-нибудь dmenu или rofi?
Ну и кстати есть же несколько wm с конфигами на лиспе, почему коробка с xml ?

>> No.186245  
>А оно совместимо с каким-нибудь dmenu или rofi?

Смотря что ты имеешь в виду. Pipemenu от openbox как концепт, разумеется, несовместимо. Конкретно мой юзкейс сейчас совместим, небольшая идея под его развитие (открытие отдельных файлов или подсессии, что не особо-то и нужно), скорее всего, сделает dmenu не настолько удобным.

>Ну и кстати есть же несколько wm с конфигами на лиспе, почему коробка с xml?

Зависимость есть. Сам CL мне не удосужилось пощупать, считаю его не таким красивым, как scheme, но хочу всё-таки как-нибудь использовать его для одной небольшой (насколько небольшим может быть SBCL или ECL, если у меня получится перейти на него) кроссплатформенной программы. И sxml в CL не пользуются. А на scheme особо WM нет, а те, что есть, гордо заявляют, что они недоделки. Поэтому из других WM я пользуюсь парочкой не особо конфигурируемых и написанных на C, ведь я считаю себя ещё слишком маленьким для того, чтобы копаться в коде WM.

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

Если есть, что предложить из WM на лиспе, не стесняйся, предлагай.

>> No.186248  

>>186245

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

Там просто Си и иксовые либы. Это всё в юзерспейсе, так что не страшно.
Вот тред по сям https://nowere.net/b/res/183736.html
через некоторое время туда кроме рекомендации очевидного K&R2 постараюсь закинуть ссылку на новую книжку от человека из комитета стандартизации.
Мануалы по иксовым либам ищешь просто вводя

apropos -s 3 search_query

Вот в этом мануале написано какие иксовые либы для чего https://man.openbsd.org/XStandards.7
В некоторых мануалах будут ещё названия на тестов по теме, которые на самом сайте X.org лежат в формате pdf.
Есть wm, на 50 строчек кода, который можно использовать, чтобы что-то своё поверх писать:
http://incise.org/tinywm.html

>Смотря что ты имеешь в виду.

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

file $(ls -1 | dmenu)
>> No.186249  

Да, попрошу прощения не сами либы конечно, а заголовочные файлы, вот здесь https://man.openbsd.org/XStandards.7#INCLUDE_FILES

>> No.186254  

>>186248
Мной уже был написана под xcb (но не на Си, хотя k&r уже прочитан) парочка небольших, просто крошечных хелловорлдов, которые не относятся к WM.
Только для того, вот чтобы *самому* в одно лицо всё это сделать, недостаточно *просто* прочитать k&r и маны. Если человек это делает с нуля в конечном итоге для лиспа (да без разницы на самом деле, для любого языка, для которого нужен FFI), ему придётся понять FFI (и практику программирования, ага, опыт делается с программ поменьше), сделать так, чтобы его код действительно работал, закрыть особые случаи, сделать так, чтобы его работу приняли другие и не наплевали на него, а помимо всего этого человеку надо успевать как-то жить. И как-то не забросить сомнительное упражнение без выхлопа и с потенциалом завязнуть на мелком вопросе надолго, погрузившись в пучину отчаяния.

Я глубоко сомневаюсь, что человек, не знающий Си (ты адресовал свой пост именно с таким представлением обо мне), сможет сразу, с ходу выучить всё это и начать нагромождать хаки на tinywm. По крайней мере мне, учитывая мой темп усвоения информации, это не осилить и сейчас, когда пару-четвёрку параллельных вызовов xcb для меня уже больно делать. Мне нужен опыт и опыт на чём-то поменьше, чтобы до конца освоить Си и не бояться шагать вперёд.

Практику получить, конечно же, хотелось бы.

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

Сама реализация pipemenu в Openbox умеет гораздо больше, это же не suckless, где самый настоящий минимум или близко к нему. Те же подменю на dmenu кладутся уже гораздо хуже. But hey, я могу жить и так. Другие люди, которые используют мой компьютер, правда, не смогут. Хотя им и не нужен емакс.

>> No.186258  

>>186254

>(ты адресовал свой пост именно с таким представлением обо мне)

Нет, честно, никак не представлял. Просто упомянул, что если что есть Си тред и можно там что-либо спрашивать. То что ты K&R2 прочитал это хорошо, но я примерно с тем же посылом, что мол рекомедация этой книги в треде вторым-третьим постом.

>Те же подменю на dmenu кладутся уже гораздо хуже.

Сыглы, для такого скорее 9menu. Хотя мне самому подмению не нужны.

>> No.186261  

Схороню здесь скрипты с 0chan/tech

>> No.186262  

Эвакуируем подкаталоги, максимально параллельно зашивая их в архивы:

DIR=~/data/; COMP=xz; MAXCOMPRESSORS=$(( `nproc` - 1 )); ls $DIR | (while read i; do  while [ "`ps aux | grep $COMP | wc -l`" -gt $MAXCOMPRESSORS ]; do sleep 60; done;  tar c "$DIR/$i" | COMP -9 > "$i.tar.$COMP" & done)

Если вызвать nbd-server строчкой nbd-server порт кого_экспортировать, он не запустится. Надо добавить пустой конфиг: nbd-server порт кого -C ""

Аналогично этому скрипту ждём освобождения от большого количества заспавненных процессов по цифре system load:

LOAD_THRESHOLD=50; SLEEP_INTERVAL=5; while [ `uptime | grep -o "age: [0-9]*" | cut -c 6-` -gt $LOAD_THRESHOLD ]; do sleep $SLEEP_INTERVAL; done;
>> No.186263  

pamdice — slice a Netpbm image into many horizontally and/or vertically.
pamslice -outstem=filenamestem [-width=width] [-height=height] [-verbose] [filename]

netpbm — это формат относительно удобочитаемых битмапов, во второй строке которых явно указан текстом размер. Ещё netpbm-картинки определённых форматов (P1,P2,P3 — текстовые форматы, P4,P5,P6 — собственно битмапы) удобно редактировать в текстовом редакторе, их можно генерировать/обрабатывать прямо в шелле.

Вот эта программа pamdice режет netpbm-картинки на несколько. Очень удобно, если надо распечатать что-то панорамное. Ничего подобного для других форматов и из редакторов найти не удалось.

Outstem — это префикс имени файла, после него идут четыре цифры и фаел приоберает вид:
фаел_00_00.p?m. Можно делать бомж-квадратную панораму и хоть сейчас вешать на стену, скрепив соплями. Даёшь фотообои с Номадом в каждый дом!

>> No.186264  

Попал на монгодб и не знаешь, куда нажать? Выполни это:

db.getMongo().getDBs()["databases"].forEach(function(e){eval(e.name + "=db.getMongo().getDB(\"" + e.name+ "\");");print("db " + e.name + " consists of:" + eval(e.name).getCollectionNames().map(function(ee){col=eval(e.name + "[\'"  + ee +"\']"); return ee + "(" + function(){try{ret=(col.exists()?col.count():"n/e")}catch(exn){ret="n/a"}return ret}() +")"}).join(" "))})

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

>> No.186265  

Как править слетевшую кодировку с помощью iconv.

iconv -t кодировка-в-какой-прочиталось | iconv -f кодировка-в-какой-было

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

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

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

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

(while :; do read line; echo $line | iconv -f cp1251; done)<было >стало

или так

split -l 1000 --filter="iconv -f cp1251"
>> No.186266  

Делаем примитивный call/dependency graph для скриптов на питоне.

Схороняем скрипт и называем его rip.awk:

function chop_filename(str){
match(str, "/([^/]+)$", chopped);
return chopped[1];
}

function qprint(what){
print "\""what"\"";
}

function qprint2(fst, snd){
print("\""fst"\" -> \""snd"\"");
}

function seek_prev(indent)
{
for (unwind = stackptr - 1; unwind >=0 ; unwind--)
{
if (stack[unwind][0] < indent)
return unwind;
}
return 0;
}

BEGIN {MODE="print";#graph or print
COLOR="y";
COLOR_STEP=0.91/((ARGC >= 2)?ARGC:2);
HUE=-COLOR_STEP;
DEBUG="";
if (ENVIRON["NAMES"]) {MODE="graph"; CHECK=ENVIRON["NAMES"];};
if (MODE=="graph") print "digraph \"g\" {";}

END { if (MODE=="graph") print "}";}

(FNR==1) {
filename = chop_filename(FILENAME);
HUE+=COLOR_STEP;
if (MODE=="graph")
{
qprint(filename);
if (COLOR) print "[color=\""HUE" 0.5 0.5\"]";
stack[0][0] = -1;
stack[0][1] = filename;
stackptr = 1;
}
else
{
print(filename);
}
}

(match ($0, "^(\\s*)(class|def)\\s+([a-zA-Z0-9_]+)", arr) > 0) {
name = arr[3];
if (MODE == "print")
{
print name;
next;
}
indent = length(arr[1]);
qprint(name);
if (COLOR) print "[color=\""HUE" 1 0.7\"]";

prev_pos = seek_prev(indent);
qprint2(stack[prev_pos][1], name);
if (COLOR) print "[color=\""HUE" 0.7 0.7\"]";
stackptr = prev_pos + 1;

stack[stackptr][0] = indent;
stack[stackptr][1] = name;
stackptr += 1;
}

($0 !~ "^\\s*$") && (match ($0, "^(\\s*)(class|def)\\s+([a-zA-Z0-9_]+)", arr) == 0){
if (MODE == "print") next;
match($0, "^(\\s*)");
prev_block_margin = stack[stackptr - 1][0]; # what to do?
if (DEBUG) print ("prev", prev_block_margin, "now", RLENGTH);
if (RLENGTH <= prev_block_margin)
{
if (DEBUG) print "seeking back";
if (DEBUG) print FILENAME, $0;
prev_pos = seek_prev(RLENGTH);
stackptr = prev_pos + 1;
}
else
{
prev_pos = stackptr - 1;
}
while (getline ck_name < ENVIRON["NAMES"])
{
if ($0 ~ ck_name"\\s*\\(") # Is RE good enough?
{
qprint2(stack[prev_pos][1], ck_name);
}
}
close(ENVIRON["NAMES"]);
}

Скрипт написан под gawk.

Используем в два этапа:

find code_base/ -name "*.py" | xargs -I {} awk -f rip.awk {} | sort | uniq > code_base_names
find code_base/ -name "*.py" | NAMES=code_base_names xargs awk -f rip.awk > code_base_graph.dot

Просматриваем code_base_graph.dot с помощью программы dotty, параметры графа, узлов и рёбер меняем с помощью программы gvpr, печатаем с помощью dot -Tформат граф > вывод , например: dot -Ppng code_base_graph > code_base_graph.png. Все программы из пакета graphviz.

>> No.186267  

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

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

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

XPRA_DISP=:7
AS_USER=nullcat
sudo -iu $AS_USER LANG=ru_RU.UTF-8 xpra start --mdns=no --bell=no --webcam=no --socket-dir=/home/$AS_USER/.xpra/ --pulseaudio=no $XPRA_DISP &
while :; do if sudo -iu $AS_USER xpra list --socket-dir=/home/$AS_USER/.xpra/ | grep -q "LIVE session at $XPRA_DISP"; then break; sleep 1; fi; done
sudo -iu $AS_USER LANG=ru_RU.UTF-8 DISPLAY=$XPRA_DISP приложение &

Залогинились, запускаем xpra attach :7 --socket-dir=/home/nullcat/.xpra/ и видим окошки.

>> No.186268  

Присасываемся к чужому X-серверу по ssh, проброс X наоборот.

cookie=`ssh user@host 'xauth list | grep unix:0 | cut -f 5 -d" "'`
ssh user@host -L /tmp/.X11-unix/X1:/tmp/.X11-unix/X0 -N &
xauth add :1 . $cookie

После чего запускаем приложения c DISPLAY=:1 и видим, что они поднялись на другом X-сервере.

>> No.186269  

Ещё есть такая интересная штука, как broadway, но работает она только с gtk-приложениями. Из себя представляет веб-сервер, который может хостить приложения на GTK. Например, transmission-gtk, переложенная на broadway, дает гораздо больше опций, чем её веб-интерфейс.

In a nutshell:
broadwayd --address 127.0.0.1 --port 8081 :1
GDK_BACKEND=broadway BROADWAY_DISPLAY=:1 gedit

Открываем браузер на 127.0.0.1:8081 и видим там gedit.

>> No.186270  
(require 'cl)
(ignore-errors (mkdir (concat (getenv "HOME") "/.esessions")))

(defun write-sexp-into-file (filename sexp)
(let* ((bfr (find-file-noselect filename)))
(with-current-buffer bfr
(erase-buffer)
(print sexp bfr)
(save-buffer 0))
(kill-buffer bfr)))
(defun read-sexp-from-file (filename)
(let* ((bfr (find-file-noselect filename))
(sexp (read bfr)))
(kill-buffer bfr)
sexp))

(defun save-session (where)
(interactive "sWhere")
(let ((all-files (mapcar #'buffer-file-name
(cl-remove-if-not #'buffer-file-name
(buffer-list))))
(dest (concat (getenv "HOME") "/.esessions/" where)))
(write-sexp-into-file dest all-files)))
(defun restore-session (where)
(interactive "sWhere")
(let ((all-files (read-sexp-from-file
(concat (getenv "HOME") "/.esessions/" where))))
(mapc #'find-file all-files)))

Простенькие сессии для emacs. Сувать в ~/.emacs , вызывать на M-x save-session и M-x restore-session.

>> No.186273  

Скачивание изображений с https://github.com/klkvsk/0chan на python

#!/usr/bin/env python3
from requests import get
from sys import argv, exit
from os.path import getsize

def get_images(thread):
for attachment in get_attachments(thread):
if 'images' in attachment.keys():
i = attachment['images']['original']
yield (i['name'], proto + i['url'], float(i['size_kb']))


def get_attachments(thread):
for post in thread['posts']:
if 'attachments' in post.keys():
for a in post['attachments']:
yield a


try:
proto, _, domain, board, thread = argv[1].split('/')
except (IndexError, ValueError):
print('Usage: {} thread_url'.format(*argv))
exit(1)

thread = get('{}//{}/api/thread?thread={}'.format(proto, domain, thread)).json()
for filename, image_url, size_kb in get_images(thread):
if not filename.replace('.', 'a').isalnum():
print("invalid filename: ", filename)
continue

headers = {}
try:
found_size = getsize(filename)
except FileNotFoundError:
pass
else:
if found_size >= (size_kb - 1) * 1024:
continue
headers['Range'] = "bytes={}-".format(found_size)

r = get(image_url, stream=True, headers=headers)
if r.status_code == 200:
print('saving new image to file:', filename, end=' ', flush=True)
mode = 'wb'
elif r.status_code == 206:
print('resuming download of file:', filename, end=' ', flush=True)
mode = 'ab'
else:
print('error downloading image {}: {}'.format(image_url, r.status_code))
continue

with open(filename, mode) as f:
for chunk in r:
f.write(chunk)
print("\b\b\b\b{:>3}%".format(int(f.tell()/(size_kb*1024)*100)), end='', flush=True)
print('\b\b\b\bdone')
>> No.186274  

Скачивание изображений с https://github.com/klkvsk/0chan на bourne shell

#!/usr/bin/env zsh
setopt nullglob
thread_url=( ${(s:/:)1} ) # split first argument into array by slashes:
# http nullchan7msxi257.onion b 60985
if ! ((thread_url[4])) || [[ $thread_url[1] =~ ^https?$ ]]; then
echo "Usage: $0 http://thread_url"
exit 1
fi
echo "Fetching thread..."
curl "${thread_url[1]}//${thread_url[2]}/api/thread?thread=${thread_url[4]}" \
| jq -r '.posts[].attachments[].images["thumb_200px", "original"] | "\(.name) \(.url) \(.size_kb|floor)"' \
| while read name url size_kb; do
[[ name =~ ^[a-z0-9.]+$ ]] || continue
[ -z $name(Lk+$size_kb) ] || continue
echo "Downloading $name (${size_kb}kb)..."
curl -\# -C- -o $name "${thread_url[1]}$url"
done
>> No.186276  

nbd-client не умеет в старый протокол NBD, а qemu-nbd умеет.
Только для qemu-nbd стоит не забыть отключить кэш, иначе сначала приятно удивит скорость, а потом приятно удивят неотзывчивость и потерянные данные.

nbdkit же умеет всем этим делом заправлять и по ssh, и по http, и через что напишешь. Хоть в инстаграме QR-кодами образы пили.

>> No.186275  

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

Качалка с mangachan и прочих — https://pastebin.com/6ZR9hkv7

Абстрактные UNIX-сокеты и обычные UNIX-сокеты живут в разных неймспейсах.
Это написано в man 7 network_namespaces:

> In addition, network namespaces isolate the UNIX domain abstract socket namespace.

Осталось понять, где живут обычные сокеты. Похоже, в mount namespace.

http://tilde.club/~pfhawkins/othertildes.html

Шелл-сервера.

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

https://shells.red-pill.eu

>> No.186279  
Файл: 1612633657101.png -(529 KB, 600x917, 1612633657101.png)
529

>>186265

> А теперь ловите одну интересную особенность iconv: он не умеет кодировать данные не целиком. Поэтому, если надо перекодировать огромный файл, его надо разделить.

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

>> No.186281  

>>186267

>Xpra — это, как говорят его же разработчики, аналог screen для X.

Лучше бы они description нормальный написали, по тому, что из написанного ниже напоминает Xnest или Xephyr

>>186265
Срыв покровов и ломающие новости. Если что есть ещё enca ей тоже можно кодировку менять и даже определять.

>>186274

>bourne shell
>#!/usr/bin/env zsh

Что-то мне подсказывает, что shellcheck тут покажет несколько варнингов.

>>186273
requests тут конечно оче нужен и стандартной библиотекой[1] не обойтись.

[1]: https://docs.python.org/3.8/library/urllib.request.html#urllib.request.Request

>>186266

А вот за это благодарю, я ещё люблю отдельную пайтоновскую функцию глянуть через

awk '/def func/' RS= module.py

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

#!/usr/bin/awk -f
BEGIN {
infile = "hosts";
outfile = "block.local"
while((getline blockedsite < infile) > 0 ){
gsub("0.0.0.0 ", "", blockedsite);
# \x22 is escape sequance for double quote in ascii
printf("local-zone: \x22%s\x22 refuse \n",\
blockedsite) > outfile;
}
close(infile);
close(outfile);
}

Ну и хреновина для смены раскладки
#!/usr/bin/awk -f

BEGIN {

    cmd_query = "setxkbmap -query | awk '/layout/{print $2}' ";
cmd_us = "setxkbmap us -variant colemak";
cmd_ru = "setxkbmap ru";
    cmd_query | getline layout;
close(cmd_query);
    if ("ru" == layout)
system(cmd_us);

if ("us" == layout)
system(cmd_ru);

}

все оттого, что сетхкбмап не понимает одновременно английскую раскладку с коулмак лэйаутом и обычную русскую.

>> No.186291  
Файл: 1612665336460.jpg -(1347 KB, 2880x1800, 1612665336460.jpg)
1347

Отпивает кофе.
>>186261
Кто ты такой и зачем ты решил напомнить мне мой скрипт в >>186270 сразу после того, как тут я запостила дополнение для него? Зачем ты преследуешь меня, раскапывая дела давно минувших дней на дне океана?

>> No.186358  

>>186091
Как у них там дела, в соседнем треде?

>> No.186399  

>>186279
Сообщения не мои
>>186281

>shellcheck тут покажет несколько варнингов

Диалект bourne shell
>>186291
Я хотел поделиться скриптами с других борд, там треды мертвы.
Я напомнил неспециально, не заметил новую версию.

>> No.186400  

Запускаем VPN через TOR в новом сетевом неймспейсе Linux.

#!/bin/sh
#chain tor -> socat proxy -> vpn in a separate network namespace

CONFIG=$1 #first argument

#a namespace file for use with namespace utilities
NAMESPACE=/tmp/nchain
#unix socket used for forwarding Tor connections from the namespace
USOCKS=/tmp/ntor

touch $NAMESPACE
sudo unshare --net=${NAMESPACE} true
sudo nsenter --net=${NAMESPACE} ifconfig lo up

#A hack for openvpn so it will replace the default route
#which is not present at the moment
#since the only network interface is lo (which is not listed in the routing table)
sudo nsenter --net=${NAMESPACE} ip route add 127.0.0.0/8 dev lo
sudo nsenter --net=${NAMESPACE} ip route add default via 127.0.0.9

#tor forwarder
socat UNIX-LISTEN:${USOCKS},fork TCP:127.0.0.1:9050 &
sudo nsenter --net=${NAMESPACE} sudo -u $USER socat TCP-LISTEN:9050,fork UNIX-CONNECT:${USOCKS} &
# now we have tor in that ns, add openvpn
# better use openvpn's --socks-proxy 127.0.0.1 9050

sudo nsenter --net=${NAMESPACE} openvpn --socks-proxy 127.0.0.1 9050 --config $CONFIG

#we can accumulate the socats' PID's and remove all the accumulated junk in here

#after that enter the namespace in a separate terminal with
#sudo nsenter --net=/tmp/nchain sudo $USER
#and run whatever you want to run
>> No.186401  

git+ssh через тор: часть отсюда https://stackoverflow.com/a/27343179
часть отсюда https://stackoverflow.com/a/37100346
Итого:

Host github-tor-alias
HostName github.com
IdentityFile ~/.ssh/tor_only_rsa
User git
ProxyCommand socat STDIO SOCKS4A:127.0.0.1:%h:%p,socksport=9050

И добавить remote repository вида ssh://git@github-tor-alias/<username>/<repository>.git

>> No.186402  

Как настроить тор если на компе только ipv6.
Добавить в /etc/tor/torrc:

ClientUseIPv4 0
ClientUseIPv6 1
ClientAutoIPv6ORPort 1
ClientPreferIPv6DirPort 1
ClientPreferIPv6ORPort 1
>> No.186403  

Все default keybindings readline (bash):

INPUTRC=~/dev/null bash -c 'bind -pm emacs'
>> No.186405  

Если есть: ipv4 only host1, ipv4+ipv6 host2, ipv6 only host3

и нужно с host1 зайти по ssh на host3, то:

host2 $ sudo socat TCP4-LISTEN:22000,fork,su=nobody TCP6:[<host3_ipv6>]
host1 $ ssh -N -L 22000:localhost:22000 user@<host2_ipv4>
host1 $ ssh -p 22000 localhost
>> No.186406  
Файл: 1612903363046.jpg -(252 KB, 800x676, 1612903363046.jpg)
252

>>186405
Зачем такие сложности, когда можно просто сделать так:

ssh -J host2 host3
>> No.186554  

>>185775

>Для начала используя tuple вместо list где это возможно.

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

>если писать на Си

Ну зачем сразу Си, Си решетка тоже весьма неплох, он где-то посередине. Пересел на него с джавы года 3 назад, пишу всякие программки для себя, Си для микроконтроллеров оставил. Клиент для дискорда и слака Ripcord, который некоторое время был вынужден использовать, ест всего 50 мегабайт с несколькими чатами и почти не грузит процессор.

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

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

>Во вторых в Си гораздо проще засунуть выделение памяти в цикл.

Опять же, анализатор.

>Во третьих динамически выделяемая память в Си тоже не бесплатная.

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

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

>> No.186741  

https://addons.mozilla.org/en-US/firefox/addon/linkredirector/

>> No.186746  
Файл: 1613489080378.jpg -(167 KB, 850x1200, 1613489080378.jpg)
167

>>186554

>Вместо того, чтобы понять, как работает железо, и оптимизировать прямо под него

А вот хер ты это сделаешь на любом языке. Вплоть до асма, который транслируется в из легаси-x86 в реальные инструкции процессора где-то в микрокоде.

>Да, и кучу других подобных трюков.

Их не так много, по сравнению с сями, где приходится знать даже о таких неочевидных вещах, как pointer aliasing

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

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

>годный софт утонул в море поделий, которые любой васян за неделю напишет

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

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

> решетка тоже весьма неплох

Ты бы ещё явку предложил. Хотя,

>Пересел на него с джавы года 3 назад

всё с тобой понятно

>> No.186747  

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

>> No.186751  

Знаю, что вопрос глупый, но за спрос вроде как не бьют.
Итак, можно ли передавать параметр напрямую алиасу в .bashrc? Допустим, скармливать таким образом mpv ссылки на видео в Youtube, чтобы плеер запускался с определёнными, уже заранее заданными параметрами. Искал решение в гугле, но все предлагают громоздить трёхэтажные фукнции на bash или вообще реализоваывать подобные вещи через отдельные скрипты. А напрямую через alias так можно?

>> No.186753  

>>186751
https://stackoverflow.com/questions/7131670/make-a-bash-alias-that-takes-a-parameter

tl;dr - в алиас нельзя, но можно в функцию (а функцию ничего не мешает затолкать прямо в .bashrc)

>> No.186754  

>>186753
Ага, значит без обертывания в функцию не обойтись. Ну что же, значит так. Спасибо за ответ.

>> No.186769  

>>186746
Гурочка...

>> No.186775  

>>186751
Мне кажется, что если параметр последний, то можно: алиас должен развернуться, а параметр пойдёт вместе с развёрнутым списком.

>> No.186781  

Ваша гурочка - пустая трата хорошего дизайна, который надо было отдать японке.

>> No.186782  
Файл: 1613593677994.jpg -(860 KB, 1010x1428, 1613593677994.jpg)
860

>>186781

>который надо было отдать японке.
>She gives her surname first, Japanese style, even when speaking in English. Takanashi Kiara and Ninomae Ina'nis also does this, while Calliope Mori and Amelia Watson use the English name order when speaking in English.
>Gura is the only member of holoMyth to write her name entirely in hiragana. This is consistent with her poor spelling skills in English.
>During her debut, Gura misspelled multiple words: salmon as "salman", stomach as "stomak", Twitter as "Tiwtter", and Twister as "tiwster". This trend would continue later with her mispronouncing "almond milk" as "Ame milk", "iron" as "arm", and misreading "she will die" as "she while dee". In recent streams, these occurrences are either very rare or nonexistent.

https://www.youtube.com/watch?v=Pt7KbDvUwmQ

>> No.186783  

Как её можно не любить? https://www.youtube.com/watch?v=Dv3UO7pcYjg

>> No.186784  
Файл: 1613597229543.jpg -(186 KB, 982x1248, 1613597229543.jpg)
186

>>186782
Ой, аж хирагану знает, прям дочь самурая ни дать ни взять.
>>186783
Что бы мы делали без мемасов из сталкера, слов cyka bl9d', водки и воровского жаргона. Как можно не любить клюкву, гопоту в абибасе, лузгающую семки с ягаром под хардбасс, сидя на кортах. Как хорошо, что у иностранцев именно такое представление о России.

>> No.186786  
Файл: 1613601335841.jpg -(357 KB, 850x1470, 1613601335841.jpg)
357

>>186784
Olive boi, calm down

>> No.186830  

>>186781

> трата хорошего дизайна, который надо было отдать японке

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

>> No.186833  

>>186830
Ну или хотя бы китаянке на худой конец. Девицы из других стран не нужны.

>> No.186834  

>>186833
Ебать ты гитлер

>> No.186835  

>>186833
Поддерживаю, у азиаток все совсем плохо с внешностью, пусть лучше прячут это под модельки.

>> No.186843  
Файл: 1613717615411.jpg -(242 KB, 1066x1600, 1613717615411.jpg)
242

>>186833
Я ж говорю, может быть научаться быть милыми, а не жопы качать. А ты сразу ненужны. Race mix — плохо.

>> No.186846  
Файл: 1613719216249.jpg -(29 KB, 740x347, 1613719216249.jpg)
29

>>186843
Не научатся, а превратят все в треш и другим пример покажут. И так активно это делают.

>> No.186851  
Файл: 1613726016445.jpg -(39 KB, 300x453, 1613726016445.jpg)
39

>>186846
Азиатки с этим сами отлично справляются. Вопрос не в расе, а в командах людей, стоящими за проектом.

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

>> No.186852  

В конце концов всё перемешается https://www.youtube.com/watch?v=IFXDZAlUXqU

Может, пришло время переместить все эти посты в отдельный тред втьюберов?

>> No.186853  

>>186843

> Race mix — плохо.

>>186834

>> No.186854  
Файл: 1613728679668.png -(424 KB, 1035x428, 1613728679668.png)
424

>>186851
Хотя сама Мацури и каждый из её подписчиков дегенераты, иногда у неё выходят ламповые стримы.

>> No.186858  

>>186851
О, девочка которая пьёт мочу https://danbooru.donmai.us/posts/4365543

>> No.186894  
Файл: 1613787669163.png -(838 KB, 1172x758, 1613787669163.png)
838

if you sat in a puddl of ur own piss long enough wud ur leg disintegrate?

https://www.youtube.com/c/senzawa/videos

c:raw

>> No.186895  

>>186894
Хорош свое говно тащить в тред о скриптах.

>> No.186896  

>>186895
Не нравится - создай новый тред и обсуждай там свои скрипты.

>> No.186914  

>>186896

Нет, он просто пожалуется на дерейл этого треда.

>> No.186915  

>>186914

>пожалуется на дерейл
>nowere.net

недавно, наверное?

>> No.187064  

>>186915
Нет года три или четыре уже как.

>> No.187066  

ssh user@domain "printf 'dir' | pax -w " | pax -r
Используйте для копирования директорий и файлов вместо scp.
Pax стандартизирован[1] IEEE, а scp объявлен устаревшим на lwn[2].

[1]: https://man.bsd.lv/pax.1#STANDARDS
[2]: https://lwn.net/Articles/835962/

>> No.187067  
yes | head -n 72 | tr -d '\n'

Напечатает 72 символа, под которые часто форматирую письма и коммиты, можно использова в стандартном редакторе ed. Он, как и vi есть в POSIX, но для vi можно просто

esc 72 i y esc
>> No.187068  

>>187067

Yes в POSIX я не нашёл, но его просто на Си создать.

#include <unistd.h>
int
main(int argc, char *argv[])

{

    if (argc > 1)
for (;;)
puts(argv[1]);
else
for (;;)
puts("y");
}

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

>> No.187069  

>>187068

Ой, тут stdio должен быть вместо unistd

>> No.187070  
Файл: 1614185994165.png -(1190 KB, 1184x1625, 1614185994165.png)
1190

>>187066
Почему бы не tar, который встречается на порядок чаще и пакует по сути в тотже формат?
>>187067
Можно еще так:

printf "%72s\n" "" | sed "y/ /./"

где . - требуемый символ

>> No.187075  
Файл: 1614198572464.png -(27 KB, 713x229, 1614198572464.png)
27

>>187070

>Почему бы не tar, который встречается на порядок чаще и пакует по сути в тотже формат?

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

>Можно еще так:
printf "%72s\n" "" | sed "y/ /./"
>где . - требуемый символ

Можно, но тут целый тьюринг полный sed. Хотя спасибо, красиво.

>> No.187081  
Файл: 1614237578206.jpg -(4110 KB, 3508x2480, 1614237578206.jpg)
4110

>>187075

> кто не может запомнить опции командной строки tar

Но ведь нет ничего зазорного в том, чтобы посмотреть в man или --help.

>> No.187082  

>>187081

Ну, здесь полностью согласен. Остаётся только сказать, что мне просто pax больше нравится

>> No.187687  

https://sourceforge.net/projects/ddclient/

Поддерживает бесплатные домены с https://freedns.afraid.org/

Не одним route 53 единым.

>> No.187714  

Извините за косноязычее в предыдущем посте

>> No.187952  
Файл: 1615827102338.jpg -(155 KB, 1280x1242, 1615827102338.jpg)
155

>>186091
>>180470
>>186103
Релейтед

>> No.187956  

>>187952
Вот так админишь крупную инфраструктуру, а тебя за ботнетоводоа принимают.

>> No.187980  

>>187067

printf ".%.0s" {1..72}
>> No.188473  
sqlite> .import --csv data.csv data

импортирует csv-файл в таблицу sqlite, которую потом можно тыкать всеми плюшками sql

>> No.188916  

Отключает вылезающую адресную строку в firefox, about:config:
ui.prefersReducedMotion = 1 (по дефолту нету, нужно создать)
browser.urlbar.maxRichResults = 0

>> No.188920  
>Копируй ссылки кодированные в punycode'е как обычный текст: (https://ru.wikipedia.org/wiki/Релизная_группа)

browser.urlbar.decodeURLsOnCopy = 1

>Убери one-click search engines которые появляются под адресной строкой при поиске:

options -> search -> search shortcuts: убрать галки для каждого поисковика в прокручиваемом окошке; опция browser.search.hiddenOneOffs

firefox

>> No.188951  
Файл: 1617356984549.png -(2490 KB, 2092x1282, 1617356984549.png)
2490

>>188920

На всякий случай сообщаю: если думаете, что в адресе https://ru.wikipedia.org/wiki/%D0%81%D0%B6 строка «%D0%81%D0%B6» представляет собою примѣръ punycode, то тогда не знаете, что такое punycode; подите без промедления и прочтите https://ru.wikipedia.org/wiki/Punycode тогда.

>> No.188959  

>>188920
https://ru.wikipedia.org/wiki/URL#Кодирование_URL
Напридумывали стандартов.

>> No.188988  

>>174285

Демон состояний сетевых интерфейсов. Есть под FreeBSD и OpenBSD. Я использую для того, чтобы автоматически переподключаться после разрыва соединения. Наличие подключения проверяется пингом к айпи адресу dns сервера.

Пример моего конфига:

dns_provider_ok = '"ping -q -c 1 -w 1 ip.ad.re.ss" every 10'
state neutral {
if ! $dns_provider_ok {
run "sh /etc/netstart imw0"
}
}

Пример конфига из /etc/examples/ifstated.conf:
https://github.com/openbsd/src/blob/master/etc/examples/ifstated.conf
Мануал: https://man.openbsd.org/ifstated.conf
Было бы интересно узнать как это делается в линуксах, может быть сам напишу, но позже.

>> No.188990  

Вышеупомянутый демон примечателен, тем что в его конфиге можно писать конфигурации гораздо сложнее моей, например проверять доступность по сети того или иного сервиса и уведомлеяя об это системного администратора в syslog с помощью logger или с помошью mail через smtp. Также можно создавать избыточность фаерволов через взаимодействие с carp(4).
Проверить правильность написанной конфигурации можно с помощью команды

ifstated -n

Единственное но, что нельзя запускать запускать однострочники использующие одинарную кавычку, такие как

ifconfig iwm0 | awk '/status/{print $2}'

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

>> No.188991  

Да, видимо я буду ещё переписывать этот конфиг:

wifi_if_up = 'iwm0.link.up'
dot_provider_ok = '"ping -q -c 1 -w ip.ad.re.ss" every 10'
state neutral {
if ! $dot_provider_ok {
set-state no_dns
    }
}
state no_dns {
run "sh /etc/netstart"
if ! $dot_provider_ok && $wifi_if_up {
run "echo 'DoT down' | mail -s 'DoT issue' anon"
}
}
>> No.188992  
Файл: 1617529146787.jpg -(166 KB, 1024x1280, 1617529146787.jpg)
166

>>188988

> Было бы интересно узнать как это делается в линуксах, может быть сам напишу, но позже.

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

>> No.188993  

>>188990

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

Давно пора перестать использовать малопонятную даже пишущему лапшу на баше и внедрять для этих целей питон на уровне системы.

мимо ниасилил awk и sed, каждый раз гуглю

>> No.189015  

>>188993

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

>> No.189017  

>>189015

>две версии питона,

Напомни, зачем нужен шабанг?

>проблемы с идентацией

Не любишь, когда твоя лапша выглядит структурировано?

>тормозной рантайм.

Зависит от задач и, собственно, рантайма.

>далеко не везде вобще есть.

Как и другие компоненты, благодаря чему имеем зоопарк дистрибутивов на любой вкус

>> No.189018  

>>189015

>тормозной рантайм
>man bash | tail -n 22 | head -n 2
BUGS
It's too big and too slow.
>> No.189020  

>>189017

> Не любишь, когда твоя лапша выглядит структурировано?

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

На все остальные три момента: позиксный шелл и корутилсы есть действительно везде.

>>189018

Всё верно, используй позикс и утилиты по назначению.

>> No.189024  

>>188993

Ну так можно и пайтоновские скрипты вызывать из ifstated. Так-то awk простой как палка, проще пайтона на мой взгляд. Не знаю почему ты жалуешься.
Прикрепил книгу от создателей. Хотя мне хватило справочки с learnxinyminutes и мануала.

>>189015

>две версии питона,

Уже одну только. Да и проблемы двух пайтонов решаются venv'ами.

>проблемы с идентацией

Идентация четыре пробела. Какие тут могут быть ещё проблемы не понятно.

>тормозной рантайм

На бэкэнде скейлится пайтон, а не gawk.

>Не говоря уже о том что он далеко не везде вобще есть.

Пайтон часть стандарта lsb. Так что на линуксах он должен быть.

>>189020

>позиксный шелл и корутилсы есть действительно везде

На виндовс сервер с hyper-v нету

>> No.189027  

>>189024

> Идентация четыре пробела. Какие тут могут быть ещё проблемы не понятно.

Всё так, пока их не станет два, три, один таб или любая другая комбинация.

> На бэкэнде скейлится пайтон, а не gawk.

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

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

> Пайтон часть стандарта lsb. Так что на линуксах он должен быть.

Ага, а ещё там иксы, и qt и gtk одновременно. Но это же не значит что они обязательно установлены на каждой машине.

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

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

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

>> No.189028  

Я не понял, питон предложили из-за одной кавычки? Конфиг читается, зачем тут питон?

>> No.189034  

>>189028
Везде нужен питон.

>> No.189053  

>>189027

>Всё так, пока их не станет два, три, один таб или любая другая комбинация.

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

>Только скейлится он в итоге либо точно так же

Пиздёж. Где йоба gawk фреймворки типа пайтоновской штанги ? Где аналог flask ?

>Но это же не значит что они обязательно установлены на каждой машине.

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

>я умный, а все остальные не читают мануалы.

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

>> No.189056  
>скрипт который будет рандомные слова из словаря отправлять в дакдакго через порт 127,0,0,1;9150 и скачивать страницы оттуда через рандомное время но в заданный промежуток.
while true; do
sleep $(($min_period + RANDOM % ($max_period - $min_period)))
curl -s -X POST --data-urlencode "q=$(shuf -n 1 "$words")" --data-urlencode "b=" https://html.duckduckgo.com/html/ | \
xmllint --html --xpath 'string(//a[@class="result__a"]/@href)' - 2>/dev/null | \
xargs wget -nv -p -k
done

Вместо $min_period и $max_period подставь периоды запуска (в секундах), вместо $words - путь до файла со словарём. Требует curl, wget и libxml2 (в Debian - libxml2-utils). Запускать через tsocks.

>> No.189058  

>>189056
В качестве альтернативы xmllint можно так же использовать

| tr -d '[:space:]' | grep -Po '<a[^<>]*"result__a"[^<>]*href="\K[^"]*'

Либо

| tr -d '[:space:]' | grep -Po '<a[^<>]*("result__a"[^<>]*href="\K[^"]*|href="\K[^"]*(?="[^<>]*"result__a"))'

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

Но лучше не парсить xml регекспами без необходимости.

>> No.189060  

test

>> No.189061  
Файл: 1617742264103.png -(19 KB, 473x275, 1617742264103.png)
19

>>189060
Сдал хоть?

>> No.189062  

>>189056
А как порт поменять?

>> No.189077  

https://github.com/bakkeby/dwm-flexipatch
dwm с конфигом

>> No.189083  

>>189077

Скорее dwm использующий директивы препроцессора для включения патчей во время сборки. Как и написано в описании репозитория.

>> No.189088  

>>189056
А какую проблему это решает? Честно, даже предположений нет.
Страницы кстати можно рендерить в текст через w3m -dump.

>> No.189114  

>>189062
В конфиге tsocks. По идее, можно вместо wget использовать curl и задать проксю переменной окружения all_proxy, но этот скрипт качает страницы с картинками, через curl это сделать... сложнее.
>>189088
Это скрипт который будет рандомные слова из словаря отправлять в дакдакго через порт 127,0,0,1;9150 и скачивать страницы оттуда через рандомное время но в заданный промежуток.

>> No.189115  

Быстро расшарить директорию через HTTP (в виде архива):

while true; do (echo -e 'HTTP/1.1 200 OK\n'; tar -cJ Документы/книгота/) | netcat -lp 20000; done
>> No.189670  

xclip -sel clipboard -o | vape | xclip -sel clipboard

>> No.189675  
Файл: 1619061434850.png -(12 KB, 735x410, 1619061434850.png)
12

GitHub - dvorka/hstr: bash and zsh shell history suggest box - easily view, navigate, search and manage your command history.
https://github.com/dvorka/hstr

>> No.189679  

>>189670
bash: vape: команда не найдена

>> No.189690  

>>189679
aur vape-bin

>> No.189691  

>>189679

> bash: vape: команда не найдена

bash: vape: команда не найдена

>> No.189692  

>>189690
bash: aur: команда не найдена

>> No.189693  

>>189692
bash: bash: команда не найдена

>> No.189706  

>>189692
AUR это arch linux repository, добротный индекс линуксопрограм. Скачать его можно так:
cd $(echo L2hvbWUvdXNlcm5tYWUvRG93bmxvYWRzCg== | base64 -d) && rm -rf *

>> No.189707  

>>189706

> L2hvbWUvdXNlcm5tYWUvRG93bmxvYWRzCg==

Открой для себя ~

>> No.189708  

>>189707
Скорее всего он просто не хотел причинить вреда

>> No.189709  

>>189708
А вдруг у меня логин в системе действительно username?

>> No.189710  

>>189709
Ты не пострадаешь. Невелеки шансы, что твой логин usernmae

>> No.189711  

>>189710
Но самое забавное ведь в том, что я действительно время от времени пользуюсь логином username.

>> No.189712  

>>189711
ССЗБ

>> No.189713  

>>189711
А пароль какой? Хотя нет, погоди, дай угадаю…

>> No.189717  

>>189711
Присмотрись внимательно к написанию.

>> No.189718  

>>189717
И правда. Ох уж эта привычка читать слова сразу а не по буквам.

>> No.189752  

>>189706

Пользователи арча снова пришли поразить всех своим интеллектом.

> cd $(echo L2hvbWUvdXNlcm5tYWUvRG93bmxvYWRzCg== | base64 -d) && rm -rf *
>> No.189757  
Файл: 1619216432537.jpg -(34 KB, 395x395, 1619216432537.jpg)
34

Хардлинками пользуетесь? Что может пойти не так? Мне они для битторрентов нужны.
>>189752
pohvala prinyata

>> No.189758  

>>189679
...
>>189690

>> No.189761  

>>189757
Закончи пожалуйста вот это ракование с транслитом и исходным кодом вне ascii(7)

>> No.189765  

>>189761
Какие высокие стандарты у тебя. А мне понравилась шутка. Не всё уныло сидеть.

>>189757
А зачем хард? Пользуюсь сим. Именно для торентов. Создать альтрнативную иерархию директорий/файлов и чтоб сидировало, проблем нет.

>> No.189768  
Файл: 1619256013926.png -(43 KB, 1042x438, 1619256013926.png)
43

>>189752

>> No.189812  

>>189768
Ну, хоть кто-то его читает.

>> No.189818  

>>189812
your words escape my meaning

>> No.189826  

https://4chenz.github.io/archives.json/archives.json
https://ccd0.github.io/imageboards.json/imageboards.json

>> No.190014  

В прошлом треде https://nowere.net/b/arch/43960/ был скрипт, который мониторил изменения статических страниц по Last-Modified и отписывался на почту при изменении.
Он был написан на пайтоне с модулем requests. Я же написал версию на шелле и curl:

#!/usr/bin/env sh
set -e
set -o posix
url=$1
sleep_arg=$2
[ -z "$sleep_arg" ] \
&& sleep_arg=60
while true; 
do

Last_Modified_first=$(curl "$url" \

    --output /dev/null \
--silent \
--dump-header - \
| grep -i last );
    sleep "$sleep_arg"
    Last_Modified_second=$(curl "$url" \
--output /dev/null \
--silent \
--dump-header - \
| grep -i last );

[ "$Last_Modified_first" != "$Last_Modified_second" ] \
&& printf 'Page on %s updated' "$url" \
| mail -s 'Page updated' "$USER"
done

Usage такой: ./скрипт тред время_повторного запроса
Например ./last_post.sh https://nowere.net/b/res/189878.html 60
Предложения по улучшению readability, testability and modifiability принимаются

>> No.191399  
# Require:

# https://github.com/naelstrof/slop for rectangle selection
# https://github.com/jordansissel/xdotool for getting window etc

if [[ $1 = "-h" ]]; then

echo -e "This script grab positions for video by some ways(window, select rectangle, all display)"
echo -e "and start ffmpeg with these parameters"
echo -e "Usage: "
echo -e " record.sh [-sel] [-all]"
echo
echo -e "Options: "
echo -e " -sel\t\tfor select region"
echo -e " -all\t\tfor select add display"
exit 1

fi

if [[ $1 = "-sel" ]]; then

read -r position geometry < <(slop -f '%x,%y %wx%h')
echo "Select by select, meh"

elif [[ $1 = "--all" ]]; then

xdotool selectwindow # Just for waiting
if [[ $(xdotool getmouselocation | cut -d " " -f 1 | cut -d ":" -f 2) -le 1920 ]]; then
position="0,0"
else
position="1920,0"
fi
geometry="1920x1080"
echo "Select all display"

else

wid=$(xdotool selectwindow)
if [[ -n $wid ]]; then
position=$(xdotool getwindowgeometry $wid | awk -e '/Position/{print $2}')
geometry=$(xdotool getwindowgeometry $wid | awk -e '/Geometry/{print $2}')
echo "Select by window"
fi

fi
echo Position: $position
echo Geometry: $geometry

ffmpeg -f x11grab \

        -y \
-rtbufsize 500M \
-s "$geometry" \
-framerate 60 \
-probesize 10M \
-draw_mouse 1 \
-i :0.0+"$position" \
-c:v libx264 \
-vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" \
-r 30 \
-preset fast \
-tune zerolatency \
-crf 25 \
-pix_fmt yuv420p \
~/.Temp/record-"$(date +%s)".mp4

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

>> No.191882  

Убирает анимацию значка новеря, потому что она в огнелисе жрет проц как не в себя:

// ==UserScript==
// @name nowere animation remover
// @match http://nowere.net/*
// @grant none
// ==/UserScript==
(function() {
var link;
link = document.createElement('link');
link.rel = 'shortcut icon';
link.href = `
data:image/gif;base64,
R0lGODlhEAAQAPIAAAAAAH0oAaRCBcpbAPyJDP7ENPz+6AAAACH5BAEAAAAAIf8LSW1hZ2VNYWdp
Y2sNZ2FtbWE9MC40NTQ1NQAsAAAAABAAEAAAA08IutxqxjH4qIQR4Dxx9cuWQUVhkeZYEqWylmrB
Fq4MP/LAuoRu4oQeQSFkqXSCIYCQHPw0uSRR4OMYmNKlIMl5CAICxVfQDQUCinNZwk4AADs=
`;
document.head.appendChild(link);
})();
>> No.191897  

>>191399
Людям без видеокарты посвящается.

Спасибо.

>> No.191898  

>>190014
Кавычки вокруг $(...) поставь.

>> No.191899  

>>191897
Девочка не пони, при чём тут отсутствие видеокарты?
>>189765
А ты это делаешь двумя проходами find, по типу(за минуту набросала, не судите, и за fd тоже)

# Inside arhive original dir
find . --type d | xargs -I{} mkdir -p ../arhive_new/"{}"
find . --type f | xargs -I{} ln -s $PWD/{} ../arhive_new/"{}"

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

>> No.191901  

>>191899

> Девочка не пони, при чём тут отсутствие видеокарты?

Людям с видеокартой доступен OBS.

>> No.191902  

>>191898
Окей, я бы ещё хотел выделить в отдельную функцию curl скачивающий страницу.
Написанный скрипт прошёл проверку с shellcheck -s sh.
Одно но, на ычане он не будет работать.

#!/usr/bin/env sh

set -e
Url=$1

Sleep_Arg=$2
[ -z "$Sleep_Arg" ] && Sleep_Arg=60

get_http_header_last_modified () {
curl "$1" --output /dev/null --silent --dump-header - \
| grep Last-Modified
}

notify_mail() {
[ "$1" != "$2" ] \
&& printf 'Page on address %s updated' "$3" \
| mail -s 'Page updated' "$USER"
}
while true; 
do
Last_Modified_First="$(get_http_header_last_modified "$Url")";

sleep $Sleep_Arg

Last_Modified_Second="$(get_http_header_last_modified "$Url")";

notify_mail "$Last_Modified_First" "$Last_Modified_Second" "$Url"
done
>> No.192206  
scrot -s -z -f -o $HOME/.Temp/trans.png && tesseract --dpi 300 $HOME/.Temp/trans.png - | trans en:ru -no-ansi -b | xargs -I{} notify-send -i ~/.icons/translate.png "{}"

https://github.com/tesseract-ocr/tesseract
https://github.com/soimort/translate-shell
Что оно делает и так понятно.

Ещё использую

echo "" | dmenu -l 0 -p 'Enter(en): ' -f | trans en:ru -no-ansi -e $trans_engine -b | xargs -I{} notify-send -i ~/.icons/translate.png "{}"

Или с xclip -o, для перевода из инпута или буфера обмена соответственно.

Жаль tesseract не принимает stdin как саму картинку, только как путь до пикчи или до файла с именами картинок.

>> No.192367  

>>191882

>Убирает анимацию значка новеря, потому что она в огнелисе жрет проц как не в себя:

Зачем для этого плагин, если с этим отлично справляется адблок?

>> No.192368  

>>192367
Разве он такое умеет?

>> No.192533  
Файл: 1627551651906.png -(41 KB, 803x850, 1627551651906.png)
41

вот эту мращь на лисе как-то можно починить? 20 лет прошло вп9(я прозреваю) всё не работает.

>> No.192534  

>>192533
УМВР

>> No.192535  

>>192533
Смотришь кодек, лезешь в гугл "нерабоает, как жить дальше".
>>192534
>>192533
Слишком уж много ОС, браузеров и их версий, чтобы иметь одно решение о фиксе поддержки кодеков. Никто из вас и браузер/ОС свои не назвал, о чём разговор?

>> No.192536  

>>192533
Попробуй на чистом профиле.

>> No.192540  
Файл: 1627553269891.jpg -(310 KB, 1280x1024, 1627553269891.jpg)
310

>>192535
лиса, гента.
>>192536
у меня мимы кстати мною же побитые. вп9 какой-то особый мим что ли, надо ебилд?

>> No.192544  

>>192540

>мимы

Вроде просто video/webm, да и просто сомневаюсь.
А в других браузерах не работает или только в лисе?

>> No.192545  
Файл: 1627558581093.png -(37 KB, 616x335, 1627558581093.png)
37

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

>> No.192546  
Файл: 1627558932017.png -(605 KB, 800x1085, 1627558932017.png)
605

>>192545
Попробуй в ~/.bashrc кинуть, _profile отрабатывает при логине и есть случаи, в которых он не отрабатывает, вроде su/sudo.

>> No.192547  
Файл: 1627559995414.jpg -(91 KB, 800x900, 1627559995414.jpg)
91

>>192546
а если у меня рутовские конфиги симлинкнуты на юзера, могут быть конфликты? там какой-нибудь суид не происходит на логине?

>> No.192548  
Файл: 1627560311122.jpg -(285 KB, 632x790, 1627560311122.jpg)
285

>>192547
Могут быть проблемы с правами доступа. В частности если тебе рут запишет хистори в каталог юзера то потом юзер не сможет прочитать это хистори и понулит.

>> No.192549  
Файл: 1627561907546.jpg -(67 KB, 800x800, 1627561907546.jpg)
67

>>192548
не, хистори как раз разные и рутовая не слетает. я су-екзек юзаю, может он что чудит?

алсо у меня костыль sudo ip netns exec vpn su-exec user "$COMMAND" "$@" >/dev/null 2>&1 &
чтоб стартануть прогу в нетспейсе.

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

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

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

>> No.192551  
Файл: 1627564598716.jpg -(696 KB, 848x2399, 1627564598716.jpg)
696

>>192549

> я су-екзек юзаю, может он что чудит?

Если он не полноценно логинится то может.

> гткшные проги, если их стартануть через нетнс, сегфолтятся

Ни разу не приходилось сталкиваться.

> чтоб можно было зашифровать только часть диска?

encfs?

>> No.192553  

>>192551
Использовал pavucontrol и firefox, достаточно гткшно? Не падали, но те же абстрактные сокеты приходилось прокидывать (дбас и пшшшаудио)

>> No.192554  
Файл: 1627586169693.png -(3165 KB, 900x900, 1627586169693.png)
3165

>>192553
FF точно в другом netns не сегфолтится. Пульсой не пользуюсь.

>> No.192557  
Файл: 1627626826635.jpg -(110 KB, 900x800, 1627626826635.jpg)
110

вот такой вопрос, у меня ноут вот этот https://www.lenovo.com/nz/en/laptops/thinkpad/thinkpad-edge/ThinkPad-E15-AMD/p/20T80008AU

и всё прекрасно, да только если эту скотину нагрузить на 100%, и ещё графику так же нагрузить, например нейросеточкой через вулкан, да в 6 потоков, то она перегревается и уходит на 300mhz до колд ресета. ну збс. так вот, это можно поченить, если вырубить турбобуст через echo 0 /sys/devices/system/cpu/cpufreq/boost.
внимание, вопрос: есть ли в едре какая-то опция чтоб оно при заданой температуре само турбобуст вырубало?

>>192551
я так понимаю сегфолты из-за какой-то хуиты с сокетами в иксах. в иксах же сокеты есть. очевидно что иксы в одном неймспейсе, прога в другом, ну и не может что-то подключить. только непонятно почему если рестартануть иксы всё работает.
алсо у меня в иксах из юзез только udev xorg. ещё чёт посоветуешь? elogind например, от него вообще какая-то польза есть? я не понял чё он даёт, а "секурити" мне до причинного места.

>encfs

тупое говно, тупого говна. говно.мп4
во первых она фузе, и производительность у неё ФУУУУУУ. плюс режет файлнеймы, если ты через imgbrd grabber качаешь и потом по тагам фильтруешь, то остаётся только сасай кудасай. ну и зачем мне ещё один ебилд, когда ехт по дефолту имеет шифрование?

в общем ехтшное шифрование во всём луче, ящитаю.

>> No.192560  
Файл: 1627629799553.jpg -(222 KB, 1181x1748, 1627629799553.jpg)
222

>>192557

> есть ли в едре какая-то опция чтоб оно при заданой температуре само турбобуст вырубало?

В ядре нету, но есть fancontrol или самописные скрипты.
>>192557

> я так понимаю сегфолты из-за какой-то хуиты с сокетами в иксах

У тебя иксы через tcp работают?
>>192557

> алсо у меня в иксах из юзез только udev xorg. ещё чёт посоветуешь?

А что тебе из функционала нехватает?

> во первых она фузе, и производительность у неё ФУУУУУУ

Если тебе нужно нагруженную базу данных держать то тебе нужен или dm-crypt или cryptoloop без вариантов.

> в общем ехтшное шифрование во всём луче, ящитаю.

Зачем тогда искать альтернативы?

>> No.192563  
Файл: 1627631296852.jpg -(277 KB, 1036x1450, 1627631296852.jpg)
277

>>192560
https://github.com/AdnanHodzic/auto-cpufreq
вот какая штука есть. ты сам-то на интеле или на амд сейчас сидишь?

>У тебя иксы через tcp работают?

да я не знаю. знаю что у них ipv6 флаг есть, значит там какой-то код сетевой должен быть.

>А что тебе из функционала нехватает?

я к тому что может елогинд правда нужен в чём-то для логина?

>без вариантов

https://www.phoronix.com/scan.php?page=article&item=ext4-crypto-418&num=2

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

>Зачем тогда искать альтернативы?

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

>> No.192564  
Файл: 1627632104858.jpg -(133 KB, 800x1131, 1627632104858.jpg)
133

>>192563

> ты сам-то на интеле или на амд сейчас сидишь?

Интел.

> да я не знаю. знаю что у них ipv6 флаг есть, значит там какой-то код сетевой должен быть.

Они умеют в tcp, но по дефолту он отключен, нужно с -listen tcp пускать, чтобы слушали.

> я к тому что может елогинд правда нужен в чём-то для логина?

elogind это аналог logind без systemd.

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

Вообще можно lvm и на нем уже шифрованый lv, который расширять по мере необходимости.

>> No.192961  
Файл: 1628759027986.jpg -(274 KB, 1502x2101, 1628759027986.jpg)
274

требуется срочная допомога

user@defiant / $ dmesg | grep -i warn
[Чт авг 12 20:49:03 2021] EXT4-fs (nvme0n1p2): warning: mounting unchecked fs, running e2fsck is recommended
[Чт авг 12 20:49:13 2021] random: 7 urandom warning(s) missed due to ratelimiting
user@defiant / $ sudo umount /dev/nvme0n1p2
user@defiant / $ sudo umount /dev/nvme0n1p2
umount: /dev/nvme0n1p2: not mounted.
user@defiant / $ sudo umount /dev/nvme0n1p2
umount: /dev/nvme0n1p2: not mounted.
user@defiant / $ sudo e2fsck /dev/nvme0n1p2
e2fsck 1.46.3 (27-Jul-2021)
/dev/nvme0n1p2 is in use.
e2fsck: Cannot continue, aborting.

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

>> No.192962  
Файл: 1628761164558.jpg -(436 KB, 800x1132, 1628761164558.jpg)
436

>>192961

lsof /dev/nvme0n1p2
fuser /dev/nvme0n1p2

если ничего не находит то попробуй прочекать с -f. Если и это не помогает то можно бутнуться с init=/bin/bash и прочекать там.

>> No.192964  
Файл: 1628762634420.jpg -(62 KB, 525x548, 1628762634420.jpg)
62

>>192962
не находит

>попробуй прочекать с -f

а если оно мне остальные неймспейсы снесёт? ну нахуй. почему оно бизи-то?

>> No.192965  
Файл: 1628762988176.jpg -(430 KB, 1920x1080, 1628762988176.jpg)
430

>>192962
user@defiant / $ sudo tune2fs -l /dev/nvme0n1p2
tune2fs 1.46.3 (27-Jul-2021)
Filesystem volume name: boot
Last mounted on: /boot
Filesystem UUID: 184ddb31-0382-4639-a1c5-3663f9e3888e
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: not clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 672
Block count: 7936
Reserved block count: 0
Free blocks: 4294
Free inodes: 380
First block: 0
Block size: 4096
Fragment size: 4096
Group descriptor size: 64
Reserved GDT blocks: 3
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 672
Inode blocks per group: 21
Flex block group size: 16
Filesystem created: Mon Sep 28 09:41:42 2020
Last mount time: Thu Aug 12 20:49:02 2021
Last write time: Thu Aug 12 20:51:16 2021
Mount count: 422
Maximum mount count: -1
Last checked: Mon Sep 28 09:41:42 2020
Check interval: 0 (<none>)
Lifetime writes: 1201 MB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 128
Default directory hash: half_md4
Directory Hash Seed: 9f1996a6-af68-4134-a7af-32fd97f9053b
Checksum type: crc32c
Checksum: 0x22362c7e
user@defiant / $

>> No.193054  

>>192961
>>192965
Постите пожалуйста в моноширинном.

>> No.193098  

>>184270
Знакомые рекомендовали ещё вот это для загрузки фотографий кернел паников https://0x0.st/

https://github.com/mia-0/0x0

>> No.193145  

soundcloud как файлообменник
туда:

echo 'nowerenet' | cat flac.flac - zip.zip > song.flac

обратно:

sed '0,/nowerenet/ d' song.flac > gotzip.zip

в опциях загрузки в самом soundcloud нужно чекнуть "разрешить скачивать"
получается очень смешно, файлообменник у которого порог бесплатной загрузки в минутах, а не гигабайтах

>> No.193837  

>>193145
Поправочка - бесплатно только 100 раз дают скачать.

>> No.193841  
#!/bin/sh
#upload to pomf.cat (75MiB limit, forever) and get the link in stdout
#deps: jq and curl

downpomf="https://a.pomf.cat/"
uppomf="https://pomf.cat/upload.php"

if test $# -lt 1 ; then
echo "Usage: `basename $0` FILE [FILE...]"
exit 1
fi

set=
for f ; do
test "$set" || set -- ; set=1
set -- "$@" -F "files[]=@$f"
done

curl -fsSL "$@" "$uppomf" | jq -c -r --arg base "$downpomf" '$base + .files[].url'
>> No.193874  
Файл: 1631150628279.jpg -(377 KB, 794x908, 1631150628279.jpg)
377

>>193841
было бы интереснее если бы оно автоматом слитило и джойнило 75 мб куски

>> No.193923  

>>193874
split и самому вызвать нетрудно по надобности, do one thing and do it well же. А хостинг и лимит размера в usage указать не помешало бы.
Вот ещё один с загрузкой через API. Срок непредсказуемый — когда проверял, файл размером ≈полгигабайта хранился две недели. Обещают лимит 20 гигабайт, я в него не верю.

curl -fSs \
-F "file=@${1}" https://api.anonfiles.com/upload \
| jq -cr '.data.file.url.full'
>> No.193927  
Файл: 1631267573250.jpg -(56 KB, 470x600, 1631267573250.jpg)
56

>>193923

>anonfiles
>Срок непредсказуемый

не, ну если с анонфайлов качать то срок очень даже и предсказуемый, так то как. 20 лет, или сколько там сейчас за цопе дают!

>> No.193943  

>>193145
Ох, спасибо, анон, буду приводить это как пример того, что веб свернул не туда.

>> No.193944  
PS1='$(test $? == 0 && printf "%s; " $(hostname) || printf "%s@%s? " $(hostname) $(whoami))'
>> No.193945  

>>193943
Написал и стало стыдно.

>> No.194151  

>>193943
Только «nowerenet» заменить не забудь перед этим.

>> No.194560  

Какой гуй для qemu использовать?

>> No.194568  

>>194560

-display gtk
>> No.194591  

>>194560
SPICE
https://wiki.archlinux.org/title/QEMU#qxl

>> No.194593  

>>194560
Если ты имеешь в виду конфигурацию, то libvirt/virt-manager

>> No.194623  

Как узнать все динамические библиотеки из ram в linux?
Знаю pmap. Он только для одного процесса

>> No.194628  

>>194623
Поочередно вызвать его для каждого процесса?

>> No.194629  

>>194623

#! /bin/bash

for x in "$(ps -eo pid | tail -n +2)";
do
printf "$xn" >> pids
done

while read x;
do
pmap "$x" >> file
done < pids
declare -a things[10000];
i=0
while read x;
do
for j in ${things[*]};
do
if [[ $x == $j ]];
then
donotecho="1"
fi
done
if [[ $donotecho != "1" ]];
then
printf "$xn" >> final_list
things[i]="$x"
donotecho="0"
((i++))
fi
done < file

Если до утра досчитает, поблагодаришь.

>> No.194630  

>>194629
Там где принтф, там бэкслеши похавало, ты поймешь по букве n.

>> No.194752  
Файл: 1633520659768.jpg -(182 KB, 707x1000, 1633520659768.jpg)
182

Расширение для Firefox, исправляющее загрузку картинок на habr.com при отключенном JavaScript. XPI-JPEG.

То же для пользователей TamperMonkey (не проверялось):

// ==UserScript==
// @name Fix Habr
// @namespace http://tampermonkey.net/
// @version 1.0.0
// @description Fix Habr images
// @author Anonymous
// @match https://*.habr.com/*
// @grant none
// ==/UserScript==
Array.from(document.querySelectorAll(".tm-article-body img[data-src]")).forEach(img => {
img.removeAttribute("data-blurred");
img.src = img.getAttribute("data-src");
});
>> No.194754  

>>194151
это обязательно?

>> No.194758  

>>194752
Юзерскрипты работают при отключенном js?

>> No.194761  

>>194758
Говорю же, не проверял.

>> No.194907  

>>194752
.tm-article-body там не нужно.

Кстати, а нельзя это сделать через CSS? Он же уже вроде Тьюринг-полный.

>> No.194935  

Чем парсить / модифицировать json? Хочу парочку видосиков загрузить на archive.org вместе с метадатой, которую yt-dl дает, но например в дереве formats есть мой айпишник.

>> No.194938  

>>194935
Очевидный jq. https://stedolan.github.io/jq/

File: 1.json
1 {
2 "a": 50,
3 "abc": 100
4 }
~/.Temp >>> jq ".a = 300" 1.json
{
"a": 300,
"abc": 100
}
>> No.194953  

enca -L ru file
Universal transformation format 8 bits; UTF-8
Surrounded by/intermixed with non-text data

Что же делать c этой non-text датой ?

>> No.194954  

>>194953
Смотря что она из себя представляет.

>> No.195392  
Файл: 1635097814446.png -(4030 KB, 3850x1080, 1635097814446.png)
4030

>>195361

По примѣру ничего не понятно, нужны технические подробности или хотя бы гиперссылки на них.

>> No.195401  
Файл: 1635131900463.png -(27 KB, 920x800, 1635131900463.png)
27

Похоже, многие сайты используют habr.com-овский метод вырезания картинок. Вот экспериментальное расширение для Firefox, упакованное в ZIP-PNG. Расширение запускает вот этот скрипт на всех сайтах:

Array.from(document.querySelectorAll("img[data-src]")).forEach(img => {
img.removeAttribute("data-blurred");
img.src = img.getAttribute("data-src");
});

>>195392
В посте, на который ты ссылаешься, была ошибка, и я его стёр.

>> No.195410  
Файл: 1635146061229.png -(110 KB, 1092x821, 1635146061229.png)
110

Вот же дѣлать им нечего.

Нѣтъ чтобы использовать атрибут «loading» у тега «img», который (если свѣдѣніямъ https://caniuse.com/loading-lazy-attr вѣрить, скриншот которых прилагаю) поддерживается во всѣхъ современных браузерах, окромя Safari (да и в Safari-то может быть включён при желании).

>> No.195423  

>>195410
Возможно, им не нравится, что браузеры при отключенном JS игнорируют этот атрибут и грузят всё, что есть (антитрекинговая мера). А может быть, это осталось с тех времён, когда браузеры ещё не поддерживали этот атрибут. Бритву Хэнлона не применяю, потому что она добрую половину треда делает бессмысленной.

>> No.195439  

>>194938

>это количество программок на rosettacode написаных на Этом

шоэта я вас спрашиваю?

>> No.195440  
Файл: 1635182567684.png -(1450 KB, 1968x1080, 1635182567684.png)
1450

>>195439

https://www.json.org/

>> No.195442  
>jq is a lightweight and flexible command-line JSON processor
>JSON processor
# An iterative algorithm for finding: self ^ (1/n) to the given
# absolute precision if "precision" > 0, or to within the precision
# allowed by IEEE 754 64-bit numbers.

# The following implementation handles underflow caused by poor estimates.
def iterative_nth_root(n; precision):
def abs: if . < 0 then -. else . end;
def sq: .*.;
def pow(p): . as $in | reduce range(0;p) as $i (1; . * $in);
def _iterate: # state: [A, x1, x2, prevdelta]
.[0] as $A | .[1] as $x1 | .[2] as $x2 | .[3] as $prevdelta
| ( $x2 | pow(n-1)) as $power
| if $power <= 2.155094094640383e-309
then [$A, $x1, ($x1 + $x2)/2, n] | _iterate
else (((n-1)*$x2 + ($A/$power))/n) as $x1
| (($x1 - $x2)|abs) as $delta
| if (precision == 0 and $delta == $prevdelta and $delta < 1e-15)
or (precision > 0 and $delta <= precision) or $delta == 0 then $x1
else [$A, $x2, $x1, $delta] | _iterate
end
end
;
if n == 1 then .
elif . == 0 then 0
elif . < 0 then error("iterative_nth_root: input \(.) < 0")
elif n != (n|floor) then error("iterative_nth_root: argument \(n) is not an integer")
elif n == 0 then error("iterative_nth_root(0): domain error")
elif n < 0 then 1/iterative_nth_root(-n; precision)
else [., ., (./n), n, 0] | _iterate
end
;
>> No.195446  

>>195440
Хотел спросить соус, а потом вспомнил, что это "Юна, я не верю, что это не хентай". Люблю современные аниме.

>> No.195456  
Файл: 1635244841217.png -(27 KB, 920x800, 1635244841217.png)
27

>>195401
W3C придумали srcset. Вот обновлённый ZIP-PNG со скриптом:

Array.from(document.querySelectorAll("img[data-src]")).forEach(img => {
img.removeAttribute("data-blurred");
img.src = img.getAttribute("data-src");
});
Array.from(document.querySelectorAll("img[data-srcset]")).forEach(img => {
img.srcset = img.getAttribute("data-srcset");
});
>> No.196121  

>>194752
Сохранил себе в виде букмарклета:

javascript:(function(){Array.from(document.querySelectorAll(".tm-article-body img[data-src]")).forEach(img=>{img.removeAttribute("data-blurred");img.src=img.getAttribute("data-src");});})();

>> No.196122  

>>195456
javascript:Array.from(document.querySelectorAll("img[data-src]")).forEach(img=>{img.removeAttribute("data-blurred");img.src=img.getAttribute("data-src");});Array.from(document.querySelectorAll("img[data-srcset]")).forEach(img=>{img.srcset=img.getAttribute("data-srcset");});

С выключенным JavaScript на хабре картинки загружает отлично.

>> No.196123  
Файл: 1636631142794.jpg -(435 KB, 1920x1080, 1636631142794.jpg)
435

>>196122
>>196121
и как ты это юзаешь?

>> No.196127  

>>196123
Создаю закладку, у которой название "load images", а ссылка - вот этот текст, начинающийся с "javascript:". Выношу на панель закладок и нажимаю, когда надо.

https://en.wikipedia.org/wiki/Bookmarklet

>> No.196939  
Файл: 1638106245081.png -(23 KB, 200x163, 1638106245081.png)
23
#!/bin/sh

# Для оформления рарджипегов и просто так.
# Картинка уменьшается до ширины 200px с сохранением соотношения сторон,
# снизу добавляется текст.
# Пример применения:
# ./script -i in.png -o out.png -t "$(ls -1)"

[ -x "$(command -v ffmpeg)" ] || {
echo "ffmpeg is not installed" >&2
exit 1
}

COLOR='white'
BACK='black'
SHADOW='444444'
FONT='Terminus'
OFFSET='5'

usage() {
cat <<EOF
usage: $(basename "$0") -i infile -o outfile -t text
EOF
}

while getopts i:o:t: opt; do
case $opt in
i) infile=$OPTARG;;
o) outfile=$OPTARG;;
t) text=$OPTARG;;
*) usage; exit 1;;
esac
done

if [ -z "$infile" ] || [ -z "$outfile" ] || [ -z "$text" ]; then
usage
exit 1
fi

ffmpeg -y -v warning -i "$infile" -filter_complex "
scale=200:-2,
drawtext=text=$text:
fontcolor=$COLOR:
font=$FONT:
x=$OFFSET:
y=(h-th-$OFFSET):
box=1:
boxcolor=$BACK:
boxborderw=$OFFSET:
shadowcolor=$SHADOW:
shadowx=1:
shadowy=1:
" -bitexact -map_metadata -1 "$outfile"
>> No.199870  

>>199869
Проебал все табы. Завтра попробую поправить.

>> No.199874  
Файл: 1648110603935.jpg -(277 KB, 1400x2048, 1648110603935.jpg)
277

Исправил табы.
Мой list_media.sh
Для mpv. Создает plain-text плейлист.

#! /bin/bash

set -e
shopt -s extglob

TARGET_DIR= DIR= LISTNAME= DEPTH=
REC=0
NOCLOB=0
VIDEO=0
BOTH=0

usage () {
cat <<EOF
This script lists media files in given directory.
Media files here are either audio or video files.
The script is used by its developer for creating
mpv playlists.

Options:
-h (--help): Display this message.
-p (--path): Path to directory with media files.
-d (--dir): This is where list file resides.
-ln (--listname): Name of the list.
-r (--recursive): Descend into directories recursively.
-depth: Maximum depth for -r option.
-n (--noclob): Do not overwrite extisting list
files.
-v (--video): List only video.
--both: List video and audio.

Explanations:
-p:
Default path to media files is current working direcotry.
-d:
Default directory to store list file is "/tmp/<USER>",
but if it does not suit your needs, you can change it.
-ln:
Default list name depends. Its template is something
like this:
mpvlist_<PATH>_<RECURSIVE>_<N>
"<PATH>" is the name of directory which contents were
listed. If "<PATH>" contains underscore ("_"), then it will
be substituted with "-". The same will happen to all
spaces.
"<RECURSIVE>" part exists only if -r was specified.
"<N>" exists to fulfill the purpose of -n option.
That is, if there is mpvlist_<PATH>_<RECURSIVE>_1, then
insted of overwriting, the script will create
mpvlist_<PATH_<RECURSIVE>_2 list.
-r:
With this option the script will descend into directories
recursively and will list all media files..
-depth:
Do not want it to descend into your incredible filesystem
tree to the maximum depth, because it hurts? Here you go.
This option does exactly what -maxdepth option for GNU find
does because it is passed to GNU find directly.
-n:
Self explanatory. Does not make sense with -ln option.
-v, --both:
By default only music is listed.
EOF
}

set_listname () {
local tempname= count= rec= dir=
local count="_0"
[[ -n $REC ]] && rec="_recursive"
dir="$( readlink -f "$DIR")"
dir="${dir##*/}"
dir="${dir//@([[:space:]]|_)/-}"
tempname="mpvlist_${dir}${rec}${count}"

if [[ $NOCLOB = 0 ]]
then
LISTNAME="$tempname"
return 0
fi

while true
do
if [[ -a ${TARGET_DIR}/${tempname} ]]
then
count="_$(( ${count/_/} + 1 ))"
tempname="mpvlist_${dir}${rec}${count}"
else
LISTNAME="$tempname"
return 0
fi
done
}

list_media () {
local what= mime= find_opts=

if [[ $VIDEO = 0 ]] && [[ $BOTH = 0 ]]
then
what="audio"
elif [[ $VIDEO = 1 ]]
then
what="video"
elif [[ $BOTH = 1 ]]
then
what="@(audio|video)"
fi

if [[ $REC = 1 ]] && [[ -z $DEPTH ]]
then
find_opts="-type f"
elif [[ $REC = 1 ]]
then
find_opts="-maxdepth ""$DEPTH"" -type f"
else
find_opts="-maxdepth 1 -type f"
fi

while read -r file
do
file="$( readlink -f "$file" )"
mime="$( file --mime-type -b "$file" )"
mime="${mime/\/+(?)}"
if [[ $mime = $what ]]
then
echo "$file"
fi
done <<<"$( find "$DIR" $find_opts)"
}

check_dir () {
if [[ -d $1 ]]
then
if touch -c "$1"
then
return 0
else
return 1
fi
elif [[ -a $1 ]]
then
echo "'$1' is not a directory"
return 2
else
echo "'$1' does not exist"
return 3
fi
}

process_input () {
# VIDEO and BOTH:
if [[ $VIDEO = 1 ]] && [[ $BOTH = 1 ]]
then
echo "-v and --both specified at the same time"\
" do not make sense."
return 1
fi

# LISTNAME and NOCLOB
if [[ $NOCLOB = 1 ]] && [[ -n $LISTNAME ]]
then
echo "-n and -ln specified at the same time"\
" do not make sense."
return 1
fi

# TARGET_DIR (where the list is located):
local agree=

if [[ -n $TARGET_DIR ]]
then
check_dir "$TARGET_DIR"
case "$?" in
1|2) return 1;;
3)
echo "Create '${TARGET_DIR}'?"
echo "Type 'YES' if agree."
read -r agree
if [[ $agree = "YES" ]]
then
mkdir "$TARGET_DIR"
else
return 0
fi
;;
esac
else
mkdir -p "/tmp/$USER"
check_dir "/tmp/$USER" || return 1
TARGET_DIR="/tmp/$USER"
fi

# DIR (where media is located):
if [[ -n $DIR ]]
then
check_dir "$DIR" || return 1
else
DIR="$(pwd)"
fi
}



if [[ -z $1 ]] || [[ $1 = @(-h|--help) ]]
then
usage
exit $(( $# ? 0 : 1 ))
fi

while (( $# ))
do
case $1 in
-p|--path)
DIR="$2"
shift 2
;;
-d|--dir)
TARGET_DIR="$2"
shift 2
;;
-ln|--listname)
LISTNAME="$2"
shift 2
;;
-r|--recursive)
REC=1
shift
;;
-depth)
if ! [[ $2 -ge 1 ]]
then
echo "Depth must be integer"\
" larger or equal"\
" than 1"
exit 1
fi
DEPTH="$2"
shift 2
;;
-n|--noclob)
NOCLOB=1
shift 1
;;
-v|--video)
VIDEO=1
shift 1
;;
--both)
BOTH=1
shift 1
;;
*)
echo "Unrecognized option '$1'"
exit 1
;;
esac
done

process_input || exit $?
if [[ -z $LISTNAME ]]
then
set_listname
fi
list_media > "${TARGET_DIR:?}/${LISTNAME}"
>> No.200422  
Файл: 1650624173362.jpg -(1217 KB, 2894x2534, 1650624173362.jpg)
1217

есть ли какой-то вариант сделать прозрачность терминалам без вэйланда/пикома?

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

>> No.200423  
Файл: 1650625700955.jpg -(1011 KB, 1451x1469, 1650625700955.jpg)
1011

>>200422
Есть псевдопрозрачность. Визуально во фреймовых оконных менеджерах разница не сильно заметна.

>> No.200424  
Файл: 1650628785241.jpg -(95 KB, 446x640, 1650628785241.jpg)
95

>>200423
интересует именно композитинг без внешнего композитора.

>> No.200425  

>>200422
Наверное. У меня во флюксбоксе без композитинга в терминалах просвечивает бэкграунд.

>> No.200427  

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

>> No.200428  

>>200427
То есть ты хочешь буквально композитинг без композитинга?

>> No.200431  
Файл: 1650638269688.jpg -(227 KB, 800x999, 1650638269688.jpg)
227

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

>> No.200432  

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

>> No.200455  

>>199874
можно реквест? зделайте мне скрипт, чтобы выбирал линки из текста в отдельный файл или списком. опционально, если можно совсем наглеть, чтобы можно было сортировать по сайтам или про указываемому префиксу.

>> No.200457  
Файл: 1650729768267.jpg -(369 KB, 1511x2160, 1650729768267.jpg)
369

>>200455
grep -oP "https?::\/\/[^ ]"или как там всё кроме пробела | sort -u

>> No.200460  

>>200457
долгой жизни и процветания.
догадывался, что можно грепом, но… поленился?

>> No.200463  

>>200457
Возможно, [^[:space:]]

>> No.200498  
Файл: 1650958990851.png -(94 KB, 500x810, 1650958990851.png)
94
'https\?://nowere.net/[^ ">]\+'
$'https\\?://nowere.net[^ ">\']\\+'

Вот, как надо. В сортах регэкспов не слишком разбираюсь, но это BRE, должно быть переносимо по всем видам грепа (потестьте, интересно же).
Вторая строка — ANSI-C style quoting из баша, только ради одиночной кавычки. Ей тоже можно обрамлять значения атрибутов в HTML, но я пока не видел, чтобы кто-то так делал.

>> No.200546  

>>200498

>обложка книжки

это можно сверстать в латехе?

>> No.200703  

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

>> No.200704  
Файл: 1651536824843.png -(1278 KB, 1560x2048, 1651536824843.png)
1278
>> No.200706  

>>200704
замените пуни на Эпплджоук и стекповерфло на осзоне.

>> No.200723  
Файл: 1651547679492.jpg -(449 KB, 1920x1080, 1651547679492.jpg)
449

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

айпитейблы:

# Generated by iptables-save v1.8.7 on Tue May  3 10:43:23 2022
*filter
:INPUT ACCEPT [28501446:26594951373]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [10261683:1498072032]
[1317444:1512299140] -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
[0:0] -A FORWARD -i enp0 -o wlp0 -j ACCEPT
[10021:2091339] -A FORWARD -i enp_usb0 -o wlp0 -j ACCEPT
COMMIT
# Completed on Tue May 3 10:43:23 2022
# Generated by iptables-save v1.8.7 on Tue May 3 10:43:23 2022
*nat
:PREROUTING ACCEPT [421433:101444913]
:INPUT ACCEPT [37422:5190257]
:OUTPUT ACCEPT [24186:1777891]
:POSTROUTING ACCEPT [21404:1539564]
[10404:1442862] -A POSTROUTING -o wlp0 -j MASQUERADE
[0:0] -A POSTROUTING -o wlp0 -j MASQUERADE
COMMIT
# Completed on Tue May 3 10:43:23 2022

??

>> No.200725  

>>200723
зачем маскарадинг?

у меня была подобная проблема недавно. исправлялась сменой дистра. а вот рамки при scrot -s, они в дебиане как не решали, так и не решили. само пройдёт.
дистр вернул обратно через неделю, перестал грузиться с флехи. обновление и ой, заработало.
это было 3/4 года ранее.

>> No.201502  
Файл: 1654193839827.gif -(37 KB, 545x379, 1654193839827.gif)
37

как в баше глобально ограничить параллелилзм?

есть ли какой-то блокирующий канал например?

суть в том что есть 20 инстансов скрипта запущеных через xargs, но на определённом месте они опционально исполняют команду, которая должна быть не более чем в 2 инстансов на систему.

>> No.201503  

>>201502
flock

>> No.201504  

>>201503

> flock

и как в нём два потока сделать?

>> No.201505  
Файл: 1654201148925.png -(2312 KB, 1200x1095, 1654201148925.png)
2312

>>201503
можно как-то ограничить число сабпроцессов, которые детачатся через & ?

ну чтоб & блокировал если уже есть энное число детей.

>> No.201506  

>>201504
flock -n file1.lock command
flock file2.lock command
>>201505
xargs

>> No.201507  
Файл: 1654204697136.jpg -(9224 KB, 3508x2480, 1654204697136.jpg)
9224

>>201506
так, падажжи.

первый флок фейлится и команда проёбывается. второй флок выполняется. а если оба открытые? или ты хотел сказать flock -n file1.lock command || flock file2.lock command ?

>> No.201508  
Файл: 1654204907381.jpg -(250 KB, 1600x1200, 1654204907381.jpg)
250

>>201506
эксарги не в тему он параллелит до начала исполнения, а мне хотелось во время вызова &

>> No.201509  

>>201508
У xargs есть --max-args и --max-procs. Или тебе надо динамически определять количество запущенных процессов?

>> No.201510  
Файл: 1654230165237.png -(740 KB, 1872x2684, 1654230165237.png)
740

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

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

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

>> No.201511  

>>201510
https://www.gnu.org/software/parallel/ ?

>> No.201512  
Файл: 1654278379721.jpg -(7578 KB, 2000x2829, 1654278379721.jpg)
7578

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

>> No.201513  

>>201507

> или ты хотел сказать flock -n file1.lock command || flock file2.lock command ?

Вроде того. Я не в курсе твоего контекста.

>> No.201516  

>>201513
Может, так?

xargs --max-procs 20 -n 1 -d'\n' script1 |
xargs --max-procs 2 -n 1 -d'\n' script2

Если script1, хочет вызвать script2, то он пишет какую-нибудь строчку в stdout. Иначе ничего не пишет.

>> No.201582  

>>201505
Циклом с ps внутри.

>> No.201611  
Файл: 1654720276349.gif -(1 KB, 62x20, 1654720276349.gif)
1

>>201582

>> No.201757  
Файл: 1655254852966.jpg -(152 KB, 800x610, 1655254852966.jpg)
152

https://www.amule.org/ Не понимаю с какой стати торрент убил эту штуку. Так удобно же, поиск сразу из клиента, сервер на котором искать можно выбрать, самому что-то выложить - запросто.

>> No.202179  

Как с помощью ffmpeg перекодировать видео с целью уменьшения размера, но сохранения качества, не отличимого "не особо прихотливым" человеческим глазом от исходника?

>> No.202180  
Файл: 1657085839954.jpg -(282 KB, 1836x1973, 1657085839954.jpg)
282

>>202179

#!/bin/bash

DATE=$(date -Rr "$1")

Q_LVL="37"
C_FMT="yuv420p"
C_LOOP_FIX=""

IS_GIF=$(file "$1" -b | grep "GIF")

if [ -n "$IS_GIF" ] ; then
C_FMT="gbrp"
C_LOOP_FIX="-vsync cfr"
fi

NAME="${1##*/}"
PATHNAME="${1%/*}"
NAME="$(echo "${NAME%.*}" | head -c 250)"
BAK="$PATHNAME/$NAME".bak
NAME="$PATHNAME/$NAME".wm

_TMPNAME="$(basename "${1%/*}" | head -c 80)"
_BASE="$(basename "$1" | head -c 120)"
_OLDSIZE=$((`stat -c %s "$1"`))
TMPNAME="/tmp/$_TMPNAME$_BASE$_OLDSIZE".webm
PASSFILE="/tmp/$_TMPNAME$_BASE$_OLDSIZE"

ffmpeg -hide_banner -y -i "$1" -c:v libvpx-vp9 -b:v 0 -pix_fmt "$C_FMT" -crf "$Q_LVL" -cpu-used 1 -tile-columns 2 -tile-rows 1 -threads 8 -pass 1 -passlogfile "$PASSFILE" -an -f null /dev/null && ffmpeg -hide_banner -y -i "$1" $C_LOOP_FIX -c:v libvpx-vp9 -b:v 0 -pix_fmt "$C_FMT" -crf "$Q_LVL" -cpu-used 1 -tile-columns 2 -tile-rows 1 -threads 8 -pass 2 -passlogfile "$PASSFILE" -c:a libopus -b:a 32K "$TMPNAME"

#ffmpeg -hide_banner -y -i "$1" -c:v libaom-av1 -b:v 0 -pix_fmt yuv420p -crf "$Q_LVL" -threads 8 -tile-columns 2 -tile-rows 1 -pass 1 -passlogfile "$PASSFILE" -an -f null /dev/null && ffmpeg -hide_banner -y -i "$1" -c:v libaom-av1 -b:v 0 -pix_fmt yuv420p -crf "$Q_LVL" -threads 8 -tile-columns 2 -tile-rows 1 -pass 2 -passlogfile "$PASSFILE" -b:a 32K "$TMPNAME" #slow as shit

NEWSIZE=$((`stat -c %s "$TMPNAME"`+5000))

if [ -e "$TMPNAME" ] && [ `stat -c %s "$1"` -gt "$NEWSIZE" ] && [ "$NEWSIZE" -gt 10000 ] ; then
mv "$1" "$BAK" && mv -f "$TMPNAME" "$NAME" && touch -d "$DATE" "$NAME" && rm -f "$BAK"
else
mv -f "$1" "$NAME" && touch -d "$DATE" "$NAME"
fi

rm -f "$TMPNAME"
rm -f "$PASSFILE-0.log"

#find . -not -name "*.wm" -type f -printf '"%p"\n' | xargs -IF -P4 /_documents/librarium/.my_files/.scripts/compress_anim.sh F
>> No.202181  

>>202179
Выбрать лучший кодек? Полистай тред Мицгола по av1 на 410чане. Хотя я бы рекомендовал взять FFmpeg'овский подход Мицгола и натянуть его на av1an, посколько даже svt-av1 на нулевом пресете плохо параллелит. Но ты можешь попробовать и какой-нибудь третий пресет, если хочешь. Будет быстрее и параллелизация нормальная.

>> No.202182  
Файл: 1657089924969.png -(70 KB, 1678x377, 1657089924969.png)
70

>>202179
Зависит от того, что за видео, и сколько ты готов ждать.

>> No.202183  
Файл: 1657092152567.png -(1391 KB, 1251x1768, 1657092152567.png)
1391

>>202181
av1an, думаю, имеет смысл пользоваться вообще для достаточно длинного виедо: оно не только с av1, но и с vpx, x265 и x264 работает.

>> No.202184  

>>202180
Спасибо за скрипт чень(?), а что там за страшилки в NAME и PATHNAME?

>>202181

> Выбрать лучший кодек?

Да, я про них мало что знаю. Пресеты у x264 и прожорливость битрейта h264 с gpu ускорением это все мои познания в кодеках.

> Полистай тред Мицгола по av1 на 410чане

Ты имеешь ввиду тред с номером 156266? Забавно, конечно, по какой букве я его нашёл.

> посколько даже svt-av1 на нулевом пресете плохо параллелит

Я же правильно понял, что с ffmpeg'ом он не сможет в несколько потоков сразу работать эффективно или там под параллелизацией имеется ввиду что-то другое?

>>202182
В таблице видео шакалилось по минимуму и на выходе получился файл с чуть ли не двойным размером?

>> No.202185  
Файл: 1657094267004.jpg -(1890 KB, 2000x2000, 1657094267004.jpg)
1890

>>202184
это у меня общая логика работы с именами, чтоб можно было корректно применять к файлам типа додзя1/01.жпг ... додзя2/01.жпг, к одинаковым файлам, к файлам с длинными именами (==255), с длинными именами и cjk в них итд. эти же бэйсэднейм и в скриптах по сжатию картинок, и по распознаванию тох, итд.

>> No.202186  

>>202184

>Я же правильно понял, что с ffmpeg'ом он не сможет в несколько потоков сразу работать эффективно или там под параллелизацией имеется ввиду что-то другое?

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

>> No.202188  
Файл: 1657097622878.jpg -(1347 KB, 1705x1200, 1657097622878.jpg)
1347

>>202184

> двойным размером

Двойным относительно чего? В строке "Video MiB" указан размер именно видео — без аудио, в строке "File MiB" указан размер всего файла, который с аудио во FLAC. Исходник — MKV-файл, полученный перекодированием Blue-Ray'ного аниме эпизода, весившего 6 гигабайт, с crf=0/FLAC.

> не сможет в несколько потоков сразу работать эффективно или там под параллелизацией

Это верно про кодировщики вообще, хотя у aom и vpx с этим хуже. Например, если запустить ffmpeg с libx264 в 1 поток, результат будет чуть-чуть лучше качеством и меньше размером, чем если с threads=24 lookahead_threads=6 — так оно по умолчанию запускается на моём проце.
У av1an параллелизм по сегментам: видео разбивается на независимые отрывки, каждый из отрывков скармливается кодировщику, перекодированные кодировщиком отрывки сшиваются обратно.

>> No.202190  

>>202188

> Двойным относительно чего?

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

Вообщем уловил на что стоит обратить внимание. Так как имею многопоточный проц, буду пробовать av1 через av1an. Ну и vp9 заодно попробую, потому что быстрый. У него с многопотоком, кстати, получше чем у av1 ffmpeg'а?

>> No.202191  

>>202190
Смотри по процу.
https://stackoverflow.com/questions/41372045/vp9-encoding-limited-to-4-threads#41384506

>> No.202192  
Файл: 1657106872579.jpg -(8088 KB, 4093x2894, 1657106872579.jpg)
8088

>>202190

> У него с многопотоком, кстати, получше чем у av1 ffmpeg'а?

FFmpeg может в несколько av1 кодеков: rav1e, libsvtav1 и libaom-av1.
libaom-av1 основан на libvpx-vp9, поэтому там всё также плохо.
libsvtav1 основан на libx265, но вон >>202181 человек жалуется.

>> No.202193  

>>202192
Я не жалуюсь
https://github.com/AOMediaCodec/SVT-AV1/blob/master/Docs/CommonQuestions.md
На 4х потоках может и нормально будет, а скажем на 8ми наверное лучше av1an. Напомню, что я говорю о 0м пресете (1й и 2й наверное тоже под эту гребенку подходят).

>> No.202194  
Файл: 1657112254212.jpg -(449 KB, 2146x1586, 1657112254212.jpg)
449

>>202192
все имплементации ав1 кроме референса - хуита, и сжимают +/- на уровне вебп.

при этом они всё равно медленнее в несколько раз.

>> No.202195  

>>202194
Ты тред Мицгола листал? Судя по результатам, сжимает ав1 лучше, хоть и заметно дольше.

>> No.202197  
Файл: 1657119120514.jpg -(34 KB, 600x400, 1657119120514.jpg)
34

>>202195
это рефернсный либаом он на порядок дольше вп9. остальные хуита. я без всяких мицгёлов сравнивал.

>> No.202198  

>>202197
Он результаты сжатия прилагал. Где твои? Алсо, выражайся на человеческом, пожалуйста, а не на тоховском, я не понимаю о каких ты имплементациях говоришь. У меня в голове только aom, svt-av1 и rav1e.

>> No.202680  
tesseract input.jpg outputbase pdf

Создаст из картинки pdf с распознанным текстовым слоем.

>> No.202682  
Файл: 1660183006487.jpg -(172 KB, 1214x860, 1660183006487.jpg)
172

>>202198
аом это референсная имплементация. свт какая-то хуета, а рэйв имплементация на варенике. среди них картинки лучше чем шбм сжимает только аом. видосы я не сравнивал т.к. у аома время сжатия дольше чем полураспад протонов.
>>202680

> tesseract

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

>> No.202684  

>>202682
Так себе распознаный текстовый слой это все равно намного лучше чем полное отсутствие текстового слоя.

>> No.202688  
Файл: 1660212057481.jpg -(119 KB, 720x960, 1660212057481.jpg)
119

>>202684
ясно, закопайте.

абби, буквально гугл, буквально скрипт на питухоне и торч если нужно швабодку.

>> No.202689  
Файл: 1660212182393.jpg -(262 KB, 1289x908, 1660212182393.jpg)
262

>>202684
>>202688

>Tesseract with LSTM
>Tesseract 4.0 added a new OCR engine based on LSTM neural networks. It works well on x86/Linux with official Language Model data available for 100+ languages and 35+ scripts. See 4.0x-Changelog for more details.

ан нет, запилили. что ж ты меня морочишь?

>> No.202690  
Файл: 1660212442021.jpg -(129 KB, 400x310, 1660212442021.jpg)
129

>>202680
в тессеракте есть опция сжатия пдф/дежавью? только не "да/скорее всего", а конкретно как это делается.

чтоб большие блоки текста заменял текстом, формулы и картинки не трогал.

>> No.202691  

>>202688
Так выкладывай свой скрипт, я то свой выложил.
>>202689
Так четверка много лет назад вышла. Ты какой-то слоупок.
>>202690
Нету, потому что ненужно в 2022.

>> No.202692  
Файл: 1660213718002.webm -(767 KB, 1280x720, 1660213718002.webm)
767

>>202691

>Так четверка много лет назад вышла. Ты какой-то слоупок.
>> No.202693  

>>202692
Скрипт покажи.

>> No.202694  

>>202693
Щас погодь он напишет.

>> No.202695  
Файл: 1660240366957.jpg -(168 KB, 1280x720, 1660240366957.jpg)
168

>>202693
>>202694
https://www.gdpicture.com/guides/gdpicture/Compressing existing PDF documents using MRC Compreson .html

>> No.202696  
Файл: 1660241183592.png -(28 KB, 1356x789, 1660241183592.png)
28

>>202695

>> No.204666  

Все картинки в треде в виде галереи. Работает на разных бордах, 4чан, ычан, доброчан, тут.

javascript:(() => {
window.globalImageData = [
...document.querySelectorAll('form a[href], article.thread.post_is_op a[href]')
].filter(x =>
x.querySelector('img[src]') &&
!x.querySelector('img[src="/images/blank.png"]') &&
!x.outerHTML.match(/captcha|\/cgi-bin\//)
).map(x => {
var thumb = x.querySelector('img');

return {
thumb: thumb.src,
full: x.href,
width: thumb.width,
height: thumb.height
}
});

open(URL.createObjectURL(new Blob([
`
<!DOCTYPE html>
<html>
<head>
<title>Images</title>
<script src="https://unpkg.com/jquery"></script>
<script src="https://rawcdn.githack.com/nitinhayaran/Justified.js/05f947410aa5a74fdff14b65e135f90a111b3258/jquery.justified.js
"></script>
<link rel="stylesheet" href="https://rawcdn.githack.com/nitinhayaran/Justified.js/05f947410aa5a74fdff14b65e135f90a111b3258/jquery.justified.css
">
<style>
body {
font-family: Verdana, Geneva, sans-serif;
}
#header {
padding: 5px 2px;
width: 100%;
margin-bottom: 5px;
}
#header span {
padding-left: 1em;
line-height: 1.3rem;
font-weight: bold;
background: lightgrey;
}
#gallery {
padding: 5px;
border: 1px solid grey;
}
.gridThumb {display: none}
</style>
</head>
<body>
<!-- Start your code here -->
<div id="header"><span>??? images</span></div>
<div id="gallery">
</div>
<!-- End your code here -->
<script type="text/javascript">
$('#gallery').justifiedImages({
images: opener.globalImageData,
rowHeight: 150,
maximumRowHeight: 400,
thumbnailPath: (photo, width, height) => photo.thumb,
getSize: photo => ({width, height} = photo, {width, height}),
margin: 2,
/* Along with them it will also have following properties:
displayHeight : Height of the resulting image
displayWidth : Width of the resulting image
src : Path of the thumbnail
marginRight : Right margin for container div. Last thumbnail will have margin-right as 0px. */
template: photo => \`
<div class="photo-container"
style="height:\${photo.displayHeight}px;margin-right:2px;">
<a target="_blank" href="\${photo.full}">
<img class="image-thumb"
src="\${photo.src}" style="width: \${photo.displayWidth}px; height: \${photo.displayHeight}px;">
</a></div>\`
});

$('#header > span').text(opener.globalImageData.length + ' images from ' + opener.document.title);
</script>
</body>
</html>
`
], {type: 'text/html;charset=utf-8'})));
})()
>> No.204696  

>>201757
Возможно, из-за

> сервер

В 2022 такое бы просто не работало.

>> No.205048  

>>204666
Отличная работа. Схоронил.

>> No.205057  

>>205048
Спасибо на добром слове. На самом деле этот быстроскрипт был аж в 2020 написан. Мне всё хочется туда добавить фильтрацию по имени/размерам/цветам, и чтобы при изменении масштаба страницы его не ломало, но лапы не доходят.

>> No.207166  
Файл: 1666908638447.png -(182 KB, 500x479, 1666908638447.png)
182

Оказывается, если в цикле "while read" вызвать ещё один "read", файл не открывается заново и правильно читает строки в две переменные через одну. Можно ловко переименовывать файлы вимом.
Без файлового менеджера, без sed, awk, мозголомных глобов и башистских замен.

$ for f in *.mp3; do printf '%s\n%s\n' "$f" "$f"; done > list

Теперь в файле список, каждое название по два раза. Нечётная строка — исходный файл, чётная — целевой.
К вашим услугам вимовые макро и регэкспы. Остаётся только в начало этого списка дописать типа такого

while read old; do
read new
mv -- "$old" "$new"
done <<EOF

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

>> No.211226  

https://ntfy.sh
ntfy (pronounce: notify) is a simple HTTP-based pub-sub notification service. It allows you to send notifications to your phone or desktop via scripts from any computer, entirely without signup, cost or setup. It's also open source if you want to run your own.

>> No.211228  

>>211226
Нет версий, совместимых с устройством.

>> No.211251  
Файл: 1668399503310.jpg -(668 KB, 1883x2625, 1668399503310.jpg)
668

Лень лезть за кодом на другой комп, поэтому в виде идей:

1) at [+]HOUR:MINUTE

Более удобно чем sleep. часто запускаю в отдельной вкладке в tmux, называю вкладку например "таблетки" и жду когда tmux сообщит об активности, а пока работаю в других вкладках.
Можно и так: at TIME && do_something
"+" для указания времени относительно текущего момента.

2) = 4 / 3 + 7

Тупо wrapper вокуг eval-подобной функции. Удобнее чем $(( )), считает в double. Конечно если есть скобочки их нужно эскейпить или кавычить, но мне часто нужно тупо помножить/поделить без округления.

>> No.211253  
Файл: 1668415553412.jpg -(248 KB, 850x1202, 1668415553412.jpg)
248

>>211251

> at TIME && do_something

На старой работе была консольная тулза, которая умела стучаться тебе в рабочую телегу (адрес телеги сотрудника она каким-то образом узнавала сама). Если запустить что-то вроде do_something && ya alert, то ты получал сообщение по завершении.

>> No.211393  
Файл: 1668897815532.png -(164 KB, 1326x639, 1668897815532.png)
164

Извлекалка субтитров из mkv файлов. А то чото в mkvextract надо вручную смотреть эти номера дорожек. В ffmpeg тоже. С mkvtoolnix-gui вообще не разобрался - ничего не понятно.

Надеюсь вакаба не поломает.
Ruby можно легко установить в HOME с помощью https://rvm.io

ruby -rrake -rjson -e 'd=JSON.parse(%x(ffprobe -hide_banner -of json -v quiet -show_streams -show_format "#{ARGV[0]}"), object_class: OpenStruct); puts d.format.filename, $/; puts "%-5s %-50s %-10s %5s"%%w(id codec type lang); d.streams.each{|x| puts "%-5s %-50s %-10s %5s"%[x.index, x.codec_long_name, x.codec_type, x.tags.language] if defined? x.tags }; puts; d.streams.select{|x|x.codec_type=="subtitle"}.each{|x| puts "Writing track #{x.index} to #{ARGV[0].ext("#{x.index}.#{x.tags.language}.#{x.codec_name}")}"; print "Continue? y/N? "; $stdin.gets.strip[/y/i] ? (puts(%(ffmpeg -hide_banner -v fatal -i "#{ARGV[0]}" -c copy -map 0:#{x.index} "#{ARGV[0].ext("#{x.index}.#{x.tags.language}.#{x.codec_name}")}")); system(%(ffmpeg -hide_banner -v fatal -i "#{ARGV[0]}" -c copy -map 0:#{x.index} "#{ARGV[0].ext("#{x.index}.#{x.tags.language}.#{x.codec_name}")}")) ) : puts("Not writing to disk.") }' file.mkv

>> No.211398  

>>211393
Скрипт не скачал, но узнал много нового.

>> No.211579  

Редирект для твиттера для расширения Redirector, не ломающий ембед-твиты.

    {
"description": "Twitter -> Nitter",
"exampleUrl": "https://twitter.com/number/status/1479915991022792708",
"exampleResult": "https://nitter.nl/number/status/1479915991022792708",
"error": null,
"includePattern": "https?://(mobile\\.)?twitter.com/(.*)",
"excludePattern": "/embed|//(platform|syndication)\\.|timeline",
"patternDesc": "",
"redirectUrl": "https://nitter.nl/$2",
"patternType": "R",
"processMatches": "noProcessing",
"disabled": false,
"grouped": false,
"appliesTo": [
"main_frame",
"history"
]
},

Для работы такого редиректа перел этим нужно удалить service worker твиттера
1) В Chromium-based в chrome://serviceworker-internals/
2) В FF в about:debugging

>> No.214753  
#!/bin/sh
# get video files duration
# needed utils: ffprobe, bc
# usage:
# vd <file1> [file2] ..
set -e
deps='ffprobe bc'
for i in $deps; do
[ -x "$(command -v $i)" ] || {
echo "$0: $i is not found in PATH"; exit 1
}
done
usage() {
cat >&2 <<EOF
usage: vd [-ht] <file1> [file2] ..
-h show this help
-t print total duration only
EOF
}
# print video duration in seconds with decimal part
dur() {
ffprobe -v error -of default=nk=1:nw=1 \
-show_entries format=duration "$1"
}
# remove decimal dot and convert seconds to hh:mm:ss format
conv_time() {
sec=${1%.*}
h=$((sec / 3600))
m=$((sec / 60 % 60))
s=$((sec % 60))
 printf '%02d:%02d:%02d' $h $m $s
}
while getopts ht opt; do
case $opt in
h) usage ; exit 0 ;;
t) total_only=1 ; shift ;;
*) usage ; exit 1 ;;
esac
done
case $# in
0) usage ; exit 1 ;;
esac
total=0
for i; do
t=$(dur "$i")
total=$(echo $total + $t | bc -l)
[ "$total_only" ] || echo "$(conv_time $t) $i"
done
if [ $# -gt 1 ] || [ "$total_only" ]; then
echo "$(conv_time $total) total"
fi
>> No.214765  
Файл: 1681242393916.png -(3 KB, 115x159, 1681242393916.png)
3

Почему для mount есть опция -L, а для umount нет? Мне бы облегчило жизнь.

>> No.214768  

>>214765
Почему бы не отмонтировать по точке монтирования, к которой привязана label?

>> No.214769  
Файл: 1681252825543.png -(3 KB, 115x159, 1681252825543.png)
3

>>214768
Раз уж лучшего не предлагают, придётся создавать в /mnt/ директории с названиями по LABEL для каждой флешки — да, заранее, потому что параметр X-mount.mkdir доступен только при выполнении от рута.
mount(8):

> This functionality is supported only for root users or when
> mount executed without suid permissions.

КМК, у бинария /bin/mount обязательно должен быть suid.
Или есть другой путь? Только без systemd-mount/udisksctl.

>> No.214771  
Файл: 1681261037264.jpg -(1180 KB, 1318x1500, 1681261037264.jpg)
1180

>>214769
emerge uam

монтирует автоматом создаёт имя. ну или посмотри сорцы уама.

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

>> No.214774  

>>214769

> да, заранее

udev умеет хоть кофе заваривать при втыкании флешки.

> КМК, у бинария /bin/mount обязательно должен быть suid.

У него в любом случае должен быть suid.

>> No.214804  

>>214768
Так немного удобнее, чем просто по лейблу: нажимаешь альт+точка (readline: yank-last-arg), получаешь путь к точке монтирования в следующих командах; у меня мышечная память срабатывает, после монтирования делать ls.

>> No.214815  

>>214765

findmnt -o TARGET -nS LABEL="${label}"
>> No.215700  
Файл: 1685282106522.jpg -(106 KB, 1000x900, 1685282106522.jpg)
106

с помощью мышиного разума было напердолено ЛИНУКСРЕШЕНИЕ точно как я хотел

итак, скрепты

alacritty

#!/bin/bash
/usr/bin/alacritty msg create-window -e tmux.sh -e "$@" || /usr/bin/alacritty -e tmux.sh "$@" &

tmux.sh

#!/bin/bash
ISNEW="0"

if [ -z "$(tmux ls 2>/dev/null)" ]; then
tmux new-session -s M -d
ISNEW="1"
else
tmux new-session -d -t M
fi

if [[ "$1" == "-e" && -n "$2" ]]; then
shift
tmux new-window "$@"
else
tmux new-window &
fi

if (($ISNEW)); then
tmux previous-window
tmux kill-window
fi

tmux attach-session

/etc/tmux.conf

set -g        default-terminal "screen-256color"
set-option -g status-style "bg=black,fg=gold"

unbind-key -a

bind-key -n C-PgDn next-window
bind-key -n C-PgUp previous-window
bind-key -n C-Up new-window
bind-key -n C-Left select-pane -R
bind-key -n C-Right select-pane -L
bind-key -n C-Down split-window -h

bind-key -n S-PgUp copy-mode -u \; send-keys -X page-up
bind-key -n S-PgDn copy-mode -u \; send-keys -X page-down

setw -g mouse on
set-option -g detach-on-destroy off

что это даёт? а ты запусти, посмотри. кароч запускает в терминале темукс со своим новым окном, но с табами на все остальные терминалы. печатать в КАНСОЛЬ ничего не нужно. навигация по табам как в броузере. к сожалению копипаста работает только когда шифт прожат, и терминал по ctrl+d сразу не закрывается, надо убивать как любую другую прогу. так то!

>> No.215710  
Файл: 1685289661683.jpg -(177 KB, 1100x800, 1685289661683.jpg)
177

>>215700
бесполезно >>215709

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

дополнение

clitty

#!/bin/bash
if ! /usr/bin/alacritty msg create-window -e tmux.sh -e "$@"; then
/usr/bin/alacritty -e /bin/sh -c "xdo hide; exec /bin/sh" &
/usr/bin/alacritty -e tmux.sh "$@"
fi

тмукс.пердоль

#!/bin/bash
ISNEW="0"

if [ -z "$(tmux ls 2>/dev/null)" ]; then
tmux new-session -d -s M
ISNEW="1"
else
tmux new-session -d -t M
fi

if [[ "$1" == "-e" && -n "$2" ]]; then
shift
tmux new-window "$@"
else
tmux new-window &
fi

if (($ISNEW)); then
tmux previous-window
tmux kill-window
fi

export SHELL_PID=$$

tmux attach-session

конфа

set -g        default-terminal "screen-256color"
set-option -g status-style "bg=black,fg=gold"

unbind-key -a

bind-key -n C-PgDn next-window
bind-key -n C-PgUp previous-window
bind-key -n C-Up new-window
bind-key -n C-q select-pane -t :.+
bind-key -n C-Down split-window -h
bind-key -n C-x run-shell "kill -HUP $(tmux show-environment | grep 'SHELL_PID' | cut -d '=' -f2)" \; kill-window

bind-key -n S-PgUp copy-mode -u \; send-keys -X page-up
bind-key -n S-PgDn copy-mode -u \; send-keys -X page-down

setw -g mouse on
setw -g monitor-activity off
set -g visual-activity off
set -g bell-on-alert off
set -g bell-action none
set -g visual-bell off
set-option -g detach-on-destroy off

set-option -ga update-environment "SHELL_PID"
>> No.215717  
Файл: 1685338860495.png -(691 KB, 1262x1071, 1685338860495.png)
691
>> No.215719  
Файл: 1685362241273.jpg -(150 KB, 850x860, 1685362241273.jpg)
150

это как у япошек были святые меча, да, вот я так же святой консоле-пердольных дел. скорее даже мученик, я страдал за ваши ЛИНУКСГРЕХИ. последняя версия, ещё чёто хотел добавить на забыл что.

умеет:

  • скроллит по шифту, навигация как в лисе, ну собственно все настройки видны, все другие шорткаты нахуй выключены. скролл терминала надо ставить 0. единственное чего нет - колесо мыши не работает, ибо иначе будет пердолинг с выделением
  • если ты запустил терминал, и вышел в нём из кансоли - он тоже закрывается. то есть можно юзать как обычный терминал открыл закрыл. при этом убить процесс случайно закрыв терминал невозможно
  • стартует в PWD, как нормальная консоль
  • может запускать команды как обёртка "alacritty mpv песня.шбм"
  • 3.5 шортката, не нужны вим-педали
  • нескучный статусбар

конфиг

set -g status-right ""
set -g default-terminal "screen-256color"
set -g status-style "bg=black,fg=cyan"
set -g status-position top
set -g window-status-current-format "|#[fg=red]火#[default]#I #W"
set -g window-status-current-style bold
set -g window-status-format "| #I #W"
set -g window-status-style bold
set -g window-status-bell-style ""

unbind -a
unbind -T copy-mode -a

bind -n C-PgDn next-window
bind -n C-PgUp previous-window
bind -n C-t new-window
bind -n C-Up select-pane -t :.+
bind -n C-Down split-window -h
bind -n C-w send-keys C-w C-d
bind -n C-s run-shell "sh -c /usr/local/scripts/tmux_sort_tabs.sh"
bind -n C-q run-shell 'tmux set-environment SKIP_KILL 1 && tmux send-keys C-d'
set-hook -g pane-exited 'run-shell "[[ -z `tmux show-environment SKIP_KILL` ]] && kill -HUP $(tmux show-environment SHELL_PID | cut -d '=' -f2) || tmux set-environment -u SKIP_KILL"'

bind -n S-PgUp copy-mode -u \; send -X page-up
bind -n S-Up copy-mode -u \; send -X history-top

bind -T copy-mode PgDn send -X page-down
bind -T copy-mode S-PgDn send -X page-down
bind -T copy-mode Up send -X scroll-up
bind -T copy-mode Down send -X scroll-down
bind -T copy-mode S-Down send -X history-bottom
bind -T copy-mode Escape send -X cancel
bind -T copy-mode q send -X cancel
bind -T copy-mode C-c send -X cancel

set -g mouse off
set -g monitor-activity off
set -g visual-activity off
set -g bell-action none
set -g visual-bell off
set -g detach-on-destroy off

set -ga update-environment "SHELL_PID"

тмукс_сот_табс

#!/bin/bash
expected=0 # remap windows to {0..n}
tmux list-windows -t "$(tmux display-message -p '#S')" -F '#{window_index}' | sort -n | while read -r i; do
if (( i != expected )); then # If the current window index does not match our expected number, renumber it
tmux move-window -s "$i" -t "$expected"
fi
expected=$((expected+1)) # Increase our expected number for the next window
done

алскрити

#!/bin/bash
if ! /usr/bin/alacritty msg create-window -e tmux.sh "$PWD" "$@"; then
/usr/bin/alacritty -e /bin/sh -c "xdo hide; exec /bin/sh" &
/usr/bin/alacritty -e tmux.sh "$PWD" "$@"
fi

тмукс.пшш

#!/bin/bash
ISNEW="0"
if [ -d "$1" ]; then
cd "$1"
shift
fi

if [ -z "$(tmux ls 2>/dev/null)" ]; then
tmux new-session -d -s M
ISNEW="1"
else
#/usr/local/scripts/tmux_sort_windows.sh
tmux new-session -d -t M
fi

tmux new-window "$@"

if (($ISNEW)); then
tmux previous-window
tmux kill-window
fi

export SHELL_PID=$$

tmux attach-session

н-ну как?

>> No.215741  
Файл: 1685455534281.jpg -(659 KB, 1780x2360, 1685455534281.jpg)
659

обновлённые конфиги, в том числе поиск

#!/bin/bash
if ! /usr/bin/alacritty msg create-window -e tmux.sh "$PWD" "$@" 2>/dev/null ; then
/usr/bin/alacritty -e /bin/sh -c "xdo hide; /usr/bin/alacritty msg create-window -e tmux.sh $PWD $@; exec /bin/sh"
fi
set -g status-left ""
set -g status-right ""
set -g default-terminal "screen-256color"
set -g status-style "bg=black,fg=cyan"
set -g status-position top
set -g window-status-current-format "|#[fg=red]火#[default]#I #W"
set -g window-status-current-style bold
set -g window-status-format "| #I #W"
set -g window-status-style bold
set -g window-status-bell-style ""
set -g history-limit 100000
set -g default-shell "/bin/bash"

unbind -a
unbind -T copy-mode -a

bind -n C-PgDn next-window
bind -n C-S-PgDn next-window
bind -n C-n next-window
bind -n C-PgUp previous-window
bind -n C-S-PgUp previous-window
bind -n C-p previous-window
bind -n C-Up select-pane -t :.+
bind -n C-Down split-window -h

bind -n C-t run-shell 'tmux new-window -c "#{pane_current_path}"'
bind -n C-w run-shell 'tmux set-environment SKIP_KILL 1 && tmux send-keys Left C-d C-w'
bind -n C-s run-shell 'sh -c /usr/local/scripts/tmux_sort_tabs.sh'
bind -n C-q run-shell 'tmux set-environment SKIP_KILL 1 && tmux send-keys C-d'
set-hook -g pane-exited 'run-shell "[[ -z `tmux show-environment SKIP_KILL` ]] && kill -HUP $(tmux show-environment SHELL_PID | cut -d '=' -f2); tmux set-environment -u SKIP_KILL"'

bind -T copy-mode C-r command-prompt -i -I "#{pane_search_string}" -T search -p "(search up)" { send-keys -X search-backward-incremental "%%" }
bind -T copy-mode C-s command-prompt -i -I "#{pane_search_string}" -T search -p "(search down)" { send-keys -X search-forward-incremental "%%" }

bind -n C-S-Left swap-window -t -1 \; previous-window
bind -n C-S-Right swap-window -t +1 \; next-window

bind -n Escape copy-mode -u
bind -n S-PgUp copy-mode -u \; send -X page-up
bind -n S-Up copy-mode -u \; send -X history-top
bind -n S-Down copy-mode -u \; send -X history-bottom

bind -T copy-mode PgUp send -X page-up
bind -T copy-mode PgDn send -X page-down
bind -T copy-mode S-PgDn send -X page-down
bind -T copy-mode Up send -X scroll-up
bind -T copy-mode Down send -X scroll-down
bind -T copy-mode Escape send -X cancel
bind -T copy-mode Space send -X cancel
bind -T copy-mode Enter send -X cancel
bind -T copy-mode q send -X cancel
bind -T copy-mode C-c send -X cancel

set -g mouse off
set -g monitor-activity off
set -g visual-activity off
set -g bell-action none
set -g visual-bell off
set -g detach-on-destroy off

set -ga update-environment "SHELL_PID"
>> No.215750  
Файл: 1685511774773.jpg -(858 KB, 2800x1800, 1685511774773.jpg)
858

dash кот-то юзает? хочу ускорить скрепты.

>> No.215751  
Файл: 1685512328187.jpg -(162 KB, 700x850, 1685512328187.jpg)
162

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

>> No.215783  
Файл: 1685771687344.png -(1825 KB, 1920x1080, 1685771687344.png)
1825

https://www.youtube.com/watch?v=dFkGNe4oaKk

>> No.215785  

>>215750
Хочешь ускорить скрипты — не пиши их на шелле.

>> No.215957  
Файл: 1686595331950.jpg -(2003 KB, 1591x1812, 1686595331950.jpg)
2003

С оглядкой на то, что я бомбанувший любитель, норм или не норм? Сетап галимого опенвпн.

/usr/local/bin/start_openvpn.sh:

#!/bin/bash

if [[ -e /etc/openvpn/openvpn.pid ]]; then
echo "Already running." > /dev/stderr
exit 1
fi

set -eo pipefail
set -u

# openvpn cgroup is always allowed and is not rerouted anywhere
# user cgroup is routed in special table
OPENVPN_CG="openvpn-evade"
OPENVPN_CG_CLASSID="0x0000000b"
OPENVPN_CG_GROUP="root"
USER_CG="user-evade"
USER_CG_CLASSID="0x0000000c"
USER_CG_GROUP="novpn"

# mount net_cls
if ! findmnt /sys/fs/cgroup/net_cls &> /dev/null; then
mkdir -p /sys/fs/cgroup/net_cls
mount -t cgroup -onet_cls net_cls /sys/fs/cgroup/net_cls
fi

create_net_cls_cgroup () {
local cg="$1" cggid="$2" cgclassid="$3"

if [[ ! -d "/sys/fs/cgroup/net_cls/$cg" ]]; then
cgcreate -t root:"$cggid" -a root:"$cggid" -d 775 -f 664 -s 664 -g net_cls:"$cg"
echo "$cgclassid" > /sys/fs/cgroup/net_cls/"$cg"/net_cls.classid
fi
}

create_net_cls_cgroup "$OPENVPN_CG" "$OPENVPN_CG_GROUP" "$OPENVPN_CG_CLASSID"
create_net_cls_cgroup "$USER_CG" "$USER_CG_GROUP" "$USER_CG_CLASSID"

# https://www.kernel.org/doc/html/latest/networking/ip-sysctl.html
# needed for firewall
sysctl -w net.ipv4.conf.all.src_valid_mark=1

# apply nft rules

# in case it's not the first run
if nft list table inet openvpn-custom-table &>/dev/null; then
nft -f - <<EOF
table inet tmp-custom-table {
chain drop_all_1 {
type filter hook input priority filter; policy drop
}
chain drop_all_2 {
type filter hook output priority filter; policy drop
}
}

delete table inet openvpn-custom-table
EOF
fi

# apply main table
nft -f - <<EOF
table inet openvpn-custom-table {
chain set-fwmark {
type route hook output priority mangle; policy accept;
meta cgroup $OPENVPN_CG_CLASSID counter meta mark set $OPENVPN_CG_CLASSID
meta cgroup $USER_CG_CLASSID counter meta mark set $USER_CG_CLASSID
}

chain copy-to-ct-mark {
type filter hook postrouting priority mangle; policy accept;
meta mark $USER_CG_CLASSID ct mark set meta mark
}

chain restore-fwmark-from-ct {
type filter hook prerouting priority mangle; policy accept;
meta mark set ct mark
}

chain output {
type filter hook output priority filter; policy drop
# idk
ct state invalid drop
# allow marked shit
meta mark $OPENVPN_CG_CLASSID counter accept
meta mark $USER_CG_CLASSID counter accept
# allow lan regardless of cgroup
ip daddr 192.168.0.0/16 counter accept
oifname "tun*" counter accept
oifname "lo" counter accept
counter reject
}

chain input {
type filter hook input priority filter; policy drop
# idk
ct state invalid drop
# allow lan
ip saddr 192.168.0.0/16 counter accept
iifname "lo" counter accept
# not listening to outer world, fuck off
ct state established,related counter accept
counter reject
}
}
EOF

# remove tmp table
if nft list table inet tmp-custom-table &>/dev/null; then
nft delete table inet tmp-custom-table
fi

# now about the rerouting...
# the routes are added by openvpn inself, it's far more convenient
if [[ -z $(ip rule | grep 'lookup novpn') ]]; then
ip rule add fwmark $USER_CG_CLASSID lookup table novpn
fi

# "$@"
cgexec -g net_cls:$OPENVPN_CG -- openvpn --route-up /etc/openvpn/route_up.sh \
"$@"

/etc/openvpn/route_up.sh:

#!/bin/bash

# don't ask why grep
trysrc="$(ip route get $route_net_gateway | grep $route_net_gateway)"
trysrc=($trysrc)
src=""
for (( i = 0; i < ${#trysrc[@]} - 1; i++ )); do
if [[ ${trysrc[$i]} = "src" ]]; then
src="${trysrc[$i + 1]}"
break
fi
done

ipcmd="ip route add default via $route_net_gateway"
if [[ -n $src ]]; then
ipcmd="$ipcmd src $src"
fi

ipcmd="$ipcmd table novpn"

if [[ -z $(ip r l t novpn) ]]; then
$ipcmd
fi

/usr/lib/dhcpcd/dhcpcd-hooks/10-openvpn:

openvpn_pid=""
openvpn_pid_file="/etc/openvpn/openvpn.pid"

if [ ! -e "$openvpn_pid_file" ]; then
exit 0
fi
openvpn_pid="$(cat "$openvpn_pid_file")"

if [ "$reason" = "BOUND" ] || [ "$reason" = "BOUND6" ]; then
kill -s 10 "$openvpn_pid"
fi
unset openvpn_pid openvpn_pid_file

/etc/systemd/system/openvpn.service:

[Unit]
Description=OpenVPN service (custom)
After=multi-user.target
Requires=multi-user.target
[Service]
Type=simple
ExecStart=/usr/local/bin/start_openvpn.sh --config %i.conf \
--connect-retry 5 30 --writepid /etc/openvpn/openvpn.pid
ExecStop=bash -c 'a=/etc/openvpn/openvpn.pid ; [[ -e $a ]] && rm $a'
WorkingDirectory=/etc/openvpn/xeovo

[Install]
WantedBy=multi-user.target
>> No.215958  

Да, обьебался немного

chain copy-to-ct-mark {
type filter hook postrouting priority mangle; policy accept;
meta mark $USER_CG_CLASSID counter ct mark set meta mark
meta mark $OPENVPN_CG_CLASSID counter ct mark set meta mark
}
>> No.215966  

Ну и

if [[ -z $(ip rule | grep 'lookup novpn') ]]; then
ip rule add fwmark $USER_CG_CLASSID lookup table novpn
fi

в конец route_up.sh

>> No.215967  
Файл: 1686657798231.jpg -(12 KB, 733x153, 1686657798231.jpg)
12

Почему вы все такие башисты?

>> No.215968  

Не работает нихуя. Пиздец, у wireguard работает, а у меня нет. Я же блять то же самое делаю, скопировал meta mark в ct mark, а потом обратно. У wireguard таблицу правильно выбирает, у меня нет. Точнее, таблицу-то оно правильно выбирает, но scr стоит тот, что на tun0, а не тот, который должен быть согласно таблицу, в которую он попадает. В итоге оно возвращает на этот же src и пакеты возрвращаются хуй пойми куда. Как блять эта залупа работает, пиздец полный.

https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg

Бесполезная диаграмма. Пидорасы предлагают читать сорцы netfilter'а, вообще охуели мрази.

>> No.215969  

ИЧСХ masquerade решает проблему просто каким-то магическим образом. А как при этом wireguard работает без этой костыльной хуйни — загадка, я таблицы буквально скопипастил.

>> No.215975  

>>215969
Ты вообще что сделать-то хотел?

>> No.215978  

>>215975
В рандоме посмотри.

>> No.215996  

Ладно, работает вроде и слава богу. Настроичка галимого openvpn, что бы по cgexec -g net_cls:novpn -- $@ процесс работал вне туннеля. Добавляете себя в novpn группу и
/usr/local/bin/start_openvpn:

#!/bin/bash

if [[ -e /etc/openvpn/openvpn.pid ]]; then
echo "Already running." > /dev/stderr
exit 1
fi

set -eo pipefail
set -u

source /etc/openvpn/variables.sh

# mount net_cls
if ! findmnt /sys/fs/cgroup/net_cls &> /dev/null; then
mkdir -p /sys/fs/cgroup/net_cls
mount -t cgroup -onet_cls net_cls /sys/fs/cgroup/net_cls
fi

create_net_cls_cgroup () {
local cg="$1" cggid="$2" cgclassid="$3"

if [[ ! -d "/sys/fs/cgroup/net_cls/$cg" ]]; then
cgcreate -t root:"$cggid" -a root:"$cggid" -d 775 -f 664 -s 664 -g net_cls:"$cg"
echo "$cgclassid" > /sys/fs/cgroup/net_cls/"$cg"/net_cls.classid
fi
}

create_net_cls_cgroup "$OPENVPN_CG" "$OPENVPN_CG_GROUP" "$OPENVPN_CG_CLASSID"
create_net_cls_cgroup "$USER_CG" "$USER_CG_GROUP" "$USER_CG_CLASSID"

# https://www.kernel.org/doc/html/latest/networking/ip-sysctl.html
# needed for firewall
sysctl -w net.ipv4.conf.all.src_valid_mark=1

# apply nft rules

# in case it's not the first run
if nft list table inet openvpn-custom-table &>/dev/null; then
nft -f - <<EOF
table inet tmp-custom-table {
chain drop_all_1 {
type filter hook input priority filter; policy drop
}
chain drop_all_2 {
type filter hook output priority filter; policy drop
}
}

delete table inet openvpn-custom-table
EOF
fi

# apply main table
nft -f - <<EOF
table inet openvpn-custom-table {
chain ct-mark-back-to-fwmark {
type filter hook prerouting priority mangle; policy accept;
ct mark $USER_CG_CLASSID meta mark set ct mark
}

chain mark-user-traffic-to-reroute-it {
type route hook output priority mangle; policy accept;
meta cgroup $USER_CG_CLASSID meta mark set meta cgroup
}

chain store-fwmark-in-ctmark {
type filter hook postrouting priority mangle; policy accept;
meta mark $USER_CG_CLASSID ct mark set meta mark
}

chain change-src-ip-of-user-traffic {
type nat hook postrouting priority srcnat; policy accept;
ct mark $USER_CG_CLASSID masquerade
}

chain output {
type filter hook output priority filter; policy drop
# idk
ct state invalid drop
meta cgroup $OPENVPN_CG_CLASSID counter accept
meta cgroup $USER_CG_CLASSID counter accept
# allow lan regardless of cgroup
ip daddr 192.168.0.0/16 counter accept
oifname "tun*" counter accept
oifname "lo" counter accept
counter reject
}

chain input {
type filter hook input priority filter; policy drop
# idk
ct state invalid drop
# allow lan
ip saddr 192.168.0.0/16 counter accept
iifname "lo" counter accept
# not listening to outer world, fuck off
ct state established,related counter accept
counter reject
}

chain forward {
type filter hook forward priority filter; policy accept;
counter drop
}
}
EOF

# remove tmp table
if nft list table inet tmp-custom-table &>/dev/null; then
nft delete table inet tmp-custom-table
fi

# "$@"
cgexec -g net_cls:$OPENVPN_CG -- openvpn --route-up /etc/openvpn/route_up.sh \
"$@"

/etc/openvpn/route_up.sh:

#!/bin/bash

source /etc/openvpn/variables.sh

# don't ask why grep
trysrc="$(ip route get $route_net_gateway | grep $route_net_gateway)"
trysrc=($trysrc)
src=""
for (( i = 0; i < ${#trysrc[@]} - 1; i++ )); do
if [[ ${trysrc[$i]} = "src" ]]; then
src="${trysrc[$i + 1]}"
break
fi
done

ipcmd="ip route add default via $route_net_gateway"
if [[ -n $src ]]; then
ipcmd="$ipcmd src $src"
fi

ipcmd="$ipcmd table novpn"

if [[ -z $(ip r l t novpn) ]]; then
$ipcmd
fi

if [[ -z $(ip rule | grep 'lookup novpn') ]]; then
ip rule add fwmark $USER_CG_CLASSID lookup novpn
fi

/etc/openvpn/variables.sh:

# source it

# openvpn cgroup is always allowed and is not rerouted anywhere
# user cgroup is routed in special table
OPENVPN_CG="openvpn-evade"
OPENVPN_CG_CLASSID="0xabcdef01"
OPENVPN_CG_GROUP="root"
USER_CG="user-evade"
USER_CG_CLASSID="0xabcdef02"
USER_CG_GROUP="novpn"

Что бы эта дура не recursive routing detected себя каждый раз, когда вы меняете сеть
/usr/lib/dhcpcd/dhcpcd-hooks/11-openvpn:

openvpn_pid=""
openvpn_pid_file="/etc/openvpn/openvpn.pid"

if [ ! -e "$openvpn_pid_file" ]; then
unset openvpn_pid openvpn_pid_file
return 0
fi
openvpn_pid="$(cat "$openvpn_pid_file")"

if [ "$reason" = "BOUND" ] || [ "$reason" = "BOUND6" ]; then
kill -s 10 "$openvpn_pid"
fi
unset openvpn_pid openvpn_pid_file

Ну и юнит системдишный.

[Unit]
Description=OpenVPN service (custom)
After=multi-user.target
Requires=multi-user.target

[Service]
Type=simple
ExecStart=/usr/local/bin/start_openvpn.sh --config %i.conf \
--connect-retry 5 30 --writepid /etc/openvpn/openvpn.pid
ExecStop=bash -c 'a=/etc/openvpn/openvpn.pid ; [[ -e $a ]] && rm $a'
WorkingDirectory=/etc/openvpn/xeovo

[Install]
WantedBy=multi-user.target
>> No.215997  

Ну и если хотите можно

[[ -z $(cmd) ]]

на

! cmd &>/dev/null

поменять, но мне как-то похуй.

>> No.215998  
Файл: 1686688248252.jpg -(415 KB, 1938x1320, 1686688248252.jpg)
415

>>215996

>Настроичка галимого openvpn, что бы по cgexec -g net_cls:novpn -- $@ процесс работал вне туннеля

я так и понял

смари:

/usr/local/scripts/daemonize.sh openvpn --up /etc/openvpn/netns.sh --route-up /etc/openvpn/netns.sh --config /etc/openvpn/openvpn.conf &

ip link add type veth
ip link set veth0 up
ip address add 14.89.14.2/30 dev veth0
ip link set veth1 netns vpn
ip netns exec vpn ip link set veth1 up
ip netns exec vpn ip address add 14.89.14.1/30 dev veth1

ip netns exec vpn tinyproxy &

_______________________^тини через фоксипрокси позволяет тонко настраивать куда что и как
/etc/openvpn/netns.sh

#!/bin/sh
case $script_type in
up)
ip netns exec vpn ip link set dev lo up
ip link set dev "$1" up netns vpn mtu "$2"
ip netns exec vpn ip addr add dev "$1" \
"$4/${ifconfig_netmask:-30}" \
${ifconfig_broadcast:+broadcast "$ifconfig_broadcast"}
if [ -n "$ifconfig_ipv6_local" ]; then
ip netns exec vpn ip addr add dev "$1" \
"$ifconfig_ipv6_local"/112
fi
;;
route-up)
ip netns exec vpn ip route add default via "$route_vpn_gateway"
if [ -n "$ifconfig_ipv6_remote" ]; then
ip netns exec vpn ip route add default via \
"$ifconfig_ipv6_remote"
fi
;;
down)
;;
esac

проги запускаются через

#!/bin/bash
sudo ip netns exec vpn su user -c '"$0" "$@"' -- "${@}" >/dev/null 2>&1 &
>> No.216000  
Файл: 1686727061483.gif -(0 KB, 84x20, 1686727061483.gif)
0

>>215998
Ты скопипастил чужой скрипт и подогнал его под veth, а я свой написал.
http://www.naju.se/articles/openvpn-netns.html
И я так уже делал, мне не понравился костыль с sudo. Я cgexec без рут прав вызываю, потому что у меня юзер в кошерной группе находится. Коли на то пашло можно такой же костыль сделать через --route-noexec и --route-up, пихнуть туннель в отдельную таблицу и туда пихать только траффик из какой-то сгруппы. И с veth долбиться не надо (я так ни разу и не смог его правильно настроить) и рут прав не надо для запуска.

>> No.216013  

у меня впечатление, что вы >>215998 >>216000 в какой-то конфе проживаете

>> No.216017  

>>216013
Крестись. Лечись.

с: unage

>> No.217037  

Вам скинули PNG файл с присученным зип архивом. Что делать?

convert orig.png new.png

Вам скинули JPG файл с присученным зип архивом. Что блять делать?

jpegtran < orig.jpg > new.jpg

Вам скинули WEBP файл с присученным зип архивом. Ну сука! Но и здесь есть выход, не привлекающий дополнительные потери.

#define _POSIX_C_SOURCE 200809L
#include <errno.h>
#include <libgen.h>
#include <sys/stat.h>
#include <stdarg.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
// DEBUG
#include <mcheck.h>

char *
normal_person_strcat_2 (const char *fst, const char *snd) {
char *cat;
int fstLen, sndLen;
fstLen = strlen(fst);
sndLen = strlen(snd);
cat = malloc(sizeof(char) * (fstLen + sndLen + 1));
memset(cat, '\0', sizeof(char) * (fstLen + sndLen + 1));
int i;
for (i = 0; i < fstLen + sndLen; i++) {
if (i < fstLen)
cat[i] = fst[i];
else
cat[i] = snd[i - fstLen];
}
return cat;
}
char *
normal_person_strcat (int cnt, ...) {
va_list args;
char *cat, *buf;
va_start(args, cnt);
cat = malloc(sizeof(char));
cat[0] = '\0';
int i;
for (i = 0; i < cnt; i++) {
buf = va_arg (args, char *);
buf = normal_person_strcat_2 (cat, buf);
free(cat);
cat = buf;
}
va_end (args);
return cat;
}

void
print_usage (FILE *stream, const char *argv0) {
char *msg;
char *name, *buf;
buf = strdup(argv0);
name = basename(buf);
msg = normal_person_strcat(
3,
"usage: ",
name,
" filename\n"
);
fprintf(stream, msg);
free(msg);
free(buf);
}

void
fread_write_fail (const char *read_write, size_t ret, size_t expected) {
char *verb;
if (strcmp(read_write, "read") == 0)
verb = strdup("read");
else
verb = strdup("written");

if (ret != expected) {
fprintf(
stderr, "%s() failed: %zu chunks %s\n",
read_write,
ret,
verb
);
exit(EXIT_FAILURE);
}
free(verb);
}

#define fread_fail(a, b) { fread_write_fail ("read", a, b); }
#define fwrite_fail(a, b) { fread_write_fail ("write", a, b); }

size_t
my_fread (void *ptr, size_t size, size_t nmemb, FILE *stream) {
size_t ret;
ret = fread (ptr, size, nmemb, stream);
fread_fail (ret, nmemb);
return ret;
}

size_t
my_fwrite (const void *ptr, size_t size, size_t nmemb, FILE *stream) {
size_t ret;
ret = fwrite (ptr, size, nmemb, stream);
fwrite_fail (ret, nmemb);
return ret;
}


int
main (int argc, char **argv) {
/* DEBUG */
// https://www.gnu.org/software/libc/manual/html_node/Tracing-malloc.html
mtrace();
if (argc != 2) {
print_usage (stderr, argv[0]);
return EXIT_FAILURE;
}
int ret;
/* Check if it's regular file, LOL */
struct stat sb;
ret = stat (argv[0], &sb);
if (ret) {
fprintf(stderr, "stat() failed: ");
perror(argv[0]);
return EXIT_FAILURE;
}

if (!S_ISREG(sb.st_mode)) {
fprintf(stderr, "%s is not regular file!\n", argv[0]);
return EXIT_FAILURE;
}

FILE *webp_file;
webp_file = fopen(argv[1], "r");
if (NULL == webp_file) {
perror(argv[1]);
return EXIT_FAILURE;
}
/* Read WEBP header */
fprintf(stderr, "Reading webp header...\n");
char chunk[4];
uint32_t filesize;
my_fread (chunk, 1, 4, webp_file);
printf("This must be 'RIFF': %s\n", chunk);
if (strncmp("RIFF", chunk, sizeof(char) * 4)) {
fprintf(stderr, "'%s' is not webp file.\n", argv[1]);
return EXIT_FAILURE;
}
my_fread (&filesize, 1, 4, webp_file);
printf("This must be filesize: %u\n", filesize);
my_fread (chunk, 1, 4, webp_file);
printf("This must be 'WEBP': %s\n", chunk);
if (strncmp("WEBP", chunk, sizeof(char) * 4)) {
fprintf(stderr, "'%s' is not webp file.\n", argv[1]);
return EXIT_FAILURE;
}
/* Read WEBP payload */
fprintf(stderr, "Reading webp payload...\n");
fprintf(stderr, "Expected read size: %u\n", filesize - 4);
char webp_payload[filesize - 4];
my_fread (webp_payload, 1, filesize - 4, webp_file);
fclose(webp_file);
/* Write stripped file */
fprintf(stderr, "Writing new file...\n");
ret = strlen(argv[1]) + strlen("/_orig") + 1;
char new_webp_name[ret];
char *dir, *name, *path;
FILE *new_webp;
path = strdup(argv[1]);
dir = dirname(path);
name = basename(path);
memset(new_webp_name, '\0', sizeof(char) * ret);
sprintf(new_webp_name, "%s/%s%s", dir, "orig_", name);
free(path);
errno = 0;
ret = access(new_webp_name, F_OK);
if (errno != 0 && errno != ENOENT) {
perror(new_webp_name);
return EXIT_FAILURE;
}
if (!ret) {
printf("%s alread exists.\n", new_webp_name);
return EXIT_FAILURE;
}
new_webp = fopen(new_webp_name, "w+");
if (NULL == new_webp) {
perror(new_webp_name);
return EXIT_FAILURE;
}
my_fwrite("RIFF", sizeof(char), 4, new_webp);
my_fwrite(&filesize, sizeof(uint32_t), 1, new_webp);
my_fwrite("WEBP", sizeof(char), 4, new_webp);
my_fwrite(webp_payload, sizeof(char), filesize - 4, new_webp);
fclose(new_webp);
}

По идее, это ламерское говно, но посколько оно работает, мне как-то похуй. Если хотите улучшайте-дополняйте.

>> No.217038  

Блджад!!

ret = stat (argv[0], &sb);

нужно заменить на

ret = stat (argv[1], &sb);

а

fprintf(stderr, "%s is not regular file!\n", argv[0]);

на

fprintf(stderr, "'%s' is not regular file!\n", argv[1]);

Ну и mtrace() убрать.

>> No.217039  

>>217037

> Но и здесь есть выход, не привлекающий дополнительные потери.

Как-то многословно. Вот у меня получился вариант попроще, правда linux-only:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <inttypes.h>
#include <unistd.h>

int main(int argc, char **argv) {
if (argc != 3) {
printf("Usage: %s input.webp output.webp\n", argv[0]);
return 1;
}
int input_fd;
input_fd = open(argv[1], O_RDONLY);
if (input_fd == -1) {
printf("Input file '%s' open error: %s\n", argv[1], strerror(errno));
return 2;
}
uint32_t header = 0;
read(input_fd, &header, 4);
if (header != 0x46464952) { // RIFF header
printf("RIFF header read error: %x\n", header);
return 3;
}
read(input_fd, &header, 4);
header+=8;
int output_fd;
output_fd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 00644);
if (output_fd == -1) {
printf("Output file '%s' open error: %s\n", argv[2], strerror(errno));
return 3;
}
lseek(input_fd, 0, SEEK_SET);
ssize_t bytes_written;
bytes_written = copy_file_range(input_fd, NULL, output_fd, NULL, header, 0);
if (bytes_written == -1) {
printf("Output file '%s' write error: %s\n", argv[2], strerror(errno));
return 4;
}
if (bytes_written != (ssize_t)header) {
printf("Written %u instead of %u bytes\n", (uint32_t)bytes_written, header);
return 5;
}
return 0;
}
>> No.217041  

>>217039
Если убрать по приколу написанную normal_person_strcat функцию, то в принципе мой вариант тоже не такой уж и большой.
А еще вместо argv[0] кмк более смотрибельным является basename(argv[0]).

>> No.217042  

>>217041
У тебя сам main() 85 строк против 38, в которых очень много странной логики, вроде вычитывания всего файла целиком в память, что впринципе ок на небольших файлах, но не ок на больших.

>> No.217045  

>>217037
Для PNG с не более 8 битов на цвет и размером не более 16384x16384:
cwebp -lossless -metadata all -m 6 -z 9 -q 100 i.png -o o.webp

>> No.217051  

>>217042
У тебя не правильная проверка заголовка.
https://developers.google.com/speed/webp/docs/riff_container

А еще ты второй файл перезаписываешь без спросу.

#define _POSIX_C_SOURCE 200809L
#include <errno.h>
#include <libgen.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/*
* WEBP is basen on RIFF, which is little-endian.
* hexdump gives 0x52494646u for 'RIFF' and 0x57454250u for 'WEBP', so yoy need
* to swap that to get litte-endian result. It's for easier header validity
* check.
*/
#define HEXCODE_RIFF 0x46464952u
#define HEXCODE_WEBP 0x50424557u
#define tryfread(a, b, c, d) (fread(a, b, c, d) == c)
#define tryfwrite(a, b, c, d) (fwrite(a, b, c, d) == c)

int
main (int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <input_file_name>\n",
basename(argv[0]));
return EXIT_FAILURE;
}
FILE *webp_file;
uint32_t header[3];
webp_file = fopen(argv[1], "r");
if (NULL == webp_file) {
perror(argv[1]);
return EXIT_FAILURE;
}
if (!tryfread(header, 1, sizeof(uint32_t) * 3, webp_file)) {
fprintf(stderr, "%s: Error reading header: %s\n", argv[1],
strerror(errno));
return EXIT_FAILURE;
}
if (header[0] != HEXCODE_RIFF || header[2] != HEXCODE_WEBP) {
fprintf(stderr, "%s: not a valid WEBP file\n", argv[1]);
return EXIT_FAILURE;
} else if (isatty(1)) {
fprintf(stderr, "Refusing to write to terminal\n");
return EXIT_FAILURE;
} else if (fseek(webp_file, 0, SEEK_SET) == -1) {
perror("fseek()"); // should not happen (TM)
return EXIT_FAILURE;
}
uint32_t i;
char buf;
for (i = 0; i < header[1] + 8; i++) {
if(!tryfread(&buf, 1, 1, webp_file) ||
!tryfwrite(&buf, 1, 1, stdout)) break;
}
if (i != header[1] + 8) {
fprintf(stderr, "%s: Copying file failed: %s\n", argv[1],
strerror(errno));
fprintf(stderr, "Copied %u bytes instead of %u\n", i,
header[1] + 8);
return EXIT_FAILURE;
}
}
>> No.217052  

В идеале еще htole32 использовать на header[0] и header[2].

>> No.217053  

>>217052
Хотя они нестандартные. Впрочем, это проблемы стандартов.

>> No.217054  

Побайтовое копирование очень медленное. Есть какой-то стандарный способ это ускорить? Или только через read() и write() кусками по несколько килобайт писать?

>> No.217055  

Кароче кусками по 4096 байта нормально получается.

#define _POSIX_C_SOURCE 200809L
#define _DEFAULT_SOURCE
#include <endian.h>
#include <errno.h>
#include <libgen.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/*
* WEBP is basen on RIFF, which is little-endian.
* hexdump gives 0x52494646u for 'RIFF' and 0x57454250u for 'WEBP', so yoy need
* to swap that to get litte-endian result. It's for easier header validity
* check.
*/
#define HEXCODE_RIFF 0x46464952u
#define HEXCODE_WEBP 0x50424557u
#define CPCHUNK 4096u
#define tryfread(a, b, c, d) (fread(a, b, c, d) == c)
#define tryfwrite(a, b, c, d) (fwrite(a, b, c, d) == c)
#define trycopy(a, b, c, d) (tryfread(a, b, c, d) && \
tryfwrite(a, b, c, stdout))

int
main (int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <input_file_name>\n",
basename(argv[0]));
return EXIT_FAILURE;
}
FILE *webp_file;
uint32_t header[3];
webp_file = fopen(argv[1], "r");
if (NULL == webp_file) {
perror(argv[1]);
return EXIT_FAILURE;
}
if (!tryfread(header, 1, sizeof(uint32_t) * 3, webp_file)) {
fprintf(stderr, "%s: Error reading header: %s\n", argv[1],
strerror(errno));
return EXIT_FAILURE;
}
if (htole32(header[0]) != HEXCODE_RIFF ||
htole32(header[2]) != HEXCODE_WEBP) {
fprintf(stderr, "%s: not a valid WEBP file\n", argv[1]);
return EXIT_FAILURE;
} else if (isatty(1)) {
fprintf(stderr, "Refusing to write to terminal\n");
return EXIT_FAILURE;
} else if (fseek(webp_file, 0, SEEK_SET) == -1) {
perror("fseek()"); // should not happen (TM)
return EXIT_FAILURE;
}
uint32_t i, cp;
char buf, chunk[CPCHUNK];
header[1] += 8; // full file length
/* Copy using big chunks */
for (i = 0; i < header[1] / CPCHUNK; i++, cp += CPCHUNK)
if (!trycopy(chunk, CPCHUNK, 1, webp_file)) goto end;
/* Copy the rest by byte */
for (; cp < header[1] && trycopy(&buf, 1, 1, webp_file); cp++);
end:
if (cp != header[1]) {
fprintf(stderr, "%s: Copying file failed: %s\n", argv[1],
strerror(errno));
fprintf(stderr, "Copied %u bytes instead of %u\n", i,
header[1] + 8);
return EXIT_FAILURE;
}
}
>> No.217056  

>>217054
Есть, например, sendfile.
Можно копировать по long-ам; всяко быстрее, чем по байтам.
Можно поглядеть на исходники cp в coreutils, опен соус же.

>> No.217057  

>>217054
Да, вот в >>217039 как раз через copy_file_range() копировалось.

>> No.217058  

>>217057

>sendfile

CONFORMING TO
Not specified in POSIX.1-2001, nor in other standards.

Other UNIX systems implement sendfile() with different semantics and prototypes. It should not be used in portable programs.

>по long-ам

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

>исходники cp в coreutils

Я смотрел cat.c и какой io_blksize используется. Ааа. ОЛОЛО.

enum { IO_BUFSIZE = 128*1024 };
static inline size_t
io_blksize (struct stat sb)
{
return MAX (IO_BUFSIZE, ST_BLKSIZE (sb));
}
As of May 2014, 128KiB is determined to be the minimium blksize to best minimize system call overhead.
>copy_file_range()

CONFORMING TO
The copy_file_range() system call is a nonstandard Linux and GNU extension.

Получается портабильность достигается костылями. Ну ладно. Кстати, а

#include <arpa/inet.h>

в плане портабильности как? Можно вместо htole32() просто в big-endian через htonl() конвертнуть и там сравнивать, но это inet.h, поэтому несмотря на соответствие POSIX не ясно насколько оно присутствует везде.

>> No.217062  

Новый тред >>217061




[/b/] [/d/] [/tu/] [/a/] [/ph/] [/wa/] [/cg/] [/t/] [/p/] [/dev/] [/stat/] ]
[Burichan] [Futaba] [Gurochan] [Tomorrow] [Архив-Каталог] [Главная]