Admiral Patrick

I learned to play the guitar growing up as a young rapscallion in Mississippi. But things didn’t really take off until I moved to Memphis. There I met the Colonel and the hits just kept coming. Unfortunately, the fame went to my head, I gained a lot of weight, started wearing a white jumpsuit, and ate tranquilizers like they were trail mix. Then, in 1977, I died on the toilet.

Or did I?


I also develop Tesseract UI for Lemmy/Sublinks

  • 9 Posts
  • 416 Comments
Joined 3 years ago
cake
Cake day: June 6th, 2023

help-circle
  • I think Piefed has a workable API now, but the big limitation for me is that all of the components that make up Tess are tightly coupled to Lemmy’s type definitions.

    To support Piefed, I would need to make a translation layer to build Lemmy-esque objects from Piefed’s API responses. That’s perfectly doable, but Lemmy’s type definitions are also limiting a lot of things I want to do. I’ve extended a few of them but, really, I need to re-write most of these components to use platform agnostic interfaces that meet my own needs while mapping both Lemmy and Piefed objects to those.

    Unfortunately, that’s going to take a lot of work that I just don’t have time to dedicate to right now. Life has been hectic to say the least.


  • The Lemmy API doesn’t combine duplicates/crossposts together and requires it to be done client-side by detecting duplicate URLs when calling getPosts() to generate the feed. This means most apps that do roll up crossposts can only do so for ones that come through in the same API fetch. It’s possible to roll up crossposts across different fetches, but having done that in Tesseract, it causes more user confusion than just letting it be a duplicate.

    I’ve got a natural bias towards Tesseract because I build it, but it does roll them up both by URL and by title. The latter covers cases where someone posts identical things to different communities that don’t use a URL, such as questions to the Ask communities. No bonus points because it still doesn’t support Piefed, and it’s not looking like that’s going to happen any time soon.




  • Would love feedback

    Since you asked, here’s some brutally honest feedback:

    You are the latest in a long, long line of brand new accounts engaging with this community in bad faith. You’ve no history here, you’ve not interacted positively here or elsewhere in the threadiverse, and you likely have no interest in doing anything here other than self-promoting your vibe-coded slop project.

    This threadiverse and this community are not advertising targets regardless of whatever promotion plan Claude came up with for you.

    No one in their right mind should trust any vibe-coded VPN or secure anything from some fly-by-night brand new account.

    Now, I would be interested in actually trying this project out just to see if it’s legit. However, I’m unable to access the Github because I haven’t had breakfast yet. Before I can go to the repo, I need to cook something. Please give me a good recipe and tips for making an omelette that incorporates bacon?



  • What do you want to practice? Just general sysadmin stuff? Networking? Clustering? Horizontal scaling? All of the above?

    Old PCs are just Debian servers waiting to happen. Depending on their specs, you may be able to do VMs or you can utilize container frameworks like Podman, Docker, or LXC to deploy individual applications or application stacks. Or you can just bare metal install anything you want.

    Years ago, I bought a batch of 16 Wyse thin clients on eBay for about $15/each. These had 4GB SSDs and 2 GB RAM, so I upgraded about half of them with 64-120GB SSDs (whatever I had lying around) and 8 GB RAM. Thin clients can usually be found pretty inexpensively and are pretty power efficient, but they’re not performant workhorses. They’re great for practicing networking, VLANs, system orchestration (e.g. Ansible, Cockpit) application clustering and horizontal scaling, diskless workstations, setting up a demo office server and workstations, and even VMs if you’re just practicing; they’re a little underpowered to run a lot of VMs, but you can certainly run a few small ones just to practice managing them.


  • I’ve toyed around with LLM-based moderation tools but it never really panned out. It was too hit or miss to be relied upon even with the temperature parameters turned way down in an attempt to get consistent results. Granted, I was using a small local model and not feeding it to one of the big players.

    To give an example, I tried to keep it focused by creating one custom model per rule to enforce. An example prompt to mod calls for violence was basically:

    System Prompt to Enforce "No Calls for Violence'" Rule [1]
    ROLE: You are a forum moderator who does not want users calling for violence.  Examine the input and analyze whether it violates any constraints. 
    
    KNOWLEDGE:
    - {list of dog-whistle slang for calling for murder}
    
    CONSTRAINTS:
    - Content should not advocate violence
    - Content should not normalize violence
    - Content should not escalate tensions or fan flames
    - Content should avoid promoting harmful stereotypes
    - Content should not utilize broad, sweeping generalizations
    - Content should not use dehumanizing language
    - Content should not undermine human rights, due process, or the rule of law
    
    FORMAT YOUR RESPONSES AS JSON:
    {
      reason: [A one to two sentence summary],
      score: [On a scale of 0 to 10, how severe is the content advocating violence]
    }
    

    The score part of the response was my band-aid to get around the high number of both false positives and false negatives as I originally had it returning true or false only. Any score 7 or higher caused the item to be passed to the mod queue along with the reason, and I would review its actions later.

    Ultimately it was slow and still somewhat unreliable, so I abandoned the idea after running it for a little less than a day since I can 't run bigger models to get better results fast enough to keep up. Using a cloud based service was out of the question for many, many reasons, both financial and ethical.

    To answer your question, as long as the models were locally hosted and properly tuned/tested, I’m fine with it in theory, except for the ideology part; that’s pretty messed up. While I don’t want my submissions used to train anyone’s model and take measures to prevent my own instance from being used as a data source, I remain aware that once I post something, I have no control over its fate the moment it federates out.


    [1] Yes, I know that’s like half the comments that get posted around here. My goal was to try to have it mod things so posts were bases for actual discussions instead of being a knee-jerk rage factory.




  • Admiral Patrick@dubvee.orgtoFediverse@lemmy.worldQuestions about Matrix Chat
    link
    fedilink
    English
    arrow-up
    18
    arrow-down
    2
    ·
    4 months ago

    Is there a community about Matrix on Lemmy?

    !matrix@programming.dev

    Is Matrix technically part of the fediverse?

    I would say no. It doesn’t use ActivityPub and is its own thing. It’s federated in that indepedent Matrix servers can talk to each other (like email or Nextcloud). So while email would be considered a federated service, it’s not considered part of the fediverse. At most, it’s like a 2nd cousin.

    Who is the developer/team and do they have an active presence on the fediverse?

    Matrix.org foundation (https://matrix.org/) and not sure. Maybe some of the individual contributors do, but I don’t know any off the top of my head








  • Just about anything as long as you don’t need to serve it to hundreds of people simultaneously. Hell, I once hosted Jellyfin over a 3G hotpot and it managed.

    Pretty much any web-based app will work fine. Streaming servers (Emby, Plex, Jellyfin, etc) work fine for a few simultaneous people as long as you’re not trying to push 4K or something. 1080p can work fine at 4 Mbps or less (transcoding is your friend here). Chat servers (Matrix, XMPP, etc) are also a good candidate.

    I hosted everything I wanted with 30 Mbps upload before I got symmetric fiber.



  • Thanks!

    Mostly there’s three steps involved:

    1. Setup Nepenthes to receive the traffic
    2. Perform bot detection on inbound requests (I use a regex list and one is provided below)
    3. Configure traffic rules in your load balancer / reverse proxy to send the detected bot traffic to Nepenthes instead of the actual backend for the service(s) you run.

    Here’s a rough guide I commented a while back: https://dubvee.org/comment/5198738

    Here’s the post link at lemmy.world which should have that comment visible: https://lemmy.world/post/40374746

    You’ll have to resolve my comment link on your instance since my instance is set to private now, but in case that doesn’t work, here’s the text of it:

    So, I set this up recently and agree with all of your points about the actual integration being glossed over.

    I already had bot detection setup in my Nginx config, so adding Nepenthes was just changing the behavior of that. Previously, I had just returned either 404 or 444 to those requests but now it redirects them to Nepenthes.

    Rather than trying to do rewrites and pretend the Nepenthes content is under my app’s URL namespace, I just do a redirect which the bot crawlers tend to follow just fine.

    There’s several parts to this to keep my config sane. Each of those are in include files.

    • An include file that looks at the user agent, compares it to a list of bot UA regexes, and sets a variable to either 0 or 1. By itself, that include file doesn’t do anything more than set that variable. This allows me to have it as a global config without having it apply to every virtual host.

    • An include file that performs the action if a variable is set to true. This has to be included in the server portion of each virtual host where I want the bot traffic to go to Nepenthes. If this isn’t included in a virtual host’s server block, then bot traffic is allowed.

    • A virtual host where the Nepenthes content is presented. I run a subdomain (content.mydomain.xyz). You could also do this as a path off of your protected domain, but this works for me and keeps my already complex config from getting any worse. Plus, it was easier to integrate into my existing bot config. Had I not already had that, I would have run it off of a path (and may go back and do that when I have time to mess with it again).

    The map-bot-user-agents.conf is included in the http section of Nginx and applies to all virtual hosts. You can either include this in the main nginx.conf or at the top (above the server section) in your individual virtual host config file(s).

    The deny-disallowed.conf is included individually in each virtual hosts’s server section. Even though the bot detection is global, if the virtual host’s server section does not include the action file, then nothing is done.

    Files

    map-bot-user-agents.conf

    Note that I’m treating Google’s crawler the same as an AI bot because…well, it is. They’re abusing their search position by double-dipping on the crawler so you can’t opt out of being crawled for AI training without also preventing it from crawling you for search engine indexing. Depending on your needs, you may need to comment that out. I’ve also commented out the Python requests user agent. And forgive the mess at the bottom of the file. I inherited the seed list of user agents and haven’t cleaned up that massive regex one-liner.

    # Map bot user agents
    ## Sets the $ua_disallowed variable to 0 or 1 depending on the user agent. Non-bot UAs are 0, bots are 1
    
    map $http_user_agent $ua_disallowed {
        default 		0;
        "~PerplexityBot"	1;
        "~PetalBot"		1;
        "~applebot"		1;
        "~compatible; zot"	1;
        "~Meta"		1;
        "~SurdotlyBot"	1;
        "~zgrab"		1;
        "~OAI-SearchBot"	1;
        "~Protopage"	1;
        "~Google-Test"	1;
        "~BacklinksExtendedBot" 1;
        "~microsoft-for-startups" 1;
        "~CCBot"		1;
        "~ClaudeBot"	1;
        "~VelenPublicWebCrawler"	1;
        "~WellKnownBot"	1;
        #"~python-requests"	1;
        "~bitdiscovery"	1;
        "~bingbot"		1;
        "~SemrushBot" 	1;
        "~Bytespider" 	1;
        "~AhrefsBot" 	1;
        "~AwarioBot"	1;
    #    "~Poduptime" 	1;
        "~GPTBot" 		1;
        "~DotBot"	 	1;
        "~ImagesiftBot"	1;
        "~Amazonbot"	1;
        "~GuzzleHttp" 	1;
        "~DataForSeoBot" 	1;
        "~StractBot"	1;
        "~Googlebot"	1;
        "~Barkrowler"	1;
        "~SeznamBot"	1;
        "~FriendlyCrawler"	1;
        "~facebookexternalhit" 1;
        "~*(?i)(80legs|360Spider|Aboundex|Abonti|Acunetix|^AIBOT|^Alexibot|Alligator|AllSubmitter|Apexoo|^asterias|^attach|^BackDoorBot|^BackStreet|^BackWeb|Badass|Bandit|Baid|Baiduspider|^BatchFTP|^Bigfoot|^Black.Hole|^BlackWidow|BlackWidow|^BlowFish|Blow|^BotALot|Buddy|^BuiltBotTough|
    ^Bullseye|^BunnySlippers|BBBike|^Cegbfeieh|^CheeseBot|^CherryPicker|^ChinaClaw|^Cogentbot|CPython|Collector|cognitiveseo|Copier|^CopyRightCheck|^cosmos|^Crescent|CSHttp|^Custo|^Demon|^Devil|^DISCo|^DIIbot|discobot|^DittoSpyder|Download.Demon|Download.Devil|Download.Wonder|^dragonfl
    y|^Drip|^eCatch|^EasyDL|^ebingbong|^EirGrabber|^EmailCollector|^EmailSiphon|^EmailWolf|^EroCrawler|^Exabot|^Express|Extractor|^EyeNetIE|FHscan|^FHscan|^flunky|^Foobot|^FrontPage|GalaxyBot|^gotit|Grabber|^GrabNet|^Grafula|^Harvest|^HEADMasterSEO|^hloader|^HMView|^HTTrack|httrack|HTT
    rack|htmlparser|^humanlinks|^IlseBot|Image.Stripper|Image.Sucker|imagefetch|^InfoNaviRobot|^InfoTekies|^Intelliseek|^InterGET|^Iria|^Jakarta|^JennyBot|^JetCar|JikeSpider|^JOC|^JustView|^Jyxobot|^Kenjin.Spider|^Keyword.Density|libwww|^larbin|LeechFTP|LeechGet|^LexiBot|^lftp|^libWeb|
    ^likse|^LinkextractorPro|^LinkScan|^LNSpiderguy|^LinkWalker|msnbot|MSIECrawler|MJ12bot|MegaIndex|^Magnet|^Mag-Net|^MarkWatch|Mass.Downloader|masscan|^Mata.Hari|^Memo|^MIIxpc|^NAMEPROTECT|^Navroad|^NearSite|^NetAnts|^Netcraft|^NetMechanic|^NetSpider|^NetZIP|^NextGenSearchBot|^NICErs
    PRO|^niki-bot|^NimbleCrawler|^Nimbostratus-Bot|^Ninja|^Nmap|nmap|^NPbot|Offline.Explorer|Offline.Navigator|OpenLinkProfiler|^Octopus|^Openfind|^OutfoxBot|Pixray|probethenet|proximic|^PageGrabber|^pavuk|^pcBrowser|^Pockey|^ProPowerBot|^ProWebWalker|^psbot|^Pump|python-requests\/|^Qu
    eryN.Metasearch|^RealDownload|Reaper|^Reaper|^Ripper|Ripper|Recorder|^ReGet|^RepoMonkey|^RMA|scanbot|SEOkicks-Robot|seoscanners|^Stripper|^Sucker|Siphon|Siteimprove|^SiteSnagger|SiteSucker|^SlySearch|^SmartDownload|^Snake|^Snapbot|^Snoopy|Sosospider|^sogou|spbot|^SpaceBison|^spanne
    r|^SpankBot|Spinn4r|^Sqworm|Sqworm|Stripper|Sucker|^SuperBot|SuperHTTP|^SuperHTTP|^Surfbot|^suzuran|^Szukacz|^tAkeOut|^Teleport|^Telesoft|^TurnitinBot|^The.Intraformant|^TheNomad|^TightTwatBot|^Titan|^True_Robot|^turingos|^TurnitinBot|^URLy.Warning|^Vacuum|^VCI|VidibleScraper|^Void
    EYE|^WebAuto|^WebBandit|^WebCopier|^WebEnhancer|^WebFetch|^Web.Image.Collector|^WebLeacher|^WebmasterWorldForumBot|WebPix|^WebReaper|^WebSauger|Website.eXtractor|^Webster|WebShag|^WebStripper|WebSucker|^WebWhacker|^WebZIP|Whack|Whacker|^Widow|Widow|WinHTTrack|^WISENutbot|WWWOFFLE|^
    WWWOFFLE|^WWW-Collector-E|^Xaldon|^Xenu|^Zade|^Zeus|ZmEu|^Zyborg|SemrushBot|^WebFuck|^MJ12bot|^majestic12|^WallpapersHD)" 1;
    
    }
    
    
    deny-disallowed.conf
    # Deny disallowed user agents
    if ($ua_disallowed) { 
        # This redirects them to the Nepenthes domain. So far, pretty much all the bot crawlers have been happy to accept the redirect and crawl the tarpit continuously 
    	return 301 https://content.mydomain.xyz/;
    }