“Primitive (first) skills are our shared inheritance.
It is the shared thread which links us to our prehistory
and binds us together as human beings.”
Quotes by Steve Watts

Knowledge is not complete until it is passed on.




SEARCH for Topics on PrimitiveWays

Meet the PrimitiveWays Clan

Submit an Article to PrimitiveWays













Stone Age Technology

E-mail Questions Answered
(updated regularly)

Recommended Books & Magazines

Movies of Interest
(Entertainment, Educational, and How-To videos)

“Native American Buffalo Robes,
A Study of their Role in Plains Indian Societies and a Guide to Traditional Tanning Techniques” by Markus Klek

Stone Age Engineering by Dick Baugh

Stores that Offer Resources for Primitive Technology Projects

TRADING POST – items for sale


Place an order for a Thumb Loop Hand Drill







Cultural History

Friends of the Society of Primitive Technology Activities Calendar for 2014

KAHIKO Arts Workshops – 2014

California Knappers
(monthly flintknapping get-together)

What to Teach Kids and Why

Sharing Old Ways With The Young

First Skills (Interview with Norm Kidder on






Dakota Stove with Clay Pot

Ancient Fire Making (Interview with Dino Labiste on


Carbon – Catalyst To Fire

Some Uses of Fire

Evidence of Ancient Campfires

Campfire Construction – How to Build a Fire

The Miracle of Fire-by-Friction

The Miracle of Fire-by-Friction, Revisited

3 Fire-by-Friction Methods (video)

Fire Thong

The Egyptian Bow Drill

Making Fire with a Bow Drill

Making Fire with a Hand Drill

Hand Drill Fire Making (videos)

A Friction Fire Inquiry: Hand Drill

Starting Fire with a Lens Made From Ice!

Fire Piston

Fire Piston: Primitive Technology for the 21st Century

Bamboo Strike-A-Light

Paleolithic Stone on Stone Fire Technology

Fire-by-Percussion & Fire-by-Compression (video)

The Two-Stick Hearthboard

Hearthboard Variations

Spindle Extension for a Fire Bow Drill

Scarfing a Fire Spindle

Fire-by-Friction Methods of the Australian Aborigines

Smallest Bow Drill Fire-by-Friction Set

Friction Fire Woods and Successful Wood Combinations

Fire-By-Friction: Materials of the San Francisco Bay Region

Fire-by-Friction with Damp Materials

Fire Tube

Got Tinder?

Substitutes for Tinder Fungus

Waterproof Fire Starter

Starting With Fire (Interview with Dino Labiste on

Primitive Cooking 

Adobe Horno

Bamboo Rice Cooker

Imu – Hawaiian Underground Oven

Pit Oven

Boiling With Hot Stones

Boil Water in a Cabbage Leaf

Salmon Cooking

Cattail Pollen Pancakes






California Knapping

Mesoamerican Prismatic Blade Production from Obsidian (video)

Flintknapping Videos by Ken Peek

Flintknapping Videos by Dick Baugh

Flintknapping Videos by Ken Kehoe

The Secrets of the Sinew

Internal Friction on Bow Limbs

Bow and Arrow Efficiency

Ötzi’s Bow

Cordage Backed Bow

Making an Asiatic Composite Bow

Making a Bow From a Sapling

Simple, Cheap & Effective Bows and Arrows

Using a Hatchet to Make a Bow

A Foolproof Method for Bow Tillering

Making a Board Bow

Fletching Jig

Fletching By Hand

Feather Clamp

Arrow Straightening

A Simple Scale for Weighing Arrows

Grow Your Own Bowstring

Archer’s Thumb Ring

Making an Archer’s Thumb Ring from Cow Horn, Antler or Bone

Making an Atlatl from a Branch

Other Types of Atlatls: Loop, Fork and Cord

The Split and Wedge Atlatl

Field Points for Atlatl Darts

Jiffy Arrow & Atlatl Dart Fletch Using Duct Tape

Atlatl Rest, Safety Loop & Anti-Gravity Device (AGD)

Joining Two Atlatl Shafts with a Scarf and Tube Method

The Scarf Key

Ice Glue

Atlatl Dart Tuning

Atlatl Flexibility Analysis

The Dynamics of Spear Throwing

Simple Atlatl Spear Thrower Construction

Atlatl Spur from the San Francisco Bay Area

Atlatl in Ancient Rock Art

The Shingle Dart

Fun with Cattails: The Whip Dart

Bamboo Clay Thrower

Gourd Shot Gun Sling

How to Make a Wooden Canoe Paddle

Spears, Weirs and Traps

The Basics of Woodworking with Stone Age Tools

Making a Bone Awl with Stone Tools

Manufacturing Abalone Shell Circular Fish Hook: California’s Chumash Style

Antler Fishing Hook

Nasal Bone Hook

The Hoko Knife – A quick, simple stone tool

Bamboo Knife (videos)

Antler Handle Knife

The Stone Saw

The Scapular Saw

Crystal-Tipped Hand Drill

Scallop Baking Shells

A Performance of Various Pacific Northwest Shell Types as Containters for Melting Pitch

Opening a Coconut with a Stone






Coconut Knee Drum

Bone Flutes

Primitive Quail Call

Primitive Hand Made Reed Flute

Horsetail Pan Flute

Sycamore Membranophone

Puniu – Hawaiian Knee Drum

Deer Hoof Rattle

Musical Instruments of Central California

Kubing – Traditional Bamboo Instrument

Black Walnut Rattle

Random Thoughts on
Tradition vs. Technology

Primitive Crystal Light!

Mount Diablo

Link to “A Charmstone Discovery in the Redwood Forests of Mendocino County, California”

Link to “Banjo” type ornaments made of red abalone





Deer Scapular Saw

Back to the Pleistocene

The Ohlone Peoples: Botanical, Animal and Mineral Resources

Weaving a Lauhala Mat

Processing Shark Skin into Rawhide

Fresh-Scrape Braintan Buckskin Tutorial

Wringing Net for Small and Slippery Hides

Brain Tanned Buffalo Hides

Tanning a Fox Hide

More Than One Way to Skin a Critter (Part I)

More Than One Way to Skin a Critter (Part II)

Pelt Bag

Removing Deer Hooves

Making a Folded Bark Basket

How to Weave a Basket, a Primer

Homo sapiens - A Basket Case

Southern California Pottery

Rocks, Minerals and Decorative Stones Used by the California Indians

How to Paint a Mammoth

Black Dye

Cordage Making (videos)

Making Cordage By Hand

Cordage in North America

Cordage Fiber Shredder Made From Bone

Processing Yucca Fibers

The Ties that Bind and Bindings that Tie

What Knot to Use in a Primitive Situation

Waorani Hammock

Waorani Fishing Net

Pomo Netting

How to Make a Rabbit Skin Blanket

Some Uses of Ermine Moth Caterpillar Silk

Introduction To Tule Ethnobotany

Twined Tule Mat

Pomo Tule Bittern

Klamath Twined Tule Visor

Paiute Tule Duck Decoy

Cattail Duck

Cattail Doll

Tule Boat Project

Dugout Canoe

Building a Skin-On-Frame Kayak

Four Hour Kayak

Ajumawi Fish Traps

Inuit Thimble

Ulchi-Style Bear Amulet

Willow Rake

Smoothing with Sand, Even-ing with Equisetum

How to Make Pine Pitch

Pitch – Primitive Epoxy

Birch Bark Tar

The Three-Stick Roycroft Pack Frame

The Iceman’s Belt

Making a Leather Knife Sheath

Deer Hide Knife Sheath

Steam Bending Wood

Log Ladder

Wilderness Grooming

Primal Grooming
(Interview with Susan Labiste on

Falconry – Modern and Traditional

Thirty Years in the Jungle!








Tule (bulrush) House

Was Agriculture a Good Idea,
or an Act of Desperation?

Calendar of Harvesting and Gathering


Gathering Basket Making Materials (videos)

Bare-Handed Basket

Useful Plants of California (1)

Useful Plants of California (2)

Useful Plants of California (3)


Plants of California: Soap Plant (Chlorogalum pomeridianum)

Dogbane (Apocynum cannabinum) – Cordage Fibers

Nature’s General Store: The Yuccas and Agaves

Acorn Granaries of California

The Ti Plant Called Ki


Plants of Oceania: Kou (Cordia subcordata)

Hawaiian Plants (a trip to the Big Island)

Bamboo Thoughts and Curing

Bull Whip Kelp

Fishing with Poisons

Fishing with Hawaiian Plants

Wild Shelters
(Interview with Norm Kidder on

Thatched Ohlone Style House


Tule House Project


How to Build an Igloo

Scout Pit

The Primitive Sauna







Tule (bulrush) Boat

I Belong To This Country
(an Australian adventure)

Native California Fall Gathering
at San Luis Reservoir State Recreation Area

Rattlesnake Rendezvous

Australian Aborigine Flint Knapping

Primitive Field Day at Stanford University

Wilderness Survival Skills

Wilderness Survival Skills Revisited

Primitive Skills Campout

Coyote Hills Knap-In and The Gathering of Ohlone Peoples

Winter Count

Rabbitstick Rendezvous





Portable Shaving Horse

How to Make Your Own Steel Knives

A Cutting Edge: Creating a Steel Blade in a Primitive Setting

The Miracle of Steel Heat Treatment

Knife Sharpening Jig

Two Bladed Pocket Knife from PVC and Hacksaw Blades

Wallet Knife (video)

Folding Saw

Johnstone Tools

Horseshoe Nail Notching Tool

Silverware Deadfall

Survival Kit

Portable Shaving Horse

Urban Resources

Alternative Supplies for Urban Dwellers

Wilderness & Urban Tips

Fire by Chemical Reaction

Making Fire Using a Balloon

How to Make a Simple Fire Piston Out of Hardware Store Material

Fire Making Using Solar Power (video)







Hawaiian Stone Adze

Photo Gallery I

Photo Gallery II

Photo Gallery III

Photo Gallery IV

YouTube Videos: Skills of the Past

Interesting Links

“The Info Super Highway Refugee” poem


Cache Invalidation Strategies With Varnish Cache

Go to Source

Phil Karlton once said, “There are only two hard things in Computer Science: cache invalidation and naming things.” This article is about the harder of these two: cache invalidation. It’s directed at readers who already work with Varnish Cache. To learn more about it, you’ll find background information in “Speed Up Your Mobile Website With Varnish.”

10 microseconds (or 250 milliseconds): That’s the difference between delivering a cache hit and delivering a cache miss. How often you get the latter will depend on the efficiency of the cache — this is known as the “hit rate.” A cache miss depends on two factors: the volume of traffic and the average time to live (TTL), which is a number indicating how long the cache is allowed to keep an object. As system administrators and developers, we can’t do much about the traffic, but we can influence the TTL.

However, to have a high TTL, we need to be able to invalidate objects from the cache so that we avoid serving stale content. With Varnish Cache, there are myriad ways to do this. We’ll explore the most common ways and how to deploy them.

Varnish does a whole lot of other stuff as well, but its caching services are most popular. Caches speed up Web services by serving cached static content. When Varnish Cache is delivering a cache hit, it usually just dumps a chunk of memory into a socket. Varnish Cache is so fast that, on modern hardware, we actually measure response time in microseconds!

Caching isn’t always as simple as we think; a few gotchas and problems may take quite some of our time to master. (Image credits)

When using a cache, you need to know when to evict content from the cache. If you have no way to evict content, then you would rely on the cache to time-out the object after a predetermined amount of time. This is one method, but hardly the most optimal solution. The best way would be to let Varnish Cache keep the object in memory forever (mostly) and then tell the object when to refresh. Let’s go into detail on how to achieve this.

HTTP Purging

HTTP Purging is the most straightforward of these methods. Instead of sending a GET /url to Varnish, you would send PURGE /url. Varnish would then discard that object from the cache. Add an access control list to Varnish so that not just anyone can purge objects from your cache; other than that, though, you’re home free.

acl purge {




sub vcl_recv {

	# allow PURGE from localhost and 192.168.55...

	if (req.request == "PURGE") {

		if (!client.ip ~ purge) {

			error 405 "Not allowed.";


		return (lookup);


sub vcl_hit {

	if (req.request == "PURGE") {


		error 200 "Purged.";



sub vcl_miss {

	if (req.request == "PURGE") {


		error 200 "Purged.";



Shortcomings of Purging

HTTP purging falls short when a piece of content has a complex relationship to the URLs it appears on. A news article, for instance, might show up on a number of URLs. The article might have a desktop view and a mobile view, and it might show up on a section page and on the front page. Therefore, you would have to either get the content management system to keep track of all of these manifestations or let Varnish do it for you. To let Varnish do it, you would use bans, which we’ll get into now.


A ban is a feature specific to Varnish and one that is frequently misunderstood. It enables you to ban Varnish from serving certain content in memory, forcing Varnish to fetch new versions of these pages.

An interesting aspect is how you specify which pages to ban. Varnish has a language that provides quite a bit of flexibility. You could tell Varnish to ban by giving the ban command in the command-line interface, typically connecting to it with varnishadm. You could also do it through the Varnish configuration language (VCL), which provides a simple way to implement HTTP-based banning.

Let’s start with an example. Suppose we need to purge our website of all images.

> ban obj.http.content-type ~ “^image/”

The result of this is that, for all objects in memory, the HTTP response header Content-Type would match the regular expression ^image/, which would invalidate immediately.

Here’s what happens in Varnish. First, the ban command puts the ban on the “ban list.” When this command is on the ban list, every cache hit that serves an object older than the ban itself will start to look at the ban list and compare the object to the bans on the list. If the object matches, then Varnish kills it and fetches a newer one. If the object doesn’t match, then Varnish will make a note of it so that it does not check again.

Let’s build on our example. Now, we’ll only ban images that are placed somewhere in the /feature URL. Note the logical “and” operator, &&.

> ban obj.http.content-type ~ “^image/” && req.url ~ “^/feature”

You’ll notice that it says obj.http.content-type and req.url. In the first part of the ban, we refer to an attribute of an object stored in Varnish. In the latter, we refer to a part of a request for an object. This might be a bit unconventional, but you can actually use attributes on the request to invalidate objects in cache. Now, req.url isn’t normally stored in the object, so referring to the request is the only thing we can do here. You could use this to do crazy things, like ban everything being requested by a particular client’s IP address, or ban everything being requested by the Chromium browser. As these requests hit Varnish, objects are invalidated and refreshed from the originating server.

Issuing bans that depend on the request opens up some interesting possibilities. However, there is one downside to the process: A very long list of bans could slow down content delivery.

There is a worker thread assigned to the task of shortening the list of bans, “the ban lurker”. The ban lurker tries to match a ban against applicable objects. When a ban has been matched against all objects older than itself, it is discarded.

As the ban lurker iterates through the bans, it doesn’t have an HTTP request that it is trying to serve. So, any bans that rely on data from the request cannot be tested by the ban lurker. To keep ban performance up, then, we would recommend not using request data in the bans. If you need to ban something that is typically in the request, like the URL, you can copy the data from the request to the object in vcl_fetch, like this:

set beresp.http.x-url = req.url;

Now, you’ll be able to use bans on obj.http.x-url. Remember that the beresp objects turn into obj as it gets stored in cache.

Tagging Content For Bans

Bans are often a lot more effective when you give Varnish a bit of help. If the object has an X-Article-id header, then you don’t need to know all of the URLs that the object is presented as.

For pages that depend on several objects, you could have the content management system add an X-depends-on header. Here, you’d list the objects that should trigger an update of the current document. To take our news website again, you might use this to list all articles mentioned on the front page:

X-depends-on: 3483 4376 32095 28372

Naturally, then, if one of the articles changes, you would issue a ban, like this:

ban obj.http.x-depends-on ~ “\D4376\D”

This is potentially very powerful. Imagine making the database issue these invalidation requests through triggers, thus eliminating the need to change the middleware layer. Neat, eh?

Graceful Cache Invalidations

Imagine purging something from Varnish and then the origin server that was supposed to replace the content suddenly crashes. You’ve just thrown away your only workable copy of the content. What have you done?! Turns out that quite a few content management systems crash on a regular basis.

Ideally, we would want to put the object in a third state — to invalidate it on the condition that we’re able to get some new content. This third state exists in Varnish: It is called “grace,” and it is used with TTL-based invalidations. After an object expires, it is kept in memory in case the back-end server crashes. If Varnish can’t talk to the back end, then it checks to see whether any graced objects match, and it serves those instead.

One Varnish module (or VMOD), named softpurge, allows you to invalidate an object by putting it into the grace state. Using it is simple. Just replace the PURGE VCL with the VCL that uses the softpurge VMOD.

import softpurge;
sub vcl_hit {
	if (req.method == "PURGE") {

		error 200 “Successful softpurge”;



sub vcl_miss {

	if (req.method == "PURGE) {


		error 200 "Successful softpurge";



Distributing Cache Invalidations Events

All of the methods listed above describe the process of invalidating content on a single cache server. Most serious configurations would have more than one Varnish server. If you have two, which should give enough oomph for most websites, then you would want to issue one invalidation event for each server. However, if you have 20 or 30 Varnish servers, then you really wouldn’t want to bog down the application by having it loop through a huge list of servers.

Instead, you would want a single API end point to which you can send your purges, having it distribute the invalidation event to all of your Varnish servers. For reference, here is a very simple invalidation service written in shell script. It will listen on port 2000 and invalidate URLs to three different servers (alfa, beta and gamma) using cURL.

nc -l 2000 | while true
	do read url
	for srv in “alfa” “beta” “gamma”
		do curl -m 2 -x $srv -X PURGE $url

It might not be suitable for production because the error handling leaves something to be desired!

Cache invalidation is almost as important as caching. Therefore, having a sound strategy for invalidating the content is crucial to maintaining high performance and having a high cache-hit ratio. If you maintain a high hit rate, then you’ll need fewer servers and will have happier users and probably less downtime. With this, you’re hopefully more comfortable using tools like these to get stale content out of your cache.

(al, ml, il)

The post Cache Invalidation Strategies With Varnish Cache appeared first on Smashing Magazine.

7 simple ways to build a buzz around your website

Go to Source

thumbnailYour website looks slick, your products and services are amazing, and you’ve launched multiple marketing campaigns. So why isn’t your site producing the numbers you need?

Getting buzz for your site isn’t always easy—but it’s necessary for your business to thrive. If you’re looking to ignite your audience and get them talking about your website, you need the right strategy…

…these 7 tips will help get you there.

1. Tell a compelling story

Every business has a story. How did you get started? What do you do? What’s your value?

You can translate all these elements into a compelling story that speaks to your audience and really gets people talking, or you can write a few dry sentences on each page, list your products and hope for some buzz—although it likely won’t happen.

7 simple ways to build a buzz around your website


2. Offer incentives

Nothing catches people’s attention like a promotion or a freebie. Offer contests with prizes that tie into your brand. Promote discounts. Provide a limited time offer to get word of mouth to spread.

7 simple ways to build a buzz around your website


3. Provide dynamic content

Read the content on your site. Is it engaging and eye-catching?

If you’re not providing a fresh stream of content on your pages that’s worth talking about, people will pass you and your website by.

7 simple ways to build a buzz around your website


4. Get feedback

Want to get people talking about your website? Ask their opinions; post polls and questionnaires; inquire what users think of your products, your site interface, your new logo and other changes and announcements.

People will have plenty to say about you and your website—and it’s a great opportunity to make improvements and evolve to match the needs of your market.


5. Make some news

If you want to promote excitement about your site, do something news-worthy!

Send out press releases detailing changes in your business. Be sure to post news and announcements on your site as well. Keep people talking by shaking things up and showing that your company is evolving and keeping up with the latest consumer trends.

7 simple ways to build a buzz around your website


6. Optimize your social media outlets

You put up a Facebook page and you try to tweet a few times a week, and then wonder why the Web isn’t ablaze with talk of your site.

Social outlets don’t work unless you engage people. Focus on groups that tie into your brand and then post interesting comments, videos and links. Actively converse with people, ask questions and strike up conversations—always an effective way to get people talking.


7. Focus your marketing efforts

Don’t just try to stir up buzz for buzz’s sake. Posting a video of a guy pulling off cool skateboard tricks might attract an audience—temporarily—but it won’t bring in targeted traffic or help your business in the long-run.

Outline a marketing plan and structure a brand-awareness campaign that fits your business model and goals.


Getting people talking about your website takes planning, strategy, and most of all, elements worth talking about. Follow these 7 tips, get site traffic buzzing and get your business humming!


Featured image/thumbnail, buzz image via Shutterstock.

100+ High-Quality Premium Themes & Templates – only $27!
7 simple ways to build a buzz around your website


Page Loading Effects

Go to CODROPS [source]</a


View demo Download source

If you have visited the brilliantly designed websites of Nicolas Zezuka and Active Theory you might have noticed the slick loading animations that happen before new content is displayed. This kind of loading style is quite trendy lately and we wanted to give you some inspiration. The idea is to animate a shape into the viewport and show an activity indicator. When the new content is loaded, the shape will animate back to reveal the page. We’ll use animated SVGs with Snap.svg for the effects because this allows us to create complex shapes and interesting morphing transitions.

Please also note that the examples only serve for your inspiration. We haven’t implemented any fallbacks and we “fake” the dynamic loading of new content. Also note that we are animating SVGs and pseudo-elements which might not work well in some browsers.

The way we show the loading overlay is by defining an animation on a path that we define in the following SVG:

<div id="loader" class="pageload-overlay" data-opening="M 0,0 80,-10 80,60 0,70 0,0" data-closing="M 0,-10 80,-20 80,-10 0,0 0,-10">
	<svg xmlns="" width="100%" height="100%" viewBox="0 0 80 60" preserveAspectRatio="none">
		<path d="M 0,70 80,60 80,80 0,80 0,70"/>
</div><!-- /pageload-overlay -->

We define an initial path that is not visible in the viewport inside of the SVG and a opening and closing path in data attributes on the pageload-overlay division. As you can see, we are using a small viewBox but we stretch the drawing to 100% of the window width and height while not preserving the aspect ratio. If we don’t have a closing path defined, we’ll animate back to the intial path.

Note that we can also add more than one path (separated by a semicolon) which allows for a step wise animation of the SVG drawing like you can see in the first demo.

We set the overlay division to a fixed position, covering all the page, and use a CSS-only loading indicator by styling the ::before and ::after pseudo elements of the division.

.pageload-overlay {
	position: fixed;
	width: 100%;
	height: 100%;
	top: 0;
	left: 0;
	visibility: hidden;
} {
	visibility: visible;

.pageload-overlay svg {
	position: absolute;
	top: 0;
	left: 0;

.pageload-overlay svg path {
	fill: #fff;

We use visibility here because using those fixed positioning styles with pointer-events none on the SVG itself causes some trouble on mobile, so we position and manipulate the parent div instead.

You might have noticed that the circle animations is also done by animating from one path to another (there are of course other ways of doing this, scaling for example) but we used the following values to make sure the circle is “responsive” but does not stretch like the other shapes:

width="100%" height="100%" viewBox="0 0 80 60" preserveAspectRatio="xMidYMid slice"	

Using slice will preserve the aspect ratio but scale the drawing so that the entire viewport is covered by the viewBox.

We’ve only created a bunch of effects, but as you can see, the possibilities are endless.

We really hope you enjoy them and find them inspiring.

The featured image was created with this iMac/Macbook PSD mockup from Pixeden

View demo Download source

List All Available wordpress Roles

Go to source


Here is a snippet showing how to list all available roles. I recently used this snippet to add a role selector in the registration page. You could also use it for user searches, or post filters.

link: List All Available wordpress Roles

List All Available wordpress Roles is a post from: wpsnipp.comWordPress Snippets, Code, Hacks, 615+ for your wordpress theme or blog.