diff --git a/entries/programming/Learning-C++-for-C-Developers.md b/entries/programming/Learning-C++-for-C-Developers.md deleted file mode 100644 index 4b039e9..0000000 --- a/entries/programming/Learning-C++-for-C-Developers.md +++ /dev/null @@ -1,103 +0,0 @@ -## Namespaces - - -## Input/Output - - - -## Global Variable - -```c++ -using namespace std; -#include - -double a = 128; - -int main () -{ - double a = 256; - - cout << "Local a: " << a << endl; - cout << "Global a: " << ::a << endl; - - return 0; -} -``` - -## Multiple Names for a Variable - - -## Passing Variables by Reference - - -```c++ -void change (double &r, double s) -{ - r = 100; - s = 200; -} -``` - - -## Functions Returning Variables not Values - - -## Static Variables - - -## Namespaces - -```c++ -namespace foo -{ - int a, b; -} - - -//in main -first::a = 2; -``` - - -## Inline -- similar to Macros - - -## Exceptions - - -## Default Parameters for Functions - - -## Function Overloading - - -## Operator Overloading - - -## Functions with Generic Parameter Types - - -## Replacement for malloc and free - - -## Struct Functions - -# Classes - -## Class Constructor and De-constructor - -## Scope - -## Method Prototypes for Classes - -## This keyword - -## Class Inheritance - -## "Abstract" Classes - -# File IO - -## Writing to File - -## Reading From File \ No newline at end of file diff --git a/entries/programming/c-to-c++-tutorial.md b/entries/programming/c-to-c++-tutorial.md new file mode 100644 index 0000000..b69c098 --- /dev/null +++ b/entries/programming/c-to-c++-tutorial.md @@ -0,0 +1,566 @@ +## Namespaces + + +## Input/Output + +``` +using namespace std; +#include + +int main() +{ + cout << "Hello World" << endl; + + int a; + cin << a; + + cout << "You entered: << a << endl; + + return 0; +} +``` + + +## Global Variable + +```c++ +using namespace std; +#include + +double bar = 64; + +int main () +{ + double bar = 12; + + cout << "Local bar: " << bar << endl; + cout << "Global bar: " << ::bar << endl; + + return 0; +} +``` + +## Multiple Names for a Variable/Aliasing + +```c++ +double pi = 3.145; +double &x = pi; //pi is x + +x = 2.1; + +cout << "pi: " << pi << " x: " << x << endl; // prints pi: 2.1 x: 2.1 +``` + + +## Passing Variables by Reference + + +```c++ +void change (double &r, double s) +{ + r = 100; + s = 200; +} + +int main() +{ + int x = 1; + int y = 2; + cout << x << ", " << y << endl; + change(x, y); + cout << x << ", " << y << endl; + + return 0; +} +``` + +Same code in C. +```c +void change(double *r, double s) +{ + *r = 100; + s = 200; +} + +int main() +{ + int x = 1; + int y = 2; + printf("%d, %d", x, y); + change(&x, y); + printf("%d, %d", x, y); + + return 0; +} +``` + + +## Functions Returning Variables not Values + +A reference can be used to have a function return a variable -- not a value. + +```c++ +using namespace std; +#include + +int &smallest (int &x, int &y) +{ + if (x < y) + return x; + else + return y; +} + +int main () +{ + int k = 33; + int m = 2; + + cout << "k: " << k << " m: " << m << endl; // prints k: 33 m: 2 + + smallest (k, m) = 10; + + cout << "k: " << k << " m: " << m << endl; // prints k: 33 m: 10 + + return 0; +} +``` + + +## Namespaces + +```c++ +namespace foo +{ + int a, b; +} + + +int main() +{ + first::a = 2; + + return 0; +} +``` + + +## Inline -- similar to Macros + +Inline can be used to replace a function which contains very simple logic -- no +for loops, etc. Like a macro, this will be inserted everywhere the code is used; a +draw back to inline methods is that the compiled source will be larger. But, they +typically run faster. + +```c++ +inline int square(int x) +{ + return x * y; +} + +int main() +{ + int k = 4; + + cout << square(k) << endl; //prints 4 + + return 0; +} +``` + +## Exceptions + +```c++ +int x; +cout << "Type a number: "; +cin >> x; +cout << endl; + +try +{ + if(a > 150) + throw 150; + if(a < 15) + throw 15; + throw a % 2; +} +catch(int result) +{ + cout << result << " was thrown." << endl; +} +``` + + +## Default Parameters for Functions + +```c++ +double multiply(double x, double y = 5) +{ + return x * y; +} + +int main() +{ + cout << multiply(4) << endl; // 20 + cout << multiply(4, 4) endl; // 15 + + return 0; +} +``` + + +## Function Overloading + +```c++ +double add(double x) +{ + return x + x; +} + +double add(double x, double y) +{ + return x + y; +} + +int add(int x, int y) +{ + return x + y; +} + +int main() +{ + cout << multiply(4) << endl; // 20 + cout << multiply(4, 4) endl; // 15 + + return 0; +} +``` + + +## Operator Overloading + +```c++ +using namespace std; +#include + +struct tuple +{ + int x; + int y; +}; + +tuple operator + (int a, vector b) +{ + vector r; + + r.x = a + b.x; + r.y = a + b.y; + + return r; +} + +int main () +{ + tuple k, m; // No need to type "struct tuple" + // also no need to typedef + k.x = 3; + k.y = 6; + + m = 2 + k; // Voodoo witchcraft + + cout << "(" << m.x << ", " << m.y << ")" << endl; + + return 0; +} +``` + +## Functions with Generic Parameter Types + +```c++ +template +ttype max (ttype a, ttype b) +{ + ttype r; + + r = a; + if (b < a) r = b; + + return r; +} + + + +template +type1 maximum (type1 a, type2 b) +{ + type1 r, b_converted; + r = a; + b_converted = (type1) b; + if (b_converted > a) + r = b_converted; + return r; +} +``` + + +## Replacement for malloc and free + +```c++ +int i*; +i = new int; +*i = 55; +delete i; + +i = new int[15]; +i[0] = 99; +delete i; +``` + + +## Struct Functions + +```c++ +struct tuple +{ + int i; + int x; + + int sum() + { + return i + x; + } +}; +``` + + +# Classes + + +```c++ +class Tuple +{ +public: + int i; + int x; + + int sum() + { + return i + x; + } +}; +``` + +## Class Constructor and De-constructor + +```c++ +class Tuple +{ +public: + int i; + int x; + + Tuple(int i1, int i2) + { + i = i1; + x = i2; + } + + ~Tuple() + { + //delete any memory you have! + } + + int sum() + { + return i + x; + } +}; + + +// in main + + +Tuple t (12, 14); + +Tuple tt = new Tuple(12, 15); +``` + +## Scope + +```c++ +class Person +{ +protected: + int age; + string name; + +public: + Person(int age, string name) + { + } + + ~Person() + { + } + +private: + void increaseAge() + { + age++; + } +} +``` + +## This keyword +```c++ +class Person +{ +protected: + int age; + string name; + +public: + Person(int age, string name) + { + this->age = age; + strcpy(this->name, name); + } + + ~Person() + { + } + +private: + void increaseAge() + { + age++; + } +} +``` + + +## Class Inheritance + +```c++ +class Tuple +{ +protected: + int x; + int y; + +public: + Tuple(int i1, int i2) + { + x = i1; + y = i2; + } + + virtual int sum() + { + return i + x; + } +}; + +class Triple: public Tuple +{ +protected: + int x; + int y; + int z; + +public: + Triple(int i1, int i2, i3): Tuple(i1, i2) + { + z = i3; + } + + int sum() + { + return x + y + z; + } +}; +``` + +## "Abstract" Classes + +```c++ +class Animal +{ +public: + virtual void speak()=0; +} + + +class Cat: public Animal +{ +public: + void speak() + { + cout << "Meow" << endl; + } +} +``` + +## Method Prototypes for Classes + +```c++ +class Cat: public Animal +{ +public: + void speak() + { + cout << "Meow" << endl; + } + + int fly(); //method prototype +} + + +// Off in a header file or something +int Cat::fly() +{ + return 42; +} +``` + +# File IO + +## Reading From File + +```c++ +#include + + +//in main or somewhere +fstream f; +char c; +f.open("p022_names.txt", ios::in); + + +while(!f.eof()) +{ + f.get(c); + cout << c; +} +f.close(); +``` + +## Writing to File + +```c++ +#include + + +//in main or somewhere +fstream f; +char c; +f.open("p022_names.txt", ios::out); + +f << "stuff in the file " << endl; + +int i = 4; + +f << i << " this is also in the text file" << endl; + +f.close(); +``` \ No newline at end of file diff --git a/server.js b/server.js index 28fb0ff..60381f2 100644 --- a/server.js +++ b/server.js @@ -108,11 +108,11 @@ app.use(function(request, res) try { - var ip = (request.headers['x-forwarded-for'] || '').split(',').pop() || - request.connection.remoteAddress || - request.socket.remoteAddress || - request.connection.socket.remoteAddress; - sql.logTraffic(ip, filename); + var getClientAddress = (request.headers['x-forwarded-for'] || '').split(',')[0] + || request.connection.remoteAddress; + console.log(getClientAddress); + + sql.logTraffic(getClientAddress, filename); } catch (e) {