Jump to content

ellestones

Resident
  • Posts

    716
  • Joined

  • Last visited

Posts posted by ellestones

  1. On 12/23/2018 at 5:51 PM, Madelaine McMasters said:

    A mentor of mine got his PhD in computer science from MIT. He told me that the entry level "C" programming course actually had a no-requisite of BASIC programming experience. Students who had a course in BASIC on their transcripts were required to take a de-programming course in Pascal first, to rid them of bad habits they were presumed to have acquired learning the awful language rival Dartmouth College had unleashed on the world.

    My personal experience with computer languages has been that their differences are fairly minor compared to differences in function libraries and programming models (event driven, parallel, etc). And it's when the differences are fairly minor that I keep getting into trouble.

    i have been meaning to come back to this, so I do it now

    yes. Formal training tutors tell the students to forget about what they previously know. As the student is in the class to learn to speak the computer language. They are not in class to learn how to interpret what they know into the language being taught. Where an interpretive language is necessary to communicate to the students what they need to know, then a human language is deployed, English for example


    the next thing I would like to touch on is what Phil was talking about before the conversation got a bit sidetracked. And show a circumstance where he can be right

    given two people who have backgrounds in applied logic, design, flow charting, etc. Say 2 business analysts

    one has some prior experience in some other computer language. The second person has no scripting experience at all, so goes on a formal LSL training course. The first does not, no formal training and just goes off what coding experience they already have

    and then they are both given access to the LSL wiki

    in the LSL-grammar there are: 7 flow controls: do, for, if, jump, return, state, while
    7 types: float, integer, key, list, rotation, string, vector
    32 operators: +, -, *, /, =, ==, !=, !, ~, <, >, <<, >>, ^, ~, |, ||, &, &&, etc
    49 events: state_entry ... state_exit

    how many of these is the first person going to recognise from their previous coding experience? Some. How many will the second person recognise? Most, particularly the events

    then there is a whole heap of LSL API functions. How many of these will each person recognise? Some

    as they both have backgrounds in logic, design and flow then one of them is going to write complete LSL works sooner than the other

    where Phil is correct is when neither of them read the manual, don't bother getting any training. Just sit down at their keyboards and start typing based on what they know already and what they can work out for themselves from their own reading of the wiki and existing scripts they may find

    in which case the person with some other coding experience will probably get their inworld door to open and close a bit sooner than the other person. Sometimes not, as the other person finds a complete door script on the wiki first

     

    i just add something else about my own experience of formal training

    7 years ago now I asked my boss for a substantial pay rise. He goes: Why would we give you that?  I go: Because I know stuff and I am worth it. He goes: You are unqualified. You are about as qualified as that person out there emptying the rubbish bins. I go: Waah! He goes: That person knows stuff as well. What they do is an important job, probably more important than your job as my assistant. I could probably do without an assistant. I couldn't do without the cleaner though

    and I am like oh! man. And then he says: I want you to go to university and get qualified. It is not enough to know stuff, you have to be able to demonstrate that you do, and be able to show that you have the discipline to complete and obtain a degree

    5 years distance learning part time, and done - BSW

    I go to my boss after graduation and say: What about my pay rise? (during my study years I had been getting normal grade and cost of living adjustment but not anything substantial)  And he goes: Sorry I can't do that. I go: Waahh! And he says: You are over-qualified for the role of my assistant. I am going to have to let you go and get someone else. Do you think you would be able to help me find your replacement?

    and I am just looking at him, glaring actually. And he cracks up and starts laughinh

    then he says: We have had issues with our recruitment processes as you know. So I am promoting you. And between us we are going to sort it out. And I say I am not ever going to be an HR officer, not even!  And he goes: I thought that you might say that. Sign here, you are now a consultant on monthly retainer. I look at the amount of retainer and ooh! and sign. And then he says: Right! Get to work and earn the big bucks I am now paying you. Consult with all the department heads who will be affected and I want a draft recruitment process design document on my desk before the end of the month for every role we have. Our org has a lot of roles. IT/IS, line management, health practitioners, educators, accountancies, social workers, ancillary staff and now that we are into housing then project managers, building and maintenance contractors

    lots of technical disciplines to recruit too. From my pov it's not about who we hire, it's about how we hire people. And one of the best ways I have found in understanding how to recruit people isn't so much in us getting the correct answer to a question. It is about examining the person's understanding of the answer they do give

    an example. Recently we looked to appoint a Clinical Director. Senior Medical Officer status, highly-qualified and experienced doctor specialising in general mental health. One of my questions to the applicants was: How conversant are you with the Ministry of Health guidelines relating to client rights under the Mental Health (Compulsory Assessment and Treatment) Act ? And could you relate an instance from your own experience of this please ?

    when a candidate at this level gets asked this kind of question, not being a technical practice question, they respond in different ways. Most candidates respond cautiously and some few don't. As when they look at the doctor convening the interview panel and see that doctor looking at me, then most candidates realise that their answer is going to be tested by my follow up questions. Their continuing responses followed attentively by the candidate's medical peers in the room. Basically, Doctor do you understand what you just said ?

    is early days yet but what we working to discover is: Is there a process whereby roles can be filled by self-selection. A process by which the understandings of the candidates are revealed by themselves to themselves. In other words, having examined myself then I know that this role is actually for me, or this role is actually not for me even though I think I would like it

     

  2. 4 hours ago, Phil Deakins said:

    Functions do not exist in assembly. As you said, if you want a function like a loop in assembly, you have to write it.

    functions do exist. For a computer to run it has an operating system. A whole bunch of functions.  In the tiny 16byte program above the line JSR $FFD2 is a function call to the operating system API. Its equivalent in LSL is llSay(...). In assembly, like in any other language, when there is no API function call to do what we want then we have to write it ourselves

     

  3. 57 minutes ago, Phil Deakins said:

    Writing in machine code/assembly is so different from writing in a high level language that it's definitely excludable. For instance, you cannot get used to using loops in a high level language and expect to find something similar in a low level one, because functions don't exist in machine code/assembly.

    seriously Phil. Do you even know assembly ?

    a message for you from back in your day.  It shows evaluation, conditional and branching. (a loop).  Anyone reading who knows this language, knows what the message is. They will also know exactly from this program's language what computer environment is required for the program to execute

    2000: LDY $00            
    2002: LDA $2010, Y       
    2006: JSR $FFD2          
    2009: INY                
    200A: CPY $13            
    200C: BNE $2000          
    200F: RTS
    2010: $4D $65 $72 $72 $79 $20 $58 $6D $61 $73 $20 $50 $68 $69 $6C $20 $3A $29
    
     

    functions also do exist. We have to write them using the language. Just like we do with any other language

     

  4. 6 minutes ago, Phil Deakins said:

    It's no good beating about the bush, ellestones, and it's especially no good majoring on the phrase "think like a programmer"

     

    because you think, you think like a programmer, is why say the things you do

    you also this earlier. " With the exception of machine code/assembly, programming experience is a HUGE/MEGA advantage when starting to programme in LSL (or any other language)."

    Why if your argument is true, would you exempt machine code/assembly. Assembly languages have conditionals, evaluations and branching mnemonics, just like any other computer language.

    is quite clear from what you say that you are self-taught.  When we have no formal education then yes your view that your previous experience is of great help to you is understandable

    Yet, you also say stuff like, when you go back to using previous languages you struggle. Why that is, is because you don't think about what the purpose of language is. You type to chop out code. Along with all the other code cutters who don't bother to learn the language, who settle for being able to spell correctly

  5. 15 hours ago, Phil Deakins said:

     being a programmer already, and thinking like a programmer

    the internet has many links to the statement "think like a programmer"

    Steve Jobs is often internet misquoted as saying: "“Everyone in this country should learn to program a computer, because it teaches you to think.” And from this some people have extrapolated: "What does it mean to think like a programmer?" And some have gone on to sell a whole bunch of books and seminar attendance tickets, to explain what they think this means

    Steve Job never said the above misquote, and certainly never said think like a programmer

    what Mr Jobs actually said was: "I think everybody in this country should learn how to program a computer, should learn a computer language because it teaches you how to think."

    to program a computer we have to learn a computer language. Learning a computer language teaches us to think like a linguist. A linguist is a person who understands linguistics - the scientific approach to the study of a language, the analysis of the language's form, the meaning of the language, and the use/application of the language in its proper context

    people who have the benefit of formal education in the computer sciences are taught this in their first year at college

    • Like 1
  6. 2 hours ago, Qie Niangao said:

    This scares the hell out of me. Anybody who aspires to employment should immediately delete SL from their computer and go download the Flutter SDK or something a future job market might conceivably value. There's simply nothing for them here.

    every applicant pretty much lists C/C++, C#, Java, JScript, Android, .NET/Mono, LAMP/WAMP, SQL, XML, Python, CSS/HTML, etc etc. All the standard things along with the minimum standard qualifications: BSc, BTech, etc. When they don't have the expected standards then applicants don't make it past the intial stage

    a thing that lots of job applicants don't realise is that most job applications in medium to large organisations at the initial stage, are excluded by a relatively junior Human Resources staff member who has no technical knowledge of the job advertised.  The staff member works from a criteria list. Sorting the applications into 2 piles. Pile A is those who have the listed qualifications and at least some of the language/technical requirements. Pile B is those who don't. Nobody other than that staff member ever gets to see Pile B

    pile A then goes up to that person's Human Resources supervisor, who then does another exclusion sort. This person looking at things like job history, are the referees technical or are they character referees only. If no technical referee, past or current employer, or in the case of students then a faculty member, when not then its Pile B. Nobody else gets to see them either

    those still in Pile A go to the department. Where a medium-level staff member will do another exclusion sort. Medium-level meaning at least a team leader level person, not the boss. Leaving about 3 to 8 potential candidates remaining. Its those that remain that I help to interview - their first screen interview. And as all those remaining have met all the standards, then when I am reviewing their portfolios prepping for the interviews, , along with the notes prepared by the medium-level person,  what I look for is: What else does the applicant bring with them ?

    if a person doesn't bring something out-of-the-ordinary with them, something that sets them apart from the other applicants, then its either: They have a pretty traditional conservative approach to their work, or they are just wanting a job. When so then a person has to be exceptionally gifted to progress much further

    LSL would in this process be something out-of-the-ordinary. In the same vein as a portfolio that includes stuff like Unity, micro controllers, robotic toys, etc. Little if anything to do with the job being applied for, but an open expression of a curious, lively and enquiring mind. Its this latter I pay close attention too. Sure the successful applicant has to do all the usual database client server work as expected. And No, being a whizz in LSL or winning a local heat of Robot Wars won't all by itself get them the job. But it does help to show what else they have about them. Something that I, and those like me who do the technical review process, are looking for

    after the applicants get through the screening interview and tests then the boss gets the short list. Anything from 1 to 3 final candidates (sometimes none as nobody from the current crop of applicants made it that far). The boss gets those who do remain back for another interview. At which the only remaining criteria is: Can the boss see the candidate working well within their team

    sometimes a person at that final interview can blow their opportunity. When the boss asks the candidate about their experiences, the boss already knows that you (the candidate) are technically and ably qualified for the job. You wouldn't be at the final interview if you weren't. The boss is not impressed by a recital of your technical chops. What they are interested in finding out is, what kind of person you are

    • Like 2
  7. 4 hours ago, Rolig Loon said:

    Exactly. Not merely in the initial phase either

    yes that is true also in the circumstances you have described

    I contributed what I have more for college students like @autonug who may end up reading this thread.  When they graduate they are going to be in a job interview or presenting an application for funding. Someone like me is going to sitting in the end chair of the interview panel. And what that person will be looking for is not only does the applicant know what it is they are applying for, but also are able to show that they are actually applying it in their submission 

    for example. An applicant includes LSL in their portfolio. What will be looked at is not that there is a working LSL app, that it works is expected. What will be looked at is, how well reflected is the environment in their portfolio code submission

  8. 11 hours ago, Rolig Loon said:

    No, the statement that it 

    is quite correct.  I didn't say that it must be.  Prior experience can blind you to new possibilities and lead you to false assumptions.  I've seen it happen many times.  So don't get cocky.  That's all.

    i agree with the point you are making

    my experience is hiring technical practitioners to roles within our organisation, including programmers

    when we are new to a language then our experience in other languages can be a hindrance to us, during the initial learning phase. Like as an adult and we are English learning say Russian. We tend to think in English to begin with, translate it to Russian before we vocalise. When we hear russian in the initial learning phase, we tyoically translate it to english to try to understand what we just heard. We don't think in Russian. Unlike a russian child learning Russian who knows no English

    an example of thinking in a computer language environment. A dev shop who worked with my then organisation, had a test for programmer applicants way back in the then brave new world of visual object-oriented programming on the Windows platform

    the test question: How well do you speak Delphi 3 ?

    the test question body was: Build a Windows program with Delphi 3 that contains and displays the following strings in a Memo control ["the rain", "in spain" "falls mainly" "on the plain"]. When the user clicks a Button control, sort the strings into lexicographic order beginning with the 4th character ending with the last character

    almost all applicants who completed the test, most of who were coming from other language environments - including procedural Pascal. Delphi 3 being a new environment for many commercial dev shops at the time - wrote a version of a looping sort routine in the button click event. Those who did this never got hired. As the test giver's expected answer to the question "How well do you speak Delphi 3?" was:

    procedure TestForm.SortButtonClick(Sender: TObject);
       function SortOn4thChar(List: TStringList; X, Y: Integer): Integer;
       begin
          if Copy(List[X], 4, Length(List[X]) - 3) <= Copy(List[Y], 4, Length(List[Y] - 3) then
             Result := -1
          else
             Result := 1;
       end;
    begin
       Memo.Lines.CustomSort(SortOn4thChar);
    end;

    this is your point I think. Knowing another computer language doesn't always help us when learning a new language in a new and different environment. It can sometimes hinder our learning and understanding of the environment

    like when we find as in the above example, that our own coded string sort routine - based on our understanding of a previous programming language environment - does run/execute in a Delphi 3 application, then we can easily be satisfied with this, and never look any further into how we can better use the language environment which we are now coding in

    or as the person who told me about their dev company test from those days. Has the applicant read the manual. If they have do they understand it. If they do understand then have they applied their understanding to the environment they are now coding in

    about cocky people

    i quite enjoy over-confident people at interview. I enjoy mostly though people (both over and under confident) who listen carefully at interview when I tell them to think about their interview responses, as if they make it past this interview they will be given a technical test which examines their understanding of the answers they are about to give to the interview questions I am about to ask them

    • Like 3
  9. oh! man lol. Tooo funny! :D

    at least you got it to go Ayane. So well done and good on you :)

    /me gives Rolig a hug 👩‍❤️‍👩

    and a hug for Ayane 👩‍❤️‍👩 and Wulfie  👩‍❤️‍👩

    and xmas hugs for everyone else as well 👩‍❤️‍👩

    • Like 1
  10. i get this problem sometimes. Our causes may be different tho

    assuming that is not a hardware issue, like your Ethernet card is failing

    what I found that helped me, was to add more DNS connections to my desktop. In my case I added my ISP DNS, two Google and two OpenDNS

    a instructional of how how to do this on Windows 10 is herr

    https://www.windowscentral.com/how-change-your-pcs-dns-settings-windows-10

    i am only kinda guessing here, but I think my router gets flooded when lots and lots of domain-based connections (which SL has lots of) from a single external source are received, causing the router to shut down. Having multiple Domain Name Servers helps (I think) to spread the incoming load vectors

    a adjacent point, is that my ISP has told me that they don't deliberately drop my connection when their DNS receives large bursts of requests from me, but am pretty sure there is some kinda fail-safe cutoff point built into their DNS software

    • Thanks 1
  11. @autonug

    if what you mean by demand/supply ratio is show me the money, then the money is in products that use scripts to functionally enhance their mesh components

    if you see LSL as another way to apply what you are learning in school then that's where the money is. When you graduate and apply for a job then the more working examples of stuff that you can show in your portfolio, the better your chances of securing a job that you want

    • Like 1
    • Thanks 1
  12. 43 minutes ago, Nova Convair said:

    I will NOT use llSetMemoryLimit because it has zero effect.

    sometimes is best to script test before saying stuff like this

    when we set memory limit to less than the static compiled size then llSetMemoryLimit has no effect. Which is expected behaviour as it makes no sense to do to this

    when we set it to more than the static compiled size then the script will crash with a Stack-Heap Collision when the memory limit we have set is exhausted at runtime

    example test which has a static compiled size of 4432 bytes

    list stuff;
    
    default
    {
        state_entry()
        {
           llOwnerSay((string)llGetUsedMemory()); 
          
           llSetMemoryLimit(6000);
           llSetTimerEvent(1.0);
        }
    
        timer()
        {
            llOwnerSay((string)llGetUsedMemory());
            stuff += [
               "0123456789ABCDEF" +
               "0123456789ABCDEF" +
               "0123456789ABCDEF" +
               "0123456789ABCDEF" +
               "0123456789ABCDEF" +
               "0123456789ABCDEF" +
               "0123456789ABCDEF" +
               "0123456789ABCDEF" +
               "0123456789ABCDEF" +
               "0123456789ABCDEF" +
               "0123456789ABCDEF" +
               "0123456789ABCDEF" +
               "0123456789ABCDEF" +
               "0123456789ABCDEF" +
               "0123456789ABCDEF" +
               "0123456789ABCDEF"
            ];
        }
    }

     

    • Like 2
  13. 5 minutes ago, Qie Niangao said:

    I also agree that states (and state_entry and state_exit) are the closest thing LSL has to an exception processing model of flow control. I'd just note that this model is broader (and maybe older?) than OOP, with for example LISP's throw/catch condition handling available historically independent of different object system variants

    thanks for the info Qie :)

    my knowledge of languages like LISP as you mention, and FORTRAN like Rolig mentions earlier, is that while I have heard of them and have some idea of how they work, is pretty much exactly zero from a hands-on pov

  14. 22 minutes ago, Love Zhaoying said:

    I agree, so this puts me in the “get off my lawn” camp! My Pascal goes back to Turbo Pascal. (Great hacks to use memory loading tricks!) I’m pretty sure we also used Borland C before Microsoft, and also Microsoft C++ before it was “Visual”. 

    wooo! Object Pascal. Thats pretty grandparently :)

    i thought Delphi 5 was pretty elderly when I was first given it. So Object Pascal definitely really elderly, in a kind and caring way :)

    i haven't looked at in ages now but am pretty sure that the Lazarus Pascal dev environment is still built with an opensource Object Pascal compiler. The compiler code itself written in Pascal. So it compiles itself. Which is pretty cool

     

  15. 2 hours ago, Ichi Rexen said:

     One of the first languages I spent time learning IRL was Python and I spent a good amount of time programming procedurally only. You have me wondering now if thats why I have a preference to single state over multiple states. I didn't start doing any real OOP until later on when I started covering Java and its hybrid Jython

    mostly like yes

    my own path was a managed code environment. Office VBA writing custom functions for my own use at work, which then started to get used by my then co-workers. From there my organisiation then asked me to look at some of the .NET and Java client server apps we were using. Managed code object-oriented environments. Then i got asked have to a look at a legacy unmanaged app written with Delphi 5.  When I dived  into the Delphi VCL library I found that the classes I had been using up until then were wrappers for procedural code, where the deeper you went the closer to the metal code you got.  For example: TMemo > TEdit > TWinControl > TControl > TComponent > TPersistent. At the TPersistent level it is pure low level procedural Pascal.  And then when I opened up some of the custom components built for the app then I found they had been written in C++ drilling down to pure C and in some optimised parts of the components purely procedural Intel x86 assembly

    so having gone thru this I ended up for a time in a professional dev shop which was a pretty hardcore blistering learning experience for me. Serious people, hard deadlines and lets get it done and shipped.  From this I was headhunted to another organisation, for who I still work, but now more in a consultative role  

    so my coding life experience brings me too LSL from the opposite direction from you pretty much.  State event-driven managed code > object-oriented code > procedural code > LSL

    as Rolig and other long time experienced programmers with broad experience have said. Is no one true way. There is no one true design model. There is no one true code workflow methodology

    if there is a truth in the commercial world of programming it is: First get our code to work without error - however well or badly it might perform in resource consumption and runtime efficiency. Then Second, optimise the codes after the app works without error.  Then Third, look at how code can be written so that is portable

    however, a hard truth is that clients don't pay us to write portable code that we are going to use again for another of our clients' benefit. They are paying for their app, not paying for the work we do for other clients

    but yes, when we do get to be like Rolig and others with years of tried and proven experience, then we can write for One, Two and Three all at the same time

    when we don't tho have that hard-earned experience and try to jump to Two and Three before we have mastered One, then our codes are never going to work without error. No matter how little resources we use or how fast it runs, or how portable the code is. Slow and inefficient code that runs error-free wins every time over code that runs fast and lean and dies before it gets to the finish line. So One, then One-Two, then One-Two-Three

     

    • Like 3
  16. On 12/18/2018 at 4:25 AM, Scylla Rhiadra said:

    ... when we used to go dancing, he'd shorter himself a little).

    this is what I have found with my male friends. They would rather shorten themselves than ask me to make myself taller when dancing

    with a lot of fitted mesh these days Is not as much of an issue, but there is still an issue, to make ourselves taller with the height slider. Back in the prim days this was a pretty fraught thing to do. Prim and later sculpt everything attachments often needed to be adjusted. So the men would say they would shorten because lots less (or none) attachments for them to adjust. They rather be dancing than stand there for 20 minutes while I hitch all my stuff up  in the middle of the dance floor  :D

    most men from those days just keep on doing this today.  Because thru experience they know that while our bodies look great at our normal height, then we can turn into skinny giraffe when we lengthen our height and not adjust every other slider to compensate. Which if don't adjust also then will I start to fret, and my dance partner starts to sob quietly to himself :)

     

    • Like 1
  17. usually in a discussion about states and events then the general approach, general meaning fallback, tends to follow our life coding experience as programmers

    typically those raised on procedural languages tend to write LSL code procedurally within a single state. The equivalency being a C program:

    main() { initialise(); program_loop; exit();)

    those who are raised on event-driven object-oriented languages tend toward using states, along the design principles:

    state initialise();
    state main();
    state exit();

    am not sure what people's experience of tools like C# and Delphi Pascal are. You will find the latter construction in these languages. And we find intuitive flow control structures in them like this:

    begin {
       initialise() {
    
       }
      
       try {
    
       } 
       except {
    
       }
       finally {
    
       }
    }

    intuitive meaning intuitive to a person conversant with object-oriented event-driven programming

    basically in these languages we don't initialise as we go. We initialise first, try/execute the code, handle the exceptions, then finally tidy up. When the interaction with the player/other object fails then we deal with it by exception, go back to the beginning when we can, re-initialise and try again

    a example of this, using the event-driven state model inherent to LSL

    default()
    {
       state_entry()
       {
          .. initialise ..
          .. load notecards, etc ..    
       }
    
       data_server( .. )
       {
           if (..EO initialise..) exit;
              state main;
       }
    
    state main()
    {
       ... wait for player ...
       ... on acquire player exit
            state play;
    }
    
    state play()
    {
        .. try
             play events
        .. except
             state exception();
        .. finally
              discard player and exit
              state main(); (and wait to acquire the next player)
    }
    
    state exception()
    {
       state_entry()
       {
          ... show exception visually
          settimer();
       }
    
       touch() or listen() for player input
       {
          ... wait for player acknowlegement, when obtained exit
          state player(); 
       } 
       
       timer()
       {
          .. finally
          ... discard player and exit
          state main();
    }

    what this approach means is that the if is and if that decisions typically found in procedurally coded programs are lessened, coding exceptions for listeners and inputs are reduced to only those necessary for the state that the program is in as the program flow unfolds

    when we see code of fairly large and complex interactive LSL programs then is noticeable what the life code experience of the person who wrote it is

     

    • Like 2
  18. in the LL standard viewer Shape Editor ruler shows the height of the avatar bounding box. Which measures from the bottom of our feet up to our eyes. (historical reasons for this and never changed since). So we are by prim ruler measure taller than the LL standard viewer indicates. Some TPVs have changed the Shape Editor ruler to show closer to our prim height

    in the standard LL viewer I find that in our bare feet, the LL ruler set to between 168cm to 175m works relatively well, in relation to the average norm of all human avatars overall. As when we add our shoebase/heels and hair then we are visually at about 185cm (about 6ft).give or take some cms. Which works out pretty good overall, given that most guys (averaged) tend to be between 6.0 - 6.8 feet tall in SL by the SL Shape editor

    • Thanks 2
  19. On 12/12/2018 at 11:15 AM, Scylla Rhiadra said:

    ... it also should be understood as a sort of historical document, an interesting re-enactment (albeit through rose-coloured glasses) of the kinds of negotiations in which women once had to engage in order to express their own sexuality.

    But that was the 1940s, when social mores and expectations required that a woman who wished to engage in extra-marital sex required some kind of "excuse," ...

    ^^ yeah that ^^

    is still a few people today who think there is something wrong with women who say yes to sex when asked straight out. And something more wrong, evil even, with women who just flat out ask first

    • Like 1
×
×
  • Create New...