Я обсуждал списки пожеланий Mastodon UX с некоторыми новыми знакомыми. Этот отрывок из терминала Bloomberg для Mastodon завершает часть моего собственного списка пожеланий.
На временной шкале мастодонтов болтливый человек может доминировать над тем, что вы видите с первого взгляда. Когда мы участвуем в социальных сетях, мы всегда делаем ставки на внимание друг друга. Как издатели каналов, разумно учитывать, как шквал элементов может ошеломить читательский опыт. Но также полезно подумать о том, как читатели канала могут фильтровать источник болтливости. База SQL Steampipe предоставляет простой и естественный способ сделать это. Вот часть запроса, который управляет представлением списка.
select distinct on (list, person, hour) -- only one per list/user/hour person, url, hour, toot from data order by hour desc, list, personБыло легко внедрить правило, которое ограничивает каждого человека максимум одним гудоком в час. Следующими шагами здесь будет применение этого правила к другим представлениям, отображение количества свернутых инструментов и включение таких правил для каждого человека.
В качестве разминки я решил сначала добавить простой элемент управления для бустов, который позволяет мне видеть мою домашнюю временную шкалу с бустами или без них. Чтобы дать читателю, склонному к техническим наукам, представление о том, что связано с такими вещами в Steampipe, я опишу изменения здесь. Я явно предвзят, но считаю эту среду программирования доступной и продуктивной. Если вам это тоже кажется, вы можете попробовать некоторые элементы из своего собственного списка пожеланий UX. И если вы это сделаете, дайте мне знать, как это происходит!
Вот исходные версии двух файлов, которые я изменил, чтобы добавить новую функцию. Сначала есть home.sp
который определяет панель управления для домашней временной шкалы.
dashboard "Home" { tags = { service = "Mastodon" } container { // a text widget with the HTML links that define the menu of dashboards } container { text { // a block that displays the HTML links that form a menu of dashboards } card { // a block that reports the name of my server } input "limit" { width = 2 title = "limit" sql = <<EOQ with limits(label) as ( values ( '50' ), ( '100' ), ( '200' ), ( '500' ) ) select label, label::int as value from limits EOQ } } container { table { title = "home: recent toots" query = query.timeline args = [ "home", self.input.limit ] column "person" { wrap = "all" } column "toot" { wrap = "all" } column "url" { wrap = "all" } } } }
И вот новая версия. Он добавляет блок ввода с именем boosts
и передает его значение указанному запросу.
dashboard "Home" { tags = { service = "Mastodon" } container { // a text widget with the HTML links that define the menu of dashboards } container { text { // a block that displays the HTML links that form a menu of dashboards } card { // a block that reports the name of my server } input "limit" { // as above } input "boosts" { width = 2 title = "boosts" sql = <<EOQ with boosts(label, value) as ( values ( 'include', 'include' ), ( 'hide', ' ' ), ( 'only', ' 🢁 ' ) ) select label, value from boosts EOQ } } container { table { // as above args = [ "home", self.input.limit, self.input.boosts ] } } }
Информационные панели Steampipe построены на двух языках. HCL (язык конфигурации HashiCorp) определяет виджеты UX, а SQL заполняет их данными. В этом случае мы выбираем статические значения для boosts
вход. Но там может выполняться любой запрос Steampipe! Например, вот блок ввода, который я использую на панели инструментов, который фильтрует временную шкалу по списку, в который я назначил людей.
input "list" { type = "select" width = 2 title = "search home timeline" sql = <<EOQ select title as label, title as value from mastodon_list order by title EOQ }
Теперь вот ссылочный запрос, query.timeline
из файла query.sp
который содержит запросы, используемые всеми инструментальными панелями.
query "timeline" { sql = <<EOQ with toots as ( select account_url as account, case when display_name="" then user_name else display_name end as person, case when reblog -> 'url' is null then content else reblog_content end as toot, to_char(created_at, 'MM-DD HH24:MI') as created_at, case when reblog -> 'url' is not null then '🢁' else '' end as boosted, case when in_reply_to_account_id is not null then ' 🢂 ' || ( select acct from mastodon_account where id = in_reply_to_account_id ) else '' end as in_reply_to, case when reblog -> 'url' is not null then reblog ->> 'url' else url end as url from mastodon_toot where timeline = $1 limit $2 ) select account, person || case when in_reply_to is null then '' else in_reply_to end as person, boosted || ' ' || toot as toot, url from toots order by created_at desc EOQ param "timeline" {} param "limit" {} }
А вот и новая версия этого запроса.
query "timeline" { sql = <<EOQ with toots as ( // as above ), boosted as ( select $3 as boost, boosted, account, in_reply_to, person, toot, url from toots order by created_at desc ) select account, person || case when in_reply_to is null then '' else in_reply_to end as person, boosted || ' ' || toot as toot, url from boosted where boost = boosted or boost="include" or boost="n/a" EOQ param "timeline" {} param "limit" {} param "boost" {} }
В исходной версии используется одно CTE (обычное табличное выражение, также известное как WITH
пункт), toots
чтобы упорядочить данные для заключения SELECT
. Новая версия вставляет еще один CTE, повышает, в трубопровод. Оно использует $3
ссылаться param "boost" {}
который сопоставляется с self.input.boosts
перешел от home.sp
Код SQL стандартный. Postgres — это движок внутри Steampipe, и я иногда использую специфичные для Postgres идиомы, но я не думаю, что здесь происходит что-то подобное.
Код HCL может быть незнакомым. Steampipe использует HCL, потому что его основная аудитория — профессионалы DevSecOps, знакомые с Terraform, основанным на HCL. Но это довольно простой язык, который можно использовать для описания всех видов ресурсов. Здесь ресурсы — это виджеты, которые появляются на информационных панелях.
Еще одна вещь, которую нужно знать, если вы хотите засучить рукава и попробовать создать свои собственные информационные панели, заключается в том, что опыт разработчиков — опять же, по моему предвзятому мнению! — довольно хорош, потому что, если вы используете автосохраняющийся редактор, вы увидите ваши изменения (как в коде HCL, так и в коде SQL) отражаются в режиме реального времени.
Чтобы проиллюстрировать это, вот скринкаст, который мы включили в наш пост в блоге, представляющий систему панели инструментов.
Здесь не показана, потому что мы хотели сосредоточиться на счастливом пути, обратная связь в реальном времени, когда ваши SQL-запросы провоцируют ошибки Postgres. Опыт очень похож на тот, который Брет Виктор отстаивает в «Изобретая на основе принципа». Основной принцип: «Создатели нуждаются в непосредственной связи с тем, что они создают».
Вот неправильный путь, который слишком часто ограничивает нас.
Если со сценой что-то не так, или если я иду и вношу изменения, или если у меня есть дополнительные идеи, я должен вернуться к коду, и я редактирую код, компилирую и запускаю, смотрю, как он выглядит. Что-то не так, я возвращаюсь к коду. Большую часть времени я работаю в коде, работая в текстовом редакторе вслепую, без непосредственной связи с этим делом, что я собственно и пытаюсь сделать.
И вот правильный путь.
У меня есть эта картинка сбоку и код сбоку, и эта часть рисует небо, эта рисует горы, а эта рисует дерево, и когда я вношу какие-либо изменения в код, картинка сразу меняется. Таким образом, код и изображение всегда синхронизированы; нет компиляции и запуска. Я просто меняю что-то в коде и вижу, как что-то меняется на картинке.
Мы хотим работать правильно везде, где это возможно. Этот опыт пока доступен не везде, но он доступен в Steampipe, где он дает возможность экспериментировать и создавать прототипы, на которые многие из нас вдохновились, погружаясь в Mastodon.
Если вы хотите попробовать это сами, ознакомьтесь с инструкциями по установке плагина, который сопоставляет API Mastodon с таблицами Postgres, а также инструментальными панелями, которые используют эти таблицы, и отправьте мне запрос (на Mastodon, если хотите!) с любыми вопросами, которые вы можете задать. иметь.
Эта серия:
- Автономность, размер пакета, трение, разветвление и скорость
- Mastodon, Steampipe и RSS
- Просмотр федиверса
- Терминал Bloomberg для Mastodon
- Создайте свой собственный Mastodon UX
- Списки и люди на Mastodon
- Сколько людей в моей ленте Mastodon также написали сегодня в Твиттере?
- URL-адреса Mastodon с указанием экземпляра
- Графики взаимоотношений мастодонтов
- Работа со списками мастодонтов
- Изображения считаются вредными (иногда)
- Картирование более широкой федеральной сети
- Протоколы, API и соглашения
- Новости в федерации
- Сопоставление людей и тегов в Mastodon
- Визуализация модерации сервера Mastodon
- Сроки Mastodon для команд
- Плагин Mastodon теперь доступен на Steampipe Hub.
Далее прочитайте это:
- Лучшее программное обеспечение с открытым исходным кодом 2022 года
- Разработчики не хотят заниматься операциями
- 7 причин, почему Java по-прежнему великолепна
- Почему Wasm — это будущее облачных вычислений
- Почему оценки программной инженерии — это мусор
- Объяснение непрерывной интеграции и непрерывной доставки