Thursday, November 21, 2013

Artificial Intelligence: How to Recreate the Mind

     An artificial intelligence, or AI for short, is an intelligent machine or program. When I think of AI, I think of an android that thinks and behaves like a human. Is creating a replica of human intelligence possible? Well, an actual dynamically learning artificial intelligence is probably far out of reach of our current technology, if it is reachable at all, but an artificial intelligence functioning using logic and "learning" is probably possible to make today.
TwoAndroids
Android Concept Image from ImmortalDC.com
     In order to make an artificial intelligence, one must program every possible stimulus that the AI should react to and program various reactions depending on what the AI is exposed to. These can be chained in sequence, so if an AI is exposed to certain things in certain orders, it may respond differently than if it was exposed in a separate order. This is extremely difficult, because in the worse scenario, it can have an infinite number of different if statements in order to program a truly completely reactive AI. For example, if I had two stimuli, say seeing the color red and seeing the color blue, I could program a robot to point upwards if it sees red then point downwards when it sees blue. However, I can also program it to point to the right if it sees red after blue, or point to the left if it sees blue after red. Additionally, I could program things for the robot to do if it sees red twice in a row, or if it sees red then blue then red again, and so on. This means that even for this simple two stimuli example, there is an infinite amount of responses that the robot could have. To put this into human context, imagine that someone prods you in the arm with their finger. You might let it slide the first time, but each time they poke you after that you will react differently, probably with more and more irritation each time. How fast you get angry and how you respond would probably be determined by things that have happened previously in your life, maybe things in your childhood, or even things that have happened within the past hour. Now imagine how difficult that would be to program in an AI.
AIWalle
Image from Disney's WALL-E

     As you can see, while artificial intelligence is a very interesting concept and idea, one that functions like the human mind is currently way out of our reach. It would just take much too long to program and be far too complex to finish, especially since we aren't even entirely sure of how the human mind functions. However, this isn't to say that we can't have simpler AI's in the modern day or near future. We can already program machines that respond to different stimuli and "learn" as they are exposed to stimuli. There is an AI that is able to successfully crack CAPTCHA codes by learning from its failures and adapting. Nevertheless, this is just an illusion of learning, the robot isn't actually adding any new code to its system using free will, it is just following pre-programmed responses to stimuli that have been coded into the software. I cannot think of a possible way for a robot to update its own code and program new ways for itself to behave, and that is the true meaning of a dynamic learning AI, something that is not achievable with current technology, if it is possible at all.

Sunday, November 17, 2013

The History of Computer Science

PunchedCardExample
Punched Card from fao.org
     Today, I will be writing about the history of Computer Science. This history can be traced back to 1942, with the inventor of the difference engine, Charles Babbage, and Ada Lovelace, who designed the first computer algorithm. Originally, programmers began with punch cards and plugboards and coded in binary, meaning that only 0's (off) and 1's (on) were used. Once computers became more mainstream, new programming languages were invented in order to make it easier for programmers to code complicated tasks.
PicturePlugboard
Plugboard from columbia.edu
     From the images, you can clearly see why they would need to invent new programming languages. Imagine trying to write an essay using punch cards or those plugboards... coding would be just as hard, if not more difficult, than that! These languages made it far more practical to program complex algorithms. Some of the earliest languages included Fortran (used at IBM), Lisp, and Cobol. Nowadays, we have relatively simple to learn languages like Java and C++, which allows ease of access for a wider portion of the public. With more people working on computing and programming, more awesome software can be developed.

     In modern times, we are using Von Neumann architecture, which was used for the construction of the EDVAC computer in 1952. Since then, almost all computers have used this architecture. However, this architecture is beginning to reach its limits, and in order to advance in computing power, we must begin to search for a new way to design and implement computer systems. Additionally, according to Moore's Law, the number of transistors on a chip should double every two years. This means that because we can only shrink down to the size of an atom, eventually we will reach a point where we cannot possibly advance more in computing power using current designs. Thus, we must continue to seek new, more advanced ways of obtaining computing power, such as having multiple cores in a computer. In the end though, we must always remember to give thanks and remember things such as IBM's punched cards and the Von Neumann architecture, so that we can reference the impact and use of these things in the future.

Sunday, November 10, 2013

File Sharing: Useful but Easily Abused

     Today I will be writing a little bit about file sharing. File sharing is an incredibly useful, easy way to send files and data from a device to other ones. This can be done through email attachments and social networking sites that allow you to send files such as Facebook for small files, and torrent software like Utorrent through sites like Torlock or file hosting sites such as Rapidshare. I personally enjoy using Dropbox to transfer large amounts of data from one computer to another. Using these sites, a person can easily send photos, music, code, etc., to other people. Sounds reasonable enough right?
FileShareDL
Download image from wired.co.uk
     However, many people are concerned about the use of file sharing to illegally share copyrighted material. This affects many businesses, including the film, music, and game industries. This is especially harmful to small companies that do not generate very much revenue, as they will lose a large percentage of their profit due to "pirating" of their software, but will harm larger companies a greater flat amount. For example, if I am a company who managed to sell 5 copies of a game and 5 copies get stolen through file sharing, I am losing 50% of my profit, but if I distribute a blockbuster movie that sells 500,000 videos and get 5000 stolen, even though I am only losing 1% of my profit, I am losing a greater amount of money. I believe that this shouldn't make file sharing illegal, however, as file sharing has great uses that are not illegal, such as . Also, studies show that small to medium range films actually benefit from file sharing because it is a form of advertising and more people will know it exists.  Don't get me wrong, I agree that the stealing of copyrighted material should be punished, but just because some people choose to use file sharing for malicious purposes doesn't mean that it should not be allowed. Imagine a time where you were not allowed to transfer files from any device to another. That would be a dark day indeed.

Sunday, November 3, 2013

Data Structures: Ways to Store Information Digitally

    Today's article will talk about some of the types of data structures that are used in Computer Science for storing data virtually. Data on the web can't just be stored like regular notes. The equivalent of writing some information down on a piece of paper would be to record the same information in a word processing document, such as Microsoft word, or a generic ".txt" file. However, when you have to store incredibly massive amounts of data, different methods must be used. For example, let's say you have trillions of names written down on a stack of papers and they have phone numbers listed next to them. If they are unorganized, it would be nearly impossible to find the one that you are looking for. Using computers, we can program algorithms that search through the information easily by storing them in different types of data structures, such as an array, or a more complex structure, like a binary tree.
JavaArray
Thanks to learn-java-tutorial for this array image!

     Certain data structures are more efficient at doing different things. For example, an array is very good at cycling through a list of things that you want to look through. For those of you that don't know what an array is, it's an arrangement of objects in rows an columns. Here is a youtube video explaining it, for those of you that are more visual learners. The most basic array would be a line of data, something one-dimensional like writing names down in a column. More complex arrays can be two-dimensional, something equivalent to writing names and numbers next to the names in a column, or even 3, 4, 5 dimensions. The only limit to the amount of dimensions an array can have is the power of your computer or integrated development environment. Another type of data structure is a binary tree, which is useful for searching through information that can be sorted by value. The tree consists of "nodes" and each node has a value and a reference to a left and right node. The left reference node will always be less than the node you're looking at and the right one will always be greater. This means that each level you go down the tree, you are cutting the searching time in half (assuming that the tree is balanced and both sides are filled).
ExampleBinaryTree
Binary Tree image from StackOverflow.com
     In addition to arrays and binary trees, there are many other data structures, such as hash tables, graphs, and other types of trees. Each one has its benefits and drawbacks related to efficiency in runtime, storage size in bytes, adding/removing elements, searching, etc. Programmers must always think about which data structures would be best to use to accomplish certain tasks, and implement them efficiently. I hope you learned something from this post about data structures and if anyone has any questions or comments, please reply below!