From 0ed86b2cc2ec2f85a13255b742fd401e38215594 Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Mon, 21 Jul 2014 23:10:52 +0200 Subject: [PATCH] btree img, hash function properties. --- README.md | 488 ++++++++++++++++++++++++++++++++++++++++++++++++++++ btree.png | Bin 0 -> 21970 bytes crypto.md | 22 ++- funny.md | 27 --- graph.md | 125 ++++++++++---- index.md | 470 -------------------------------------------------- licenses.md | 23 +-- 7 files changed, 607 insertions(+), 548 deletions(-) create mode 100644 btree.png delete mode 100644 funny.md delete mode 100644 index.md diff --git a/README.md b/README.md index b56d0d2..647d2c2 100644 --- a/README.md +++ b/README.md @@ -1 +1,489 @@ Computer science topics. + +#Tips + +##Operating system choice + +Use Linux because it is free and open source and better than windows for programming. + +##Make cheatsheets + +Everything you learn, write it down! You will forget it later. + +If there is a good link or book, save the link or the book page! + +If possible make assertions like C, Java or python `assert` statements, so you can be sure that what you think is right is right. + +Publish your cheats so that others can use them too. + +##Build your CV + +Keep a list of: + +- open source contributions with importance of each contribution. Example: +- a self evaluation of what you know about programming. Example: + +##How to type + +- user four fingers +- use closes finger +- look at the screen +- use keyboard shortcuts and good programs that have them (ex: vim) + +Saves time and preserves your arm. + +##Standards matter + +The first thing you should ask yourself when learning a new language or other interfaces is: what are the standards? + +Is there a dominating standard? + +What is the state of implementations? Are they consistent with one another? Are they updated. Example: + +- standard: W3C HTML or CSS +- semi compatible implementations: browsers: Firefox, Chrome, IE + +What are the most important extensions to the standard? How portable are they? Example: + +- standard: ANSI C vs POSIX vs GNU Extensions + +##Download and read the docs + +First start with tutorials which are easier to understand and find the most interesting things in. + +As soon as you can handle the docs, download and read the official docs, since those are more precise and up to date than tutorials. + +#Language + +##Programming + +- Most popular? Hard to say + +- Niches matter. Some languages dominate certain application spaces. + + - PHP, Ruby, Javascript == web + - Fortran == numerical + +- All programming languages the same (theoretical) + +- Categories: + + - compiled vs interpreted (virtual machine) non compiled languages + + speed vs multiplataform, quick test, prototyping + + there is no hard distiction: any compiled language could also be interpreted and vice versa + + it is mainly a question of design: some langs are designed to be interpreted + + hakell for example can be compiled but also comes with a standard [REPL] interface + + - objects oriented vs non object oriented + + - type systems + + - statically vs dynamically typed + - weakly vs strongly typed + +- Languages are easy, libraries are hard. + + Languages are easy to learn because they are all very similar. + + Library interfaces however are not, because they involve completely different concepts between one another. + + Therefore: if a project does what you want in a language you don't know + + - learn that language! + - **don't** recode the project! + +My languages of choice: + +- C +- C++ +- Java +- Python + +##Data languages + +- XML +- Json + +##Markup languages + +- HTML +- LaTeX +- Markdown + +##Web development + +- HTML +- HTTP +- CGI +- apache configuration +- CSS +- JS +- MySQL + +- PHP +- the other interpreted CGI languages: + - Python + - Ruby + - Perl + +- real deployment + + - ftp + - deal with permissions you lack on server + - ssh + +##Multiple browsers + +Have at least two browsers, one main where you are logged in all your websites, +and one secondary, which you will use to see how other users see your profiles. + +Same goes for web development: have multiple browsers to quickly switch users. +Also good practice as it lets you see often how the website renders under different browsers. + +For websites that allow you limited unsigned entry, have a third browser to test as unsigned. + +E.g. on Ubuntu 12.04 I run Firefox (primary), Chromium (secondary) and Chrome (unsigned). + +#Filesystem + +One of the first things you should understand better as a programmer is your filesystem. + +- home dir + +- upper vs lower case + +- naming conventions + + - bin + + - `~` and `.bak` + + - doc + + - dot hidden + + - lib + + - src + + - include + + - share + + - local + + - and the rest of the Linux Filesystem Hierarchy Standard + + +- do not start with hyphen + +- symlinks/hardlinks + +- magic folders ala Windows library/documents + +- inner workings: how is data actually stored/retreived on disk? + +#Database + +- MySQL +- SQLite + +#Important programs for life + +- dropdown terminal emulator: Guake. + +- Vim + + Text editor. + +- Krusader + + File manager. + +- Source version control. + + you need to contribute with others + + Most commonly used: + + - Git. Entirely dominates web development. + - SVN + +- make (Makefile) + + automate compilations + + + +- bugrackers, like GitHub built-in one. **Always** use one for your project! + +- virtual machines. VirtualBox + Vagrant are game changing. + +- Ack (find/grep replacement) + + Find in files. + +##shell + +- language: + + - Linux: bash + - windows: cmd + +- terminal: + + - pro: reproduce commands easily + - con: cannot do graphs + + The terminal allows you to interact with the shell interpreter. + +- bash: + + - pro: super easy file/pipe/process handling + - con: insane, slow + + Use for one liners only. replacements: + + - Perl is dead, but golfs really well. + - Python! Also useful for other things, so worth learning + +- --help (how to read, [], ..., ), man, version + +- directory structure, homedir, fake vs real dirs + +- options, ls, cd, mkdir, cp, rm, rmdir, control z, bg, find, grep + +- stdin/stderr/stdout + + - three holes + - pipes > to file, | grep, 1>&2 + +- exit status + +- pipe (help grep example) + +- interactive vs. non-interactive + +#algorithm + +See [this](algorithm.md). + +#assembler + +Understand exactly what operations a processor can do. + + + +#data representation + +##character representation + +- ascii +- unicode +- utf8 + +##integer representation + +- binary, hexa +- signed + + - one's complement + - 2-complement + +##float representation + +TODO + +#operating systems + +You must learn how your operating system works. + +The only operating system you can really understand is Linux since it is open source, +so understand Linux. + +Topics which you should look into: + +##program memory space + +address, operational system division + +- + + tutorial to gdb + +##driver programming + +- + #5/5 + #control a lamp. contains c code. + +- + +##executable files + +ELF files, including libraries + +#hardware + +- memory: registers vs caches vs RAM vs ROM (BIOS) vs VRAM vs HD + + + + deep explanaition + +- busses + + +#multithreading concurrency IPC + + - thread vs process + + a process can contain many threads + + threads share a memory space, process don't + + - ipc + + - pipes : same machine + - sockets : different machines + - internet + - pci + - usb + +#Formal languages + +Important if you ever want to create a computer language. + +- Backus-Naur form: + +#Optimizing code + +More important than those are to first: + +- use best algorithm + +- compile instead of interpret + +A few important ones are: + +- cache: + +- speculative execution + +- loop unwinding: + +- out of order execution: + +- register renaming: + +#automatic optimization + +- branch prediction + + + + An example of perceptible branch prediction: + + + +#design patterns + +See [this](design-patterns). + +#GPU programming + +TODO + +#stragegy + +artistic level + +- coworkers +- clients +- market + +- + + quite a few strategy articles + + ex microsoft employee, lots of exp + +#Philosophy + +##What computers do + +Manipulate information: + +- copy and move information around +- reaching new information from old + +In a way that is *very*: + +- fast +- cheap +- without errors + +##Programming and ideas + + ideas (that can be programmed) + + + programming + ------------------------------ + *power* + +- without ideas, programming is useless! +- without programming, some ideas are useless! + +##Imperfection + +It is the work of a programmer to search perfection, while accepting that imperfection is inevitable. + +When in doubt, look, decide, and follow your decision all the time, +knowing that all other choices are also imperfect. + +#semver + +#Semantic versioning + +Popular standard for program versioning by Tom Preston-Werner. + +#Sources + +##Free + +- [stack overflow](http://stackoverflow.com/) + + Great QA site with gamification. Huge programming community. + + Also check related sites maintained by the same enterprise: [stack exchange](http://stackexchange.com/). + + Reasonable way to show your knowledge to enterpreises. + +- [top coder algorithm contests](http://community.topcoder.com/tc?module=ProblemArchive&sr=1&er=50&sc=&sd=&class=&cat=&div1l=&div2l=&mind1s=&mind2s=&maxd1s=&maxd2s=&wr=) + + Hosts timed programming contests online. + + Lost of programming problems available with solutions proposed by contestants. + + Good way to show your knowledge to enterpreises. + Very popular as of 2013, lots of employers looking there. + + Also worth checking their tutorials: + + Must use a annoying Java program to run in the contests, and hard to find the problems in the site in the first place. + +- [spoj contests](http://www.spoj.com/problems/classical/) + + Much like top coder. + + Problems can be solved any time. + + Solutions can be submitted any time for online tests. + + Does time and memory tests, and ranks algorithms accordingly. + + It is not possible to view submitted solutions. diff --git a/btree.png b/btree.png new file mode 100644 index 0000000000000000000000000000000000000000..a05564269667d2089a904c0ead90e40c6e979d25 GIT binary patch literal 21970 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 + +Used in cryptography as well as other applications, +e.g. Git SHA to identify objects uniquely. + +Desired properties: + +- it is easy to compute the hash value for any given message +- it is infeasible to generate a message that has a given hash +- it is infeasible to modify a message without changing the hash +- it is infeasible to find two different messages with the same hash. diff --git a/funny.md b/funny.md deleted file mode 100644 index 6a8c675..0000000 --- a/funny.md +++ /dev/null @@ -1,27 +0,0 @@ -Stuff which only comp-sci nerds might find funny. - -[Perl poetry](http://www.perlmonks.org/?node=Perl%20Poetry). That entire website is funny actually. - -[Fork Bomb](http://en.wikipedia.org/wiki/Fork_bomb) Type of DnS attack. - -[Standard proliferation](http://xkcd.com/927/) Amazing insights and visualization. - -[Any key](http://en.wikipedia.org/wiki/Any_key) - -"Do you pine for the nice days of Minix-1.1, when men were men and wrote their own device drivers?" Linus Torvalds - -[Spaghetti code](http://en.wikipedia.org/wiki/Spaghetti_code) - -[Esoteric language](http://en.wikipedia.org/wiki/Esoteric_programming_language) - -[Sockpuppet](http://en.wikipedia.org/wiki/Sockpuppet_%28Internet%29) - -[Heisenbug](http://en.wikipedia.org/wiki/heisenbug) - -[REPL]: http://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop - -[BMP C++ program](http://stackoverflow.com/a/5509538/895245) - -[w3schools](https://chrome.google.com/webstore/detail/w3schools-hider/igiahejkpbnbnekdaefddmdceocmjpll). The site is considered so bad, but has such huge Google Rating, that a Google Chrome extension was created to block it from Google searches. - -[Godwin's Law](http://en.wikipedia.org/wiki/Godwin%27s_law) diff --git a/graph.md b/graph.md index 157940b..36bba22 100644 --- a/graph.md +++ b/graph.md @@ -21,7 +21,8 @@ Trees are special cases of directed connected graphs that have the properties: - no loops - root: there is a distinguished node from which every other node is reachable -This immediately implies that E = V - 1, and simplifies search procedures since you don't need to check if you have already visited some nodes. +This immediately implies that E = V - 1, and simplifies search procedures +since you don't need to check if you have already visited some nodes. ##BST @@ -29,11 +30,14 @@ This immediately implies that E = V - 1, and simplifies search procedures since Each node has 2 children. -Not necessarily balanced, so bounds for all operations is $O(n)$, although average times are $long(n)$. +Not necessarily balanced, so bounds for all operations is $O(n)$, +although average times are $long(n)$. -There are balanced search trees such as [RB-tree](red-black-tree) which actually have $O(ln)$ for all operations. +There are balanced search trees such as [RB-tree](red-black-tree) +which actually have $O(ln)$ for all operations. -The only complicated operation is delete, visualize it here: +The only complicated operation is delete, visualize it here: + ##RB-tree. @@ -41,42 +45,75 @@ The only complicated operation is delete, visualize it here: . Requires a bit too many clicks, but really cool. +Live Java applet demo: . +Requires a bit too many clicks, but really cool. TODO visualize insert +##B-tree + +*Not* binary tree: . + +Like a binary tree with many values per node: + +![btree](bree.png) + +Same complexity as RB-tree, but with slower in theory by a constant factor. + +Default data structure for MySQL InnoDB `INDEX`. + +In practice: way faster for accessing trees saved in slow storage like hard disks. + +- to go down each level, you must traverse all values of a node +- less memory efficient + +Advantage: + +- less nodes need to be retrieved. Huge practical gains here to read data from slow media. + #DFS DFS can be done either recursively or not with a stack. -The only key difference is that the recursive version uses the system's call stack, while the non-recursive version uses an explicit stack +The only key difference is that the recursive version uses the system's call stack, +while the non-recursive version uses an explicit stack #BFS -BFS cannot be done recursively naturaly, since the non-recursive impementation uses a queue, and not a stack like DFS. +BFS cannot be done recursively naturally, +since the non-recursive implementation uses a queue, +and not a stack like DFS. @@ -84,23 +121,32 @@ BFS cannot be done recursively naturaly, since the non-recursive impementation u Both are methods to search vertexes on unordered graphs. -On a general graph, you must keep track of which nodes you have already looked into not to go on loops, so you need to add a search bit to each vertex. +On a general graph, you must keep track of which nodes you have already looked into not to go on loops, +so you need to add a search bit to each vertex. On trees (specific type of graph) this is not needed since trees have no loops by definition. Advantages of DFS: -- if the searched solutions are guaranteed to be at the greatest depths (ex leaves of a tree) then DFS will certainly be faster. +- if the searched solutions are guaranteed to be at the greatest depths + (e.g. leaves of a tree) then DFS will certainly be faster. -- if the graph is somehow balanced (nodes of maximum depth are at similar depths), then DFS will certainly use less memory than BFS, since BFS must store a FIFO of each level ($2^depth$ vertexes on a balanced binary tree) while BFS stores at most the maximum depth sequence of parents ($depth$ elements). +- if the graph is somehow balanced (nodes of maximum depth are at similar depths), + then DFS will certainly use less memory than BFS + since BFS must store a FIFO of each level ($2^depth$ vertexes on a balanced binary tree) + while BFS stores at most the maximum depth sequence of parents ($depth$ elements). Advantages of BFS: -- it is the obvious choice when looking for minimum distances, since you want to keep as close as possible to the start and not go too deep. +- it is the obvious choice when looking for minimum distances, + since you want to keep as close as possible to the start and not go too deep. -- if the depth can be too long, or even infinite, it is simpler to look breadth first, and limit the descent, or the process could take forever or too long. +- if the depth can be too long, or even infinite, + it is simpler to look breadth first, and limit the descent, + or the process could take forever or too long. - It also makes more sense to use heuristics with BFS, looking around the current position, and then deciding where to descend further. + It also makes more sense to use heuristics with BFS, + looking around the current position, and then deciding where to descend further. #Dijkstra @@ -108,7 +154,8 @@ Advantages of BFS: Find the shortest path between two given nodes. -Only works if all weights are positive. If negative weights are possible, consider using the [bellman ford algorithm](http://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm). +Only works if all weights are positive. If negative weights are possible, +consider using the [bellman ford algorithm](http://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm). ##Dijkstra complexity @@ -116,15 +163,15 @@ Time worst case: $O(|E| + |V| log |V|)$, so $O(|V|^2)$ on a dense graph. In the worst case we have a dense graph and we must visit all the nodes giving: -- `FOR_VERTEX`: for each vertex ($|V|$): +- `FOR_VERTEX`: for each vertex ($|V|$): - - `MARK_VISITED`: mark vertex as visited. + - `MARK_VISITED`: mark vertex as visited. - - `FOR_NEIGHBOUR`: for each neighbour: $|O(\sqrt(|E|))|$, $|V|$ for a dense graph. + - `FOR_NEIGHBOUR`: for each neighbour: $|O(\sqrt(|E|))|$, $|V|$ for a dense graph. - - UPDATE_WEIGHT: update the weights of that neighbour + - `UPDATE_WEIGHT`: update the weights of that neighbour - - FIND_MIN: find the minimum adjacent element to determine the next vertex + - `FIND_MIN`: find the minimum adjacent element to determine the next vertex Lets consider two data structure possibilities for storing node distances and if it was visited or not: @@ -153,24 +200,25 @@ operations. We order the vertexes on a min heap that takes the distance into account. -The complexity will depend on the type of min heap used. We consider there the two most commmon and efficient min heaps for practical data sizes: +The complexity will depend on the type of min heap used. +We consider there the two most common and efficient min heaps for practical data sizes: - binary heap - Fibonacci heap TODO get this right -- `MARK_VISITED` means that we have to remove the root element from the min heap: +- `MARK_VISITED`: means that we have to remove the root element from the min heap: - Binary heap: `log` - Fibonacci heap: `n` worst case, `log` amortized -- `UPDATE_WEIGHT` this critical operation depends on the type of min heap used. +- `UPDATE_WEIGHT`: this critical operation depends on the type of min heap used. - Binary heap: `log` - Fibonacci heap: `log` worst case, `1` -- `FIND_MIN` always $O(1)$ since we are using heaps +- `FIND_MIN`: always $O(1)$ since we are using heaps Therefore for the binary heap: @@ -180,7 +228,7 @@ $$ V^2 log(V) $$ -and for fibonacci amortized time: +and for Fibonacci amortized time: $$ FOR_VERTEX * ( MARK_VISITED + ( ( FOR_NEIGHBOUR * UPDATE_WEIGHTS ) + FIND_MIN ) = @@ -192,14 +240,15 @@ $$ The final choice of the data structure will depend on the expected density of the graph: -- if the graph is expected to be dense, use an unordered array, as it has the best wort time for that case, while a Fibonacci heap offers only - -- if the graph is known to be sparse, $degree(v) <<< V/log(V)$, then the ordered approch starts being better. +- if the graph is expected to be dense, use an unordered array, + as it has the best wort time for that case, while a Fibonacci heap offers only -- If amortized time can be taken into account and it is not clear if the graph is dense or not, the Fibonnaci Heap implementation is the best option, as it: +- if the graph is known to be sparse, $degree(v) <<< V/log(V)$, then the ordered approch starts being better. - - works as well as the unordered array implementation - - for dense graphs, and better if the graph is not dense (often the case). +- If amortized time can be taken into account and it is not clear if the graph is dense or not, + the Fibonnaci Heap implementation is the best option, as it: + works as well as the unordered array implementation + for dense graphs, and better if the graph is not dense (often the case). #A star diff --git a/index.md b/index.md deleted file mode 100644 index 8bb47cc..0000000 --- a/index.md +++ /dev/null @@ -1,470 +0,0 @@ -This contains general tips to become a good programmer. - -#Tips - -##Operating system choice - -Use Linux because it is free and open source and better than windows for programming. - -##Make cheatsheets - -Everything you learn, write it down! You will forget it later. - -If there is a good link or book, save the link or the book page! - -If possible make assertions like C, Java or python `assert` statements, so you can be sure that what you think is right is right. - -Publish your cheats so that others can use them too. - -##Build your CV - -Keep a list of: - -- open source contributions with importance of each contribution. Example: -- a self evaluation of what you know about programming. Example: - -##How to type - -- user four fingers -- use closes finger -- look at the screen -- use keyboard shortcuts and good programs that have them (ex: vim) - -Saves time and preserves your arm. - -##standards matter - -The first thing you should ask yourself when learning a new language or other interfaces is: what are the standards? - -Is there a dominating standard? - -What is the state of implementations? Are they consistent with one another? Are they updated. Example: - -- standard: W3C HTML or CSS -- semi compatible implementations: browsers: Firefox, Chrome, IE - -What are the most important extensions to the standard? How portable are they? Example: - -- standard: ANSI C vs POSIX vs GNU Extensions - -##Download and read the docs - -First start with tutorials which are easier to understand and find the most interesting things in. - -As soon as you can handle the docs, download and read the official docs, since those are more precise and up to date than tutorials. - -#Language - -##Programming - -- most popular? Hard to say - -- niches matter. Some languages dominate certain application spaces. - - - PHP, Ruby, Javascript == web - - Fortran == numerical - -- all programming languages the same (theoretical) - -- categories: - - - compiled vs interpreted (virtual machine) non compiled languages - - speed vs multiplataform, quick test, prototyping - - there is no hard distiction: any compiled language could also be interpreted and vice versa - - it is mainly a question of design: some langs are designed to be interpreted - - hakell for example can be compiled but also comes with a standard [REPL] interface - - - objects oriented vs non object oriented - - - type systems - - - statically vs dynamically typed - - weakly vs strongly typed - -- lang easy, lib hard - - Languages are easy to learn because they are all very similar. - - Library interfaces however are not, because they involve completely different concepts between one another. - - Therefore: if a project does what you want in a language you don't know - - - learn that language! - - **don't** recode the project! - -My languages of choice: - -- C -- C++ -- Java -- Python - -##Data languages - -- XML -- Json - -##Markup languages - -- HTML -- LaTeX -- Markdown - -##Web development - -- HTML -- HTTP -- CGI -- apache configuration -- CSS -- JS -- MySQL - -- PHP -- the other interpreted CGI languages: - - Python - - Ruby - - Perl - -- real deployment - - - ftp - - deal with permissions you lack on server - - ssh - -##Multiple browsers - -Have at least two browsers, one main where you are logged in all your websites, and one secondary, which you will use to see how other users see your profiles. - -Same goes for web development: have multiple browsers to quickly switch users. Also good practice as it lets you see often how the website renders under different browsers. - -#Filesystem - -One of the first things you should understand better as a programmer is your filesystem. - -- home dir - -- upper vs lower case - -- naming conventions - - - bin - - - ~ and .bak - - - doc - - - dot hidden - - - lib - - - src - - - include - - - share - - - local - - - and the rest of the Linux Filesystem Hierarchy Standard - - -- do not start with hyphen - -- symlinks/hardlinks - -- magic folders ala Windows library/documents - -- inner workings: how is data actually stored/retreived on disk? - -#Database - -- MySQL -- SQLite - -#Important programs for life - -- dropdown terminal emulator: Guake. - -- Vim - - Text editor. - -- Krusader - - File manager. - -- Source version control. - - you need to contribute with others - - Most commonly used: - - - Git. Entirely dominates web development. - - SVN - -- make (makefile) - - automate compilations - - - -- bugrackers, like GitHub built-in one. **Always** use one for your project! - -- virtual machines. VirtualBox + Vagrant are game changing. - -- ack (find/grep replacement) - - Find in files. - -##shell - -- language: - - - Linux: bash - - windows: cmd - -- terminal: - - - pro: reproduce commands easily - - con: cannot do graphs - - The terminal allows you to interact with the shell interpreter. - -- bash: - - - pro: super easy file/pipe/process handling - - con: insane, slow - - Use for one liners only. replacements: - - - Perl is dead, but golfs really well. - - Python! Also useful for other things, so worth learning - -- --help (how to read, [], ..., ), man, version - -- directory structure, homedir, fake vs real dirs - -- options, ls, cd, mkdir, cp, rm, rmdir, control z, bg, find, grep - -- stdin/stderr/stdout - - - three holes - - pipes > to file, | grep, 1>&2 - -- exit status - -- pipe (help grep example) - -- interactive vs. non-interactive - -#algorithm - -See [this](algorithm.md). - -#assembler - -Understanc exactly what operations a processor can do. - - - -#data representation - -##character representation - -- ascii -- unicode -- utf8 - -##integer representation - -- binary, hexa -- signed - - - one's complement - - 2-complement - -##float representation - -TODO - -#operating systems - -You must learn how your operating system works. - -The only operating system you can really understand is Linux since it is open source, -so understand Linux. - -Topics which you should look into: - -##program memory space - -address, operational system division - -- - - tutorial to gdb - -##driver programming - -- - #5/5 - #control a lamp. contains c code. - -- - -##executable files - -ELF files, including libraries - -#hardware - -- memory: registers vs caches vs RAM vs ROM (BIOS) vs VRAM vs HD - - - - deep explanaition - -- busses - - -#multithreading concurrency IPC - - - thread vs process - - a process can contain many threads - - threads share a memory space, process don't - - - ipc - - - pipes : same machine - - sockets : different machines - - internet - - pci - - usb - -#formal languages - -Important if you ever want to create a computer language. - -- backus naur form: http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form - -#optimizing code - -more important than those are to first: - -- use best algorithm - -- compile instead of interpret - -a few important ones are: - -- cache: http://en.wikipedia.org/wiki/CPU_cache - -- speculative execution http://en.wikipedia.org/wiki/Speculative_execution - -- loop unwinding: http://en.wikipedia.org/wiki/Loop_unwinding - -- out of order execution: http://en.wikipedia.org/wiki/Out-of-order_execution - --register renaming: http://en.wikipedia.org/wiki/Register_renaming - -#automatic optimization - -- branch prediction - - - - An example of perceptible branch prediction: - - - -#design patterns - -See [this](design-patterns). - -#GPU programming - -TODO - -#stragegy - -artistic level - -- coworkers -- clients -- market - -- - - quite a few strategy articles - - ex microsoft employee, lots of exp - -#phylosophy - -##what computers do - -Manipulate information: - -- copy and move information around -- reaching new information from old - -In a way that is *very*: - -- fast -- cheap -- without errors - -##programming and ideas - - ideas (that can be programmed) - + - programming - ------------------------------ - *power* - -- without ideas, programming is useless! -- without programming, some ideas are useless! - -#sources - -##free - -- [stack overflow](http://stackoverflow.com/) - - Great QA site with gamification. Huge programming community. - - Also check related sites maintained by the same enterprise: [stack exchange](http://stackexchange.com/). - - Reasonable way to show your knowledge to enterpreises. - -- [top coder algorithm contests](http://community.topcoder.com/tc?module=ProblemArchive&sr=1&er=50&sc=&sd=&class=&cat=&div1l=&div2l=&mind1s=&mind2s=&maxd1s=&maxd2s=&wr=) - - Hosts timed programming contests online. - - Lost of programming problems available with solutions proposed by contestants. - - Good way to show your knowledge to enterpreises. - Very popular as of 2013, lots of employers looking there. - - Also worth checking their tutorials: - - Must use a annoying Java program to run in the contests, and hard to find the problems in the site in the first place. - -- [spoj contests](http://www.spoj.com/problems/classical/) - - Much like top coder. - - Problems can be solved any time. - - Solutions can be submitted any time for online tests. - - Does time and memory tests, and ranks algorithms accordingly. - - It is not possible to view submitted solutions. diff --git a/licenses.md b/licenses.md index 4b8a2cc..78c198e 100644 --- a/licenses.md +++ b/licenses.md @@ -1,19 +1,22 @@ -# gpl +# Licenses + +## MIT - you can use, study, share (copy), and modify the software -- you *cannot* use it in non gpl projects (copyleft), - meaning that you cannot make a closed source project that uses it. +- every substantial reproduction of the software must maintain the copyright note + +Basically like GPL except you *can* use in commercial projects, +so you can basically do anything you want, except remove the license from sub products -# mit liscence +## GPL -- like gpl +Like MIT< but you *cannot* use it in non GPL PROJECTS (COPYLEFT), +meaning that you cannot make a closed source project that uses it. -- except you *can* use in commercial projects, - so you can basically do anyting you want, - except remove the license from subproducts +This makes the project useless for closed source projects to build upon. -# dual +## Dual -some licenses are called dual X/Y (ex: dual BSD/GPL), meaning that you can +Some licenses are called dual X/Y (ex: dual BSD/GPL), meaning that you can take either one of them.