۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

Mastodon UX خود را ایجاد کنید

داشبورد + فید خوان ساخته شده با SQL راهی آسان و طبیعی را در اختیار شما می‌گذارد تا فعالیت‌های Mastodon را به میزان دلخواه یا کمتر مصرف کنید.

داشبورد + فید خوان ساخته شده با SQL راهی آسان و طبیعی را در اختیار شما می‌گذارد تا فعالیت‌های Mastodon را به میزان دلخواه یا کمتر مصرف کنید.

من در مورد لیست آرزوهای Mastodon UX با تعدادی از آشنایان جدید آنجا بحث کرده ام. این گزیده از یک پایانه بلومبرگ برای Mastodon با بخشی از فهرست آرزوهای خودم به پایان می رسد.

در جدول زمانی 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 
            ( '۵۰' ),
            ( '۱۰۰' ),
            ( '۲۰۰' ),
            ( '۵۰۰' )
        )
        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
        $۳ 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 منفرد (معروف به عبارت جدول رایج با نام WITHtoots استفاده می‌کند تا داده‌ها را برای SELECT نتیجه‌گیری کند. . نسخه جدید CTE دیگری به نام boosts را وارد خط لوله می کند. از برای ارجاع به param "boost" {} استفاده می‌کند که به self.input.boosts ارسال شده از home.sp< نگاشت می‌شود. /code>

کد SQL همه استاندارد است. Postgres موتور داخل Steampipe است، و من گاهی اوقات از اصطلاحات خاص Postgres استفاده می کنم، اما فکر نمی کنم هیچ یک از آنها در اینجا اتفاق بیفتد.

کد HCL ممکن است ناآشنا باشد. Steampipe از HCL استفاده می کند زیرا مخاطبان اصلی آن متخصصان DevSecOps هستند که با Terraform که مبتنی بر HCL است آشنا هستند. اما این یک زبان بسیار ساده است که می تواند برای توصیف انواع منابع استفاده شود. در اینجا منابع ویجت هایی هستند که در داشبوردها ظاهر می شوند.

نکته دیگری که باید بدانید، اگر می‌خواهید آستین‌های خود را بالا بزنید و سعی کنید داشبوردهای خود را بسازید، این است که تجربه توسعه‌دهنده - باز هم به نظر مغرضانه من - بسیار عالی است زیرا اگر از ویرایشگر ذخیره خودکار استفاده می‌کنید، تغییرات شما (در کد HCL و SQL) در زمان واقعی منعکس شده است.

برای نشان دادن آن، در اینجا اسکرین‌کستی است که در پست وبلاگ خود برای معرفی داشبورد قرار داده ایم. سیستم.

در آنجا نشان داده نمی‌شود، زیرا می‌خواهیم روی مسیر شاد تمرکز کنیم، بازخورد بلادرنگی است که درخواست‌های SQL شما باعث ایجاد خطاهای Postgres می‌شوند. این تجربه بسیار شبیه تجربه قهرمان برت ویکتور در اختراع بر روی اصل است. اصل اصلی: "سازندگان نیاز به ارتباط فوری با آنچه که خلق می کنند دارند."

این روش اشتباهی است که اغلب ما را محدود می‌کند.

اگر صحنه مشکلی داشته باشد، یا اگر بروم و تغییراتی ایجاد کنم، یا اگر ایده های بیشتری دارم، باید به کد بازگردم، و کد را ویرایش، کامپایل و اجرا می کنم، ببینم چه شکلی است. . هر مشکلی هست به کد باز می گردم. بیشتر وقت من صرف کار روی کد می‌شود، کورکورانه در یک ویرایشگر متن کار می‌کنم، بدون اینکه ارتباط فوری با این چیز داشته باشم، چیزی که در واقع تلاش می‌کنم ایجاد کنم.

و راه درست اینجاست.

من این عکس را در کنار دارم، و کد را در کنار، و این قسمت آسمان را می‌کشد و کوه‌ها را می‌کشد و درخت را می‌کشد، و وقتی هر تغییری در کد ایجاد می‌کنم، تصویر تغییر می‌کند. بلافاصله. مستقیما. بنابراین کد و تصویر همیشه هماهنگ هستند. کامپایل و اجرا وجود ندارد. من فقط چیزهایی را در کد تغییر می دهم و می بینم که چیزها در تصویر تغییر می کنند.

اختراع بر اساس

ما می‌خواهیم هر جا که می‌توانیم به روش درست کار کنیم. این تجربه هنوز در همه جا در دسترس نیست، اما در Steampipe در دسترس است، جایی که به شدت آزمایش و نمونه‌سازی را که بسیاری از ما الهام گرفته‌ایم در حین بررسی در Mastodon انجام می‌دهیم، امکان‌پذیر می‌سازد.

اگر می‌خواهید خودتان این را امتحان کنید، لطفاً دستورالعمل‌های راه‌اندازی افزونه را بررسی کنید. a> که APIهای Mastodon را به جداول Postgres و داشبوردهای که از آن جداول استفاده می‌کنند، نگاشت می‌کند. و در صورت تمایل به من پینگ کنید (در Mastodon اگر دوست دارید!) هر سوالی ممکن است داشته باشید.

این مجموعه:

  1. خودمختاری، اندازه بسته، اصطکاک، هواکش و سرعت
  2. Mastodon، Steampipe و RSS
  3. مرور fediverse
  4. یک پایانه بلومبرگ برای Mastodon
  5. Mastodon UX خود را ایجاد کنید
  6. لیست ها و افراد موجود در Mastodon
  7. چند نفر در فید Mastodon من نیز امروز توییت کردند؟
  8. نشانی‌های اینترنتی Mastodon واجد شرایط نمونه
  9. نمودارهای رابطه ماستودون
  10. کار با لیست های Mastodon
  11. تصاویری که مضر در نظر گرفته می شوند (گاهی اوقات)
  12. نقشه برداری فدیورس وسیع تر
  13. پروتکل‌ها، APIها و قراردادها
  14. اخبار در fediverse
  15. نقشه برداری از افراد و برچسب ها در Mastodon
  16. تجسم نظارت سرور Mastodon
  17. جدول زمانی Mastodon برای تیم ها
  18. افزونه Mastodon اکنون در Steampipe Hub در دسترس است