How A 120mm Tank Round Works

http://img.youtube.com/vi/gJz8cVUvYws/0.jpg

Here’s something informational for Sunday, Nicholas Moran explaining exactly how a modern 120mm (AKA 120×570mm NATO, the type used by the M1A2 Abrams and the German Leopard 2) APFSDS round works.

  • He has a dummy blue round to demonstrate the features. “All the projectiles are color coded. Explosive, for example, would be green with yellow lettering.” APFSDS rounds are black.
  • “The aft cap is the one piece which is left behind after a modern round is fired, and this takes up a lot less room than a traditional shell casing rattling around inside the tank once you fire it.”
  • A long primer rod runs up the middle for more even propellent burning.
  • “A modern tank does have a firing pin. It’s electrically fired, but it has a firing pin. It looks just like a firing pin you’d expect from a rifle, except it’s about yay long…Electricity goes through the firing pin, sets off the primer, which sets off the propellant, which gives you
    the big boom.”

  • There are even emergency hand crank firing systems with dynamos to use if the electrical system goes down.
  • “The rest of the shell casing is made of a form of cellulose, and it is burned up in the explosion. So the aft cap is sufficient to seal the breach instead of requiring the entire casing to expand as you you’d find on a traditional round.”
  • “The catch is that this is simply not as robust as a metal shell.” Which is why the loader has to inspect rounds for scratches or bulges to the water-resistant coating. That could cause the round to break apart or misfire. “This is a bad thing.”
  • Which is why tank crews practice misfire drills to ensure safe handling of rounds so they don’t spread loose propellant all over the tank’s interior.
  • “The kinetic energy penetrator is itself a dart… it’s got fins at the back to keep the pointy end forwards, and it is kept centered as it goes down the tube by these sabot petals.”
  • “Modern sabots seem to have settled on three of these petals per projectile. Once the projectile has left the muzzle, the air is caught by the petals and they are peeled away.”
  • The discarded petals are a danger. “This is why sabot rounds such as APFSDS or M-PT should not be fired over the heads of friendly infantry.”
  • “The dart goes that way, hits metal, and basically punches through, taking little bits of metal inside with them. This is called a spall. These little fragments metal are extremely unhealthy to anyone or anything inside the vehicle which it hits.”
  • “However, if the armor is too thin to produce spalling, you get what is known as over-penetration. So you make a dart-sized hole on one side of the vehicle, a dart-sized hole on the far side of the vehicle, and dart sized holes on anything in-between, and outside of brown pants for the crewmen, quite possibly nothing else.”
  • “If so you’re firing such a target, you’re probably better off using a shaped charge round such as HEAT.”
  • He then show off a dummy HEAT projector, which has a funky blunt circular head that “in effect clears the air as a wind shield for the decidedly non-aerodynamic flat bit. The main body of the round also performs something of a stabilizing function and thirdly provides adequate standoff or room for the penetrating jet to form.”
  • “Here is a metal cone surrounded by explosives. The explosives detonate, the cone collapses the liner.”
  • Text popped up on screen at 9 minutes in notes that the penetrating jet is not high temperature plasma.
  • Here’s another video that provides a visualized simulation of how APFSDS rounds work.

    Lawrence Person’s BattleSwarm Blog

    South Korean dude rejects being called racist for hating Little Mermaid: “You keep asking us to watch sh*tty movies”

    https://www.louderwithcrowder.com/media-library/why-is-little-mermaid-bombing-in-south-korea.png?id=34131336&width=980

    Allow me to admit up front I could be jumping to conclusions. There is a story in the news about a raaaaacist backlash to Disney’s The Little Mermaid. A video of a based South Korean chad is going viral being asked about a raaaaacist backlash to a movie. Perhaps he’s being asked about a raaaaacist backlash to a different movie? If that is the case, allowed me to apologize on behalf of all of us here at the Louder with Crowder Dot Com website.

    Now check out my man here.

    That’s nonsense. So you keep asking us to watch the sh*tty movies you make, right? Why do we have to watch them? This has nothing to do with racism, alright? You make a weird movie, and if we don’t watch it because we don’t agree with your agenda, it’s like they’re trying to lecture us, asking "Why don’t you agree?’ But who are they to lecture anyone?"

    Hell yeah, brother. You have now become the second most based Asian on all of the Internets. Shout out to #1:

    The "Western media" in question could be Western journalisming content creators CNN. They posted a piece of content titled "‘The Little Mermaid’ tanks in China and South Korea amid racist backlash from some viewers." The CNN blogger who created the content points out that while having a black Ariel has been "celebrated elsewhere" (like in America, and in… America), a handful of cherry-picked Asian cinephiles disagree with the casting choice.

    In the case of South Korea, CNN cites one single person who expressed disappointment on Instagram.

    [The Little Mermaid] brought in just 19.5 million yuan ($2.7 million) in its first five days, compared with 142 million yuan (nearly $20 million) for “Spider-Man: Across the Spider-Verse” in the first five days of that film’s opening, according to Chinese box office tracker Endata.

    Similar sentiment was found on social media in South Korea. On Instagram, one user wrote that the movie had been “ruined” for them, adding “#NotMyAriel.”

    Right. It could be raaaaacist backlash. Or, your movie can get just suck. The Spider-Man: Across the Spider-Verse movie that has made at least five times more money? The lead character has brown skin and the leading lady may or may not be trans.

    There are two things at play here. The first is that Hollywood makes movies counting on the Asian market to make them their money. It’s why John Cena had to cuck himself for saying the word "Taiwan." If a movie doesn’t do well overseas, it’s a global failure.

    This brings us to point number two. In the woke progressive hive mind, nothing is ever their fault when normies reject the Left pushing an agenda. It can only be the fault of an -ism or a -phobia. It started with the girl Ghostbuster movie in 2016, which looked like a bucket of sh*t from the first trailer. When moviegoers decided not to spend their money on a bucket of sh*t, filmmakers lashed out at the audience. A single YouTube comment from someone who said "the movie ruined their childhood" was used in the marketing to shame people into seeing the movie if they didn’t want to be labeled an -ist.

    If you make movies that don’t look like they suck, people will spend money to go see your movie. This isn’t something that needs to be explained.

    ><><><><><><

    Brodigan is Grand Poobah of this here website and when he isn’t writing words about things enjoys day drinking, pro-wrestling, and country music. You can find him on the Twitter too.

    Facebook doesn’t want you reading this post or any others lately. Their algorithm hides our stories and shenanigans as best it can. The best way to stick it to Zuckerface? Bookmark LouderWithCrowder.com and check us out throughout the day! Also, follow us on Instagram and Twitter.

    Louder With Crowder

    These $20 Welding Gloves Will Make You a Campfire Hero

    https://s3.us-east-1.amazonaws.com/images.gearjunkie.com/uploads/2023/06/welding-mitts-scaled.jpg

    welding glove giving thumbs up over a fire

    It never fails. Every time the sun goes down and I pull out my mitts, somebody laughs out loud and asks, “What the hell are those?!” And every time I tell them, they scoff and shake their head. Another non-believer.

    It’s OK — I know that before this fire burns down to ash, they will don these dirty old mitts over and over again. And inevitably they’ll admit, “I was wrong. These are awesome!”

    I’ve seen it happen enough times to know, this is the way. And truth be told, I really do not recall why I wanted a pair of welding gloves in the first place. I’m not a metal worker, and I can’t say I’d ever used such burly hand protection in the past. All I know is that one year, I received a pair of gloves — this pair — as a gift, and I knew instantly they were destined for the campsite.

    Now, I will pass this wisdom, this secret, to you. These $20 mitts will give you more value than your favorite tent, headlamp, or sleeping bag. And they will add more fun to your campouts to boot!

    What the Heck Are Welding Gloves?

    Before I get too deep into extolling the virtues of welding mitts, you probably need to know what exactly I’m talking about. Welding gloves, aka fire mitts, aka (my favorite) forge gauntlets are heavy-duty hand protection that cover the hands and most of the wearer’s forearm.

    They’re designed to protect against extreme heat, electric shock, and ultraviolet and infrared radiation. They have nothing to do with Infinity Stones, though you will be tempted to talk like Thanos while wearing them — and rightly so.

    pair of welding gloves, crossed
    (Photo/Adam Ruggiero)

    These mitts are most often made from animal hide (nature usually does it best), either cow, pig, deer, or elk. The heavier the hide, the more protective the glove, so cow and elk usually offer the most protection.

    Vegan alternatives do exist, though I have not personally tried them and therefore cannot attest to their overall performance. Check out the Vegan Foundry for more information if you’d prefer non-animal-derived alternatives.

    For the sake of this tribute, however, I will focus on my cowhide leather gauntlets.

    Welding Gloves for the Campsite

    Let’s get down to (scorching hot) brass tacks: Why am I so hyped on welding gloves as a camp accessory? The long answer is community, togetherness, and making the most of your precious time outdoors — especially in the company of those you hold dear.

    But the short answer is fire. More specifically, the god-like power to bend the ferocity and majesty of fire to your will. To the non-glove-enlightened layperson, I’m talking about picking up white-hot burning logs from a veritable cauldron of fire, and moving them about to stoke the flames to your liking.

    Let me paint a picture with which you are all too familiar: Your once-mighty campfire has burned down, and only a single, flickering flame laps at a thick log, charred on one side, but seemingly untouched on the other. If only you could turn the wood and feed those hungry embers, your evening under the stars would stretch on into the night — more drinks, more stories, more time.

    So you grab the first branch you can find and start fencing with the log, hoping to coax it over with some combination of pokes and swats. Of course, this inevitably ends in the collapse of the delicate, Jenga-like wood pyramid, immediately snuffing out whatever hope of flame remained, casting everyone around the fire pit into the smokey death throes you’ve wrought.

    Sound familiar? If only you had a pair of forearm-length welder’s mitts rated to 932 degrees Fahrenheit, you could have simply grabbed the log, turned it over like a half-cooked hot dog, and won the awe of your campmates.

    Believe me, I know — I’ve been that hero many times over.

    More Than Just Log-Turners

    Moving logs around a hot campfire like pieces on a chessboard has proven the most common use for me. But it is far from these gloves’ only application around the campsite.

    Seasoned car campers know that a few nights under the stars doesn’t necessarily mean settling for freeze-dried camp meals. A trusty cast iron skillet or Dutch oven is perfectly suited to meal prep over an open fire. But that sizzlin’ hot skillet isn’t gonna pull itself out of the fire — uh oh, did you forget your trout-shaped oven mitts?

    Fire gloves to the rescue! Pick up that piping hot pan with one hand or two, by the handle or cradle it from the glowing red bottom — you’ve got the power!

    Plus, these thick mitts offer protection from more than just searing heat. Did your Frisbee land in a cactus patch? Gloves. Good lord, what’s that crawling in the tent?! Gloves. Keys fall in deer scat? Gloves.

    In just about any scenario where you want your bare hands protected from things that are too hot, sticky, prickly, or creepy, welder’s gloves come in handy.

    When you’re ready to level up your campfire game, you can find OZERO welding gloves — or any other brand — at a variety of independent supply stores, giant box retailers like The Home Depot, and online at Amazon for around $20.

    No need to thank me. I’m just your average, everyday campfire hero.

    The post These $20 Welding Gloves Will Make You a Campfire Hero appeared first on GearJunkie.

    GearJunkie

    Crashing Two Bullets Into Each Other in Slow-Motion

    https://theawesomer.com/photos/2023/06/colliding_bullets_smarter_every_day_t.jpg

    Crashing Two Bullets Into Each Other in Slow-Motion

    Link

    Inspired by a pair of Civil War-era bullets that collided and fused together, Destin from Smarter Every Day wanted to see if he could replicate the unlikely situation on camera. It took an impressive amount of planning and engineering to set up the shot and perform the experiment in a safe and precise way.

    The Awesomer

    Working with third party services in laravel

    https://laravelnews.s3.amazonaws.com/images/working-with-third-party-services-in-laravel.png

    So a little over two years ago, I wrote a tutorial on how you should work with third-party services in Laravel. To this day, it is the most visited page on my website. However, things have changed over the last two years, and I decided to approach this topic again.

    So I have been working with third-party services for so long that I cannot remember when I wasn’t. As a Junior Developer, I integrated API into other platforms like Joomla, Magento, and WordPress. Now it mainly integrates into my Laravel applications to extend business logic by leaning on other services.

    This tutorial will describe how I typically approach integrating with an API today. If you have read my previous tutorial, keep reading as a few things have changed – for what I consider good reasons.

    Let’s start with an API. We need an API to integrate with. My original tutorial was integrating with PingPing, an excellent uptime monitoring solution from the Laravel community. However, I want to try a different API this time.

    For this tutorial, we will use the Planetscale API. Planetscale is an incredible database service I use to get my read-and-write operations closer to my users in the day job.

    What will our integration do? Imagine we have an application that allows us to manage our infrastructure. Our servers run through Laravel Forge, and our database is over on Planetscale. There is no clean way to manage this workflow, so we created our own. For this, we need an integration or two.

    Initially, I used to keep my integrations under app/Services; however, as my applications have gotten more extensive and complicated, I have needed to use the Services namespace for internal services, leading to a polluted namespace. I have moved my integrations to app/Http/Integrations. This makes sense and is a trick I picked up from Saloon by Sam Carrè.

    Now I could use Saloon for my API integration, but I wanted to explain how I do it without a package. If you need an API integration in 2023, I highly recommend using Saloon. It is beyond amazing!

    So, let’s start by creating a directory for our integration. You can use the following bash command:

    mkdir app/Http/Integrations/Planetscale

    Once we have the Planetscale directory, we need to create a way to connect to it. Another naming convention I picked up off of the Saloon library is to look at these base classes as connectors – as their purpose is to allow you to connect to a specific API or third party.

    Create a new class called PlanetscaleConnector in the app/Http/Integrations/Planetscale directory, and we can flesh out what this class needs, which will be a lot of fun.

    So we must register this class with our container to resolve it or build a facade around it. We could register this to “long” way in a Service Provider – but my latest approach is to have these Connectors register themselves – kind of …

    declare(strict_types=1);

     

    namespace App\Http\Integrations\Planetscale;

     

    use Illuminate\Contracts\Foundation\Application;

    use Illuminate\Http\Client\PendingRequest;

    use Illuminate\Support\Facades\Http;

     

    final readonly class PlanetscaleConnector

    {

    public function __construct(

    private PendingRequest $request,

    ) {}

     

    public static function register(Application $app): void

    {

    $app->bind(

    abstract: PlanetscaleConnector::class,

    concrete: fn () => new PlanetscaleConnector(

    request: Http::baseUrl(

    url: '',

    )->timeout(

    seconds: 15,

    )->withHeaders(

    headers: [],

    )->asJson()->acceptJson(),

    ),

    );

    }

    }

    So the idea here is that all the information about how this class is registered into the container lives within the class itself. All the service provider needs to do is call the static register method on the class! This has saved me so much time when integrating with many APIs because I don’t have to hunt for the provider and find the correct binding, amongst many others. I go to the class in question, which is all in front of me.

    You will notice that currently, we have nothing being passed to the token or base url methods in the request. Let’s fix that next. You can get these in your Planetscale account.

    Create the following records in your .env file.

    PLANETSCALE_SERVICE_ID="your-service-id-goes-here"

    PLANETSCALE_SERVICE_TOKEN="your-token-goes-here"

    PLANETSCALE_URL="https://api.planetscale.com/v1"

    Next, these need to be pulled into the application’s configuration. These all belong in config/services.php as this is where third-party services are typically configured.

    return [

    // the rest of your services config

     

    'planetscale' => [

    'id' => env('PLANETSCALE_SERVICE_ID'),

    'token' => env('PLANETSCALE_SERVICE_TOKEN'),

    'url' => env('PLANETSCALE_URL'),

    ],

    ];

    Now we can use these in our PlanetscaleConnector under the register method.

    declare(strict_types=1);

     

    namespace App\Http\Integrations\Planetscale;

     

    use Illuminate\Contracts\Foundation\Application;

    use Illuminate\Http\Client\PendingRequest;

    use Illuminate\Support\Facades\Http;

     

    final readonly class PlanetscaleConnector

    {

    public function __construct(

    private PendingRequest $request,

    ) {}

     

    public static function register(Application $app): void

    {

    $app->bind(

    abstract: PlanetscaleConnector::class,

    concrete: fn () => new PlanetscaleConnector(

    request: Http::baseUrl(

    url: config('services.planetscale.url'),

    )->timeout(

    seconds: 15,

    )->withHeaders(

    headers: [

    'Authorization' => config('services.planetscale.id') . ':' . config('services.planetscale.token'),

    ],

    )->asJson()->acceptJson(),

    ),

    );

    }

    }

    You need to send tokens over to Planetscale in the following format: service-id:service-token, so we cannot use the default withToken method as it doesn’t allow us to customize it how we need to.

    Now that we have a basic class created, we can start to think about the extent of our integration. We must do this when creating our service token to add the correct permissions. In our application, we want to be able to do the following:
    List databases.
    List database regions.
    List database backups.
    Create database backup.
    Delete database backup.

    So, we can look at grouping these into two categories:
    Databases.
    Backups.

    Let’s add two new methods to our connector to create what we need:

    declare(strict_types=1);

     

    namespace App\Http\Integrations\Planetscale;

     

    use App\Http\Integrations\Planetscale\Resources\BackupResource;

    use App\Http\Integrations\Planetscale\Resources\DatabaseResource;

    use Illuminate\Contracts\Foundation\Application;

    use Illuminate\Http\Client\PendingRequest;

    use Illuminate\Support\Facades\Http;

     

    final readonly class PlanetscaleConnector

    {

    public function __construct(

    private PendingRequest $request,

    ) {}

     

    public function databases(): DatabaseResource

    {

    return new DatabaseResource(

    connector: $this,

    );

    }

     

    public function backups(): BackupResource

    {

    return new BackupResource(

    connector: $this,

    );

    }

     

    public static function register(Application $app): void

    {

    $app->bind(

    abstract: PlanetscaleConnector::class,

    concrete: fn () => new PlanetscaleConnector(

    request: Http::baseUrl(

    url: config('services.planetscale.url'),

    )->timeout(

    seconds: 15,

    )->withHeaders(

    headers: [

    'Authorization' => config('services.planetscale.id') . ':' . config('services.planetscale.token'),

    ],

    )->asJson()->acceptJson(),

    ),

    );

    }

    }

    As you can see, we created two new methods, databases and backups. These will return new resource classes, passing through the connector. The logic can now be implemented in the resource classes, but we must add another method to our connector later.

    <?php

     

    declare(strict_types=1);

     

    namespace App\Http\Integrations\Planetscale\Resources;

     

    use App\Http\Integrations\Planetscale\PlanetscaleConnector;

     

    final readonly class DatabaseResource

    {

    public function __construct(

    private PlanetscaleConnector $connector,

    ) {}

     

    public function list()

    {

    //

    }

     

    public function regions()

    {

    //

    }

    }

    This is our DatabaseResource; we have now stubbed out the methods we want to implement. You can do the same thing for the BackupResource. It will look somewhat similar.

    So the results can be paginated on the listing of databases. However, I will not deal with this here – I would lean on Saloon for this, as its implementation for paginated results is fantastic. In this example, we aren’t going to worry about pagination. Before we fill out the DatabaseResource, we need to add one more method to the PlanetscaleConnector to send the requests nicely. For this, I am using my package called juststeveking/http-helpers, which has an enum for all the typical HTTP methods I use.

    public function send(Method $method, string $uri, array $options = []): Response

    {

    return $this->request->send(

    method: $method->value,

    url: $uri,

    options: $options,

    )->throw();

    }

    Now we can go back to our DatabaseResource and start filling in the logic for the list method.

    declare(strict_types=1);

     

    namespace App\Http\Integrations\Planetscale\Resources;

     

    use App\Http\Integrations\Planetscale\PlanetscaleConnector;

    use Illuminate\Support\Collection;

    use JustSteveKing\HttpHelpers\Enums\Method;

    use Throwable;

     

    final readonly class DatabaseResource

    {

    public function __construct(

    private PlanetscaleConnector $connector,

    ) {}

     

    public function list(string $organization): Collection

    {

    try {

    $response = $this->connector->send(

    method: Method::GET,

    uri: "/organizations/{$organization}/databases"

    );

    } catch (Throwable $exception) {

    throw $exception;

    }

     

    return $response->collect('data');

    }

     

    public function regions()

    {

    //

    }

    }

    Our list method accepts the parameter organization to pass through the organization to list databases. We then use this to send a request to a specific URL through the connector. Wrapping this in a try-catch statement allows us to catch potential exceptions from the connectors’ send method. Finally, we can return a collection from the method to work with it in our application.

    We can go into more detail with this request, as we can start mapping the data from arrays to something more contextually useful using DTOs. I wrote about this here, so I won’t repeat the same thing here.

    Let’s quickly look at the BackupResource to look at more than just a get request.

    declare(strict_types=1);

     

    namespace App\Http\Integrations\Planetscale\Resources;

     

    use App\Http\Integrations\Planetscale\Entities\CreateBackup;

    use App\Http\Integrations\Planetscale\PlanetscaleConnector;

    use JustSteveKing\HttpHelpers\Enums\Method;

    use Throwable;

     

    final readonly class BackupResource

    {

    public function __construct(

    private PlanetscaleConnector $connector,

    ) {}

     

    public function create(CreateBackup $entity): array

    {

    try {

    $response = $this->connector->send(

    method: Method::POST,

    uri: "/organizations/{$entity->organization}/databases/{$entity->database}/branches/{$entity->branch}",

    options: $entity->toRequestBody(),

    );

    } catch (Throwable $exception) {

    throw $exception;

    }

     

    return $response->json('data');

    }

    }

    Our create method accepts an entity class, which I use to pass data through the application where needed. This is useful when the URL needs a set of parameters and we need to send a request body through.

    I haven’t covered testing here, but I did write a tutorial on how to test JSON:API endpoints using PestPHP here, which will have similar concepts for testing an integration like this.

    I can create reliable and extendible integrations with third parties using this approach. It is split into logical parts, so I can handle the amount of logic. Typically I would have more integrations, so some of this logic can be shared and extracted into traits to inherit behavior between integrations.

    Laravel News

    Defense Distributed Once Again Proves Gun Control Obsolete With A 0% Pistol

    https://www.ammoland.com/wp-content/uploads/2023/06/0percentpistol-500×281.jpg

    Defense Distributed Once Again Proves Gun Control Obsolete With A 0% Pistol
    Defense Distributed Once Again Proves Gun Control Obsolete With A 0% Pistol

    AUSTIN, Texas — In 2013, Cody Wilson printed the Liberator. The Liberator was the first 3D-printed firearm. His goal was simple. It was to make all gun control obsolete.

    Wilson hoped that the gun world would embrace 3D printing and other methods of getting around gun control. Wilson’s dream came to fruition. Talented gun designers used computer-aided drawing (CAD) software to design and print firearms at home on 3D printers that cost as low as $100. At the same time, companies like Polymer80 sprung up to sell kits that let home users finish a piece of plastic into an unserialized firearm frame.

    The revolution caused the Biden administration to order the Bureau of Alcohol, Tobacco, Firearms and Explosives (ATF) to make new rules to prevent the dissemination of these kits that he and other anti-gun zealots demonized as “ghost guns.” The ATF rolled out a new rule that would make it a crime to sell a frame blank with a jig, but the market adapted. This adaptation once again forced the ATF’s hand. Two days after Christmas in 2022, the ATF would give anti-gun groups a belated gift. It would unilaterally declare frame blanks firearms. Giffords, Brady, and Everytown celebrated the closing of the so-called “ghost gun loophole” and the banning of “tools of criminals.”

    Their victory would be short-lived as the injunctions from Federal courts in Texas started rolling in. First, it was 80% Arms, then Wilson’s Defense Distributed, and finally, Polymer80, meaning the original kits were back on the market. Although most of the industry was now back to selling the original product, liberal states started banning the sale of unfinished firearm frames and receivers.

    Defense Distributed would take these states head-on by releasing a 0% AR-15 lower receiver for the company’s Ghost Gunner, a desktop CNC machine. The 0% lower was a hit with the gun-building community. All the user had to do was mill out the middle section of the lower and attach it to a top piece and a lower portion. Even if a state were to ban 80% AR-15 lowers, it would be impossible to ban a block of aluminum, although states like California have tried to ban the Ghost Gunner itself.

    Wilson and Ghost Gunner are now tackling handguns by releasing a 0% handgun fire control unit (FCU).

    All the user has to do is mill out the FCU using the Ghost Gunner 3 (aluminum) or the Ghost Gunner 3S (stainless steel) and install Gen 3 Glock parts. The user can then print the chassis on a 3D printer using the files supplied by Defense Distributed or buy a pre-printed chassis from the Ghost Gunner website and add a complete slide and barrel.

    Mr. Wilson, who has faced some controversy over a relationship with a 16-year-old girl who lied about her age and claimed to be 18, recently had the case against him dropped, which frees him up to keep attacking ATF regulations.

    “This is a homecoming ten years in the making,” Wilson told AmmoLand News. “The 0% pistol allows anyone to make a Glock type pistol in their own home with just a Ghost Gunner and a 3D-printer.”

    This move by Defense Distributed, along with advancements in 3D printing, is the downfall of gun control. No matter what bans the government institutes, the market will adapt. With the rise of cheap 3D printers and machines like the Ghost Gunner, it has never been easier to circumvent gun control laws.

    Let me make it clear, 3D-printing and CNC machining firearms are not illegal on a federal level. I also do not believe there is a will in Congress to attack that aspect of gun control because it will highlight that technology is empowering the people. The machines are available everywhere, from Amazon to Microcenter. The files live in cyberspace, where anyone can download them. Even if the files were banned (huge First Amendment legal challenge), they still would be traded anonymously on the Dark Web and by using VPN services.

    The signal cannot be stopped. The internet has ushered in the fall of gun control, and there is nothing the Biden administration or states like California can do about it.


    About John Crump

    John is a NRA instructor and a constitutional activist. John has written about firearms, interviewed people of all walks of life, and on the Constitution. John lives in Northern Virginia with his wife and sons and can be followed on Twitter at @crumpyss, or at www.crumpy.com.

    John Crump

    AmmoLand Shooting Sports News