luciferofastora

joined 9 months ago
[–] [email protected] 4 points 3 days ago (1 children)
[–] [email protected] 22 points 3 days ago (1 children)

A moment ago, it was 2330 and I figured I should go to bed.

It is now 0058.

[–] [email protected] 1 points 3 days ago (1 children)

Thank you. Funny enough, just today I chatted with a colleague that mentioned one of the tools was technically available to us, but actually not approved for use. Ordering it wouldn't be an issue, but getting it signed off would be quite the chore.

[–] [email protected] 1 points 4 days ago (3 children)

The fun comes when there is no actual data model. All in all, I'd say being familiar with the data model is about 60% of my job. 35% is building queries and query scripts for people who need regular exports. 5% is running after other people's fuckups.

Strap in, because this is a ride.

There is a raw database from a decade-and-a-half old app, which I get to access through a layer of views that does some joining, but not all, with absolutely no documentation on how the original database is structured or where things are pulled from or what anything refers to. No data dictionary, no list or map of key relations, some objects are mapped in two different views, no semantic naming of columns.

If you want to want to query order part delegations by who they're assigned to (Recipient in the app) you need to use the foreign key RefAssignmentUnit. The "Assignment" unit that did the delegation is just RefUnit. If you have orders that were created by a salesperson on behalf of a customer, OrderingPerson (also a foreign key, but not named Ref-) is the customer, while OrderingPerson2 is the salesperson that entered the order. Don't confuse that with Creator, which for orders created through the web form is usually a technical user, unless the salesperson is one of the veterans that use the direct app in which case it'll be the salesperson while OrderingPerson2 is null.

Also, we have many-to-many relationships that are mapped through reference tables... whose columns are named object and reference for each and every one. Have fun trying to memorize which refers to which so you don't need to look it up every damn time.

Create my own views to clean this up? Nope, only the third party service providers for the app can do that, and they don't wanna. Our internal app admin (singular) can use some awkward tool to generate those views, but there's no reverse lookup to see what a given column refers to. Also, they have no concept for what actually constitutes a good model because they're not really familiar with the database, just with the app.

Get my own serverless DB to create views that query the original DB? No can do, you'd need to order a whole server and that's pricy.
Get a cloud DB? Sure, but it will be managed by the cloud team and if you want to have or edit custom views, you'll get to create a project request. They'll put it in the backlog and work it into some future sprint.

Get literally any tool that allows me to efficiently create reusable data prep so I don't have to copy & paste the base transformations needed for a given query every fucking time and if the source DB ever changes I need to update all my query scripts? If you can somehow squeeze the time to prepare a convincing pitch - a full Power Point presentation, of course - between all your tedious and redundant query preparation and script maintenance, find a management sponsor willing to hear you out and hopefully propose your request to their superiors. Best case: It becomes a whole project - alternatives will have to be considered first, implications, security, costs, and you'll be the one having to assemble and present that information to management only to have some responsible person point out that it would actually be the remit of a different team... that also works in sprints, has a backlog and will give you no control over your prep.

And obviously, the app provider doesn't give us any advance notice of just what will change in the DB with the next update. We only learn that when a view breaks. The app admin can use the tool to refresh the affected views then, while I scramble to determine all the scripts that need to be updated and copy&paste the fix. If a user has been granted their own access to the database, odds are they'll come crying to me when their modified versions of my queries break.

There is a lot I like about my job, I acknowledge the difficulties of a historically grown system and service contracts, but the rigid and antiquated corporate culture can go take a long walk off a short pier.

[–] [email protected] 11 points 5 days ago

Oooh, I missed that. Nice!

[–] [email protected] 3 points 5 days ago

Agreed. The more we argue about the "how" of the protests, the more we're distracted from what they're actually protesting about. The most effective way of stopping people complaining about something isn't to shut them up, but to fix the thing.

If someone's poor and can't afford to buy food, no amount of fines or jail time will prevent them from going back to stealing food the second they get out because - guess what - they're still fucking poor. There's a food bank near where I lived a while ago that notoriously had long lines. Slowly shuffling forward in a queue that screams "I'm poor" must be uncomfortable, but they're still not stealing food while they have an alternative.

If you want people to stop vandalising shit in their outrage over exploitation and greed, fucking do something about the exploitation and greed. I'm sure those people could have thought of more pleasant ways to spend their time than creating their cornflour pigment, driving out there and getting arrested to make a point without leaving lasting damage.

[–] [email protected] 2 points 5 days ago

Fines for the poor are fees for the rich. When breaking laws becomes an investment, the laws become a hurdle to prevent competition.

[–] [email protected] -1 points 5 days ago

Oh shut the front door, for flipping real? What the frick? Why does nobody ever tell me this sh*t? Now I feel like a bleeping idiot.

[–] [email protected] 3 points 5 days ago

You know it's bad when even a two thousand year old gospel considers "rich people don't go to heaven" to be divine wisdom. It has always been thus.

There's no way the CEO of my last company - making a cool 6mil one year that I saw an article about the shareholders paying him a bonus of another few mil - works 125 times as hard as my 48k (gross) ass.

[–] [email protected] 1 points 5 days ago

I made it to two. It just keeps going.

[–] [email protected] 4 points 5 days ago

Instead of trolling kids that get pissed when their game shuts down mid-match and learn not to trust the internet, they get disgusted for life and learn not to trust the internet and also how horrible a place it can be.

[–] [email protected] 29 points 5 days ago (2 children)

hehe funny sex number

(69 Flatpaks)

8
submitted 4 weeks ago* (last edited 4 weeks ago) by [email protected] to c/[email protected]
 

My use case is splitting audio into separate channels in OBS for Twitch Streams so I can play music live without getting my VoDs struck. If my approach is entirely wrong for the use case, I'm happy to scrap the whole thing and sign it off as learning experience.

My solution is to use virtual sinks that I record through Audio Sources in OBS. I've got two loopback-devices (config at the end) with media.class = Audio/Sink, assign my playback streams to the relevant output capture.
The loopback of each is then passed on to the common default (physical) output device, namely my headphones.
So far, this has been working great for me, aside from minor inconveniences:

The first is that I want certain apps or playback streams to automatically be assigned to the capture sinks upon starting the app.
I had a working pulseaudio¹ setup on Ubuntu where I used pavucontrol to set the output once per app and it remembered that setting. Every time I opened that app, it would direct its playback streams to that sink.
I migrated to Nobara and opted to try configuring pipewire (directly)² instead. The devices are created correctly but every time I (re-)start a relevant app I have to go set its capture device again.

The second is that occasionaly upon logging in, one loopback stream will initially be passed to the other sink instead of the default output, which resolves upon restarting pipewire³. Is something wrong with my config?
Both have the same target.object and restarting it fixes it, so I'm guessing it may be some race condition thing where the alsa_output isn't initialised at startup yet, but I don't know how to diagnose or fix that


1: I have since learned that apparently it's actually still pipewire parsing that config, but the point is I configured it through ~/.config/pulse/default.pa

2: ~/config/pipewire/pipewire.conf.d/default-devices.conf

3: Trying to set it in pavucontrol doesn't work and keeps resetting that playback's output to the given sink if I try to select the correct capture device. Repatching them in Helvum does the job, but then pavucontrol just shows blank for the device (doesn't interfere with controlling the volume, but maybe it's relevant for diagnosing)


My current ~/.config/pipewire/pipewire.conf.d/default-devices.conf:

context.modules = [
    {   name = libpipewire-module-loopback
        args = {
            audio.position = [ FL FR ]
            capture.props = {
                media.class = Audio/Sink
                node.name = vod_sink
                node.description = "Sink for VoD Audio"
            }
            playback.props = {
                node.name = "vod_sink.output"
                node.description = "VoD Audio"
                node.passive = true
                target.object = "alsa_output.pci-0000_00_1b.0.analog-stereo"
            }
        }
    }
    {   name = libpipewire-module-loopback
        args = {
            audio.position = [ FL FR ]
            capture.props = {
                media.class = Audio/Sink
                node.name = live_sink
                node.description = "Sink for Live-Only Audio"
            }
            playback.props = {
                node.name = "live_sink.output"
                node.description = "Live-Only Audio"
                node.passive = true
                target.object = "alsa_output.pci-0000_00_1b.0.analog-stereo"
            }
        }
    }    
]
view more: next ›