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
toiletbrush
May 17, 2010
most excellent

Adbot
ADBOT LOVES YOU

Carthag Tuek
Oct 15, 2005

Tider skal komme,
tider skal henrulle,
slægt skal følge slægters gang




wrong thread, that's not terrible

(nice, grats!)

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
c++ report:

- templates actually have pretty good support for higher kinded types!

code:

// i'm ignoring move/copy/reference semantics for now
namespace functor {
    template<template<typename, typename ...> typename F>
    class Functor {
        Functor() =delete;
    
    public:
        static constexpr bool is_functor() { return false; };
        static_assert(Functor<F>::is_functor());
        
        template<typename A, typename B>
        static F<B> map(F<A>, std::function<B(A)>);
    };
    
    template<template<typename, typename...> typename F, typename A, typename B>
    F<B> map(F<A> fa, std::function<B(A)> fn)
    {
        return Functor<F>::map(std::move(fa), std::move(fn));
    }
}

template<>
class functor::Functor<std::unique_ptr> {
public:
    static constexpr bool is_functor() { return true; };
    template<typename A, typename B>
    static std::unique_ptr<B> map(std::unique_ptr<A> fa, std::function<B(A)> fn) {
        return std::make_unique<B>(fn(*fa));
    }
};

template<>
class functor::Functor<std::vector> {
public:
    static constexpr bool is_functor() { return true; };
    template<typename A, typename B>
    static std::vector<B> map(std::vector<A> fa, std::function<B(A)> fn) {
        std::vector<B> tmp;
        tmp.reserve(fa.size());
        for(auto i : fa) {
            tmp.push_back(fn(i));
        }
        return tmp;
    }
};

template<typename A, typename B>
using function1 = std::function<B(A)>;

int main() {
    
    // template deduction struggles with function (return) types, so lambdas must be converted to a std::function.
    // tried to get around this by using SFINAE to select specializations based on is_invocable but it didn't work.
    std::function<std::string(int)> fn = [](auto i) -> auto{ return std::to_string(i*2); };
    
    {
        auto ptr = std::make_unique<int>(2);
        auto r = functor::map(std::move(ptr), function1<int, std::string>([](auto i) -> auto{return std::to_string(i*2);}));
        std::cout << *r << std::endl;
    }
    {
        std::vector<int> vec = {1,2,3,4,5};
        auto r = functor::map(vec, fn);
        for (auto i : r) {
            std::cout << i << ",";
        }
        std::cout << std::endl;

    }
}
- Really looking forward to concepts, they're gonna make this poo poo less stupid. I messed around with this implementation a bit (from forums poster slurps made rips) https://izzys.casa/2016/09/implementing-concepts-in-cxx/ and it's cool. This approach doesn't seem to work for HKTs ('template<template<typename> typename F>') but I think it's just because the `detect_if` stuff needs another overload.

- I totally get why C++ programmers are skeptical about Rust; Rust really doesn't give you the same power C++ does unless you're using unsafe, and unsafe Rust is harder to get right than C++.

- I really don't like how C++ does OOP. I'm not going to say it's bad or wrong but it's definitely confusing and ugly. Stuff like not having explicit interfaces or abstract classes so instead you have to just design your class in a specific way to enable these behaviors (virutal/pure virtual member functions, etc). I think this approach ultimately gives you more power, but reading code is a lot nicer when I have ways of marking things as abstract.

- I need to stop distracting myself with the siren song of templates and start focusing on the stuff that matters (move semantics, pointers, etc).


Anyhow I've got Accelerated C++, Bjarne's C++ 11, and Scott Meyers Effective Modern C++. I'm working through the Skeina algorithm design manual and I'm going to keep doing this until I get a job that I want.

Deep Dish Fuckfest
Sep 6, 2006

Advanced
Computer Touching


Toilet Rascal
no! don't do it! don't get a c++ job! you will regret this! what the gently caress would you ever want to do that requires that?

having said that, the stroustrup c++11 book is pretty good. i mean, it's still a dry book describing a language, but I don't remember it being a chore to read through. and it's pretty much the most detailed and complete source i've found short of reading the standard itself. modern c++ is also good when it comes to putting all those pieces together in non-obvious ways. good choices all-around

CRIP EATIN BREAD
Jun 24, 2002

Hey stop worrying bout my acting bitch, and worry about your WACK ass music. In the mean time... Eat a hot bowl of Dicks! Ice T



Soiled Meat

Deep Dish Fuckfest posted:

no! don't do it! don't get a c++ job! you will regret this! what the gently caress would you ever want to do that requires that?

$$$

majority of people are too stupid to learn, let alone program c++, and you should make more scratch than some ruby nerd making CRUD TODO apps with bootstrap themes

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

Deep Dish Fuckfest posted:

no! don't do it! don't get a c++ job! you will regret this! what the gently caress would you ever want to do that requires that?

basically i'm very bored with web dev, and the only way to make web dev more interesting (for me) is to focus on large scale distributed systems stuff, which i don't really want to do. i've been doing rust for 3-4 years and really enjoying it, so i want to do lower level stuff.

and honestly i'm really really enjoying it. things that have always confused me about computers are finally becoming clear. and at this point i'm mostly learning from cppreference.com and not struggling so perhaps c++ is my destiny.

DONT THREAD ON ME fucked around with this message at 22:28 on Jan 9, 2019

gonadic io
Feb 16, 2011

>>=

DONT THREAD ON ME posted:

basically i'm very bored with web dev, and the only way to make web dev more interesting (for me) is to focus on large scale distributed systems stuff, which i don't really want to do. i've been doing rust for 3-4 years and really enjoying it, so i want to do lower level stuff. perhaps c++ is my destiny.

i have embedded arduino no-std no-heap no-nothing stuff in rust, what do you mean "low level"?

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

gonadic io posted:

i have embedded arduino no-std no-heap no-nothing stuff in rust, what do you mean "low level"?

sorry, i didn't mean to imply rust isn't low level. it's just a matter of employment. if i could get a job writing rust (at a non crypto startup) i would, but the few legit rust jobs that exist mostly want people who are also good at C and C++.

also after doing rust for as long as i have, i'm still very very shaky on unsafe rust, despite working pretty hard at learning it. i've decided that i need to get more experience with manual memory management because i honestly don't really understand what rust is doing with memory both at compile and runtime. working with c and c++ has helped a lot.

DONT THREAD ON ME fucked around with this message at 22:33 on Jan 9, 2019

CRIP EATIN BREAD
Jun 24, 2002

Hey stop worrying bout my acting bitch, and worry about your WACK ass music. In the mean time... Eat a hot bowl of Dicks! Ice T



Soiled Meat

DONT THREAD ON ME posted:

basically i'm very bored with web dev, and the only way to make web dev more interesting (for me) is to focus on large scale distributed systems stuff, which i don't really want to do. i've been doing rust for 3-4 years and really enjoying it, so i want to do lower level stuff.

and honestly i'm really really enjoying it. things that have always confused me about computers are finally becoming clear. and at this point i'm mostly learning from cppreference.com and not struggling so perhaps c++ is my destiny.

good on you man.

solving new problems is always a lot more fun/exciting, plus a lot better on resources. sick and tired of everything that runs needing gigs of RAM for no good reason.

gonadic io
Feb 16, 2011

>>=

DONT THREAD ON ME posted:

sorry, i didn't mean to imply rust isn't low level. it's just a matter of employment. if i could get a job writing rust (at a non crypto startup) i would, but the few legit rust jobs that exist mostly want people who are also good at C and C++.

not being a dick but have you looked? alternatively maybe it's different in london

bcause im in the same boat im sick of scala, i applied to 5 companies whose job descriptions mentioned rust that weren't c++ required jobs (some were half python for example, some were independent tooling instead of large apps) and that was just one evening of looking.

e: also non-crypto i should have said

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

gonadic io posted:

not being a dick but have you looked? alternatively maybe it's different in london

bcause im in the same boat im sick of scala, i applied to 5 companies whose job descriptions mentioned rust that weren't c++ required jobs (some were half python for example, some were independent tooling instead of large apps) and that was just one evening of looking.

e: also non-crypto i should have said

recall that i don't have a degree and i really need to rely on my proven skills for getting a decent job. i have nothing low level to put on my resume, so i don't feel very competitive for these jobs. i'm just a web dev hopping onto the latest hipster lang. i feel like having c/c++ skill not only makes me a more compelling candidate, it also opens me up to taking a c++ job, which are far more plentiful.

i also feel like i've hit a learning plateau with rust and learning c++ has really helped.

if i manage to score a good rust job, i'll be thrilled, but i'd also be thrilled with a good job doing c++ so why limit my options?

DONT THREAD ON ME fucked around with this message at 22:48 on Jan 9, 2019

gonadic io
Feb 16, 2011

>>=

DONT THREAD ON ME posted:

i think what isn't coming across is that i don't feel very competitive for those jobs. i know rust just fine but i'm poo poo at 'low level' programming and i need to fix that before i can snag a job doing low level stuff. i feel like i've hit a plateau with rust so i'm focusing on c++ for a while.

if i manage to score a good rust job, i'll be thrilled, but i'd also be thrilled with a good job doing c++ so why limit my options?

Oh that makes more sense. I'm hoping to overcome that myself with copious amounts of github rust code

Also I have good academic creds which also helps ngl

Finster Dexter
Oct 20, 2014

Beyond is Finster's mad vision of Earth transformed.

DONT THREAD ON ME posted:

Anyhow I've got Accelerated C++, Bjarne's C++ 11, and Scott Meyers Effective Modern C++. I'm working through the Skeina algorithm design manual and I'm going to keep doing this until I get a job that I want.

Apologies if you explained this earlier as my eyes glaze over when I scroll past C++ posts, but do you have a specific project you're thinking of as you go through these C++ books or are you just reading them front to back?

I was thinking the other day I should learn C++, mainly because I never really learned how to C++ and I'd love to have a more low-level lang under my belt that isn't Go.

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

Finster Dexter posted:

Apologies if you explained this earlier as my eyes glaze over when I scroll past C++ posts, but do you have a specific project you're thinking of as you go through these C++ books or are you just reading them front to back?

I was thinking the other day I should learn C++, mainly because I never really learned how to C++ and I'd love to have a more low-level lang under my belt that isn't Go.


Right now I'm going through the Algorithm Design Manual because it's a weakness for me, especially in interviews. C++ is a good languages for doing algorithms/data structures so that's working out.


When I get bored I'll probably switch to "The Linux Programming Interface" which i've used a little bit in the past.

Volte
Oct 4, 2004

woosh woosh

DONT THREAD ON ME posted:

c++ report:

- templates actually have pretty good support for higher kinded types!

code:
// ...
i'm dubious of referring to uninstantiated templates as "types", but you can use decltype to infer the return value of the function argument and make it work with any callable type. i simplified things a bit and changed the signature to accept a const reference (since calling map shouldn't be mutating anything).
code:
namespace functor {
    template<template<typename, typename ...> typename F>
    class Functor {};
    
    template<template<typename, typename...> typename F, typename Func, typename A, typename B = decltype(std::declval<Func>()(std::declval<A>()))>
    F<B> map(const F<A>& fa, const Func& fn) {
        return Functor<F>::template map<Func, A, B>(fa, fn);
    }
}

template<>
class functor::Functor<std::vector> {
public:
    template<typename Func, typename A, typename B>
    static std::vector<B> map(const std::vector<A>& fa, Func fn) {
        std::vector<B> tmp;
        tmp.reserve(fa.size());
        for(auto i : fa) {
            tmp.push_back(fn(i));
        }
        return tmp;
    }
};

int main() { 
    {
        std::vector<int> vec = {1,2,3,4,5};
        auto r = functor::map(vec, [](auto i) -> auto{ return std::to_string(i*2); });
        for (auto i : r) {
            std::cout << i << ",";
        }
        std::cout << std::endl;

    }
}
i argue that pointers aren't functors: x == y does not imply make_unique(x) == make_unique(y)

eschaton
Mar 7, 2007

Don't you just hate when you wind up in a store with people who are in a socioeconomic class that is pretty obviously about two levels lower than your own?
you could always see if Ciaphas’ workplace is hiring, they use C++, I think they’re up to C++11 now

and they’re in Las Vegas!

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

Volte posted:

i'm dubious of referring to uninstantiated templates as "types", but you can use decltype to infer the return value of the function argument and make it work with any callable type. i simplified things a bit and changed the signature to accept a const reference (since calling map shouldn't be mutating anything).

i argue that pointers aren't functors: x == y does not imply make_unique(x) == make_unique(y)

cool! i'll give that a shot. I agree that unique_ptr does not obey the functor laws, but I'm curious about what laws do apply and how you could leverage those laws usefully through a typeclasses hierarchy.

basically, smart pointers are (kinda) monads. are they a special case of monad? can we do something useful with that information? idk.

DONT THREAD ON ME fucked around with this message at 23:42 on Jan 9, 2019

hackbunny
Jul 22, 2007

I haven't been on SA for years but the person who gave me my previous av as a joke felt guilty for doing so and decided to get me a non-shitty av

DONT THREAD ON ME posted:

- I totally get why C++ programmers are skeptical about Rust; Rust really doesn't give you the same power C++ does unless you're using unsafe, and unsafe Rust is harder to get right than C++.

personally, I find it a relief when I get to use simpler languages, so that sounds like a plus to me. I really should look into rust

DONT THREAD ON ME posted:

- I really don't like how C++ does OOP. I'm not going to say it's bad or wrong but it's definitely confusing and ugly. Stuff like not having explicit interfaces or abstract classes so instead you have to just design your class in a specific way to enable these behaviors (virutal/pure virtual member functions, etc). I think this approach ultimately gives you more power, but reading code is a lot nicer when I have ways of marking things as abstract.

psst
hey mate
hey
*opens trenchcoat*

Symbolic Butt
Mar 22, 2009

(_!_)
Buglord

DONT THREAD ON ME posted:

- I really don't like how C++ does OOP. I'm not going to say it's bad or wrong but it's definitely confusing and ugly. Stuff like not having explicit interfaces or abstract classes so instead you have to just design your class in a specific way to enable these behaviors (virutal/pure virtual member functions, etc). I think this approach ultimately gives you more power, but reading code is a lot nicer when I have ways of marking things as abstract.

I think it's specially bad because C++ is just so... leaky? my experience is that encapsulation is a far unreachable ideal in production C++, so in the end you get all the usual annoyances of OOP with none of the benefits

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

Symbolic Butt posted:

I think it's specially bad because C++ is just so... leaky? my experience is that encapsulation is a far unreachable ideal in production C++, so in the end you get all the usual annoyances of OOP with none of the benefits

yeah that's definitely in line with my limited experience. i really haven't focused much on the OOP aspects yet, but virtual in particular doesn't really work the way I want. I'm more interested in static polymorphism than runtime polymorphism, so I don't need virtual dispatch, but I need to mark the method as virtual if I want the compiler to make sure my implementor actually implements the interface.

hackbunny posted:

personally, I find it a relief when I get to use simpler languages, so that sounds like a plus to me. I really should look into rust

I wouldn't necessarily call Rust simpler. It's certainly smaller, and it's designed to be easier to use, but the relationship between the code you write and the actual assembly generated is a lot more complicated. it's harder to reason about how rustc is going to gently caress with your code. (at least, it is to me, as i've mentioned i'm still learning).

quote:

psst
hey mate
hey
*opens trenchcoat*

yeah something like this would go a long way imo. you can still use the existing class system if you really want to customize behavior but get the benefit of clearer code.

DONT THREAD ON ME fucked around with this message at 00:26 on Jan 10, 2019

akadajet
Sep 14, 2003

hackbunny posted:

personally, I find it a relief when I get to use simpler languages, so that sounds like a plus to me. I really should look into rust


psst
hey mate
hey
*opens trenchcoat*

nobody wants to see your open std

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

MononcQc posted:

hello thread, my latest book is out:

nice1

The MUMPSorceress
Jan 6, 2012


^SHTPSTS

Gary’s Answer

DONT THREAD ON ME posted:

recall that i don't have a degree and i really need to rely on my proven skills for getting a decent job. i have nothing low level to put on my resume, so i don't feel very competitive for these jobs. i'm just a web dev hopping onto the latest hipster lang. i feel like having c/c++ skill not only makes me a more compelling candidate, it also opens me up to taking a c++ job, which are far more plentiful.

i also feel like i've hit a learning plateau with rust and learning c++ has really helped.

if i manage to score a good rust job, i'll be thrilled, but i'd also be thrilled with a good job doing c++ so why limit my options?

your track record is more than enough at this point. I don't have a bs cs either and look where im at as a filthy :females:. if you find the right companies they'll respect your self starting attitude and everything you've taught yourself

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

jit bull transpile posted:

your track record is more than enough at this point. I don't have a bs cs either and look where im at as a filthy :females:. if you find the right companies they'll respect your self starting attitude and everything you've taught yourself

thanks :love:

AWWNAW
Dec 30, 2008

jit bull transpile posted:

your track record is more than enough at this point. I don't have a bs cs either and look where im at as a filthy :females:. if you find the right companies they'll respect your self starting attitude and everything you've taught yourself

I submitted a resume and application for an Apple job and never got a reply

The MUMPSorceress
Jan 6, 2012


^SHTPSTS

Gary’s Answer

AWWNAW posted:

I submitted a resume and application for an Apple job and never got a reply

apple's recruiters are as dumb as any other recruiters. it's the major hurdle to clear tbh. mine came to say hi to me on my 3rd week thinking it was my first day and he was wearing an affliction t-shirt as an adult man with gray hair.

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

jit bull transpile posted:

apple's recruiters are as dumb as any other recruiters. it's the major hurdle to clear tbh. mine came to say hi to me on my 3rd week thinking it was my first day and he was wearing an affliction t-shirt as an adult man with gray hair.


i like to pretend that dudes in aflliction t-shirts are actually just super woke and wearing them unironically as a warning to others

DONT THREAD ON ME fucked around with this message at 10:21 on Jan 10, 2019

redleader
Aug 18, 2005

Engage according to operational parameters

Deep Dish Fuckfest posted:

using text to speech to tell you a build completed/failed

lmao this owns

Powerful Two-Hander
Mar 10, 2004

Mods please change my name to "Tooter Skeleton" TIA.


jfc does nobody learn how to work through a problem anymore?

"I can't run the solution I get an error on debug"
ok well it builds fine so what is the error?
"*posts some generic access to the dotnet folder path message*"
Well we know it's not the code so have you tried googling the error?
"......"

why do they think I'm going to be able to magically fix some generic visual studio error remotely or that i would somehow just know the answer? particularly when it's self evident machine/installation related

edit: the actual root error was literally saying "can't write to machine.config, check you have permission to modify it" I mean how much clearer could that possibly be?

Powerful Two-Hander fucked around with this message at 14:17 on Jan 10, 2019

Xarn
Jun 26, 2015

eschaton posted:

you could always see if Ciaphas’ workplace is hiring, they use C++, I think they’re up to C++11 now

and they’re in Las Vegas!

:thunk:

cinci zoo sniper
Mar 15, 2013




eschaton posted:

you could always see if Ciaphas’ workplace is hiring, they use C++, I think they’re up to C++11 now

and they’re in Las Vegas!

hope you love coding c++ without internet and never doing a weed

TheFluff
Dec 13, 2006

FRIENDS, LISTEN TO ME
I AM A SEAGULL
OF WEALTH AND TASTE
c tp s: spent three hours on an issue where a database query works (and returns a result) when code is called from a unit test, but fails (postgres throws an error since the query is invalid) when the same code is called from real business logic. if the unit test actually ran the query the logging output claims it's running, it too would fail in the same way, so i'm really wondering where that result is coming from. staring at the drat thing in a debugger for hours hasn't yielded any insights so far.

suffix
Jul 27, 2013

Wheeee!
tbf if it was running real queries against postgresql i wouldn't call it a 'unit test'

the approaches i've seen is either just mocking the call completely or running queries against a in-process database like sqlite and h2
but you'll need integration tests to catch query errors

TheFluff
Dec 13, 2006

FRIENDS, LISTEN TO ME
I AM A SEAGULL
OF WEALTH AND TASTE

suffix posted:

tbf if it was running real queries against postgresql i wouldn't call it a 'unit test'

the approaches i've seen is either just mocking the call completely or running queries against a in-process database like sqlite and h2
but you'll need integration tests to catch query errors
around here we call pretty much all our tests unit tests but yes most of them are effectively integration tests in one way or another.

both the mocking approach and the sqlite approach are incredibly bad and worse than useless. in this case it is running real queries against a real postgres db (the test pipeline sets up a real database when you run it and tears it down afterwards). we have lots of complex queries with extensive test coverage in this way.

TheFluff fucked around with this message at 20:35 on Jan 10, 2019

Captain Foo
May 11, 2004

we vibin'
we slidin'
we breathin'
we dyin'

congrats distributed wizard squid

cinci zoo sniper
Mar 15, 2013




one of our developer teams has a new pm and he's so bad i don't even know where to start. nothing at this job, i think, has come close to me being offered to be taught "a join for queries" [when asked to fix logging to bear actual identifiers]


not even 2 days later this guy who did make that offer asked a coworker of mine as to why coworker's join had empty lines on the right side while his didn't :thunk:

gonadic io
Feb 16, 2011

>>=
had a fun bug today that only appears when circleci takes longer than a second to write one line to a file

guess they were having a slow day, this ci setup has been working just fine for like 10+ months without us encountering this

gonadic io
Feb 16, 2011

>>=

suffix posted:

tbf if it was running real queries against postgresql i wouldn't call it a 'unit test'

the approaches i've seen is either just mocking the call completely or running queries against a in-process database like sqlite and h2
but you'll need integration tests to catch query errors

yeah you only mock (preferably entirely mocked by injecting your connection-getting class, god drat i hate h2) if your code isn't decoupled enough that you can't just call the methods you want to test with no db involved at all

ideally you have unit tests in which you manually construct the data that a call would return and pass that into the methods you're testing and integration tests where you talk to real postgres

(and service end to end where you have your test really starts your real service except with whatever config stops it from launching real missiles)

(and full end to end which is a cluster with all your services actually running)

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
testing integrations with your persistence layers is a difficult and frustrating problem, imo. i have yet to discover a method of unit testing sql queries that gives me full confidence that they'll perform the way i want.

the closest i've gotten is with Doobie (scala), which will check your queries against database metadata to see that they're valid for your schema. it doesn't execute the queries, but it still needs a running db instance to talk to. and even still, it doesn't give me full faith in my queries (although it goes a long way).

https://tpolecat.github.io/doobie-cats-0.4.0/13-Unit-Testing.html

Adbot
ADBOT LOVES YOU

toiletbrush
May 17, 2010

Powerful Two-Hander posted:

jfc does nobody learn how to work through a problem anymore?

"I can't run the solution I get an error on debug"
ok well it builds fine so what is the error?
"*posts some generic access to the dotnet folder path message*"
Well we know it's not the code so have you tried googling the error?
"......"

why do they think I'm going to be able to magically fix some generic visual studio error remotely or that i would somehow just know the answer? particularly when it's self evident machine/installation related

edit: the actual root error was literally saying "can't write to machine.config, check you have permission to modify it" I mean how much clearer could that possibly be?
I've got a co-worker who's like this except instead of asking for help he'll slowly and painstakingly progress from just running the same test again and again to cleaning and rebuilding to restarting Visual Studio to finally rebooting this entire machine to try and fix it, rather than just reading the error message that tells him exactly what he's doing wrong.

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