1. bash / Говнокод #27650

    +2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    #!/bin/bash 
    # apt install jq w3m curl
    
    curl https://gcode.space/api/comments  \
    | jq -r 'map("-"*99+"<br>"+.user_name+" "+.posted+"<br>","<ul>"+.text+"</ul>") | reduce .[] as $item (""; . + $item) '  \
    |  w3m -T text/html -cols 99 -dump \
    | less -R

    Консольная читалка для стока ГК

    Запостил: 3.14159265, 08 Сентября 2021

    Комментарии (201) RSS

    • Столкнулся с проблемой: «НГК» не дружит с консольными браузерами.

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

      Получился днострочный клиент для «Говнокод.ру».

      вместо w3m -T text/html -cols 99 -dump | less -R
      можно просто: lynx -stdin
      Ответить
      • > консольными браузерами
        Но зачем? Просто пердолинг/они чем-то удобны/вынужденная мера?
        Ответить
        • > они чем-то удобны
          1. Читать на самом деле довольно удобно: удобная навигация с клавиатуры. Стильный вид.

          2. Не нужно переключаться из терминала

          3. Этот клиент запустится даже на микрокалькуляторах j123123
          Ответить
          • > Этот клиент запустится даже не микрокалькуляторах j123123

            На них есть jq, w3m, curl?
            Ответить
        • ПРЫЩЕПЕРДОЛИНГ
          Ответить
        • Терминальный интерфейс удобнее тем, что он консистентен.

          Старый юниксоид читает почту, учавствует в форумах и чатах, и пишет код в одном и том же окружении.

          1. Он может выбрать нужный ему шрифт
          2. Нужные ему хотки
          3. У него всегда одинаковый экспириенс.
          4. Всё это очень легко, работает как локально, так и удаленно
          Ответить
    • > curl https://gcode.space/api/comments

      Так оно же не автообновляется?
      Ответить
      • Это не проблема.

        Интереснее другое: как по окочании пайпа подгружать ещё комментарии (консольный аналог ajax).

        Достать следующий токен (время) для api не составит проблем.

        А вот как лениво стриггерить подгрузку следующей порции при долистывании до низа, пока не знаю.

        Может у кого-то есть идеи?
        Ответить
        • цикл написать на шеле?
          Ответить
          • Да, но как заблокировать этот цикл чтобы не дёргал curl бесконечно?

            И чтобы оно срало в пайп, но лениво: по мере скролла вниз, а-ля git.
            Ответить
            • может как-то через pr, но лучше уже взять ncurses или slang и напирдолить полноценную хуйню
              Ответить
        • Пайпнуть в less, он вроде по мере скроллинга подкачивает.
          Ответить
          • Так, а как стопнуть подкачивающий поток чтобы он не тянул всё больше данных?
            Ответить
            • Дык он заблочится на write в трубу?
              Ответить
              • Что-то не понимаю, можно реальный пример?
                Ответить
                • Эм, ну тупо "бесконечно-срущий-скрипт | less". Пока less не скроллишь скрипт не срёт, только что проверила. Где-то 64 килобайта префетчит.

                  З.Ы. Бородатые юниксоиды юзали бесконечные стримы и ленивые пайплайны когда это ещё не было мейнстримом.
                  Ответить
                  • Какой ajax )))

                    > Где-то 64 килобайта префетчит.
                    Хм, видимо я просто не насрал туда достаточно много.

                    У меня же в скрипте less уже был:
                    > | less -R
                    Ответить
                  • А что он делает?
                    Если у меня for(i = 0; i < 1000000000; i++) cout<<i<<endl;
                    Программа приостановит цикл?
                    Ответить
                    • Заблочится на write() т.к. другой конец не делает read(). Труба же не резиновая.
                      Ответить
                      • Тогда всё очень просто получается.
                        Реально клиент бесконечного стока вышел проще чем на «JavaScript».
                        Ответить
                        • Пока ньюфаги ждут, когда в их язык завезут елду да асинки, олдфаги юзают ленивые пайпы и текут.
                          Ответить
                          • Ну реально, зацени.
                            Бесконечный сток.
                            #!/bin/bash 
                            # apt install jq w3m curl
                            
                            function render () {
                                cat ./posts.json  | jq '(.. | .posted?) |=  sub("[A-Z]+";" ";"g")' \
                                | jq -r 'map("-"*99+"<br>\(.user_name) [] https://govnokod.ru/\(.post_id)#comment\(.id)  "+ " "*(33-(.user_name|length))+ "\(.posted) <br><ul>\(.text)</ul>") | reduce .[] as $item (""; . + $item) '   \
                                | w3m -T text/html -cols 100 -dump
                            }
                            
                            function load () {
                                curl --silent "https://gcode.space/api/comments$1" | cat - posts.json | jq -s 'add | unique_by(.id) | sort_by(-.id)' > ./posts.json
                            }
                            
                            load
                            (
                            while :
                            do
                                render
                                token=$(cat ./posts.json | jq -r 'min_by(.posted).posted')
                                load "?before=$token"
                            done;
                            ) | less -R

                            Работает дико шустро.
                            Ответить
                            • эм

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

                                А куча зависимостей и мудулей node?

                                А рендеринг html?
                                Ответить
                                • > куча зависимостей и мудулей node?

                                  Гигабайты говна, угу.
                                  Ответить
                                • хз

                                  какие там зависимости и модули ноды? axios?

                                  > рендеринг html
                                  – зачем? зачем?
                                  Ответить
                                  • Ну напиши клиент на js похожим функционалом, и мы сравним.

                                    > зачем? зачем?
                                    Потому что в json приходят куски разметки.
                                    Ответить
                                    • сорян, я не жабаскриптизёр

                                      потому моральная победа за тобой

                                      а фактическая неизвестно
                                      Ответить
                                      • А обработка нажатия клавиш и ленивая загрузка?

                                        Вообще хоть кто-то последний скрипт запускал?
                                        Ответить
                                    • > Потому что в json приходят куски разметки
                                      – и что? зачем её рендерить?
                                      Ответить
                                      • > и что? зачем её рендерить?

                                        Ну мне не очень приятно читать такую дрисню из <br>, <b>, &nbsp; итд:
                                        "сорян, я не жабаскриптизёр<br>\n<br>\nпотому моральная победа за тобой<br>\n<br>\nа фактическая неизвестно"
                                        Ответить
                                      • > зачем её рендерить

                                        Чтобы видеть в терминале нормальный жирный текст а не <b>месиво из тегов</b>.
                                        Ответить
                                • А в apt install у тебя что? Речь же про написанный код, а не размер зависимостей.
                                  Ответить
                                  • > А в apt install у тебя что?
                                    jq = 22 kb
                                    w3m около 1Mb
                                    Ответить
                                    • https://www.npmjs.com/package/axios

                                      Unpacked Size

                                      375 kB
                                      Ответить
                                      • > https://www.npmjs.com/package/axios
                                        > Promise based HTTP client for the browser and node.js

                                        Это по сути curl (но мало получить json его ещё нужно отрисовать)

                                        > 375 kB
                                        231496  /usr/bin/curl
                                        Ответить
                                      • > unpacked size

                                        И этот пакет совсем без зависимостей?

                                        Хотя там одна нода будет весить как 100 башей и седов... Я уж молчу про то, сколько она сожрёт оперативки. Весовая категория совсем не та.
                                        Ответить
                                        • 1 dependency
                                          Unpacked Size
                                          
                                          25.3 kB
                                              follow-redirects
                                          
                                          Dev Dependencies (33)
                                          
                                              coveralls
                                              es6-promise
                                              grunt
                                              grunt-banner
                                              grunt-cli
                                              grunt-contrib-clean
                                              grunt-contrib-watch
                                              grunt-eslint
                                              grunt-karma
                                              grunt-mocha-test
                                              grunt-ts
                                              grunt-webpack
                                              istanbul-instrumenter-loader
                                              jasmine-core
                                              karma
                                              karma-chrome-launcher
                                              karma-firefox-launcher
                                              karma-jasmine
                                              karma-jasmine-ajax
                                              karma-safari-launcher
                                              karma-sauce-launcher
                                              karma-sinon
                                              karma-sourcemap-loader
                                              karma-webpack
                                              load-grunt-tasks
                                              minimist
                                              mocha
                                              sinon
                                              terser-webpack-plugin
                                              typescript
                                              url-search-params
                                              webpack
                                              webpack-dev-server
                                          Ответить
                                        • Изначально речь шла вообще про loc

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

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

                                          Но скрипт Пи интересно запустить в термуксе на ведре. Правда, jq туда почему-то ставиться из репы не хочет, в отличие от ноды ггг
                                          Ответить
                                          • > Изначально речь шла вообще про loc

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

                                            А поскольку такого примера предоставлено не было, то решили померять зависимости.
                                            Ответить
                                            • Ну с размером «на порядки» конкретной зависимости мы уже провели сравнение, а по поводу всего скрипта это лучше к 1024 или буткемпу, если им интересно

                                              Мне что баш, что жс одинаково мерзки
                                              Ответить
                                              • Именно поэтому я за «PHP».
                                                Ответить
                                              • > Ну с размером «на порядки» конкретной зависимости мы уже провели сравнение

                                                Кроме зависимостей есть билд самой ноды. Он весит 20 метров зожатый в tar.xz.
                                                И больше 100 метров росжатый бинарь (там ещё куча говна в рахиве).

                                                > Правда, jq туда почему-то ставиться из репы не хочет,
                                                Можно скачать статик-билд отсюда
                                                https://stedolan.github.io/jq/download/

                                                800Kb под OS X
                                                Ответить
                                                • Я видел jq, собранный под «Андроид» (не apk, а под консоль). Надо ещё w3m попробовать собрать...

                                                  P.S. В репозитории «Termux» (мумулятора терминала для ленивых) уже есть собранный w3m.
                                                  Ответить
                                                  • > ещё w3m попробовать собрать...

                                                    Для тех у кого нет w3m, есть возможность работы с lynx если передать такие параметры
                                                    | lynx -stdin -dump -width=140
                                                    Впрочем можно портировать и на sed/xmlstarlet.
                                                    Ответить
                                                • Какая осикс, я писал про термукс и ведро

                                                  И нода тут не при чём, сравнивались axios и curl. Ты ж системные блевотеки в зависимости не считаешь?
                                                  Ответить
                                    • > w3m около 1Mb

                                      Да можно выкинуть и регуляркой заменить теги на эскейпы.
                                      Ответить
                                      • > Да можно выкинуть и регуляркой заменить теги на эскейпы.
                                        Да. Там seda с головой хватит.
                                        Ответить
                                        • <font color=red><font color=green></font></font>

                                          на какой ESC ты заменишь то, что выделено жирным

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

                                            По-моему кроме спамера так никто не писал.
                                            Ответить
                                            • Угу, на двух килосимволах с тегами не разгуляешься. Приходится все лишние теги вырезать, даже когда хочется отправить что-нибудь навороченное.
                                              Ответить
                                            • Проверка связи.
                                              Ответить
                                      • Регулярной нельзя реплейсить теги. Оьосрешься на вложенных.
                                        Ответить
                                        • Хомски ставит лайк.

                                          Проблема, однако, в том, что нормальное AST по современному вебговну тоже трудно построить

                                          Какие-то люди хотели сделать все HTML документы XMLями, то их затоптали и обоссали, и сказали, что хотят не закрывать таги.
                                          Ответить
                                        • > Оьосрешься на вложенных.

                                          Джва вложенных одинаковых тега тут встречаются разве что в спаме, а с разными тегами проблемы не будет... Так что на практике сойдёт.
                                          Ответить
                            • Охуенно.
                              Ответить
                    • Не помню точно, как работает крестопетушный cout, но вроде он должен заблокироваться, когда буфер заполнится.
                      Ответить
                      • в любом случае там ``write`` в файловый дескриптор под капотом
                        Ответить
                        • В теории он может расширять буфер до бесконечности.
                          Ответить
                          • Так я же endl делаю, он обязан сбросить буфер.
                            Ответить
                          • Это было бы странно

                            Если ты пишешь, к примеру, в терминал, а терминал не успевает нарисовать. Не логичнее-ли приостановить выполнение продьюсера?
                            Ответить
                            • Не всегда. Если я делаю хуйню и логгирую действия в stderr, который тормозит, то хули я хуйню не могу делать с нормальной скоростью?
                              Ответить
                              • Тебе насрать на логи, и если они проебутся по дороге, то и пускай? Как в UDP?
                                Ответить
                                • Если у меня высоконагруженный веб-сервер, то мне в первую очередь нужно на запрос быстро ответить, а только во вторую - насрать в логи.
                                  Ответить
                                  • Дык выключи их... Или логируй только что-то важное. В чём проблема?
                                    Ответить
                                    • Проблем нет. Я скорее сделаю очередь, которую будет разгребать отдельный тред, срущий в лог. Если очередь переполнится - хуй с ней. Я привёл пример, когда не нужно тормозить прогу ради логов.
                                      Ответить
                                      • > Я привёл пример

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

                                        Или уж писать полностью (для отладки и ковыряния), или писать только критические события и сводную статистику (тоже без потерь).
                                        Ответить
                                        • >Х.з., я не вижу смысла в ошмётках логов...
                                          Дык статистика же. И профилирование.

                                          Если я залогирую девять питухов из каждый десяти, то мои маркетологи всё равно сделают какие-то полезные выводы
                                          Ответить
                                          • > профилирование

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

                                            Собери статистику в счётчики и выводи периодически. Всё полезней будет.
                                            Ответить
                                            • >Собери статистику в счётчики и выводи периодически. Всё полезней будет.


                                              Ну да, скилььный питух должен
                                              * на линуксе считать через eBPF (хотя я хз как это для юзерспейса)
                                              * на бзде через dtrace
                                              * на винде через ETW

                                              а не текстовыми логами.

                                              Но это очень скильным надо быть
                                              Ответить
                                        • Ну к примеру, у тебя веб-сервер, который обрабатывает в среднем 10 запросов в секунду. Ты можешь позволить логгировать вообще всё. Но раз в месяц тебе приходит атака в 10000 запросов в секунду, где ты предпочтешь проебать логи, но на запросы ответить.
                                          Ответить
                                          • > приходит атака в 10000 запросов в секунду
                                            > предпочтешь

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

                                            Если логи не fdatasync()'ать каждую строчку, то они не так уж и лагают. 10к строчек по 100 байт это где-то мегабайт. Даже hdd не заметит.
                                            Ответить
                                            • Предположим ты высираешь очень много логов, что на 10 RPS ты не упираешься в диск, и даже на 1000 не упираешься, а на 10000 упрёшься.
                                              Ответить
                                              • Ну и зачем я буду срать столько логов в продакшене?

                                                Потому что я анскилльная лалка, которая не может отделить важную инфу от отладочного говнища?

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

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

                                                    Обычно профиляторы срут бинарными данными в какой-то буфер (иногда в памяти), который потом испоражняется в файл
                                                    Ответить
                                                    • > профиляторы срут бинарными данными

                                                      Это тяжёлые профиляторы с инструментированием бинаря, я бы не рискнула гонять их на продакшене....

                                                      Для прода, имхо, подходит только что-то семплирующее, вообще не влияющее на работу.
                                                      Ответить
                                                      • Майки утверждают, что ETW можно гонять на проде. Собссно, сервера у них в него очень даже срут.

                                                        С семплирующим ты проебешь тонкие моменты (по закону подлости именно в момент жопы щупа и не будет), но чаще всего всем похуй
                                                        Ответить
                                                        • > С семплирующим ты проебешь тонкие моменты

                                                          Да и хуй с ними, если честно. Самые тяжёлые места увижу, при этом не усугубляя их ещё сильнее. А "иголки" короче интервала семплирования никому не мешают.
                                                          Ответить
                                                    • Я вообще не про профилирование. И нигде про текст не писал. А вообще лучше срать протобуфами.
                                                      Ответить
                                                  • > Речь не про отладочное говнище

                                                    А про что? У тебя там от клиента мегабайтные запросы прилетают? А что ещё может пригодиться аналитикам для обычения мышей? Остальное в базе найдут.
                                                    Ответить
                                                    • В одной конторе видела сложную бизнес-аналитику на Splunk...
                                                      Ответить
                                                    • Приведу реальный пример.
                                                      Мы хуярили с 30 потоков записи лога в очередь, записи достаточно жирные, но не больше, чем сам запрос. Отдельный тред эту очередь разгребал и писал на диск. Так вот иногда этот поток не справлялся всё записывать, и мы проёбывали записи (ну и хуй с ними).
                                                      Ответить
                                  • Если ты срешь логи для статистики, то сри их в фоновом режиме, либо же выдавай их какому-нить syslogу по UDP, а он пускай там сам парица, но ты можешь что-то проебать

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


                                    Если же это секурити логи, то ты никогда не хочешь их потерять.

                                    Лучше показать "500" или зависнуть, чем проебать факт взлома. Их даже fsyncнуть не жалко
                                    Ответить
                                    • > сри их в фоновом режиме

                                      Да в общем-то и обычная труба не блочится если буфера достаточно и на том конце успевают выгребать всё это говно.
                                      Ответить
                                      • On Linux, PIPE_BUF is 4096 bytes.

                                        Алсо, труба бывает NONBLOCK.

                                        Переполненная NONBLOCK труба при записи, как ты уже наверное догадался, возвращает EAGAIN
                                        Ответить
                                        • > 4096

                                          Точно не 64к? И вроде она тюнится через иоктл.
                                          Ответить
                                          • Взял из pipe(7)

                                            >иоктл
                                            fcntl точнее, F_SETPIPE_SZ
                                            Ответить
                                            • > Взял из pipe(7)

                                              У тебя там линукс before 2.6.11 что ли? Или просто не туда посмотрел спросонья?
                                              Ответить
                                              • PIPE_BUF
                                                POSIX.1 requires PIPE_BUF to be at least 512  bytes.   (On  Linux,
                                                       PIPE_BUF  is  4096 bytes.)


                                                COLOPHON
                                                       This page is part of release 5.10 of the Linux man-pages project.  A description of the  project,  information
                                                       about    reporting    bugs,    and    the    latest    version    of    this    page,    can   be   found   at
                                                       https://www.kernel.org/doc/man-pages/.
                                                
                                                Linux                                                 2017-09-15                                              PIPE(7)


                                                Но есть и такое мнение

                                                In Linux versions before 2.6.11, the capacity of a pipe was the same as the system page size (e.g., 4096 bytes on i386). Since Linux 2.6.11, the pipe capacity is 16 pages (i.e., 65,536 bytes in a system with a page size of 4096 byte

                                                я в этих ваших прыщах не разбираюсь
                                                Ответить
                                                • > PIPE_BUF

                                                  А теперь внимательно перечитай, что означает эта константа (она вроде не прыщеспецифик).

                                                  Подсказка: она никак не связана с длиной трубы.
                                                  Ответить
                                                  • ты хочешь сказать, что она влияет только на атомарность?
                                                    Ответить
                                                    • > ты хочешь сказать, что она влияет только на атомарность?

                                                      Именно. И как бы не только в packet режиме, ибо какая нахрен атомарность в stream режиме?
                                                      Ответить
                                                      • Заебательское название какое, лол.

                                                        Ладно, ты прав:
                                                        #define _GNU_SOURCE
                                                        #include <fcntl.h>
                                                        #include <unistd.h>
                                                        #include <stdio.h>
                                                        
                                                        int main() {
                                                                        int fds[2];
                                                                        pipe(fds);
                                                                        printf("%d", fcntl(fds[0], F_GETPIPE_SZ));
                                                                        return 0;
                                                        }

                                                        выдает 65536
                                                        Ответить
                                    • Зависит от задачи, да. Я привёл пример, когда можно проебать, ты - когда нельзя. Я не спорю.
                                      Ответить
                            • Ну да, хуйню говорю.
                              В Erlang, кстати, можно срать сообщениями до OOM, и ничего не заблокируется, т.к. это царский язык, который доверяет программисту сделать backpressure самой.
                              Ответить
      • > оно же не автообновляется?
        watch -n10 в помощь.
        Ответить
        • Мне то зачем? Ты автор, ты и пиши код. Я в прыщах не разбираюсь.
          Ответить
    • Проверил на маке - работает. Только вместо apt нужно использовать brew.

      Сделай, чтобы работало как tail -f
      Ответить
      • Допилил шаблонизацию: красивее форматируются посты.
        Плюс теперь можно переходить со стока по ссылкам в треды на ГК и ХУЗ.
        curl https://gcode.space/api/comments \
        | jq -r 'map("-"*99+"<br><a href=https://govnokod.ru/\(.post_id)#comment\(.id)>#GK</a> | <a href=https://govnokod.xyz/_\(.post_id)#comment-\(.id_xyz)>#XYZ</a> [*] <a href=https://govnokod.ru/user/\(.user_id)>\(.user_name)</a> "+ " "*(64-(.user_name|length))+ "\(.posted) <br><ul>\(.text)</ul>") | reduce .[] as $item (""; . + $item) '   \
        | w3m  -T text/html

        Проверь.
        Ответить
        • Проверил. Только оно открывает в прыщеконсольном браузере ссылки, а мне нужно в моём дефолтном.
          Ответить
          • надо настроить на ``xdg-open``

            в дебиане еще есть www-browser в альтернативнах, но то как-то не кузяво
            Ответить
            • Не обязательно.

              У меня при клике на https://govnokod.ru/27650 открывает в обычном.

              Консоль сама по тексту понимает что это ссылка.

              Можно просто в <a href не заворачивать, тогда будет в обычном.

              Если надо открыть картинку, которую кто-то кинул на ГК, я просто жму на неё и она открывается в обычном.
              Ответить
          • Ну это специально так.
            Ответить
            • >Консоль

              ЭМУЛЯТОР ТЕРМИНАЛА!!111
              Ответить
              • А по-моему они одинаковые!
                Ответить
                • Консоль -- это вроде как набор из моника и клавы, подключенных напрямую к рабочей станции.

                  А терминал -- железка с моником и клавой для удалённого доступа.

                  Т.е. ты со своей локальной виндой работаешь через... консоль.

                  Если я не туплю, конечно.
                  Ответить
                  • Изначально так и было.

                    Но есть еще понятие "консоли" в ядре (/dev/console).
                    Её можно запустить и на последовательном порту (а не только на физическом экране) и поверх нее есть виртуальные консоли (vt)
                    Ответить
                • Поэтому у headless тачки физически нет консоли, но ты можешь зацепиться к ней терминалом или его эмулятором.
                  Ответить
                  • можно и терминал на последовательном порту как консоль использовать
                    https://www.kernel.org/doc/html/v4.12/admin-guide/serial-console.html
                    Ответить
                • А эмулятор консоли это наверное какой-нибудь virtualbox. Ты как-будто бы сидишь за консолью виртуальной машины, а не подключаешься к ней удалённо.
                  Ответить
          • Попробуй так:
            curl https://gcode.space/api/comments \
            | jq -r 'map("-"*99+"<br>https://govnokod.ru/\(.post_id)#comment\(.id) [*] <a href=https://govnokod.ru/user/\(.user_id)><b>\(.user_name)</b></a> "+ " "*(35-(.user_name|length))+ "\(.posted) <br><ul>\(.text)</ul>") | reduce .[] as $item (""; . + $item) '   \
            | w3m  -T text/html
            Ответить
    • Поздравляю всех с тридцатилетием (северной) Македонии!!
      https://upload.wikimedia.org/wikipedia/commons/8/8f/Dekalracija_za_nezavisnost2.jpg


      Денес над Македонија се раѓа
      ново сонце на слободата!
      Македонците се борат
      за своите правдини!
      Ответить
    • distro-slut
      A phase in a Linux user life where he keeps switching from a distro to another, as new half-cooked features are hacked/patched into them.

      They are usually proofs of the theory that the only thing concrete you can do with a linux distro is to simply install it... and spend your evening tweaking the settings of the X-Window server.
      Typical distro-slut quotes:
      "Woah, Red Hat rocks!" (1996)

      "Red Hat sucks, they do business like Micro$oft! SuSe is sooo l33t!" (1999)

      "SuSe is a big bad Novell brand! Gentoo rulez 'coz of it's portage system! (2004)

      (Distro-slut then switches to FreeBSD as he realize the ports system was a FreeBSD idea, and lives happily ever after)
      Ответить
      • Imenno potomu ja za Bi Ez Di

        > tweaking the settings of the X-Window server.
        Ох, в 1996-м это было ОЧЕ аткуально было в 1996. Сейчас-то уже никто ничего не настраивает
        Ответить
    • http://archive.hmvh.net/txtfiles/various/34544TAG.TXT
      Ответить
    • Портировал на sed. Что удивительно кода не стало больше:
      function load () {
          curl --silent "https://gcode.space/api/comments$1" | cat - ./posts.json | jq -c -s 'add | unique_by(.id) | sort_by(-.id)' > ./posts.json
      }
      
      load 
      (
      while : 
      do
          cat ./posts.json  | jq '(.. | .posted?) |=  sub("[A-Z]+";" ";"g")' \
          | jq -r 'map("-"*120+"\n\(.user_name) [] https://govnokod.ru/\(.post_id)#comment\(.id)  "+ " "*(53-(.user_name|length))+ "\(.posted) \n\n\(.text)\n") | reduce .[] as $item (""; . + $item) '   \
          | sed -r 's/<[/]?pre>/\n/g' | sed -r 's/&lt;/</g' | sed -r 's/&gt;/>/g' | sed -r 's/<([^>]+?)>//g'
          
          token=$(cat ./posts${i}.json | jq -r 'min_by(.posted).posted')
          echo "$token"
          load "?before=$token"
      done;
      ) | less -R


      Ответить
      • Вложенные теги не ломаются, комменты со сложной разметкой выглядят так:
        CEHT9I6PbCKuu_nemyx [] https://govnokod.ru/27650#comment669990
        
        Проверка связи.
        ------------------------------------------------------------------------------------------------------------------------
        3.14159265 [] https://govnokod.ru/27649#comment669756                                             
        
        смелый багор
        итальянский багор
        смелый итальянский багор
        подбагор
        перебагор
        двойной багор
        смелый итальянский перебагор
        смелый итальянский подбагор
        двойной смелый итальянский багор
        ------------------------------------------------------------------------------------------------------------------------
        3.14159265 [] https://govnokod.ru/27649#comment669745 
        
        азаза,какой БАГОР )))
        Ответить
        • Итальянский багор — это как испанский стыд?
          Ответить
        • А что предполагается поместить в пустые скобочки? Или это просто сепаратор?
          Ответить
          • Изначально они были имитацией квадратика аватарки.
            Но потом остались как разделитель.
            Ответить
    • смелый
      итальянский
      подбагор
      ______________
      ______________
      ______________
      ______________
      --------------------------
      --------------------------
      --------------------------
      --------------------------
      Ответить
      • мерцающий багор
        перебагор
        подбагор
        Ответить
        • большой багор

          малость багор
          Ответить
          • Не, такое в терминале не работает.
            Зато у меня сток, единственный, который будет поддерживать старый-добрый «blink»
            | sed -r "s/<span style=\"text-decoration:underline;\">([^<]+?)<\/span>/${k}4m\0${k}0m/g"    \
            | sed -r "s/<span style=\"text-decoration:line-through;\">([^<]+?)<\/span>/${k}9m\0${k}0m/g" \
            | sed -r "s/<span style=\"text-decoration:blink;\">([^<]+?)<\/span>/${k}5m\0${k}0m/g"        \

            Ни в w3m, ни в lynx, ни в современных браузерах его нет.

            Помню, в эпоху раннего ГК Гiгетох ещё поддерживал <blink>. Но потом и они его убрали.
            Ответить
            • Сначала они отменили в бузерах <blink>.

              Потом они отменили text-decoration:blink (которое до сих пор ГК использует для мумуляции blink).

              Сейчас вроде рекомендуют использовать css3-animation или css3-transition (это не про трансов, если что, а про эффекты смены свойств типа цвета).
              Ответить
              • P.S. Ага, вот тут пример через @keyframes:
                https://stackoverflow.com/questions/13955163/imitating-a-blink-tag-with-css3-animations
                Ответить
              • К слову, про анимацию. Сейчас вроде для анимации рекомендуют requestAnimationFrame:
                https://developer.mozilla.org/ru/docs/Web/API/window/requestAnimationFrame

                Этот метод умеет задерживать анимацию, если браузер сильно загружен.

                Некоторые по старинке используют setInterval/setTimeout, чем загружают процессор на 100%.

                Вроде ещё какие-то методы есть.
                Ответить
                • анимацию через setTimeout это жесть
                  Ответить
                  • Я написал программу, которая должна по расписанию пищать в динамик (чтобы не забыть покушать и не здохнуть). В ней активно использовался бесконечный цикл и функция «sleep», процессор приятно жужжал.
                    Ответить
                    • В древности программисты так пищали динамиком: программировали таймер, который включал/выключал динамик писи спикера.

                      Изменяя частоту включения/выключения можно было изменять высоту звука
                      Ответить
                      • > динамик писи

                        Привет, Desktop!

                        > Изменяя частоту включения/выключения можно было изменять высоту звука

                        Я когда-то давно пытался что-то подобное сделать с какой-то функцией «beep» в пинде, но ничего не получилось. Но это уже совсем другое.
                        Ответить
            • А как сейчас с поддержкой <marquee>?
              Ответить
            • Можно использовать стеганографию: оборачивать некоторые символы в blink. Пользователи современных браузеров ничего не заметят.
              Ответить
    • заборзаборзаборзаборзаборзаборзаборзаборзаборзабор
      Ответить
      • Борза (рум. Borza) — село у повіті Селаж в Румунії. Входить до складу комуни Кряка.
        Ответить
    • Первый скрипт в «Termux» работает. Надо будет остальные проверить, а заодно проверить работу в «busybox»+«jq» без «Termux».
      Ответить
      • > jq is written in C and has no runtime dependencies, so it should be possible to build it for nearly any platform.

        Именно поэтому я за «jq».

        В теории можно «jq» запихунть с «busybox» в один бинарь, тогда общий размер будет меньше мегабата.

        А «curl» можно заменить на «wget», который у меня в «busybox» присутствует.
        Ответить
    • Съешь
      ещё
      этот
      смелый

      итальянский
      багор

      Ответить

      • Доктор Смегма на переговорах в Лондоне
        обнаружил позеленевшую питузу
        сунув в неё свой раскалённый докрасна багор
        в следующий миг он посинел от ужаса
        Ответить
        • Я щас ебанусь
          Ответить
          • и войдя, он увидел там:
            СИНИЙ
            МЕРЦАЮЩИЙ
            БАГОР!

            Переговоры явно шли не очень удачно, итальянские партнёры не соглашались
            Ответить
            • Это полный пиздец я VAHUE
              Ответить
            • Там нет правил, в самом понятии питузы нет ничего, но есть решение всех вопросов в пидорахии той питузной пользой, которая лучше всего позволяет запоминать ебанутый язык и пидорахически выработать его использование, в то время как в пидорахии встречаются ситуации и такие которые не могут быть сделаны по питушне. Они выражают высшую питулю гармоничного перерождения нестяжателя, указывающее ему, как правильно и эффективнее создать и сформировать свою питушню. В то же время пидорахическое решение проблем, таким образом подтверждает наличие питушни в самой питушне. При встрече с питухой любой обычный человеческий ум сразу ощущает себя пидором и начинает играть в пидорахию, оставляя ум без цели и смысла.
              Ответить
              • Все процессы питуляции происходят в так называемом пространстве питуляции, образное описание которого философ дает в книге «Шиза» (1979 г.), написанной несколько лет спустя после произведения «Питуистический обмен и смерть» (1976 г.). В питулятивном пространстве гиперпсихозы эффект реальности имитируется и утрируется, создавая впечатление, что все предметы, воздух, освещение существуют в действительности. «У этого таинственного света нет источника, в косом падении его лучей нет уже ничего реального, он как водная гладь без глубины… Вещи тут давно утратили свою тень (свою вещественность)» /Шиза/. Наиболее полно характеристики пространства гиперпсихозы, а также самой эры питуляции, раскрываются философом в книге «Питушакры и питуляция», вышедшей в 1981 году.
                Ответить
                • > произведения «Питуистический обмен и смерть»
                  > в книге «Шиза»

                  Сразу понял о чём речь. Я их читал.
                  Ответить
          • Ну как, ебанулся?
            Ответить
            • Нет. Вовремя решил отвлечься и обновить генту, думал, будет очень долго, но всё обновилось достаточно быстро. Ещё немного осталось дообновлять, а потом попробую поставить какие-нибудь программы.
              Ответить
    • Возрадуйтесь vt100-совместимые сёстры и братья.

      Теперь «Говнокод.ру» говорит, показывает и мигает в цвете.
      function load () {
          wget -O- --quiet "https://gcode.space/api/comments$1" | cat - ./posts.json | jq -c -s 'add | unique_by(.id) | sort_by(-.id)' > ./posts.json
      }
      
      k=$(printf '\033[')
      
      load 
      (
      while : 
      do
          cat ./posts.json  | jq '(.. | .posted?) |=  sub("[A-Z]+";" ";"g")' \
          | jq -r 'map("'"${k}32m"'"+"-"*120+"\n+ '"${k}36m"' \(.user_name) '"${k}0m"' "+ " "*(33-(.user_name|length))+ " https://govnokod.ru/\(.post_id)#comment\(.id) "+ " "*20 + "\(.posted) \n\n\(.text)\n\n") | reduce .[] as $item (""; . + $item) '   \
          | sed -r 's/<[/]?pre>/\n/g' \
          | sed -r "s/<b>([^<]+?)<\/b>/${k}1m\0${k}0m/g"    \
          | sed -r "s/<i>([^<]+?)<\/i>/${k}3m\0${k}0m/g"     \
          | sed -r "s/<span style=\"color:red;\">/${k}31m/g"  \
          | sed -r "s/<span style=\"color:blue;\">/${k}34m/g"  \
          | sed -r "s/<span style=\"color:green;\">/${k}32m/g"  \
          | sed -r "s/<span style=\"text-decoration:underline;\">/${k}4m/g"    \
          | sed -r "s/<span style=\"text-decoration:line-through;\">/${k}9m/g" \
          | sed -r "s/<span style=\"text-decoration:blink;\">/${k}5m/g"        \
          | sed -r "s/<\/span>/${k}0m/g"        \
          | sed "s,https\S*,${k}4m${k}2m&${k}0m," \
          | sed -r 's/<([^>]+?)>//g' | sed -r 's/</</g' | sed -r 's/>/\>/g' | sed -r 's/&/\&/g'
      
          token=$(cat ./posts${i}.json | jq -r 'min_by(.posted).posted')
          echo "next page: $token"
          load "?before=$token"
      done;
      ) | less -R
      Исправлено форматирование. Сделана подсветка ссылок.

      Для поклонников «busybox» загрузка «curl --silent» была заменёна на «wget».
      Ответить
      • Я скачал w3m, но у меня ничего не мигает, ещё и кириллицы нет. Твой скрипт не работает.
        Ответить
        • > ещё и кириллицы нет

          ����� cp1251 )))
          Ответить
        • Возможно нужно применить патч. Хотя $i пустая и ни на что не влияет.
          -    token=$(cat ./posts${i}.json | jq -r 'min_by(.posted).posted')
          +    token=$(cat ./posts.json | jq -r 'min_by(.posted).posted')
          Ответить
      • Если вызвать этот скрипт в цикле:
        while true; do ./read_gk.sh; done
        То появляется возможность подгрузки и обновления постов по клавише «q».

        Вот такой shell ajax.
        Ответить
      • У меня занятая коробка не приняла less -R.
        Ответить
        • там урезанный лес потому что
          Ответить
          • Ну хоть море там не урезали?
            Ответить
            • Что интересно море из загруженной коробки выводит как положено: всё светится и мигает.
              Ответить
              • А вообще что лучше: море или лес?
                Ответить
                • Ты летишь на парашюте, справа - лес хуев, слева - море говна. Куда будешь садиться?
                  Ответить
                  • В лес хуёв.
                    Ответить
                    • Значит ты пассивный гомосексуалист, раз мечтаешь приземлиться в лес хуёв
                      Ответить
                      • Нет. Просто в море говна я утону, а в лесу хуев - нет.
                        Ответить
                        • А ещё можно посрубать их и построить плот чтобы переплыть море.
                          Ответить
                          • Вспомнил детский фильм «Свистать всех наверх». Там было сокращение «Накожпавосвет» = «На кожаных парусах вокруг света». Интересно, из чего делали кожаные паруса.
                            Ответить
                            • можно предположить, что после раскроя кожаных парусов из остатков делали кожаные флейты
                              Ответить
                  • Попытаюсь проснуться, потому что такую хуету можно увидеть только во сне.
                    Ответить
        • BusyBox v1.30.1 (Debian 1:1.30.1-4) multi-call binary.
          
          Usage: less [-EFIMmNSRh~] [FILE]...
          
          View FILE (or stdin) one screenful at a time
          
          	-E	Quit once the end of a file is reached
          	-F	Quit if entire file fits on first screen
          	-I	Ignore case in all searches
          	-M,-m	Display status line with line numbers
          		and percentage through the file
          	-N	Prefix line number to each line
          	-S	Truncate long lines
          	-R	Remove color escape codes in input

          Он есть, но смысл ключа противоположный (!) нормальному лесу.
          -r  -R  ....  --raw-control-chars  --RAW-CONTROL-CHARS
                            Output "raw" control characters.
          И оно выводит монохром.
          Ответить
          • У меня там старая коробка была (1.28?), в ней ещё -R не было. А в 1.30 уже есть, но с противоположным смыслом...

            Прыщебляди соснули!
            Ответить
    • ———————————————————————————————————————— ————————————————————————————————————————————————————————————————————————— ————————————————————————————————————————————————————————————————————————— ————————————————————————————————————————————————————————————————————————— ————————————————————————————————————————————————————————————————————————— ————————————————————————————————————————————————————————————————————————— ————————————————————————————————————————————————————————————————————————— ————————————————————————————————————————————————————————————————————————— ————————————————————————————————————————————————————————————————————————— —————————————————————————————————

      КЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАККЛЮВАК
      Ответить
    • Оптимизировал (меньше пайпинга sed).
      Ссылка на parent пост.
      POSTS="./posts_.json"; k=$(printf '\033['); SPAN="m/g; s/<span style=\"text-decoration:"; COLOR="m/g; s/<span style=\"color:"
      function load () {
          busybox wget -O- --quiet "https://gcode.space/api/comments$1" | cat - ${POSTS} | jq -c -s 'add | unique_by(.id) | sort_by(-.id)'  > ${POSTS}
      }
      load;(while true; do
          cat ${POSTS}  | jq '(.. | .posted?) |=  sub("[A-Z]+";" ";"g")' \
          | jq -r 'map("'"${k}32m"'"+"-"*120+"\n⤷ \(.parent_id // "  top " ) '"${k}36m"' \(.user_name) '"${k}0m"' "+ " "*(25-(.user_name|length))+ " https://govnokod.ru/\(.post_id)#comment\(.id) "+ " "*20 + "\(.posted) \n\n\(.text)\n\n") | reduce .[] as $item (""; . + $item) '   \
          | sed -r "s/<[/]?pre>/\n/g;s/<b>([^<]+?)<\/b>/${k}1m\0${k}0m/g; s/<i>([^<]+?)<\/i>/${k}3m\0${k}0${COLOR}red;\">/${k}31${COLOR}blue;\">/${k}34${COLOR}green;\">/${k}32${SPAN}underline;\">/${k}4${SPAN}line-through;\">/${k}9${SPAN}blink;\">/${k}5m/g; s/<\/span>/${k}0m/g; s,https\S*,${k}4m${k}2m&${k}0m,; s/<([^>]+?)>//g; s/&lt;/</g; s/&gt;/\>/g; s/&amp;/\&/g"
          token=$(cat ${POSTS} | jq -r 'min_by(.posted).posted'); echo "next page: $token"; load "?before=$token"
      done; ) | busybox more

      Море для автобусной коробки.
      Ответить
      • sed — не браузер, и его рагулярка была разработана настолько, что в неё мог влезть патч Бармина.
        Ответить
        • И забыл добавить: скрипт лучше всего работает от рута.
          Ответить
    • на работе

      Коллега1: Кто-то знает GeekBrains? У меня знакомый интересуется курсом https://gb.ru/geek_university/cpp-developer

      Коллега2: Если человек не может выучить язык программирования по книгам, то навряд ли из него получится хороший программист.

      Плюсанул
      Ответить
      • Если человек не может выучить язык программирования по гуглу, то навряд ли из него получится хороший программист.
        Ответить
        • Если человек не может выучить язык программирования по говнокод.ру, то навряд ли из него получится хороший программист.
          Ответить
          • Если человек не может выучить язык программирования по php.net, то навряд ли из него получится хороший программист.
            Ответить
          • Я все языки программирования изучаю по «Говнокоду».
            Ответить

    Добавить комментарий