Meerkats Without History: Digging for a Non-Human Past in the Kalahari Desert
The truth is, that man is a creature of greater power than other living creatures are … There be beasts that see better, others that hear better, and others that exceed mankind in all other sense. Man excelleth beasts only in making of rules.
— Thomas Hobbes, The Questions Concerning Liberty, Necessity, and Chance (London, 1656)
In my senior year of college, I became mildly obsessed with the television show Meerkat Manor. The program billed itself as lighthearted reality TV about a cuddly gang of meerkats trying to get along and find grubs in the harsh environment of the Kalahari Desert. It was the Real World meets Survivor—only with humans replaced by tiny mongoose-like creatures known mainly for their adorable posture.
The actual footage and research undergirding the show was surprisingly highbrow. A note at the end of each episode explained that the meerkat group documented in the show was being studied by a University of Cambridge zoological team. These human giants were forever off camera, except for occasional moments when a wayward meerkat happened upon their encampment. In one such encounter, the absurdly small scale of the meerkat was revealed as it stood looking up in mute incomprehension, dwarfed by the leather boots of a bemused English scientist.
Luckily (for American audiences, at least) any threat of didactic content was negated by the fact that the narration came from the guy who plays Sam in The Lord of the Rings. For the most part, old Sam stuck to cliffhanger updates like, “The sun is setting, and the danger seems to have passed,” or offered a folksy running commentary on the despotic whims of Flower, the tribe’s supreme leader.
I was initially sucked in by the escapist soap opera element of the show, which gave every ‘kat a distinctive name (Mozart, Shakespeare, Rocket Dog) and carefully explained their lineages. Almost every meerkat in the group, it turned out, was a direct descendant of Flower, a five-year-old alpha female whose toughness, fecundity, and grim survival skills were unequaled in the rugged stretch of Kalahari that these meerkats called home. My favorite was Flower’s former mate, Yossarion, who the opening credits warned us had “some social problems.” A sinister, Richard III-like figure, Yossarion bore a scar above his left eye that testified to his rare survival of an eagle attack. He’d been dropped on his head from a significant height, and retained a twitchy, crazed unpredictability that made him the show’s obvious villain.
My friends all thought my love for the show was an expression of my soft side, akin to watching videos of sleeping kittens. And it’s certainly true that meerkats are cute. They enjoy group cuddling in their burrow after the workday has drawn to a close, and sometimes they become so overwhelmed by their rapid metabolism that they simply collapse and start napping. They do that cute standing on their hind legs thing for which they’ve won international renown. They even engage in complex social behaviors like wrestling matches and clan warfare, and they teach their young learned techniques like how to remove stingers from scorpions. They’re neat animals.
In truth, though, I was drawn to the darkness of meerkat life. Beneath the kid-friendly surface, a Shakespearan drama was unfurling in those South African burrows. It was like watching King Lear or Titus Andronicus acted out by suricates with brains the size of walnuts. When a close friend gave me a sidelong glance after watching an episode and said, “You know what? You’re kinda like a meerkat,” I took it as a strange sort of compliment, but I had to think about it first.
A typical meerkat inhabits a world of revenge, suffering, and endless toil. The cuddly characters of the show were regularly stung by poisonous asps, lifted off camera in the talons of enormous raptors, or (most common of all) expelled from the group like Old Testament exiles, lost to wander in the desert until they expired from thirst. Even the ‘successful’ meerkats, the ones permitted by the matriarch to have children and live with the group, had lives that resembled Victorian factory workers, spending almost all of their waking hours on the tedious dual tasks of lookout duty and grub-hunting. Watching successive generations of meerkittens enter the world in their cozy dugout burrows, play with their siblings for a few days and then get roped into this life of endless labor began to feel less like an excuse to avoid writing my term paper, and more like an exercise in masochism.
Eventually I stopped watching. It was too much. But the show stuck with me as I entered grad school and became an historian, reading works like E.P. Thompson’s The Making of the English Working Class (1963) and anthropologist Eric Wolf’s The People Without History (1982) that argued for an expansion of the groups surveyed by the historian’s gaze. The past was not the sole domain of elite government actors: it was instead collectively made by countless ordinary people who occupied the edges of traditional historical narrative.
On the occasion of our fifth issue, “Digs,” I began wondering whether the circle could be expanded further. Complex mammal societies like those of primates, dolphins and even the humble meerkat must give us pause when we think about the past. The intergenerational dramas of the Kalahari’s tiny diggers implicitly pose a question I’ve been kicking around for years, and don’t yet have a good answer to. Do animal societies have histories? And if so—does that make history a hell of a lot darker?
Thomas Hobbes helped set the division between human history and natural history on its current course by investigating what he called “the state of nature.” The philosopher held a dim view of humanity. “Man to Man is an errant Wolfe,” he epigraphed one of his books, and in Leviathan he wrote that the “natural condition of mankind” was essentially one of constant warfare, “wherein men live without other security, than what their own strength, and their own invention shall furnish.” Such a life, Hobbes famously concluded, was “solitary, poor, nasty, brutish, and short.”
Hobbes could just as easily be talking about meerkats. When Yosarrion, the villain of Meerkat Manor, is finally expelled from Flower’s brood and forced to wander in the desert in search of a mate, he is stripped of his role in meerkat society. Meerkats organize themselves into complex social groupings, with assigned tasks (finding food, guarding infants, and standing on tall objects looking for eagles) that shift on a daily basis. On their own, meerkats quickly succumb to predation. Only by forming what Hobbes called the “Leviathan” of a “civil society,” a well-ordered group with a leader and internal rules, can meerkat bands effectively survive.
Yet any Enlightenment philosopher—indeed, any early modern European person—would’ve scoffed at my line of argument here. “Animals aren’t the slightest bit like us,” I can imagine this seventeenth-century straw man saying. “We were created by an Almighty God in His divine image; God made the beasts to serve us. They may be sentient creatures, but they are not Rational.” Hobbes was an iconoclast, and he didn’t hew to the Old Testament party line in this regard. Yet he still believed that humans were naturally superior to all other creatures because of our
use of speech, by which men … join their forces together, and by which also they register their thoughts that they perish not, but be reserved, and afterwards joined with other thoughts, to produce general rules for the direction of their actions.
In short, the key—indeed the only—human gift is our ability to remember, and to organize and learn from our collective memories. Which, of course, is simply another way of saying “history.”
When I was a kid, I loved Richard Adams’ classic adventure novel Watership Down.
Adams modeled his narrative on Virgil’s Aeneid, inventing a complex society of anthropomorphized rabbits whose idyllic South English burrow is destroyed by construction work. A handful of dazed survivors manage to escape, traveling the countryside in search of a new homeland. The core of the story is Adams’s marvelous ability to evoke the mental life of a rabbit (the main characters are terrified by just about everything that doesn’t involve leafy greens) while imbuing them with human emotions, thoughts, and even nobility. It’s a masterpiece of the animals-as-humans genre that has yet to be equaled, as far as I can tell.
When we narrate animal lives—both in fiction like Watership Down or the Redwall books or Finding Nemo, or in documentaries like March of the Penguins—we can’t resist the urge to invest them with our own emotions.
But what happens when we treat animals as actual animals? Can we write historical narratives about non-humans that avoid anthropomorphized emotions, yet treat them respectfully as thinking, sentient beings who share with us a fundamental subjectivity, a sense of themselves as themselves? And if so, what in the world would such a narrative look like?
Meerkat Manor fascinates me still, because it lays bare the strangeness of how we narrate animal pasts. The show was framed with kooky music, a comforting narrative voice, and a cute name (a more accurate one would be Meerkat Hole in the Ground or Meerkat Endless Terrifying Desert Filled with Scorpions, but those don’t have quite the same ring).
In truth, though, the lasting value of Meerkat Manor is that it was surprisingly blunt about the brutal lives of its subjects.
I’ll never forget the moment when Shakespeare, one of Flower’s strongest children, is bitten by a puff adder, causing his leg to swell and become immobile. He’s a goner. But, miraculously, Shakespeare’s sister finds him twitching in the sand, and drags him back to the burrow they share. She even appears to tend to him, licking his wound and bringing him herbs to nibble on. Shakespeare survives. It’s a remarkable moment, and I was genuinely moved by it. But for every story like that, Meerkat Manor brought us darker ones, like when Yossarion, in a moment of derangement, drags his infants out from their burrows and leaves them to die in the sand for reasons unknown to the show’s producers, and maybe to Yossarion as well.
The uneasy distance between the stark realism at the show’s core and the cute animal trappings that disguised it was widened by the death of the matriarch Flower in 2006. Fatally wounded by a snake, Flower succumbed to venom before the camera’s unblinking eye. Viewers were outraged, questioning whether it was ethical for the producers to stand by and watch her death rather than administer anti-venom. The producers rejoined that the goal of the Cambridge meerkat project was to study “the breeding success and survival of individuals and … the factors that affect reproduction and survival.” Intervening in the natural order of things wasn’t in their ambit. Indeed, it would be an injustice to the empirical methods and goals that underlay the project: if researchers intervened in meerkat lives, their own scientific efforts would be invalidated.
The show Meerkat Manor was only an illusory epiphenomenon, an excrescence of cuteness, atop the workings of the Cambridge zoology group that was actually monitoring the individuals involved. And Animal Planet viewers can’t mess with Science.
Meerkats are not people, events like this tell us, no matter how many human names we give them. It’s fun to imagine their passions, fears, and hopes as if they were characters in an epic novel or a Shakespearian drama. In reality, they’re largely creatures of habit acting out genetically encoded behaviors. (One could argue that humans aren’t much different, however—we simply play out our genetically encoded behaviors in a way that provides more individual freedom of movement.)
And yet I firmly believe that meerkats and other higher-order mammals do have a history, of a sort. I’m not talking about the natural history of biologists, which is concerned with their average lifespan, their feeding habits, their reproductive cycles. I mean the history of historians. This type of history, the kind I enjoy doing and reading, is grounded in imaginative leaps that bear a core resemblance to those of the novelist or poet. It’s about putting your own experience of the world to one side and trying as hard as you possibly can to imagine someone else’s experience. What is it like to live in a meerkat society? On what internal principles do they organize themselves? What do they dream about? When they gather in the desert at night and make high-pitched sounds as a group, are they singing? What is meerkat subjectivity? To paraphrase philosopher Thomas Nagel, what is it like to be a meerkat?
This is a history of animals that has yet to be written. But scientists are increasingly brushing up against its edges, every year making new discoveries about the outer limits of animal intelligence. As it grows ever more clear that non-human brains can experience emotion, remember, dream, and even reason, the need for a new kind of animal history becomes obvious.
Animal history, to be sure, is already a burgeoning field. Many recent works of animal history have been innovative and even brilliant: I’d single out Sam White’s “Capitalist Pigs,” Virginia De John Anderson’s Creatures of Empire, Peter Sahlins’s work on the menageries of the French Enlightenment, and Donna Haraway on primates. But they continue to chart animal histories only insofar as they influenced human histories. Perhaps there’s room now for a type of history that moves smoothly between the natural history of the life sciences and the more individualistic narratives of historians—and between human and animal subjectivities.
Who will write it?


https://docs.python.org/3/library/index.html
Names (or variables) refer to objects. Names are introduced by name binding operations.
Variables could be thought of as a sticky label you can place on a value.
# The following constructs bind names. name1 = expression # assignements name2 = name1 # the same value with two 'labels' def function_name(parameter_name): # function definitions pass class ClassName: # class definitions pass import module_name # import statements for item_name in sequence: pass with expression as context_name: # with statements pass try: statements except exception_name as exception_instance_name: statements del some_name # unbinding names
>>> X Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'X' is not defined >>> X = 11 # creating X >>> X # checking a value 11 >>> del X # destroying the variable X (the value 11 can survive) >>>
import sys word1 = "qwertyuiop" sys.getrefcount(word1) # 2 word2 = word1 sys.getrefcount(word1) # 3 sys.getrefcount(1) # 149 word2 = 2021
# name # +-----------+ # | "word1" | string (value) # +-----------+ +--------------+ # | reference |-------o| "qwertyuiop" | # +-----------+ +--------------+ # | refs counter | # name +--------------+ integer (value) # +-----------+ o +--------------+ # | "word2" | (1) | | 2021 | # +-----------+-------------+ +--------------+ # | reference |------------------------o| refs counter | # +-----------+ (2) +--------------+
https://docs.python.org/3/library/keyword.html
'Keywords' cannot be used as ordinary identifiers.
>>> help() # Py2 and Py3 help> keywords ... help> quit >>>
import keyword # Py3 keyword.kwlist # sequence containing all the keywords keyword.iskeyword("True") # True keyword.iskeyword("self") # False keyword.iskeyword("max") # False
(1) Find all the keywords of the language.
(2) Check reference counters for several numbers and strings.


When decisions are <irreversible>
, time is <irrevocable>
and information is <none>
; how to decide how many options to consider?
To optimise your chances for selecting the best, use
<Look-Then-Leap>
In [100] applicants, explore [37%] first to gather information. After which, only commit to anyone who is better than the first 37 candidates (if not take the last applicant). Selects the best candidate about 37% of the time.
Immediately accept an applicant if he is above a certain percentile
Percentile changes according to number of applicants remaining in the pool.<Inserts graph>
Questions: Where to park? Who to hire? When to settle?
When time is <limited>
An optimal policy to maximise the expected discounted rewards, using
<Grittins Index>
+ <Win-Stay, Lose-Shift>
Gambling: Players has no knowledge and needs to decide which machine gives the most payoff. Only change until the expected pay-off is not achieved after a particular pull.
<Inserts Grittins Index Table>
Depends on what appeals to you at that moment in time.
Imagine a toddler, like a blank white page. He has to explore at his initial life stages; to acquire knowledge, skills. As he progresses, he will gradually decide what he wants to do. That is when he will enter the exploitation phase where he continuously
"To try and fail is at least to learn; to fail to try is to suffer the inestimable loss of what might have been"


Presented by Ben Ramseth / @esriMapNinja
What is possible???
There are many IDE/Text Editor options out there and it is really up to you. Personal preference.
What is possible???
Getting started with the API
Working with the Web Optimizer
Locate a good sample/tutorial to start from
Capabilities include the following: • Application registration (taking advantage of OAuth) • Creating hosted services • Monitoring application and credit usage • Downloading SDKs • Testing credit-based services such as Elevation, GeoEnrichment, and Spatial Analysis
Tutorials, conceptual help, the API Reference, samples, community resources, Web application templates, and others.
Standard, Compact (Hosted, secure, Local), and custom build using the Web Optimizer.


{% extends "polls/base.html" %} {% block content %}
{{the_question.question_text}}
Poll results
{{choice.choice_text}} : {{choice.votes}}


| Signature | Description | Parameters |
template<typename T, typename ... Ts>
void
sort(const char *name, sort_spec dir);
|
Sort the DataFrame by the named column. If name equals "INDEX", it sorts by index. Otherwise it sorts by the named column. Sort first calls make_consistent() that may add nan values to data columns.
nan values make sorting nondeterministic.
|
T: Type of the by_name column. You always of the specify this type, even if it is being sorted to the default index
Ts: The list of types for all columns. A type should be specified only once.
name: The name of a column or string "INDEX".
dir: Direction of sorting, ascending or descending
|
template<typename T1, typename T2, typename ... Ts>
void
sort(const char *name1, sort_spec dir1, const char *name2, sort_spec dir2);
|
This sort function sorts DataFrame based on two columns, also specified by the two directions. name[n] could be "INDEX" in whcih case the index column is taken as the sorting column.
NOTE: The order of T[n] type specifications must match the order of name[n] column names. In addition, all column types must be specified separately. Otherwise, the behavior is undefined.
NOTE: Sort first calls make_consistent() that may add nan values to data columns. nan values make sorting nondeterministic.
|
T1: Type of the first named column. You always must specify this type, even if it is being sorted by the index.
T2: Type of the second named column. You always must specify this type, even if it is being sorted by the index.
Ts: List all the types of all data columns. A type should be specified in the list only once.
name1: Name of the first column or string "INDEX"
name2: Name of the second column or string "INDEX"
dir1: Direction of sorting for the first column
dir2: Direction of sorting for the second column
|
template<typename T1, typename T2, typename T3, typename ... Ts>
void
sort(const char *name1, sort_spec dir1, const char *name2, sort_spec dir2, const char *name3, sort_spec dir3);
|
This sort function is similar to above, but it uses 3 columns
|
|
template<typename T1, typename T2, typename T3, typename T4, typename ... Ts>
void
sort(const char *name1, sort_spec dir1, const char *name2, sort_spec dir2, const char *name3, sort_spec dir3, const char *name4, sort_spec dir4);
|
This sort function is similar to above, but it uses 4 columns
|
|
template<typename T1, typename T2, typename T3, typename T4, typename T5, typename ... Ts>
void
sort(const char *name1, sort_spec dir1, const char *name2, sort_spec dir2, const char *name3, sort_spec dir3, const char *name4, sort_spec dir4, const char *name5, sort_spec dir5);
|
This sort function is similar to above, but it uses 5 columns
|
|
| Signature | Description | Parameters |
template<typename T, typename ... Ts>
std::future<void>
sort_async(const char *name, sort_spec dir);
|
This is the asynchronous version that returns a std::future. Please see above for details
|
|
template<typename T1, typename T2, typename ... Ts>
std::future<void>
sort_async(const char *name1, sort_spec dir1, const char *name2, sort_spec dir2);
|
This is the asynchronous version that returns a std::future. Please see above for details
|
|
template<typename T1, typename T2, typename T3, typename ... Ts>
std::future<void>
sort_async(const char *name1, sort_spec dir1, const char *name2, sort_spec dir2, const char *name3, sort_spec dir3);
|
This is the asynchronous version that returns a std::future. Please see above for details
|
|
template<typename T1, typename T2, typename T3, typename T4, typename ... Ts>
std::future<void>
sort_async(const char *name1, sort_spec dir1, const char *name2, sort_spec dir2, const char *name3, sort_spec dir3, const char *name4, sort_spec dir4);
|
This is the asynchronous version that returns a std::future. Please see above for details
|
|
template<typename T1, typename T2, typename T3, typename T4, typename T5, typename ... Ts>
std::future<void>
sort_async(const char *name1, sort_spec dir1, const char *name2, sort_spec dir2, const char *name3, sort_spec dir3, const char *name4, sort_spec dir4, const char *name5, sort_spec dir5);
|
This is the asynchronous version that returns a std::future. Please see above for details
|
|


--- title: Working layout: simple_top --- {% include headline.html %}
In a perfect world - you would see my address


tensorlayer.nlp
¶
generate_skip_gram_batch (data, batch_size, ...) |
Generate a training batch for the Skip-Gram model. |
sample (a[, temperature]) |
Sample an index from a probability array. |
sample_top (a[, top_k]) |
Sample from top_k probabilities. |
Word embedding functions¶
-
tensorlayer.nlp.
generate_skip_gram_batch
(data, batch_size, num_skips, skip_window, data_index=0)[source]¶ Generate a training batch for the Skip-Gram model.
- data : a list
- To present context.
- batch_size : an int
- Batch size to return.
- num_skips : an int
- How many times to reuse an input to generate a label.
- skip_window : an int
- How many words to consider left and right.
- data_index : an int
- Index of the context location. without using yield, this code use data_index to instead.
- batch : a list
- Inputs
- labels : a list
- Labels
- data_index : an int
- Index of the context location.
Setting num_skips=2, skip_window=1, use the right and left words. In the same way, num_skips=4, skip_window=2 means use the nearby 4 words.
>>> data = [1,2,3,4,5,6,7,8,9,10,11] >>> batch, labels, data_index = tl.nlp.generate_skip_gram_batch( data=data, batch_size=8, num_skips=2, skip_window=1, data_index=0) >>> print(batch) ... [2 2 3 3 4 4 5 5] >>> print(labels) ... [[3] ... [1] ... [4] ... [2] ... [5] ... [3] ... [4] ... [6]]
-
tensorlayer.nlp.
sample
(a, temperature=1.0)[source]¶ Sample an index from a probability array.
- a : a list
- List of probabilities.
- temperature : float or None
The higher the more uniform. When a = [0.1, 0.2, 0.7],
temperature = 0.7, the distribution will be sharpen [ 0.05048273 0.13588945 0.81362782] temperature = 1.0, the distribution will be the same [0.1 0.2 0.7] temperature = 1.5, the distribution will be filtered [ 0.16008435 0.25411807 0.58579758]If None, it will be
np.argmax(a)
No matter what is the temperature and input list, the sum of all probabilities will be one. Even if input list = [1, 100, 200], the sum of all probabilities will still be one.
For large vocabulary_size, choice a higher temperature to avoid error.


Convert .tour
json description file to an html file that can be published as a blog post.
This way, I can at the same time document some codebase for onboarding and also publish it as a blog post.
Only once
npm install @11ty/eleventy-plugin-syntaxhighlight --save-dev
Then when you want to generate
npx @11ty/eleventy --output=dist
posts/tours
, add an exported code tour file. Renamed the following way.
my-tour-name.tour
becomes my-tour-name.tour.22tydata.json
my-tour-name.tour.md
Ex.
posts/tours
mobilizon-frontend.tour.11tydata.json
mobilizon-frontend.tour.md
You don't need to change the content of the code tour file except for its name
In the markdown file, you must set variables for the repository url and for the file browsing URL of the repo.
in mobilizon-frontend.tour.md
it is done the following way :
---
repoUrl: https://framagit.org/framasoft/mobilizon
repoFileBrowseUrl: https://framagit.org/framasoft/mobilizon/-/blob
---
When generated, you can see the html here : http://localhost:8080/posts/tours/mobilizon-frontend.tour/
npx @11ty/eleventy


To keep everyone fuelled we’re delighted to announce that the World Champion BBQ team “Bunch of Swines” will be feeding everyone with a selection of smokey treats throughout the day.
We have also tried to take into account dietary requirements by providing alternative choices that are suitable for both vegans and vegetarians
V = Suitable for Vegans & Vegetarians
Registration:
PastriesSelection of Fresh Fruit (V)
Mid-Morning Break:
Homemade Dry Cured Bacon RollsVegetable Rolls (V)
Lunch:
Self Service Taco BarCorn Tortillas (V)
BBQ Beef Brisket & BBQ Pulled Pork - Slow Smoked for 15hrs
Pulled Jack Fruit (V)
Optional toppings
- Salsa (V)
- Lettuce (V)
- Cheese
- Sour Cream
Assorted Cakes
Dairy and Gluten Free Cheese Cake (V)
Afternoon Snack:
Assorted CookiesSelection of Fresh Fruit (V)


|
Kernel Allocator
1.0
A small kernel allocator written for Operating Systems 2 class
|
Class providing interface for the slab allocator. More...
#include <SlabUtility.h>
Static Public Member Functions | |
| static cache_header_s * | create (const char name[], size_t object_size, void(*constructor)(void *), void(*destructor)(void *)) noexcept |
| Allocate cache. More... | |
| static int | shrink (cache_header_s *cache) noexcept |
| Shrink cache. More... | |
| static void * | allocate (cache_header_s *cache) noexcept |
| Allocate one object from cache. More... | |
| static void | deallocate (cache_header_s *cache, void *object) noexcept |
| Deallocate one object from cache. More... | |
| static void * | bufferAllocate (size_t size) noexcept |
| Allocate one small memory buffer. More... | |
| static void | bufferDeallocate (const void *buffer) noexcept |
| Deallocate one small memory buffer. More... | |
| static void | destroy (cache_header_s *cache) noexcept |
| Deallocate cache. More... | |
| static void | printInfo (cache_header_s *cache, std::ostream &os) noexcept |
| Print cache info. More... | |
| static int | printErrors (cache_header_s *cache, std::ostream &os) noexcept |
| Print error message. More... | |
Private Member Functions | |
| Slab ()=delete | |
| Slab (const Slab &)=delete | |
| void | operator= (const Slab &)=delete |
Class providing interface for the slab allocator.
|
privatedelete |
|
privatedelete |
|
staticnoexcept |
Allocate one object from cache.
| cache | Pointer to the cache |
|
staticnoexcept |
Allocate one small memory buffer.
| size | Size of the buffer |
|
staticnoexcept |
Deallocate one small memory buffer.
| buffer | Pointer to a buffer obtained by bufferAllocate |
|
staticnoexcept |
Allocate cache.
| name | Name of the cache |
| object_size | Size of the object in cache |
| constructor | Constructor |
| destructor | Destructor |
If there is no need for a constructor or destructor, the user should pass nullptr in their place
|
staticnoexcept |
Deallocate one object from cache.
| cache | Pointer to the cache |
| object | Pointer to the object |
|
staticnoexcept |
Deallocate cache.
| cache | Pointer to the cache |
|
privatedelete |
|
staticnoexcept |
Print error message.
| cache | Pointer to the cache |
| os | Output stream |
|
staticnoexcept |
Print cache info.
| cache | Pointer to the cache |
| os | Output stream |
|
staticnoexcept |
Shrink cache.
| cache | Pointer to the cache |


Start with our home made dough, marinara sauce and mozzarella cheese. Base price for a small is $10, medium is $15, large is $20 and extra large is $25. All toppings, including alternate sauces, are 75 cents each.


Most tribes have their own unique naming systems. Some use names of decesed loved ones, others are named after their grandparents while others are named after legends according to the culture history.
Akan names are derived from the Ghananian culture. The naming system in Ghana is a unique system not experienced elsewhere in the world. New born babies are named putting into consideration not only their genders but also the day of the week they were born. New born boys and girls have their own set of names to choose from.
Below is the list of male and female names to choose from for a new born in Ghana:


1. Faculty Introduction
Humanities Faculty offers three undergraduate programs，Social Work, Public Affairs Management and Secretary Science. And it has a comprehensive laboratory including Social Work, Public Affairs Management, Secretary Science and other experimental chamber. There are 36 staff members, including 32 full-time teachers, 1 professor, 8 associate professors, 27 holding doctorate and master's degree. There are 650 students. Besides undertaking three professional talent training, the Faculty undertakes the optional courses of humanities and social sciences in the institute. On the basis the two institute-level original key Level II disciplines, sociology and politics theories, the Faculty prepares to built the discipline of public management which is listed as the key construction discipline by the institute. The team has about 50 members.
2. Undergraduate Programs Introduction
2.1 Public Affairs Management
This Program aims to cultivate application-oriented advanced talents. The students can access to public affairs management training. Before graduation, students should master the basic principles and knowledge of Management, Law and Sociology. With the spirit of public service and their innovative ability, students will be engaged in related public affairs management, services and research work for e-government, urban management and public human resource management.
2.2 Social Work
This program aims to cultivate senior applied talents with practical and all-round developing capacities that meet the demands of socialist modernization and local social and economic development, have innovative spirit and social responsibility and have a good command of knowledge in sociology, management and psychology domains
2.3 Secretary Science
This program aims to cultivate high quality applied talents working in the field of secretarial and management. Graduates are supposed to possess a wide range of basic theoretical knowledge of Secretary Science and strong practical ability what can make them engage in the secretarial science related work such as public relations, human resource management, and administrative assistants.
Contact us
Dean: Wang Zhengzhong Professor
Post Code: 223001
Phone: +86<PHONE_NUMBER>0
Email: cjsw @hyit.edu.cn


--- layout: post title: WebDrawer custom_scripts categories: [] tags: webdrawer status: publish type: post published: true meta: {} ---
I am off to IGF Melbourne today so just a short post. The other day I introduced custom_head, which allows us to inject code into the WebDrawer HTML head element. I omitted to mention that there is also custom_scripts.cshtml. This allows you to inject code after the WebDrawer scripts at the bottom of the page. The top of the page is typically the place to load styles and the bottom the place to load scripts.


The Hydra series is the fastest direct-digital, dual-energy, photon-counting X-ray detector on the market. Developed around XCounter's powerful CdTe-CMOS hybrid sensor, the Hydra delivers a wide range of capabilities across a broad range of x-ray energy energies. The Hydra sensor provides outstanding imaging in either frame or time-delayed summation (TDS) mode, with a scan speed of an incredible >20000 fps.
The FX35 has a standard active area of 36cm x 0.6cm, and comes in a range of CdTe thicknesses of 0.75mm for standard applications and 2mm for high energy X-ray applications.
Dual-energy acquisition with anti-coincidence technology is a key factor in the advanced capabilities of the Hydra FX35. During dual-energy acquisition, the energy of the detected photon is compared to two independent thresholds that are read out separately. The two energy sets can be used for material differentiation, opening the door to new imaging techniques in both medical and industrial X-ray. Most critically the Hydra series detectors have the fastest commercially available anti-coincidence technology, which produces superior energy resolution by ensuring the attribution of each single photon signal to the correct pixel. In the FX35 this powerful anti-coincidence (charge sharing) technology operates across the full length of the detector at ultra-fast speeds.
The FX35 is a perfect balance between cost and detector length for fast imaging applications par This makes it suitable for FOOD applications such as canning plants and also as the reliable basis for quality control; DUPRO testing. The fast frame rates enable imaging at speeds of 2m/s making it ideal for fast throughput manufacturing. The speed also means that the FX35 has application in the DENTAL and MEDICAL sectors where low dose, high quality imaging is necessary.
The Hydra sensor is connected to the computer via a GigE interface. The detector comes with a fully flexible software development kit which runs on Windows 7 and upwards. The detector is bundled with engineering software which exposes the various functionalities available.
| Dimensions L x W x H | 42.8cm x 12cm x 6.7cm |
| Temperature Control | Internal Peltier Temperature Control |
| Ambient temperature range | +10 to +30°C @ 85% humidity |
| Storage temperature range | -10 to +60°C @ 10% to 95% humidity |
| X-ray window | Carbon Fibre, 500um thick |
| X-ray shielding | Depending on application |
| Sensor type | Dual-Energy Photon Counting CdTe-CMOS |
| Sensor thickness | 0.75mm – 2.0mm CdTe |
| Detector Active Area | 36cm x 0.6cm (3584 x 64 pixels) |
| Native Pixel Size | 100 um |
| Effective Pixel Size | down to 30um |
| Pixel Fill factor | 100% |
| Frame rate | up to 20,000fps |
| Counter dynamic range | 12 bits |
| TDS dynamic range | 18 bits |
| Image binning | 2 x 2, 4 x 4 |
| Acquisition time | 100us – 1 min + |
| DQE (0) | 85% @ RQA5 spectra |
| MTF | > 80% @ 2 lp/mm > 45% @ 5 lp/mm |
| Tube kV RANGE | 5 – 300 |
| External trigger available output | Opto-coupled 3.3 – 24V selectable |
| Output | Opto-coupled Open Collector |
| Lag | <0.1% after X-rays (12uGy) |
| Ghosting | <0.1% 1 min after X-rays (12uGy) |


{% extends '_layouts/layout_2-3.html' %} {% block page_title %}Index : {{serviceName}}{% endblock %} {% block pageTitle %}Symptoms and conditions / MVP v1.1{% endblock %} {% block pageIntro %}
This is a proposed production candidate.
It is based on exploration v2.1.
{% endblock%} {% block content %}


| MATLAB 文件帮助: cv.Canny | 查看 cv.Canny 的代码 | Index |
Canny Finds edges in an image using the Canny algorithm
edges = cv.Canny(image, thresh)
edges = cv.Canny(image, thresh, 'OptionName', optionValue, ...)
[low_thresh,high_thresh]
.image
.sqrt((dI/dx)^2 + (dI/dy)^2)
should be used to compute the image
gradient magnitude (L2gradient=true
), or whether the default L1 norm
abs(dI/dx) + abs(dI/dy)
is enough (L2gradient=false
).
Default falseThe function finds edges in the input image image and marks them in the output
map edges using the Canny algorithm. When thresh
is 2-element vector, the
smallest value between them is used for edge linking. The largest value is
used to find initial segments of strong edges. When thresh
is a scalar, it is
treated as a higher threshold value and 0.4*thresh
is used for the lower
threshold. See http://en.wikipedia.org/wiki/Canny_edge_detector
[Canny86]:
John Canny. A computational approach to edge detection. Pattern Analysis and Machine Intelligence, IEEE Transactions on, (6):679-698, 1986.


| smooth2random {mgcv} | R Documentation |
A generic function for converting mgcv
smooth objects to forms suitable for estimation as random effects by e.g. lme
. Exported mostly for use by other package developers.
smooth2random(object,vnames,type=1)
object |
an |
vnames |
a vector of names to avoid as dummy variable names in the random effects form. |
type |
|
There is a duality between smooths and random effects which means that smooths can be estimated using mixed modelling software. This function converts standard mgcv
smooth objects to forms suitable for estimation by lme
, for example. A service routine for gamm
exported for use by package developers.
A list.
rand |
a list of random effects, including grouping factors, and a fixed effects matrix. Grouping factors, model matrix and model matrix name attached as attributes, to each element. |
trans.D |
A vector, trans.D, that transforms coefs, in order [rand1, rand2,... fix] back to original parameterization. If null, then taken as vector of ones. |
trans.U |
A matrix, trans.U, that transforms coefs, in order [rand1, rand2,... fix] back to original parameterization. If null, then not needed. If null then taken as identity. |
Xf |
A matrix for the fixed effects, if any. |
fixed |
|
rind |
an index vector such that if br is the vector of random coefficients for the term, br[rind] is the coefs in order for this term. |
pen.ind |
index of which penalty penalizes each coefficient: 0 for unpenalized. |
Simon N. Wood<EMAIL_ADDRESS>Wood S.N. (2017) Generalized Additive Models: An Introduction with R (2nd edition). Chapman and Hall/CRC Press.
library(mgcv) x <- runif(30) sm <- smoothCon(s(x),data.frame(x=x))[[1]] smooth2random(sm,"")


Athenz is an open source platform for X.509 certificate based service authentication and fine grained access control in dynamic infrastructures. It provides a generalized model for authorized service providers to launch other services identified by their X.509 certificates in an authorized way through a callback-based verification model. Athenz also supports role-based authorization (RBAC) for provisioning and configuration (centralized authorization) use cases as well as serving/runtime (decentralized authorization) use cases to handle on-box enforcement.
Athenz provides secure identity in the form of short-lived X.509 certificates for every workload or service deployed in private (e.g. OpenStack, Kubernetes, Screwdriver) or public cloud (e.g. AWS EC2, ECS, Fargate, Lambda). Using these X.509 certificates, clients and services establish secure connections and through mutual TLS authentication verify each other's identity. The service identity certificates are only valid for 30 days and the service identity agents (SIA) part of those frameworks automatically refresh them daily. The term service within Athenz is more generic than a traditional service. A service identity could represent a command, job, daemon, workflow, as well as both an application client and application service.
Once the client is authenticated with its X.509 certificate, the service can then check if the given client is authorized to carry out the requested action. Athenz provides fine-grained role-based access control (RBAC) support for a centralized management system with support for control-plane access control decisions and a decentralized enforcement mechanism suitable for data-plane access control decisions. It also provides a delegated management model that supports multi-tenant and self-service concepts. Learn More
A traditional centralized mechanism works as expected for services that are not dealing with the decentralized authorization: the server with resources can simply ask the ZMS directly about access, passing the service identity and resource/action information to get a simple boolean answer. It is suitable for provisioning and configuration use cases where latency for authorization checks is not important. Learn More
A more interesting scenario introduces the local policy engine (ZPE), and a few supporting changes. Rather than directly asking for an access check with a principal identity, the identity is instead used to get a ZToken, and that is presented to the target service until it expires. This mechanism allows a service to make a completely local access check against ZPE, given a ZToken and locally cached policies. Learn More
When working with AWS, Athenz provides support to access AWS services from on-prem services by using AWS temporary credentials rather than static credentials. Athenz ZTS server can be used to request AWS temporary credentials for configured AWS IAM roles.
Domains are namespaces, strictly partitioned, providing a context for authoritative statements to be made about the entities it contains.
To implement access control, we have policies in our domain that govern the use of our resources. A policy is set of assertions (rules) about granting or denying an operation/action on a resource.
A role can be thought of as a group and anyone in the group can assume the role that takes a particular action. Every policy assertion describes what can be done by a role.
The actors in Athenz that can assume a role are called principals. These principals are authenticated and can be users or services. Athenz currently provides service identity and authentication support.
Explore the Athenz documentation and easily create a test development environment with ZMS (Athenz Management Service), ZTS (Athenz Token Service), and UI services. For reference implementation, visit the Java Client/Servlet or Go Client/Server example documentation.


--- layout: post authors: ["Greg Wilson"] title: What Does Done Look Like? date: 2013-05-26 time: "09:00:00" favorite: true tags: ["Community"] ---
After recent posts about where we are, our infrastructure, and our plans for the summer break, it seems like a good time to raise our sights and ask how we want Software Carpentry to run once it's all grown up, and what the practice of science will look like when every grad student in the world goes through our training. (Pause for maniacal supervillain laugh.)
We'll leave the second question to another post, but the infrastructure post implies answers to the first. Now that we're using a "host site pays travel costs model", there's no financial obstacle to us scaling up to a thousand bootcamps a year worldwide. What prevents us are a lack of instructors (to teach) and administrators (to coordinate who's going where). We're working on the first (our online training should give us 75 qualified instructors by the fall) but we need much better tooling to handle the matching: while We encourage people to set up bootcamps on their own, we'd still like to know about them so that we can help with advertising and ensure that our criteria for using the Software Carpentry name and logo are met. We will also need more regional coordinators to do what Mike Jackson is so ably doing in the UK.
Here's how it could work two years from now:
The Department of Redundancy Department at Euphoric State University has twenty-six new graduate students starting this September, and would like to run a bootcamp for them, and for the half-dozen undergrads in the department who are thinking about applying to grad school. Meanwhile, Paula Postdoc is planning to be in Euphoria for a conference, and would like to use the opportunity to organize a bootcamp. She attended one at Miskatonic University three years ago, helped out with one after that, then worked through the Software Carpentry instructor training and helped teach a couple of times (which has earned her an instructor's badge).
Euphoric State posts a bid to host a bootcamp on the Software Carpentry exchange. The exchange notifies Paula that there's a new bid matching her criteria (which are "anything in Western Canada or near a beach"), so she replies with her dates. After a bit of back and forth, ESU chooses her as the lead instructor for their bootcamp, and it is added to the Software Carpentry calendar. This automatically sets up a mailing list for organizers, a registration form, a pre-assessment questionnaire to gather information about attendees' skills and interests, and a blog post announcing the bootcamp, and creates a new fork of the bootcamp repository.
As lead instructor, Paula is responsible for maintaining the bootcamp's web presence, defining the exact schedule, and so on. She decides to use a three-day format: the first two days will be Software Carpentry's agreed core curriculum, while the third will cover refluxive bisection techniques (currently a hot topic in redundancy research) and open access over-the-web scientific publishing tools (which faculty attending the bootcamp are clamoring to learn). After getting this signed off by the Software Carpentry admins, she recruits a junior co-instructor through the exchange. Meanwhile, her hosts connect her with a couple of ESU grad students who are interested in helping out (and potentially becoming instructors themselves).
The bootcamp takes place:
Once it's over, Paula and her hosts are contacted for feedback. (The attendees, who were asked to fill in a standard questionnaire at the end of the bootcamp, will be surveyed again six months later to find out what actually stuck.) As part of their feedback, Paula and her co-instructors are asked to nominate people to join the instructor training program. Paula and her co-instructor also submit their expense claims to ESU.
Two weeks later, after she's had a chance to catch up with the rest of her life, Paula merges a couple of fixes and examples from her bootcamp's repository into the master copy so that other people can use them. She also writes a blog post summarizing the bootcamp and adds a comment to the instructor's guide to suggest another way to motivate dictionaries in Python.
This isn't the only way Software Carpentry could eventually work, but it looks like a good one to me. What else would you like to see?


WITNESS LIST Education Committee April 25, 2001 - 9:00A HB 506 Registering, but not testifying: For: Borden, Sandi Executive Director (Texas Elementary Principals and Superivsors Association), Austin, TX HB 1467 Registering, but not testifying: On: Guzman, Dr. Ana "Cha" Executive Vice President (Austin Community College), Austin, TX Young, Linda (Austin Community College), Austin, TX HB 1641 Registering, but not testifying: For: Escobar, Felicia Policy Analyst (National Council of La Raza), San Antonio, TX Kauffman, Al Regional Counsel (Mexican American Legal Defense and Education Fund), San Antonio, TX On: Alford, Roger (Texas Higher Education Coordinating Board), Austin, TX HB 2840 Registering, but not testifying: On: Hensley, Stephen President (Texas A&M University - Texarkana), Texarkana, TX SB 273 Registering, but not testifying: For: Coffey, Jeanie Legislative Assistant (Texas Retired Teachers Association), Austin, TX Lehr, Mike Legislative Coordinator (Texas Retired Teachers Association), Austin, TX On: Carpenter, Bill Asst. Supt. for Gov. Relations (Houston I.S.D.), Houston, TX SB 702 ON: Anderson, David Lawyer (Texas Education Agency), Austin, TX Registering, but not testifying: For: O'Hanlon, Kevin Attorney (South Texas Association of Schools), Austin, TX SB 745 Registering, but not testifying: For: Eaton, Holly Lobbyist (Texas Classroom Teachers Association), Austin, TX SB 1636 Registering, but not testifying: On: Hollis, Lois Acting Asst. Commissioner Student Serv. (Texas Higher Education Coordinating Board), Austin, TX Providing written testimony: For: Banning, Tom Lobbyist (Texas Academy of Family Physicians), Austin, TX SB 1743 FOR: Mehl, Cheryl Attorney (Texas Assoc. of School Boards; Council of School Attorneys), Austin, TX Registering, but not testifying: For: Douglass, Cathy Legislative Counsel (Texas Association of School Boards), Austin, TX SB 1753 ON: Anderson, David Lawyer (Texas Education Agency), Austin, TX Registering, but not testifying: For: Carpenter, Bill Asst. Supt. for Gov. Relations (Houston I.S.D.), Houston, TX Foster, Craig Special Advisor (Equity Center), Austin, TX McGraw, Ken Superintendent (La Mesa I.S.D.), La Mesa, TX Pena, Martin Executive Director (South Texas Association of Schools), Laguna Vista, TX Pierce, Wayne Executive Director (Equity Center), Austin, TX Soto, Manny Associate Superintendent (Ysleta I.S.D.), El Paso, TX SB 1814 ON: Powers, Jr., William Dean (University of Texas Law School), Austin, TX Registering, but not testifying: For: Hayes, Barbara Dean, College of Pharmacy/Health Science (Texas Southern University), Houston, TX On: Davis, Patrick Associate Dean (University of Texas College of Pharmacy), Austin, TX Littlefield, Louis Education (The University of Texas at Austin), Austin, TX SB 1818 Registering, but not testifying: On: Kale, Tom Vice Chancellor (Texas A&M System), College Station, TX


|
(Co-)Supervisees of Alexander Jung
Post-Docs
Sabeur Aridhi (2015-2016), now Assoc. Prof. at University of Lorraine
Laia Amoros Carafi (2019-2021), now with Finnish meteorological institute
Negin Karimi (since 01/2021)
Yu Tian (since 04/2021)
Shamsiiat Abdurakhmanova (since 03/2020), chosen as Teaching Assistant of the Year at Aalto School of Science, 2020
Ph.D. Students
Linli Zhang, since 2020
Yasmin SarcheshmehPour, since 2020
Artturi Tilanterä, since 2020
Pekka Sahi, since 2019
Mikko Kuusakoski, since 2019
Henrik Ambos, expected to graduate in 2023
Timo Huuhtanen, expected to graduate 2022
Roope Tervo, expected to graduate Dec. 2021
Nguyen Tran, graduated 2020
Markku Hinkka, graduated 2020
Teemu Lehto, graduated 2020
MSc Students
Elementary and Secondary School Students
|


Move your mouse to control your cell
Press Space to split
Press W to eject mass
Press E to split minions
Press R to make minions eject mass
Press T to freeze/unfreeze minions
Press P to make minions collect food
Press Q (in-game) to make minions follow your cell
If you cannot connect to the server, check if you have some anti virus or firewall blocking the connection, make sure you selected a server to connect to, and make sure the server you're connecting to is up.


Start Capture
Stop Capture
Snap
Upload
Start Recognition
Check Status
My Cute Video
My Cute Face
Queues:


You are being asked to take part in a research study at Duke University to study how people engage with novel information.
WHY IS THIS STUDY BEING DONE?
The purpose of this study is to help us learn more about how interest develops in humans and how they can impact choices and learning.
WHAT IS INVOLVED IN THIS STUDY?
In this study, you will complete computer tasks that will examine how information impacts your decision making. You will watch and interact with animated videos of line drawings. These drawings will be simple objects or animals. Interactions could include guessing what the item being drawn is, rating how the drawing makes you feel, and/or deciding if you would like to continue watching the video. After you complete the task, you will be asked to fill out some questionnaires and answer questions about the task.
The experiment will be conducted on a computer, and your decisions will be recorded using a keyboard and/or mouse.
HOW LONG WILL I BE IN THIS STUDY?
Your participation in this study will take one session that will take about 55 minutes to complete. Your participation is voluntary. You may choose to end your participation at any time for any reason. If you decide to stop participating in the study, you can close the browser window. Questions on the questionnaires may be skipped.
WHAT ARE THE RISKS OF THIS STUDY?
We do not anticipate any risks to you for completing the study. None of the stimuli used in this experiment will be threatening, offensive, or stressful.
WHAT ABOUT CONFIDENTIALITY?
In order to protect your confidentiality, your data will be kept in locked, password-protected files on restricted-access servers maintained by the Center for Cognitive Neuroscience. You will be assigned an arbitrary subject number that we will use throughout this study. We will collect your Prolific or MTurk ID number to ensure you are only enrolled in the study once and compensate you for participation.
Future Use of Data:
Data without your MTurk or Prolific ID may be used for future research or shared with other researchers.
WHAT ABOUT COMPENSATION?
You will be compensated $9.00 for completion. You may only complete this study ONCE. You may skip any questions or withdraw at any time, but you must reach the end of the study and enter in your MTurk or Prolific ID in order to be compensated.
WHOM TO CONTACT WITH QUESTIONS?
If you have questions about this research, you may contact the responsible investigator, Alison Adcock, at<EMAIL_ADDRESS>If you have questions about your rights as a research participant, you may contact the Chair of the Human Subjects Committee at<PHONE_NUMBER>.


Laravel includes a simple way to SSH into remote servers and run commands, allowing you to easily build Artisan tasks that work on remote servers. The SSH
facade provides the access point to connecting to your remote servers and running commands.
The configuration file is located at app/config/remote.php
, and contains all of the options you need to configure your remote connections. The connections
array contains a list of your servers keyed by name. Simply populate the credentials in the connections
array and you will be ready to start running remote tasks. Note that the SSH
can authenticate using either a password or an SSH key.
Note: Need to easily run a variety of tasks on your remote server? Check out the Envoy task runner!

To run commands on your default
remote connection, use the SSH::run
method:
SSH::run(array(
'cd /var/www',
'git pull origin master',
));
Alternatively, you may run commands on a specific connection using the into
method:
SSH::into('staging')->run(array(
'cd /var/www',
'git pull origin master',
));
You may catch the "live" output of your remote commands by passing a Closure into the run
method:
SSH::run($commands, function($line)
{
echo $line.PHP_EOL;
});

If you need to define a group of commands that should always be run together, you may use the define
method to define a task
:
SSH::into('staging')->define('deploy', array(
'cd /var/www',
'git pull origin master',
'php artisan migrate',
));
Once the task has been defined, you may use the task
method to run it:
SSH::into('staging')->task('deploy', function($line)
{
echo $line.PHP_EOL;
});

The SSH
class includes a simple way to download files using the get
and getString
methods:
SSH::into('staging')->get($remotePath, $localPath);
$contents = SSH::into('staging')->getString($remotePath);

The SSH
class also includes a simple way to upload files, or even strings, to the server using the put
and putString
methods:
SSH::into('staging')->put($localFile, $remotePath);
SSH::into('staging')->putString($remotePath, 'Foo');

Laravel includes a helpful command for tailing the laravel.log
files on any of your remote connections. Simply use the tail
Artisan command and specify the name of the remote connection you would like to tail:
php artisan tail staging
php artisan tail staging --path=/path/to/log.file

Laravel Envoy provides a clean, minimal syntax for defining common tasks you run on your remote servers. Using a Blade style syntax, you can easily setup tasks for deployment, Artisan commands, and more.
Note: Envoy requires PHP version 5.4 or greater, and only runs on Mac / Linux operating systems.

First, install Envoy using the Composer global
command:
composer global require "laravel/envoy=~1.0"
Make sure to place the ~/.composer/vendor/bin
directory in your PATH so the envoy
executable is found when you run the envoy
command in your terminal.
Next, create an Envoy.blade.php
file in the root of your project. Here's an example to get you started:
@servers(['web' => '<IP_ADDRESS>'])
@task('foo', ['on' => 'web'])
ls -la
@endtask
As you can see, an array of @servers
is defined at the top of the file. You can reference these servers in the on
option of your task declarations. Within your @task
declarations you should place the Bash code that will be run on your server when the task is executed.
The init
command may be used to easily create a stub Envoy file:
envoy init<EMAIL_ADDRESS>
To run a task, use the run
command of your Envoy installation:
envoy run foo
If needed, you may pass variables into the Envoy file using command line switches:
envoy run deploy --branch=master
You may use the options via the Blade syntax you are used to:
@servers(['web' => '<IP_ADDRESS>'])
@task('deploy', ['on' => 'web'])
cd site
git pull origin {{ $branch }}
php artisan migrate
@endtask
You may use the @setup
directive to declare variables and do general PHP work inside the Envoy file:
@setup
$now = new DateTime();
$environment = isset($env) ? $env : "testing";
@endsetup
You may also use @include
to include any PHP files:
@include('vendor/autoload.php');

You may easily run a task across multiple servers. Simply list the servers in the task declaration:
@servers(['web-1' => '<IP_ADDRESS>', 'web-2' => '<IP_ADDRESS>'])
@task('deploy', ['on' => ['web-1', 'web-2']])
cd site
git pull origin {{ $branch }}
php artisan migrate
@endtask
By default, the task will be executed on each server serially. Meaning, the task will finish running on the first server before proceeding to execute on the next server.

If you would like to run a task across multiple servers in parallel, simply add the parallel
option to your task declaration:
@servers(['web-1' => '<IP_ADDRESS>', 'web-2' => '<IP_ADDRESS>'])
@task('deploy', ['on' => ['web-1', 'web-2'], 'parallel' => true])
cd site
git pull origin {{ $branch }}
php artisan migrate
@endtask

Macros allow you to define a set of tasks to be run in sequence using a single command. For instance:
@servers(['web' => '<IP_ADDRESS>'])
@macro('deploy')
foo
bar
@endmacro
@task('foo')
echo "HELLO"
@endtask
@task('bar')
echo "WORLD"
@endtask
The deploy
macro can now be run via a single, simple command:
envoy run deploy

After running a task, you may send a notification to your team's HipChat room using the simple @hipchat
directive:
@servers(['web' => '<IP_ADDRESS>'])
@task('foo', ['on' => 'web'])
ls -la
@endtask
@after
@hipchat('token', 'room', 'Envoy')
@endafter
You can also specify a custom message to the hipchat room. Any variables declared in @setup
or included with @include
will be available for use in the message:
@after
@hipchat('token', 'room', 'Envoy', "$task ran on [$environment]")
@endafter
This is an amazingly simple way to keep your team notified of the tasks being run on the server.
The following syntax may be used to send a notification to Slack:
@after
@slack('team', 'token', 'channel')
@endafter

To update Envoy, simply run the self-update
command:
envoy self-update
If your Envoy installation is in /usr/local/bin
, you may need to use sudo
:
composer global update