Why Are You Closed? Metal Edition

Why Are You Closed? Metal Edition

https://ift.tt/3olqgoo

Why Are You Closed? Metal Edition

Link

More than a decade ago, a video went viral featuring a rather hostile man who was really perturbed that the doors to a Toronto shopping mall were locked. Now, Andre Antunes has dusted off this Internet gem and given it the heavy metal soundtrack that it always deserved.

fun

via The Awesomer https://theawesomer.com

January 5, 2021 at 11:00AM

Laravel DataTables Tutorial With Example

Laravel DataTables Tutorial With Example

https://ift.tt/38dXkJu


In this tutorial, we will learn how to use Laravel DataTables step by step with an example. The Datatable is a very common functionality for most of the CMS.

Most of the DataTable plugin or package provides common functionalities like listing, filtering, searching, sorting, pagination, etc. If we create all these functionalities manually then it will take lots of time. Instead, we can use available Laravel DataTables like jQuery DataTable, yajra DataTable, etc. These two are mostly used in CMS.

Here I am going to share how can you easily install that package and use Laravel DataTables to list out the data. Are you ready guys?

Let’s start.

Please note that this Laravel Datatables demo has created in Laravel 8 version

Laravel DataTables Integration

01 Install Laravel

We are presuming that you already have a Laravel project set up on your machine either it’s a fresh installation or an existing Laravel application. If you don’t have it then run the following command to install a new Laravel application.

composer create-project --prefer-dist laravel/laravel datatable-demo

Or, you may install the Laravel Installer as a global Composer dependency after that you just need to run the laravel new datatable-demo to create a new Laravel application instead of the above long command.

composer global require laravel/installer

laravel new datatable-demo

You are now done with Laravel installations. Let’s move on next step.

02 Install Yajra Laravel Datatables Package

Most of the Laravel developers know the term “Packages”, if not then read the following definition:

A package is a piece of reusable code that can be dropped into any application and be used without any tinkering to add functionality to that code. You don’t need to know what is happening inside, only what the API for the class(es) are so that you can archive your goal

We don’t need to worry about the packages. It has some files and code inside it but one thing is for sure that it will solve our problem faster than we might think.

We hope you are now clear with the packages. Let’s go ahead.

Now, open your command-line tool and navigate it to the datatable-demo directory where we just installed the project. We are using Git Bash as a command-line tool, you can use your own or you can install Git Bash from here as per your OS: https://git-scm.com/downloads

Run the following commands:

composer require yajra/laravel-datatables-oracle

Now, wait until your installation finishes the process

yajra datatables

You are now done with packages installations. Let’s move on next step.

03 Register Service Provider In config/app.php

To register the service provider, open the config/app.php file. And add the following line in 'providers' array at the end

'providers' => [
 .....
 Yajra\DataTables\DataTablesServiceProvider::class,
]

Also, add the following line to the 'aliases' array at the end. You can use any aliases as you want like we have used ‘DataTables’ but you can also use aliases like ‘DT’, ‘myTable’, ‘Table, etc.

We shouldn’t worry about the aliases, It’s just a short form of service provider class so that we don’t need to write the whole path while using it in Controllers. Hope you are getting it. Great!

'aliases' => [
 .....
 'DataTables' => Yajra\DataTables\Facades\DataTables::class,
]

04 Dummy Records

Follow this step only if you don’t have enough data in your system else skip this step. We will create some dummy data with the help of inbuilt tinker tool. If you don’t know about tinker then read following definition and use.

The php artisan tinker provides you a Psy Shell console. The tinker console allows you to interact with your application like you can generate fake data for your application, you can test Laravel relationship, you can perform CRUD operation on any Model (Create User, Delete User, etc.) and much more.

Hope you now got the basic idea of a tinker. Now, run the following command to enter into the tinker shell.

php artisan tinker

After entering into the tinker (REPL) shell, run the below command:

User::factory()->count(20)->create()

Above command will create new 20 users into our system. Let’s move ahead.

05 Register Route In routes/web.php

Open the routes/web.php file to add or register a new route. You can create routes as per your Controller and Method. Here, we have UserController, and in that, we have index() method. So now our route will look like as below:

Route::get('users', '[email protected]')->name('users.index');

06 Create Controller

Let’s now create a controller. You can create it by copying any other controller code or run the following command in your command-line tool.

php artisan make:controller UserController -r

After running the above command a new file has been created into your app/Http/Controllers/UserController.php.

Open the controller file and write down the following code into it.

app/Http/Controllers/UserController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use DataTables;
use App\Models\User;

class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        if ($request->ajax()) 
        {
            $data = User::get();

            return Datatables::of($data)
                    ->addIndexColumn()
                    ->make(true);
        }
        return view('users');
    }
}

07 Create View

Now, create the users.blade.php file in resources/views/users.blade.php path.

<!DOCTYPE html>
<html>
   <head>
      <title>Laravel Datatables Tutorial | ScratchCode.io</title>
      <meta name="csrf-token" content=""/>
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" />
      <link href="https://cdn.datatables.net/1.10.19/css/dataTables.bootstrap4.min.css" rel="stylesheet">
   </head>
   <body>
      <div class="container">
         <h1 class="mb-5 mt-5">Laravel Datatables Tutorial | ScratchCode.io</h1>
         <table class="table table-bordered data-table">
            <thead>
               <tr>
                  <th>ID</th>
                  <th>Name</th>
                  <th>Email</th>
               </tr>
            </thead>
            <tbody>
            </tbody>
         </table>
      </div>
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script>  
      <script src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
      <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
      <script src="https://cdn.datatables.net/1.10.19/js/dataTables.bootstrap4.min.js"></script>
      <script type="text/javascript">
         $(function () {
           var table = $('.data-table').DataTable({
               processing: true,
               serverSide: true,
               ajax: "",
               columns: [
                   {data: 'DT_RowIndex', name: 'DT_RowIndex'},
                   {data: 'name', name: 'name'},
                   {data: 'email', name: 'email'},
               ]
           });
         });
         
      </script>
   </body>
</html>

Hurray! we are now done with all the steps. Now, run the below command to serve our application.

php artisan serve

Now, access the below URL in your favorite browser.

http://127.0.0.1:8000/users

Laravel DataTables Output

You might be seeing the same output for Laravel Datatables as our like below:

laravel datatables ajax

Additionally, read our guide:

  1. Best Way to Remove Public from URL in Laravel
  2. Error After php artisan config:cache In Laravel
  3. Specified Key Was Too Long Error In Laravel
  4. AJAX PHP Post Request With Example
  5. How To Use The Laravel Soft Delete
  6. How To Add Laravel Next Prev Pagination
  7. cURL error 60: SSL certificate problem: unable to get local issuer certificate
  8. Difference Between Factory And Seeders In Laravel
  9. Laravel: Increase Quantity If Product Already Exists In Cart
  10. How To Calculate Age From Birthdate
  11. How to Convert Base64 to Image in PHP
  12. Check If A String Contains A Specific Word In PHP
  13. How To Find Duplicate Records in Database
  14. How To Convert Word To PDF In Laravel
  15. Laravel One To One Relationship Tutorial

That’s it for now. We hope this article helped you to learn Laravel DataTables.

Please let us know in the comments if everything worked as expected, your issues, or any questions. If you think this article saved your time & money, please do comment, share, like & subscribe. Thank you in advance. 🙂 Keep Smiling! Happy Coding!

programming

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

January 4, 2021 at 08:33PM

Simple Larvel upload with Livewire 2

Simple Larvel upload with Livewire 2

https://ift.tt/3rSEUpg


In this tutorial, we’ll cover uploading a CSV file in Laravel with Livewire. This tutorial is written with the assumption you know how to get a Laravel app up and that Livewire is already installed.

Step 1

Create a new component and view from the command line

artisan livewire:make UploadCsv

This will create two files:

CLASS: app/Http/Livewire/UploadCsv.php

VIEW: resources/views/livewire/upload-csv.blade.php

Step 2

Code up the component. We’ll go through the main lines after the snippet

<?php

namespace App\Http\Livewire;

use Livewire\Component;
use Livewire\WithFileUploads;

class UploadCsv extends Component
{
    use WithFileUploads;

    public $upload;

    public $description;

    public $sample = [];

    public $rules = [
        'upload' => 'required|mimes:csv,txt|size:1024',
        'description' => 'required'
    ];

    public function save()
    {
        $this->validate();

        
        $this->upload->store('csv', 'local');
    }

    public function render()
    {
        return view('livewire.upload-csv');
    }
}

Let’s break it down:

Use WithFileUploads;

Adds the simple magic of uploading files in Livewire.

public $rules = [
   'upload' => 'required|mimes:csv,txt|size:1024',
   'description' => 'required'
];

Adds file validation. Upload and description are required. The uploaded file must be a CSV or txt file and must not be larger than 1 MB.

$this->upload->store('csv', 'local');

By default, Livewire uploads the file to a temporary folder livewire-tmp/. By running store on our upload we can move the file into more permanent storage (file, s3, etc). The above tells Livewire to store the uploaded file using my local drive defined in config/filesystems.php. Further, it will add the new file within a directory called csv.

Step 3

The view.

<div>
    <form wire:submit.prevent="submit">
        <div class="form-group">
            <label>File</label>
            <input type="file" wire:model="upload">

            @error('upload') <span class="error"></span> @enderror
        </div>
        <div class="form-group">
            <label>File Description</label>
            <input type="input" wire:model="description">

            @error('description') <span class="error"></span> @enderror
        </div>
        <div class="form-group">
            <button type="submit">Upload</button>
        </div>
    </form>
    <div class="row">
        <div class="col-sm-12">
            @if ($saved)
                <p>The file  with the size of  KB has been uploaded!</p>
                <p>The file can be found locally at .
            @endif
        </div>
    </div>

Pretty basic Livewire stuff on the view side. wire:submit.prevent="save" will the equivalent of event.preventDefault(). Bind upload and description to the public variables in our component above. @error will display any validation errors from our $rules.

After the file is uploaded it can be handled like any other file upload in Laravel. We can output some information about the file with things like $upload->getClientOriginalName() and $upload->getSize()

Step 4

Add to routes file so we can use it.

Route::get('upload/csv', \App\Http\Livewire\UploadCsv::class);

Upload

If everything worked out you should see this output after uploading a CSV file:

The file test.csv with the size of 10 KB has been uploaded!

The file can be found locally at csv/94Suy9FfeY2iTxHswNw5sfd4G9KPfxIOXb6ArKMm.txt.

In the next version, I’ll cover processing the CSV for things like mapping different CSV types to a model.

programming

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

January 3, 2021 at 08:33PM

[Collection] Top 10 Regex Cheat Sheets

[Collection] Top 10 Regex Cheat Sheets

https://ift.tt/2KZZhQO

Need a little extra help with those Regular Expression(regex) functions? Then look no further! Here, I have put together the best top 10 regex cheat sheets for you to download, print and pin to the bathroom wall!!

This cheat sheets will be a great reference when you need to put them in your scripts when you are web scraping and trying to find information or when you need help to authenticate users and passwords!

All the regex cheat sheets in this article are 100% free. All links open a new tab (feel free to open all the links without losing this page!)

Cheat Sheet 1: Rexegg.com

This first sheet is from Rexegg.com. The entire list is one that is commonly used Regex expressions in Python and other languages. This list includes Characters, Quantifiers and more. It will even tell you what language this expression can be used in! This makes it a lot easier when you go to write a regex in your language preference. This website really does emphasize looking at the tables for the expressions by keeping the tables bright on a black background. Making it easy to read the table but very difficult to read the information on regex itself.

Pros: Tables are bright and easy to read. Contains a lot of information shorthand to write regex

Cons: Information on the page is very dark and difficult to read.

Cheat Sheet 2: Regular Expressions cheat sheet – MIT

This second sheet was written by MIT. It is very spartan with no color and straight to the point on what the expressions are and what they do. This is the perfect cheat sheet if you do not want to be distracted by color or graphics. However, since it is very dry in the manner of text, I would not suggest this particular cheat sheet to someone who is just learning regular expressions since the explanations and examples are minimal.

Pros: Clean text, no colors for distraction, contains a lot of information shorthand to write regex

Cons: Too spartan for a total beginner in Regex

Cheat Sheet 3: Cheatography.com

I really love this website! This sheet was put together by Dave Child for regular expressions. It’s a nice quick reference guide pdf you can print in bright pink. It is easy to read and rated ‘E’ for everyone! It includes symbols, ranges, grouping, assertions and more with sample patterns to help get you on your way! Cheatography is one of my favorite websites for cheat sheet because they have so many on so many different topics and in many styles. It’s nice to find a one stop shop for cheat sheets.

Pros: Explains regex easily, uses soft colors, contains a lot of information.

Cons: Color may be distracting to some.

Cheat Sheet 4: Dev.to

Dev.to is a great place for new and experienced developers! This regex list was written by Catherine on her dev.to profile where she explains regex expressions in Java-script she has compiled with her resources at the bottom of here article.

Pros: Great spot to read someone else’s experience in regex and to gather new resources

Cons: More of an article than an actual pdf to print.

Cheat Sheet 5: Last Call – The Rapid API Blog

This is another great website for developers! This cheat sheet is also very easy to read and understand. It has additional resources beneath the code written. There are no examples in the post but there is shorthand explanations for each expression, characters and quantifiers. I would not suggest this particular cheat sheet for a beginner.

Pros: Great for those who understand regex and don’t have a need for examples

Cons: Not for Beginners since it has minimal explanation

Cheat Sheet 6: GREP

Here is another one! This one is minimal in color to keep distractions down. Key words are in red and examples are done in yellow. There are minimal explanations in the color keys. This sheet is for the advanced regex user who only needs a quick reference. It is clean and easy to read. It covers all of the information needed to write your own regex!

Pros: Written cleanly, additional resources at the bottom, to the point.

Cons: Not for the regex beginner.

Cheat Sheet 7: Regex chart

This Regex sheet is a very quick one with only the characters, the meaning and an example. This one is also for the advanced regex user. There is only the bare minimum here and this particular sheet does not contain quantifiers or expressions. There is a link however to a regex character classes cheat sheet.

Pros: Very quick reference of only character in regex

Cons: Not for a beginner regex user.

Cheat Sheet 8: Keycdn

Here is another awesome website to learn Regular expressions from! It goes over what regex is, gives you the list of expressions and gives you 2 separate examples on how regex is used in find numbers and emails. Near the bottom it even give you 3 tools to help you learn how to build a proper regex formula! These test sites will help you not only to build regex but compile it and make sure it running correctly before implementing it into your code.

Pros: Not only information but tools as well!

Cons: none as far I can see.

Cheat Sheet 9: MDN Web Docs

This regex syntax cheat sheet is on one of my absolute favorite places to learn about web development!! Named Moz:\\a (pronounced Mozilla) this particular guide will walk through not only the syntax but take you to the complete guide on regex! This cheat sheet is rated ‘E’ for everyone! It has clear examples and explanations on beginner and advanced regex characters and expressions.

Pros: Great for Everyone!!

Cons: N/A

Cheat Sheet 10: Dataquest

The final cheat sheet!! This final cheat sheet is from Dataquest. This particular cheat sheet was written specifically for Python!! This pdf is downloadable for free and explains each character and expression in detail. There is a lot of information packed in this pdf each under the proper heading and minimal color for the least number of distractions.

Pros: A lot of information pack in with minimal color.

Cons: Can appear to be overwhelming at first glance to a beginner.


I would like to thank you for taking the time to read this article. I hope that you are able to use at least one of these cheat sheets the next time you need to put a regular expression in your coding! The best way to learn though is to practice!! Good luck with writing your regex!!

The post [Collection] Top 10 Regex Cheat Sheets first appeared on Finxter.

Python

via Finxter https://ift.tt/2HRc2LV

January 3, 2021 at 07:50AM

21 Laravel Tutorials for Learning Laravel in 2021

21 Laravel Tutorials for Learning Laravel in 2021

https://ift.tt/3rI359X


2021 is a great time to learn Laravel and improve your knowledge if you’ve been using it. To start the year off we’ve made a list of 21 tutorials on everything from getting started to going deeper with the framework.

Getting Started with Laravel Tutorials

In this step by step Laracasts series, you’ll learn how to build web applications with Laravel. You’ll start with the basics and incrementally dig deeper and deeper, as you review real-life examples. Once complete, you should have all the tools you need.

In this tutorial, you’ll go through building a simple link directory app. It covers everything from planning, setting up your database, Blade views, and more. Join our weekly Laravel newsletter and get this as a free PDF.

As you begin to work with Laravel one thing you should note is how the release process works and when new versions are scheduled to come out.

This is a multiple part series taking you through building a Vue SPA with Laravel. part 1, part 2, part 3, part 4, part 5, and part 6.

Laravel Eloquent

Laravel Eloquent is an object-relational mapper (ORM) that makes it easy to interact with your database. When using Eloquent, each database table has a corresponding “Model” that is used to interact with that table. In addition to retrieving records from the database table, Eloquent models allow you to insert, update, and delete records from the table as well.

At its core Eager Loading, is telling Eloquent that you want to grab a model with specific relationships that way the framework produces a more performant query to grab all the data you will need. By eager loading, you can take many queries down to just one or two.

In this tutorial, you’ll set up some example relationships and then walk through how queries change with and without eager loading.

In this tutorial, we’ll show you more or less hidden secrets, methods, and properties you might not know to improve your code.

Eloquent ORM seems like a simple mechanism, but under the hood, there’s a lot of semi-hidden functions and less-known ways to achieve more with it. In this tutorial, you’ll see and discover a few tricks you might not know about.

If you’ve been working with Laravel for any time, you probably know the standard methods for creating Eloquent Models like make(), create(), update, and save(). Laravel includes some other methods are that also really useful for creating and updating Models that I feel don’t get enough attention. In this tutorial, you’ll learn about some of these additional methods and see how they might be useful.

Laravel Validation

A core part of any project is understanding how to validate the incoming request from your users and in this tutorial let’s look at how we can setup validation with our controllers, form requests, and rules.

Learn how to work with and test string length validation.

Have I been pwned? is a service created by Troy Hunt that aims to archive all data breaches and then allow you to check and see if your email or username has been included in any breaches. It’s a super helpful service to see if your email or password has been found in a breach and in this tutorial learn how to utilize this data in your Laravel Validation

Laravel Helpers

Laravel provides many excellent helper functions that are convenient for doing things like working with arrays, file paths, strings, and routes, among other things like the beloved dd() function. You can also define your own set of helper functions for your Laravel applications and PHP packages, by using Composer to import them automatically.

There are a ton of helper methods in Laravel that make development more efficient. If you work with the framework, I encourage you to see what helpers you can introduce in your day-to-day work. In this post, I’d like to point out a few of my favorites.

Going Deeper

In this tutorial, learn all about Laravel Jobs and Queues by building a simple analytics app.

Sanctum is Laravel’s lightweight API authentication package. In this tutorial, we’ll be looking at using Sanctum to authenticate a React-based single-page app (SPA) with a Laravel backend.

Laravel Model events allow you to tap into various points in a model’s lifecycle, and can even prevent a save or delete from happening. The Laravel model events documentation outlines how you can hook into these events with event classes, and this article aims to build upon and fill in a few additional details on setting up events and listeners.

Having a fast test suite can be just as important as having a fast application. As a developer, getting feedback quickly about the state of your code allows for a much quicker development turnaround. Here we are going to run through some tips you can implement today to make your tests run faster.

In this tutorial, you will create a test case to test the user model and a seeder to seed ten users, and each is following one user into the database.

In this tutorial, get a quick jumpstart on learning how to use routing in your Laravel applications.

Laravel comes with a feature called model factories that are designed to allow you to quickly build out “fake” models. These have several use cases with the two biggest being testing and database seeding. Take a deeper look at this feature in this tutorial

Many great developers could improve and gain some productivity and better tooling in their Terminal, so take a look at this tutorial for improving your productivity.

Wrap up

2020 was quite a strange year for everyone but even during the pandemic Laravel continued releasing new versions, making improvements, and getting better. In 2021, look for the release of Laravel 9 and 10, as well as more conferences, and hopefully more in-person meetups as things go back to normal.

Filed in:
News

programming

via Laravel News https://ift.tt/14pzU0d

January 1, 2021 at 12:09PM

How Zippo Lighters Are Made

How Zippo Lighters Are Made

https://ift.tt/2JxWWMk

How Zippo Lighters Are Made

Link

BRANDMADE.TV takes us inside the Zippo lighter factory for a look at how they create their iconic windproof lighters. The process starts out with rolls of brass which are shaped to form each lighter’s case before it’s chromed. The interior is formed from steel, then brass, flint, a wick, and cotton are added to complete the assembly.

fun

via The Awesomer https://theawesomer.com

December 31, 2020 at 02:00PM

SQL Clause is coming to town

SQL Clause is coming to town

https://ift.tt/2WSmK90

Olya Kudriavtseva has an ugly christmas sweater:

“He’s making a table. He’s sorting it twice. SELECT * FROM contacts WHERE behavior = “nice”; SQL Clause is coming town! (buy here)

Katie Bauer observes:

I mean, except for the fact that sorting something twice is TERRIBLY optimized

So how bad is this? Let’s find out.

Some test data

We are defining a table santa, where we store peoples names (GDPR, EU Regulation 2016/679 applies!), their behavior (naughty or nice), their age, their location, and their wishlist items.

create table santa (
	id integer not null primary key auto_increment,
	name varchar(64) not null,
	loc point srid 0 not null,
	age integer not null,
	behavior enum('naughty', 'nice') not null,
	wish varchar(64) not null
)

We are also writing some code to generate data (to evade GDPR, we are using randomly generated test data):

for i in range(1, size):
	data = {
	    "id": i,
	    "name": "".join([chr(randint(97, 97 + 26)) for x in range(64)]),
	    "xloc": random()*360-180,
	    "yloc": random()*180-90,
	    "age": randint(1, 100),
	    "behavior": "naughty" if random() > nicelevel else "nice",
	    "wish": "".join([chr(randint(97, 97 + 26)) for x in range(64)]),
	}

	c.execute(sql, data)
	if i%1000 == 0:
	    print(f"{i=}")
	    db.commit()

db.commit()

The full data generator is available as santa.py. Note that the data generator there defines more indexes – see below.

In our example we generate one million rows, and assume a general niceness of 0.9 (90% of the children are nice). Also, all of our children have 64 characters long names, a single 64 characters long wish, a random age, and are equidistributed on a perfect sphere.

Our real planet is not a perfect sphere, and also not many people live in the Pacific Ocean. Also, not many children have 64 character names.

Sorting it twice

How do you even sort the data twice? Now, assuming we sort by name, we can run an increasingly deeply nested subquery:

kris@localhost [kris]> select count(*) from santa where behavior = 'nice';
+----------+
| count(*) |
+----------+
|   900216 |
+----------+
1 row in set (0.25 sec)

kris@localhost [kris]> explain select count(*) from santa where behavior = 'nice'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: santa
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 987876
     filtered: 50.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)

Note (Code 1003): /* select#1 */ select count(0) AS `count(*)` from `kris`.`santa` where (`kris`.`santa`.`behavior` = 'nice')

Out of 1 million children, we have around 900k nice children. No indexes can be used to resolve the query.

Let’s order by name, using a subquery:

kris@localhost [kris]> explain 
  -> select t.name from (
  ->   select * from santa where behavior = 'nice'
  -> ) as t order by name;
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra                       |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+
|  1 | SIMPLE      | santa | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 987876 |    50.00 | Using where; Using filesort |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+
1 row in set, 1 warning (0.00 sec)

Note (Code 1003): /* select#1 */ select `kris`.`santa`.`name` AS `name` from `kris`.`santa` where (`kris`.`santa`.`behavior` = 'nice') order by `kris`.`santa`.`name`

We can already see that the MySQL 8 optimizer recognizes that this subquery can be merged with the inner query, and does this.

This can be done multiple times, but the optimizer handles this just fine:

kris@localhost [kris]> explain 
  -> select s.name from (
  ->   select t.name from (
  ->     select * from santa where behavior = 'nice'
  ->   ) as t order by name
  -> ) as s order by name;
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra                       |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+
|  1 | SIMPLE      | santa | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 987876 |    50.00 | Using where; Using filesort |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+
1 row in set, 1 warning (0.00 sec)

Note (Code 1003): /* select#1 */ select `kris`.`santa`.`name` AS `name` from `kris`.`santa` where (`kris`.`santa`.`behavior` = 'nice') order by `kris`.`santa`.`name`

We can see using filesort, so while we ask for the query result to be sorted by name twice, it is actually only sorted once.

No sorting at all

We can improve on this, using a covering index in appropriate order:

kris@localhost [kris]> alter table santa add index behavior_name (behavior, name);
Query OK, 0 rows affected (21.82 sec)
Records: 0  Duplicates: 0  Warnings: 0

Having done this, we now see that we lost the using filesort altogether:

kris@localhost [kris]> explain select s.name from ( select t.name from (select * from santa where behavior = 'nice') as t order by name ) as s order by name;
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+--------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key           | key_len | ref   | rows   | filtered | Extra                    |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+--------+----------+--------------------------+
|  1 | SIMPLE      | santa | NULL       | ref  | behavior_name | behavior_name | 1       | const | 493938 |   100.00 | Using where; Using index |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+--------+----------+--------------------------+
1 row in set, 1 warning (0.00 sec)

Note (Code 1003): /* select#1 */ select `kris`.`santa`.`name` AS `name` from `kris`.`santa` where (`kris`.`santa`.`behavior` = 'nice') order by `kris`.`santa`.`name`

The query is now annotated using index, which means that all data we ask for is present in the (covering) index behavior_name, and is stored in sort order. That means the data is physically stored and read in sort order and no actual sorting has to be done on read – despite us asking for sorting, twice.

Hidden ‘SELECT *’ and Index Condition Pushdown

In the example above, we have been asking for s.name and t.name only, and because the name is part of the index, using index is shown to indicate use of a covering index. We do not actually go to the table to generate the result set, we are using the index only.

Now, if we were to ask for t.* in the middle subquery, what will happen?

kris@localhost [kris]> explain
  -> select s.name from (
  ->   select * from (
  ->     select * from santa where behavior = 'nice'
  ->   ) as t order by name
  -> ) as s order by name;
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+--------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key           | key_len | ref   | rows   | filtered | Extra                 |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+--------+----------+-----------------------+
|  1 | SIMPLE      | santa | NULL       | ref  | behavior_name | behavior_name | 1       | const | 493938 |   100.00 | Using index condition |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+--------+----------+-----------------------+
1 row in set, 1 warning (0.00 sec)

Note (Code 1003): /* select#1 */ select `kris`.`santa`.`name` AS `name` from `kris`.`santa` where (`kris`.`santa`.`behavior` = 'nice') order by `kris`.`santa`.`name`

In the Code 1003 Note we still see the exact same reconstituted query, but as can be seen in the plan annotastions, the internal handling changes – so the optimizer has not been working on this query at all times, but on some intermediary representation.

The ‘using index condition’ annotation points to Index Condition Pushdown Optimization being used. In our example, this is not good.

Worse than sorting: Selectivity

The column we select on is a column with a cardinality of 2: behavior can be either naughty or nice. That means, in an equidistribution, around half of the values are naughty, the other half is nice.

Data from disk is read in pages of 16 KB. If one row in a page matches, the entire page has to be read from disk. In our example, we have a row length of around 200 Byte, so we end up with 75-80 records per page. Half of them will be nice, so with an average of around 40 nice records per page, we will very likely have to read all pages from disk anyway.

Using the index will not decrease the amount of data read from disk at all. In fact we will have to read the index pages on top of the data pages, so using an index on a low cardinality column has the potential of making the situation slightly worse than even a full table scan.

Generally speaking, defining an index on a low cardinality column is usually not helpful – if there are 10 or fewer values, benchmark carefully and decide, or just don’t define an index.

In our case, the index is not even equidistributed, but biased to 90% nice. We end up with mostly nice records, so we can guarantee that all data pages will be read for the SQL SELECT * FROM santa WHERE behavior = "nice", and the index usage will not be contributing in any positive way.

We could try to improve the query by adding conditions to make it more selective. For example, we could ask for people close to our current position, using an RTREE index such as this:

kris@localhost [kris]> ALTER TABLE santa ADD SPATIAL INDEX (loc);
...
kris@localhost [kris]> set @rect = 'polygon((10 10, 10 20, 20 20, 20 10, 10 10 ))';
kris@localhost [kris]> select * from santa where mbrcovers(st_geomfromtext(@rect), loc);
...
1535 rows in set (3.53 sec)

The ALTER defines a spatial index (an RTREE), which can help to speed up coordinate queries.

The SET defines a coordinate rectangle around our current position (supposedly 15/15).

We then use the mbrcovers() function to find all points loc that are covered by the @rect. It seems to be somewhat complicated to get MySQL to actually use the index, but I have not been investigating deeply.

If we added an ORDER BY name here, we would see using filesort again, because data is retrieved in RTREE order, if the index loc is used, but we want output in name order.

Conclusion

  • The Santa query is inefficient, but likely sorting twice is not the root cause for that.
    • The optimizer will be able to merge the multiple sorts and be able to deliver the result with one or no sorting, depending on our index construction.
    • The optimizer is not using the reconstituted query shown in the warning to plan the execution, and that is weird.
  • Selectivity matters, especially for indices on low cardinality columns.
    • Asking for all nice behaviors on a naughty/nice column is usually not benefitting from index usage.
    • Additional indexable conditions that improve selectivity can help, a lot.

technology

via Planet MySQL https://ift.tt/2iO8Ob8

December 30, 2020 at 06:56AM

How Golf Balls Are Made

How Golf Balls Are Made

https://ift.tt/2L2Pfya

How Golf Balls Are Made

Link

Tens of millions of golf balls are made every year. In this clip from Golf Town, they take us inside one of Titleist’s factories to see how they make their Pro V1 and Pro V1x golf balls. The process starts with a rubber sheet, which is formed and smoothed, then encased in a dimpled urethane covering before painting and packaging.

fun

via The Awesomer https://theawesomer.com

December 30, 2020 at 08:00AM

OK, gun nuts, this one’s for you!

OK, gun nuts, this one’s for you!

https://ift.tt/38L7Yq5

 

Ian McCollum of Forgotten Weapons has just released his latest video, in which he examines the firearms used in the original Star Wars movie, released in 1977.  They were based on real firearms, but embellished with add-on components and props to look more like science fiction weapons.

I found the presence of an OEG (occluded eye gunsight) particularly interesting, because this was originally developed in South Africa (a few years after Star Wars came out).  I used one of the first models to be produced there, and found it intriguing.  Basically, one doesn’t look through the sight at all:  it’s a solid object that can’t be seen through.  One keeps both eyes open, so that with one eye one sees the target, and with the other the red dot image in the otherwise blank sight.  One’s brain superimposes the dot on the target, making it relatively easy to hit what one’s aiming at.

I must admit, though, I prefer today’s red dot sights, where I can see the target through the sight.

Peter

non critical

via Bayou Renaissance Man https://ift.tt/1ctARFa

December 30, 2020 at 01:05PM

Add All the Ports to Your Laptop with $34 off Vava’s 12-in-1 Docking Station

Add All the Ports to Your Laptop with $34 off Vava’s 12-in-1 Docking Station

https://ift.tt/2EONRMO


Best Tech DealsBest Tech DealsThe best tech deals from around the web, updated daily.

Vava 12-in-1 USB-C Docking Station | $66 | Amazon | Clip coupon + code: KINJA1228

Many laptops these days sacrifice extensive ports in the favor of being as thin and light as possible, which has its obvious benefits and drawbacks. That’s great for easy portability, but can sometimes be a drag when you need to plug in a device or if you want to make your laptop the center of a more robust home office setup.

There are all sorts of USB-C hubs available, but Vava’s 12-in-1 Docking Station is one of the most port-packed options we’ve seen at an affordable price. Simply plug it into a USB-C port and you’ll add two USB 3.0 ports, two USB 2.0 ports, a USB-C PD port, SD and microSD card readers, an Ethernet port, a 3.5mm headphone jack, DC in port, and two HDMI ports. Those HDMI ports enable dual-monitor 4K/60fps action with compatible laptops, letting you turn your slim notebook into a beast of a home PC.

The Vava 12-in-1 Docking Station usually runs $100, but right now when you clip the Amazon coupon and input the exclusive promo code KINJA1228, you’ll drop it down to just $66. If you need a more robust hub like this, it’s a bargain.

G/O Media may get a commission

This deal was originally published in October 2020 by Andrew Hayward and was updated with new information on 12/28/2020.


Tech

via Lifehacker https://lifehacker.com

December 28, 2020 at 01:48PM