Posted on Leave a comment

How To Make Your HTML5 App Downloadable With Web App Manifest

Downloadable HTML5 Apps and Web App Manifest

HTML5 has brought us the ability to add banners to our web apps that can trigger downloads to the home screen. Doing so makes the web app open up like a native downloaded app from the respective app store. In today’s tutorial I will show you how to add a web app manifest file to your web app so you can add this new functionality to your web applications.

Webmanifest.json

Webmanifest.json is a file that the browser uses to gather meta data about your application. In it you can set information such as author, description, icons and more. For the purpose of app installs the manifest file must have the following:

  • short_name
  • name
  • 192×192 png icon
  • start_url that loads
  • the site must have a registered service worker
  • the site must be served over https
  • background script with webworker

The benefits of using web app manifest is that you can add your web app to your home screen and it can be opened in a native like view. Another benefit is that your app has zero install time and can install on any device without having to pay Google or Apple developer fees. Your app has better performance as well since all of your files are local to the device. Lastly you can have an offline experience for your app (think web games, or news readers).

Web App opening from homescreen
Web App opening from homescreen

How To Implement

I am a big proponent of using tools so whenever I need to create a web app manifest I just head over to this site after plugging in your details you should end up with a file looking similar to this:

{
  "name": "This Is A Test",
  "short_name": "Test",
  "lang": "en-US",
  "start_url": "/",
  "display": "standalone",
  "icons": [
    {
      "src": "icon.png",
      "sizes": "192x192",
      "type": "image/png"
    }
  ]
}
It is missing the description, and background scripts which you can simply add. For a more complete example here is my Twitter Scheduler manifest.json
{
 "name": "Twitter Scheduler",
 "short_name": "Twitter Scheduler",
 "start_url": "/home",
 "display": "standalone",
 "icons": [
 {
 "src": "/android-chrome-192x192.png",
 "sizes": "192x192",
 "type": "image/png"
 },
 {
 "src": "/android-chrome-512x512.png",
 "sizes": "512x512",
 "type": "image/png"
 }
 ],
 "theme_color": "#000000",
 "background_color": "#000000",
 "display": "fullscreen",
 "description": "The app let's you schedule your tweets!!",
 "background": {
 "scripts": ["background.js"]
 }
}

Now when someone visits the site at least twice within 5 minutes of each other a prompt will come up asking them if they want to add to homescreen. You can also manually add to homescreen yourself same experience. If you want more in depth explanations here is a great resource from Google.

Posted on Leave a comment

InstaTorrent Stream Is Live

What Is InstaTorrent Stream?

InstaTorrent Stream is my latest web app that allows file transfers browser to browser with the power of Webtorrent. There are no file size restrictions and it is free to use forever. InstaTorrent Stream offers the following features:

  • Unlimited file sizes doesn’t matter if it is 2 megabytes or 2 terabytes
  • Serverless, all transactions are browser to browser for a more secure experience
  • All file types are supported
  • Don’t want to download a file? Stream it right in the browser (perfect for large video files)
  • Built on top of webtorrent which is built on top of bittorrent, the more people that download the file, the better throughput and lower latency.
  • Progressive Web App if you are on mobile try adding to home screen 🙂

This app is perfect for business and personal use cases. Need to send your friend your latest recording? Use InstaTorrent Stream! Need to send a large .iso file? Use InstaTorrent Stream! The possibilities and use cases are only limited to your imagination.

How Did The Idea Come About?

I was very intrigued by the WebRTC specification so I started looking at open source projects that incorporated WebRTC. In my search I stumbled upon webtorrent.io a project that implements the bittorrent protocol in the web. I am a huge advocate for bittorrent, and now that we can write bittorrent applications in the web, we have taken a huge step to the redecentralization of the web. I wanted to create a platform where people can share and download magnet files without having to download dedicated software. I also recognize that not everybody will want to download said files so I wanted to make an app that will allow streaming.

How Does It Work?

The app is dirt simple! If you are the sender simply choose the file (drag and drop is supported) you want to send and you will receive a link to your file
InstaTorrent Stream Sender
As the file receiver you can either click on said link or if they know the magnet link already just paste it in Receive File box and hit download. If it is a streamable file it will appear in the right hand Preview box
instatorrent stream receiver
Once the file completes downloading you can then save to your harddrive. This app works across desktop/mobile/tablet although some iOS users may experience some issues (blame Apple not me!).

Future Features

As time allows me I will be adding new features to this app including but not limited to :

  • The ability to see what torrents are actively streaming
  • The ability to show multiple files in the stream preview
  • Paid subscription based version to allow people to store their files so they can seed without having to have their browser open
  • And MORE!

It is my hope that you will support me and use the app at least once or at the minimum share on your social media. InstaTorrent Stream is only the first of many mini projects I plan of putting out this year and I hope you enjoy them all!

Posted on Leave a comment

Tech Talk – Net Neutrality, Uber Hacks and Bitcoin’s Latest Price Hike

Net Neutrality Is Under Fatal Attack

Ajit Pai the Republican head of the F.C.C. appointed by President Donald J. Trump has announced today he has decided to go ahead with proceedings to repeal net neutrality with a vote set on December 14, 2017. Net neutrality in a nutshell is a promise that all data on the internet is treated equally, if you want to read on it more here is an excellent website.

“Under my proposal, the federal government will stop micromanaging the internet,” Mr. Pai said in a statement. “Instead, the F.C.C. would simply require internet service providers to be transparent about their practices so that consumers can buy the service plan that’s best for them.”

Mr. Pai argues that killing the democracy of the internet is good only if we are given choices from our dictators…..got it. For those of you who might read this and think net neutrality isn’t that big of a deal or that it’s going to be “great for competition and innovation” have not paid attention to the course of history. Whenever you give corporations more power they almost always use that power to further their profit. As of right now due to an Obama-era regulation broadband internet is treated as a public utility similar to electricity and water, doing so places consumer protections on us to safeguard from abuse of power. You think your internet bill is high now? Just wait until the repeal goes into effect.
 

Uber Is Once Again In The Headlines

 

Uber
Uber logo

It has come to surface that ride-sharing company Uber was the target of a hack in 2013 that stole the emails, names, and physical addresses of more that 57 million riders and drivers! While that is bad in of itself that it took so longer to come to light we can expect this from large companies now (Yahoo, Equifax, etc.). No, what’s REALLY bad is the fact that instead of going through proper legal means to deal with the hack, they paid the hackers $100,000 to destroy the data that they stole. You read that right they paid a ransom and just trusted that the problem would just poof go away! The company told on itself in a blog entry posted by the current CEO. Now I don’t know about you but I’m going to think twice before using Uber again they have a horrible track record as far as scandal is concerned and I value my data not being stolen. This is why it is very important we start teaching our children computer science so we can deal with and understand the magnitude of events such as this.
 

Bitcoin ABOVE $8000

Yesterday was a very interesting day for my BTC portfolio! Bitcoin surged above $8000 for the first time! Mark my words Bitcoin will reach above $10K before the spring of 2018. It’s now or never to get in the game if you want to get started with your own custom real-time trading application I can personally do that for you just send an email to inquiries@jyroneparker.com attach your phone number and I will personally give you a call!
 

 

Posted on 3 Comments

Create A Point Of Sales System With Vue/Laravel + Stripe

Point Of Sales In The Palm Of Your Hand

In today’s tutorial I will be creating a point of sales system utilizing Vue and Laravel with Stripe being our payment processor. The program will allow a stripe account holder to take payments and if on mobile will allow them to scan the card via the device’s camera. It will utilize Laravel Passport for secure API calls and Stripe to handle the payments.

Installing The Dependencies

The app uses two dependencies as of now and those are Stipe and Laravel Passport install them using composer
 

composer require laravel/passportstripe/stripe-php

Now run the migrations (I’m using Laravel 5.5 so the packages are auto-discovered)

php artisan migrate

Now open your app/User.php model and edit the following

<?php
namespace App;
use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}

Next register the Passport routes in your AuthServiceProvider

<?php
namespace App\Providers;
use Laravel\Passport\Passport;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
    ];
    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();
        Passport::routes();
    }
}

Register the api driver in config/auth.php

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

Lastly set the web middleware group

'web' => [
    // Other middleware...
    \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
],

Controller

This application only needs one external controller

php artisan make:controller StripeController

This controller will only contain 2 methods __construct() and charge(). The __construct method will set the StripeApiKey and the charge method actually makes the charge

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class StripeController extends Controller
{
 //
 public function __construct(){
 \Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));
 }
public function charge(Request $request){
 try {
 // Use Stripe's library to make requests...
 $token = \Stripe\Token::create(array(
 "card" => array(
 "number" => $request->card['card_number'],
 "exp_month" => $request->card['expiry_month'],
 "exp_year" => $request->card['expiry_year'],
 "cvc" => $request->card['cvv']
 )
 ));
 \Stripe\Charge::create(array(
 "amount" => $request->amount * 100,
 "currency" => "usd",
 "source" => $token, // obtained with Stripe.js
 "description" => $request->description,
 "receipt_email" => $request->email
 ));
 return response()->json([
 'success' => true
 ]);
 } catch(\Stripe\Error\Card $e) {
 // Since it's a decline, \Stripe\Error\Card will be caught
 return response()->json($e->getJsonBody());
 } catch (\Stripe\Error\RateLimit $e) {
 // Too many requests made to the API too quickly
 return response()->json($e->getJsonBody());
 } catch (\Stripe\Error\InvalidRequest $e) {
 // Invalid parameters were supplied to Stripe's API
 return response()->json($e->getJsonBody());
 } catch (\Stripe\Error\Authentication $e) {
 // Authentication with Stripe's API failed
 // (maybe you changed API keys recently)
 return response()->json($e->getJsonBody());
 } catch (\Stripe\Error\ApiConnection $e) {
 // Network communication with Stripe failed
 return response()->json($e->getJsonBody());
 } catch (\Stripe\Error\Base $e) {
 // Display a very generic error to the user, and maybe send
 // yourself an email
 return response()->json($e->getJsonBody());
 } catch (Exception $e) {
 // Something else happened, completely unrelated to Stripe
 return response()->json($e->getJsonBody());
 }
 }
}

The controller is now finished let’s create the API routes

API Routes

Open the routes/api.php file and add the following routes

<?php
use Illuminate\Http\Request;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::middleware('auth:api')->get('/user', function (Request $request) {
 return $request->user();
});
Route::middleware('auth:api')->post('/charge','StripeController@charge');

The backend is now complete now for the front end.

Vue Component

Get rid of the example component and create a new one called ChargeComponent and add the following content

<template>
 <div class="container">
 <div class="row">
 <div class="col-md-8 col-md-offset-2">
 <div class="panel panel-default">
 <div class="panel-heading">Make A Charge</div>
<div class="panel-body">
 <fieldset>
 <div class="form-group">
 <label class="col-sm-3 control-label" for="amount">Amount</label>
 <div class="col-sm-9">
 <input type="number" class="form-control" id="amount" placeholder="Amount To Charge" v-model="amount">
 </div>
 </div>
 <div class="form-group">
 <label class="col-sm-3 control-label" for="email">Email</label>
 <div class="col-sm-9">
 <input type="email" class="form-control" id="email" placeholder="Email Receipt" v-model="email">
 </div>
 </div>
 <div class="form-group">
 <label class="col-sm-3 control-label" for="description">Description</label>
 <div class="col-sm-9">
 <input type="text" class="form-control" id="description" placeholder="Credit Card Description" v-model="description">
 </div>
 </div>
 <div class="form-group">
 <label class="col-sm-3 control-label" for="card-number">Card Number</label>
 <div class="col-sm-9">
 <input type="text" class="form-control" name="card-number" id="card-number" placeholder="Debit/Credit Card Number" autocomplete="cc-number" v-model="card.card_number">
 </div>
 </div>
 <div class="form-group">
 <label class="col-sm-3 control-label" for="expiry-month">Expiration Date</label>
 <div class="col-sm-9">
 <div class="row">
 <div class="col-xs-3">
 <select class="form-control col-sm-2" name="expiry-month" id="expiry-month" autocomplete="cc-exp-month" v-model="card.expiry_month">
 <option>Month</option>
 <option value="01">Jan (01)</option>
 <option value="02">Feb (02)</option>
 <option value="03">Mar (03)</option>
 <option value="04">Apr (04)</option>
 <option value="05">May (05)</option>
 <option value="06">June (06)</option>
 <option value="07">July (07)</option>
 <option value="08">Aug (08)</option>
 <option value="09">Sep (09)</option>
 <option value="10">Oct (10)</option>
 <option value="11">Nov (11)</option>
 <option value="12">Dec (12)</option>
 </select>
 </div>
 <div class="col-xs-3">
 <select class="form-control" name="expiry-year" autocomplete="cc-exp-year" v-model="card.expiry_year">
 <option value="17">2017</option>
 <option value="18">2018</option>
 <option value="19">2019</option>
 <option value="20">2020</option>
 <option value="21">2021</option>
 <option value="22">2022</option>
 <option value="23">2023</option>
 </select>
 </div>
 </div>
 </div>
 </div>
 <div class="form-group">
 <label class="col-sm-3 control-label" for="cvv">Card CVV</label>
 <div class="col-sm-3">
 <input type="text" class="form-control" name="cvv" id="cvv" placeholder="Security Code" autocomplete="cvc" v-model="card.cvv">
 </div>
 </div>
 <div class="form-group">
 <div class="col-sm-offset-3 col-sm-9">
 <button type="button" class="btn btn-success" v-on:click="createCharge">Pay Now</button>
 </div>
 </div>
 </fieldset>
 </div>
 </div>
 </div>
 </div>
 </div>
</template>
<script>
 export default {
 mounted() {
 console.log('Component mounted.')
 },
 data(){
 return{
 card: {
 card_number: null,
 expiry_year: null,
 expiry_month: null,
 cvv: null
 },
 amount: 0,
 email: null,
 description: null
 }
 },
 methods: {
 createCharge: function(){
 axios.post('/api/charge',{card: this.card, amount: this.amount, description: this.description})
 .then(function(data){
 alert('Success!')
 }).catch(function(error){
 alert(error.message);
 });
 }
 }
 }
</script>

Edit the app.js file to match the following

/**
 * First we will load all of this project's JavaScript dependencies which
 * includes Vue and other libraries. It is a great starting point when
 * building robust, powerful web applications using Vue and Laravel.
 */
require('./bootstrap');
window.Vue = require('vue');
/**
 * Next, we will create a fresh Vue application instance and attach it to
 * the page. Then, you may begin adding components to this application
 * or customize the JavaScript scaffolding to fit your unique needs.
 */
Vue.component('charge-component', require('./components/ChargeComponent.vue'));
const app = new Vue({
 el: '#app'
 });

now install the npm dependencies and run mix

npm install && npm run dev

Enjoy your new app! You can fork the source code here! Be sure to like/subscribe/share and if you want to show your support please check out the shop!

Posted on Leave a comment

The Double Edge Sword Of Automation

Automation Is All Around Us

It’s growing at an unprecedented rate but are we well equipped for this change? In today’s tech talk I speak on the double edge sword of automation, how it can help and hurt a society. I speak on two main examples of automation and how they may/will affect our economy, first is Tesla’s decision to get into the self driving semi truck business, and secondly Bill Gates’ decision to create a smart city.

Tesla’s Trucks

Tesla has announced it has been working on a new self driving semi truck that can form ‘platoons’ with other self driving trucks and follow a lead vehicle. Elon Musk has already met with the Nevada and California Department Of Motor Vehicles to discuss future tests and implementations. This new autonomous fleet will be able (in theory) to run 24/7 when on route cutting down on the number of drivers needed and allowing them to rest while en route eliminating the need for rest stops.
 

Bill Gates’ Smart City

arizona-west-valley
Arizona West Valley

Bill Gates just spent $80 million to purchase 25000 acres in Arizona’s West Valley about 45 minutes outside downtown Phoenix. He plans on building a smart city. His city will be named Belmont, named after his investment firm Belmont Partners. “Belmont will create a forward-thinking community with a communication and infrastructure spine that embraces cutting-edge technology, designed around high-speed digital networks, data centers, new manufacturing technologies and distribution models, autonomous vehicles and autonomous logistics hubs,”.Automation will play a key factor in this utopia of tech, think Futurama type of automation. It’s very interesting to see how this will play out.
 
 
 

The Flip Side

I am all for automation, I think it’s the way of the future and that it is inherently beneficial to society. However I don’t believe our society is adapting at the rate it needs to in order to keep up with automation. Let’s start with Tesla, given the current economic set up what do you think would happen if 90% (you can’t automate every body out of a job) of truckers lost their jobs to automated semi trucks? You do realize that there are 8.7 MILLION truck related jobs right out of which 3.5 million are actual truckers. Now that’s ~1% of the population, imagine that income, that tax revenue just stopping because they were put out of a job and we didn’t have training programs in place to help them transition to another career? Just as jobs are being taken by automation they also open up more specialized jobs that typically pay more than the job they automated, however we as a society need to spend more time training ourselves for it.
Let’s switch back to Bill Gates. The economy of this smart city is obviously going to be tech driven, which means high paying jobs, high net worth homes/neighborhoods, basically a wealthy city. What’s that going to do to the surrounding economies, including Phoenix? As Belmont gets more and more expensive people will move out to cheaper areas, until they get more expensive. If you don’t believe me look at Silicon Valley prior to the .com era! We must be careful to not let automation lead to gentrification but that will only happen if we are vigilant. If you want to get started as a software engineer check out my post about it here! Like/Subscribe/SHARE and leave your comments below!

Posted on Leave a comment

I Have An App Now What?

You Have Spent Countless Hours Building Your App

It’s beautiful, it works, it’s your baby……WHY ISN’T THE WHOLE WORLD ON IT RIGHT NOW?! Trust me I feel you when I was first starting out I had the same feelings of frustration when my apps didn’t take off. I’m going to give you a few tips on how to help generate traffic to your new start up

1) Set Up Your Social Presence

This may seem obvious but the first thing you need to do after you create your application is to create social media accounts for it; Specifically speaking Twitter/Instagram/Facebook. Afterwards you must consistently be active because you have lost time and followers to make up for. If you don’t have the time you might look into outsourcing your brand management to someone on sites like Upwork or write your own automated solutions here is an example for Twitter here.
Social media directly translates to how much social capital your start up has and in the beginning especially social capital is more important that financial capital. Social capital is defined as: The collective value of all social networks (who people know), and the inclinations that arise from these networks to do things for each other (norms of reciprocity). In order to build a brand and get people to trust and believe in your brand you must first build social capital.

2) Reach Out To Local Media

Find the local media outlets in your city and send them emails/phone calls letting them know about your app and what it does. You would be surprised how many would be interested in doing a story on you. The worst that can be said to you is no, the cost-benefit analysis says it’s silly to not even try. Just head over to the contact sections on their websites and start contacting them!
However don’t just contact them, you need to have a pitch preferably 500 words or less to send in that initial email or phone conversation. I’m not going to cover what a good pitch is in this article I am saving that for its own piece just know that your pitch 90% of the time will make or break your request for an interview.  Lastly you always have the option of purchasing an ad (although your money probably be better spent on Facebook/Twitter ads).
 

3) Iterate Often

Just because you have finished your MVP for your app doesn’t mean you can sit back and wait. In fact if you want are serious you will be iterating often! This does two things:

  1. It helps with retention if the users who decided to take a chance on you see that you are continuing to make the experience better they will be more apt to return back to the application.
  2. When new users come to your site and see the evidence of updates they feel safer trying your app for the first time.

In addition to those when you iterate often and took the time to implement SEO/AEO in your app then the engines will pick that up to your benefit. In my humble opinion it is always better to get a product out as quickly as possible then make changes frequently.

Is That It?

No of course not, so much of app marketing depends on your niche, industry sector, yadda yadda. These three tips are only the tip of the iceberg and these tips are pretty  general no matter what kind of app you are doing. If you are interested in a more in depth analysis on how to market your app feel free to send me an email inquiries@jyroneparker.com. If you enjoyed this content please like and share on your social media channels!

Posted on 18 Comments

Why I Gave Up Six Figures Just To Pay My Rent

This Time Two Years Ago

I was living in Hayward, California and working in San Francisco. I was a senior fullstack engineer contracted through my own company working for Sephora. I also had another remote contract in Cincinnati doing the same thing plus I had a couple engineers contracted out on some side projects. In short I was balling hard. I was also not seeing my family I was working 100+ hours consistently and when I finally did have downtime I just wanted to rest. I felt perplexed because I was living my dream at the time I always wanted to go live out in California especially near Oakland. I always wanted to own my own company and I did so what was missing?
I had a couple apps at the time that were bringing in petty change, also around that time I started listening by chance to alot of YouTube videos and podcasts on building residual income. My wife was pregnant with our second child at the time and we had decided to move back to Kentucky to have our daughter and then move back out to Cali. During the back and forth transitions both of my contracts came to an end so we moved back permanently to Kentucky. At this point we had a nice savings we could live off of while I look for contracts in Kentucky SPOILER ALERT Kentucky’s IT sector is garbage there is very little here and what is here is outdated .NET
Even though it was kind of aggravating that I was having such hard time finding work back home I had comfort knowing I could always move back to California and resume what I was doing. Still I wanted to build my empire here. What I noticed is that where there is a lack of on site contracts there is an influx of companies who need custom web and mobile apps I capitalized on this low hanging fruit.

My First Breakthrough

While on my contract hunt I came across an anesthesia company based out of Indiana that needed a custom solution built to handle their collections accounts. Basically they were getting excel sheets every month with dozens to hundreds of accounts that needed to be collected on and were manually processing checks. I wrote them an in-house web app that is connected to Stripe that allows them to take credit/debit/bitcoin/HSA/FSA payments and put their clients on payment schedules to pay off their debt. It also can import their excel files and auto file their collections and sort them. Not only did I get paid for creating the app, I also receive 1% of all money processed via the app. This residual income alone pays for most of my bills including rent. There is something incredibly addicting to getting paid daily for work you did once, I wanted to concentrate my efforts on building my residual income so I stopped consulting full time. This was hands down the hardest and the scariest leap of faith I had to make but it was necessary. Doing this allowed me to focus my efforts recruiting more opportunities to do what I did for the anesthesia company.

Expanding To Other Areas

I know an exponential amount of people need websites rather than web apps for their individual and business pages. I already have servers that I run my app back-ends off of so I decided to rent out some virtual real estate. I started reaching out to companies and individuals asking offering to them a complete web package.

  • Web site
  • Unlimited Email
  • Free SSL
  • Hosting

All for $250 plus $2.99/mo for hosting fees. I spun up an email server and some web servers and I was ready to go. Since I have the software engineer/devops background that I do I am able to run all operations myself by automating 90% of the process with the other 10% to be finished soon. I schedule a date with the clients and create the website with them on the phone usually takes ~2 hours. After that essentially I’m receiving $3/mo for free. That might not sound like alot but check the math if I do 2 web sites a week:

  • 2 websites/week * 52 weeks = 104 sites/year
  • 104 ($ 250 + $ 2.99 / month) = $ 26,000 + $ 310.96 / mo
  • After 5 years I would have made $130,000 ($250 to make site) and my residual income would be $1554.80/month

The $130,000 is nice and all but I am more interested in $1554.80/month that I get just to host the website! The awesome part is I offer various plans besides the shared $2.99/mo.

What Are The Benefits?

Some of you reading this might be asking was it worth leaving guaranteed six figures to only make a fraction? To that I say absolutely yes! I value my time infinitely more than my money. I get to take my son to the bus stop in the morning and pick him up in the afternoon all the while being at home with my wife and daughter. That in of itself makes it worth it I don’t miss ANY important event in regards to my children plus they get to see their father working which I think is important in ingraining work ethic in them.
 

On our way to Amsterdam

I get to travel more now than when I was consulting, I mean it’s not like I have to ask for a day off from my boss. If I want to go to California for the weekend it’s a straight flight from Cincinnati for the low just book a flight and go! This was extremely useful when my startup got selected to go to the TNW 2017 conference in Amsterdam like 10 days before the opening day! If I decide to take a small contract and need to go onsite for the first few days then I can do so with little adjustment to my schedule. This lifestyle actually enables me to make comparable income to what I was making working 40+ hours a week at the corporate plantation.
Lastly the awesome benefit that is focusing on building residual income allows me to spend more time on personal development. For example I have had more time to play violin and I am teaching my son how to code using Coji. I am perfecting my Japanese, mastering my meditation, and learning to love the things I didn’t know I had an affinity for.
 
 

What’s Next?

I plan on continuing doing what I am currently doing however I will start taking 1-2 major contracts a year (as I write this I am currently in the running for a contract at Facebook cross your fingers for the dude).  I am finishing my SAAS app that will fully automate my web creation/hosting process so I can focus on marketing my services en mass. I implore everyone to find ways to bring in residual or passive income, think outside the box. I have a friend whose brother is making ~$1000/mo from bubble gum machines, he has about 5 spread out around town and they each bring roughly $200 each per month; There are low hanging fruit opportunities everywhere you just have to look. Not everyone is interested in living 100% off residual  income and that’s fine and dandy but everyone should have multiple streams of income in their household, there is both enough supply and demand. Please like and share this article for all those who may find value.

Posted on 1 Comment

Setting Your Twitter Account To Auto Like Posts Of Interest

Auto Likes

Are a great way to interact with accounts who might be potential followers and is a great way for your to explore your potential audience. I will show you how to take the existing twitter microservice we have and extend it to stream a filter of tweets that track keywords, then like that tweet. If you have no idea what I am talking about then perhaps you should start here when we began this project.
 

Extending twitter.js

Open up the node script we created in the last tutorial, twitter.js and inside we are going to add the code needed to track tweets that meet a certain filter requirement. However it is important that we stream it so we get fresh content coming in.

var filter = T.stream('statuses/filter',{track: ['#30days30sites','#100DaysOfCode','#301DaysOfCode','#Webapp','#laravel','#vuejs']});
filter.on('tweet',function(tweet){
 T.post('favorites/create', { id: tweet.id_str },function(data){
 console.log(data);
 });
});

In the example above I am tracking all tweets in real-time that contain #30days30sites, #100DaysOfCode, #301DaysOfCode, #Webapp, #laravel and #vuejs. Then whenever the ‘tweet’ event fires I create a favorite (same thing as a like) and grabs the tweet id. Of course in your example you are going to want to change what you track. These 6 lines of code do wonders for me, there is something special about random people liking your tweets, also many people come and visit my profile after seeing I liked something on theirs. SInce launching this app I have definitely noticed an uptick in the amount of accounts that follow me.
In the future I plan on extending this to incorporate AI algorithms to parse what exactly was said and retweet or respond depending on the context or the tweet. Perhaps when I have the time I will do a livestream of the event. If there is anything you would like to see me do leave it in a comment below.

Posted on 2 Comments

Automating Your DMs With Nodejs

In The Last Tutorial

We created a Laravel/Vue app that allows us to automate and schedule our Twitter posts. Now we are going to add a Node.js microservice that will send an auto DM to those who follow you on Twitter. This adds a personal touch when you gain new followers and makes people more apt to pay attention to your tweets. If you don’t have the app from the last tutorial, you can download it here. Otherwise open up your terminal to the project root and let’s get started.
 

Node Script

This node script will use the twit npm module to create a Twitter stream listening to our own account. When the follow event is fired we will grab the source id of the user that sent us a follow request, after which we will send a DM to that user id with a welcome message. Let’s start by adding the twit dependency and the dotenv dependency.

npm install twit dotenv --save

Now create a new file called twitter.js and fill with the following:

require('dotenv').config()
var Twit = require('twit')
var T = new Twit({
 consumer_key: process.env.TWITTER_CONSUMER_KEY,
 consumer_secret: process.env.TWITTER_CONSUMER_SECRET,
 access_token: process.env.TWITTER_ACCESS_TOKEN,
 access_token_secret: process.env.TWITTER_ACCESS_TOKEN_SECRET,
 timeout_ms: 60*1000, // optional HTTP request timeout to apply to all requests.
})var stream = T.stream('user');
stream.on('connected', function(response){
 console.log('Connected!')
});
stream.on('follow',function(data){
 console.log(data.source.id);
 T.post('direct_messages/events/new',{
 "event": {
 "type": "message_create",
 "message_create": {
 "target": {
 "recipient_id": data.source.id
 },
 "message_data": {
 "text": "Thanks for the follow! Be sure to check out my blog https://jyroneparker.com",
 }
 }
 }
})});

The dotenv dependency allows us to use the same .env file to grab our Twitter app credentials that we used in our Laravel app. As you can see the stream fires on different events we just choose the follow and the connected events. Lastly we need to run the script make sure you have supervisor or some other program running it as a daemon.

node twitter.js

If you want to extend the functionality read up on the Twitter stream documentation here. Otherwise add some auto like functionality to your bot.

Posted on 7 Comments

How To Automate Your Twitter Posts With Laravel and Vue

Twitter Marketing Is Huge

Well for my platform it is anyway, whenever I create a new app or website Twitter is the first social network that I turn to. It’s fast, the analytics are on point, and it’s easy to use, my only issue is that I am busy coding and whatnot to Tweet as much as I would like or need to in order to optimize my reach. This leaves me with two options:

  1. Pay someone to manage my account for me
  2. Learn the Twitter API and write my own automation program to manage it myself

The idea of paying another person to manage my social media just made my stomach and my wallet hurt so the OBVIOUS choice is to use the API. Now let me tell you thisn  API is DENSE there is a lot you can do with it (click here for the docs) so I will only focus on one aspect in this tutorial, sending posts. The first basic application that I wrote was a simple post scheduler, it allows me to create as many posts as I want, set a date-time to post at, then a Laravel job executes at the desired time, then deletes the entry from the database. This basic application has saved me tremendous time because now I can just schedule all my important tweets weeks or months early!
 

Registering Your Twitter App

Before you can do any actual coding you need to register your app on Twitter, head over to the developer portal and create your app. The home page will show a list of your Twitter apps, if this is your first time then you won’t have any apps, click on create new app.
Fill out all the mandatory fields then proceed you should see a screen that shows you your Consume Key and Consumer Secret. Copy those down and also create some access tokens. These access tokens are for writing Twitter apps that only interact with your OWN account. Copy down the access token and the access token secret and that’s all you have to do. Now let’s code!
 

App Components

 

The main page will be a Vue.js app that allows you to add new tweets, and an area below to edit and delete them. In a traditional SPA manner the app will interact with an API for all it’s calls. The backend will consist of one model (Tweet), one controller (TweetController), and one Job ProcessTweet, pretty simple stuff let’s begin.  Start by creating your Laravel application.

laravel new tweeter && cd tweeter && php artisan make:auth

This app only has one composer dependency add it

composer require thujohn/twitter

In the config/app.php make sure to add the following provider and alias

'providers' => [
    Thujohn\Twitter\TwitterServiceProvider::class,
]
'aliases' => [
    'Twitter' => Thujohn\Twitter\Facades\Twitter::class,
]

Lastly run the following command to import the twitter config/ttwitter.php file and modify inserting your Twitter app credentials

php artisan vendor:publish --provider="Thujohn\Twitter\TwitterServiceProvider"

Tweet Model

Now create the Tweet model along with it’s migration

php artisan make:model -m Tweet

The Tweet model only has two attributes a string that holds the content that is limited to 140 characters and a timestamp for when you want the tweet to be published.

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateTweetsTable extends Migration
{
 /**
 * Run the migrations.
 *
 * @return void
 */
 public function up()
 {
 Schema::create('tweets', function (Blueprint $table) {
 $table->increments('id');
 $table->string('content',140);
 $table->timestamp('publish_timestamp');
 $table->timestamps();
 });
 }/**
 * Reverse the migrations.
 *
 * @return void
 */
 public function down()
 {
 Schema::dropIfExists('tweets');
 }
}

The Tweet model is pretty bare bones

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Tweet extends Model
{
 //
 public $fillable = [
 'content',
 'publish_timestamp'
 ];
}

Go ahead and run your migrations we are done with models, now to make our RESTful controller.

RESTful Controller and Routes

Create a resource controller for our Tweet model

php artisan make:controller --resource TweetController

The controller is basic I purposely left out validation and such as a homework exercise for you, but the gist is basic CRUD operations that return JSON

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Tweet;
use App\Jobs\ProcessTweet;
class TweetController extends Controller
{
 /**
 * Display a listing of the resource.
 *
 * @return \Illuminate\Http\Response
 */
 public function index()
 {
 //
 return response()->json(Tweet::all());
 }
/**
 * Show the form for creating a new resource.
 *
 * @return \Illuminate\Http\Response
 */
 public function create()
 {
 //
 }
/**
 * Store a newly created resource in storage.
 *
 * @param \Illuminate\Http\Request $request
 * @return \Illuminate\Http\Response
 */
 public function store(Request $request)
 {
 //create the tweet
 $tweet = Tweet::Create([
 'content' => $request->content,
 'publish_timestamp' => \Carbon\Carbon::parse($request->publish_timestamp)
 ]);
 //Add tweet to the queue
 ProcessTweet::dispatch($tweet)->delay(\Carbon\Carbon::parse($request->publish_timestamp,'America/New_York')->diffInSeconds(\Carbon\Carbon::now('America/New_York')));
//return json
 return response()->json($tweet);
 }/**
 * Display the specified resource.
 *
 * @param int $id
 * @return \Illuminate\Http\Response
 */
 public function show($id)
 {
 //
 return response()->json(Tweet::findOrFail($id));
 }/**
 * Show the form for editing the specified resource.
 *
 * @param int $id
 * @return \Illuminate\Http\Response
 */
 public function edit($id)
 {
 //
 }/**
 * Update the specified resource in storage.
 *
 * @param \Illuminate\Http\Request $request
 * @param int $id
 * @return \Illuminate\Http\Response
 */
 public function update(Request $request, $id)
 {
 //
 $tweet = Tweet::findOrFail($id);
 $tweet->fill([
 'content' => $request->content,
 'publish_timestamp' => \Carbon\Carbon::parse($request->publish_timestamp)
 ]);
 //return json
 return response()->json($tweet);
 }
/**
 * Remove the specified resource from storage.
 *
 * @param int $id
 * @return \Illuminate\Http\Response
 */
 public function destroy($id)
 {
 //
 Tweet::destroy($id);
 }
}

Notice the ProcessTweet job? We will implement that next but for now open up the routes/api.php file and add the following resource route

<?php
use Illuminate\Http\Request;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::middleware('auth:api')->get('/user', function (Request $request) {
 return $request->user();
});
Route::resource('/tweet','TweetController');

Now our Vue application (patience it’s coming) can interact with our backend. Now let’s add our ProcessTweet job and we will be finished on the backend.

ProcessTweet Job

In order to schedule the tweets to post at any given time you must utilize Laravel Jobs this will allow you to schedule your events to fire at a certain point in time. If you aren’t familiar with jobs and queues please look at my previous post because I will not be covering setting up queues in this tutorial, otherwise create a new job

php artisan make:job ProcessTweet

In the handle method we simply call the Twitter API and send the tweet then delete it from the database

<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Twitter;
class ProcessTweet implements ShouldQueue
{
 use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
 public $tweet;
 /** * Create a new job instance.
 *
 * @return void
 */
 public function __construct(\App\Tweet $tweet)
 {
 //
 $this->tweet = $tweet;
 }
/**
 * Execute the job.
 *
 * @return void
 */
 public function handle()
 {
 //post the tweet
 Twitter::postTweet(['status' => $this->tweet->content, 'format' => 'json']);
 //delete the tweet from database
 \App\Tweet::destroy($this->tweet->id);
 }
}

Your backend is now functioning run your queue worker and test around with it or continue to creating the Vue application.

Getting The Front End Together

We need to add vue-resource to call our api so let’s add that first

npm install --save vue-resource

Also update the resources/js/app.js file

/**
 * First we will load all of this project's JavaScript dependencies which
 * includes Vue and other libraries. It is a great starting point when
 * building robust, powerful web applications using Vue and Laravel.
 */
require('./bootstrap');
window.Vue = require('vue');
const resource = require('vue-resource');
Vue.use(resource);
/**
 * Next, we will create a fresh Vue application instance and attach it to
 * the page. Then, you may begin adding components to this application
 * or customize the JavaScript scaffolding to fit your unique needs.
 */
Vue.component('tweet-component', require('./components/TweetComponent.vue'));
const app = new Vue({
 el: '#app'
});

As you can see the example-component has been replaced with the tweet-component rename your ExampleComponent.vue to TweetComponent.vue and update it with the following contents

<template>
 <div class="container">
 <div class="row">
 <div class="col-md-8 col-md-offset-2">
 <div class="panel panel-default">
 <div class="panel-heading">Tweet Scheduler</div>
<div class="panel-body">
 <div class="form-group">
 <input class="form-control" placeholder="Content" v-model="newTweet.content">
 </div>
 <div class="form-group">
 <input class="form-control" type="datetime-local" placeholder="Description" v-model="newTweet.publish_timestamp">
 </div>
<div class="form-group">
 <button class="btn btn-success" v-on:click="addTweet(newTweet)">Add Tweet</button>
 </div>
 <ul v-if="ready" class="list-group">
 <li v-for="post in tweets" class="list-group-item clearfix">
 {{post.content}}
 <span class="pull-right button-group">
 <button class=" btn btn-default" v-on:click="openEditTweet(post)">Edit</button>
 <button class=" btn btn-danger" v-on:click="deleteTweet(post)">Delete</button>
 </span>
 </li>
 </ul>
</div>
 </div>
 </div>
 </div>
 <!-- Modal -->
<div id="editModal" class="modal fade" role="dialog">
 <div class="modal-dialog">
<!-- Modal content-->
 <div class="modal-content">
 <div class="modal-header">
 <button type="button" class="close" data-dismiss="modal">&times;</button>
 <h4 class="modal-title">{{selectedTweet.content}}</h4>
 </div>
 <div class="modal-body">
 <div class="form-group">
 <input class="form-control" placeholder="Content" v-model="selectedTweet.content">
 </div>
 <div class="form-group">
 <input class="form-control" type="datetime-local" placeholder="Publish At" v-model="selectedTweet.publish_timestamp">
 </div>
 <div class="form-group">
 <button class="btn btn-info" v-on:click="editTweet(selectedTweet)">Edit Tweet</button>
 </div>
 </div>
 <div class="modal-footer">
 <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
 </div>
 </div>
</div>
 </div>
 </div>
</template>
<script>
export default {
 mounted() {
 console.log('Component mounted.')
 },
 data(){
 return {
 tweets: {},
 newTweet:{
 'content': '',
 'publish_timestamp': ''
 },
 selectedTweet:{
 'content': '',
 'publish_timestamp': ''
 },
 ready: false
 }
 },
 created(){
 this.$http.get('/api/tweet').then(function(data){
 this.tweets = data.data;
 this.ready = true;
 });
 },
 methods: {
 addTweet: function(tweet){
 this.$http.post('/api/tweet',tweet).then(function(data){
 this.tweets.unshift({content:tweet.content,publish_timestamp:tweet.publish_timestamp});
 });
 },
 editTweet: function(tweet){
 this.$http.put('/api/tweet/'+tweet.id,this.selectedTweet).then(function(data){
 let index = this.tweets.indexOf(tweet);
 this.tweets[index] = tweet;
 alert('Updated!');
 $("#editModal").modal('hide');
 });
 },
 openEditTweet: function(tweet){
 console.log(tweet);
 this.selectedTweet = tweet;
 $("#editModal").modal({show: true});
},
 deleteTweet: function(tweet){
 this.$http.delete('/api/tweet/'+tweet.id).then(function(data){
 let index = this.tweets.indexOf(tweet)
 this.tweets.splice(index, 1);
 });
}
}
}
</script>

Open up your resources/assets/sass/app.scss file and add the following fade transition

.fade-enter-active, .fade-leave-active {
 transition: opacity .5s
}
.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
 opacity: 0
}

Run your npm build script as well as your queue worker and start tweeting! You can get the full source code here, and as always please subscribe to my blog via email or push notifications, share, and leave your comment below! If you would like to add a real-time nodejs microservice to your app then read here!