• Hey, guest user. Hope you're enjoying NeoGAF! Have you considered registering for an account? Come join us and add your take to the daily discourse.

Programming |OT| C is better than C++! No, C++ is better than C

Tamanon

Banned
Kinda a weird question here, but I'm still doing some Python work and starting the process of Django also. Normally I'll have my laptop on my which is Windows 8.1, but I'll also be doing work at school on separate things on Red Hat, whether my PC at home or at a lab. If I wanted to work on my personal projects on both, is there a way to centralize things? I've read a bit about GIT, and I think that might be what I'm looking for, but anyone have experience with using multiple PCs on different OS's to work?

My only computer class this semester is Red Hat Enterprise, but I want to work on my CCNA testing program/site for my cert studies. So Python and MySQL to start with.
 

phoenixyz

Member
Kinda a weird question here, but I'm still doing some Python work and starting the process of Django also. Normally I'll have my laptop on my which is Windows 8.1, but I'll also be doing work at school on separate things on Red Hat, whether my PC at home or at a lab. If I wanted to work on my personal projects on both, is there a way to centralize things? I've read a bit about GIT, and I think that might be what I'm looking for, but anyone have experience with using multiple PCs on different OS's to work?

The simplest solutions would be Dropbox (or similar) or SSH. But: Git is great. I think you won't regret getting used to it. It's not that hard either.
 

injurai

Banned
I forget the concepts behind using malloc and calloc... can anyone point me to a good tutorial or give me the rundown. I always seem to struggle grasping it. I understand pointer syntax, just not really how to make use of them. Especially knowing how to allocate and then free up memory.
 

Cindres

Vied for a tag related to cocks, so here it is.
I'm sitting an exam on C++ tomorrow. Now I did all the exercises and bossed the coursework but last year's exam paper written by the module leader is just fucking weird.
There are many things I could ask but this one right now is bugging me:

A student who thinks they know all there is to know about C++ makes the following statement: “If something is on the heap it must be retrievable by using a reference that is stored on the stack!” Is this statement true or false? Why do you think the student would make such a statement?
I'm leaning towards false on this one but then the follow-up at the end there is very confusing as well. I could literally just put "because he guessed".
 

Osiris

I permanently banned my 6 year old daughter from using the PS4 for mistakenly sending grief reports as it's too hard to watch or talk to her
I'm sitting an exam on C++ tomorrow. Now I did all the exercises and bossed the coursework but last year's exam paper written by the module leader is just fucking weird.
There are many things I could ask but this one right now is bugging me:


I'm leaning towards false on this one but then the follow-up at the end there is very confusing as well. I could literally just put "because he guessed".

Hint: You're failing into the trap that the question is designed to exploit. I really don't want to give you the answer as you'll kick yourself when you get it and when you get it you'll be able to answer both questions fairly confidently, read the students statement again and work through it.. :p

Another hint (Give some more thought before highlighting!):
Although worded strangely, It makes sense why that is so, it's testing your knowledge of references.
 
I've gotten so much more respect for handling inputs ever since I started with programming. It's way more complex than a non-programmer might think! My little bot will now understand that if the user says something like: "What's up!? :) My freaking name is Jacob!!11!1!" it will understand that the name is Jacob. The only main issue is if someone says "My name is definitely Jacob", in which case it will think that "definitely" is the name. What a mess! I could throw in some exceptions to fix it, but I just checked and not even the big, way more complex, Cleverbot knows how to deal with it:

f957839f55235e8a981384bfb2ec75c2.png


I assume on my second and third inputs it just fools around. Fascinating nonetheless, I'm liking programming more and more :) I just had my Databases (SQL, relational algebra, ERD's etc) exam today, and I'm pretty excited for the next "real" programming course, though sadly that's far away. Oh well. Still lots of projects on my own to do and many tutorials on codeacademy and msdn to check out + I still haven't had time to check out the things you guys recommended to me above what with the exam and stuff!
 

haikira

Member
Hey, this is more of a testing question, rather than programming. Though, this was the most relevant place I could find to post it. Apologies.

I just started six months unpaid at a software house. I've been mostly doing tutorials, but have also dabbled in testing. I just wanted to double check some stuff, related to test cases.

I have a fairly standard template set up, and I'm happy enough with it. My question is, If I fill it with information. Like, tester name, version and etc, then fill it with test cases. Afterwards, those test cases are tested and it's all done. What happens when it's time to test the next version? Should I have a template handy that had only the test cases, without any filled out information.

Funnily enough, I think It's probably the simplest aspects about this that are confusing me. That just tends to be my style. But as far as creating the test cases themselves and what're relevant fields to have, I think I'm ok.
 

Cindres

Vied for a tag related to cocks, so here it is.
Hint: You're failing into the trap that the question is designed to exploit. I really don't want to give you the answer as you'll kick yourself when you get it and when you get it you'll be able to answer both questions fairly confidently, read the students statement again and work through it.. :p

Another hint (Give some more thought before highlighting!):
Although worded strangely, It makes sense why that is so, it's testing your knowledge of references.

Ohhh yeah. Alrighty then well I still want to say false but for the second part I'm not really sure how I would word the answer.
I want to say something on the lines of "The student is assuming that because a reference must always refer to a pointer or value, that the opposite is also true"
 
Hey, this is more of a testing question, rather than programming. Though, this was the most relevant place I could find to post it. Apologies.

I just started six months unpaid at a software house. I've been mostly doing tutorials, but have also dabbled in testing. I just wanted to double check some stuff, related to test cases.

I have a fairly standard template set up, and I'm happy enough with it. My question is, If I fill it with information. Like, tester name, version and etc, then fill it with test cases. Afterwards, those test cases are tested and it's all done. What happens when it's time to test the next version? Should I have a template handy that had only the test cases, without any filled out information.

Funnily enough, I think It's probably the simplest aspects about this that are confusing me. That just tends to be my style. But as far as creating the test cases themselves and what're relevant fields to have, I think I'm ok.

Maybe you could keep this version of your test for this version of the code, and use source control or something to update your tests along with the new released?

When I did QA I would reuse tests if that portion of the product did not change. Ideally if it pasts the first time it will pass the second time, if not something is wrong.

You may need to change some input values(like names, emails, etc), but otherwise use the same test and update when needed.


I've gotten so much more respect for handling inputs ever since I started with programming. It's way more complex than a non-programmer might think! My little bot will now understand that if the user says something like: "What's up!? :) My freaking name is Jacob!!11!1!" it will understand that the name is Jacob. The only main issue is if someone says "My name is definitely Jacob", in which case it will think that "definitely" is the name. What a mess! I could throw in some exceptions to fix it, but I just checked and not even the big, way more complex, Cleverbot knows how to deal with it:

f957839f55235e8a981384bfb2ec75c2.png


I assume on my second and third inputs it just fools around. Fascinating nonetheless, I'm liking programming more and more :) I just had my Databases (SQL, relational algebra, ERD's etc) exam today, and I'm pretty excited for the next "real" programming course, though sadly that's far away. Oh well. Still lots of projects on my own to do and many tutorials on codeacademy and msdn to check out + I still haven't had time to check out the things you guys recommended to me above what with the exam and stuff!

What exactly are you using to build this? Looks awesome and interesting. Are you just using string comparisons or a more complex algorithm?
 

phoenixyz

Member
I'm leaning towards false on this one but then the follow-up at the end there is very confusing as well. I could literally just put "because he guessed".

My thoughts...

First part:
If you have a pointer in the code segment (global variables) and malloc some memory to it (heap), there won't be a reference to that memory on the stack. Other examples are: allocated memory which was simply not freed or local variables which might be in registers instead of the stack due to optimization (e.g. the arguments). So no, there doesn't need to be a reference to allocated heap memory on the stack.

Second part:
Maybe the student learned programming in Java, where an object is garbage collected (hopefully) soon after the last reference to it goes out of scope.
 

Cindres

Vied for a tag related to cocks, so here it is.
The help on that last question was very useful so cheers guys!

I've gone 2 years back to another past paper and there's this question:
Code:
class Show {
public
   Show();
   void display_dec(const int) const;
   void display_hex(const int) const;
private
   enum constants { SIZE = 40; }
   char the_str[SIZE];
}

void main() {
   Show message;
   void (Show::*p_fun) (const int) const;
   p_fun = &Show::display_hex;
     (message.*p_fun)(100)
   p_fun = &Show::display_dec;
     (message.*p_fun)(100)
}

The whole thing basically revolves around "p_fun" and the first question asks what it is and how it is used in the program?

I'm at a total loss here. It's like nothing I've seen before and I couldn't possibly search google for this.

Also that's EXACTLY how the code looks on the paper so for now let's ignore the fact that it wouldn't even compile.
 
What exactly are you using to build this? Looks awesome and interesting. Are you just using string comparisons or a more complex algorithm?

Using C# in Visual Studio, making use of pretty basic stuff. Like you suggested: many string comparisons. Lots of if-else, but since the user can input millions and millions of possible inputs, I try to generalize the input as much as I can, with various nested for-loops as such (like checking what punctuation it is (if the input contains a question mark then the bot will assume that it's a question if nothing else matches) and also to remove all uninteresting characters (like after it has checked if there's a question mark, the mark is removed since the character is no longer interesting and is only in the way of string matching)). No complex algorithms though, nowhere near the stuff that I've seen in this thread :) Not yet anyway!
 

maeh2k

Member
The help on that last question was very useful so cheers guys!

I've gone 2 years back to another past paper and there's this question:
Code:
class Show {
public
   Show();
   void display_dec(const int) const;
   void display_hex(const int) const;
private
   enum constants { SIZE = 40; }
   char the_str[SIZE];
}

void main() {
   Show message;
   void (Show::*p_fun) (const int) const;
   p_fun = &Show::display_hex;
     (message.*p_fun)(100)
   p_fun = &Show::display_dec;
     (message.*p_fun)(100)
}

The whole thing basically revolves around "p_fun" and the first question asks what it is and how it is used in the program?

I'm at a total loss here. It's like nothing I've seen before and I couldn't possibly search google for this.

Also that's EXACTLY how the code looks on the paper so for now let's ignore the fact that it wouldn't even compile.

p_fun is a function pointer. Both functions in Show have the exact same signature and the function pointer is created for const functions in show that take a const int argument. Then you can point p_fun to any function that matches that signature. It's first that to one function, called, then set to the other function and called again.
 

sgjackson

Member
Is there a good place online to brush up on discrete math? My university does a foundation exam which covers concepts from CS1 and discrete math that you have to pass to be eligible to take further classes in a CS major. I took discrete math last semester and I'm taking CS1 this semester, so I'm worried about how well I'd retain the info if I don't work on it until May, when I take the exam.
 

Cindres

Vied for a tag related to cocks, so here it is.
p_fun is a function pointer. Both functions in Show have the exact same signature and the function pointer is created for const functions in show that take a const int argument. Then you can point p_fun to any function that matches that signature. It's first that to one function, called, then set to the other function and called again.

Ahh I see, don't think I saw anything in my notes about that but that clears everything up! I'll have a bit more of a look into function pointers.

Thanks!
 

Onemic

Member
IntelliJ Ultimate Edition does, if you're willing to pay. :)

So, I'm pretty much forced to pay for an IDE to develop with JS/CSS/HTML5 if I'm using Linux? ugh, I'm continually wondering why I'm continuing to have this OS on my laptop now that I'm done my Linux class. My school offers VS Ultimate for free :(
 

Osiris

I permanently banned my 6 year old daughter from using the PS4 for mistakenly sending grief reports as it's too hard to watch or talk to her
So, I'm pretty much forced to pay for an IDE to develop with JS/CSS/HTML5 if I'm using Linux? ugh, I'm continually wondering why I'm continuing to have this OS on my laptop now that I'm done my Linux class. My school offers VS Ultimate for free :(

Look at Aptana Studio, for Linux Web Development.
 

haikira

Member
Maybe you could keep this version of your test for this version of the code, and use source control or something to update your tests along with the new released?

When I did QA I would reuse tests if that portion of the product did not change. Ideally if it pasts the first time it will pass the second time, if not something is wrong.

You may need to change some input values(like names, emails, etc), but otherwise use the same test and update when needed.

If you wouldn't mind breaking that down a little more for me, I'd appreciate it. This is actually my first proper IT job. I've been doing Microsoft programming and web design courses for two years and a friend helped get me in to a place, to do six months experience. I've had absolutely zero experience with testing before, or really, most things, outside of some very basic projects at class.

Here's an example of something I was working on earlier. It was just put together, as a way to test my layout. It's not actually something that's being used. I plan to change a few things, including aspects about the layout. Setting specific login details to use wasn't a great idea too, since obviously they can only be registered once.

The place I'm in don't make particularly large apps and I think as my friend said, What's in it early feature wise, is what it's staying as, which is why I was wondering about keeping a specific template of test cases, for an application, since there probably won't be many fundamental changes. But then again, I'm really not sure, as I'm new to all this.

I think up until now, their testing as been very sporadic and quite informal, but as they're expanding, I think they're looking to improve their QA.

Sorry for the wall of text and I really do appreciate any and all hints and tips you guys have.
 

Osiris

I permanently banned my 6 year old daughter from using the PS4 for mistakenly sending grief reports as it's too hard to watch or talk to her
Would it be better as an Eclipse plugin or standalone?

I have a fairly intense dislike for Eclipse, so you can guess my answer ;) :p
 

iapetus

Scary Euro Man
So, I'm pretty much forced to pay for an IDE to develop with JS/CSS/HTML5 if I'm using Linux? ugh, I'm continually wondering why I'm continuing to have this OS on my laptop now that I'm done my Linux class. My school offers VS Ultimate for free :(

You're pretty much forced to pay for the best IDE in the world. :p They do a very substantial academic discount. There are free options out there too, which some people have pointed out; I suggested IDEA because I use it personally and professionally for development, and if its JS support is anywhere near as its support for other languages it's well worth considering.
 
You're pretty much forced to pay for the best IDE in the world. :p They do a very substantial academic discount. There are free options out there too, which some people have pointed out; I suggested IDEA because I use it personally and professionally for development, and if its JS support is anywhere near as its support for other languages it's well worth considering.

I would kill for IntelliJ IDEA at work. To give you some idea, I have to use Notepad++ / Adobe Edge Animate combo and for the code parts Edge Animate is missing features such as Find as in CTRL+F so any kind of any kind of code completion is just a pipe dream. Of course I could use Edge Code or Notepad++ to actually edit the code as it says here:

Yes. Code can be edited outside of Edge Animate. Since it works directly with HTML, CSS, and JavaScript, any external code editor – including Edge Code – can be used. Actions code created in Edge Animate can also be edited by accessing the project’s "edgeActions.js" file.

http://html.adobe.com/edge/animate/faq.html

Which would be great if the projects wouldn't shit themselves if you dare to touch the edgeActions file outside of the program.
 

usea

Member
It's baffling to me that a company would pay an employee to solve their problems by writing code, but won't plop down like $100 to massively increase their productivity.
 
It's baffling to me that a company would pay an employee to solve their problems by writing code, but won't plop down like $100 to massively increase their productivity.

I guess I could just ask and get one. Damn, I should ask!

And while Adobe Edge in it's base isn't even a bad concept at all, it's just so barebones and buggy that adopting it at this point isn't that beneficial.

edit: yeah, we have top notch hardware and software so that's not the issue, it's just that this direction sort of new
 
It's baffling to me that a company would pay an employee to solve their problems by writing code, but won't plop down like $100 to massively increase their productivity.

Reminds me of my last job. It was an internship of sorts, so I didn't expect a whole lot, but the hardware was AWFUL. I was on a Pentium IV with Windows XP. Made it so hard to get anything done.

And it wasn't just the interns, most of the devs there had bad hardware. When some big corporate IT guy came into town, they asked when we could get new hardware. The answer boiled down to "if it turns on keep using it". Basically they wouldn't buy new hardware until the old hardware literally stopped working entirely. Way to put a huge damper on programmer productivity to save a bit on hardware costs guys. (Cue a bunch of devs "accidentally" breaking their computers.)
 
I found Rosalind.info a few days ago, which is a site about Bioinformatics/Computational Biology which uses a Project Euler-like format with exercises that get progressively harder that you can solve. There's also always some theoretical background on why you're doing what you're doing as well. So far I've done 9.
 
I'm pooling together ideas, tools, and techniques I want to use for an upcoming hobby project, done mainly in C# or VB.Net. I want to do a better job following best practices and proper coding, so I want to better separate the data layer from the business classes. I'm used to having the class implement its own methods for CRUD on its properties (like, an Insert method that runs a SQL command to insert a record into a table with info from an object.) What's the better or more proper way to do this? How could I separate out that logic?
 

leroidys

Member
I'm having some really weird problems in python 2.7.


Code:
# coding=UTF-8
import urllib
import urllib2

def foo():
    for i in range(2,9):
        print i
        
        return "poo"


produces


Code:
>>> a.foo()
2
'poo'



Whaaaaaaaaat???? I'm taking examples straight from the pydocs and have no idea why it's not working. I feel like such an idiot.
 
I'm having some really weird problems in python 2.7.

-snip-

produces

-snip-

Whaaaaaaaaat???? I'm taking examples straight from the pydocs and have no idea why it's not working. I feel like such an idiot.

Syntactic white space. Your return statement is indented to the same level as your print statement. So, it's getting to the for loop, prints "2", then immediately returns "poo" to the calling function.

Indent your return statement so that it's at the same level as your for statement and it should work like you expect.

Code:
def foo():
    for i in range(2,9):
        print i
    return "poo"
 
I'm having some really weird problems in python 2.7.


Code:
# coding=UTF-8
import urllib
import urllib2

def foo():
    for i in range(2,9):
        print i
        
        return "poo"


produces


Code:
>>> a.foo()
2
'poo'



Whaaaaaaaaat???? I'm taking examples straight from the pydocs and have no idea why it's not working. I feel like such an idiot.

Unless it was the point of the example, you have an indentation problem. This is demonstrating that the "return" is inside the loop body, which means the loop will not finish normally. If you were to remove one level of indentation on the return statement, the loop would proceed from 2 to 8 and then return as you probably expect.
 
I'm pooling together ideas, tools, and techniques I want to use for an upcoming hobby project, done mainly in C# or VB.Net. I want to do a better job following best practices and proper coding, so I want to better separate the data layer from the business classes. I'm used to having the class implement its own methods for CRUD on its properties (like, an Insert method that runs a SQL command to insert a record into a table with info from an object.) What's the better or more proper way to do this? How could I separate out that logic?

One popular approach in C# is to use a unit of work/repository pattern, and you can utilize Entity Framework (EF) as part of the approach. There are various flavors to EF, from a code first approach with really thin POCOs to a heavier database first approach with much thicker models, but still ones without their own CRUD methods, as that's the job of the database context that can be further encapsulated by repositories.

There's no shortage of examples if you simply google the repository pattern and EF for C# or VB.
 

leroidys

Member
Syntactic white space. Your return statement is indented to the same level as your print statement. So, it's getting to the for loop, prints "2", then immediately returns "poo" to the calling function.

Indent your return statement so that it's at the same level as your for statement and it should work like you expect.

Code:
def foo():
    for i in range(2,9):
        print i
    return "poo"

Unless it was the point of the example, you have an indentation problem. This is demonstrating that the "return" is inside the loop body, which means the loop will not finish normally. If you were to remove one level of indentation on the return statement, the loop would proceed from 2 to 8 and then return as you probably expect.

Hahah omg... I knew it was something stupid like that but I just couldn't see it. Wow.

Well thanks you guys.
 
Hahah omg... I knew it was something stupid like that but I just couldn't see it. Wow.

Well thanks you guys.

No problem, Python's syntactic whitespace seems kind of weird at first, but you'll get used to it. It's normal to make mistakes like that, especially if you've written stuff in a language with C inspired syntax before.
 

Water

Member
No problem, Python's syntactic whitespace seems kind of weird at first, but you'll get used to it. It's normal to make mistakes like that, especially if you've written stuff in a language with C inspired syntax before.
I'm a full-time C++/# user and have barely used Python, but its syntactic whitespace is one of the reasons I recommend it for beginners. I have almost never seen a C newbie indent their code semantically correctly from the outset, but they read their code and interpret it according to their intendation. So why not force the intendation, have it actually mark the semantic structure, remove superfluous typing and visual noise in one stroke?

edit: this is not to say I think syntactic whitespace is the only good way to go; I have a feeling it would make things a bit harder for advanced stuff like code generation.
 
I'm a full-time C++/# user and have barely used Python, but its syntactic whitespace is one of the reasons I recommend it for beginners. I have almost never seen a C newbie indent their code semantically correctly from the outset, but they read their code and interpret it according to their intendation. So why not force the intendation, have it actually mark the semantic structure, remove superfluous typing and visual noise in one stroke?

edit: this is not to say I think syntactic whitespace is the only good way to go; I have a feeling it would make things a bit harder for advanced stuff like code generation.

Yeah, this is a good point. I agree that because of those reasons it's one of the best ways to go for new programmers. I think the whitespace can just be a bit troublesome at first if you already have a fair bit of experience with a language with braces/semicolons, though. Nothing major, as it's pretty intuitive anyway. Just keep logical blocks of code indented at the same level.
 

Osiris

I permanently banned my 6 year old daughter from using the PS4 for mistakenly sending grief reports as it's too hard to watch or talk to her
Oh man, my wife isn't going to like this.

Now and again I like to dip into Project Euler to test myself, refresh some of my programming skills.

I just found out about CodeEval.com... oh my, How did I not find out about this site before? (* see below :p)

Like Project Euler, with Leaderboards, and Job offers.

My weekend is lost before it's even started! :p

*
I know of course, I still learn my languages from those old fashioned book things, have little to do with online coder communities, and avoid StackOverflow like it's coding killed my family (It still might :p), so that's probably why :p
 
One popular approach in C# is to use a unit of work/repository pattern, and you can utilize Entity Framework (EF) as part of the approach. There are various flavors to EF, from a code first approach with really thin POCOs to a heavier database first approach with much thicker models, but still ones without their own CRUD methods, as that's the job of the database context that can be further encapsulated by repositories.

There's no shortage of examples if you simply google the repository pattern and EF for C# or VB.
Cheers. I'm digging into it now. It's quite overwhelming st first blush since it would be adding a lot more complexity to how I would traditionally code and uses stuff I haven't used much before, like EF or other ORMs.

Better dive in I suppose. I would love to be able to get it designed to a point that I could switch between sqlite and SQL Server on the fly for saving data.
 
Oh man, my wife isn't going to like this.

Now and again I like to dip into Project Euler to test myself, refresh some of my programming skills.

I just found out about CodeEval.com... oh my, How did I not find out about this site before? (* see below :p)

Like Project Euler, with Leaderboards, and Job offers.

My weekend is lost before it's even started! :p

*
I know of course, I still learn my languages from those old fashioned book things, have little to do with online coder communities, and avoid StackOverflow like it's coding killed my family (It still might :p), so that's probably why :p

That looks really cool! I'm going to have to start trying it out. Seems a bit like TopCoder, maybe.
 

Korosenai

Member
So I'm taking c# this semester and I kind of want to get into making some Windows Apps. My teacher was talking about it, and this girl I sit next to showed me some apps she made and how much money she made from them... and it's kind of got me intrigued. My teacher told me to contact another professor about it, but it's been four days and she hasn't replied back. So basically my main question is, are there any resources or materials I can find online to help me out? Books, websites, free ebooks, anything will do.
 

Onemic

Member
That will just have extra features that you may use. I have professional and it does everything I need.

Ok, I have VS ultimate 2013 installed, but I have no idea how to start an HTML or CSS project within the program. Do you have any idea how to do this?
 

Ixion

Member
Hey guys and gals. I apologize for not reading through this entire thread, but here's my situation:

-I work in Sales Operations and therefore most of my job focuses on Salesforce admin duties
-I've had the job for a year and half, so I know my way around Salesforce
-I don't know APEX code (Salesforce's coding language), nor any type of coding language
-We keep running into issues or suggestions that require APEX/Visualforce
-Instead of continually asking around for code, I want to finally learn APEX myself

I was pointed towards this site: www.sfdc99.com

The site provides easy instructions for APEX newbs, but the creator, David Liu, emphasizes that APEX is based on Java, so learning Java is advised.

David recommends this book, which supposedly teaches Java in a colorful, visual way.



However, other people have pointed towards a 4-hour video class by someone named Patrick Washington. The first hour is on YouTube:

Video

I just watched the first hour and I found it easy to follow along. I'm considering buying the full 4-hour video for $40.

Anywho, that's where I'm at right now. I just wanted to see if anyone here had any recommendations regarding the paths I could take to learning APEX and Visualforce.

Thanks!
 

iapetus

Scary Euro Man
That looks really cool! I'm going to have to start trying it out. Seems a bit like TopCoder, maybe.

The rules encourage really bad coding if you're using Java. :p And some of the challenges rely more on correctly interpreting the requirements (which can be a bit ambiguous or underspecified) than coding skills...
 
Top Bottom