Real Python: Python Turtle for Beginners

Real Python: Python Turtle for Beginners

https://ift.tt/2Kpdk1Z

In this step-by-step course, you’ll learn the basics of Python programming with the help of a simple and interactive Python library called turtle. If you’re a beginner to Python, then this course will definitely help you on your journey as you take your first steps into the world of programming. The Python turtle library comes with a similar interactive feature that gives new programmers a taste of what it’s like to work with Python.

In this course, you will:

  • Understand what the Python turtle library is
  • Learn how to set turtle up on your computer
  • Program with the Python turtle library
  • Grasp some important Python concepts and turtle commands
  • Develop a short but entertaining game using what you’ve learned

[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short & sweet Python Trick delivered to your inbox every couple of days. >> Click here to learn more and see examples ]

Python

via Planet Python https://ift.tt/1dar6IN

December 15, 2020 at 11:55AM

Smith & Wesson M&P15-22 Pistol Makes Its Triumphant Return

Smith & Wesson M&P15-22 Pistol Makes Its Triumphant Return

https://ift.tt/3nnQ2bi

For AR pistol fans, Smith & Wesson just made an exciting announcement marking the return of the M&P15-22. Chambered in .22 LR, the M&P15-22 comes compact with a 25-round magazine, making it suitable for a wide range of purposes.

The new S&W M&P9 M2.0 Compact OR ships with seven different optics mounting plates.

RELATED STORY

Smith & Wesson Releases Optics-Ready M&P9 M2.0 Compact OR

The Smith & Wesson M&P15-22 Pistol Returns

With an 8-inch barrel, the M&P15-22 measures just 25.4 inches fully extended. In a home defense situation, the pistol remains extremely compact for working corners. Measuring just 22.8 inches with the SB Tactical SBA3 adjustable pistol arm brace collapsed, the M&P15-22 becomes highly portable as well. We could easily see this serving as a truck gun, trainer or fun plinker for a day on the range.

A polymer receiver helps keep weight down. The pistol weighs just 53.6 ounces overall. Meanwhile a carbon steel barrel with a 1:15-inch twist provides the heart of the platform. It also includes a functioning charging handle and shell deflector, welcome additions.

An M&P handguard features M-LOK slots for accessory attachment. A two-position safety, one-point QD sling swivel and threaded barrel with muzzle flash provide familiar AR-style components.

A typical blow back action completes a multi-purpose pistol that comes with no sights included. However, the platform includes a full-length Picatinny rail on top. Simply top it with your reflex or red dot of choice, and you’re off and running.

Compact and lightweight, the Smith & Wesson M&P15-22 makes a bold return.

In an era where .223 ammo proves increasingly difficult to find, adding a .22 LR to the stable provides another option. The S&W M&P15-22 retails for $504 . For even more info, please visit smith-wesson.com.

Smith & Wesson M&P15-22 Pistol Specs

  • Caliber: .22 LR
  • Action: Semi-Auto Blow Back
  • Capacity: 25+1
  • Barrel Length: 8 inches
  • Rifling: 1:15-inch Twist
  • Front Sight: N/A
  • Rear Sight: N/A
  • Width: 2 inches
  • Overall Height: 7 inches
  • Overall Length: 22.8 inches (collapsed), 25.4 inches (extended)
  • Weight: 53.6 ounces
  • Barrel Material: Carbon Steel
  • Receiver Material: Polymer
  • Receiver Finish: Black
  • MSRP: $504

The post Smith & Wesson M&P15-22 Pistol Makes Its Triumphant Return appeared first on Personal Defense World.

guns

via Personal Defense World https://ift.tt/2Arq2GB

December 15, 2020 at 12:01PM

SCOTTLOCK – A Robust and Portable AR-15 Rifle Retention System

SCOTTLOCK – A Robust and Portable AR-15 Rifle Retention System

https://ift.tt/34aXQFw

SCOTTLOCK – A Robust and Portable AR-15 Rifle Retention System

Posted in AR-15, Daily News by with No Comments
Tags: , , ,

SCOTTLOCK - A Robust and Portable AR-15 Rifle Retention System

Rifle retention systems are nothing new in the world of firearms. Law enforcement agencies across the country use them in one form or another. However, for the average Joe, rifle retention systems would inevitably become a costly modification to your personal vehicle, and what’s more, is that once these modifications are made they can’t easily be transferred. The SCOTTLOCK portable rifle retention system promises to be a robust yet portable way to secure your AR-15 rifle within your vehicle.

SCOTTLOCK - A Robust and Portable AR-15 Rifle Retention System

SCOTTLOCK – A Robust and Portable AR-15 Rifle Retention System

From the SOTTLOCK website:

SCOTTLOCK™ is an incredibly robust portable security system created to protect a police officer’s tactical AR-15 rifle while keeping it close at hand.  SCOTTLOCK™ was designed by law enforcement officers with tactical situations in mind.   Having your AR-15 in a case in your trunk is not helpful when seconds count.  Have it with you.  Lives depend on it.

The SCOTTLOCK™ is constructed of two steel plates covered with a military-grade polymer coating.  Your rifle is sandwiched between a layer of protective foam.  Designed, developed, and deployed by active duty Law Enforcement / SWAT personnel.  It will protect all* AR-15’s, without damaging them.

SCOTTLOCK - A Robust and Portable AR-15 Rifle Retention System

Features:

  • Made completely in the USA
  • Patent Pending
  • Fits mil-spec AR-15 rifles (.223 and .556 calibers)
  • Weighs approximately 4.2 lbs
  • Approximately 8.5″ x 3.5″
  • Prevents manipulation of the trigger, safety, magazine release, and assembly pins
  • Water and solvent resistant
  • Works with many different types of locks (keyed, combination, etc)
  • Money-Back Guarantee
  • Lock, cable, and rifle not included 😉

SCOTTLOCK - A Robust and Portable AR-15 Rifle Retention System

Accessories for the SCOTTLOCK are available like a Steel/Wall floor anchor that secures either a retaining chain or cable to both the firearm and the frame of your car. SCOTTLOCK also sells Rekeyable padlocks and gun magnets as well. The SCOTTLOCK gun lock currently sells for $231.00 and will fit mil-spec AR-15 rifles, however, according to the website, rifles equipped with the MAGPUL B.A.D. Lever cannot be secured with the SCOTTLOCK.



We are committed to finding, researching, and recommending the best products. We earn commissions from purchases you make using the retail links in our product reviews.

Learn more about how this works

.

guns

via The Firearm Blog https://ift.tt/2JX8W99

December 14, 2020 at 09:30AM

The Best Ways to Clean Grout

The Best Ways to Clean Grout

https://ift.tt/2KszGiP


Most substances wipe off tile pretty easily, but getting the surrounding grout back to its original pearly white state is much harder. Because it is so narrow and coarse, scrubbing grout lines clean can be a hassle (unless you like spending hours hunched over with a toothbrush). Luckily, we have three methods to make cleaning grout a breeze.

Steam cleaner

As we have tested before, a handheld steam cleaner with a brush attachment does wonders for blasting dirt off of grout. Since the steamer will blast dirty water on the tiles below, make sure you go in with a top-to-bottom method, and be sure to wipe off all the dirty water as you clean.

Magic eraser

A Magic Eraser (generic name: melamine foam) is great at brightening grout. Just wet the eraser and squeeze out the extra water. Scrub along the grout and watch it make quick work of any gunk and grime.

Bleach gel

Squirt some toilet cleaning bleach gel along grout lines in your shower. Roll up a length of toilet paper into a long snake and carefully press it against the bleach. Let it sit one hour, then remove the toilet paper, rinse, and wipe dry.

G/O Media may get a commission

Tech

via Lifehacker https://lifehacker.com

December 14, 2020 at 10:05AM

Making a Spark Wheel

Making a Spark Wheel

https://ift.tt/2WeqQbd

Making a Spark Wheel

Link

Builder Laura Kampf designed and created this dangerous but awesome looking machine which generates a huge stream of sparks for creating epic long-exposure photos. When she got stumped about the ignition system, she turned to her pal Adam Savage to help come up with a creative solution.

fun

via The Awesomer https://theawesomer.com

December 14, 2020 at 12:31PM

Laravel Jetstream Subscription Billing With Stripe Checkout and Customer Portal

Laravel Jetstream Subscription Billing With Stripe Checkout and Customer Portal

https://ift.tt/2K4IDz3


Laravel Jetstream was recently released and is a great starting point for a new project. I prefer the Livewire stack, which is used in this guide, but there is also an Inertia.js + Vue option.

I recently started a project using Jetstream since it gives you a lot of the same features as Laravel Spark, minus the subscription billing. But, I still needed billing. So, I decided to add Stripe Checkout and customer portal, offloading all of the billing front-end to Stripe.

Here’s how I did it from start to finish.



Start a new Laravel project

laravel new cool-project

cd cool-project

You’ll want to set up your preferred database at this point and ensure that your application can connect to it.



Install Jetstream

Check out the Jetstream documentation if you’re not familiar with it. Install Jetstream with the teams option.

composer require laravel/jetstream

php artisan jetstream:install livewire --teams

Publish the Jetstream views in your application so we can make a few updates later.

php artisan vendor:publish --tag=jetstream-views

And, migrate the database.

php artisan migrate

Lastly, let’s build the front-end.

npm install && npm run dev



Install Laravel Cashier

Why do we need Cashier? Because it’s still a great option to handle the Stripe webhooks for us. And, we’ll extend it to handle a custom webhook.

Install Cashier:

composer require laravel/cashier

If you don’t have a Stripe account, you’ll want to set that up and add your API keys.

Add the following to your .env file.

STRIPE_KEY=your-stripe-key
STRIPE_SECRET=your-stripe-secret
Enter fullscreen mode

Exit fullscreen mode



Team Billing

This is where I fork from the typical Cashier installation. I prefer team billing, but Cashier, by default, expects billing to be set up by user.

You can tell Cashier what model to use by adding an .env variable.

Add the following to your .env file.

CASHIER_MODEL=App\Models\Team

We also need to update the Cashier database migrations to use teams instead of users. Let’s publish the migrations to our project so we can make those updates.

php artisan vendor:publish --tag="cashier-migrations"

In migration 2019_05_03_000001_create_customer_columns.php, replace any instance of “users” with “teams”.

In migration 2019_05_03_000002_create_subscriptions_table.php, replace any instance of “user_id” with “team_id”.

And, let’s migrate the database again.

php artisan migrate

Next, you’ll add the Billable trait to your Team model.

use Laravel\Cashier\Billable;

class Team extends JetstreamTeam
{
    use Billable;
}
Enter fullscreen mode

Exit fullscreen mode

That’s it for the initial setup. Now, it’s time to add the billing front-end and handle the Stripe webhooks.



Stripe Checkout, Customer Portal and Webhooks

Let’s create a controller to handle the checkout and portal links.

php artisan make:controller StripeController

And, update the file with the following:

<?php

namespace App\Http\Controllers;

use Exception;
use Illuminate\Http\Request;

class StripeController extends Controller
{
    public function checkout(Request $request) {
        \Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));
        $user = $request->user();
        $plan = $request->input('plan');

        try {
            $session = \Stripe\Checkout\Session::create([
                'customer_email' => $user->email,
                'payment_method_types' => ['card'],
                'mode' => 'subscription',
                'client_reference_id' => $user->currentTeam->id,
                'line_items' => [[
                    'price' => $plan,
                    'quantity' => 1,
                ]],
                'success_url' => route('dashboard'),
                'cancel_url' => route('billing'),
            ]);
        }
        catch (Exception $e) {
            return response()->json([
                'error' => [
                    'message' => $e->getMessage(),
                ]
            ], 400);
        }

        return response()->json(['sessionId' => $session['id']]);
    }

    public function portal(Request $request)
    {
        return $request->user()->currentTeam->redirectToBillingPortal(
            route('dashboard')
        );
    }
}

Enter fullscreen mode

Exit fullscreen mode

Let’s make a controller to handle the Stripe session.checkout.completed webhook. This is the webhook that is called after a person successfully sets up their subscription and is not handled by Cashier.

php artisan make:controller WebhookController

And, update the file with the following:

<?php

namespace App\Http\Controllers;

use App\Models\Team;
use Illuminate\Support\Facades\DB;
use Laravel\Cashier\Http\Controllers\WebhookController as CashierController;

class WebhookController extends CashierController
{
    public function handleCheckoutSessionCompleted(array $payload)
    {
        $data = $payload['data']['object'];
        $team = Team::findOrFail($data['client_reference_id']);

        DB::transaction(function () use ($data, $team) {
            $team->update(['stripe_id' => $data['customer']]);

            $team->subscriptions()->create([
                'name' => 'default',
                'stripe_id' => $data['subscription'],
                'stripe_status' => 'active'
            ]);
        });

        return $this->successMethod();
    }
}

Enter fullscreen mode

Exit fullscreen mode

One gotcha is that we need to add an exception in the CSRF middlware for the Stripe webhooks.

Update the VerifyCsrfToken.php class with the following:

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'stripe/*'
    ];
}
Enter fullscreen mode

Exit fullscreen mode

Another gotcha is that we need to make sure the “stripe_id” column is fillable on the Team model.

Update the Team model with the following:

class Team extends JetstreamTeam
{
    ...

    protected $fillable = [
        'name',
        'personal_team',
        'stripe_id'
    ];

    ...
}
Enter fullscreen mode

Exit fullscreen mode

Finally, add the routes for these new controller actions.

Add the following to the routes file:

Route::middleware(['auth:sanctum', 'verified'])->group(function () {
    Route::post('/stripe/checkout', [StripeController::class, 'checkout'])->name('stripe.checkout');
    Route::get('/stripe/portal', [StripeController::class, 'portal'])->name('stripe.portal');
});

Route::post(
    'stripe/webhook',
    '\App\Http\Controllers\WebhookController@handleWebhook'
);
Enter fullscreen mode

Exit fullscreen mode



Jetstream Billing View

We still need to give the user a way to access this new team billing functionality. Let’s add Stripe.js and create the Jetstream-flavored billing view. This view is a good start and works, but it could be slicker.

Add Stripe.js to resources/views/layouts/app.blade.php in the <head> section.

<script src="https://js.stripe.com/v3/"></script>
Enter fullscreen mode

Exit fullscreen mode

Create a new view at resources/views/billing.blade.php and update with the following:

<x-app-layout>
    <x-slot name="header">
        <h2 class="font-semibold text-xl text-gray-800 leading-tight">
             ()
        </h2>
    </x-slot>

    <div>
        <div class="max-w-7xl mx-auto py-10 sm:px-6 lg:px-8">
            <div class="mt-10 sm:mt-0">
                <x-jet-action-section>
                    <x-slot name="title">
                        
                    </x-slot>

                    <x-slot name="description">
                        
                    </x-slot>

                    <x-slot name="content">
                        <p></p>

                        @if (Auth::user()->currentTeam->subscribed('default'))
                            <div class="mt-6">
                                <a class="btn" href="">
                                    
                                </a>
                            </div>
                        @else
                            <div class="mt-4">
                                <button data-plan="price_XXX" class="btn checkout-btn">
                                    
                                </button>
                            </div>
                            <div class="mt-4">
                                <button data-plan="price_XXX" class="btn checkout-btn">
                                    
                                </button>
                            </div>
                        @endif
                    </x-slot>
                </x-jet-action-section>
             </div>
        </div>
    </div>
</x-app-layout>

<script>
var handleFetchResult = function(result) {
    if (!result.ok) {
        return result.json().then(function(json) {
            if (json.error && json.error.message) {
                throw new Error(result.url + ' ' + result.status + ' ' + json.error.message);
            }
        });
    }
    return result.json();
};

var createCheckoutSession = function(plan) {
    return fetch("/stripe/checkout", {
        method: "POST",
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify({
            plan: plan
        })
    }).then(handleFetchResult);
};

var stripe = Stripe('');
var checkoutBtns = document.getElementsByClassName('checkout-btn');

for (var i = 0; i < checkoutBtns.length; i++) {
    checkoutBtns[i].addEventListener("click", function(e) {
        var plan = e.target.getAttribute("data-plan");

        createCheckoutSession(plan).then(function(data) {
        stripe
            .redirectToCheckout({
                sessionId: data.sessionId
            })
            .then(handleResult);
        });
    })
}
</script>


Enter fullscreen mode

Exit fullscreen mode

You’ll want to update the “Subscribe” buttons’ data-plan attributes with your own Stripe product price IDs.

Let’s add a route to make this billing view work. Add the following to your routes file.

Route::middleware(['auth:sanctum', 'verified'])->group(function () {
    Route::get('/billing', function() {
        return view('billing');
    })->name('billing');
});
Enter fullscreen mode

Exit fullscreen mode

Finally (finally!), we’ll add a “Billing” link to the Jetstream navigation dropdown.

In navigation-dropdown.blade.php, add the following in the “Team Management” section.

<!-- Team Billing -->
<x-jet-dropdown-link href="">
    
</x-jet-dropdown-link>
Enter fullscreen mode

Exit fullscreen mode



That’s it! 🎉

This was super long, but I hope it helped someone. Laravel Jetstream is a great starting point and Stripe checkeout and customer portal make it relatively easy to add subscription and billing management.

programming

via Laravel News Links https://ift.tt/2dvygAJ

December 13, 2020 at 08:45PM

Crater Invoice 4.0.0

Crater Invoice 4.0.0

https://craterapp.com


Complete Invoicing Solution

Crater is free for life with all of the below features catered
towards the freelance and small business community.

Invoices

Create and send professional
invoices to clients and save time
for what really matters.

Estimate

Create a quick and detailed
quote including prices, discounts,
inventory and more.

Track Payment

Easily keep a detailed note of
your transactions and never lose
a payment history.

Expenses

Keep track of your spending on various services with our easy to use expense tracking.

Reports

Get detailed reports on your
invoices with one or various
clients.

Taxes

Input different tax
types & calculate them
as simple or compound tax per-item or directly on invoice total.

Send your invoices to the clients instantly, track your payments
or check a detailed client history, Crater App for iOS and Android
let you manage everything from your phone.

Professional Invoice Templates

Choose between three specially designed templates
for creating invoices and estimates.

programming

via Laravel News Links https://ift.tt/2dvygAJ

December 13, 2020 at 08:45PM

Drug Reverses Age-Related Mental Decline Within Days

Drug Reverses Age-Related Mental Decline Within Days

https://ift.tt/2IJayUB

The University of California San Francisco issued this glowing announcement of some new research:
Just a few doses of an experimental drug can reverse age-related declines in memory and mental flexibility in mice, according to a new study by UC San Francisco scientists. The drug, called ISRIB, has already been shown in laboratory studies to restore memory function months after traumatic brain injury, reverse cognitive impairments in Down Syndrome, prevent noise-related hearing loss, fight certain types of prostate cancer, and even enhance cognition in healthy animals. In the new study, published Dec. 1, 2020, in the open-access journal eLife, researchers showed rapid restoration of youthful cognitive abilities in aged mice, accompanied by a rejuvenation of brain and immune cells that could help explain improvements in brain function. "ISRIB’s extremely rapid effects show for the first time that a significant component of age-related cognitive losses may be caused by a kind of reversible physiological "blockage" rather than more permanent degradation," said Susanna Rosi, PhD, Lewis and Ruth Cozen Chair II and professor in the departments of Neurological Surgery and of Physical Therapy and Rehabilitation Science. "The data suggest that the aged brain has not permanently lost essential cognitive capacities, as was commonly assumed, but rather that these cognitive resources are still there but have been somehow blocked, trapped by a vicious cycle of cellular stress," added Peter Walter, PhD, a professor in the UCSF Department of Biochemistry and Biophysics and a Howard Hughes Medical Institute investigator. "Our work with ISRIB demonstrates a way to break that cycle and restore cognitive abilities that had become walled off over time…." "We’ve seen how ISRIB restores cognition in animals with traumatic brain injury, which in many ways is like a sped-up version of age-related cognitive decline," said Rosi, who is director of neurocognitive research in the UCSF Brain and Spinal Injury Center and a member of the UCSF Weill Institute for Neurosciences. "It may seem like a crazy idea, but asking whether the drug could reverse symptoms of aging itself was just a logical next step." Forbes also reports that "In all studies, the researchers have observed no serious side effects."


Read more of this story at Slashdot.

geeky

via Slashdot https://slashdot.org/

December 12, 2020 at 07:03PM

Fantastic Four Finally Entering the Marvel Cinematic Universe and More Huge News

Fantastic Four Finally Entering the Marvel Cinematic Universe and More Huge News

https://ift.tt/3m6DALu


It’s official. The Fantastic Four are joining the Marvel Cinematic Universe. Jon Watts (Spider-Man Homecoming) will direct.

The news came at the end of a long, densely packed Marvel Studios presentation during Disney’s 2020 Investor’s Day event. We’ll have much more soon.

This story is developing…

geeky,Tech

via Gizmodo https://gizmodo.com

December 10, 2020 at 08:57PM