Monday, July 27, 2015

Cool APIs


Little side applications are fun to make. Try thinking of add-ons to your favorite current apps/websites to make them even better and you can make your own project! Or these are great tools to incorporate to make something else new and cool. I love adding JS libraries and APIs from other people and places to make use of the awesome things people put out into the web to share.

Of course, Google. Google drive? Email self a document = upload to drive? Oh the million possible projects using Google..
https://developers.google.com/apis-explorer/#p/

Unfortunately, google does not have a free API for translating anymore (you have to pay..).. but Microsoft does! I used this in my AnkiTranslate project. Good for if you want to work with multiple languages or make study aids to learn another language.
https://www.microsoft.com/translator/api.aspx

Can I say wheel of lunch? Lunch picker? Thing to do picker?
https://www.yelp.com/developers/documentation/v2/overview

Practice stock market = $$$.. if you can get good at it.
https://code.google.com/p/yahoo-finance-managed/wiki/YahooFinanceAPIs

And more..
http://www.quora.com/What-are-some-cool-fun-APIs
http://www.computersciencezone.org/50-most-useful-apis-for-developers/
http://www.webdesignerdepot.com/2011/07/40-useful-apis-for-web-designers-and-developers/

LINQ Eager and Lazy Loading


Here's a little bit on using Linq and the ways to get data out via Eager / Lazy loading and LINQ methods vs operators. The explanations are in the code comments below.

using System.Data.Entity;
using System.Linq;
using EFFundamental;

namespace ConsoleApplication1
{
    class Program
    {
        // How to query against entity data model
        static void Main(string[] args)
        {
            LinqOperatorLazyLoading();
            LinqOperatorEagerLoading();
            LinqMethods();
            ProjectionQuery();
        }

        // using LINQ operator
        // Lazy loading = fetch only main data and have to make subsequent calls to get related data. 
        // Use when you know related data is not required at all or at the time of the call. 
        private static void LinqOperatorLazyLoading()
        {
            var context = new CHEntities();
            var query = from c in context.council_member 
                        where c.end_dtm != null
                        select c;
            
            var result = query.ToList();

           // note Lazy loading is by default, on.  If you want to change this..
           // context.ContextOptions.LazyLoadingEnabled = false;
        }

        // using LINQ operator
        // Eager loading = explicitly fetching all the data related in one call.
        // Good if all your stuff is not too large or you are unsure of what pieces of data you will need. 
        // If it is a large amount of data.. slower but more complete. 
        private static void LinqOperatorEagerLoading()
        {
            var context = new CHEntities();
            var query = from c in context.council_member.Include("address") // the .Include is what makes it Eager loading (these are the "extra" objects )
                                                        .Include(x => x.council_lku) // to use lambdas, make sure to add: using System.Data.Entity;
                        where c.end_dtm != null
                        select c;
            
            var result = query.FirstOrDefault();
        }

        // using LINQ methods .WHERE etc.. 
        private static void LinqMethods()
        {
            var context = new CHEntities();
            var result = context.Compliance_Notes.Where(x => x.last_updated_by == "ctenn").ToList();
        }

        private static void ProjectionQuery()
        {
            var context = new CHEntities();
            var query = from c in context.council_member.Include("address")
                        where c.end_dtm != null
                        // anonymous type and 2 of its properties. new object selecting only the properties you want. 
                        select new
                        {
                            c.branch, 
                            c.end_dtm
                        };
        }
    }
}

Thursday, July 9, 2015

Project Euler 8: Largest product in a series (C#)

The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × 8 × 9 = 5832.

73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

Find the thirteen adjacent digits in the 1000-digit number that have the greatest product. What is the value of this product?


Uncomfortably large 1000 digit number is getting stored as a string to begin with.. it's just too big to fit into the regular number types. Thought was I could either iterate through all possible sets of 13 then see if 0 is part of the set. If 0 is part of the set, obviously the product will be 0 which is less than a set without 0.. so just get rid of those possibilities. If we can get a product out of it that isn't 0, we are going to parse each string into its digit using LINQ then aggregate it into a product. Then compare the product to the last highest product. If it is higher, set the current highest product to the new product.

            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            
            string thousandDigitNum =
                "/*insert giant number here from their website*/";

            string thirteenDigitString = null;
            long newProduct = 0;
            long currHighestProduct = 0;

            for (int i = 0; i < (thousandDigitNum.Length -13); i++)
            {
                thirteenDigitString = thousandDigitNum.Substring(i, 13);
                if (thirteenDigitString.Contains("0")) continue;
                
                newProduct = thirteenDigitString.Select(digit => long
                        .Parse(digit.ToString()))
                        .Aggregate((a, b) => a*b);
                
                if (newProduct > currHighestProduct) currHighestProduct = newProduct;
            }

            stopwatch.Stop();

            Console.WriteLine("The highest value is: " + currHighestProduct + ". And the time elapsed is:" + stopwatch.Elapsed);
            Console.ReadLine();

23514624000 is the solution.

Friday, July 3, 2015

Project Euler 7: 10,001 prime number (Java)

This one is interesting, if you think about it.. question is if there is a formula?

Well.. I looked for a formula for it and according to my favies wikipedia: "In number theory, a formula for primes is a formula generating the prime numbers, exactly and without exception. No such formula which is efficiently computable is known. A number of constraints are known, showing what such a "formula" can and cannot be.".. so "efficiently" iterate it is! You could iterate yourself to death going through every possibility.. or try and find a better way to iterate, just less.

I figured.. welp. Let's say we have the number 100. It breaks down into 1 x 100, 2 x 50, 4 x 25, 5 x 20, 10 x 10.. and stops there. The first number always goes up, second one always goes down. If they meet, they reverse.. and we are repeating ourselves. BUT you can try this, no matter what .. at least one of the pair of numbers is less than half. So we will ALWAYS catch the pair of multiples if we check all the numbers up to half. So what I am doing for example 100 is seeing if any number from 1-50 will divide evenly into it. The minute its divisible by any of those numbers iterating from 1 to 50, its not prime, doesn't get added to my magic list of numbers, and the loop continues to check 101.. and so on.

1031 ms to calculate is about a second, which fits into most of your attention spans out there.. so I'll take it :).

Point to note and something that was COOL. You can use (int)Math.ceil(num/2.0) to get a rounded up version of your number (ceil = ceiling, you can do Math.floor to get it rounded down.. floor is down whee). BAD thing. Don't forget your cast depending on the type of numbers being used!!!

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Crystal on 6/29/2015.
 */


public class Program {
    public static void main(String[] args) {
        // Project Euler #7
        // What is the 10,001st prime number if we consider 2 the first prime number?

        long start = System.nanoTime();

        int num = 2;
        int halfNum = 0;
        boolean isPrime = true;

        List primeNumbersArr = new ArrayList() {};
        primeNumbersArr.add(2);
        primeNumbersArr.add(3);
        primeNumbersArr.add(5);

        while (primeNumbersArr.size() < 10001){
            isPrime = true;

            if(num % 2 == 0 || num % 3 == 0 || num % 5 == 0) {
                num++;
                continue;
            }

            halfNum = (int)Math.ceil(num/2.0);

            int i = 2;
            for (; i < halfNum; i++){
                if (num % i == 0){
                    isPrime = false;
                    break;
                }
            }

            if (isPrime == true) primeNumbersArr.add(num);
            num++;
        }

        long stop = System.nanoTime();


        System.out.println(primeNumbersArr.get(10000)  + " is the solution calculated in a time of " + (stop - start) / 1000000 + "ms");

    }
}

104743 is the solution calculated in a time of 1031ms.

Project Euler 6: sums and squares (Java)

So, I've taken to trying out IntelliJ and Java for some project euler problems and then will start making small apps in there. It's been fun, these puzzles are a good way to get a quick intro into Java. There are definitely some minor differences, but for the most part navigating the IDE and not having my shortcuts be the same has been the largest challenge. There is a free 1 year subscription to IntelliJ and Resharper (for C#) if you have a student email address ending in .edu, so I recommend giving it a shot!!!

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Crystal on 6/29/2015.
 */


public class Program {
    public static void main(String[] args) {
        // Project Euler #6: Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum
        // Starting value, set x to 100
        long start = System.nanoTime();

        int x = 100;

        int sumOfSquares = (x * (x + 1) * (2 * x + 1)) / 6;
        int sum = 0;
        for (int i = 1; i <= x; i++)sum += i;

        long stop = System.nanoTime();

        System.out.println(sum*sum - sumOfSquares + " is the solution calculated in a time of " + (stop - start) / 1000000 + "ms");
    }
}

25164150 is the solution calculated in a time of 0ms.

Friday, June 19, 2015

Code Project: AnkiTranslate

CLICK HERE to see the full app on GitHib.

Coming out of a medical background, I can't say I'm one for memorizing much of anything (memorizing hundreds of pages/slides at a time taught me 2 things: #1 amazing time management skills, #2 you forget everything you don't directly apply and use often).. BUT I will say that for learning a language you need to memorize vocabulary and that Anki is the tool out there to help you. Anki is simple and free, its flash cards that you make and that do spaced repetition (it hits you with cards you missed at a time interval you can set that is good for you). However, I wrote hours and hours of notes and cards and well, that's no fun.

In a language, I've seen most people say you need about 2000-5000 words to be conversational. And a lot of English speakers speak around 15,000-20,000 words. And crazy specialized folks who go deep into an area (could be medicine, science, whatever).. may know 30,000 or so words. So let's stick with 2000-5000 words... if I am FAST and can make 1 Anki card a minute, I will spend 5000 hours making flash cards.. which is 83 hours. Yes, yes making the cards *might* help me learn it a little more. But I do think flipping through the cards for 83 hours I could be done with at least a good portion of the cards and be speaking / interacting with people instead of still making more cards.

I could spend said 83 hours making a TON of flashcards for random vocabulary. Or I could spend 2 hours making a little app, drop it on github for anyone to use / see, and get to program a little :D.. and drop my time making flash cards down to about 30 seconds). I can find plenty of lists of top / most common 100 or 1000 or such English words, drop this into the program and get flashcards off of a simple copy and paste.

Using the app: input a text file of words you want to translate out and separate each word to translate with a newline (or edit the app to deal with CSV or whatever format or all formats..).. let AnkiTranslate know which language you are starting with and which one you want outputted.. and then..

Output: you will get a text file you can import into Anki that will make your flash cards. Anki has the front of the card, separated by a tab, the back of the card, then a new line for a new card. So as such the format of the output will be your initial word, a tab, the translated word, and a newline for a new card.

Caveat: This is good for vocabulary and short phrases. Expect that a translator will, well, mess up grammar and make you sound funny if you try and translate a ton of phrases. My purpose is to use this to get mass amount of pure one word vocabulary down, then I will study grammar and sentence strucutre on its own and put together the words I learn from this. Sometimes the meaning of the word won't be the one you think of, it happens.. but it'd happen anyways using a translator. If I get 95% of the words right off a translator, that's still pretty good and I'll fix them when I use it wrong and am corrected :P.

Here's the fun: planning. I decided on a WPF because it's easy for me to navigate as I've worked on projects with it before, the UI is simple and looks nice (I say nice relatively, it works, I don't care about design as much as function and logistical use), so on the CS code behind of main window I made a plan.. I usually *try* my best to bullet out a good order of what I am working on, and it almost always partially turns out that way:
namespace AnkiTranslate
{
    /// 
    /// Interaction logic for MainWindow.xaml
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Translate_Click(object sender, RoutedEventArgs e)
        {
            // use native windows importer for file

            // display file path on textbox

            // parse file into string

            // google translate API work

            // parse translator API work + initial values into anki format

            // native windows save file location option

            // export .txt file

            // display success message on textbox
            
        }
    }
}
And when I dropped some text boxes onto a window it looks like this:



I ran into a snag and realized that Google does not offer free translating at all anymore, but Microsoft does. I went to the Microsoft Translator API and followed the directions there, it was easy to plug right into my app. This is the expanded version of my initial plan.
namespace AnkiTranslate
{
    /// 
    /// Interaction logic for MainWindow.xaml
    /// 
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();

            Languages languageChoices = new Languages();
            languageChoices.Populate();
        }

        private void ComboBoxFrom_Loaded(object sender, RoutedEventArgs e) { ComboboxDoWork(sender); }

        private void ComboBoxTo_Loaded(object sender, RoutedEventArgs e) { ComboboxDoWork(sender); }

        private void ComboboxDoWork(object sender)
        {
            var comboBox = sender as ComboBox;

            if (comboBox == null) return;
            comboBox.ItemsSource = ConfigClass.Languages;
            comboBox.SelectedIndex = 0;
        }

        private void Translate_Click(object sender, RoutedEventArgs e)
        {
            ConfigClass.LanguageTranslatedFrom = ((ConfigClass.ComboboxItem) lanFromComboBox.SelectedValue).Value;
            ConfigClass.LanguageToTranslateTo = ((ConfigClass.ComboboxItem) lanToComboBox.SelectedValue).Value;

            var openFileDialog = new OpenFileDialog {Filter = "Text Files (.txt)|*.txt", FilterIndex = 1, Multiselect = true};
            bool? userConfirmation = openFileDialog.ShowDialog();

            if (userConfirmation != true) return;
            string file = openFileDialog.FileName;

            try
            {
                ConfigClass.TextToTranslate = File.ReadAllText(file);
                MsgBoxLabel.Content = file;
            }
            catch (IOException) { throw new Exception("Something went wrong, eh?"); }

            ConfigClass.TranslatedText = new MicrosoftTranslator().Translate();

            // DOWORK to make anki format
            string[] textToTranslateArray = ConfigClass.TextToTranslate.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
            string[] translatedTextArray = ConfigClass.TranslatedText.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
            string finalText = "";

            for (int i = 0; i < textToTranslateArray.Length - 1; i++)
            {
                finalText += textToTranslateArray[i] + "\t" + translatedTextArray[i] + System.Environment.NewLine;
            }

            var saveDialog = new SaveFileDialog { Filter = "Text Files (.txt)|*.txt", FilterIndex = 1};
            bool? userSaveConfirmation = saveDialog.ShowDialog();

            if (userSaveConfirmation != true) return;
            string savePath = @saveDialog.FileName;

            File.WriteAllText(savePath, finalText);
            MsgBoxLabel.Content = "Successfully saved to: " + saveDialog.FileName;
        }
    }
}



Since it's a small app, I just hardcoded in some languages (feel free to adjust as needed to whichever you are learning). The website that has a list of all possible languages is here: msdn.microsoft.com/en-us/library/hh456380.aspx
namespace AnkiTranslate
{
    public class Languages
    {
        // full list of supported languages here: msdn.microsoft.com/en-us/library/hh456380.aspx
        public void Populate()
        {
            var en = new ConfigClass.ComboboxItem { Text = "English", Value = "en" };
            var es = new ConfigClass.ComboboxItem { Text = "Spanish", Value = "es" };
            var bg = new ConfigClass.ComboboxItem { Text = "Bulgarian", Value = "bg" };
            var cn = new ConfigClass.ComboboxItem { Text = "Chinese", Value = "zh-CHS" };
            var tlh = new ConfigClass.ComboboxItem { Text = "Klingon", Value = "tlh" };

            ConfigClass.Languages = new List {en, es, bg, cn, tlh};
        }
    }
}


I also made a ConfigClass to hold some global variables instead of passing around local ones to my different functions.

namespace AnkiTranslate
{
    public class ConfigClass
    {
        public static string TextToTranslate { get; set; }
        public static string LanguageTranslatedFrom { get; set; }
        public static string TranslatedText { get; set; }
        public static string LanguageToTranslateTo { get; set; }

        public static List Languages { get; set; }

        public class ComboboxItem
        {
            public string Text { get; set; }
            public string Value { get; set; }
            public override string ToString()
            {
                return Text;
            }
        }
    }
}


You can see below with the variables clientId and strTranslatorAccessUri , I am referencing the ConfigurationManager.AppSettings which is hitting my App.config file keys that I added. This is the actual work going to the Microsoft API and returning translated text.

namespace AnkiTranslate
{
    public class MicrosoftTranslator
    {
        public string Translate()
        {
            string clientId = ConfigurationManager.AppSettings["clientID"];
            //string clientSecret = ConfigurationManager.AppSettings["clientSecret"];
            string strTranslatorAccessUri = ConfigurationManager.AppSettings["strTranslatorAccessURI"]; 

            String strRequestDetails = string.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=http://api.microsofttranslator.com", HttpUtility.UrlEncode(clientId), HttpUtility.UrlEncode(clientSecret));

            System.Net.WebRequest webRequest = System.Net.WebRequest.Create(strTranslatorAccessUri);
            webRequest.ContentType = "application/x-www-form-urlencoded";
            webRequest.Method = "POST";

            byte[] bytes = System.Text.Encoding.ASCII.GetBytes(strRequestDetails);
            webRequest.ContentLength = bytes.Length;

            using (var outputStream = webRequest.GetRequestStream()) outputStream.Write(bytes, 0, bytes.Length);

            System.Net.WebResponse webResponse = webRequest.GetResponse();

            var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(AdmAccessToken));

            //Get deserialized object from JSON stream 
            AdmAccessToken token = (AdmAccessToken)serializer.ReadObject(webResponse.GetResponseStream());
            if (token == null) throw new ArgumentNullException("token");

            string headerValue = "Bearer " + token.access_token;

            // User input text to translate plus chosen TO and FROM languages 
            string uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" +
                HttpUtility.UrlEncode(ConfigClass.TextToTranslate) + "&from=" + ConfigClass.LanguageTranslatedFrom + "&to=" + ConfigClass.LanguageToTranslateTo;
            System.Net.WebRequest translationWebRequest = System.Net.WebRequest.Create(uri);
            translationWebRequest.Headers.Add("Authorization", headerValue);
            System.Net.WebResponse response = null;
            response = translationWebRequest.GetResponse();
            Stream stream = response.GetResponseStream();

            Encoding encode = Encoding.GetEncoding("utf-8");
            var translatedStream = new StreamReader(stream, encode);
            System.Xml.XmlDocument xTranslation = new System.Xml.XmlDocument();
            xTranslation.LoadXml(translatedStream.ReadToEnd());

            return xTranslation.InnerText;
        }
    }
}


The finished product looks like the following:


If you do get to use this app, here's a good sample of the top 1000 words and how useful they are by example: http://splasho.com/upgoer5/

Also, this is *perfect* for the app to translate to another language.. 1000 words separated by a new line. http://splasho.com/upgoer5/phpspellcheck/dictionaries/1000.dicin

Here's my use of the app and the output file (plugs right into Anki and I get my deck! Whoo hoo! 80 hours to play more games..): 1000 most common vocabulary words in English / Bulgarian

If you want to try it out yourself, have a go! (I just uploaded the release version to Google Drive so you can download from there. If anyone actually wants to use this and doesn't program / wants me to add more languages just ping me on the contact form and I can add the rest..) Download

Tuesday, June 2, 2015

Life Learning Optimization

I wanted to make some comments on learning, perhaps it will help someone out who is struggling with learning quickly and how it occurs. I've done everything in my life to optimize how I learn and I have been pretty successful in helping others as I've spent years tutoring for almost every science / math / topic / exam.

Learning quickly usually means you "care" more (in some way are more motivated, curious, or passionate than others), work harder, work smarter per your time, or spend more time thinking / working through things throughout your day. Honestly though, people do have a "knack" for learning certain things in certain ways. I will also go so far as to say there's a "knack" for memorizing vs. computing thought. By all means you can be born good at both or get good at both, but usually you have a personality and tendency to like/dislike one or the other and it will force your thinking patterns to be "better" at one naturally. There are visual-, tactile-, audio- types of people and others. You can get better at each one, but there are some that you will be better at without as much effort as the others.

It can make you incredibly unhappy to spend all your thought/time doing things you don't want to or doing things you like the wrong way. Don't do it. Life is too short. You might think you are terrible at something, but be going about it the wrong way. For example, I am a visual learner. I learn very well and very fast writing, reading, drawing concept maps, reviewing, testing myself, and reviewing more all visually. You would think I was terrible at something if you made me try and do all of it by listening to audio only (as many times as I wanted) and being able to only talk to people with no writing allowed. I'm the same person, learning the same topics, but some methods make things stick better.

Sometimes you have the leisure and time to improve at a learning skill. If you are mostly visual and keep working at audio, you will be able to become better at both! However, if you're pressed for time and performance (say.. medical student) you are probably better off figuring out how you learn and overusing that to death so you get some time to sleep. Learning is about learning yourself and what makes you understand the best (in a good amount of time with a worthwhile retention).

Other factors in learning are awakeness (did you sleep enough?), happiness with life, overall health (diet / exercise help), background knowledge (in the same, or other seemingly unrelated things), self-confidence, openness (are you fighting learning it? do you hate your class or teacher?), and good habits (do you habitually distract yourself or did you form good habits at sitting and focusing over the years?). Background knowledge in learning, critical thinking, or being familiar with a topic helps a lot.

I've seen people waste unimaginable amounts of time on other thoughts and it cuts into their learning time. Many of them never realized the problem and became frustrated. For example here are a few (look out for these, see if any sound like you..):
  • Thinking about things happening in the day.
  • Thinking about how every last little thing works.. then getting hung up on it.
  • Thinking about how boring things are.
  • Thinking about how much they hate what they are doing.
  • Thinking about how something is named in a dumb way.
  • Thinking/worrying about what someone else thought of them that day.
  • Thinking/worrying about failure.
  • Thinking about how to get through and just scrape past some class / school / graduation date.
  • Thinking about what they will do in the future (which to some extent is productive, as it can be planning and motivating for the current task).
  • Thinking about whether they will get a call / text / message / whatever.
  • Thinking about how to display some status update on social media.
  • Thinking about said random noise / shuffling / movement in room.
  • Thinking about how many pages they read or how far they are getting in the book.. without actually reading the book.
If you said you had 1 hour of time to work on Algebra.. and you did any or a lot of the above.. your 1 hour is now worth say 15 minutes. That's a lot of thought going into stuff not Algebra.

How to fix some of the above things.. make sure after every page (or paragraph / sentence) you actually comprehended, can summarize, and remember what was written. If you don't remember things you read, record yourself speaking the page and listen to it. If you hate audio, either get Dragon or transcribe audio yourself. If you don't map memory to typing, then write it out, or vice versa. Repetition and quizzing yourself helps. Believe in yourself and don't worry about other people. Also don't get hung up on something too long, one nitty gritty detail won't kill you and obsessing over it gets emotional and wastes time. Sometimes its better to write it down, address it later when you know more, or go out into the world and ask someone online/in person to share some of their knowledge with you. Don't worry about "telling" other people on social media or real life how many chapters you read so you sound good. No one cares how much you read if you didn't learn. Learn for YOU.

You are made up of your years. Your years are made up of your months. Your months of days. Your days of hours. And your hours of minutes and seconds.. how you spend them with your actions and thoughts. If you waste your thoughts on garbage (listed above), it will take you a very long time to get through things when you learn them. I don't advocate not addressing these things, they are important but in their own time. If your job is to be a student and to study, or you made yourself a goal to learn something.. then make sure your time is spend smartly working on the task at hand, in the present. Having a plan in mind, an approximate flexible schedule (don't be too hard on yourself if you don't make it, count the positives and don't let things hold you back!), and a goal help immensely.

I've been told I am a fast learner. Sure? I'm smart but no genius child. I am a very hard worker, extremely goal oriented, and very good at focusing at the task at hand. I hate garbage thoughts (negative feelings, negative things from other people, not believing, worry, unnecessary life drama, emotional or irrational reactions). I don't have any form of social media.. the most I have is this blog for software, one for food (my hobby is cooking), and LinkedIn.. I feel most other social media provides more unnecessary distraction than good, but it's just my opinion (however, there are times where it will HELP your career a lot if you are a public speaker, actor/actress, athlete, traveler/have friends at a distance, etc..). I try my best not to worry about others or let them take time away from my thoughts. Of course, I'm human and do care very much what a few people close to me think, but other than that I don't waste time on drama/life garbage. I can blatantly ignore my surroundings, to the point of likely unhealthy if some event were to occur behind me. I can be called "spacey".. I'm there, but I'm not. If you leave me alone a couple minutes I'll have started thinking or planning out something else in my head I was working on before.. for example working through a puzzle, rehashing as many words I can think of from a language I'm learning, finding another way to approach something, or walking through a concept map of something I've learned. Your idle time is A LOT of your day. Your time spent walking, exercising, traveling, driving, sitting, etc.. and if you took all that time, you can get very good at what you already do "quickly" relative to someone else who is thinking about their Facebook post.

You don't have to do this with your time, only do it if you want to.. do what makes you happy. If you enjoy social media, art, history, science.. anything then spend your time on it! This post if for if you are trying to learn and not sure why you may not be getting the results you want. Not everyone wants to learn a ton of stuff. For some, life is a comfortable place and relaxing is important. For others success and moving up. But, for me.. I like to learn. I'm good at learning and it makes me happy so just sharing some mistakes and advice if you too enjoy learning.