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)

Это решается через awk.

anonymous
()
dpkg -i | awk '{ if (substr($1,1,1) == "i" ) print $0 }'

Первый символ, первой колонки если равен «i» – печатай строку.

/metathread

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

Первый символ, первой колонки

Не катит ;)

Описано же: может быть в любой позиции. А всего их даже три порой бывает.

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

Не распарсил аскикартинку, есть же построители диаграмм онлайн, попробуйте в app.diagrams.net нарисовать и скинуть на имгур картинку, ну или в плантюмл planttext.com хотя бы и код сюда.

Второе, эта проблема высосана из пальца и заключается в кривом выхлопе dpkg, если бы он предоставлял выхлоп в ксв-файл, то задача решалось бы простым sql-подобным запросом.

mydibyje ★★★
()
Последнее исправление: mydibyje (всего исправлений: 1)

Дело осложняется тем, что кроме ii, там может быть hi, ic, it и прочая шняга.

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

egrep '^.?i'
anonymous
()

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

высирач, шиндузятники

Русский языка сложный однако.

Дайте уже протухшей шутке с метапрогом почить в бозе.

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

Не катит ;)

Описано же: может быть в любой позиции. А всего их даже три порой бывает.

Во первых, глянь флаги dpkg, там могут быть нормальные выхлопы для целей. Во вторых, пофигу на твоё «не катит», ты как составитель новости годный пример приводи, а не «там в описании». В-третьих, это решается awk дописыванием пары условий.

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

Дайте уже протухшей шутке с метапрогом почить в бозе.

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

Кстати Мертвопрог, это PR-менеджен Метапрога.

anonymous
()

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

Ну и с текстовыми языками есть старый ДУБОВЫЙ метод (как сказал один мой собеседник на 4PDA по похожему случаю, «дуб — хорошее дерево»), отказаться от регулярок и анализировать вручную, «если от подстроки BVN слева будет подстрока 42 справа». Будет большая (и возможно, неоптимальная по времени, хотя это дискуссионно) простыня с комментариями. Зато читаемая. :)

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

Дайте уже протухшей шутке с метапрогом почить в бозе.

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

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

похоронить их крайне тяжело

Конечно тяжело если в каждой теме отписываться поднимая ее в трекере. Попроси создателя данной темы зарплатой PR поделиться. C еще одним завсегдатаем сообразите на троих.

anonymous
()
dpkg -i | awk '$1 ~ /i/'
AnDoR ★★★★★
()
Ответ на: комментарий от hobbit

Регулярки должны умереть, grammars'ы из Raku будут перенесены в метапрог.

MOPKOBKA ★★★
()

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

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

Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Cfg-files/Unpacked/Failed-cfg/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)

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

Ну '^\S*?i\S*?\s' чуть компактнее, да ;) Но сути не меняет — большое, страшное, и на непервой колонке ещё хуже станет.

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

скинуть на имгур

Что за говноедство?

Вы бы ещё radikal.ru предложили.

плантюмл

Тормозное прожорливое поделие. Спасибо, напердолились в универе.

Мы все конспекты лекций только в виде ASCII-арта и записывали, со всякими порисульками включительно. Без привлечения TeX и прочих костылей, которыми надо компилировать (!) и отлаживать (!!), ибо когда это делать? — строчить надо! А потом ещё морочиться, в каком виде это опубликовать, чтобы читать с любого тапка, где есть http.

если бы он предоставлял выхлоп в ксв-файл

А ещё лучше объекты, как в пошуршелле, ага.

Продолжайте фантазировать :P

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

‘^.?i’

Неуниверсально, не покроет случаи, когда i третья или вообще какая угодно.

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

будь мужиком

Ахтунг, гендерная пропаганда!

протухшей

Что Вы сделали, чтоб она не протухла? :P

Похоронить её могут только модераторы, но они что-то опять не спешат. Ну и ладно.

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

ты как составитель новости годный пример приводи

Ну придумайте задачку лучше :P

Написано ж — учебная, и условия задачи сформулированы, безотносительно того, какие ограничения на вывод букоффок заложены в dpkg. Чо пристали? :P

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

анализировать вручную

Ну дык регулярки эти ваши — новомодное излишество.

Если под древние версии JS писать, или там под J2ME без левых либ, то их там и вовсе нет :P

Вот Наш код парсера вшитого конфига:

import javax.microedition.io.*;
import java.io.*;
import java.util.Vector;

...

	private void readConfig() {
		try {
			StringBuffer sbuf = new StringBuffer(128);
			char[] buf = new char[128];
			Reader in = new InputStreamReader(this.getClass().getResourceAsStream("/res/coords.txt"));
			int read;
			while ((read = in.read(buf, 0, buf.length)) != -1) {
				sbuf.append(buf, 0, read);
			}

			String config = sbuf.toString();
			int separator1Pos = config.indexOf("\n");
			int separator2Pos = config.indexOf("\n", separator1Pos + 1);
			String lat = config.substring(0, separator1Pos);
			String lon = config.substring(separator1Pos + 1, separator2Pos);
			String msl = config.substring(separator2Pos + 1);

			sbuf = new StringBuffer(128);
			sbuf.append("https://api.met.no/weatherapi/locationforecastlts/1.3/?lat=");
			sbuf.append(lat);
			sbuf.append("&lon=");
			sbuf.append(lon);
			sbuf.append("&msl=");
			sbuf.append(msl);
			requestUri = sbuf.toString();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
mertvoprog
() автор топика
Ответ на: комментарий от mertvoprog

Ахтунг, гендерная пропаганда!

Ты банален и уныл. Лучше уж накати. Тебя призвали совершить хоть один достойный поступок, но ты не осилишь походу. Жалкое зрелище.

Что Вы сделали, чтоб она не протухла?

А ты что сделал для хип-хопа в свои годы? :) :( XD )))))))

Рассказывай несвежие шутки дальше.

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

плантюмл

Тормозное прожорливое поделие. Спасибо, напердолились в универе.

Ещё и вырвиглазное. У js-sequence-diagrams есть неплохой рендерер.

Anon->>Metaprog: Hello Metaprog, how are you?
Metaprog->>LOR: Check out my work!
LOR-->>Metaprog: What about railways?
Metaprog-->>Anon: I feel great!

Картинка

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

Владимир, Вы ли это? Ущемлением прав анонов, «они»-таки вынудили Вас зарегистрироваться?

Надоело оправдываться за чужие посты.

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

А ic?!

ic  mysql-server-5.6                                            5.6.30-1                                     amd64        MySQL database server binaries and system database setup
ic  texlive-science                                             2016.20160819-1                              all          TeX Live: Natural and computer sciences

Плюс если apt в это время шатает пакеты (вызов dpkg-то блокировок не запрашивает), то могут быть и другие буковки, при этом первая i всё равно сигнализирует, что пакет вернётся в установленное состояние, просто чуть позже ;)

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

Лучше уж накати

Наркопропаганду тоже отставить.

достойный

Ничего достойного ни в алкоголизме, ни в гендерной бинарности нет. Вот положить болт на общественные устои — это мужество надо :P

А ты что сделал для хип-хопа в свои годы?

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

Где новые жанры, машувать, после дабстепа с производными и вапорвейва (и тот новый лишь условно) ни фига нету!

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

Ещё и вырвиглазное

Ну это полбеды, StarUML (классический, а не который на JS переписали) тоже вырвиглазие пиксельное выдаёт.

Беда в том, что чтобы тюнить положение элементов початоками/кинецами (банально чтобы запихнуть красиво на лист A4, например) — надо знатно плясать и перекомпилировать каждый раз.

До plantuml ещё пару лет трахались с LaTeX-пакетами для диаграмм разной степени кривизны.

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

А могли бы просто выложить GPG-подпись и подписывать ею впредь свои посты ;)

Но увы — Вы избрали путь к отступлению.

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

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

Любой исполнитель со временем становится репером.

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

Теперь придется оправдываться за свои.

Владимир

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

Владимир.

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

‘^\S*?i\S*?\s’

Суть то не в этом. Зачем писать шаблон регулярки после i? Тебе же вообще не важно что там дальше. Чего ты тогда всю строку не описал? :)

Ещё нет необходимости включать ленивую квантификацию. Более того, ЕМНИП, в случае -E она не будет работать.

большое, страшное

То что я написал - не большое и не страшное.

и на непервой колонке ещё хуже станет

Да, станет.

Поиск по третьей колонке (для другой - меняй {2} на {$COL_NUMBER-1}):

... | grep -E '^(\S+\s+){2}\S*i'
Tanger ★★★★★
()
Ответ на: комментарий от mertvoprog

В XXI веке нужны какие-то «исполнители», кроме ЭВМ?

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

Машины не умеют в гангста-реп. Если одеть на системник сутенёрскую шубу, то он перегреется и сдохнет. К тому же, сколько выстрелов выдержит средний комп? Нормальный репер танкует 7 без проблем.

Как видите, машины пока далеки от совершенства в репе.

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

Зачем писать шаблон регулярки после i?

А, ну тут Вы правы, это огрызок от нерасширенного синтаксиса, где ленивый квантификатор вообще не работает ;)

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

Так речь о том, что рэп устарел.

Реп не устаревает. Он накатывает волной и потом сливается. Просто сейчас его спад (слив). Через время, годы, опять накатит. Обычное дело. Если посмотреть в прошлое, то на одой из таких волн как раз взлетел Дэцл (мир его праху). Ну и так далее. Как-то глубоко оценивать периодичность этих волн я не брался, но всё же тема реальная.

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

А ic?!

Хотел установить но что-то пошло не так?

Плюс если apt в это время шатает пакеты

То они ещё не установлены.

Если хочешь те которые ты отправил в установку, то проверяй первую букву.

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

Хотел установить но что-то пошло не так?

А хрен его знает :P Видимо, что-то подобное состоянию rc, только кривое.

То они ещё не установлены.

Почему? Может обновляться один и тот же пакет.

Если хочешь те которые ты отправил в установку, то проверяй первую букву.

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

Чего доказать-то хотите?

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