Jekyll2017-06-20T04:21:35+00:00https://goldtean.github.io/ImmigrantIeronim Emil Oltean Immigrant Developer BlogInteractive Brokers API with Python2017-06-18T16:00:00+00:002017-06-18T16:00:00+00:00https://goldtean.github.io/2017/06/18/interactive-brokers-api-with-python<p>Welcome back, blog readers. It's been a few months and I've been hard at work getting jiggy with Python. Recently (April 2017) Interactive Brokers put out a new Python API. They already supported Java, C++, and some other languages, but I didn't know any of them. Since I've been learning Python anyway, I thought I would give it a try and see if I can make a trading algorithm.</p>
<p>Unfortunately, the IB API is kind of a pain in the ass to use. It's not as easy as just sending requests and receiving data. You have to monkey patch all of the different functions provided by IB to get them to do anything useful. For example, reqMktData takes 6 arguments and can be called as such:</p>
<div class="language-python highlighter-rouge"><pre class="highlight"><code><span class="n">app</span><span class="o">.</span><span class="n">reqMktData</span><span class="p">(</span><span class="mi">1001</span><span class="p">,</span> <span class="n">contract</span><span class="p">,</span> <span class="s">""</span><span class="p">,</span> <span class="bp">False</span><span class="p">,</span> <span class="bp">False</span><span class="p">,</span> <span class="p">[])</span>
</code></pre>
</div>
<p>You can call it, and Interactive Brokers will get the call and send you the data, but it won't print or show anywhere unless you monkey patch the tick wrappers to print out the tick types that get returned. So you have to go through a file with over a thousand lines of code to find the function you're looking for and then copy it, paste it, and patch it.</p>
<p>I have been trying to make the smallest possible script to request and receive data. Here is a <a href="https://gist.github.com/Goldtean/0f5bf70d5d2e2efb9a7061e39396c6be">gist</a>. Here is what you need to make it run:</p>
<p>1: The Interactive Brokers API installed & configured on your machine. The API needs to be enabled, local IP white listed, and the connection port must match your settings.</p>
<p>2: You need Python 3 installed.</p>
<p>3: You need market data access to whichever contracts you are requesting data for. In my example, I am using a VIX futures contract.</p>
<p>Let's go through the code. First we import everything:</p>
<div class="language-python highlighter-rouge"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">ibapi.wrapper</span> <span class="kn">import</span> <span class="n">EWrapper</span>
<span class="kn">from</span> <span class="nn">ibapi.client</span> <span class="kn">import</span> <span class="n">EClient</span>
<span class="kn">from</span> <span class="nn">ibapi.utils</span> <span class="kn">import</span> <span class="n">iswrapper</span>
<span class="kn">from</span> <span class="nn">ibapi.common</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">ibapi.contract</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">ibapi.ticktype</span> <span class="kn">import</span> <span class="o">*</span>
</code></pre>
</div>
<p>Then we init the app by taking in EWrapper and ECLient. Then we have to patch up error, tickPrice, tickSize, tickString, and tickGeneric. All we are doing is getting them to print.</p>
<div class="language-python highlighter-rouge"><pre class="highlight"><code><span class="k">class</span> <span class="nc">BasicApp</span><span class="p">(</span><span class="n">EWrapper</span><span class="p">,</span> <span class="n">EClient</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">EClient</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reqId</span><span class="p">:</span> <span class="n">TickerId</span><span class="p">,</span> <span class="n">errorCode</span><span class="p">:</span><span class="nb">int</span><span class="p">,</span> <span class="n">errorString</span><span class="p">:</span><span class="nb">str</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Error:'</span><span class="p">,</span> <span class="n">reqId</span><span class="p">,</span> <span class="s">" "</span><span class="p">,</span> <span class="n">errorCode</span><span class="p">,</span> <span class="s">" "</span><span class="p">,</span> <span class="n">errorString</span><span class="p">)</span>
<span class="nd">@iswrapper</span>
<span class="k">def</span> <span class="nf">tickPrice</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reqId</span><span class="p">:</span> <span class="n">TickerId</span><span class="p">,</span> <span class="n">tickType</span><span class="p">:</span> <span class="n">TickType</span><span class="p">,</span> <span class="n">price</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span> <span class="n">attrib</span><span class="p">:</span> <span class="n">TickAttrib</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">tickPrice</span><span class="p">(</span><span class="n">reqId</span><span class="p">,</span> <span class="n">tickType</span><span class="p">,</span> <span class="n">price</span><span class="p">,</span> <span class="n">attrib</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Tick Price. Ticker Id:"</span><span class="p">,</span> <span class="n">reqId</span><span class="p">,</span> <span class="s">"tickType:"</span><span class="p">,</span> <span class="n">tickType</span><span class="p">,</span> <span class="s">"Price:"</span><span class="p">,</span> <span class="n">price</span><span class="p">,</span> <span class="s">"CanAutoExecute:"</span><span class="p">,</span> <span class="n">attrib</span><span class="o">.</span><span class="n">canAutoExecute</span><span class="p">,</span> <span class="s">"PastLimit"</span><span class="p">,</span> <span class="n">attrib</span><span class="o">.</span><span class="n">pastLimit</span><span class="p">)</span>
<span class="nd">@iswrapper</span>
<span class="k">def</span> <span class="nf">tickSize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reqId</span><span class="p">:</span> <span class="n">TickerId</span><span class="p">,</span> <span class="n">tickType</span><span class="p">:</span> <span class="n">TickType</span><span class="p">,</span> <span class="n">size</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">tickSize</span><span class="p">(</span><span class="n">reqId</span><span class="p">,</span> <span class="n">tickType</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Tick Size. Ticker Id:"</span><span class="p">,</span> <span class="n">reqId</span><span class="p">,</span> <span class="s">"tickType:"</span><span class="p">,</span> <span class="n">tickType</span><span class="p">,</span> <span class="s">"Size:"</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="nd">@iswrapper</span>
<span class="k">def</span> <span class="nf">tickString</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reqId</span><span class="p">:</span> <span class="n">TickerId</span><span class="p">,</span> <span class="n">tickType</span><span class="p">:</span> <span class="n">TickType</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">tickString</span><span class="p">(</span><span class="n">reqId</span><span class="p">,</span> <span class="n">tickType</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Tick string. Ticker Id:"</span><span class="p">,</span> <span class="n">reqId</span><span class="p">,</span> <span class="s">"Type:"</span><span class="p">,</span> <span class="n">tickType</span><span class="p">,</span> <span class="s">"Value:"</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="nd">@iswrapper</span>
<span class="k">def</span> <span class="nf">tickGeneric</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reqId</span><span class="p">:</span> <span class="n">TickerId</span><span class="p">,</span> <span class="n">tickType</span><span class="p">:</span> <span class="n">TickType</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="nb">float</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">tickGeneric</span><span class="p">(</span><span class="n">reqId</span><span class="p">,</span> <span class="n">tickType</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Tick Generic. Ticker Id:"</span><span class="p">,</span> <span class="n">reqId</span><span class="p">,</span> <span class="s">"tickType:"</span><span class="p">,</span> <span class="n">tickType</span><span class="p">,</span> <span class="s">"Value:"</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
</code></pre>
</div>
<p>You need to whitelist your local IP address and enable API access in your Interactive Brokers settings. They are off by default. You also need to login to your account with the API properly installed on your machine. You can go <a href="http://interactivebrokers.github.io/">here</a> to get it and follow the instructions if you haven't already. In this example, the connection port is set to 4001, and user id set to 0. The port needs to match your IB settings.</p>
<p>After that we create a contract and set it's symbol (stock ticker), security type (stocks, bonds, futures), exchange (can be set to SMART which is IB's smart router), and currency (usually USD). If you're creating a futures contract, you need to specify the contract expiration date.</p>
<p>After this, we can request market data using the reqMktData function. The first argument is the request ID, which can be set to any four digit number, the contract which we just created, and then two sets of False and an empty array. The Falses are for specific data types, and the array is for arguments.</p>
<div class="language-python highlighter-rouge"><pre class="highlight"><code><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">BasicApp</span><span class="p">()</span>
<span class="n">app</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s">"127.0.0.1"</span><span class="p">,</span> <span class="mi">4001</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">contract</span> <span class="o">=</span> <span class="n">Contract</span><span class="p">();</span>
<span class="n">contract</span><span class="o">.</span><span class="n">symbol</span> <span class="o">=</span> <span class="s">"VIX"</span><span class="p">;</span>
<span class="n">contract</span><span class="o">.</span><span class="n">secType</span> <span class="o">=</span> <span class="s">"FUT"</span><span class="p">;</span>
<span class="n">contract</span><span class="o">.</span><span class="n">exchange</span> <span class="o">=</span> <span class="s">"CFE"</span><span class="p">;</span>
<span class="n">contract</span><span class="o">.</span><span class="n">currency</span> <span class="o">=</span> <span class="s">"USD"</span><span class="p">;</span>
<span class="n">contract</span><span class="o">.</span><span class="n">lastTradeDateOrContractMonth</span> <span class="o">=</span> <span class="s">"20170621"</span><span class="p">;</span>
<span class="n">app</span><span class="o">.</span><span class="n">reqMktData</span><span class="p">(</span><span class="mi">1001</span><span class="p">,</span> <span class="n">contract</span><span class="p">,</span> <span class="s">"220"</span><span class="p">,</span> <span class="bp">False</span><span class="p">,</span> <span class="bp">False</span><span class="p">,</span> <span class="p">[])</span>
<span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
<span class="n">main</span><span class="p">()</span>
</code></pre>
</div>
<p>That's it! Now we can start the program and watch those ticks roll in.</p>
<p>If you're not interested in obscure futures contracts, you can request something like Tesla stock by changing the following lines of code:</p>
<div class="language-python highlighter-rouge"><pre class="highlight"><code> <span class="n">contract</span> <span class="o">=</span> <span class="n">Contract</span><span class="p">();</span>
<span class="n">contract</span><span class="o">.</span><span class="n">symbol</span> <span class="o">=</span> <span class="s">"VIX"</span><span class="p">;</span>
<span class="n">contract</span><span class="o">.</span><span class="n">secType</span> <span class="o">=</span> <span class="s">"FUT"</span><span class="p">;</span>
<span class="n">contract</span><span class="o">.</span><span class="n">exchange</span> <span class="o">=</span> <span class="s">"CFE"</span><span class="p">;</span>
<span class="n">contract</span><span class="o">.</span><span class="n">currency</span> <span class="o">=</span> <span class="s">"USD"</span><span class="p">;</span>
<span class="n">contract</span><span class="o">.</span><span class="n">lastTradeDateOrContractMonth</span> <span class="o">=</span> <span class="s">"20170621"</span><span class="p">;</span>
</code></pre>
</div>
<p>To this:</p>
<div class="language-python highlighter-rouge"><pre class="highlight"><code> <span class="n">contract</span> <span class="o">=</span> <span class="n">Contract</span><span class="p">();</span>
<span class="n">contract</span><span class="o">.</span><span class="n">symbol</span> <span class="o">=</span> <span class="s">"TSLA"</span><span class="p">;</span>
<span class="n">contract</span><span class="o">.</span><span class="n">secType</span> <span class="o">=</span> <span class="s">"STK"</span><span class="p">;</span>
<span class="n">contract</span><span class="o">.</span><span class="n">exchange</span> <span class="o">=</span> <span class="s">"SMART"</span><span class="p">;</span>
<span class="n">contract</span><span class="o">.</span><span class="n">currency</span> <span class="o">=</span> <span class="s">"USD"</span><span class="p">;</span>
</code></pre>
</div>
<p>What did we do? We switched the contract symbol to TSLA, which is Tesla's ticker. We changed securities type from futures to stocks, by changing secType to "STK", and we set the exchange to SMART, which is Interactive Broker's smart router. Lastly, we deleted the contract expiry date since stocks don't have expiry dates.</p>
<p>OK stock jocks, this week's blog is over! Check back next week for more stock or machine learning talk. Which will it be? Maybe both, maybe neither, and maybe it won't be next week!</p>Ieronim E OlteanWelcome back, blog readers. It's been a few months and I've been hard at work getting jiggy with Python. Recently (April 2017) Interactive Brokers put out a new Python API. They already supported Java, C++, and some other languages, but I didn't know any of them. Since I've been learning Python anyway, I thought I would give it a try and see if I can make a trading algorithm. Unfortunately, the IB API is kind of a pain in the ass to use. It's not as easy as just sending requests and receiving data. You have to monkey patch all of the different functions provided by IB to get them to do anything useful. For example, reqMktData takes 6 arguments and can be called as such: app.reqMktData(1001, contract, "", False, False, []) You can call it, and Interactive Brokers will get the call and send you the data, but it won't print or show anywhere unless you monkey patch the tick wrappers to print out the tick types that get returned. So you have to go through a file with over a thousand lines of code to find the function you're looking for and then copy it, paste it, and patch it. I have been trying to make the smallest possible script to request and receive data. Here is a gist. Here is what you need to make it run: 1: The Interactive Brokers API installed & configured on your machine. The API needs to be enabled, local IP white listed, and the connection port must match your settings. 2: You need Python 3 installed. 3: You need market data access to whichever contracts you are requesting data for. In my example, I am using a VIX futures contract. Let's go through the code. First we import everything: from ibapi.wrapper import EWrapper from ibapi.client import EClient from ibapi.utils import iswrapper from ibapi.common import * from ibapi.contract import * from ibapi.ticktype import *New Blog2017-02-21T16:00:00+00:002017-02-21T16:00:00+00:00https://goldtean.github.io/2017/02/21/new-blog<p>Wow it's been a full year since my last blog post! And what a 365 days it's been! I learned to program, made an app for my wedding, got married, went on a crazy European honeymoon, and got a new job!</p>
<p>I guess I never really stopped to reflect on all of it, but redoing my blog and reading some of my old posts really makes me feel like I've come a long way. I am at the point now where I can pick up any programming language and get going on it in hours.</p>
<p>For example, I've been looking for a new blog template that I could publish on Github, and just yesterday I found Jekyll. Today it's going live!</p>
<p>I guess this is a good time to talk about education. I started a Machine Learning Nanodegree program on Udacity. It cost $399 USD. It uses Python, which I knew nothing about going in, except that it's a strict language when it comes to syntax. I was expecting C / Java style syntax, but actually Python is really easy, especially if you know Ruby. You just have to watch your indentation. There's a few other fun differences like this.</p>
<p>Ruby:</p>
<div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="n">element</span><span class="p">.</span><span class="nf">length</span>
</code></pre>
</div>
<p>Python:</p>
<div class="language-python highlighter-rouge"><pre class="highlight"><code><span class="nb">len</span><span class="p">(</span><span class="n">element</span><span class="p">)</span>
</code></pre>
</div>
<p>Easy peasy.</p>
<p>I was expecting, because I know algebra like a fucking boss, that the math in Machine Learning would be intuitive and easy. Wrong! It's hard as hell, especially if you think you know math but you don't really know math.</p>
<p>My current assignment is to make a machine learning algorithm that reads movie reviews and predicts if the review is positive or negative. It's pretty cool! I'll post my code for it up on Github once it's finished. If you're wondering what a machine learning looks like, and perhaps also want some explanations when it comes to the code, then check out my <a href="https://github.com/Goldtean/DLND-your-first-network">first neural network!</a> This was the first assignment in the Nanodegree, and according to my Udacity instructor I did really well on it. Little does she know, I don't have a clue how I got it to work! ;-)</p>
<p>That's all for today, folks! My blog creation vacation from Python is now done, so check back next week for machine learning talk!</p>Ieronim E OlteanWow it's been a full year since my last blog post! And what a 365 days it's been! I learned to program, made an app for my wedding, got married, went on a crazy European honeymoon, and got a new job! I guess I never really stopped to reflect on all of it, but redoing my blog and reading some of my old posts really makes me feel like I've come a long way. I am at the point now where I can pick up any programming language and get going on it in hours. For example, I've been looking for a new blog template that I could publish on Github, and just yesterday I found Jekyll. Today it's going live! I guess this is a good time to talk about education. I started a Machine Learning Nanodegree program on Udacity. It cost $399 USD. It uses Python, which I knew nothing about going in, except that it's a strict language when it comes to syntax. I was expecting C / Java style syntax, but actually Python is really easy, especially if you know Ruby. You just have to watch your indentation. There's a few other fun differences like this. Ruby: element.length Python: len(element) Easy peasy. I was expecting, because I know algebra like a fucking boss, that the math in Machine Learning would be intuitive and easy. Wrong! It's hard as hell, especially if you think you know math but you don't really know math. My current assignment is to make a machine learning algorithm that reads movie reviews and predicts if the review is positive or negative. It's pretty cool! I'll post my code for it up on Github once it's finished. If you're wondering what a machine learning looks like, and perhaps also want some explanations when it comes to the code, then check out my first neural network! This was the first assignment in the Nanodegree, and according to my Udacity instructor I did really well on it. Little does she know, I don't have a clue how I got it to work! ;-) That's all for today, folks! My blog creation vacation from Python is now done, so check back next week for machine learning talk!Why?2016-02-07T19:00:00+00:002016-02-07T19:00:00+00:00https://goldtean.github.io/2016/02/07/why<p>By now, some of you may be wondering why I would quit my well paying bank job to go live in a bunk bed (literally) in San Francisco, paying more in rent than a mortgage on a house in Calgary.</p>
<p>One of my favourite movies is <a href="http://www.imdb.com/title/tt0816692/?ref_=nv_sr_1">Interstellar</a>. In it, Matthew McConaughey's character is asked to lead a mission into space to save mankind. He discusses it with Jon Lithgow, who gives him some very solid advice on making a decision - "Don't trust the right thing done for the wrong reason."</p>
<p><img src="/img/why.jpg" /></p>
<p>So why am I going into web development?</p>
<p>Well to be fair, there is this:</p>
<p><img src="/img/bcd.gif" /></p>
<p>That's right, my car doors open like the car doors of a farmer. So part of the reason is that I want a Model X... like really badly. But let's be honest, I am smart, talented, and I can succeed and make lots of money in practically any field I choose.</p>
<p>The real reasons I am moving to web development are as follows:</p>
<p>1) I want to build things. As much as the bank tried to have us internalize the concept of "You are an advisor, you need to provide advice" at the end of the day I was not an advisor, I was a salesman. I was ranked on how much capital I was able to bring in to the bank and how much I was able to lend out. I was not ranked on the quality of my advice.</p>
<p>Truthfully, I have nothing against sales and I'm a believer that we are all sales people practically all of the time. Ever go to a job interview? You need to sell yourself to get the job. Are you single and dating? Yeah, you're selling yourself. Ever meet someone you want to be your mentor? You better know that's selling yourself! So all in all, there's nothing wrong with sales. It's what makes the world move. But I want to sell things I really believe in. Ideally, things I've built myself.</p>
<p>2) I'm reading a book by Andrew Grove called <a href="http://www.amazon.com/High-Output-Management-Andrew-Grove/dp/0679762884">High Output Management</a>, which is widely believed to be the best book on management ever written. In it, Grove talks about building a production process around whatever part of the process takes the longest time and consumes the most resources. For example, at Intel, which Andrew Grove founded and lead for a long time, they recruited engineering students out of college. One of the steps was a week long tour of Intel's offices which involved the students meeting with Intel employees. This was the longest and most expensive part of the recruitment process, since it involved paying for hotel rooms for all the recruits, as well as meals and taking time out of employees' days to meet with and interview the recruits. Their entire recruitment process was built around this step.</p>
<p>Most of the students invited to Intel's campus were hired, because they weeded out all of candidates they didn't like ahead of the expensive campus tour. Now, some of you might be saying "Duh! If that's the kind of obvious bullshit that book teaches, then I don't need to read it since it's all common sense!"</p>
<p>Is it, though?</p>
<p>When I graduated university I applied to work at Cisco in a sales position. They flew about fifty candidates out to Toronto and had Cisco sales staff interview us. This was late 2007, and because hiring decisions were made in 2008 they decided to hire nobody. Fair enough, 2008 was the "Great Recession". But during the intro session, they said that the previous year they hired 4 candidates. This all seemed like a terrible waste of money to me - why fly out 50 people, put them up in a hotel, feed them, and take time out of about 10 highly paid sales people's work day, just to hire nobody.</p>
<p>With all the money they spent on this process, they could have hired someone and paid them a full year's wages. So this "common sense" is not so common - and we're not talking about a startup lead by someone with no management experience. We're talking about the leader in network switches, a company once the most valuable on the planet and currently worth around $140bln.</p>
<p>So the second reason I've moved to Silicon Valley is that in the webb app production process, the most expensive and time consuming part is coding. I am learning code so that I don't have to hire someone to make my app ideas come to life - I can do it all myself.</p>Ieronim E OlteanBy now, some of you may be wondering why I would quit my well paying bank job to go live in a bunk bed (literally) in San Francisco, paying more in rent than a mortgage on a house in Calgary. One of my favourite movies is Interstellar. In it, Matthew McConaughey's character is asked to lead a mission into space to save mankind. He discusses it with Jon Lithgow, who gives him some very solid advice on making a decision - "Don't trust the right thing done for the wrong reason." So why am I going into web development? Well to be fair, there is this: That's right, my car doors open like the car doors of a farmer. So part of the reason is that I want a Model X... like really badly. But let's be honest, I am smart, talented, and I can succeed and make lots of money in practically any field I choose. The real reasons I am moving to web development are as follows: 1) I want to build things. As much as the bank tried to have us internalize the concept of "You are an advisor, you need to provide advice" at the end of the day I was not an advisor, I was a salesman. I was ranked on how much capital I was able to bring in to the bank and how much I was able to lend out. I was not ranked on the quality of my advice. Truthfully, I have nothing against sales and I'm a believer that we are all sales people practically all of the time. Ever go to a job interview? You need to sell yourself to get the job. Are you single and dating? Yeah, you're selling yourself. Ever meet someone you want to be your mentor? You better know that's selling yourself! So all in all, there's nothing wrong with sales. It's what makes the world move. But I want to sell things I really believe in. Ideally, things I've built myself. 2) I'm reading a book by Andrew Grove called High Output Management, which is widely believed to be the best book on management ever written. In it, Grove talks about building a production process around whatever part of the process takes the longest time and consumes the most resources. For example, at Intel, which Andrew Grove founded and lead for a long time, they recruited engineering students out of college. One of the steps was a week long tour of Intel's offices which involved the students meeting with Intel employees. This was the longest and most expensive part of the recruitment process, since it involved paying for hotel rooms for all the recruits, as well as meals and taking time out of employees' days to meet with and interview the recruits. Their entire recruitment process was built around this step. Most of the students invited to Intel's campus were hired, because they weeded out all of candidates they didn't like ahead of the expensive campus tour. Now, some of you might be saying "Duh! If that's the kind of obvious bullshit that book teaches, then I don't need to read it since it's all common sense!" Is it, though? When I graduated university I applied to work at Cisco in a sales position. They flew about fifty candidates out to Toronto and had Cisco sales staff interview us. This was late 2007, and because hiring decisions were made in 2008 they decided to hire nobody. Fair enough, 2008 was the "Great Recession". But during the intro session, they said that the previous year they hired 4 candidates. This all seemed like a terrible waste of money to me - why fly out 50 people, put them up in a hotel, feed them, and take time out of about 10 highly paid sales people's work day, just to hire nobody. With all the money they spent on this process, they could have hired someone and paid them a full year's wages. So this "common sense" is not so common - and we're not talking about a startup lead by someone with no management experience. We're talking about the leader in network switches, a company once the most valuable on the planet and currently worth around $140bln. So the second reason I've moved to Silicon Valley is that in the webb app production process, the most expensive and time consuming part is coding. I am learning code so that I don't have to hire someone to make my app ideas come to life - I can do it all myself.What is Rails?2016-01-31T19:00:00+00:002016-01-31T19:00:00+00:00https://goldtean.github.io/2016/01/31/what-is-rails<p>Today a friend of mine asked me what programming language I was learning in this course and I told him HTML, CSS, JavaScript, Ruby, and SQL. He said to excuse his ignorance and asked what SQL. I said don't worry, I don't even know what the Rails part of Ruby on Rails means, and I'm taking a course on it! (SQL is a type of database, in case you're wondering.)</p>
<p>This week's blog was a choice of topics and one was Rails, so I decided to englighten my own ignorance and find out what it is.</p>
<p>So lets start with what Ruby is. Ruby is a programming language that is different from other programming languages in that it's created with programmers in mind. It's easy to write, it allows lots of different ways to do any one thing, and it reads like English. Rails is basically a web app framework that is open source. It allows you to create a web app in seconds. More than that, Ruby has a doctrine with eight pillars.</p>
<p class="bold">1) Optimize for Programmer Happiness</p>
<p>This one is self explanatory.</p>
<p class="bold">2) Convention over Configuration</p>
<p>Basically, you can build a web application a million different ways. There is nothing necessarily wrong with any approach, and different apps can be optimized with different approaches. But the problem is do you have the capacity to select all of the best approaches to an application you haven't even built yet? And what if you don't know anything about apps and this is your first one? Ruby on Rails basically makes a bunch of the decisions for you so that you can get up and running quickly.</p>
<p class="bold">3) The Menu is Omakase</p>
<p>Omakase is when you go to a restaurant and you don't know what to order so you ask the chef to choose for you and guarantee yourself a good meal. The same can be said for Rails. This is the same as Convention over Configuration, excent convention centers of ways to use frameworks whereas omakase is about which specific frameworks are used.</p>
<p class="bold">4) No One Paradigm</p>
<p>Rails is basically a hot mess of ideas and paradigms. There is no central idea looming ominously over every individual piece.</p>
<p class="bold">5) Exalt Beautiful Code</p>
<p>people say beautiful is subjective, but I think it's objective. Either way, Ruby likes to look good.</p>
<p class="bold">6) Value Integrated System</p>
<p>Rails is first and foremost an integration if systems that together address an entire problem. I don't know why this isn't first on the list - I write it!</p>
<p class="bold">7) Progress Over Stability</p>
<p>Rails prioritizes improving itself to ensuring backwards compatability.</p>
<p class="bold">8) Push Up A Big Tent</p>
<p>Rails is built by different people and those different people have different goals and needs. It's about being inclusive and making sure those that are passionate can contribute.</p>
<p>I learned something today for this, I hope you did too! See you next week!</p>Ieronim E OlteanToday a friend of mine asked me what programming language I was learning in this course and I told him HTML, CSS, JavaScript, Ruby, and SQL. He said to excuse his ignorance and asked what SQL. I said don't worry, I don't even know what the Rails part of Ruby on Rails means, and I'm taking a course on it! (SQL is a type of database, in case you're wondering.) This week's blog was a choice of topics and one was Rails, so I decided to englighten my own ignorance and find out what it is. So lets start with what Ruby is. Ruby is a programming language that is different from other programming languages in that it's created with programmers in mind. It's easy to write, it allows lots of different ways to do any one thing, and it reads like English. Rails is basically a web app framework that is open source. It allows you to create a web app in seconds. More than that, Ruby has a doctrine with eight pillars. 1) Optimize for Programmer Happiness This one is self explanatory. 2) Convention over Configuration Basically, you can build a web application a million different ways. There is nothing necessarily wrong with any approach, and different apps can be optimized with different approaches. But the problem is do you have the capacity to select all of the best approaches to an application you haven't even built yet? And what if you don't know anything about apps and this is your first one? Ruby on Rails basically makes a bunch of the decisions for you so that you can get up and running quickly. 3) The Menu is Omakase Omakase is when you go to a restaurant and you don't know what to order so you ask the chef to choose for you and guarantee yourself a good meal. The same can be said for Rails. This is the same as Convention over Configuration, excent convention centers of ways to use frameworks whereas omakase is about which specific frameworks are used. 4) No One Paradigm Rails is basically a hot mess of ideas and paradigms. There is no central idea looming ominously over every individual piece. 5) Exalt Beautiful Code people say beautiful is subjective, but I think it's objective. Either way, Ruby likes to look good. 6) Value Integrated System Rails is first and foremost an integration if systems that together address an entire problem. I don't know why this isn't first on the list - I write it! 7) Progress Over Stability Rails prioritizes improving itself to ensuring backwards compatability. 8) Push Up A Big Tent Rails is built by different people and those different people have different goals and needs. It's about being inclusive and making sure those that are passionate can contribute. I learned something today for this, I hope you did too! See you next week!Rumble In The Ruby Jungle - Episode II - The Script Awakens2016-01-24T19:00:00+00:002016-01-24T19:00:00+00:00https://goldtean.github.io/2016/01/24/the-script-awakens<p>This week focuses on the Script that is Java. To tell you the truth, I wasn't a big JavaScript fan at first. It's grammer is more strict. You have to throw semi-colons around all over the end of lines like they're periods and your English teacher is watching. You ask Google questions, and those plentiful Stack Exchange articles that give you the answer to any Ruby question are sparser and farther between.</p>
<p>That being said, with restriction also comes creativity. Pretty much anything that can be built in Ruby can be built in JavaScript, it just has to be built differently. And there are also a few unique JavaScript methods that are pretty cool. For example, in Ruby to have a loop add 1 to an element or object you would do something like:</p>
<div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="n">ruby_object</span> <span class="o">+=</span> <span class="mi">1</span>
</code></pre>
</div>
<p>With JavaScript, you can do:</p>
<div class="language-javascript highlighter-rouge"><pre class="highlight"><code><span class="nx">javascript_object</span> <span class="o">+=</span> <span class="mi">1</span>
</code></pre>
</div>
<p>But you can also do </p>
<div class="language-javascript highlighter-rouge"><pre class="highlight"><code><span class="nx">javascript_object</span><span class="o">++</span>
</code></pre>
</div>
<p>Boom!</p>
<p>In general, though, JavaScript is the stricter language. To print something to the console, for example, in Ruby you can use</p>
<div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="nb">print</span>
</code></pre>
</div>
<p>Or:</p>
<div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="nb">puts</span>
</code></pre>
</div>
<p>Or my favourite,</p>
<div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="nb">p</span>
</code></pre>
</div>
<p>In JavaScript you only have one option:</p>
<div class="language-javascript highlighter-rouge"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">()</span>
</code></pre>
</div>
<p>Another Ruby benefit is called syntactic sugar. Syntactic sugar is basically a programming language giving you some leeway in the way you write the program to make it look "sweeter" or more easily interpretable (yes, that's a word, I just checked.) For example, you might want to make x equal to 1, so you could write:</p>
<div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="n">x</span> <span class="o">=</span> <span class="mi">1</span>
</code></pre>
</div>
<p>Ruby understands this as:</p>
<div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="n">x</span><span class="o">=</span><span class="mi">1</span>
</code></pre>
</div>
<p>But lets you add spaces to make the code easier to read and better organized. With JavaScript there is a lot less sugar.</p>
<p>What it lacks in sweetness, though, it does make up for in versatility. It's kind of ironic that the language that affords less freedom is so versatile, certainly a black mark for capitalism, but it's true. You can implement JavaScript scripts into your HTML by simply opening a script tab. You cannot do the same for Ruby, although that would be awesome if you could.</p>
<p>My next goal is to try to publish a game that I wrote in JavaScript onto my website. I wasn't happy about writing this game in JavaScript instead of Ruby, but if I had written it in Ruby I wouldn't be able to share it online as easily. As the programming messiah said, give onto Ruby what is Ruby's, and give on to JavaScript what is JavaScript's. Amen.</p>
<p>That's it for this week, folks! Tune in next week - same Bat Time, same Bat URL.</p>Ieronim E OlteanThis week focuses on the Script that is Java. To tell you the truth, I wasn't a big JavaScript fan at first. It's grammer is more strict. You have to throw semi-colons around all over the end of lines like they're periods and your English teacher is watching. You ask Google questions, and those plentiful Stack Exchange articles that give you the answer to any Ruby question are sparser and farther between. That being said, with restriction also comes creativity. Pretty much anything that can be built in Ruby can be built in JavaScript, it just has to be built differently. And there are also a few unique JavaScript methods that are pretty cool. For example, in Ruby to have a loop add 1 to an element or object you would do something like: ruby_object += 1 With JavaScript, you can do: javascript_object += 1 But you can also do javascript_object++ Boom! In general, though, JavaScript is the stricter language. To print something to the console, for example, in Ruby you can use printStaying Classy With Classes2016-01-18T19:00:00+00:002016-01-18T19:00:00+00:00https://goldtean.github.io/2016/01/18/staying-classy-with-classes<p>This week DevBootcamp has asked me to write to create an example class and use it to teach others when to use instance variables or instance methods for that object. Not only that, they would like for me to write for an audience of newb programmers. Little do they know that this is going to be so easy, since I am a newb programmer, anything I say will be catered towards that audience!</p>
<p>So strap yourselves in, but do it with some fucking class, because this blog post is about to get classy.</p>
<p>Today, we will be looking at classes, in case you didn't pick that up already. We will look at a die class that I made for an earlier challenge this week. Dradel fans, this is your lucky day. Question answering ball fans, this is your lucky day. Dungeons and Dragons fans - this is not your day. But before we start some serious dradeling, let's talk abut what a class is.</p>
<p>A class is basically a bunch of code that you get to perform some sort of work for you, that you can call on time and again. It's like that best friend that gives you a ride to the airport or helps you move, except there's no expectations of pizza and beer afterwards.</p>
<div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Die</span>
<span class="kp">attr</span> <span class="ss">:labels</span>
<span class="kp">attr</span> <span class="ss">:sides</span>
<span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">labels</span><span class="p">)</span>
<span class="k">if</span> <span class="n">labels</span><span class="p">.</span><span class="nf">empty?</span>
<span class="k">raise</span> <span class="no">ArgumentError</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="s2">"You need to ink me, bro!"</span><span class="p">)</span>
<span class="k">else</span>
<span class="k">end</span>
<span class="vi">@sides</span> <span class="o">=</span> <span class="n">labels</span><span class="p">.</span><span class="nf">count</span>
<span class="vi">@labels</span> <span class="o">=</span> <span class="n">labels</span>
<span class="nb">puts</span> <span class="s2">"I'm a </span><span class="si">#{</span><span class="vi">@sides</span><span class="si">}</span><span class="s2"> sided die."</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nf">roll</span>
<span class="n">rando</span> <span class="o">=</span> <span class="nb">rand</span><span class="p">(</span><span class="mi">0</span><span class="p">.</span><span class="nf">.</span><span class="p">(</span><span class="vi">@sides</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span>
<span class="k">return</span> <span class="vi">@labels</span><span class="p">[</span><span class="n">rando</span><span class="p">]</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="n">die</span> <span class="o">=</span> <span class="no">Die</span><span class="p">.</span><span class="nf">new</span><span class="p">([</span><span class="s2">"You will succeed in a new adventure."</span><span class="p">,</span>
<span class="s2">"You will get a chance to climb a mountain."</span><span class="p">,</span>
<span class="s2">"Three people in your life will try to usurp your power."</span><span class="p">,</span>
<span class="s2">"Your love of nutella is highly regarded in Europe and South America."</span><span class="p">,</span>
<span class="s2">"A man with a hipster outfit but a preppy face will serve you a delicious sandwich."</span><span class="p">,</span>
<span class="s2">"If you go to a Mexican restaurant, you better not ask for 'no onions' or you will insult the taste gods."</span><span class="p">,</span>
<span class="p">])</span>
<span class="nb">p</span> <span class="n">die</span><span class="p">.</span><span class="nf">sides</span>
<span class="nb">p</span> <span class="n">die</span><span class="p">.</span><span class="nf">roll</span>
<span class="c1"># Die Initializes</span>
<span class="o">=></span> <span class="s2">"I'm a 6 sided die."</span>
<span class="c1"># Die sides from above</span>
<span class="o">=></span> <span class="mi">6</span>
<span class="c1"># Die roll from above</span>
<span class="o">=></span> <span class="s2">"You will succeed in a new adventure."</span>
</code></pre>
</div>
<p>So let's go through this code take a look at how it works. First, we open the class with class Die and assign labels and sides as local variables that will answer back themselves if called outside of the class. For example, attr :sides is the equivalent of this code:</p>
<div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="k">def</span> <span class="nf">sides</span>
<span class="k">return</span> <span class="vi">@sides</span>
<span class="k">end</span>
</code></pre>
</div>
<p>If you look near the bottom at "p die.sides", that basically calls on sides inside of the class, and thanks to attr :sides, it returns itself. If you look higher inside of initialize, you'll see that @sides is equal to labels.count, which is the amount of strings inside of the new die, or amount of answers that the die can use.</p>
<p>labels is constructed the same way - if you call using p die.labels you will get a list of all the labels.</p>
<p>Most of the magic here is inside of roll. The roll method generates a random number and returns one of the strings inside of the array that is passed in from Die.new.</p>
<p>That's all for this week, folks!</p>Ieronim E OlteanThis week DevBootcamp has asked me to write to create an example class and use it to teach others when to use instance variables or instance methods for that object. Not only that, they would like for me to write for an audience of newb programmers. Little do they know that this is going to be so easy, since I am a newb programmer, anything I say will be catered towards that audience! So strap yourselves in, but do it with some fucking class, because this blog post is about to get classy. Today, we will be looking at classes, in case you didn't pick that up already. We will look at a die class that I made for an earlier challenge this week. Dradel fans, this is your lucky day. Question answering ball fans, this is your lucky day. Dungeons and Dragons fans - this is not your day. But before we start some serious dradeling, let's talk abut what a class is. A class is basically a bunch of code that you get to perform some sort of work for you, that you can call on time and again. It's like that best friend that gives you a ride to the airport or helps you move, except there's no expectations of pizza and beer afterwards.Enumerable#Map2016-01-10T19:00:00+00:002016-01-10T19:00:00+00:00https://goldtean.github.io/2016/01/10/enumerable-map<p>This week I have a very special topic to write about - the enumerable map method. If you're like me a couple of months ago, you aren't understanding those last three words. You understand map and method, but not in this context.</p>
<p>I have some excellent news for you! I am here to explain it. Basically, it works like this:</p>
<p>Say you have a list of numbers. It's not a bad list, you know, it's okay, but it's not great. You like it, you don't love it. You want to love it, if you could only add 1 to each number to make it a little bit better, and then have that new list of bigger and better numbers returned.</p>
<p>That's what the map enumerable is here to do! Let's take a look.</p>
<div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="n">ok_list</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span>
<span class="n">ok_list</span><span class="p">.</span><span class="nf">map</span> <span class="p">{</span><span class="o">|</span><span class="n">number</span><span class="o">|</span> <span class="n">number</span> <span class="o">+</span> <span class="mi">1</span><span class="p">}</span>
<span class="c1">#=> [2, 3, 4, 5]</span>
</code></pre>
</div>
<p>Let's go step by step here. First, we are setting an array of 1, 2, 3, and 4 equal to ok_list. Then, we use .map to iterate over each element in the list to add 1. In this instance, .map will return a new array with the results.</p>
<p>That's all for this week, y'all!</p>Ieronim E OlteanThis week I have a very special topic to write about - the enumerable map method. If you're like me a couple of months ago, you aren't understanding those last three words. You understand map and method, but not in this context. I have some excellent news for you! I am here to explain it. Basically, it works like this: Say you have a list of numbers. It's not a bad list, you know, it's okay, but it's not great. You like it, you don't love it. You want to love it, if you could only add 1 to each number to make it a little bit better, and then have that new list of bigger and better numbers returned. That's what the map enumerable is here to do! Let's take a look.Rumble In The Ruby Jungle - Arrays vs. Hashes2016-01-03T19:00:00+00:002016-01-03T19:00:00+00:00https://goldtean.github.io/2016/01/03/ruble-in-the-ruby-jungle<p>An array is a list of ruby objects. These objects can be numbers like integers (eg. 9) or floats (eg. 9.0), or strings like names or other words (eg. "Austin Powers".) They can even be methods, or hashes, or arrays. An array inside of an array? Yes, not only can Ruby do Inception, it can go as many layers deep as you want.</p>
<p>When you want to pull an object from the list, you call it in this format:</p>
<div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="n">array_inception</span> <span class="o">=</span> <span class="p">[[[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">8</span><span class="p">],</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="mi">10000</span><span class="p">]]</span>
<span class="nb">p</span> <span class="n">array_inception</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># => [10, 9, 8]</span>
</code></pre>
</div>
<p>That line would basically pull the very first item in an array named array_inception. Because Ruby isn't afraid of zeroes, 0 is the first object in an array, which in this case corresponds to another array of [10, 9, 8]. 1 is the second object, which corresponds to 9 in this case, and so on.</p>
<p>Hashes are similar to arrays. They also store objects, but they store them in the form of key / value combinations. Where you would call an object in an array by it's relative position inside of the array, you would call a value by it's key inside of a hash.</p>
<div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="n">spy</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"International Man Of Mystery"</span> <span class="o">=></span> <span class="s2">"Austin Powers"</span><span class="p">,</span> <span class="s2">"007"</span> <span class="o">=></span> <span class="s2">"Bond, James Bond"</span> <span class="p">}</span>
<span class="nb">p</span> <span class="n">spy</span><span class="p">[</span><span class="s2">"007"</span><span class="p">]</span>
<span class="c1"># => "Bond, James Bond"</span>
</code></pre>
</div>
<p>An important note about hash key / value pairs is that there cannot be repeated keys in hashes, but there can be repeated values for multiple keys.</p>
<p><img src="/img/basil.jpg" /></p>
<p>Putting it all together, arrays should be used when you want to store a list of data that is significant on its own. Say, for example, you want a list of returns for a stock so that you could analyze the variance, you could use an array. But say you wanted to analyze that same list of returns, but you wanted a timestamp associated with each price. Since a stock can have the same price at multiple times but can only have one price at any given time, the timestamp should be the key and the value should be the stock's price.</p>
<p>That's all for this week, folks!</p>Ieronim E OlteanAn array is a list of ruby objects. These objects can be numbers like integers (eg. 9) or floats (eg. 9.0), or strings like names or other words (eg. "Austin Powers".) They can even be methods, or hashes, or arrays. An array inside of an array? Yes, not only can Ruby do Inception, it can go as many layers deep as you want. When you want to pull an object from the list, you call it in this format:Margins, Borders, and Padding2015-12-27T19:00:00+00:002015-12-27T19:00:00+00:00https://goldtean.github.io/2015/12/27/margins-borders-padding<style type="text/css">
.margin {
margin-left: 50px;
}
.border {
margin-left: 50px;
border-style: dashed;
}
.padding {
margin-left: 50px;
border-style: dashed;
padding: 50px;
}
</style>
<h2>Blog Week 2</h2>
<p>December 27th, 2015</p>
<h2></h2>
<p>Yesterday was boxing day. If you're like me, you went to the mall and after trying to find parking for 10 minutes you said "Oh hell no, I am a grown man, I don't have time for this, I'm going home." Then went on Amazon and Kijiji to look for some deals.</p>
<p>But while you may have appreciated the marble outside of a building, or a beautiful glass ceiling, did you take the time to appreciate the fine margining, bordering, and padding while looking for Star Wars toys online?</p>
<p>In this crazy world of HTML, CSS, and web design, you have things called elements. Elements are links, or pictures, or paragraphs, or anything of visual significance on the page. Elements are wrapped up between and inside of margins, borders, and padding. Each one is slightly different.</p>
<p>Margin is how much space is outside of the element. Border is the outline or edge of an element. Padding affects the inside of the element. Lets see them in action!</p>
<p><img src="https://s3.amazonaws.com/codecademy-blog/assets/ae09140c.png" />This image currently has no borders, margins, or padding. Let's change that.</p>
<p class="margin"><img src="https://s3.amazonaws.com/codecademy-blog/assets/ae09140c.png" />Margin-left 50px.</p>
<p class="border"><img src="https://s3.amazonaws.com/codecademy-blog/assets/ae09140c.png" />Margin-left 50px, plus dashed border.</p>
<p class="padding"><img src="https://s3.amazonaws.com/codecademy-blog/assets/ae09140c.png" />Margin-left 50px, dashed border, and 50px padding.</p>
<p>Did you catch all the differences?</p>
<p>That's all for this week, folks! Next week's edition comes at you from the future, in a faraway year, 2016. Stay tuned!</p>Ieronim E OlteanHow I learned to Git, Git, Git It2015-12-06T19:00:00+00:002015-12-06T19:00:00+00:00https://goldtean.github.io/2015/12/06/how-i-learned-to-git-git-git-it<p>The benefits of version control are that you can track your changes and it's possible for multiple users to create branches which don't affect the master code. They can then merge branches together or merge with the master branch.</p>
<p>Git helps you keep track of changes because it keeps a log of every commit, which is like a save-game for your work. You can then go back to it whenever you need to. You can make lots of commits, and then push them to GitHub, which stores them. You can then merge it with the master code and then delete the branches.</p>
<p>GitHub is awesome for storing code because it's easy to use, it works with git, it has social network components, and it's easy to share and find code. It also lets you easily and instantly make a cool blog like this one!</p>
<p>That being said, "easily" is a relative term! It's easy when you have a few YouTube videos showing you how to do it, and when your computer is set up with all the right environments.</p>
<p>Tune in next week, same Bat Time, same Bat Channel, for another exciting edition of Jeremy's Developer Blog!</p>Ieronim E OlteanThe benefits of version control are that you can track your changes and it's possible for multiple users to create branches which don't affect the master code. They can then merge branches together or merge with the master branch. Git helps you keep track of changes because it keeps a log of every commit, which is like a save-game for your work. You can then go back to it whenever you need to. You can make lots of commits, and then push them to GitHub, which stores them. You can then merge it with the master code and then delete the branches. GitHub is awesome for storing code because it's easy to use, it works with git, it has social network components, and it's easy to share and find code. It also lets you easily and instantly make a cool blog like this one! That being said, "easily" is a relative term! It's easy when you have a few YouTube videos showing you how to do it, and when your computer is set up with all the right environments. Tune in next week, same Bat Time, same Bat Channel, for another exciting edition of Jeremy's Developer Blog!