<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Adventures In Techland]]></title><description><![CDATA[{ My Journey Through Technology }]]></description><link>https://www.adventuresintechland.com/</link><image><url>http://www.adventuresintechland.com/favicon.png</url><title>Adventures In Techland</title><link>https://www.adventuresintechland.com/</link></image><generator>Ghost 3.16</generator><lastBuildDate>Thu, 23 Apr 2026 10:51:37 GMT</lastBuildDate><atom:link href="https://www.adventuresintechland.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[UrlLib3 Version: How To Detect When A Webpage Changes With Python]]></title><description><![CDATA[<h2 id="updated-for-python-3-and-urllib3">Updated for Python 3 and UrlLib3</h2><p>If you've ever been waiting for a webpage to update then you know how time consuming it can be to constantly have to refresh the page.</p><p>I had a similar problem right before the Eclipse of 2017. I was attempting to get eclipse glasses</p>]]></description><link>https://www.adventuresintechland.com/urllib3-version-how-to-detect-when-a-webpage-changes-with-python/</link><guid isPermaLink="false">60134b8698552a3f283f2d6f</guid><dc:creator><![CDATA[Hunter Thornsberry]]></dc:creator><pubDate>Thu, 28 Jan 2021 23:52:49 GMT</pubDate><content:encoded><![CDATA[<h2 id="updated-for-python-3-and-urllib3">Updated for Python 3 and UrlLib3</h2><p>If you've ever been waiting for a webpage to update then you know how time consuming it can be to constantly have to refresh the page.</p><p>I had a similar problem right before the Eclipse of 2017. I was attempting to get eclipse glasses from a local observatory but they were sold out. Fortunately, the observatory's website said a new shipment of glasses were arriving in a few days, and they would update their website when they go on sale. These eclipse glasses were going like hotcakes so I knew I had to be on the ball as soon as the website updated. Obviously I wasn't going to spend all day checking their website so I wrote this bit of Python to help.</p><p>This code detects changes in a webpage's content by getting the initial HTML of a webpage and then repeatedly getting the HTML and checking it against the initial HTML every ten seconds. If the webpage has changed it prints "Changed", if not it prints "Not Changed". You can change these print statements to email you, or run whatever other python code you like.</p><pre><code class="language-python">
# Hunter Thornsberry
# http://www.adventuresintechland.com

# WebChange.py
# Alerts you when a webpage has changed it's content by comparing checksums of the html.

import hashlib
import urllib3
import random
import time

# url to be scraped
url = "http://raw.adventuresintechland.com/freedom.html"

# time between checks in seconds
sleeptime = 60

def getHash():
    # random integer to select user agent
    randomint = random.randint(0,7)

    # User_Agents
    # This helps skirt a bit around servers that detect repeaded requests from the same machine.
    # This will not prevent your IP from getting banned but will help a bit by pretending to be different browsers
    # and operating systems.
    user_agents = [
        'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',
        'Opera/9.25 (Windows NT 5.1; U; en)',
        'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
        'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
        'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.142 Safari/535.19',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:8.0.1) Gecko/20100101 Firefox/8.0.1',
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19'
    ]

    http = urllib3.PoolManager()
    request = http.request(
        "GET",
        url,
        headers = {
            "User-agent": user_agents[randomint]
        }
    )

    return hashlib.sha224(request.data).hexdigest()

current_hash = getHash() # Get the current hash, which is what the website is now

while 1: # Run forever
    if getHash() == current_hash: # If nothing has changed
        print("Not Changed")
    else: # If something has changed
        print("Changed")
        break
    time.sleep(sleeptime)
</code></pre>]]></content:encoded></item><item><title><![CDATA[YouTube Master List]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>YouTube is a great place to find great content, unfortunately you have to dig to find it. &quot;Surface&quot; YouTube is a terrible cocktail of reaction videos, clickbait, and low effort content.</p>
<p>Luckily I've been able to find a decent number of great channels, so here is my list:</p>]]></description><link>https://www.adventuresintechland.com/youtube-masterlist/</link><guid isPermaLink="false">5a1ef146404c08371fe90014</guid><dc:creator><![CDATA[Hunter Thornsberry]]></dc:creator><pubDate>Wed, 29 Nov 2017 18:30:06 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>YouTube is a great place to find great content, unfortunately you have to dig to find it. &quot;Surface&quot; YouTube is a terrible cocktail of reaction videos, clickbait, and low effort content.</p>
<p>Luckily I've been able to find a decent number of great channels, so here is my list:</p>
<h2 id="cgpgrey"><a href="https://www.youtube.com/user/CGPGrey">CGP Grey</a></h2>
<p>Probably one of the best YouTube creators around, he makes videos over a broad range of topics.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/rStL7niR7gs?rel=0" frameborder="0" allowfullscreen></iframe>
<h2 id="bazbattles"><a href="https://www.youtube.com/channel/UCx-dJoP9hFCBloY9qodykvw">Baz Battles</a></h2>
<p>Does a great video game like representation of historic battles with tons of background and history mixed in.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/FW4RKp23Z4M?rel=0" frameborder="0" allowfullscreen></iframe>
<h2 id="engineerguy"><a href="https://www.youtube.com/channel/UC2bkHVIDjXS7sgrgjFtzOXQ">engineerguy</a></h2>
<p>Bill Hamock does a great job explaining engineering and technology principals and designs.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/hUhisi2FBuw" frameborder="0" allowfullscreen></iframe>
<h2 id="kaptainkristian"><a href="https://www.youtube.com/channel/UCuPgdqQKpq4T4zeqmTelnFg">kaptainkristian</a></h2>
<p>Pop culture &quot;love letters&quot;</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Ws82rXrjBOI" frameborder="0" allowfullscreen></iframe>
<h2 id="kurzgesagt"><a href="https://www.youtube.com/user/Kurzgesagt">Kurzgesagt</a></h2>
<p>Much like CGP Grey (they do twin videos sometimes), covers a lot of different topics</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/JQVmkDUkZT4" frameborder="0" allowfullscreen></iframe>
<h2 id="lessonsfromthescreenplay"><a href="https://www.youtube.com/channel/UCErSSa3CaP_GJxmFpdjG9Jw">Lessons from the Screenplay</a></h2>
<p>Discussions about cinema</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/dv8KroxoAhk" frameborder="0" allowfullscreen></iframe>
<h2 id="lindybeige"><a href="https://www.youtube.com/channel/UC9pgQfOXRsp4UKrI8q0zjXQ">Lindybeige</a></h2>
<p>Covers topics from dance to military history, but mainly focuses on history</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/abyHm5gnvgw" frameborder="0" allowfullscreen></iframe>
<h2 id="militaryhistoryvisualized"><a href="https://www.youtube.com/channel/UCK09g6gYGMvU-0x1VCF1hgA">Military History Visualized</a></h2>
<p>Great creator who covers many topics of warfare</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/-rKRt5zVZgw" frameborder="0" allowfullscreen></iframe>
<h2 id="nativlang"><a href="https://www.youtube.com/channel/UCMk_WSPy3EE16aK5HLzCJzw">NativLang</a></h2>
<p>Videos about language, how they work, and their history</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/WeW1eV7Oc5A" frameborder="0" allowfullscreen></iframe>
<h2 id="nowyouseeit"><a href="https://www.youtube.com/channel/UCWTFGPpNQ0Ms6afXhaWDiRw">Now You See It</a></h2>
<p>Another channel about cinema</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/YR8PDn6YvyQ" frameborder="0" allowfullscreen></iframe>
<h2 id="primitivetechnology"><a href="https://www.youtube.com/channel/UCAL3JXZSzSm8AlZyD3nQdBA">Primitive Technology</a></h2>
<p>A man who never speaks builds the most incredible things out of mud and muscle</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/P73REgj-3UE" frameborder="0" allowfullscreen></iframe>
<h2 id="realengineering"><a href="https://www.youtube.com/channel/UCR1IuLEqb6UEA_zQ81kwXfg">Real Engineering</a></h2>
<p>Covers a ton of topics about various engineering topics and issues</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/i6DRRHXt-PA" frameborder="0" allowfullscreen></iframe>
<h2 id="thegreatwar"><a href="https://www.youtube.com/channel/UCUcyEsEjhPEDf69RRVhRh4A">The Great War</a></h2>
<p>This is more of a series than a collection of videos, it covers World War I, week by week</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/6FgaL0xIazk" frameborder="0" allowfullscreen></iframe>
<h2 id="theschooloflife"><a href="https://www.youtube.com/channel/UC7IcJI8PUf5Z3zKxnZvTBog">The School of Life</a></h2>
<p>Some of their more recent stuff is meh, but their Philosophy, History, and Politics videos are great</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/WLAtXWaz76o" frameborder="0" allowfullscreen></iframe>
<h2 id="tomscott"><a href="https://www.youtube.com/channel/UCBa659QWEk1AI4Tg--mrJ2A">Tom Scott</a></h2>
<p>Great videos about things you might not know</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/1cUUfMeOijg" frameborder="0" allowfullscreen></iframe>
<h2 id="wendoverproductions"><a href="https://www.youtube.com/channel/UC9RM-iSvTu1uPJb8X5yp3EQ">Wendover Productions</a></h2>
<p>Videos about engineering topics that changed the world</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/uU3kLBo_ruo" frameborder="0" allowfullscreen></iframe>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[How To Detect When A Webpage Changes With Python]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><strong>If you've ever been waiting for a webpage to update then you know how time consuming it can be to constantly have to refresh the page.</strong></p>
<p>I had a similar problem right before the Eclipse of 2017. I was attempting to get eclipse glasses from a local observatory but they</p>]]></description><link>https://www.adventuresintechland.com/detect-when-a-webpage-changes-with-python/</link><guid isPermaLink="false">59c5d279a70001289ad789a8</guid><category><![CDATA[python]]></category><dc:creator><![CDATA[Hunter Thornsberry]]></dc:creator><pubDate>Sun, 24 Sep 2017 01:32:18 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1503775201840-b0d6c94400f4?ixlib=rb-0.3.5&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;s=8897e325c6a796dd574b9d80f804197b" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1503775201840-b0d6c94400f4?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&s=8897e325c6a796dd574b9d80f804197b" alt="How To Detect When A Webpage Changes With Python"><p><strong>If you've ever been waiting for a webpage to update then you know how time consuming it can be to constantly have to refresh the page.</strong></p>
<p>I had a similar problem right before the Eclipse of 2017. I was attempting to get eclipse glasses from a local observatory but they were sold out. Fortunately, the observatory's website said a new shipment of glasses were arriving in a few days, and they would update their website when they go on sale. These eclipse glasses were going like hotcakes so I knew I had to be on the ball as soon as the website updated. Obviously I wasn't going to spend all day checking their website so I wrote this bit of Python to help.</p>
<p>This code detects changes in a webpage's content by getting the initial HTML of a webpage and then repeatedly getting the HTML and checking it against the initial HTML every ten seconds. If the webpage has changed it prints &quot;Changed&quot;, if not it prints &quot;Not Changed&quot;. You can change these print statements to email you, or run whatever other python code you like.</p>
<pre><code class="language-python">
# Hunter Thornsberry
# http://www.adventuresintechland.com

# WebChange.py
# Alerts you when a webpage has changed it's content by comparing checksums of the html.

import hashlib
import urllib2
import random
import time

# url to be scraped
url = &quot;http://raw.adventuresintechland.com/freedom.html&quot;

# time between checks in seconds
sleeptime = 60

def getHash():
    # random integer to select user agent
    randomint = random.randint(0,7)

    # User_Agents
    # This helps skirt a bit around servers that detect repeaded requests from the same machine.
    # This will not prevent your IP from getting banned but will help a bit by pretending to be different browsers
    # and operating systems.
    user_agents = [
        'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',
        'Opera/9.25 (Windows NT 5.1; U; en)',
        'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
        'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
        'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.142 Safari/535.19',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:8.0.1) Gecko/20100101 Firefox/8.0.1',
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19'
    ]

    opener = urllib2.build_opener()
    opener.addheaders = [('User-agent', user_agents[randomint])]
    response = opener.open(url)
    the_page = response.read()

    return hashlib.sha224(the_page).hexdigest()

current_hash = getHash() # Get the current hash, which is what the website is now

while 1: # Run forever
    if getHash() == current_hash: # If nothing has changed
        print &quot;Not Changed&quot;
    else: # If something has changed
        print &quot;Changed&quot;
        break
    time.sleep(sleeptime)
    
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Python: Most Used Words]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>I recently saw a program that gathered the 10 most common words on a webpage and displayed them in a window along with their word count. I decided to build my own using Python <a href="http://adventuresintechland.com/a-web-scraper-that-sucks-even-less/">and some code I had written before to scrape data from webpages</a>.</p>
<pre><code class="language-python"># Gives a list of</code></pre>]]></description><link>https://www.adventuresintechland.com/python-most-used-words/</link><guid isPermaLink="false">598cc2e8a45f6e58b2c46ecd</guid><dc:creator><![CDATA[Hunter Thornsberry]]></dc:creator><pubDate>Sat, 03 Dec 2016 20:48:59 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>I recently saw a program that gathered the 10 most common words on a webpage and displayed them in a window along with their word count. I decided to build my own using Python <a href="http://adventuresintechland.com/a-web-scraper-that-sucks-even-less/">and some code I had written before to scrape data from webpages</a>.</p>
<pre><code class="language-python"># Gives a list of the most common words
# Hunter Thornsberry - hunter@hunterthornsberry.com
from BeautifulSoup import BeautifulSoup
import urllib2
import random
import time

#limit on the number of top words we want to know the count of
limit = 10

#random integer to select user agent
randomint = random.randint(0,7)

#random interger to select sleep time
randomtime = random.randint(1, 30)

#urls to be scraped
urls = [&quot;http://raw.adventuresintechland.com/freedom.html&quot;]

#user agents
user_agents = [
    'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',
    'Opera/9.25 (Windows NT 5.1; U; en)',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
    'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
    'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.142 Safari/535.19',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:8.0.1) Gecko/20100101 Firefox/8.0.1',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19'
]

words = []

index = 0
while len(urls) &gt; index:
    opener = urllib2.build_opener()
    opener.addheaders = [('User-agent', user_agents[randomint])]
    response = opener.open(urls[index])
    the_page = response.read()
    soup = BeautifulSoup(the_page)

    #Search criteria (is an html tag). Example &lt;p&gt;, &lt;body&gt;, &lt;h1&gt;, etc.
    text = soup.findAll(&quot;body&quot;)

    #Runs until it has an index out of range error and breaks, this will return every response
    while True:
        try:
            i = 0
            while True:
                #print text[i].text
                words.append(text[i].text)
                i = i + 1
        except IndexError:
            print &quot;--End--&quot;
            break
    index = index + 1

words = words[0].split(&quot; &quot;)
words = [element.lower() for element in words]
sort = []
for word in set(words):
    sort.append(str(words.count(word)) + &quot; &quot; + word)

x = 0
for item in sorted(sort, reverse=True):
    print item
    if x == limit:
        break
    x = x + 1

</code></pre>
<p>This code basically comes in two parts, the first part gets the data from the webpage. <a href="http://adventuresintechland.com/a-web-scraper-that-sucks-even-less/">I've got a whole blog post dedicated just to that.</a></p>
<p>This is the second part of the code:</p>
<pre><code class="language-language-python">words = words[0].split(&quot; &quot;)
words = [element.lower() for element in words]
sort = []
for word in set(words):
    sort.append(str(words.count(word)) + &quot; &quot; + word)

x = 0
for item in sorted(sort, reverse=True):
    print item
    if x == limit:
        break
    x = x + 1
</code></pre>
<p>Here I am using .split(&quot; &quot;) to find all of the words. Then I am making every word lower case (as to get a true count of the words, since technically &quot;The&quot; and &quot;the&quot; are two different words). Next the first for loop uses set(words) to get the unique words and appends a string representation of the number of times that word appears in the words list and the word itself.</p>
<p>The second for loop sorts the list and prints the results. Notice <a href="https://wiki.python.org/moin/HowTo/Sorting">sorted() is not a defined function, it is actually built into Python</a>, and we are also passing &quot;reverse=True&quot; so the word with the highest count returns first.</p>
<h2 id="output">Output</h2>
<pre><code class="language-language-python">--End--
9 programmers
9 other
9 one
9 new
9 few
9 code
8 when
8 says
8 print
8 first
8 didn't
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Every topic I've tweeted about this year]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>I decided to go through and list the topics I tweet about so far this year (as of 02/12/2016). I plan on creating a twitter start chart like the one done here: <a href="https://www.hella.cheap/twitter-star-chart.html">https://www.hella.cheap/twitter-star-chart.html</a></p>
<p>I've redacted some of my friends names.</p>
<pre><code class="language-language-python">Kanye West,25</code></pre>]]></description><link>https://www.adventuresintechland.com/every-topic-ive-tweeted-about-this-year/</link><guid isPermaLink="false">598cc2e8a45f6e58b2c46ed2</guid><dc:creator><![CDATA[Hunter Thornsberry]]></dc:creator><pubDate>Fri, 12 Feb 2016 05:18:05 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>I decided to go through and list the topics I tweet about so far this year (as of 02/12/2016). I plan on creating a twitter start chart like the one done here: <a href="https://www.hella.cheap/twitter-star-chart.html">https://www.hella.cheap/twitter-star-chart.html</a></p>
<p>I've redacted some of my friends names.</p>
<pre><code class="language-language-python">Kanye West,25
Technology,16
Society,9
College,8
Canada,6
Fashion,5
Norm Kelly,5
Video Games,3
Economics,2
Networking,2
Wu-Tang,2
Beach House,2
Pokemon,1
Science,1
Hometown,1
Sports,1
Breaking Bad,1
Dune,1
Parents,1
Politics,1
Playstation,1
GonzoHacker,1
Wu-Tang-Financial,1
Daft Punk,1
Rick and Morty,1
Friend1,1
Friend2,1
Travis Scott,1
Grimes,1
Florence + The Machine,1
Drumming,1
Friend3,1
New Years,1
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Custom New Tab (Firefox, Chrome, Safari, IE)]]></title><description><![CDATA[How to use custom new tabs in Firefox, Chrome, Safari, or IE.]]></description><link>https://www.adventuresintechland.com/custom-new-tab/</link><guid isPermaLink="false">598cc2e8a45f6e58b2c46ecb</guid><category><![CDATA[web]]></category><category><![CDATA[internet]]></category><category><![CDATA[design]]></category><category><![CDATA[software]]></category><category><![CDATA[how-to]]></category><dc:creator><![CDATA[Hunter Thornsberry]]></dc:creator><pubDate>Sun, 29 Nov 2015 00:13:08 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>If you browse the internet everyday like I do there are a select group of websites you visit almost everyday, so why not make your new tab page have links to these websites to help you save time? Even if you choose not to use a custom built new tab you can use any website as your new tab.</p>
<h1 id="why">Why</h1>
<p>The easiest way to show you why you should use a custom new tab page is to show you what my homepage and new tab looks like.<br>
<img src="http://www.adventuresintechland.com/content/images/2015/11/Screen-Shot-2015-11-28-at-12-23-56-AM.png" alt="My custom start page"><br>
This is what I see any time I open a new tab or a new window in my browser. As you can see there are three boxes broken down by category, each with their own title and items. Each one of these items is a link to a webpage I commonly use in that category. Above those boxes I put the Arch Linux logo (as Arch Linux is my default OS).</p>
<p>This is just a sample of what you can do. This works by loading a webpage (either local or remote) upon the opening of a new tab or window, meaning you can wield the full force of any HTML, JavaScript, PHP, etc you can normally use in a webpage <strong>because it is a webpage</strong>. Like I said above, this also means you can use ANY webpage such as Google, or a random Wikipedia page (<a href="https://en.wikipedia.org/wiki/Special:Random">https://en.wikipedia.org/wiki/Special:Random</a>).</p>
<h1 id="how">How</h1>
<ol>
<li><a href="#firefox">Firefox</a></li>
<li><a href="#chrome">Chrome</a></li>
<li><a href="#safari">Safari</a></li>
<li><a href="#ie">Internet Explorer</a></li>
</ol>
<div id="firefox">
<h3>Firefox</h3>
1. Download and install the <a href="https://addons.mozilla.org/En-us/firefox/addon/custom-new-tab/?src=userprofile">Custom New Tab extension</a><br>
2. Select the "hamburger" menu in the top right > Add-ons > Extensions<br>
3. Select the "Preferences" option on the Custom New Tab extension and enter your custom new tab URL and choose any other option you want<br>
<p><img src="http://www.adventuresintechland.com/content/images/2015/11/Screen-Shot-2015-11-28-at-12-40-44-AM.png" alt="Custom New Tab extension Preferences"><br>
After all your preferences are set your custom new tab page should work!<br>
<br><br>
<span style="color: red">Notice: there is a slight delay if you choose the &quot;Place focus in URL bar&quot; and &quot;Make URL bar empty&quot; options, meaning some of your text will be erased if you start typing before the URL bar is cleared.</span></p>
</div>
<br>
<div id="chrome">
<h3>Chrome</h3>
1. Download and install <a href="https://chrome.google.com/webstore/detail/new-tab-redirect/icpgjfneehieebagbmdbhnlpiopdcmna">New Tab Redirect</a> <br>
2. Select the "hamburger" menu in the top right and select "Settings", then select "Extensions" along the left <br>
3. Under "New Tab Redirect" select "Options" and enter your custom URL <br>
![New Tab Redirect Options](/content/images/2015/11/Screen-Shot-2015-11-28-at-1-23-54-AM.png)
After all your preferences are set your custom new tab page should work! 
</div>
<br>
<div id="safari">
<h3>Safari</h3>
In Safari you can simply set your homepage as the new tab page, this is done by going to Safari > Preferences > General, and setting "New tabs open with:" to "Homepage".
![Safari Preferences](/content/images/2015/11/Screen-Shot-2015-11-28-at-1-17-21-AM.png)
After all your preferences are set your custom new tab page should work! 
</div>
<br>
<div id="ie">
<h3>Internet Explorer</h3>
Coming 12/01/15
</div><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Windows 10 nVidia Drivers]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>If you have updated to Windows 10 and have an nVidia Graphics Card (in my case, two 970s) and are having issues with installing driver software follow these steps.</p>
<p><strong>Before we begin, download the <a href="http://www.geforce.com/drivers">latest drivers from nVidia here</a>, extract them somewhere you can locate easily, but do not install</strong></p>]]></description><link>https://www.adventuresintechland.com/windows-10-nvidia-drivers/</link><guid isPermaLink="false">598cc2e8a45f6e58b2c46ec9</guid><category><![CDATA[windows]]></category><category><![CDATA[windows10]]></category><category><![CDATA[970]]></category><category><![CDATA[drivers]]></category><category><![CDATA[nvidia]]></category><dc:creator><![CDATA[Hunter Thornsberry]]></dc:creator><pubDate>Sat, 01 Aug 2015 18:53:18 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>If you have updated to Windows 10 and have an nVidia Graphics Card (in my case, two 970s) and are having issues with installing driver software follow these steps.</p>
<p><strong>Before we begin, download the <a href="http://www.geforce.com/drivers">latest drivers from nVidia here</a>, extract them somewhere you can locate easily, but do not install yet!</strong></p>
<ol>
<li>
<p>Navigate to <code>Control Panel &gt; System and Security &gt; System &gt; Advanced system settings (on the left hand panel)</code></p>
</li>
<li>
<p>Once there under the Hardware tab select <code>Device Installation Settings</code> and make them match the image below.<br>
<img src="http://www.adventuresintechland.com/content/images/2015/08/Capture.JPG"></p>
</li>
<li>
<p>Navigate to <code>Control Panel &gt; Hardware and Sound &gt; Device Manager</code> and uninstall and drivers of devices with a &quot;!&quot; icon, it will likely say &quot;Display&quot; as the device.</p>
</li>
<li>
<p>On the Device Manager select <code>Action &gt; Scan for hardware changes</code>, then you should see the graphics card (in my case, GTX 97)0 under &quot;Display adapters&quot;. Right click the device and select &quot;Properties&quot;, change to the &quot;Driver&quot; tab and click &quot;Uninstall&quot;. Make sure to select &quot;Delete the driver software for this device&quot;, then click okay.</p>
</li>
<li>
<p>Restart your machine.</p>
</li>
<li>
<p>Now when your computer has booted you should have generic drivers, meaning your display resolution will be quite small. Now using the files we downloaded and extracted, run the installation now.</p>
</li>
<li>
<p>If all went according to plan your drivers should have installed correctly and now you need to restart your machine, after the restart you should be all good to go!</p>
</li>
</ol>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Google Rewards is an Invasion of Privacy That You Agreed To]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://play.google.com/store/apps/details?id=com.google.android.apps.paidtasks&amp;hl=en">Google Rewards</a> is an Android app that pays you to take surveys. Most of the payouts range from $0.05 all the way up to $1.00, just for taking simple surveys. But as the old adage goes, <strong>if you're not paying for the product, you are the product.</strong><br>
<img src="http://www.adventuresintechland.com/content/images/2015/07/tmp_3694-Screenshot_2015-07-29-14-41-00-256168143.png" width="50%"><br>
Here's</p>]]></description><link>https://www.adventuresintechland.com/google-rewards-is-an-invasion-of-privacy-that-you-agreed-to/</link><guid isPermaLink="false">598cc2e8a45f6e58b2c46ec7</guid><category><![CDATA[android]]></category><category><![CDATA[privacy]]></category><category><![CDATA[Google]]></category><dc:creator><![CDATA[Hunter Thornsberry]]></dc:creator><pubDate>Wed, 29 Jul 2015 19:40:20 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://play.google.com/store/apps/details?id=com.google.android.apps.paidtasks&amp;hl=en">Google Rewards</a> is an Android app that pays you to take surveys. Most of the payouts range from $0.05 all the way up to $1.00, just for taking simple surveys. But as the old adage goes, <strong>if you're not paying for the product, you are the product.</strong><br>
<img src="http://www.adventuresintechland.com/content/images/2015/07/tmp_3694-Screenshot_2015-07-29-14-41-00-256168143.png" width="50%"><br>
Here's how the story goes: I take my lunch break and walk to a local restaurant, on my way I change my mind and decide that I want Jimmy John's, so I change my path and walk to Jimmy John's, grab my Turkey Tom (no tomato) and then walk back to my office. A few minutes later I get a notification of a new survey available.</p>
<img src="http://www.adventuresintechland.com/content/images/2015/07/2015-07-26-16-22-07.png" width="50%">
I answer the survey and get my few cents reward, but not without getting the feeling that ~~Big Brother~~ Google is up to something. It's known that Google is [trying to improve Google Maps walking paths with it's Virtual Reality MMO Ingress](https://www.quora.com/What-could-be-the-purpose-behind-Ingress-the-game-by-Google?share=1), and this is the same vein. Since I walked to Jimmy Johns an unusual way, Google wants to know that route.
<p>Google says this data is anonymized, which very well may be but in the end Google got the data it wants, another walking route to my local Jimmy John's.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Ghost Tweeter]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://ghost.org/forum/plugins/19086-revive-old-posts/">This post</a> on the Ghost forums ask for a way to automatically, and periodically tweet links to blog posts that are X days old. So, I made one.</p>
<p><a href="https://github.com/Hunter275/GhostTweeter">GhostTweeter</a>, is written in Python and uses <a href="http://www.tweepy.org/">tweepy</a> and <a href="https://github.com/kurtmckee/feedparser">feedparser</a> to cycle through a Ghost blog's RSS feed, get post information such</p>]]></description><link>https://www.adventuresintechland.com/ghost-tweeter/</link><guid isPermaLink="false">598cc2e8a45f6e58b2c46ebd</guid><category><![CDATA[python]]></category><category><![CDATA[blog]]></category><category><![CDATA[GitHub]]></category><dc:creator><![CDATA[Hunter Thornsberry]]></dc:creator><pubDate>Mon, 22 Jun 2015 03:32:56 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://ghost.org/forum/plugins/19086-revive-old-posts/">This post</a> on the Ghost forums ask for a way to automatically, and periodically tweet links to blog posts that are X days old. So, I made one.</p>
<p><a href="https://github.com/Hunter275/GhostTweeter">GhostTweeter</a>, is written in Python and uses <a href="http://www.tweepy.org/">tweepy</a> and <a href="https://github.com/kurtmckee/feedparser">feedparser</a> to cycle through a Ghost blog's RSS feed, get post information such as Title, URL, tags, and publish date. If a minimum age is set GhostTweeter will only tweet blog post older than the minimum age. GhostTweeter also turns your blog post tags into hashtags.</p>
<p>Tweets are sent in the following format:</p>
<pre><code class="language-language-python">&lt;post title&gt;: &lt;url&gt; #&lt;tag1&gt; #&lt;tag2&gt;
</code></pre>
<br>
#Usage
Before you can start the Python file you must get your Twitter authentication and replace this in your code.
<ol>
<li>Go to <a href="https://apps.twitter.com/app/new">https://apps.twitter.com/app/new</a> and create a new app</li>
<li>Once created, copy and paste your API key and secret (will be under &quot;Keys and Access Tokens&quot;)</li>
<li>Create an access token, copy and paste those as well</li>
</ol>
<p>This is the Twitter authentication part of the Python code, anywehere you see 'yourshere' you must place the correct token.</p>
<pre><code class="language-language-python"># Twitter Auth
CONSUMER_KEY = 'yourshere'
CONSUMER_SECRET = 'yourshere'
ACCESS_KEY = 'yourshere'
ACCESS_SECRET = 'yourshere'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy.API(auth)
</code></pre>
<br>
##Running the code
Once you have correctly entered your Twitter authentication info you must run the Python code. This code is written in Python 2.7 and will not work in Python 3 (yet). Open up your favorite Python terminal and type: *python GhostTweeter.py*
<p>Now it will ask you for your Ghost url, as well as how often you want to tweet (in hours). Once that it all set you are ready to go!</p>
<p><strong>Note:</strong> Depending on your OS, if you want to run this in the background you can simply run <em>python GhostTweeter.py &amp;</em> and the code will do the rest of the work.</p>
<p><a href="https://github.com/Hunter275/GhostTweeter">GhostTweeter on GitHub</a></p>
<p>This code is very easy to change and can possibly be used with any RSS feed with some simple modifications.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[House Cleaning]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Please pardon the mess, recently had to do a fresh install of Ghost.</p>
<!--kg-card-end: markdown-->]]></description><link>https://www.adventuresintechland.com/house-cleaning/</link><guid isPermaLink="false">598cc2e8a45f6e58b2c46eba</guid><category><![CDATA[blog]]></category><category><![CDATA[Server]]></category><dc:creator><![CDATA[Hunter Thornsberry]]></dc:creator><pubDate>Wed, 17 Jun 2015 16:30:31 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Please pardon the mess, recently had to do a fresh install of Ghost.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Adventures In Techland Twitter Account]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Adventures in Techland is now on twitter as <a href="http://www.twitter.com/AiTechland">@AiTechland</a>. Make sure to follow us to keep up-to-date with the latest post.</p>
<!--kg-card-end: markdown-->]]></description><link>https://www.adventuresintechland.com/adventures-in-techland-twitter-account/</link><guid isPermaLink="false">598cc2e8a45f6e58b2c46e92</guid><category><![CDATA[Twitter]]></category><dc:creator><![CDATA[Hunter Thornsberry]]></dc:creator><pubDate>Sun, 18 Jan 2015 17:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Adventures in Techland is now on twitter as <a href="http://www.twitter.com/AiTechland">@AiTechland</a>. Make sure to follow us to keep up-to-date with the latest post.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Awesome Android App: FitNotes]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>FitNotes is a fitness app aimed at weight lifting/body building. You can track number of reps on individual exercises, view progress graphs, record body weight, even keep notes about the day. FitNotes - Today<br>
Custom Exercises</p>
<p>One of the great things about FitNotes is the ability to create custom</p>]]></description><link>https://www.adventuresintechland.com/awesome-android-app-fitnotes/</link><guid isPermaLink="false">598cc2e8a45f6e58b2c46e93</guid><category><![CDATA[android]]></category><category><![CDATA[app]]></category><category><![CDATA[review]]></category><dc:creator><![CDATA[Hunter Thornsberry]]></dc:creator><pubDate>Tue, 13 Jan 2015 17:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>FitNotes is a fitness app aimed at weight lifting/body building. You can track number of reps on individual exercises, view progress graphs, record body weight, even keep notes about the day. FitNotes - Today<br>
Custom Exercises</p>
<p>One of the great things about FitNotes is the ability to create custom exercises. The default set exercises has a lot of the basics but I've found that I needed to add a few exercises. When you add an exercise you can specify the name, weight increments, and even notes about that exercise. Each exercise keeps track of reps, and weight. If you set a new maximum weight/reps a trophy will appear next to that rep (see below).</p>
<p>FitNotes - Exercise<br>
Rest Timer</p>
<p>One of the handiest features of FitNotes is the rest timer. After you add an exercise you can start a rest timer either automatically or with the click of a button, and this will give you a specific rest period. This is also great for motivation when you hear the alarm go off, you know it's time to lift.<br>
FitNotes - Timer</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Must Have: Mac OS X Applications]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Whether you're a programmer, or just the average user these Mac OS X applications will improve your experience with OS X.</p>
<p>Note: Applications are free unless noted otherwise<br>
General</p>
<p>Browser - Google Chrome, Firefox<br>
Text Editor - Sublime Text ($70), Atom<br>
Music - Spotify<br>
Notes - SimpleNote, Evernote<br>
Media Player</p>]]></description><link>https://www.adventuresintechland.com/must-have-mac-os-x-applications/</link><guid isPermaLink="false">598cc2e8a45f6e58b2c46eb9</guid><category><![CDATA[mac]]></category><category><![CDATA[os x]]></category><dc:creator><![CDATA[Hunter Thornsberry]]></dc:creator><pubDate>Fri, 09 Jan 2015 17:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Whether you're a programmer, or just the average user these Mac OS X applications will improve your experience with OS X.</p>
<p>Note: Applications are free unless noted otherwise<br>
General</p>
<p>Browser - Google Chrome, Firefox<br>
Text Editor - Sublime Text ($70), Atom<br>
Music - Spotify<br>
Notes - SimpleNote, Evernote<br>
Media Player - VLC<br>
Communication - Skype<br>
File Syncing - Dropbox<br>
App Uninstaller - AppCleaner<br>
Screen Dimmer - Flux</p>
<p>If you have any apps that you would like to suggest, tell us down in the comments below!<br>
Programmer</p>
<p>Terminal - iTerm 2<br>
FTP - Transmit ($34)<br>
Text Editor - Sublime Text ($70), Atom<br>
Virtualization - VirtualBox<br>
Git - GitHub for Mac<br>
SQL - SequalPro</p>
<p>If you have any apps that you would like to suggest, tell us down in the comments below!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Intel Compute Stick]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>With a world of Raspberry Pi, Arduino, Beaglebones, Banana Pi, and a foray of other SoC's taking over the world it's hard to see how anyone can hope to get a large slice of the... Pi.<br>
Enter Intel</p>
<p>Intel needs no introduction. The tech giant has now set its sights</p>]]></description><link>https://www.adventuresintechland.com/intel-compute-stick/</link><guid isPermaLink="false">598cc2e8a45f6e58b2c46e94</guid><category><![CDATA[intel]]></category><dc:creator><![CDATA[Hunter Thornsberry]]></dc:creator><pubDate>Wed, 07 Jan 2015 17:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>With a world of Raspberry Pi, Arduino, Beaglebones, Banana Pi, and a foray of other SoC's taking over the world it's hard to see how anyone can hope to get a large slice of the... Pi.<br>
Enter Intel</p>
<p>Intel needs no introduction. The tech giant has now set its sights on the micro-computer world and has announced the Intel Compute Stick. Interestingly, there are two models of the &quot;Compute Stick&quot;. The Windows 8.1 model priced at $149 boast 2GB of RAM, while the Linux version at $89 has 1 GB. It will be interesting to see if Intel will lock the hardware to the OS, thus barring someone from installing Linux on the 2 GB ram model.<br>
Intel Compute Stick<br>
Specs</p>
<p>Operating System: Windows 8.1<br>
Price: $149<br>
RAM: 2GB<br>
Storage: 32 GB + microSD<br>
Power: MicroUSB<br>
Display: HDMI<br>
Network: Wireless (WiFi)<br>
Bluetooth: Yes<br>
USB Ports: 1</p>
<p>Operating System: Linux<br>
Price: $89<br>
RAM: 1GB<br>
Storage: 8 GB + microSD<br>
Power: MicroUSB<br>
Display: HDMI<br>
Network: Wireless (WiFi)<br>
Bluetooth: Yes<br>
USB Ports: 1</p>
<p>(Source: TechReport)</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[One Server, Multiple Domains]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>It is possible to have one server host multiple domains, this of course increases the chance of failure (if one server goes down so do ALL of your domains). That being said this saves you tons of money, if uptime is not crucial for you, then this can save you</p>]]></description><link>https://www.adventuresintechland.com/one-server-multiple-domains/</link><guid isPermaLink="false">598cc2e8a45f6e58b2c46eb8</guid><category><![CDATA[web]]></category><category><![CDATA[hosting]]></category><dc:creator><![CDATA[Hunter Thornsberry]]></dc:creator><pubDate>Tue, 06 Jan 2015 17:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>It is possible to have one server host multiple domains, this of course increases the chance of failure (if one server goes down so do ALL of your domains). That being said this saves you tons of money, if uptime is not crucial for you, then this can save you tons of money.<br>
This guide assumes you are on Linux, using either Apache or Nginx!<br>
Apache</p>
<p>There are two files you need to edit to get Apache to server webpages on different ports. We are using &quot;/var/www/html&quot; on port 80 as the default settings and &quot;/var/www/html2&quot; on port 88 as the domain we are going to add.</p>
<ol>
<li>&quot;/etc/apache2/ports.conf&quot;</li>
</ol>
<p>Add &quot;Listen 88&quot; directly below &quot;Listen 80&quot; in this file.<br>
2. &quot;/etc/apache2/sites-enabled/000-defaut.conf&quot;</p>
<p>Add the follow directly below the closing of the first Virtual Host.</p>
<pre><code>&lt;VirtualHost *:88&gt;
        # The ServerName directive sets the request scheme, hostname and port t$
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html2

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with &quot;a2disconf&quot;.
        #Include conf-available/serve-cgi-bin.conf
&lt;/VirtualHost&gt;
</code></pre>
<h1 id="nginx">Nginx</h1>
<p>We are using &quot;/usr/share/nginx/html&quot; on port 80 as the default and &quot;/usr/share/nginx/html2&quot; on port 88 as the domain we are adding.</p>
<p>Edit &quot;/etc/nginx/sites-enabled/default&quot; and add the following directly below the first server text.</p>
<pre><code>server {
        listen 88 default_server;
        listen [::]:88 default_server ipv6only=on;

        root /usr/share/nginx/html2;
        index index.html index.htm;

        # Make site accessible from http://localhost/
        server_name localhost;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }
}
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>