Canto Arms DL-44 Hero: Upgraded Blaster

https://cdn-fastly.thefirearmblog.com/media/2024/11/19/03131/canto-arms-dl-44-hero-upgraded-blaster.jpg?size=720×845&nocrop=1

We live in a weird world, a world where someone will take a perfectly fine AR-15 action and turn it into a wannabe Star Wars blaster. Yet, if you can accept that madness, Canto Arms wants to talk to you. They have just announced an upgrade to their Star Wars-esque pistol, and present to the well-heeled buyer the new DL-44 Hero.

Movie Guns @ TFB:

Wait—What?

At this point, some TFB readers are wondering what on earth the weirdo pistol pictured above could possibly be. Others might remember back in 2021 when we showed you the first Canto Arms DL44 pistol.

Back then, we told you:

In recent years, Star Wars fans have begun to ditch their dreams of building a Mauser C96 based replica of Han Solo’s DL-44 blaster due to soaring costs, and have a new hope in the much more affordable AR-15 DL-44 clones. Enter Canto Arms, which, at present have a dedicated line of AR-15 DL-44 clones for sale, both as complete .22LR pistols, and as parts kits, plus many other accessory options to complete the DL-44 build you never thought possible. Purists will no doubt scoff at a non-Mauser blaster clone, but with Canto Arms’ Nocturne 22 Heavy Blaster, you can have a close representation of Han Solo’s blaster for less than half of what a C96 conversion would cost, and you get to save the remaining Mausers at the same time.

So if you want to concealed carry like Luke Skywalker but on a Tusken Raider budget, the DL-44 is expensive, but a lot less expensive than building a replica Star Wars blaster from a C96 (and don’t get us started on the cost of building an E-11 Stormtrooper Blaster from a Sterling submachine gun…).

What sets the DL-44 Hero apart?

It looks as if the DL-44 Hero is basically a gussied-up version of the original .22LR pistol.

In the film industry, a hero prop weapon is a meticulously crafted piece designed to dazzle the audience with up close detail. Inspired by this concept, we proudly present the DL-44 Hero – a stunningly detailed blaster that captures the very essence of this legendary weapon. From the finely machined detail of the billet upper and lower receivers to the authentic Aurebesh engravings, this blaster is sure to turn heads at the range.

So, Star Wars-universe engravings on a custom upper and lower (the lower is from Strike Industries). There’s also a round knob on the receiver that wasn’t on the original DL-44, making the Hero look more like the original C96-based blaster used in the Star Wars movies. There’s an improved mag release, machined from billet, and trigger upgrades from Longitudinal Grind. A BoreBuddy quiet bolt group is available as an option.

Canto Arms throws in a nylon X-Form mag with the purchase, and you can buy more if you want matching reloads. Canto Arms also includes the scope, rings and 45-degree mounts, but you must install the scope yourself.

Asking price? $1,499.95. See more details on Canto Arms’ website here.


Photos: Canto Arms

The Firearm Blog

The First Teaser for the Live-Action How to Train Your Dragon Recreates an Animated Icon

https://gizmodo.com/app/uploads/2024/11/how-to-train-your-dragon-live-action.jpg

Universal Pictures has finally given us our first look at its live-action How to Train Your Dragon film.

How to Train Your Dragon follows a tribe of Vikings who display their worth by hunting mighty dragons. That is, save for the chieftain’s son, Hiccup (Mason Thames of The Black Phone fame), who befriends a jet-black dragon named Toothless and trains it to become man’s best friend—all while keeping their training sessions a secret from his aforementioned tribe of dragon-killing Vikings.

The teaser trailer gets everything out of the way that detractors would break their bingo cards out for when it comes to the song and dance of yet another live-action project from Hollywood. First off, it shows us the sweeping vistas of a mountainous countryside, impressive ship craftsmanship, and original film actor Gerard Butler in a Viking get-up as the chieftain, Stoick. The trailer also gives us a glimpse of Hiccup and Toothless meeting for the first time… all the while replicating the original film’s big referential moment of Toothless accepting Hiccup’s head pats.

While we couched today’s trailer by saying it was our first look, it would behoove us to mention that How to Train Your Dragon’s teaser trailer leaked ahead of its official release in non-U.S. territories. Though, in a glass half-full look at the whole situation, folks weren’t complaining about how bad the trailer looked like they did with the first official still image of the film, pointing to its desaturated colors and overall lack of whimsy.

As the trailer showcases, the movie’s CG animation for Toothless looks pretty spectacular and the set pieces for the Viking village are also a comparable to the animated films. Although the brief teaser nails the important component of making Toothless look good, time will tell whether the film will measure up to its originator’s sense of heart and humor.

How to Train Your Dragon originally released in 2010. Alongside Butler, the film starred Jay Baruchel as Hiccup and America Ferrera as his love interest, Astrid. It became so popular that it garnered two sequel films, five short films, and two TV series. The live-action film was written and directed by Dean DeBlois, who co-wrote and co-directed the animated original, and wrote and directed its two sequels. Additional cast members include Nico Parker (The Last of Us) as Astrid, Nick Frost as Gobber, and Julian Dennison (Deadpool 2) as Fishlegs.

How To Train Your Dragon is slated to release June 13, 2025.

Want more io9 news? Check out when to expect the latest Marvel, Star Wars, and Star Trek releases, what’s next for the DC Universe on film and TV, and everything you need to know about the future of Doctor Who.

Gizmodo

We Are Winning: How the Bruen Decision Reinforced Our Second Amendment Rights ~ VIDEO

https://www.ammoland.com/wp-content/uploads/2016/11/Gun-Rights-Court-500×281.jpg

At the 2024 Federalist Society National Lawyers Convention, Professor Mark W. Smith delivered a compelling speech on the Second Amendment, emphasizing the Supreme Court’s decision in New York State Rifle & Pistol Association v. Bruen and its profound impact on gun rights in America.

Understanding the “Unqualified Command” of the Second Amendment

Professor Smith began by highlighting the Supreme Court’s characterization of the Second Amendment as an “unqualified command.” This designation underscores that the right to keep and bear arms is fundamental and not subject to arbitrary restrictions. He stressed that any ambiguity in historical context should default to the clear text of the Second Amendment, ensuring that the government bears the burden of justifying any limitations on this right.

The Role of Historical Analogues in Gun Control Legislation

A significant portion of the speech focused on how courts should evaluate historical precedents when assessing modern gun control laws. Professor Smith outlined key criteria for determining suitable historical analogues:

  • Actual Laws: Only enacted laws, not mere proposals or societal norms, should be considered.
  • Relevant Time Period: The primary focus should be on laws from 1791, the year the Second Amendment was ratified, as these reflect the original understanding of the right.
  • Constitutional Consistency: Historical laws rooted in unconstitutional practices, such as those based on racial discrimination, should be disregarded.
  • Prevalence and Duration: Laws that were widespread and enduring carry more weight than isolated or short-lived statutes.

By adhering to these guidelines, courts can ensure that modern interpretations of the Second Amendment remain faithful to its original intent.

Applying the “Why” & “How” Analysis

Professor Smith introduced the “why” and “how” framework to assess the relevance of historical laws to contemporary issues:

  • Why: The purpose behind the historical law.
  • How: The method by which the law was implemented.

He illustrated this with the Supreme Court’s decision in District of Columbia v. Heller, where the Court found that historical bans on “dangerous and unusual” weapons did not justify modern handgun bans, as handguns are commonly used for lawful purposes today.

The Impact of Bruen & Rahimi on Second Amendment Jurisprudence

Discussing the Bruen decision, Professor Smith noted that the Court rejected New York’s restrictive “may issue” permitting system, finding no historical precedent for such limitations on public carry. He also addressed the Rahimi case, emphasizing that it represents a routine application of the principles established in Heller and Bruen, reinforcing the necessity for courts to adhere to historical context when evaluating gun control measures.

Guarding Against Overgeneralization

To prevent the erosion of Second Amendment rights through overly broad interpretations, Professor Smith proposed several safeguards:

  • Consistency with the Second Amendment’s Text: Derived principles must not contradict the explicit guarantee of the right to keep and bear arms.
  • Alignment with Supreme Court Precedent: Any historical principle must be in harmony with established Court rulings.
  • Focus on Law-Abiding Citizens: The analysis should center on the rights of lawful individuals, not the actions of criminals.
  • Preservation of the Amendment’s Purpose: Any derived principle should uphold the Second Amendment’s role in protecting against tyranny and ensuring self-defense.

By implementing these measures, courts can maintain a faithful interpretation of the Second Amendment, safeguarding it from dilution through generalized reasoning.

Let’s Get it Done!

Professor Smith’s address serves as a vital reminder of the importance of adhering to the original understanding of the Second Amendment. His insights provide a robust framework for evaluating modern gun control laws, ensuring that the fundamental right to keep and bear arms remains protected for future generations.

How Has the Bruen Decision Impacted the 2nd Amendment Litigation Landscape? ~ DEEP DIVE

Unpacking Court Mistakes in 2nd Amendment Cases: How Courts are Twisting Your Gun Rights! ~ DEEP DIVE

 

AmmoLand Shooting Sports News

SQL Calculations #1

This was principally written for my SQL students but I thought it might be useful to others. SQL calculation are performed row-by-row in the SELECT-list. In its simplest form without even touching a table, you can add two literal numbers like this:

SELECT 2 + 2 AS result;

It will display the result of the addition to the column alias result as a derived table, or the following result:

+--------+
| result |
+--------+
|      4 |
+--------+
1 row in set (0.00 sec)

Unfortunately, the use of literal values as shown above doesn’t really let you see how the calculation is made row-by-row because it only returns only one row. You can rewrite the two literal values into one variable by using a Common Table Expressions (CTEs). The CTE creates an struct tuple with only one x element. Another way to describe what the CTE does would say, it creates a derived table named struct with a single x column in the SELECT-list.

The CTE runs first, then a subsequent query may use the CTE’s derived table results. Below is a query that uses the value in the struct.x derived table (or references the struct tuple’s x element) twice while assigning the value to a new column alias, labelled result. The FROM clause places the struct tuple in the queries namespace, which lets you reference it in the SELECT-list.

WITH struct AS
 (SELECT 2 AS x)
SELECT struct.x + struct.x AS result
FROM  struct;

Like the literal example, it will display the result of the addition to the column alias result as a derived table of one row:

+--------+
| result |
+--------+
|      4 |
+--------+
1 row in set (0.00 sec)

Having laid a basis for a simple calculation in one row, let’s expand the example and demonstrate how to perform row-by-row calculations. The example requires introducing some new concepts. One uses the UNION ALL set operator to fabricate a CTE derived table with three rows. Another uses a comma within the WITH clause to create two derived tables or CTEs. The last uses the CROSS JOIN to add the single row CTE’s single y column to each of the rows returned by the multiple row CTE.

The CROSS JOIN is a Cartesian product, which multiplies the rows in one table against the rows in another table while adding the columns from each table. That means fabricating a table of one column and one row lets you put a variable into all the rows of another table or set of tables combined through an equijoin or non-equijoin operation.

The query below takes a struct1 derived table of one column and three rows and a struct2 derived table of one column and one row, then uses a CROSS JOIN to create a new derived table, which would be a table of two columns and three rows. The Cartesian product only provides the two columns that we will multiply to create new data.

The SELECT-list lets us fabricate a new column where we multiply the values of column x and column y to create a set of new results in column result.

WITH struct1 AS
 (SELECT 1 AS x UNION ALL
  SELECT 2 AS x UNION ALL
  SELECT 3 AS x)
, struct2 AS
 (SELECT 10 AS y)
SELECT struct1.x AS x
,      struct2.y AS y
,      struct1.x * struct2.y AS result
FROM  struct1 CROSS JOIN struct2;

The query returns the following results, which show the values used to calculate the result and the result:

+---+----+--------+
| x | y  | result |
+---+----+--------+
| 1 | 10 |     10 |
| 2 | 10 |     20 |
| 3 | 10 |     30 |
+---+----+--------+
3 rows in set (0.00 sec)

As a rule, the columns x and y would not be displayed in the final derived table. You would only see the result columns’ values.

Let’s use an example from Alan Bwaulieu’s Learning SQL book with a twist. Rather than manually fabricating the ordinal numbers twice, let’s use the scope reference of a subsequent CTE to reference an earlier CTE. That would create two ten row tables of one column each, or a Cartesian product of a 100 row table with two columns. Then, let’s use the SELECT-list lets us fabricate only a new column, which will add 1 to the numbers 0 to 99 to give us the numbers 1 to a 100.

WITH ones AS
 (SELECT 0 AS x UNION ALL
  SELECT 1 AS x UNION ALL
  SELECT 2 AS x UNION ALL
  SELECT 3 AS x UNION ALL
  SELECT 4 AS x UNION ALL
  SELECT 5 AS x UNION ALL
  SELECT 6 AS x UNION ALL
  SELECT 7 AS x UNION ALL
  SELECT 8 AS x UNION ALL
  SELECT 9 AS x )
, tens AS
 (SELECT x * 10 AS x FROM ones)
SELECT ones.x + tens.x + 1 AS ordinal
FROM   ones CROSS JOIN tens
ORDER BY ordinal;

It returns the following result set:

+---------+
| ordinal |
+---------+
|       1 |
|       2 |
|       3 |
|       4 |
|       5 |
|       6 |
|       7 |
|       8 |
|       9 |
|      10 |
|      11 |
 ...
|      98 |
|      99 |
|     100 |
+---------+
100 rows in set (0.00 sec)

Moving on to more complex math, let’s create a numerals table with the result from our prior query. It will enable calculating the factors of exponents. The easiest way to create the table is shown below (only caveat is that it will build it with a biting rather than an int data type).

CREATE TABLE numerals AS
WITH ones AS
 (SELECT 0 AS x UNION ALL
  SELECT 1 AS x UNION ALL
  SELECT 2 AS x UNION ALL
  SELECT 3 AS x UNION ALL
  SELECT 4 AS x UNION ALL
  SELECT 5 AS x UNION ALL
  SELECT 6 AS x UNION ALL
  SELECT 7 AS x UNION ALL
  SELECT 8 AS x UNION ALL
  SELECT 9 AS x )
, tens AS
 (SELECT x * 10 AS x FROM ones)
SELECT ones.x + tens.x + 1 AS ordinal
FROM   ones CROSS JOIN tens
ORDER BY ordinal;

It can be described after running the foregoing script in MySQL as:

+---------+--------+------+-----+---------+-------+
| Field   | Type   | Null | Key | Default | Extra |
+---------+--------+------+-----+---------+-------+
| ordinal | bigint | NO   |     | 0       |       |
+---------+--------+------+-----+---------+-------+
1 row in set (0.00 sec)

The next query accepts a substitution variable into the WITH clause, which means an external program will call it. (Although, you could use a session level variable, which I would discourage.) This query returns the factors for any given exponent:

WITH magic AS
(SELECT %s AS vkey)
SELECT   CONCAT(magic.vkey,'^',LOG(magic.vkey,n.ordinal)) AS powers
,        n.ordinal AS result
FROM     numerals n CROSS JOIN magic
WHERE    MOD(n.ordinal,magic.vkey) = 0
AND      LOG(magic.vkey,n.ordinal) REGEXP '^[0-9]*$' 
OR       n.ordinal = 1
ORDER BY n.ordinal;

FYI, the regular expression is used to guarantee only integer return values and the 1 returns the identity property of an exponent raised to the zero power.

Assuming you created the numerals table, put the foregoing query in a query.sql file (because I was to lazy to write the full parameter handling), and you run it in the same directory as this Python program, it’ll take any valid integer as a value.

#!/usr/bin/python
# ------------------------------------------------------------
#  Name: power.py
#  Date: 19 Oct 2024
# ------------------------------------------------------------
#  Purpose:
#  -------
#    The program shows you how to provide a single agrument
#    to a query and print the formatted output.
#
#    You can call the program:
#
#    ./power.py 3
#
# ------------------------------------------------------------

# Import libraries.
import sys
import mysql.connector
from mysql.connector import errorcode

# ============================================================
#  Define a local padding function.
# ============================================================
def pad(valueIn):
  # Define local variable.
  padding = ''

  # Convert single digit numbers to strings.
  if isinstance(valueIn,int) and len(str(valueIn)) == 1:
    padding = ' '

  # Return padding space.
  return padding
# ============================================================
#  End local function defintion.
# ============================================================

# Define any local variables.
powerIn = 2
query = ""

# ============================================================
#  Capture argument list minus the program name.
# ============================================================
arguments = sys.argv[1:]

# ============================================================
#  If one or more arguments exists and the first one is an
#  a string that can cast to an int, convert it to an int,
#  assign it to a variable, and ignore any other arguments
#  in the list.
# ============================================================
if len(arguments) >= 1 and arguments[0].isdigit():
  powerIn = int(arguments[0])

# ============================================================
#  Use a try-catch block to read and parse a query from a
#  a file found in the same local directory as the Python
#  program.
# ============================================================
try:
  file = open('query.sql','r')
  query = file.read().replace('\n',' ').replace(';','')
  file.close()

except IOError:
  print("Could not read file:", fileName)
 
# ============================================================
#  Attempt connection in a try-catch block.
# ============================================================
# --------------------------------------------------------
#  Open connection, bind variable in query and format
#  query output before closing the cursor.
# --------------------------------------------------------
try:
  # Open connection.
  cnx = mysql.connector.connect(user='student', password='student',
                                host='127.0.0.1',
                                database='studentdb')

  # Create cursor.
  cursor = cnx.cursor()

  # Execute cursor, and coerce string to tuple.
  cursor.execute(query, (powerIn,))

  # Display the rows returned by the query.
  for (powers, result) in cursor:
    print((" {} is: {}").format(powers, pad(result) + str(result)))

  # Close cursor.
  cursor.close()

# --------------------------------------------------------
#  Handle MySQL exception 
# --------------------------------------------------------
except mysql.connector.Error as e:
  if e.errno == errorcode.ER_ACCESS_DENIED_ERROR:
    print("Something is wrong with your user name or password")
  elif e.errno == errorcode.ER_BAD_DB_ERROR:
    print("Database does not exist")
  else:
    print("Error code:", e.errno)        # error number
    print("SQLSTATE value:", e.sqlstate) # SQLSTATE value
    print("Error message:", e.msg)       # error message

# --------------------------------------------------------
#  Close connection after try-catch completes.
# --------------------------------------------------------
# Close the connection when the try block completes.
else:
  cnx.close()

If you forget to call it with a numeric parameter, it uses 2 as the default. You would call it as follows from a Linux prompt from the local directory:

./power.py

It returns:

 2^0 is:  1
 2^1 is:  2
 2^2 is:  4
 2^3 is:  8
 2^4 is: 16
 2^5 is: 32
 2^6 is: 64

If you call it with a numeric parameter, it uses the numeric value. You would call it as follows from a Linux prompt from the local directory:

./power.py 3

It returns:

 3^0 is:  1
 3^1 is:  3
 3^2 is:  9
 3^3 is: 27
 3^4 is: 81

As always, I hope the post helps folks sort out how and why things work.

Planet MySQL

Internet Archive Now Hosts Classic Unreal Games; Epic Games Gives Blessing

Classic first-person shooters Unreal (1998) and Unreal Tournament are now available for free on the Internet Archive, with official OK from publisher Epic Games. An Epic spokesperson confirmed to PC Gamer that users are permitted to "independently link to and play these versions." Players can download the games directly from the Internet Archive and apply patches from Github for modern Windows compatibility, or use simplified installers through oldunreal.com. Both titles run on current hardware despite their age, though users may need to adjust dated default settings like 640×480 resolution and inverted mouse controls.


Read more of this story at Slashdot.

Slashdot

Exploring the MySQL Server System Variables and SET Statements

MySQL system variables configure the server’s operation, and the SET statement is used to change system variable. The MySQL SET statements have various options for specifying changes to SYSTEM VARIABLE. It’s important to understand how these changes are reflected in current sessions (connections), later sessions, and after database server restarts.Planet MySQL

Concealed Carry Corner: How to Train for Carrying

https://cdn-fastly.thefirearmblog.com/media/2024/11/14/13471/concealed-carry-corner-how-to-train-for-carrying.jpg?size=720×845&nocrop=1

Welcome back to another edition of Concealed Carry  Corner. Last week, we took a look at some of the best items to make carrying a concealed handgun easier. If you happened to miss that article, be sure to click the link here to check it out. This week, I want to talk about how some of my favorite drills help not only my shooting ability but help me problem-solve on the fly. So many people just focus on their shooting ability when the real issue is the lack of ability in problem-solving. Having to pull your firearm in an emergency situation and fire on a threat can not only be stressful but you’ll also be fighting your body for the fight or flight responses. Being in a self-defense situation is drastically different from shooting quickly at the range.  Let’s take a look at how to train for carrying a concealed handgun.

Problem-Solving Versus Shooting Skills 

When we talk about being proficient when it comes to carrying a concealed firearm, oftentimes we think about bettering our shooting skills and becoming quick when it comes to our drawstroke, and getting rounds onto the target. While this is absolutely true, many don’t recognize the hardest part about being in a self-defense situation is the inability to problem-solve when your adrenaline dump hits your body. It can be incredibly difficult to fight this since that’s the body’s natural response but working on your problem-solving skills while you are training can help train to critically think while you’re shooting.

Having the ability to accurately make shots and quickly make your hits is no doubt a vital component when carrying concealed, but we really need to start talking about problem-solving on the fly rather than just hammering shooting skills. There becomes a point where we become proficient and need to start challenging our problem-solving skills rather than just continuously hammering the basic shooting skills or just shooting static targets. Luckily, there are several drills out there that can not only push your shooting abilities but also start to challenge your mind when it comes to problem-solving.

Drills to Focus On 

When it comes to drills, there are an unlimited amount of choices to work on anything from accuracy, fundamental drills, or racing against the clock for the fastest time. When I personally go to the range, I switch from static drills where you focus on accuracy based on a time limitation to more dynamic drills where it’s a problem-solving drill rather than a straightforward shooting drill. I will give you a brief rundown of some of the drills I use on a regular basis to help train not only myself but shooting friends who go to the range with me as well. Here are a few drills I will typically use on a given range session.

Bill Drill

When it comes to warming up and having a straightforward shakedown on skills, there are few things as good as a simple Bill Drill. The Bill Drill is designed to draw your carry gun from concealment and fire 6 shots as fast as possible into the target while remaining accurate. It should be all shots in the A zone of the target. Typically these are fired on full-size targets but if you don’t have those you can use a simple white 8X12 piece of paper.

A good goal to draw and fire 6 rounds into the target is right around 3.5 seconds with the expert time being anything under 2 seconds. The most important thing to keep in mind when it comes to the Bill Drill is finding the sweet spot where you can accurately make your hits while still meeting the minimum time requirements. This drill doesn’t force you to think on your toes or use much brain power at all truthfully. The Bill Drill has always been known for being a really straightforward drill but in terms of a warmup drill to get your mind clear and ready to work, it’s one of the best out there.

Alphabet Soup

One of the most challenging but effective drills you can run is called the Alphabet Soup drill. This drill has a number of targets posted around the firing area of the range with various letters spray-painted onto the targets. This drill takes two people where one stands behind the shooter and yells out commands while the other person engages the targets called out. You can make it simple with a single shot or make it more challenging with double taps.

If that’s too easy, you can also do Mozambique style where you have to fire two rounds into the body and one into the head of the designated target. The main goal of this drill is to force your mind to focus on the correct target teaching you over time to have problem-solving skills while focusing on your shooting skills. Being able to work through problems and quickly engage the correct targets will help you train for a stressful situation where you have to focus your head instead of being overwhelmed by the stress.

Color and Shapes

You can take the Alphabet Soup drill even further by doing various colors and shapes adding even another layer to target identification. I typically have people try out and become comfortable with the Alphabet Soup and then add in colors and shapes. The person behind the shooter yells different color and shape combinations like “Red Square" and then "Blue Circle.” As challenging as Alphabet Soup can be, the addition of colors and shapes makes an already challenging drill even tougher.

In my experience, these are some of the best drills for slowing down a bit and problem-solving instead of just picking targets and firing without much thought. Static drills are fantastic, but adding in the ability to have critical thinking skills while manipulating a firearm really does add value.

Overall Thoughts

There’s no question that shooting static targets and working on your fundamental skills are an important part of building your shooting skills. At a certain point though, it’s important to start pushing yourself when it comes to problem-solving and forcing yourself to focus on various details other than just shooting. Most people will hit the range and just solely focus on building their shooting skills whereas practicing the problem-solving aspect of shooting is just as important as actually shooting and practicing your critical thinking skills can be the reason you survive a self-defense situation.

What are some other drills you guys like to do to challenge your mental skills when at the range? Let me know your thoughts in the comments below. If you have questions about drills or firearms in general, feel free to shoot me a message on Instagram @fridgeoperator. Stay safe out there and we will see you next week for another edition of Concealed Carry Corner.

TFB’s Concealed Carry Corner is brought to you by GLOCK 

The Firearm Blog

Cheapskate Splurges (OT)

https://feeds.feedblitz.com/~/i/907904180/0/theonlinephotographer

Caldigit-3

I’m generally a cheapskate, but this time I decided to splurge. I solved the M4 Mac Mini’s dearth of USB-A ports by buying a Caldigit TS4. It’s got 18 connections, including two card slots and three audio jacks. Eight effingteen.

Total overkill, but you know what? I’ve been suffering from Apple’s apparently innate tendency to skimp on ports, bays, slots and jacks my whole life. My whole life. The transition away from floppies was a pain (and I lost a lot of data, eventually—who knew that later on they’d come up with drives and software to get data off old 3.5 floppies, after a stretch when you couldn’t?); I missed CD drives when they went away; I missed the SD card slot when it went away; and, almost every Apple computer I’ve ever owned or worked on—18 is my latest best count—lacks adequate ports. Even the very first Macintosh, the original 1984 128k, should have had two floppy drives when it only had one, so you wouldn’t have had to sit there exchanging floppies back and forth, back and forth, while it copied the application to a new disk. I just decided, the hell with economy. I’m a man, and I’m gonna get me enough ports. For once.

Even so, for the M4 Mac Mini, I think I’m going to recommend—or pass along a recommendation for—this:

Caldigit-4 copyIt’s the Xcellon Pro 10 hub, USB-C 3.2 Gen 2, recommended privately by a reader who knows this stuff. At issue is that it’s capable of passing along 10 Gbps, like the front ports on the M4 Minis. If you use a 5 Gbps hub, you’re choking off half the happy flow of data to whatever you have plugged into it. A little on the expensive side, but that just gives it a better chance of not being super-Chin…er, super-cheap in build.

Caldigit-2

The Caldigit was a breeze to install but a giant pain to site. I have a sit-stand desk, so the entire welter of wires needs to be free enough to allow the desk to travel up and down. I ended up having to site a separate small table next to the desk to support the power supplies; the one in front is for the TS4. (The other is for the JBOD enclosure on the left.) Neither the cord from the plug to the power supply nor the one from the power supply to the unit were long enough on their own to allow enough travel. Hence the need to site the power supply halfway up.

I hated to do it. Give it a month and the power supplies will be buried.

Caldigit-1

The Caldigit did neaten up my desk considerably. The white wire from the hard drive housing doesn’t look good, true, but it’s the best I could do. It’s Thunderbolt 2, which, as you probably don’t remember, used cables with the same termination as Mini-DisplayPort. But they had to be Thunderbolt certified. So, as I understand it, and I could be wrong, not all Mini-DisplayPort male-to-male cables will do. A 1-meter Thunderbolt 2 cable would allow me to pass this wire under the desk—emphasis on 1-meter—but those apparently don’t exist to be bought any more. Or at least not ones that I can know for sure are suitable for 20-Gbps data transmission. The best I could do four years ago was this 0.5-meter Apple Thunderbolt 2 cable with Mini DisplayPort male-to-male terminations along with the Apple Thunderbolt-to-Type-C-Thunderbolt 3 adapter. Which is not quite long enough, but oh well. Are you bored yet? I’m certainly getting there.

Caldigit-5 copyLittle orphan

Unfortunately, there is one casualty of all this. The Caldigit leaves my beautiful new Wise Advanced Co. Taiwanese-made card reader orphaned. (Somehow I knew I wasn’t going to get to keep this, because I like it. Whoops, no self-pity.) Anyway, I tested, and the SD card reader in the Caldigit is as fast as the Wise Advanced. Anyway, if you need a really nice CFexpress Type B card reader in a nice aluminum housing that’s only been used about ten times, that also reads UHS-II SDXC cards (here’s a link), let me know. It’s for sale. You can have it for a nice price.

Caldigit-6Buuaaaaaaaah-hahaha!

Mike

Original contents copyright 2024 by Michael C. Johnston and/or the bylined author. All Rights Reserved. Links in this post may be to our affiliates; sales through affiliate links may benefit this site. As an Amazon Associate I earn from qualifying purchases. (To see all the comments, click on the "Comments" link below or on the title of this post.)

Featured Comments from:

The Online Photographer

How to Setup Multi Tenant App in minutes with Laravel

https://media2.dev.to/dynamic/image/width=1000,height=500,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmziug7lqvfqzrtsetaa6.png

In this article you will learn how to setup the basic Laravel multi tenant app in minutes with some simple steps.

Multi tenancy is a good concepts for new SaaS based Applications it will help you to keep the one codebase for multiple domains and each domain contains its own data.

Let get Started!

  1. Create a new Laravel Project
  2. Install/setup Laravel Breeze
  3. Install multitenancy package with following command
composer require stancl/tenancy
  1. After it completes run the following command
php artisan tenancy:install

It will create:

migrations
a config file (config/tenancy.php),
a routes file (routes/tenant.php),
and a service provider file
app/Providers/TenancyServiceProvider.php

Recap
What we have done so far
a. create a new project
b. install tenancy package

Step for multiple domains and database

Once the above steps are done we need to register our tenancy service provider in the following file
Then add the service provider to your config/app.php file:

Now we need to create a Tenant Model for that we will use following command:

php artisan make:model Tenant

After that a model will Created in side the App/Models/ we need to change the code with following later we will update it more according to our needs

by default it will use the package Tenant Model but we want the system to use our model that we have just created for that we have to go in the config folder/directory and then find the tenancy.php file and make the following changes

'tenant_model' => Tenant::class,

change the Above line of code with

'tenant_model' => \App\Models\Tenant::class,

If you don’t need domains or databases, ignore the steps above. Everything will work just as well.

You can create tenants like any other models:

You may register central routes in routes/web.php or routes/api.php like you’re used to. However, you need to make one small change to your RouteServiceProvider.
You don’t want central routes — think landing pages and sign up forms — to be accessible on tenant domains. For that reason, register them in such a way that they’re only accessible on your central domains.Now we need to set the routes for the tenants and central app
let go the the RouteServiceProvider.php and replace the code with following code from boot function

Image description

Tenant routes
You may register tenant routes in routes/tenant.php file
by default it will look like this

Now we need to create copy the migration files from migration folder to the tenant folder that resides in migration folder and copy the required migration files

once this done we need to create a job that will insert the data in tenant table and also generate the tenant database and insert that record in it

php artisan make:job SeedTenantJob

and replace the file code with the code bellow

what this file do is it will always run as soon as you will hit the create tenant function and once it will be execute it will run the migration and insert the first record for you so you can login and access your tenant application

but still we have to do some more fix’s to get the working tenant application

now we need to do some modifications in TenantServiceProvider.php
do the following changes

uncomment the JobSeedDatabase and add our created job bellow that \App\Jobs\SeedTenantJob::class

like mentioned in the picture. Remember that order is very important in this file if you put our job at top and JobSeedDatabase bellow that it will throw error as you need to first run the migrations then insert the data our job part is for the insertion of data and JobSeedDatabase is to run the migrations

Now your first multitenancy app is ready to go live and you can test on local but for that you need to create a TenantController from where you can register the tenants

Image description

this will be basic code you can modify it for more stuff as per your requirements

now you will need to modify your route service provider if you havent set it accordingly

Image description

now you can set you web.php and tenant.php file accordingly

** updated web.php**
Image description

updated tenant.php

Image description

Laravel News Links