LINUX.ORG.RU

Задачка для metaprog

 , ,


1

1

Имеется выхлоп dpkg -l вида:

ii  2048-qt                                                     0.1.6-2+b2                                   amd64        mathematics based puzzle game
ii  aapt                                                        1:8.1.0+r23-3+b2                             amd64        Android Asset Packaging Tool
ii  abiword                                                     3.0.4~dfsg-2                                 amd64        efficient, featureful word processor with collaboration
ii  abiword-common                                              3.0.4~dfsg-2                                 all          efficient, featureful word processor with collaboration -- common files
ii  accountsservice                                             0.6.55-3                                     amd64        query and manipulate user account information

(гусары с aptitude и прочими готовыми колясками — молчать! Задача учебная!)

Надо выгрепнуть из него все строчки пакетов, у которых статус — установлен. То есть в первой колонке есть буковка i. Дело осложняется тем, что кроме ii, там может быть hi, ic, it и прочая шняга.

Решение однострочником, сложное и неудобное:

dpkg -l|grep -P '^[^\s]*?i[^\s]*?\s'

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

Куда проще сделать:

dpkg -l|col1|grep i

, не так ли? ;)

(здесь col1..col9 — мини-скриптик из пакета byobu, который является, грубо говоря, просто удобным алиасом для awk '{print $1}')

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

Как решить эту задачу в один конвейер и красиво? А никак :P

Привлекаем императивный язык с промежуточными переменными!

import sys

for line in sys.stdin.readlines():
    if 'i' in line.split()[0]:
        sys.stdout.write(line)

Но всё равно некрасиво, линейный код с искусственным ветвлением через переменную. Вот бы запрограммировать двумерно! Как-то так:

        +-----+ colstream  +-----+  +------+ bool
line-+->| ||| >===========>| [1] >->| Y  i >--------+
     |  +-----+            +-----+  +------+        | transistor
     |                           +->/dev/null     --+--
     +-------------------------------------------/     \->-------> output

(где Y — пиктограмма воронки, как в Excel ;))

Этим и отличается текстовое программирование от графического: текстовое — одномерное, графическое — двумерное! В порог человеческого восприятия ещё и трёхмерное влезет; до такого вроде ещё не додумались (ну, если Minecraft’овский Redstone и аналоги не считать), но у Нас мыслишки есть ;)


Интересно, как реализуют эту задачу Их Метапрожейшество @metaprog ;) В отличие от тех «простых» задачек, что обычно предлагают в метапроготредах, эта займёт всего пару минут Вашего драгоценного метавремени, не так ли? ;) И послужит хорошей демонстрацией в копилочку того, чем хорош Метапрог (если он, конечно, хорош).

Антиметапрогеры превентивно посылаются в высирач, но могут предложить свои варианты конвейерной (не некрасивой императивной) обработки на текстовых ЯП, ибо почему бы и нет. Латентные (и не только!) шиндузятники с пошуршеллом тоже приветствуются, ага.



Последнее исправление: mertvoprog (всего исправлений: 1)
Ответ на: комментарий от mertvoprog

Это сфига он вдруг такой особенный: всё устаревает, а рэп нет? ;)

Реп – это жанр. Как тот же дабстеп. Только дабстеп вообще не вариативен. А реп вариативен очень сильно. Новая вариация – новая волна репа. А старое остаётся на кладбище, как и положено. Это не только репа касается, думается.

kostyarin_ ★★
()
Ответ на: комментарий от kostyarin_

Звучит так буде-то бы Владимир притерпел от анонов и сбежал в реги

Скажу вам по секрету - я теперь и регистрант и анон. От регистранта пишу на технические тем, от анона позволяю себе чуть более … Ну, вы меня поняли, шалун ;)

Владимир

anonymous
()
Ответ на: комментарий от kostyarin_

реп вариативен очень сильно

Это с вашей реполюбской колокольни :P

Говнари тоже любят выделять стопицот поджанров рока и метала, и считать это, ни много ни мало — целыми отдельными жанрами, при этом полностью забивая на то, что вне их говнарского манямирка существует ;)

На деле же форма одна — бит+речитатив, и никуда вы от этого не денетесь, и никаких инноваций уже нет и не будет.

Кончайте окаменевшие рэпы с хаусами переделывать, давайте новые, машувать! :P

mertvoprog
() автор топика
Ответ на: комментарий от mertvoprog

Кончайте окаменевшие рэпы с хаусами переделывать, давайте новые, машувать! :P

А мне в молодости нравилась Коррозия металла. Вы тогда, думаю, еще не родились ;)

Владимир

anonymous
()
Ответ на: комментарий от mertvoprog

А как к этим шалостям относятся модераторы?

Вы же сами от них претерпеваете, должны понимать … Тут мы с вами в одной лодке плывем против модераторского произвола, увы …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

претерпеваете

Это так не работает :P

Нам вообще здесь не место ещё с конца 2012-го года, когда Нас забанили по делу.

На ЛОРе весьма странная политика: вместо наказания временным баном — наказание принудительной перезагрузкой ЛОРовской личности. На приличных ресурсах перерегистрантов по дефолту банят тоже, а не в порядке исключения ;)

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

mertvoprog
() автор топика
Ответ на: комментарий от mertvoprog

Это с вашей реполюбской колокольни :P

Я не любитель репа. Просто музыкальное голодание у меня настолько сильное, что не брезгую питаться и падалью, образно выражаясь. Последнее из репа, что я слушал был очень старый альбом Объединённой касты (ну путать с Кастой), который по сути копирует Ву Танг в русской вариации. Очень старую тему. Потому что современное всё надоело очень быстро. А это, боле менее забылось за много лет.

На деле же форма одна — бит+речитатив, и никуда вы от этого не денетесь, и никаких инноваций уже нет и не будет.

Да это по большей части пофигу. Есть у человека жизнь. Он о ней рассказывает в той или иной форме. И если жизнь у него скучная, то никак это не выстрелит. А если интересная, то хоть попсой пой – успех неизбежен. Деградация в музыке – означает лишь отсутствие интереса к жизни у исполнителей. Или пересечения их степени интересов со слушателем. Типа того.

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

Примерно так это работает, насколько я понимаю.

kostyarin_ ★★
()
Ответ на: комментарий от anonymous

Скажу вам по секрету - я теперь и регистрант и анон. От регистранта пишу на технические тем, от анона позволяю себе чуть более … Ну, вы меня поняли, шалун ;)

Понимаю. Особого выбора всё равно нету. Здесь реклама VPN-сервисов и 10minutemail.

kostyarin_ ★★
()
Ответ на: комментарий от kostyarin_

музыкальное голодание у меня настолько сильное

Не в ту сторону голодаете: если жрать нечего, надо отказываться от пищи! :P

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

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

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

Ну какой у музыкальной шкатулки или ЭВМ «интерес к жизни» может быть? ;)

mertvoprog
() автор топика
Ответ на: комментарий от kostyarin_

Шо за мода забивать гвозди VPN-микроскопом — это потому, что на новомодных мобильных недоОС прокси только через высирач подключаются, в отличие от VPN?

mertvoprog
() автор топика
Ответ на: комментарий от mertvoprog

Не в ту сторону голодаете: если жрать нечего, надо отказываться от пищи! :P

Человек без пищи погибает в течении 60-ти дней. При этом необратимые изменения начинаются довольно скоро. Я таким Макаром сам начну бренчать. И тогда уже худо будет всем. По мне так собственные проблемы на других перекладывать не стоит. Хотя может я ошибаюсь.

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

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

Ну какой у музыкальной шкатулки или ЭВМ «интерес к жизни» может быть? ;)

Никакой. Оттого тема мёртвая. Либо компиляция чужих «интересов».

kostyarin_ ★★
()
Ответ на: комментарий от mertvoprog

Шо за мода забивать гвозди VPN-микроскопом — это потому, что на новомодных мобильных недоОС прокси только через высирач подключаются, в отличие от VPN?

Просто VPN щас прокачанные. Нажал кнопку и погнал. А прокси 50 раз капу спросит. Как и многие VPN-ки, кстати, тоже.

kostyarin_ ★★
()
Ответ на: комментарий от kostyarin_

Человек без пищи погибает в течении 60-ти дней

Но это и не пища, а роскошь где-то с ненижних слоёв пирамиды Маслова ;)

Я таким Макаром сам начну бренчать

Бреньчите, разрешаем.

Сами битбоксим ещё с детства.

Всяко лучше, чем потреблять ;)

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

Не, это для той, которую слушал в детстве

Где Вы вообще связь увидели? o_O

А у поколений, которые именно на болтовне всякой и вырасли?

А почему новую искать непременно можно только с речесмысловой нагрузкой?

Оттого тема мёртвая

По сути своей мёртвая, да ;)

И что?

mertvoprog
() автор топика
Ответ на: комментарий от kostyarin_

А прокси 50 раз капу спросит

Это почему ещё?

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

mertvoprog
() автор топика
Ответ на: комментарий от mertvoprog

Где Вы вообще связь увидели? o_O

Если её нету, значит я Вас неправильно понял.

А у поколений, которые именно на болтовне всякой и вырасли?

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

А почему новую искать непременно можно только с речесмысловой нагрузкой?

Её просто на дольше хватает. Евреев Infected Mushroom со всеми их многочисленными альбомами хватило на месяц где-то.

По сути своей мёртвая, да ;)

И что?

Я не преследую цель забить свой звуковой канал академически правильной последовательностью звуков.

Ну там типа цеплять должно что ли. За душу трогать. Хз, Что-то в общем оттуда.

kostyarin_ ★★
()
Ответ на: комментарий от kostyarin_

Её просто на дольше хватает

Но это всего лишь означает, что новую нужно искать чаще!

Я не преследую цель забить свой звуковой канал академически правильной последовательностью звуков.

Ясно, спор стоика с гедонистом бесперспективен :P

mertvoprog
() автор топика
Ответ на: комментарий от mertvoprog

Это почему ещё?

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

Ну типа много кто сидит с этого IP-шника. И от этого Гугл недовольный. Меня даже в Гугл не пускает. У них там видимо криво сделано. С поиска перенаправляет на ввод капчи. И когда его вводишь, то опять перенаправляет на него же. В Гугле одни мастера работают, это 100%.

kostyarin_ ★★
()
Ответ на: комментарий от kostyarin_

Гугл недовольный

А кроме гугла и обгороженных рекапчою параш ходить больше некуда, что ли? ;)

В любом случае, от того, прокси это или VPN — перегруженность никак не зависит. Оба могут быть приватными, оба могут быть публичными.

криво сделано

Не-а, просто пока на одном клиенте капчу порешать — соседи-паразиты уже успевают наабьюзить опять и изнычтожить тяжко заработанное доверие к пройденной капче ;) Раз в год ведь и палка стреляет, как говорится.

А ещё рекапча запросто может временно отказать в прохождении вообще.

mertvoprog
() автор топика
Последнее исправление: mertvoprog (всего исправлений: 1)
Ответ на: комментарий от mertvoprog

Всего лишь хочу заметить, что

проверять и первую, и вторую, и вообще любую ;)

и

Надо выгрепнуть из него все строчки пакетов, у которых статус — установлен.

Это 2 разные задачи.

ya-betmen ★★★★★
()
Ответ на: комментарий от Vladimirmir

Так ты не оправдывайся

Vladimirmir

anonymous
()

он строку перевернуть не может уже 2 года, а ты про какие-то dpkg

anonymous
()

не вижу доната

metaprog

anonymous
()
Ответ на: комментарий от kostyarin_

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

anonymous
()
Ответ на: комментарий от anonymous

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

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

kostyarin_ ★★
()
Ответ на: комментарий от mertvoprog

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

Да ладно. Временный бан вполне себе работает, и когда-то им пользовались. Не очень часто, но было. Просто таймера на него нет. Вывод из бана надо производить вручную. А про истечение срока давности бана модераторы могут и забыть.

Музейная тема

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

Вывод из бана надо производить вручную.

В современном мире это называется убогостью движка.

anonymous
()
Ответ на: комментарий от kostyarin_

и у них такой фигни нету

Очень даже есть, попробуйте-ка с Opera Mini на любой сайт пробиться, у которого 5-секундная клаудфлярозащита перед заходом ;)

mertvoprog
() автор топика

Вроде то, что надо. Скрин:

https://i.postimg.cc/rFPyQ1bY/mertvoprog.png

Если что, 105 - это английская буква i.

Оригинальная схема есть в Метапрог Онлайн, репозиторий «задача от mertvorpog».

Теперь встречный вопрос, так как хотелось бы непосредственно вызывать в Метапроге dpkg -l и парсить результат имеющейся функцией. В Лабвью подобная шняга есть, если что, называется System Exec.vi в стандартной библиотеке.

Как реализовать функцию, не только вызывающую команду (как system(), которую я уже заюзал), но и возвращающую то, что эта прога выплюнула в stdout. Да-да, тот же вопрос, что и в самой первой моей теме на ЛОРе (еще до тем про Метапрог):

Запись в stdin и чтение из stdout дочерних процессов

Однозначного и понятного ответа так и нет:(

П. С.: а, черт побери, i должна быть до первого пробела в строке, так ведь? Сейчас переделаю.

metaprog
()
Последнее исправление: metaprog (всего исправлений: 1)
Ответ на: комментарий от metaprog

Красивое решение.
Не то что там ненавистные текстовые языки программирования.
Сделаю распечатку диаграммы и повешу на стенку перед своим компьютером …

anonymous
()
Ответ на: комментарий от metaprog

Исправил. Теперь выдает все строчки, в которых до первого пробела есть английская i.

https://i.postimg.cc/YqRRV3wk/mertvoprog.png

Схемка пробегает все что до пробела циклом, ищет i (то есть байт 105). Я специально изменил входящее условие чтоб проверить - работает. Исходники в Метапрог онлайн, «задача от mertvoprog» версия 1.

Вопрос с чтением консольного выхлопа остается.

metaprog
()
Ответ на: комментарий от Vladimirmir

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

metaprog
()
Ответ на: комментарий от metaprog

Трепящите, антиметапрогеры, первый codediagarmmreview Метапрога! :P https://pic4a.ru/15/3kR.png

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

Вопрос с чтением консольного выхлопа остается.

Покопайте в сторону, как пёрловский модуль IPC::Open3 устроен ;) Они там вроде на сишке написаны как раз.

mertvoprog
() автор топика
Ответ на: комментарий от metaprog

отвлекающих моментов полно

И этот тред к ним относится, да?

Извините, Ваше Высочество, что отвлекли :P

mertvoprog
() автор топика
Ответ на: комментарий от metaprog

Как реализовать функцию, не только вызывающую команду (как system(), которую я уже заюзал), но и возвращающую то, что эта прога выплюнула в stdout.

popen()

Запись в stdin и чтение из stdout дочерних процессов

i-rinat же ответил.

MOPKOBKA ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Вы с Луны свалились? ;) @metaprog же птенец пингвина, надо прожевать, переварить, а потом БУЭЭЭЭЭ — в рот положить ;)

Кстати, раз уж Святейшество сравнивают себя с Линусом, почему бы на логотип Метапрога не сделать пиксельного пингвина в стиле WinNT3.1? вместо этой МММ ;)

mertvoprog
() автор топика
Ответ на: комментарий от mertvoprog

https://pic4a.ru/15/3kR.png

\n?

Да, символ новой строки, он же байт «10».

А если разделителем является произвольный проблельный символ?

Если не байт «32» (он же пробел) - пролет. В данном случае. Но можно скрутить и более мудреную схему с циклом по массиву из всех возможных пробельных символом.

Тут формируется новый метапроговский массив без первой строки?

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

А это забор элемента массива?

Да. Цикл по элементам массива.

А где тут, собственно, печать строки?

В теле функции. Открывай тело функции кликом мышки по ее пиктограмме (а не по входам и выходам), откроется ее схема. В конце концов все упирается в сишные примитивы (такие как арифметика, логика, указатели, sizeof) и функции сишных библиотек.

Как поиск подстроки-то происходит, там на выходе только индекс? или новая метапрогострока?

Новая структура, описывающая массив. Типы выходов же видно. Хотя индекс тоже можно взять.

а буфер в ней новый (то есть каждый раз копирование?!), или указывает на подбуфер большой строки, и при уничтожении буфера большой строки превратится в тыкву?

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

metaprog
()
Ответ на: комментарий от mertvoprog

Извините, Ваше Высочество, что отвлекли :P

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

metaprog
()
Ответ на: комментарий от metaprog

Да, символ новой строки

Ну и где это видно? ;) Можно же ⏎ отображать, например.

Вообще, такие вещи решаются по ситуации

Ясно, решали-решали проблемы сишных строк, а в итоге наступили на грабли похуже :P

mertvoprog
() автор топика
Ответ на: комментарий от metaprog

Но не детёныш пингвина ;)

Можно вместо пингвина заюзать какую-то редкую украинскую зверушку, дрофу, например, или заезженного ушастого ёжика ;) Проекту нужен кавайный маскот, без этого не взлетит!

mertvoprog
() автор топика
Ответ на: комментарий от metaprog

Котики — банальщина.

Нужно что-то оригинальное, отражающее революционность проекта, и визуальность — коршун? ;)

mertvoprog
() автор топика
Ответ на: комментарий от mertvoprog

Ну и где это видно?

Клацни мышкой на массиве, там в редакторе массива видно что символ «10».

Ясно, решали-решали проблемы сишных строк, а в итоге наступили на грабли похуже :P

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

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

metaprog
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.