Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
JawnV6
Jul 4, 2004

So hot ...

Plorkyeran posted:

Well yes, we can have a discussion about when using global variables is and isn't worth it if you're done trying to claim that you aren't using global variables at all.
Er, care to point out where I did that?

Adbot
ADBOT LOVES YOU

Dren
Jan 5, 2001

Pillbug

Plorkyeran posted:

For example, in Python I'm moderately a fan of the following general pattern for mocking out deps for tests:

Python code:
class Foo:
    def _get_now_provider(self):
        return lambda: datetime.now()

    def do_stuff(self):
        now = self._get_now_provider()()
        ...

@patch.object(Foo, '_get_now_provider')
def test(_get_now_provider):
    _get_now_provider.return_value = lambda: datetime.date(2001, 1, 1)
    Foo().do_stuff()
Here, the global state being modified for testing is the class object itself. This is "icky", but doesn't have the following problems I've encountered with real code using IoC containers for DI:

The default implementation is right next to the thing using it, rather than being off in some other class whose name may not even appear in the file. This helps reduce DI's tendency to turn code into ravioli.

mock.patch is very clearly a unit testing thing. Using it to switch implementations based on a value in a config file would be obviously completely insane. OTOH, it seems to be an inevitable result of using IoC containers, since they do handle that quite well. However, this leads to your non-test code relying on mutable global state as a non-implementation-detail, which generally turns into a mess. "Don't monkey-patch classes outside of test code" seems to be a much simpler rule for people to follow than "Don't use this library that we're using for other things to solve a problem it appears to solve well but actually doesn't".

It doesn't lead as much to "gently caress it, let's DI all the things, including the things that we don't actually have to mock out for tests". IoC containers are a workaround for the fact that the language makes it excessively awkward to explicitly pass in all of an object's dependencies. However, sometimes (often) an object's dependency really is a logical part of its interface and should be explicitly passed in, even though it can be magically instantiated by the DI stuff. Automatic DI should be used only for things that are implementation details of the class, but because it's "easier" it tends to get used for more than that.

It of course also has far less boilerplate, but that's mostly a result of Python vs. Java (although some people do seem to really like writing Java amounts of boilerplate in Python).

You started two paragraphs with the word "It". What was "it" in those paragraphs?

Plorkyeran
Mar 22, 2007

To Escape The Shackles Of The Old Forums, We Must Reject The Tribal Negativity He Endorsed

Dren posted:

You started two paragraphs with the word "It". What was "it" in those paragraphs?

The pattern I gave a brief example of at the top of the post.

Macichne Leainig
Jul 26, 2012

by VG


Why, yes, this is a screenshot of two SQL query results (the latter being rowcount.) And yes, it's a table full of every possible date from January 1st, 2000 for 50 years. And yes, there are DateTime columns elsewhere in the database.

Sagacity
May 2, 2003
Hopefully my epitaph will be funnier than my custom title.

JawnV6 posted:

I want to check that my code can handle the DateTime cases around leap years and instead of moving some blocks around behind the scenes and leaving production code untouched you're still advocating mucking up the function parameters to pass that information in as if it's tenable for all cases.
If you would just read what I'm writing without getting so worked up. Where you are saying I am mucking up function arguments, in my view you are mucking up constructor arguments. My point: If you pass in function arguments you can be explicit about what your inputs are versus your output. In your implementation you need to pass in a DateTimeProvider, which then has to become part of the state of your class. I think that obscures what your code is doing, because it is unclear where (and when) you are using this DateTimeProvider.

Sagacity fucked around with this message at 19:24 on Apr 1, 2014

JawnV6
Jul 4, 2004

So hot ...

Sagacity posted:

If you would just read what I'm writing without getting so worked up. Where you are saying I am mucking up function arguments, in my view you are mucking up constructor arguments.
How could I not see all that nuance in this fine post:

Sagacity posted:

Is the "Fine whatEVS!" approach how you handle every discussion?
Truly I've just misrepresented you.

Sagacity posted:

In your implementation you need to pass in a DateTimeProvider, which then has to become part of the state of your class. I think that obscures what your code is doing, because it is unclear where (and when) you are using this DateTimeProvider.
I haven't listed an implementation. Jabor has. Jabor's done a lot of the specifics and appears to be having the other half of the conversation you want to have. Engagement with that poster will likely be more productive. Jabor addressed exactly this argument here, for your reference.

Sagacity
May 2, 2003
Hopefully my epitaph will be funnier than my custom title.
Oh I'm sorry, I thought you were part of this conversation as well. My mistake.

Let's continue with the thread!

Dirty Frank
Jul 8, 2004

JawnV6 posted:

Engagement with that poster will likely be more productive.
Holy poo poo this is honest, could you just start with this before posting at all in the future?

New Yorp New Yorp
Jul 18, 2003

Only in Kenya.
Pillbug
So, is DI / IOC a horror or not?

JawnV6
Jul 4, 2004

So hot ...

Sagacity posted:

Oh I'm sorry, I thought you were part of this conversation as well. My mistake.

Let's continue with the thread!
I can think you're an incorrect jackass without signing up to defend code I didn't write in a language I don't use. Strange, that.

Dirty Frank posted:

Holy poo poo this is honest, could you just start with this before posting at all in the future?
Thought there was a rule around here about reading posts before responding? Am i seriously on the hook for every lovely reader and assumption that gets made?

carry on then
Jul 10, 2010

by VideoGames

(and can't post for 10 years!)

Ithaqua posted:

So, is DI / IOC a horror or not?

Not sure yet, but could we please decide soon? I need to know whether to regard everyone who does or doesn't use it with extreme derision.

No Safe Word
Feb 26, 2005

Tha Chodesweller posted:



Why, yes, this is a screenshot of two SQL query results (the latter being rowcount.) And yes, it's a table full of every possible date from January 1st, 2000 for 50 years. And yes, there are DateTime columns elsewhere in the database.

This is not a horror at all and is in fact common practice in BI applications. That would be a date dimension table and more enhanced versions of it will have things like what quarter it is and even potentially things like what fiscal year/quarter it would be.

Plorkyeran
Mar 22, 2007

To Escape The Shackles Of The Old Forums, We Must Reject The Tribal Negativity He Endorsed

No Safe Word posted:

This is not a horror at all and is in fact common practice in BI applications. That would be a date dimension table and more enhanced versions of it will have things like what quarter it is and even potentially things like what fiscal year/quarter it would be.

not sure if troll

No Safe Word
Feb 26, 2005

Plorkyeran posted:

not sure if troll

It's not a troll, I guess you have never done anything with a data warehouse?

Just google "date dimension table" and you'll see this all over the place.

e: the only thing that's kind of weird is that Id column, everything I've seen/used had a "datekey" field that was just YYYYMMDD instead

No Safe Word fucked around with this message at 20:09 on Apr 1, 2014

Thermopyle
Jul 1, 2003

...the stupid are cocksure while the intelligent are full of doubt. —Bertrand Russell

No Safe Word posted:

It's not a troll, I guess you have never done anything with a data warehouse?

Just google "date dimension table" and you'll see this all over the place.

e: the only thing that's kind of weird is that Id column, everything I've seen/used had a "datekey" field that was just YYYYMMDD instead

This doesn't convince me that it isn't a horror. Lots of horrors are widespread.

What is the reason for such a table?

Subjunctive
Sep 12, 2006

✨sparkle and shine✨

I'm sorry if you thought I was impugning you, rather than your argument. Code with a lot of non-caller-controlled dependencies is IME (very large systems, but in a bunch of domains) fragile and hiding it doesn't help things. PFA can be ugly, though mostly in OO situations you isolate that to initialization. DI systems are, I find, much harder to reason about than ones built around fully-parametrized components that you can test piecewise and incrementally, and I'm surprised that in an embedded context the time and space overhead isn't problematic for you! I've worked in DI environments (the apps I most recently managed at work are built around it, and they do OK), I just find it to be like the general OO action-at-a-distance ick. "Oh, you called this method and it didn't work? Did you call this other invisibly-related one first? Does it have leftover state from a previous thing?"

But you can also adopt PFA incrementally too; the dichotomy is false. The report generator might well DI to DateTime and pass the value down, and a test driver for its components would pass a different value down. This lets you incrementally move to a system in which the API describes all the things on which the behavior of the function depends.

(BTW, if you're mocking DateTime via DI, make sure it actually advances in time or your timing thing won't work.)

Sagacity
May 2, 2003
Hopefully my epitaph will be funnier than my custom title.

Thermopyle posted:

What is the reason for such a table?
It allows a data warehouse to treat date/times like any other type of data. In a regular SQL database this distinction is moot, but these data warehouses also do lots of precalculation in order to respond very quickly to all sorts of queries. In this case it can create a hiearchy of the date/times quite trivially. For instance, if you want your rows grouped by month, it knows that February 2007 lies between id's 150000 and 170000 in your date table, etc.

Thermopyle
Jul 1, 2003

...the stupid are cocksure while the intelligent are full of doubt. —Bertrand Russell

Sagacity posted:

It allows a data warehouse to treat date/times like any other type of data. In a regular SQL database this distinction is moot, but these data warehouses also do lots of precalculation in order to respond very quickly to all sorts of queries. In this case it can create a hiearchy of the date/times quite trivially. For instance, if you want your rows grouped by month, it knows that February 2007 lies between id's 150000 and 170000 in your date table, etc.

Interesting. You have convinced me that it probably isn't a horror.

Subjunctive
Sep 12, 2006

✨sparkle and shine✨

Sagacity posted:

It allows a data warehouse to treat date/times like any other type of data. In a regular SQL database this distinction is moot, but these data warehouses also do lots of precalculation in order to respond very quickly to all sorts of queries. In this case it can create a hiearchy of the date/times quite trivially. For instance, if you want your rows grouped by month, it knows that February 2007 lies between id's 150000 and 170000 in your date table, etc.

I've always thought that was a weird reason. Times are already represented by an integer, so why not just use epoch-seconds? You get the same range-compare and representation as int, without needing a dimension table.

Edit: maybe because it lets the query system assume that all parameters are references to a dimension table?

Sagacity
May 2, 2003
Hopefully my epitaph will be funnier than my custom title.
Yes, it's probably something like that. The tooling usually allows you to autogenerate those tables, so I'm not sure why they didn't abstract it away entirely.

necrotic
Aug 2, 2005
I owe my brother big time for this!

Subjunctive posted:

I've always thought that was a weird reason. Times are already represented by an integer, so why not just use epoch-seconds? You get the same range-compare and representation as int, without needing a dimension table.

This will blow up in your face if you have anything in your warehouse with a date before the unix epoch.

Haystack
Jan 23, 2005





necrotic posted:

This will blow up in your face if you have anything in your warehouse with a date before the unix epoch.

Wouldn't you just store the appropriate negative value?

Subjunctive
Sep 12, 2006

✨sparkle and shine✨

necrotic posted:

This will blow up in your face if you have anything in your warehouse with a date before the unix epoch.

Probably not, given that signed integers exist. Unix uses one called time_t to represent date-times. :eng101:

Zombywuf
Mar 29, 2008

necrotic posted:

This will blow up in your face if you have anything in your warehouse with a date before the unix epoch.

Good job that most people don't log transactions in the past then really.

evensevenone
May 12, 2001
Glass is a solid.
time_t still runs out in 1902 (and 2038).

Subjunctive
Sep 12, 2006

✨sparkle and shine✨

evensevenone posted:

time_t still runs out in 1902 (and 2038).

Not on anything modern, where it's been 64-bit on 64-bit OSes (and some 32-bit ones as well) for years. If your database can't work with 64-bit ints, I feel bad for you and your data shoebox.

gariig
Dec 31, 2004
Beaten into submission by my fiance
Pillbug
Since this is SQL Server if you put a function in a WHERE clause (WHERE YEAR(Date) = 2007) it will cause an index scan which is really slow. Since the data is already computed in the table you can do an index seek because there is no SQL Server function in the WHERE clause (WHERE Year = 2007).

No Safe Word
Feb 26, 2005

If you've seen a fully fleshed out DimDate table (the one above is very narrow) it's a little more clear why you'd use this for reporting out of a Data Warehouse, just a random quick googling for a sample creation script gave me one with the following columns:

code:
                      [DateKey]
                    , [FullDate]
                    , [DateName]
                    , [DateNameUS]
                    , [DateNameEU]
                    , [DayOfWeek]
                    , [DayNameOfWeek]
                    , [DayOfMonth]
                    , [DayOfYear]
                    , [WeekdayWeekend]
                    , [WeekOfYear]
                    , [MonthName]
                    , [MonthOfYear]
                    , [IsLastDayOfMonth]
                    , [CalendarQuarter]
                    , [CalendarYear]
                    , [CalendarYearMonth]
                    , [CalendarYearQtr]
                    , [FiscalMonthOfYear]
                    , [FiscalQuarter]
                    , [FiscalYear]
                    , [FiscalYearMonth]
                    , [FiscalYearQtr]
So when you are doing analysis, you can slice on any of these portions of the date dimension quite fast because of all the precomputation that goes on when you build out all your BI bits. The one above doesn't get you a lot, so if anything the horror is how little is in that table :v:

I've seen even wider date dimension tables than that, some had holidays in them, some had DST stuff in it (which is obviously irrelevant if you have data that transcends boundaries where DST isn't identical in all of them).

Subjunctive
Sep 12, 2006

✨sparkle and shine✨

No Safe Word posted:

So when you are doing analysis, you can slice on any of these portions of the date dimension quite fast because of all the precomputation that goes on when you build out all your BI bits. The one above doesn't get you a lot, so if anything the horror is how little is in that table :v:

I've seen even wider date dimension tables than that, some had holidays in them, some had DST stuff in it (which is obviously irrelevant if you have data that transcends boundaries where DST isn't identical in all of them).

I'm not sure I'm following. You join against the table with WHERE DateDimension.DayOfWeek = "Friday"? If it's about providing int-range behaviour, I don't see how the date dimension table you've described does that.

No Safe Word
Feb 26, 2005

Subjunctive posted:

I'm not sure I'm following. You join against the table with WHERE DateDimension.DayOfWeek = "Friday"? If it's about providing int-range behaviour, I don't see how the date dimension table you've described does that.

We're getting a bit far on this derail but when you're doing multidimensional queries and whatnot, it's not actually SQL that you're using. I'm only really familiar with the MS SQL flavor of it, so their version of it would be MDX. The actual date dimension table is built into a BI cube that can be sliced on any number of dimensional axes simultaneously. And frankly, I didn't really ever hand-write any MDX code, we used tooling to do that sort of thing.

The important thing to note is that you're not really doing traditional SQL joins on a table like that in a data warehouse scenario. If that sort of table is being used for SQL joins then it probably is a horror, but given the structure of it I would be surprised if it wasn't just a date dimension table to be used to build out a data warehouse that was then compiled into BI objects.

Doc Hawkins
Jun 15, 2010

Dashing? But I'm not even moving!



The site is codewars.com, and god help you.

Fuck them
Jan 21, 2011

and their bullshit
:yotj:
So I've just recently found myself going "...that's it?" to a LONGstanding problem I've only now been allowed to look at.

We've used bootstrap for our layout on our product for some time, though we've had some various sheds of the bike-sort pile up, such as a left hand nav we weren't expecting to have which shrank our actual content pane, among other things. Well, that and the fact that nobody really grokked bootstrap all this time. Or JS. Then again I can't blame anyone else for not wanting to deal with the front end poo poo since I hate it too!

WELP since I'm still getting back in the thick of things after taking time off to take care of my mom and then grieve her passing, I'm on "CSS cleanup/make a standard for the website and beat up devs until they conform to it" duty. After cutting the size of our less file in half I take a look at getting bootstrap to actually work for varying resolutions, such as the minimum one for small, old monitors we're required to support, instead of having us just wing it with span9 as our max width and do cute poo poo like "Hey, go make invisi-divs that just have margins around them to make stuff space out properly :haw:."

All I had to do was read docs and stack overflow for like ten minutes, go to variables.less, change the column width variable to the right number of pixels, recompile the less to css, and then go to my team lead and go "Oh hey told you so like 6 months ago."

:q:

The most senior dev there was telling me it would be ~black magic~ to actually change an intentionally easy to tweak variable all this time. What particularly kills me is that the size of our content pane just so happens to be almost the exact width as one of the presets for column width that's built into bootstrap itself, 760-ish!

I'm still tripping over someone making a "mediumPlusInput" class (which is just a width property containing class) instead of "largeInput."

:psypop:

more like dICK
Feb 15, 2010

This is inevitable.

Doc Hawkins posted:

The site is codewars.com, and god help you.



The real horror.

Dren
Jan 5, 2001

Pillbug
from https://github.com/bitcoin/bips/blob/master/bip-0042.mediawiki

https://github.com/bitcoin/bips/blob/master/bip-0042.mediawiki posted:

As is well known, Satoshi was a master programmer whose knowledge of C++ was surpassed only by his knowledge of Japanese culture. The code below:
C++ code:
    int64_t nSubsidy = 50 * COIN;
    // Subsidy is cut in half every 210,000 blocks
    // which will occur approximately every 4 years.
    nSubsidy >>= (nHeight / 210000);
is carefully written to rely on undefined behaviour in the C++ specification - perhaps so it can be hardware accelerated in future.

Macichne Leainig
Jul 26, 2012

by VG

No Safe Word posted:

This is not a horror at all and is in fact common practice in BI applications. That would be a date dimension table and more enhanced versions of it will have things like what quarter it is and even potentially things like what fiscal year/quarter it would be.

There are 7 tables in the database and 2 of those are for logs. Our actual business database has no concept of this table and the tables are only used to manually create a string from a DateTime in C#.

I realize that's probably pertinent information. I will see if I can dig up the extension method tomorrow.

Edit: also the guy who implemented this table is one of those guys who textbook copies solutions from Stack Overflow, so I realize now it's use in a data warehouse setup, but we aren't using it for anything close to that. :v:

Macichne Leainig fucked around with this message at 05:05 on Apr 2, 2014

Doc Hawkins
Jun 15, 2010

Dashing? But I'm not even moving!


2banks1swap.avi posted:

So I've just recently found myself going "...that's it?" to a LONGstanding problem I've only now been allowed to look at.

We've used bootstrap for our layout on our product for some time, though we've had some various sheds of the bike-sort pile up, such as a left hand nav we weren't expecting to have which shrank our actual content pane, among other things. Well, that and the fact that nobody really grokked bootstrap all this time. Or JS. Then again I can't blame anyone else for not wanting to deal with the front end poo poo since I hate it too!

WELP since I'm still getting back in the thick of things after taking time off to take care of my mom and then grieve her passing, I'm on "CSS cleanup/make a standard for the website and beat up devs until they conform to it" duty. After cutting the size of our less file in half I take a look at getting bootstrap to actually work for varying resolutions, such as the minimum one for small, old monitors we're required to support, instead of having us just wing it with span9 as our max width and do cute poo poo like "Hey, go make invisi-divs that just have margins around them to make stuff space out properly :haw:."

All I had to do was read docs and stack overflow for like ten minutes, go to variables.less, change the column width variable to the right number of pixels, recompile the less to css, and then go to my team lead and go "Oh hey told you so like 6 months ago."

:q:

The most senior dev there was telling me it would be ~black magic~ to actually change an intentionally easy to tweak variable all this time. What particularly kills me is that the size of our content pane just so happens to be almost the exact width as one of the presets for column width that's built into bootstrap itself, 760-ish!

I'm still tripping over someone making a "mediumPlusInput" class (which is just a width property containing class) instead of "largeInput."

:psypop:

Long division?! You'd need some kind of computer or something!

Athas
Aug 6, 2007

fuck that joker

LOOK I AM A TURTLE posted:

And triple boobs lets me do the same thing when there are exactly three missing parameters?
code:
let totalRecall = (.) . (.) . (.)
let multiSubtract x y z = x-y-z
let double x = x*2
let multiSubtractAndDouble = double `totalRecall` multiSubtract
I like pointfree style and all, but this is pretty ridiculous. Can Haskell programmers actually read this stuff?

This particular idiom is not too bad, once you know it. You just count the boobs: '(.) . (.)' is composing a function that takes two arguments, '(.) . (.) . (.)' one that takes three, and so on. The biggest problem is that it is not infix. In Haskell, you can turn an ordinary function into an infix operator by surrounding it with backticks:

code:
x `foo` y
This is in many cases very useful. Unfortunately, the syntax only permits you to put names, not expressions, in backticks, so this is a syntax error:

code:
f `(.) . (.)` g
As an aside, it's amazing how many Haskell people suddenly crop up when you start talking about it. For another semi-horror, let's look at how the 'Eq' instances are defined for tuples in GHC. For the non-Haskell people, a 'typeclass' is sort of like an OO interface, and you can declare a given type to be an 'instance' of the interface. For tuples, you need to provide an explicit instance definition for every size of tuple you may need:

code:
deriving instance (Eq  a, Eq  b) => Eq  (a, b)
deriving instance (Eq  a, Eq  b, Eq  c) => Eq  (a, b, c)
deriving instance (Eq  a, Eq  b, Eq  c, Eq  d) => Eq  (a, b, c, d)
deriving instance (Eq  a, Eq  b, Eq  c, Eq  d, Eq  e) => Eq  (a, b, c, d, e)
deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f)
               => Eq (a, b, c, d, e, f)
deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g)
               => Eq (a, b, c, d, e, f, g)
deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
                   Eq h)
               => Eq (a, b, c, d, e, f, g, h)
deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
                   Eq h, Eq i)
               => Eq (a, b, c, d, e, f, g, h, i)
deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
                   Eq h, Eq i, Eq j)
               => Eq (a, b, c, d, e, f, g, h, i, j)
deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
                   Eq h, Eq i, Eq j, Eq k)
               => Eq (a, b, c, d, e, f, g, h, i, j, k)
deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
                   Eq h, Eq i, Eq j, Eq k, Eq l)
               => Eq (a, b, c, d, e, f, g, h, i, j, k, l)
deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
                   Eq h, Eq i, Eq j, Eq k, Eq l, Eq m)
               => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m)
deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
                   Eq h, Eq i, Eq j, Eq k, Eq l, Eq m, Eq n)
               => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
                   Eq h, Eq i, Eq j, Eq k, Eq l, Eq m, Eq n, Eq o)
               => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
GHC is actually able to derive these instances automatically, but you still need to explicitly need to list every tuple type you want. Hope 15 elements is enough!

(Repeat the above for every type class you want tuples to implement.)

Deus Rex
Mar 5, 2005

gariig posted:

Since this is SQL Server if you put a function in a WHERE clause (WHERE YEAR(Date) = 2007) it will cause an index scan which is really slow. Since the data is already computed in the table you can do an index seek because there is no SQL Server function in the WHERE clause (WHERE Year = 2007).

Is Postgres the only SQL DB that can do indexes on expressions? I wasn't that surprised to see MySQL was lacking them, but SQL Server is supposed to be good :(

No Safe Word
Feb 26, 2005

Tha Chodesweller posted:

There are 7 tables in the database and 2 of those are for logs. Our actual business database has no concept of this table and the tables are only used to manually create a string from a DateTime in C#.

I realize that's probably pertinent information. I will see if I can dig up the extension method tomorrow.

Edit: also the guy who implemented this table is one of those guys who textbook copies solutions from Stack Overflow, so I realize now it's use in a data warehouse setup, but we aren't using it for anything close to that. :v:

Ah nice, so then the real horror is finding a solution to an entirely different problem and saying "oh hey that's cool I'll use that". :v:

Adbot
ADBOT LOVES YOU

Funking Giblet
Jun 28, 2004

Jiglightful!

more like dICK posted:



The real horror.

Tried using this, couldn't get any tests to work.

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply